allow_disabling_blink_scheduler_throttling_per_renderview.patch 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: deepak1556 <[email protected]>
  3. Date: Mon, 18 May 2020 11:12:26 -0700
  4. Subject: allow disabling blink scheduler throttling per RenderView
  5. This allows us to disable throttling for hidden windows.
  6. diff --git a/content/browser/renderer_host/navigation_controller_impl_unittest.cc b/content/browser/renderer_host/navigation_controller_impl_unittest.cc
  7. index ed1cd91f4ec979f5a194a110ce9fc6ae3459cd09..812534c3834094f762b81daea204c85eea89e235 100644
  8. --- a/content/browser/renderer_host/navigation_controller_impl_unittest.cc
  9. +++ b/content/browser/renderer_host/navigation_controller_impl_unittest.cc
  10. @@ -163,6 +163,12 @@ class MockPageBroadcast : public blink::mojom::PageBroadcast {
  11. (network::mojom::AttributionSupport support),
  12. (override));
  13. + MOCK_METHOD(
  14. + void,
  15. + SetSchedulerThrottling,
  16. + (bool allowed),
  17. + (override));
  18. +
  19. mojo::PendingAssociatedRemote<blink::mojom::PageBroadcast> GetRemote() {
  20. return receiver_.BindNewEndpointAndPassDedicatedRemote();
  21. }
  22. diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
  23. index dc10b3766c512a60a454194b5a11906eeb73e47e..de4506f124bce0e7094a1c10945a9c6508c32b2a 100644
  24. --- a/content/browser/renderer_host/render_view_host_impl.cc
  25. +++ b/content/browser/renderer_host/render_view_host_impl.cc
  26. @@ -713,6 +713,11 @@ void RenderViewHostImpl::SetBackgroundOpaque(bool opaque) {
  27. GetWidget()->GetAssociatedFrameWidget()->SetBackgroundOpaque(opaque);
  28. }
  29. +void RenderViewHostImpl::SetSchedulerThrottling(bool allowed) {
  30. + if (auto& broadcast = GetAssociatedPageBroadcast())
  31. + broadcast->SetSchedulerThrottling(allowed);
  32. +}
  33. +
  34. bool RenderViewHostImpl::IsMainFrameActive() {
  35. return is_active();
  36. }
  37. diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h
  38. index afd5368ffd7c7ef5db6e30b7468554d8ec07c77a..1b0c498edd71987f004bc20e9d7957cca6526edd 100644
  39. --- a/content/browser/renderer_host/render_view_host_impl.h
  40. +++ b/content/browser/renderer_host/render_view_host_impl.h
  41. @@ -139,6 +139,7 @@ class CONTENT_EXPORT RenderViewHostImpl
  42. void EnablePreferredSizeMode() override;
  43. void WriteIntoTrace(perfetto::TracedProto<TraceProto> context) const override;
  44. + void SetSchedulerThrottling(bool allowed) override;
  45. void SendWebPreferencesToRenderer();
  46. void SendRendererPreferencesToRenderer(
  47. const blink::RendererPreferences& preferences);
  48. diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
  49. index a967365095f3ca4c1b57b0dcbfa8b148a5e1e683..54ae10307c6ceea27046b9bd7b1a1322b331d954 100644
  50. --- a/content/browser/renderer_host/render_widget_host_view_aura.cc
  51. +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
  52. @@ -563,8 +563,8 @@ void RenderWidgetHostViewAura::ShowImpl(PageVisibilityState page_visibility) {
  53. // OnShowWithPageVisibility will not call NotifyHostAndDelegateOnWasShown,
  54. // which updates `visibility_`, unless the host is hidden. Make sure no update
  55. // is needed.
  56. - DCHECK(host_->is_hidden() || visibility_ == Visibility::VISIBLE);
  57. - OnShowWithPageVisibility(page_visibility);
  58. + if (host_->is_hidden() || visibility_ == Visibility::VISIBLE)
  59. + OnShowWithPageVisibility(page_visibility);
  60. }
  61. void RenderWidgetHostViewAura::NotifyHostAndDelegateOnWasShown(
  62. diff --git a/content/public/browser/render_view_host.h b/content/public/browser/render_view_host.h
  63. index 9979c25ecd57e68331b628a518368635db5c2027..f65bfbbb663a5bb0511ffa389d3163e0fdeb4d1f 100644
  64. --- a/content/public/browser/render_view_host.h
  65. +++ b/content/public/browser/render_view_host.h
  66. @@ -76,6 +76,9 @@ class CONTENT_EXPORT RenderViewHost {
  67. virtual void WriteIntoTrace(
  68. perfetto::TracedProto<TraceProto> context) const = 0;
  69. + // Disable/Enable scheduler throttling.
  70. + virtual void SetSchedulerThrottling(bool allowed) {}
  71. +
  72. private:
  73. // This interface should only be implemented inside content.
  74. friend class RenderViewHostImpl;
  75. diff --git a/content/test/test_page_broadcast.h b/content/test/test_page_broadcast.h
  76. index cb660e85d7ed08496483bc7b857b5f273efb94d3..2f9b3937106c1927b38bc43a641fa982044874d3 100644
  77. --- a/content/test/test_page_broadcast.h
  78. +++ b/content/test/test_page_broadcast.h
  79. @@ -50,6 +50,7 @@ class TestPageBroadcast : public blink::mojom::PageBroadcast {
  80. network::mojom::AttributionSupport support) override;
  81. void UpdateColorProviders(
  82. const blink::ColorProviderColorMaps& color_provider_colors) override;
  83. + void SetSchedulerThrottling(bool allowed) override {}
  84. mojo::AssociatedReceiver<blink::mojom::PageBroadcast> receiver_;
  85. };
  86. diff --git a/third_party/blink/public/mojom/page/page.mojom b/third_party/blink/public/mojom/page/page.mojom
  87. index ed73a6fe6d146eac904f0aa0d88facf055df503e..4bbc792068db75739a7ceb8ad01c85f9d3bbd8f6 100644
  88. --- a/third_party/blink/public/mojom/page/page.mojom
  89. +++ b/third_party/blink/public/mojom/page/page.mojom
  90. @@ -173,4 +173,7 @@ interface PageBroadcast {
  91. // 2. The ColorProvider associated with the WebContents changes as a result
  92. // of theme changes.
  93. UpdateColorProviders(ColorProviderColorMaps color_provider_colors);
  94. +
  95. + // Whether to enable the Renderer scheduler background throttling.
  96. + SetSchedulerThrottling(bool allowed);
  97. };
  98. diff --git a/third_party/blink/public/web/web_view.h b/third_party/blink/public/web/web_view.h
  99. index 2ba868f0efb2ee082d452bb011409f1b4c5c5e1e..6caab2df3cfc367c63839b7ac635d8d072ef8a57 100644
  100. --- a/third_party/blink/public/web/web_view.h
  101. +++ b/third_party/blink/public/web/web_view.h
  102. @@ -378,6 +378,7 @@ class BLINK_EXPORT WebView {
  103. // Scheduling -----------------------------------------------------------
  104. virtual PageScheduler* Scheduler() const = 0;
  105. + virtual void SetSchedulerThrottling(bool allowed) {}
  106. // Visibility -----------------------------------------------------------
  107. diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
  108. index 56856aea2bdfa54d6589da27937a96e9b89d24f1..a6714774b3fd35c0f34f37ab27163bfc920a8212 100644
  109. --- a/third_party/blink/renderer/core/exported/web_view_impl.cc
  110. +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
  111. @@ -2421,6 +2421,10 @@ void WebViewImpl::SetPageLifecycleStateInternal(
  112. TRACE_EVENT2("navigation", "WebViewImpl::SetPageLifecycleStateInternal",
  113. "old_state", old_state, "new_state", new_state);
  114. + // If backgroundThrottling is disabled, the page is always visible.
  115. + if (!scheduler_throttling_allowed_)
  116. + new_state->visibility = mojom::blink::PageVisibilityState::kVisible;
  117. +
  118. bool storing_in_bfcache = new_state->is_in_back_forward_cache &&
  119. !old_state->is_in_back_forward_cache;
  120. bool restoring_from_bfcache = !new_state->is_in_back_forward_cache &&
  121. @@ -3912,10 +3916,23 @@ PageScheduler* WebViewImpl::Scheduler() const {
  122. return GetPage()->GetPageScheduler();
  123. }
  124. +void WebViewImpl::SetSchedulerThrottling(bool allowed) {
  125. + DCHECK(GetPage());
  126. + scheduler_throttling_allowed_ = allowed;
  127. + GetPage()->GetPageScheduler()->SetPageVisible(!allowed || GetVisibilityState() == mojom::blink::PageVisibilityState::kVisible);
  128. +}
  129. +
  130. void WebViewImpl::SetVisibilityState(
  131. mojom::blink::PageVisibilityState visibility_state,
  132. bool is_initial_state) {
  133. DCHECK(GetPage());
  134. +
  135. + if (!scheduler_throttling_allowed_) {
  136. + GetPage()->SetVisibilityState(mojom::blink::PageVisibilityState::kVisible, is_initial_state);
  137. + GetPage()->GetPageScheduler()->SetPageVisible(true);
  138. + return;
  139. + }
  140. +
  141. GetPage()->SetVisibilityState(visibility_state, is_initial_state);
  142. // Do not throttle if the page should be painting.
  143. bool is_visible =
  144. diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h
  145. index ae8bc75679ad4064ea0bb19f36e3b8224db9d738..c227b904fef4acc76a4af50263ab9d4fa35472e2 100644
  146. --- a/third_party/blink/renderer/core/exported/web_view_impl.h
  147. +++ b/third_party/blink/renderer/core/exported/web_view_impl.h
  148. @@ -453,6 +453,7 @@ class CORE_EXPORT WebViewImpl final : public WebView,
  149. LocalDOMWindow* PagePopupWindow() const;
  150. PageScheduler* Scheduler() const override;
  151. + void SetSchedulerThrottling(bool allowed) override;
  152. void SetVisibilityState(mojom::blink::PageVisibilityState visibility_state,
  153. bool is_initial_state) override;
  154. mojom::blink::PageVisibilityState GetVisibilityState() override;
  155. @@ -924,6 +925,8 @@ class CORE_EXPORT WebViewImpl final : public WebView,
  156. // If true, we send IPC messages when |preferred_size_| changes.
  157. bool send_preferred_size_changes_ = false;
  158. + bool scheduler_throttling_allowed_ = true;
  159. +
  160. // Whether the preferred size may have changed and |UpdatePreferredSize| needs
  161. // to be called.
  162. bool needs_preferred_size_update_ = true;