From 91289e38d0efa64a96ea802e22e9de496d6f615e Mon Sep 17 00:00:00 2001 From: wudi Date: Sat, 12 Jul 2025 10:26:06 +0800 Subject: [PATCH] Support record page route event. Signed-off-by: wudi --- .../core/common/recorder/event_definition.h | 3 ++ .../core/common/recorder/event_recorder.cpp | 20 ++++++++++++ .../core/common/recorder/event_recorder.h | 2 ++ .../base/simplified_inspector.cpp | 32 ++++++++++++++----- .../pattern/navigation/navigation_pattern.cpp | 16 ++++++++++ .../pattern/stage/stage_manager.cpp | 12 ++++++- interfaces/inner_api/ace/ui_event_observer.h | 1 + .../common/recorder/event_recorder_test.cpp | 24 ++++++++++++++ 8 files changed, 101 insertions(+), 9 deletions(-) diff --git a/frameworks/core/common/recorder/event_definition.h b/frameworks/core/common/recorder/event_definition.h index a94b528ee32..079a7f86f35 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 a37f797a431..09ecdc8d26d 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 f86254228e8..4949c885ca7 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 97775dcbcde..2d2d5c1dc01 100644 --- a/frameworks/core/components_ng/base/simplified_inspector.cpp +++ b/frameworks/core/components_ng/base/simplified_inspector.cpp @@ -261,8 +261,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_) { @@ -334,8 +333,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(); @@ -353,8 +351,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); @@ -405,8 +402,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()) { @@ -428,6 +443,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; @@ -449,11 +465,11 @@ void SimplifiedInspector::GetInspectorAsync(const std::shared_ptr& collector) { + ContainerScope scope(Container::CurrentIdSafely()); CHECK_NULL_VOID(collector); collector->CreateJson(); collector_ = collector; isAsync_ = true; - TAG_LOGD(AceLogTag::ACE_UIEVENT, "Inspector3:container %{public}d", containerId_); auto context = NG::PipelineContext::GetContextByContainerId(containerId_); CHECK_NULL_VOID(context); CHECK_NULL_VOID(context->GetStageManager()); diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp b/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp index a37b0c04509..a72c2feb9f0 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() @@ -3504,6 +3519,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 f70766512b6..af3d910b135 100644 --- a/frameworks/core/components_ng/pattern/stage/stage_manager.cpp +++ b/frameworks/core/components_ng/pattern/stage/stage_manager.cpp @@ -76,6 +76,15 @@ void FirePageTransition(const RefPtr& page, PageTransitionType transi pagePattern->FinishInPage(animationId, transitionType); }, transitionType); } + +void RecordPageRouteEvent(const RefPtr& pageInfo) +{ + CHECK_NULL_VOID(pageInfo); + if (!Recorder::EventRecorder::Get().IsPageRecordEnable()) { + return; + } + Recorder::EventRecorder::Get().OnPageRoute(pageInfo->GetPageUrl(), "", pageInfo->GetRouteName().value_or("")); +} } // namespace void StageManager::StartTransition(const RefPtr& srcPage, const RefPtr& destPage, RouteType type) @@ -232,7 +241,8 @@ bool StageManager::PushPage(const RefPtr& node, bool needHideLast, bo pageUrl = pageInfo->GetFullPath(); } TransparentNodeDetector::GetInstance().PostCheckNodeTransparentTask(node, pageUrl); -#endif + #endif + RecordPageRouteEvent(pagePattern->GetPageInfo()); // close keyboard PageChangeCloseKeyboard(); diff --git a/interfaces/inner_api/ace/ui_event_observer.h b/interfaces/inner_api/ace/ui_event_observer.h index 524d682bab4..042c0bd761c 100644 --- a/interfaces/inner_api/ace/ui_event_observer.h +++ b/interfaces/inner_api/ace/ui_event_observer.h @@ -57,6 +57,7 @@ struct ACE_FORCE_EXPORT TreeParams { InspectorInfoType infoType { InspectorInfoType::CONTENT }; int32_t webId = 0; bool enableCacheNode = false; + 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 3a4522f864a..201762fd63e 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", "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 -- Gitee