diff --git a/frameworks/core/common/recorder/event_definition.h b/frameworks/core/common/recorder/event_definition.h index a94b528ee32aabf9afa8c15408ceff3e891fc6ca..079a7f86f35abf1ff8a6c5d391fbf31963b1c8b1 100644 --- a/frameworks/core/common/recorder/event_definition.h +++ b/frameworks/core/common/recorder/event_definition.h @@ -70,6 +70,9 @@ enum EventType : int32_t { TEXT_INPUT, WEB_ACTION, BACK_PRESSED, + LOAD_STARTED, + LOAD_FINISHED, + PAGE_ROUTE, }; constexpr char KEY_COUNT[] = "count"; diff --git a/frameworks/core/common/recorder/event_recorder.cpp b/frameworks/core/common/recorder/event_recorder.cpp index a37f797a431f168af71b3388d26c373ca63c3741..09ecdc8d26d9da1c39e73947b85a690a3c04939c 100644 --- a/frameworks/core/common/recorder/event_recorder.cpp +++ b/frameworks/core/common/recorder/event_recorder.cpp @@ -390,6 +390,17 @@ void EventRecorder::OnPageHide(const std::string& pageUrl, const int64_t duratio EventCategory::CATEGORY_PAGE, static_cast(EventType::PAGE_HIDE), std::move(builder.build())); } +void EventRecorder::OnPageRoute(const std::string& pageUrl, const std::string& param, const std::string& name) +{ + Recorder::EventParamsBuilder builder; + builder.SetType(std::to_string(PageEventType::ROUTER_PAGE)) + .SetPageUrl(pageUrl) + .SetExtra(KEY_NAME, name) + .SetExtra(Recorder::KEY_PAGE_PARAM, param); + EventController::Get().NotifyEvent( + EventCategory::CATEGORY_PAGE, static_cast(EventType::PAGE_ROUTE), std::move(builder.build())); +} + void EventRecorder::OnClick(EventParamsBuilder&& builder) { if (!taskExecutor_) { @@ -461,6 +472,15 @@ void EventRecorder::OnNavDstHide(EventParamsBuilder&& builder) EventCategory::CATEGORY_PAGE, static_cast(EventType::PAGE_HIDE), std::move(params)); } +void EventRecorder::OnNavDstRoute(EventParamsBuilder&& builder) +{ + builder.SetType(std::to_string(PageEventType::NAV_PAGE)); + builder.SetPageUrl(GetPageUrl()); + auto params = builder.build(); + EventController::Get().NotifyEvent( + EventCategory::CATEGORY_PAGE, static_cast(EventType::PAGE_ROUTE), std::move(params)); +} + void EventRecorder::OnExposure(EventParamsBuilder&& builder) { auto params = builder.build(); diff --git a/frameworks/core/common/recorder/event_recorder.h b/frameworks/core/common/recorder/event_recorder.h index f86254228e86d7aaef51b9804fe87cf359af812a..4949c885ca7575c751755caf4c80e1a7d395dd67 100644 --- a/frameworks/core/common/recorder/event_recorder.h +++ b/frameworks/core/common/recorder/event_recorder.h @@ -127,11 +127,13 @@ public: void OnPageShow(const std::string& pageUrl, const std::string& param, const std::string& name = ""); void OnPageHide(const std::string& pageUrl, const int64_t duration, const std::string& name = ""); + void OnPageRoute(const std::string& pageUrl, const std::string& param, const std::string& name = ""); void OnClick(EventParamsBuilder&& builder); void OnChange(EventParamsBuilder&& builder); void OnEvent(EventParamsBuilder&& builder); void OnNavDstShow(EventParamsBuilder&& builder); void OnNavDstHide(EventParamsBuilder&& builder); + void OnNavDstRoute(EventParamsBuilder&& builder); void OnExposure(EventParamsBuilder&& builder); void OnWebEvent(const RefPtr& node, const std::vector& params); void OnAttachWeb(const RefPtr& node); diff --git a/frameworks/core/components_ng/base/simplified_inspector.cpp b/frameworks/core/components_ng/base/simplified_inspector.cpp index 58539509c82b8acb92a4c2e0df495d9bae6b4e4e..bbbe67e96adf2b1dfa937526e6105f1848c8cb56 100644 --- a/frameworks/core/components_ng/base/simplified_inspector.cpp +++ b/frameworks/core/components_ng/base/simplified_inspector.cpp @@ -133,8 +133,7 @@ bool SimplifiedInspector::GetInspectorStep2( return true; } -void SimplifiedInspector::GetFrameNodeChildren( - const RefPtr& uiNode, std::list>& children) +void SimplifiedInspector::GetFrameNodeChildren(const RefPtr& uiNode, std::list>& children) { CHECK_NULL_VOID(uiNode); if (isBackground_) { @@ -206,8 +205,7 @@ void SimplifiedInspector::GetInspectorChildren( jsonNodeArray->PutRef(std::move(jsonNode)); } -void SimplifiedInspector::GetSpanInspector( - const RefPtr& parent, std::unique_ptr& jsonNodeArray) +void SimplifiedInspector::GetSpanInspector(const RefPtr& parent, std::unique_ptr& jsonNodeArray) { // span rect follows parent text size auto spanParentNode = parent->GetParent(); @@ -225,8 +223,7 @@ void SimplifiedInspector::GetSpanInspector( jsonNodeArray->PutRef(std::move(jsonNode)); } -void SimplifiedInspector::FillInspectorAttrs( - const RefPtr& parent, std::unique_ptr& jsonNode) +void SimplifiedInspector::FillInspectorAttrs(const RefPtr& parent, std::unique_ptr& jsonNode) { if (params_.isNewVersion) { auto tmpJson = JsonUtil::Create(true); @@ -277,8 +274,26 @@ void SimplifiedInspector::GetWebContentIfNeed(const RefPtr& node) if (!isAsync_ || !collector_) { return; } + if (node->GetTag() != V2::WEB_ETS_TAG) { + return; + } #if !defined(CROSS_PLATFORM) && defined(WEB_SUPPORTED) - if (params_.enableWeb && !params_.webContentJs.empty() && node->GetTag() == V2::WEB_ETS_TAG) { + if (params_.enableWeb && params_.webAccessibility && !params_.enableBackground) { + auto pattern = node->GetPattern(); + CHECK_NULL_VOID(pattern); + if (!pattern->GetActiveStatus()) { + return; + } + auto lambda = [collector = collector_](std::shared_ptr& jsonValue, int32_t webId) { + std::string key = "Web_" + std::to_string(webId); + collector->GetJson()->Put(key.c_str(), jsonValue->ToString().c_str()); + collector->DecreaseTaskNum(); + }; + collector_->IncreaseTaskNum(); + pattern->GetAllWebAccessibilityNodeInfos(std::move(lambda), node->GetId(), false); + return; + } + if (params_.enableWeb && !params_.webContentJs.empty()) { auto pattern = node->GetPattern(); CHECK_NULL_VOID(pattern); if (!pattern->GetActiveStatus()) { @@ -300,6 +315,7 @@ void SimplifiedInspector::GetWebContentIfNeed(const RefPtr& node) void SimplifiedInspector::GetInspectorAsync(const std::shared_ptr& collector) { #if !defined(PREVIEW) && !defined(ACE_UNITTEST) + ContainerScope scope(Container::CurrentIdSafely()); CHECK_NULL_VOID(collector); collector->CreateJson(); collector_ = collector; @@ -321,6 +337,7 @@ void SimplifiedInspector::GetInspectorAsync(const std::shared_ptr& collector) { + ContainerScope scope(Container::CurrentIdSafely()); CHECK_NULL_VOID(collector); collector->CreateJson(); collector_ = collector; diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp b/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp index d5fe03445a06f171926b45c0e8e21373962345f8..40423d00397eb4372f17383aefd406acceaa0bca 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp +++ b/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp @@ -27,6 +27,7 @@ #include "base/utils/system_properties.h" #include "core/common/ime/input_method_manager.h" #include "core/common/force_split/force_split_utils.h" +#include "core/common/recorder/event_recorder.h" #include "core/components_ng/manager/avoid_info/avoid_info_manager.h" #include "core/components_ng/pattern/navigation/nav_bar_node.h" #include "core/components_ng/pattern/navigation/nav_bar_pattern.h" @@ -228,6 +229,20 @@ int32_t TriggerNavDestinationTransition(const RefPtr& n CHECK_NULL_RETURN(navDestination, INVALID_ANIMATION_ID); return navDestination->DoTransition(operation, isEnter); } + +void RecordNavRouteEvent( + const std::string& fromPath, const std::string& fromName, const std::string& toPath, const std::string& toName) +{ + if (!Recorder::EventRecorder::Get().IsPageRecordEnable()) { + return; + } + Recorder::EventParamsBuilder builder; + builder.SetExtra("fromPath", fromPath) + .SetExtra("fromName", fromName) + .SetExtra("toPath", toPath) + .SetExtra("toName", toName); + Recorder::EventRecorder::Get().OnNavDstRoute(std::move(builder)); +} } // namespace NavigationPattern::NavigationPattern() @@ -3505,6 +3520,7 @@ void NavigationPattern::StartTransition(const RefPtr& p } ResSchedReport::GetInstance().HandlePageTransition(fromNavDestinationName, toNavDestinationName, "navigation"); UiSessionManager::GetInstance()->OnRouterChange(toPathInfo.c_str(), "navigationPathChange"); + RecordNavRouteEvent(fromPathInfo, fromNavDestinationName, toPathInfo, toNavDestinationName); // fire onWillHide if (!isPopPage && !preDestination && navigationMode_ == NavigationMode::STACK) { // NavBar/HomeNavDestination will be covered in STACK mode diff --git a/frameworks/core/components_ng/pattern/stage/stage_manager.cpp b/frameworks/core/components_ng/pattern/stage/stage_manager.cpp index bfff1409194dbcb68b536a13683740cd934e8800..058b73d2d82bd77c288888e3f5bcee63fc416aa1 100644 --- a/frameworks/core/components_ng/pattern/stage/stage_manager.cpp +++ b/frameworks/core/components_ng/pattern/stage/stage_manager.cpp @@ -21,6 +21,7 @@ #include "base/perfmonitor/perf_monitor.h" #include "core/common/ime/input_method_manager.h" #include "base/ressched/ressched_report.h" +#include "bridge/declarative_frontend/ng/entry_page_info.h" #if !defined(ACE_UNITTEST) #include "core/components_ng/base/transparent_node_detector.h" @@ -76,6 +77,20 @@ void FirePageTransition(const RefPtr& page, PageTransitionType transi pagePattern->FinishInPage(animationId, transitionType); }, transitionType); } + +void RecordPageRouteEvent(const RefPtr& pageInfo) +{ + if (!Recorder::EventRecorder::Get().IsPageRecordEnable()) { + return; + } + std::string pageParams; + auto entryPageInfo = AceType::DynamicCast(pageInfo); + if (entryPageInfo && Recorder::EventRecorder::Get().IsPageParamRecordEnable()) { + pageParams = entryPageInfo->GetPageParams(); + } + Recorder::EventRecorder::Get().OnPageShow( + pageInfo->GetPageUrl(), pageParams, pageInfo->GetRouteName().value_or("")); +} } // namespace void StageManager::StartTransition(const RefPtr& srcPage, const RefPtr& destPage, RouteType type) @@ -172,6 +187,7 @@ bool StageManager::PushPage(const RefPtr& node, bool needHideLast, bo auto pagePath = pageInfo->GetFullPath(); ACE_SCOPED_TRACE_COMMERCIAL("Router Main Page: %s", pagePath.c_str()); UiSessionManager::GetInstance()->OnRouterChange(pagePath, "routerPushPage"); + RecordPageRouteEvent(pageInfo); } if (needTransition) { pipeline->FlushPipelineImmediately(); diff --git a/frameworks/core/components_ng/pattern/web/web_pattern.cpp b/frameworks/core/components_ng/pattern/web/web_pattern.cpp index a3fc513616cb0f4b7d379ae4d4acd6aa549414ad..719cb6559fffe7819db61f775daea52d8fdd8e2a 100644 --- a/frameworks/core/components_ng/pattern/web/web_pattern.cpp +++ b/frameworks/core/components_ng/pattern/web/web_pattern.cpp @@ -7294,7 +7294,7 @@ std::string WebPattern::VectorIntToString(std::vector&& vec) } void WebPattern::WebNodeInfoToJsonValue(std::shared_ptr& jsonNodeArray, - std::shared_ptr webNodeInfo, std::string& nodeTag) + std::shared_ptr webNodeInfo, std::string& nodeTag, bool isArray) { auto jsonNode = JsonUtil::Create(true); jsonNode->Put(WEB_NODE_URL, delegate_ ? delegate_->GetUrl().c_str() : ""); @@ -7343,18 +7343,18 @@ void WebPattern::WebNodeInfoToJsonValue(std::shared_ptr& j JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::POPUP, webNodeInfo->GetIsPopupSupported()); JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::DELETABLE, webNodeInfo->GetIsDeletable()); JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::FOCUS, webNodeInfo->GetIsAccessibilityFocus()); - jsonNodeArray->PutRef(nodeTag.c_str(), std::move(jsonNode)); + JsonNodePutDefaultValue(jsonNode, WebAccessibilityType::NODE_TAG, nodeTag); + isArray ? jsonNodeArray->PutRef(std::move(jsonNode)) : jsonNodeArray->PutRef(nodeTag.c_str(), std::move(jsonNode)); } -void WebPattern::GetWebAllInfosImpl(WebNodeInfoCallback cb, int32_t webId) +void WebPattern::GetWebAllInfosImpl(WebNodeInfoCallback cb, int32_t webId, bool needFilter) { - std::shared_ptr rootWebNode; - if (delegate_) { - rootWebNode = delegate_->GetAccessibilityNodeInfoById(-1); - } + CHECK_NULL_VOID(delegate_); + std::shared_ptr rootWebNode = delegate_->GetAccessibilityNodeInfoById(-1); CHECK_NULL_VOID(rootWebNode); - auto jsonNodeArray = static_cast >(JsonUtil::Create(true)); + auto jsonNodeArray = + static_cast>(needFilter ? JsonUtil::Create(true) : JsonUtil::CreateArray(true)); std::queue que; for (auto id: rootWebNode->GetChildIds()) { que.push(id); @@ -7367,10 +7367,14 @@ void WebPattern::GetWebAllInfosImpl(WebNodeInfoCallback cb, int32_t webId) auto webNodeInfo = delegate_->GetAccessibilityNodeInfoById(tmp); CHECK_NULL_VOID(webNodeInfo); auto componentType = webNodeInfo->GetComponentType(); - if (componentType.compare(ACCESSIBILITY_GENERIC_CONTAINER) != 0 - && componentType.compare(ACCESSIBILITY_PARAGRAPH) != 0 - && componentType.compare(ACCESSIBILITY_IMAGE) != 0) { - WebNodeInfoToJsonValue(jsonNodeArray, webNodeInfo, componentType); + if (needFilter) { + if (componentType.compare(ACCESSIBILITY_GENERIC_CONTAINER) != 0 + && componentType.compare(ACCESSIBILITY_PARAGRAPH) != 0 + && componentType.compare(ACCESSIBILITY_IMAGE) != 0) { + WebNodeInfoToJsonValue(jsonNodeArray, webNodeInfo, componentType); + } + } else { + WebNodeInfoToJsonValue(jsonNodeArray, webNodeInfo, componentType, true); } for (auto id: webNodeInfo->GetChildIds()) { que.push(id); @@ -7383,7 +7387,7 @@ void WebPattern::GetWebAllInfosImpl(WebNodeInfoCallback cb, int32_t webId) SetAccessibilityState(false); } -void WebPattern::GetAllWebAccessibilityNodeInfos(WebNodeInfoCallback cb, int32_t webId) +void WebPattern::GetAllWebAccessibilityNodeInfos(WebNodeInfoCallback cb, int32_t webId, bool needFilter) { CHECK_NULL_VOID(cb); inspectorAccessibilityEnable_ = true; @@ -7393,10 +7397,11 @@ void WebPattern::GetAllWebAccessibilityNodeInfos(WebNodeInfoCallback cb, int32_t auto pipelineContext = host->GetContext(); CHECK_NULL_VOID(pipelineContext); auto taskExecutor = pipelineContext->GetTaskExecutor(); - taskExecutor->PostDelayedTask([weak = WeakClaim(this), cb, webId] () { + taskExecutor->PostDelayedTask([weak = WeakClaim(this), cb, webId, needFilter] () { auto pattern = weak.Upgrade(); + CHECK_NULL_VOID(pattern); auto startTime = std::chrono::high_resolution_clock::now(); - pattern->GetWebAllInfosImpl(cb, webId); + pattern->GetWebAllInfosImpl(cb, webId, needFilter); auto nowTime = std::chrono::high_resolution_clock::now(); std::chrono::duration diff = std::chrono::duration_cast(nowTime - startTime); diff --git a/frameworks/core/components_ng/pattern/web/web_pattern.h b/frameworks/core/components_ng/pattern/web/web_pattern.h index 8bd4e52e29984ed7a17dcb885b0564d9dd189f65..ff4cd18a4c9a281e9933e744e295ba27cdead157 100644 --- a/frameworks/core/components_ng/pattern/web/web_pattern.h +++ b/frameworks/core/components_ng/pattern/web/web_pattern.h @@ -193,6 +193,7 @@ public: POPUP, DELETABLE, FOCUS, + NODE_TAG, }; RefPtr CreateNodePaintMethod() override; @@ -723,7 +724,7 @@ public: } std::shared_ptr GetSurfaceRSNode() const; - void GetAllWebAccessibilityNodeInfos(WebNodeInfoCallback cb, int32_t webId); + void GetAllWebAccessibilityNodeInfos(WebNodeInfoCallback cb, int32_t webId, bool needFilter = true); void OnAccessibilityHoverEvent( const NG::PointF& point, SourceType source, NG::AccessibilityHoverEventType eventType, TimeStamp time); std::string GetSurfaceIdByHtmlElementId(const std::string& htmlElementId); @@ -1132,8 +1133,8 @@ private: WebAccessibilityType key, std::string value); void WebNodeInfoToJsonValue(std::shared_ptr& jsonNodeArray, std::shared_ptr webNodeInfo, - std::string& nodeTag); - void GetWebAllInfosImpl(WebNodeInfoCallback cb, int32_t webId); + std::string& nodeTag, bool isArray = false); + void GetWebAllInfosImpl(WebNodeInfoCallback cb, int32_t webId, bool needFilter = true); std::string EnumTypeToString(WebAccessibilityType type); std::string VectorIntToString(std::vector&& vec); void InitMagnifier(); diff --git a/interfaces/inner_api/ace/ui_event_observer.h b/interfaces/inner_api/ace/ui_event_observer.h index ac5a1ca0c49fe986be57557c01fb97813aa52f08..4ab19a6ab7dce3021a2b0835ca9545f026d941fb 100644 --- a/interfaces/inner_api/ace/ui_event_observer.h +++ b/interfaces/inner_api/ace/ui_event_observer.h @@ -51,6 +51,7 @@ struct ACE_FORCE_EXPORT TreeParams { InspectorPageType inspectorType { InspectorPageType::FOCUS }; InspectorInfoType infoType { InspectorInfoType::CONTENT }; int32_t webId = 0; + bool webAccessibility = false; }; class ACE_FORCE_EXPORT UIEventObserver { diff --git a/test/unittest/core/common/recorder/event_recorder_test.cpp b/test/unittest/core/common/recorder/event_recorder_test.cpp index 3a4522f864aedea04ab5cf016fc82c713a7ee1f1..c936aa4c2e67b88e0c9582d86bb469a723289de4 100644 --- a/test/unittest/core/common/recorder/event_recorder_test.cpp +++ b/test/unittest/core/common/recorder/event_recorder_test.cpp @@ -1435,4 +1435,28 @@ HWTEST_F(EventRecorderTest, AddApiTest002, TestSize.Level1) Recorder::EventRecorder::Get().OnWebEvent(pageNode2, params2); EXPECT_EQ(builder.params_->empty(), false); } + +/** + * @tc.name: EventRecorderTest016 + * @tc.desc: Test page route. + * @tc.type: FUNC + */ +HWTEST_F(EventRecorderTest, EventRecorderTest016, TestSize.Level1) +{ + std::string config; + GetConfig(config); + auto observer = std::make_shared(); + Recorder::EventController::Get().Register(config, observer); + EventRecorder::Get().OnPageRoute("pages/Index", "abc", "efg"); + sleep(1); + EXPECT_EQ(observer->GetEventType(), static_cast(Recorder::EventType::PAGE_ROUTE)); + + EventParamsBuilder builder; + builder.SetEventType(Recorder::EventType::PAGE_ROUTE); + auto parmas = builder.build(); + EventRecorder::Get().OnNavDstRoute(std::move(builder)); + sleep(1); + EXPECT_EQ(observer->GetEventType(), static_cast(Recorder::EventType::PAGE_ROUTE)); + Recorder::EventController::Get().Unregister(observer); +} } // namespace OHOS::Ace