123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
- From: deepak1556 <[email protected]>
- Date: Mon, 18 May 2020 11:12:26 -0700
- Subject: allow disabling blink scheduler throttling per RenderView
- This allows us to disable throttling for hidden windows.
- diff --git a/content/browser/renderer_host/navigation_controller_impl_unittest.cc b/content/browser/renderer_host/navigation_controller_impl_unittest.cc
- index 6c679ef877067297ec3bf1a23af6c03a2af8dcf5..1ac93433189580c13b69cd52ce62681a8620da3d 100644
- --- a/content/browser/renderer_host/navigation_controller_impl_unittest.cc
- +++ b/content/browser/renderer_host/navigation_controller_impl_unittest.cc
- @@ -168,6 +168,12 @@ class MockPageBroadcast : public blink::mojom::PageBroadcast {
- (network::mojom::AttributionSupport support),
- (override));
-
- + MOCK_METHOD(
- + void,
- + SetSchedulerThrottling,
- + (bool allowed),
- + (override));
- +
- mojo::PendingAssociatedRemote<blink::mojom::PageBroadcast> GetRemote() {
- return receiver_.BindNewEndpointAndPassDedicatedRemote();
- }
- diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
- index 6c1e46e58d975137eee6c0fd7b01d2ae970a2e10..5ca29616369e76e298eb03188e18ca545c76a162 100644
- --- a/content/browser/renderer_host/render_view_host_impl.cc
- +++ b/content/browser/renderer_host/render_view_host_impl.cc
- @@ -765,6 +765,11 @@ void RenderViewHostImpl::SetBackgroundOpaque(bool opaque) {
- GetWidget()->GetAssociatedFrameWidget()->SetBackgroundOpaque(opaque);
- }
-
- +void RenderViewHostImpl::SetSchedulerThrottling(bool allowed) {
- + if (auto& broadcast = GetAssociatedPageBroadcast())
- + broadcast->SetSchedulerThrottling(allowed);
- +}
- +
- bool RenderViewHostImpl::IsMainFrameActive() {
- return is_active();
- }
- diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h
- index 5fb8a3dc69dc5fc5bfa08e01d8f03707a23c9274..41774b60b8cb7e0a22cedc597dc07ad15c96988c 100644
- --- a/content/browser/renderer_host/render_view_host_impl.h
- +++ b/content/browser/renderer_host/render_view_host_impl.h
- @@ -135,6 +135,7 @@ class CONTENT_EXPORT RenderViewHostImpl
- void EnablePreferredSizeMode() override;
- void WriteIntoTrace(perfetto::TracedProto<TraceProto> context) const override;
-
- + void SetSchedulerThrottling(bool allowed) override;
- void SendWebPreferencesToRenderer();
- void SendRendererPreferencesToRenderer(
- const blink::RendererPreferences& preferences);
- diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
- index 3cd53be3dbb0f63b632f0d7bcccfdc1b2e02ccdf..fec1cdc083d1cb365188a7635a6c062b275d1f64 100644
- --- a/content/browser/renderer_host/render_widget_host_view_aura.cc
- +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
- @@ -579,8 +579,8 @@ void RenderWidgetHostViewAura::ShowImpl(PageVisibilityState page_visibility) {
- // OnShowWithPageVisibility will not call NotifyHostAndDelegateOnWasShown,
- // which updates `visibility_`, unless the host is hidden. Make sure no update
- // is needed.
- - CHECK(host_->is_hidden() || visibility_ == Visibility::VISIBLE);
- - OnShowWithPageVisibility(page_visibility);
- + if (host_->is_hidden() || visibility_ == Visibility::VISIBLE)
- + OnShowWithPageVisibility(page_visibility);
- }
-
- void RenderWidgetHostViewAura::EnsurePlatformVisibility(
- diff --git a/content/public/browser/render_view_host.h b/content/public/browser/render_view_host.h
- index 20ca763ff7f55e8176b77349b41917b11e051ae6..a50c122064b5f0092f57e3d508fb19389b72203b 100644
- --- a/content/public/browser/render_view_host.h
- +++ b/content/public/browser/render_view_host.h
- @@ -75,6 +75,9 @@ class CONTENT_EXPORT RenderViewHost {
- virtual void WriteIntoTrace(
- perfetto::TracedProto<TraceProto> context) const = 0;
-
- + // Disable/Enable scheduler throttling.
- + virtual void SetSchedulerThrottling(bool allowed) {}
- +
- private:
- // This interface should only be implemented inside content.
- friend class RenderViewHostImpl;
- diff --git a/content/test/test_page_broadcast.h b/content/test/test_page_broadcast.h
- index 913e465918750df6852c3ede34a75ecebab8b1fa..c81d6ad098cf977cbd8933721e539c52056c258b 100644
- --- a/content/test/test_page_broadcast.h
- +++ b/content/test/test_page_broadcast.h
- @@ -50,6 +50,7 @@ class TestPageBroadcast : public blink::mojom::PageBroadcast {
- network::mojom::AttributionSupport support) override;
- void UpdateColorProviders(
- const blink::ColorProviderColorMaps& color_provider_colors) override;
- + void SetSchedulerThrottling(bool allowed) override {}
-
- mojo::AssociatedReceiver<blink::mojom::PageBroadcast> receiver_;
- };
- diff --git a/third_party/blink/public/mojom/page/page.mojom b/third_party/blink/public/mojom/page/page.mojom
- index f868a3cc56b49b7fdac9fa1415386bd3a59a3dd7..ac7e92740bf7a61f3d8dcf8feff0fee978ffbfee 100644
- --- a/third_party/blink/public/mojom/page/page.mojom
- +++ b/third_party/blink/public/mojom/page/page.mojom
- @@ -173,4 +173,7 @@ interface PageBroadcast {
- // 2. The ColorProvider associated with the WebContents changes as a result
- // of theme changes.
- UpdateColorProviders(ColorProviderColorMaps color_provider_colors);
- +
- + // Whether to enable the Renderer scheduler background throttling.
- + SetSchedulerThrottling(bool allowed);
- };
- diff --git a/third_party/blink/public/web/web_view.h b/third_party/blink/public/web/web_view.h
- index b1689844282d6917b9750fbc6a875848ddf84b70..f1cc159b7c3448a33a6d9e213f8fbd3b47141fb7 100644
- --- a/third_party/blink/public/web/web_view.h
- +++ b/third_party/blink/public/web/web_view.h
- @@ -371,6 +371,7 @@ class BLINK_EXPORT WebView {
- // Scheduling -----------------------------------------------------------
-
- virtual PageScheduler* Scheduler() const = 0;
- + virtual void SetSchedulerThrottling(bool allowed) {}
-
- // Visibility -----------------------------------------------------------
-
- diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
- index f1984723fb048116056b1632a153295d4e2674a5..d2fbb6060bcce9cb3bcc3829923e2f0e7aa26a75 100644
- --- a/third_party/blink/renderer/core/exported/web_view_impl.cc
- +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
- @@ -2466,6 +2466,10 @@ void WebViewImpl::SetPageLifecycleStateInternal(
- TRACE_EVENT2("navigation", "WebViewImpl::SetPageLifecycleStateInternal",
- "old_state", old_state, "new_state", new_state);
-
- + // If backgroundThrottling is disabled, the page is always visible.
- + if (!scheduler_throttling_allowed_)
- + new_state->visibility = mojom::blink::PageVisibilityState::kVisible;
- +
- bool storing_in_bfcache = new_state->is_in_back_forward_cache &&
- !old_state->is_in_back_forward_cache;
- bool restoring_from_bfcache = !new_state->is_in_back_forward_cache &&
- @@ -3992,10 +3996,23 @@ PageScheduler* WebViewImpl::Scheduler() const {
- return GetPage()->GetPageScheduler();
- }
-
- +void WebViewImpl::SetSchedulerThrottling(bool allowed) {
- + DCHECK(GetPage());
- + scheduler_throttling_allowed_ = allowed;
- + GetPage()->GetPageScheduler()->SetPageVisible(!allowed || GetVisibilityState() == mojom::blink::PageVisibilityState::kVisible);
- +}
- +
- void WebViewImpl::SetVisibilityState(
- mojom::blink::PageVisibilityState visibility_state,
- bool is_initial_state) {
- DCHECK(GetPage());
- +
- + if (!scheduler_throttling_allowed_) {
- + GetPage()->SetVisibilityState(mojom::blink::PageVisibilityState::kVisible, is_initial_state);
- + GetPage()->GetPageScheduler()->SetPageVisible(true);
- + return;
- + }
- +
- GetPage()->SetVisibilityState(visibility_state, is_initial_state);
- // Do not throttle if the page should be painting.
- bool is_visible =
- diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h
- index 06f7cf79b4526ca3ec7670c234a6bb8faec32f04..b8fe2a9b7b6b4de2a689f3857c7ce44909e6f2dc 100644
- --- a/third_party/blink/renderer/core/exported/web_view_impl.h
- +++ b/third_party/blink/renderer/core/exported/web_view_impl.h
- @@ -448,6 +448,7 @@ class CORE_EXPORT WebViewImpl final : public WebView,
- LocalDOMWindow* PagePopupWindow() const;
-
- PageScheduler* Scheduler() const override;
- + void SetSchedulerThrottling(bool allowed) override;
- void SetVisibilityState(mojom::blink::PageVisibilityState visibility_state,
- bool is_initial_state) override;
- mojom::blink::PageVisibilityState GetVisibilityState() override;
- @@ -936,6 +937,8 @@ class CORE_EXPORT WebViewImpl final : public WebView,
- // If true, we send IPC messages when |preferred_size_| changes.
- bool send_preferred_size_changes_ = false;
-
- + bool scheduler_throttling_allowed_ = true;
- +
- // Whether the preferred size may have changed and |UpdatePreferredSize| needs
- // to be called.
- bool needs_preferred_size_update_ = true;
|