From 49ae76435474487101c3e89da1cd4cc1a35d9b02 Mon Sep 17 00:00:00 2001 From: h00415081 Date: Tue, 27 Feb 2024 09:39:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EonFirstScreenImagePaint,=20on?= =?UTF-8?q?FirstScreenImageText=E6=8E=A5=E5=8F=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: h00415081 Change-Id: I4b0a4f56883c5bcd647ae952f2cf80fda375a17a Signed-off-by: h00415081 --- .../browser/metrics_web_contents_observer.cc | 60 +++++++++++++++++++ .../browser/metrics_web_contents_observer.h | 4 ++ .../assert_page_load_metrics_observer.h | 7 +++ .../page_load_metrics_forward_observer.h | 7 +++ .../browser/page_load_metrics_observer.h | 7 +++ .../page_load_metrics_observer_interface.h | 7 +++ .../page_load_metrics_update_dispatcher.cc | 13 ++++ .../browser/page_load_tracker.cc | 29 +++++++++ .../common/page_load_metrics.mojom | 6 ++ .../common/page_load_timing.cc | 8 ++- .../renderer/metrics_render_frame_observer.cc | 18 ++++++ ohos_build/build/config/ohos.json | 8 +++ ohos_nweb/include/nweb_handler.h | 18 ++++++ .../src/cef_delegate/nweb_handler_delegate.cc | 19 ++++++ .../src/cef_delegate/nweb_handler_delegate.h | 7 +++ 15 files changed, 217 insertions(+), 1 deletion(-) diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.cc b/components/page_load_metrics/browser/metrics_web_contents_observer.cc index 6be806e79d..fde40652a8 100644 --- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc +++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc @@ -42,6 +42,11 @@ #include "third_party/blink/public/common/loader/resource_type_util.h" #include "ui/base/page_transition_types.h" +#ifdef OHOS_PAGE_LOAD_METRICS +#include "base/command_line.h" +#include "content/public/common/content_switches.h" +#endif + namespace page_load_metrics { namespace { @@ -258,6 +263,11 @@ MetricsWebContentsObserver::MetricsWebContentsObserver( embedder_interface_(std::move(embedder_interface)), has_navigated_(false), page_load_metrics_receivers_(web_contents, this) { +#ifdef OHOS_PAGE_LOAD_METRICS + is_for_browser_ = base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kForBrowser); +#endif + // NoStatePrefetch loads erroneously report that they are initially visible, // so we manually override visibility state for prerender. if (embedder_interface_->IsNoStatePrefetch(web_contents)) @@ -550,6 +560,41 @@ MetricsWebContentsObserver::GetDelegateForCommittedLoad() { void MetricsWebContentsObserver::ReadyToCommitNavigation( content::NavigationHandle* navigation_handle) { +#ifdef OHOS_PAGE_LOAD_METRICS + do { + if (!is_for_browser_) { + break; + } + if (!navigation_handle->IsInMainFrame()) { + break; + } + if (!ShouldTrackMainFrameNavigation(navigation_handle)) { + break; + } + if (provisional_loads_.count(navigation_handle) > 0) { + break; + } + content::RenderFrameHost* opener = web_contents()->GetOpener(); + const GURL& opener_url = !has_navigated_ && opener + ? opener->GetLastCommittedURL() : GURL::EmptyGURL(); + const GURL& currently_committed_url = + primary_page_ ? primary_page_->url() : opener_url; + bool in_foreground = + !navigation_handle->IsInPrerenderedMainFrame() && in_foreground_; + UserInitiatedInfo user_initiated_info( + CreateUserInitiatedInfo(navigation_handle)); + ukm::SourceId source_id = ukm::ConvertToSourceId( + navigation_handle->GetNavigationId(), + ukm::SourceIdType::NAVIGATION_ID); + base::WeakPtr parent_tracker; + provisional_loads_.insert(std::make_pair(navigation_handle, + std::make_unique( + in_foreground, embedder_interface_.get(), currently_committed_url, + !has_navigated_, navigation_handle, user_initiated_info, source_id, + parent_tracker))); + } while (false); +#endif + if (navigation_handle->IsInPrimaryMainFrame()) { // Notify `primary_page_` that we are ready to commit a navigation to a // new page in the primary main frame. @@ -1162,9 +1207,24 @@ bool MetricsWebContentsObserver::ShouldTrackMainFrameNavigation( DCHECK(navigation_handle->IsInMainFrame()); DCHECK(!navigation_handle->HasCommitted() || !navigation_handle->IsSameDocument()); +#ifdef OHOS_PAGE_LOAD_METRICS + if (is_for_browser_) { + // Ignore non-HTTP schemes (e.g. chrome://), + // except data url with base url. + if (!navigation_handle->GetURL().SchemeIsHTTPOrHTTPS() && + !navigation_handle->GetBaseURLForDataURL().SchemeIsHTTPOrHTTPS()) { + return false; + } + } else { + // Ignore non-HTTP schemes (e.g. chrome://). + if (!navigation_handle->GetURL().SchemeIsHTTPOrHTTPS()) + return false; + } +#else // Ignore non-HTTP schemes (e.g. chrome://). if (!navigation_handle->GetURL().SchemeIsHTTPOrHTTPS()) return false; +#endif // Ignore NTP loads. if (embedder_interface_->IsNewTabPageUrl(navigation_handle->GetURL())) diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.h b/components/page_load_metrics/browser/metrics_web_contents_observer.h index 21f86f7e94..abb9064d1d 100644 --- a/components/page_load_metrics/browser/metrics_web_contents_observer.h +++ b/components/page_load_metrics/browser/metrics_web_contents_observer.h @@ -358,6 +358,10 @@ class MetricsWebContentsObserver bool web_contents_will_soon_be_destroyed_ = false; +#ifdef OHOS_PAGE_LOAD_METRICS + bool is_for_browser_ = false; +#endif + WEB_CONTENTS_USER_DATA_KEY_DECL(); }; diff --git a/components/page_load_metrics/browser/observers/assert_page_load_metrics_observer.h b/components/page_load_metrics/browser/observers/assert_page_load_metrics_observer.h index f040619b01..4644ee4ec1 100644 --- a/components/page_load_metrics/browser/observers/assert_page_load_metrics_observer.h +++ b/components/page_load_metrics/browser/observers/assert_page_load_metrics_observer.h @@ -204,6 +204,13 @@ class AssertPageLoadMetricsObserver final ObservePolicy OnEnterBackForwardCacheByDefault( const page_load_metrics::mojom::PageLoadTiming& timing); +#ifdef OHOS_PAGE_LOAD_METRICS + void OnFirstScreenImagePaint( + const page_load_metrics::mojom::PageLoadTiming& timing) override {} + void OnFirstScreenTextPaint( + const page_load_metrics::mojom::PageLoadTiming& timing) override {} +#endif + private: bool IsPrerendered() const; diff --git a/components/page_load_metrics/browser/page_load_metrics_forward_observer.h b/components/page_load_metrics/browser/page_load_metrics_forward_observer.h index b330026607..97dbd8118f 100644 --- a/components/page_load_metrics/browser/page_load_metrics_forward_observer.h +++ b/components/page_load_metrics/browser/page_load_metrics_forward_observer.h @@ -159,6 +159,13 @@ class PageLoadMetricsForwardObserver final const std::vector& memory_updates) override; void OnSharedStorageWorkletHostCreated() override; +#ifdef OHOS_PAGE_LOAD_METRICS + void OnFirstScreenImagePaint( + const page_load_metrics::mojom::PageLoadTiming& timing) override {} + void OnFirstScreenTextPaint( + const page_load_metrics::mojom::PageLoadTiming& timing) override {} +#endif + // Holds the forward target observer running in the parent PageLoadTracker. base::WeakPtr parent_observer_; }; diff --git a/components/page_load_metrics/browser/page_load_metrics_observer.h b/components/page_load_metrics/browser/page_load_metrics_observer.h index c974f446a8..80f901e5ab 100644 --- a/components/page_load_metrics/browser/page_load_metrics_observer.h +++ b/components/page_load_metrics/browser/page_load_metrics_observer.h @@ -236,6 +236,13 @@ class PageLoadMetricsObserver : public PageLoadMetricsObserverInterface { const std::vector& memory_updates) override {} void OnSharedStorageWorkletHostCreated() override {} +#ifdef OHOS_PAGE_LOAD_METRICS + void OnFirstScreenImagePaint( + const page_load_metrics::mojom::PageLoadTiming& timing) override {} + void OnFirstScreenTextPaint( + const page_load_metrics::mojom::PageLoadTiming& timing) override {} +#endif + private: raw_ptr delegate_ = nullptr; }; diff --git a/components/page_load_metrics/browser/page_load_metrics_observer_interface.h b/components/page_load_metrics/browser/page_load_metrics_observer_interface.h index b7532a3013..6d5a6b0c64 100644 --- a/components/page_load_metrics/browser/page_load_metrics_observer_interface.h +++ b/components/page_load_metrics/browser/page_load_metrics_observer_interface.h @@ -580,6 +580,13 @@ class PageLoadMetricsObserverInterface { // Called when a `SharedStorageWorkletHost` is created. virtual void OnSharedStorageWorkletHostCreated() = 0; +#ifdef OHOS_PAGE_LOAD_METRICS + virtual void OnFirstScreenImagePaint( + const page_load_metrics::mojom::PageLoadTiming& timing) = 0; + virtual void OnFirstScreenTextPaint( + const page_load_metrics::mojom::PageLoadTiming& timing) = 0; +#endif + private: base::WeakPtrFactory weak_factory_{this}; }; diff --git a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc index f83c1c68db..25e92c126d 100644 --- a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc +++ b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc @@ -343,6 +343,19 @@ class PageLoadTimingMerger { MaybeUpdateTimeDelta(&target_paint_timing->first_contentful_paint, navigation_start_offset, new_paint_timing.first_contentful_paint); + +#ifdef OHOS_PAGE_LOAD_METRICS + MaybeUpdateTimeDelta(&target_paint_timing->first_screen_image_load, + navigation_start_offset, + new_paint_timing.first_screen_image_load); + MaybeUpdateTimeDelta(&target_paint_timing->first_screen_image_paint, + navigation_start_offset, + new_paint_timing.first_screen_image_paint); + MaybeUpdateTimeDelta(&target_paint_timing->first_screen_text_paint, + navigation_start_offset, + new_paint_timing.first_screen_text_paint); +#endif + if (is_main_frame) { // FMP is only tracked in the main frame. target_paint_timing->first_meaningful_paint = diff --git a/components/page_load_metrics/browser/page_load_tracker.cc b/components/page_load_metrics/browser/page_load_tracker.cc index 589696d95f..32a1d4afed 100644 --- a/components/page_load_metrics/browser/page_load_tracker.cc +++ b/components/page_load_metrics/browser/page_load_tracker.cc @@ -179,6 +179,35 @@ void DispatchObserverTimingCallbacks(PageLoadMetricsObserverInterface* observer, !last_timing.parse_timing->parse_stop) { observer->OnParseStop(new_timing); } + +#ifdef OHOS_PAGE_LOAD_METRICS + { + const auto& new_load_time = + new_timing.paint_timing->first_screen_image_load; + const auto& old_load_time = + last_timing.paint_timing->first_screen_image_load; + const auto& new_paint_time = + new_timing.paint_timing->first_screen_image_paint; + const auto& old_paint_time = + last_timing.paint_timing->first_screen_image_paint; + if ((new_load_time && new_load_time.value() > base::TimeDelta() && + new_load_time != old_load_time) || + (new_paint_time && new_paint_time.value() > base::TimeDelta() && + new_paint_time != old_paint_time)) { + observer->OnFirstScreenImagePaint(new_timing); + } + } + { + const auto& new_paint_time = + new_timing.paint_timing->first_screen_text_paint; + const auto& old_paint_time = + last_timing.paint_timing->first_screen_text_paint; + if (new_paint_time && new_paint_time.value() > base::TimeDelta() && + new_paint_time != old_paint_time) { + observer->OnFirstScreenTextPaint(new_timing); + } + } +#endif } internal::PageLoadTrackerPageType CalculatePageType( diff --git a/components/page_load_metrics/common/page_load_metrics.mojom b/components/page_load_metrics/common/page_load_metrics.mojom index 65e20e5647..8f093c2273 100644 --- a/components/page_load_metrics/common/page_load_metrics.mojom +++ b/components/page_load_metrics/common/page_load_metrics.mojom @@ -89,6 +89,12 @@ struct PaintTiming { // Time when the first paint happens after a portal activation. mojo_base.mojom.TimeTicks? portal_activated_paint; + + // #ifdef OHOS_PAGE_LOAD_METRICS + mojo_base.mojom.TimeDelta? first_screen_image_load; + mojo_base.mojom.TimeDelta? first_screen_image_paint; + mojo_base.mojom.TimeDelta? first_screen_text_paint; + // #endif OHOS_PAGE_LOAD_METRICS }; // TimeDeltas below represent durations of time during the page load. diff --git a/components/page_load_metrics/common/page_load_timing.cc b/components/page_load_metrics/common/page_load_timing.cc index 5f36e95414..34707ac5c0 100644 --- a/components/page_load_metrics/common/page_load_timing.cc +++ b/components/page_load_metrics/common/page_load_timing.cc @@ -14,7 +14,13 @@ mojom::PageLoadTimingPtr CreatePageLoadTiming() { absl::nullopt, mojom::LargestContentfulPaintTiming::New(), mojom::LargestContentfulPaintTiming::New(), - absl::nullopt, absl::nullopt, absl::nullopt), + absl::nullopt, absl::nullopt, absl::nullopt +#ifdef OHOS_PAGE_LOAD_METRICS + , absl::optional() + , absl::optional() + , absl::optional() +#endif // OHOS_PAGE_LOAD_METRICS + ), mojom::ParseTiming::New(), std::vector>{}, absl::optional(), absl::optional(), diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc index 8d45536514..329d2f52ef 100644 --- a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc +++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc @@ -722,6 +722,24 @@ MetricsRenderFrameObserver::Timing MetricsRenderFrameObserver::GetTiming() if (perf.UserTimingMarkInteractive().has_value()) timing->user_timing_mark_interactive = perf.UserTimingMarkInteractive(); +#ifdef OHOS_PAGE_LOAD_METRICS + if (perf.FirstScreenImageLoad() > 0) { + timing->paint_timing->first_screen_image_paint = + CreateTimeDeltaFromTimestampsInSeconds(perf.FirstScreenImageLoad(), + start); + } + if (perf.FirstScreenImagePaint() > 0) { + timing->paint_timing->first_screen_image_paint = + CreateTimeDeltaFromTimestampsInSeconds(perf.FirstScreenImagePaint(), + start); + } + if (perf.FirstScreenTextPaint() > 0) { + timing->paint_timing->first_screen_text_paint = + CreateTimeDeltaFromTimestampsInSeconds(perf.FirstScreenTextPaint(), + start); + } +#endif // OHOS_PAGE_LOAD_METRICS + return Timing(std::move(timing), monotonic_timing); } diff --git a/ohos_build/build/config/ohos.json b/ohos_build/build/config/ohos.json index 85d7440941..56e55da3a2 100755 --- a/ohos_build/build/config/ohos.json +++ b/ohos_build/build/config/ohos.json @@ -438,6 +438,14 @@ "dependence": "", "default": "true" }, +{ "name": "OHOS_PAGE_LOAD_METRICS", +"owner": "", +"desc": "", +"effect":"main gn blink_core other", +"genCommandline": "default", +"dependence": "", +"default": "true" +}, { "name": "OHOS_PAGE_UP_DOWN", "owner": "", "desc": "", diff --git a/ohos_nweb/include/nweb_handler.h b/ohos_nweb/include/nweb_handler.h index 57302e6cdc..6210c1aa8f 100644 --- a/ohos_nweb/include/nweb_handler.h +++ b/ohos_nweb/include/nweb_handler.h @@ -729,6 +729,24 @@ public: * @param threat_type The threat_type of website. */ virtual void OnSafeBrowsingCheckResult(int threat_type) {} + + /** + * @brief Called when the first screen image rendering of web page. + * @param navigationStartTick Absolute navigation start time, as TimeTicks. + * @param firstScreenImageLoad Time to first screen image redering from navigation start in ms. + * @param firstScreenImagePaint Time to first screen image paint from navigation start in ms. + */ + virtual void OnFirstScreenImagePaint(int64_t navigationStartTick, + int64_t firstScreenImageLoad, + int64_t firstScreenImagePaint) {} + + /** + * @brief Called when the first screen text rendering of web page. + * @param navigationStartTick Absolute navigation start time, as TimeTicks. + * @param firstScreenTextPaint Time to first screen image paint from navigation start in ms. + */ + virtual void OnFirstScreenTextPaint(int64_t navigationStartTick, + int64_t firstScreenTextPaint) {} }; } // namespace OHOS::NWeb diff --git a/ohos_nweb/src/cef_delegate/nweb_handler_delegate.cc b/ohos_nweb/src/cef_delegate/nweb_handler_delegate.cc index 24e3ba5710..4218b50379 100644 --- a/ohos_nweb/src/cef_delegate/nweb_handler_delegate.cc +++ b/ohos_nweb/src/cef_delegate/nweb_handler_delegate.cc @@ -1098,6 +1098,25 @@ void NWebHandlerDelegate::OnMediaStateChanged(CefRefPtr browser, return; } +void NWebHandlerDelegate::OnFirstScreenImagePaint( + int64_t navigationStartTick, int64_t firstScreenImageLoadMs, + int64_t firstScreenImagePaintMs) { + LOG(INFO) << "NWebHandlerDelegate::OnFirstScreenImagePaint"; + if (nweb_handler_ != nullptr) { + nweb_handler_->OnFirstScreenImagePaint(navigationStartTick, + firstScreenImageLoadMs, + firstScreenImagePaintMs); + } +} + +void NWebHandlerDelegate::OnFirstScreenTextPaint( + int64_t navigationStartTick, int64_t firstScreenImagePaintMs) { + LOG(INFO) << "NWebHandlerDelegate::OnFirstScreenTextPaint"; + if (nweb_handler_ != nullptr) { + nweb_handler_->OnFirstScreenTextPaint(navigationStartTick, + firstScreenTextPaintMs); + } +} /* CefLoadHandler methods end */ /* CefRequestHandler methods begin */ diff --git a/ohos_nweb/src/cef_delegate/nweb_handler_delegate.h b/ohos_nweb/src/cef_delegate/nweb_handler_delegate.h index 51bb76fa93..89261f7bf5 100644 --- a/ohos_nweb/src/cef_delegate/nweb_handler_delegate.h +++ b/ohos_nweb/src/cef_delegate/nweb_handler_delegate.h @@ -258,6 +258,13 @@ class NWebHandlerDelegate : public CefClient, CefRefPtr details) override; void OnSafeBrowsingCheckResult(int threat_type) override; + + void OnFirstScreenImagePaint(int64_t navigationStartTick, + int64_t firstScreenImageLoadMs, + int64_t firstScreenImagePaintMs) override; + + void OnFirstScreenTextPaint(int64_t navigationStartTick, + int64_t firstScreenTextPaintMs) override; /* CefLoadHandler methods end */ /* CefRequestHandler methods begin */ -- Gitee