Encapsulate WebScopedVirtualTimePauser inside Blink
This moves history navigation virtual time pauser from
RenderViewImpl to Page, which has two benefits:
- slimming down RenderViewImpl;
- encapsulating virtual time inside Blink.
Most of changes are moving virtual time pauser creation
from thread scheduler to page scheduler.
Bug: none
Change-Id: I9fc2683e974e005d8cea35ced0f5f82931215b5a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1856929
Reviewed-by: Alex Clarke <alexclarke@chromium.org>
Reviewed-by: Alexander Timin <altimin@chromium.org>
Commit-Queue: Dmitry Gozman <dgozman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#705679}
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index db30b901..d623567 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -5182,7 +5182,6 @@
void RenderFrameImpl::NavigateBackForwardSoon(int offset,
bool has_user_gesture) {
- render_view()->NavigateBackForwardSoon(offset, has_user_gesture);
Send(new FrameHostMsg_GoToEntryAtOffset(GetRoutingID(), offset,
has_user_gesture));
}
@@ -6017,9 +6016,6 @@
navigation_state->commit_params().pending_history_list_offset;
}
- if (commit_type == blink::WebHistoryCommitType::kWebBackForwardCommit)
- render_view_->DidCommitProvisionalHistoryLoad();
-
return is_new_navigation;
}
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 4dc489f..bf3f42e8 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -1690,21 +1690,6 @@
needs_preferred_size_update_ = true;
}
-void RenderViewImpl::NavigateBackForwardSoon(int offset,
- bool has_user_gesture) {
- history_navigation_virtual_time_pauser_ =
- RenderThreadImpl::current()
- ->GetWebMainThreadScheduler()
- ->CreateWebScopedVirtualTimePauser(
- "NavigateBackForwardSoon",
- blink::WebScopedVirtualTimePauser::VirtualTaskDuration::kInstant);
- history_navigation_virtual_time_pauser_.PauseVirtualTime();
-}
-
-void RenderViewImpl::DidCommitProvisionalHistoryLoad() {
- history_navigation_virtual_time_pauser_.UnpauseVirtualTime();
-}
-
void RenderViewImpl::UpdateBrowserControlsState(
BrowserControlsState constraints,
BrowserControlsState current,
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index 6dd9b0b..b1d9886 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -43,7 +43,6 @@
#include "third_party/blink/public/common/feature_policy/feature_policy.h"
#include "third_party/blink/public/mojom/renderer_preference_watcher.mojom.h"
#include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
-#include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h"
#include "third_party/blink/public/platform/web_input_event.h"
#include "third_party/blink/public/platform/web_security_origin.h"
#include "third_party/blink/public/web/web_ax_object.h"
@@ -209,9 +208,6 @@
// synchronously from the renderer.
void SetFocusAndActivateForTesting(bool enable);
- void NavigateBackForwardSoon(int offset, bool has_user_gesture);
- void DidCommitProvisionalHistoryLoad();
-
void UpdateBrowserControlsState(BrowserControlsState constraints,
BrowserControlsState current,
bool animate);
@@ -689,8 +685,6 @@
// is fine.
base::ObserverList<RenderViewObserver>::Unchecked observers_;
- blink::WebScopedVirtualTimePauser history_navigation_virtual_time_pauser_;
-
// ---------------------------------------------------------------------------
// ADDING NEW DATA? Please see if it fits appropriately in one of the above
// sections rather than throwing it randomly at the end. If you're adding a
diff --git a/third_party/blink/public/platform/scheduler/test/web_fake_thread_scheduler.h b/third_party/blink/public/platform/scheduler/test/web_fake_thread_scheduler.h
index 65e08f1..0fb7d9cf 100644
--- a/third_party/blink/public/platform/scheduler/test/web_fake_thread_scheduler.h
+++ b/third_party/blink/public/platform/scheduler/test/web_fake_thread_scheduler.h
@@ -56,9 +56,6 @@
void SetTopLevelBlameContext(
base::trace_event::BlameContext* blame_context) override;
void SetRendererProcessType(WebRendererProcessType type) override;
- WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser(
- const char* name,
- WebScopedVirtualTimePauser::VirtualTaskDuration duration) override;
void OnMainFrameRequestedForInput() override;
private:
diff --git a/third_party/blink/public/platform/scheduler/test/web_mock_thread_scheduler.h b/third_party/blink/public/platform/scheduler/test/web_mock_thread_scheduler.h
index 5432871..442fe29 100644
--- a/third_party/blink/public/platform/scheduler/test/web_mock_thread_scheduler.h
+++ b/third_party/blink/public/platform/scheduler/test/web_mock_thread_scheduler.h
@@ -64,10 +64,6 @@
MOCK_METHOD0(VirtualTimeResumed, void());
MOCK_METHOD1(SetTopLevelBlameContext, void(base::trace_event::BlameContext*));
MOCK_METHOD1(SetRendererProcessType, void(WebRendererProcessType));
- MOCK_METHOD2(CreateWebScopedVirtualTimePauser,
- WebScopedVirtualTimePauser(
- const char* name,
- WebScopedVirtualTimePauser::VirtualTaskDuration));
MOCK_METHOD0(OnMainFrameRequestedForInput, void());
private:
diff --git a/third_party/blink/public/platform/scheduler/web_thread_scheduler.h b/third_party/blink/public/platform/scheduler/web_thread_scheduler.h
index 041bf8d9..c2e979a 100644
--- a/third_party/blink/public/platform/scheduler/web_thread_scheduler.h
+++ b/third_party/blink/public/platform/scheduler/web_thread_scheduler.h
@@ -14,7 +14,6 @@
#include "build/build_config.h"
#include "third_party/blink/public/platform/scheduler/web_rail_mode_observer.h"
#include "third_party/blink/public/platform/scheduler/web_render_widget_scheduling_state.h"
-#include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h"
#include "third_party/blink/public/platform/web_common.h"
#include "third_party/blink/public/platform/web_input_event.h"
#include "third_party/blink/public/platform/web_input_event_result.h"
@@ -235,17 +234,6 @@
// once.
virtual void SetRendererProcessType(WebRendererProcessType type);
- // Returns a WebScopedVirtualTimePauser which can be used to vote for pausing
- // virtual time. Virtual time will be paused if any WebScopedVirtualTimePauser
- // votes to pause it, and only unpaused only if all
- // WebScopedVirtualTimePausers are either destroyed or vote to unpause. Note
- // the WebScopedVirtualTimePauser returned by this method is initially
- // unpaused.
- virtual WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser(
- const char* name,
- WebScopedVirtualTimePauser::VirtualTaskDuration duration =
- WebScopedVirtualTimePauser::VirtualTaskDuration::kNonInstant);
-
protected:
WebThreadScheduler() = default;
DISALLOW_COPY_AND_ASSIGN(WebThreadScheduler);
diff --git a/third_party/blink/renderer/core/frame/history.cc b/third_party/blink/renderer/core/frame/history.cc
index 0eef974..36b9bb36 100644
--- a/third_party/blink/renderer/core/frame/history.cc
+++ b/third_party/blink/renderer/core/frame/history.cc
@@ -195,6 +195,8 @@
return;
if (delta) {
+ if (Page* page = GetFrame()->GetPage())
+ page->HistoryNavigationVirtualTimePauser().PauseVirtualTime();
GetFrame()->Client()->NavigateBackForward(delta);
} else {
// We intentionally call reload() for the current frame if delta is zero.
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc
index 138f90f..433f6e07 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -1109,6 +1109,10 @@
DocumentLoader::LoadTypeToCommitType(document_loader_->LoadType()),
document_loader_->GetGlobalObjectReusePolicy());
}
+ if (document_loader_->LoadType() == WebFrameLoadType::kBackForward) {
+ if (Page* page = frame_->GetPage())
+ page->HistoryNavigationVirtualTimePauser().UnpauseVirtualTime();
+ }
// Load the document if needed.
document_loader_->StartLoadingResponse();
diff --git a/third_party/blink/renderer/core/page/page.cc b/third_party/blink/renderer/core/page/page.cc
index 2f7939fb..80128c91 100644
--- a/third_party/blink/renderer/core/page/page.cc
+++ b/third_party/blink/renderer/core/page/page.cc
@@ -902,6 +902,10 @@
page_scheduler_ = std::move(page_scheduler);
// The scheduler should be set before the main frame.
DCHECK(!main_frame_);
+ history_navigation_virtual_time_pauser_ =
+ page_scheduler_->CreateWebScopedVirtualTimePauser(
+ "HistoryNavigation",
+ WebScopedVirtualTimePauser::VirtualTaskDuration::kInstant);
}
bool Page::IsOrdinary() const {
diff --git a/third_party/blink/renderer/core/page/page.h b/third_party/blink/renderer/core/page/page.h
index e4a4c367..e2106445 100644
--- a/third_party/blink/renderer/core/page/page.h
+++ b/third_party/blink/renderer/core/page/page.h
@@ -26,6 +26,7 @@
#include <memory>
#include "base/macros.h"
+#include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h"
#include "third_party/blink/public/platform/web_text_autosizer_page_info.h"
#include "third_party/blink/public/web/web_window_features.h"
#include "third_party/blink/renderer/core/core_export.h"
@@ -335,6 +336,10 @@
}
void ClearMediaFeatureOverrides();
+ WebScopedVirtualTimePauser& HistoryNavigationVirtualTimePauser() {
+ return history_navigation_virtual_time_pauser_;
+ }
+
private:
friend class ScopedPagePauser;
@@ -445,6 +450,8 @@
WebTextAutosizerPageInfo web_text_autosizer_page_info_;
+ WebScopedVirtualTimePauser history_navigation_virtual_time_pauser_;
+
DISALLOW_COPY_AND_ASSIGN(Page);
};
diff --git a/third_party/blink/renderer/platform/scheduler/common/dummy_schedulers.cc b/third_party/blink/renderer/platform/scheduler/common/dummy_schedulers.cc
index ce590849..4633243e 100644
--- a/third_party/blink/renderer/platform/scheduler/common/dummy_schedulers.cc
+++ b/third_party/blink/renderer/platform/scheduler/common/dummy_schedulers.cc
@@ -121,6 +121,11 @@
return false;
}
bool RequestBeginMainFrameNotExpected(bool) override { return false; }
+ WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser(
+ const String& name,
+ WebScopedVirtualTimePauser::VirtualTaskDuration) override {
+ return WebScopedVirtualTimePauser();
+ }
private:
DISALLOW_COPY_AND_ASSIGN(DummyPageScheduler);
diff --git a/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc b/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc
index 74e6c82b..ac27cae4 100644
--- a/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc
+++ b/third_party/blink/renderer/platform/scheduler/common/web_thread_scheduler.cc
@@ -200,13 +200,6 @@
NOTREACHED();
}
-WebScopedVirtualTimePauser WebThreadScheduler::CreateWebScopedVirtualTimePauser(
- const char* name,
- WebScopedVirtualTimePauser::VirtualTaskDuration duration) {
- NOTREACHED();
- return WebScopedVirtualTimePauser();
-}
-
void WebThreadScheduler::OnMainFrameRequestedForInput() {
NOTREACHED();
}
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
index f7641b6..8cf68e5 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -2314,14 +2314,6 @@
main_thread_only().process_type = type;
}
-WebScopedVirtualTimePauser
-MainThreadSchedulerImpl::CreateWebScopedVirtualTimePauser(
- const char* name,
- WebScopedVirtualTimePauser::VirtualTaskDuration duration) {
- return WebScopedVirtualTimePauser(this, duration,
- WebString(WTF::String(name)));
-}
-
PendingUserInputInfo MainThreadSchedulerImpl::GetPendingUserInputInfo() const {
base::AutoLock lock(any_thread_lock_);
return any_thread().pending_input_monitor.Info();
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
index 2748d22..3e33b90 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
@@ -215,9 +215,6 @@
void AddRAILModeObserver(RAILModeObserver* observer) override;
void RemoveRAILModeObserver(RAILModeObserver const* observer) override;
void SetRendererProcessType(WebRendererProcessType type) override;
- WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser(
- const char* name,
- WebScopedVirtualTimePauser::VirtualTaskDuration duration) override;
PendingUserInputInfo GetPendingUserInputInfo() const override;
bool IsBeginMainFrameScheduled() const override;
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
index ae46068..afd86e3 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
@@ -3213,9 +3213,9 @@
scheduler_->SetVirtualTimePolicy(
PageSchedulerImpl::VirtualTimePolicy::kDeterministicLoading);
- WebScopedVirtualTimePauser pauser =
- scheduler_->CreateWebScopedVirtualTimePauser(
- "test", WebScopedVirtualTimePauser::VirtualTaskDuration::kInstant);
+ WebScopedVirtualTimePauser pauser(
+ scheduler_.get(),
+ WebScopedVirtualTimePauser::VirtualTaskDuration::kInstant, "test");
base::TimeTicks before = scheduler_->GetVirtualTimeDomain()->Now();
EXPECT_TRUE(scheduler_->VirtualTimeAllowedToAdvance());
@@ -3234,9 +3234,9 @@
scheduler_->SetVirtualTimePolicy(
PageSchedulerImpl::VirtualTimePolicy::kDeterministicLoading);
- WebScopedVirtualTimePauser pauser =
- scheduler_->CreateWebScopedVirtualTimePauser(
- "test", WebScopedVirtualTimePauser::VirtualTaskDuration::kNonInstant);
+ WebScopedVirtualTimePauser pauser(
+ scheduler_.get(),
+ WebScopedVirtualTimePauser::VirtualTaskDuration::kNonInstant, "test");
base::TimeTicks before = scheduler_->GetVirtualTimeDomain()->Now();
pauser.PauseVirtualTime();
@@ -3254,9 +3254,9 @@
scheduler_->SetVirtualTimePolicy(
PageSchedulerImpl::VirtualTimePolicy::kDeterministicLoading);
- WebScopedVirtualTimePauser pauser =
- scheduler_->CreateWebScopedVirtualTimePauser(
- "test", WebScopedVirtualTimePauser::VirtualTaskDuration::kNonInstant);
+ WebScopedVirtualTimePauser pauser(
+ scheduler_.get(),
+ WebScopedVirtualTimePauser::VirtualTaskDuration::kNonInstant, "test");
// Test will pass if the queue without virtual is the last one in the
// iteration order. Create 100 of them and ensure that it is created in the
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
index 1779e61..c565d53 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.cc
@@ -768,6 +768,12 @@
return nullptr;
}
+WebScopedVirtualTimePauser PageSchedulerImpl::CreateWebScopedVirtualTimePauser(
+ const String& name,
+ WebScopedVirtualTimePauser::VirtualTaskDuration duration) {
+ return WebScopedVirtualTimePauser(main_thread_scheduler_, duration, name);
+}
+
// static
const char PageSchedulerImpl::kHistogramPageLifecycleStateTransition[] =
"PageScheduler.PageLifecycleStateTransition";
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h
index 4de806f0..e1370f47 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h
@@ -77,6 +77,9 @@
bool IsExemptFromBudgetBasedThrottling() const override;
bool OptedOutFromAggressiveThrottlingForTest() const override;
bool RequestBeginMainFrameNotExpected(bool new_state) override;
+ WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser(
+ const WTF::String& name,
+ WebScopedVirtualTimePauser::VirtualTaskDuration) override;
// Virtual for testing.
virtual void ReportIntervention(const String& message);
diff --git a/third_party/blink/renderer/platform/scheduler/public/page_scheduler.h b/third_party/blink/renderer/platform/scheduler/public/page_scheduler.h
index 43e6e76..3d7dde32 100644
--- a/third_party/blink/renderer/platform/scheduler/public/page_scheduler.h
+++ b/third_party/blink/renderer/platform/scheduler/public/page_scheduler.h
@@ -7,6 +7,7 @@
#include <memory>
#include "third_party/blink/public/platform/blame_context.h"
+#include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h"
#include "third_party/blink/renderer/platform/platform_export.h"
#include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h"
#include "third_party/blink/renderer/platform/scheduler/public/page_lifecycle_state.h"
@@ -140,6 +141,16 @@
// Returns true if the request has been succcessfully relayed to the
// compositor.
virtual bool RequestBeginMainFrameNotExpected(bool new_state) = 0;
+
+ // Returns a WebScopedVirtualTimePauser which can be used to vote for pausing
+ // virtual time. Virtual time will be paused if any WebScopedVirtualTimePauser
+ // votes to pause it, and only unpaused only if all
+ // WebScopedVirtualTimePausers are either destroyed or vote to unpause. Note
+ // the WebScopedVirtualTimePauser returned by this method is initially
+ // unpaused.
+ virtual WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser(
+ const String& name,
+ WebScopedVirtualTimePauser::VirtualTaskDuration) = 0;
};
} // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/test/fake_page_scheduler.h b/third_party/blink/renderer/platform/scheduler/test/fake_page_scheduler.h
index a089527..904f54f2 100644
--- a/third_party/blink/renderer/platform/scheduler/test/fake_page_scheduler.h
+++ b/third_party/blink/renderer/platform/scheduler/test/fake_page_scheduler.h
@@ -78,6 +78,11 @@
bool RequestBeginMainFrameNotExpected(bool new_state) override {
return false;
}
+ WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser(
+ const String& name,
+ WebScopedVirtualTimePauser::VirtualTaskDuration) override {
+ return WebScopedVirtualTimePauser();
+ }
private:
bool is_audio_playing_;
diff --git a/third_party/blink/renderer/platform/scheduler/test/web_fake_thread_scheduler.cc b/third_party/blink/renderer/platform/scheduler/test/web_fake_thread_scheduler.cc
index 17766c3..1cc6384 100644
--- a/third_party/blink/renderer/platform/scheduler/test/web_fake_thread_scheduler.cc
+++ b/third_party/blink/renderer/platform/scheduler/test/web_fake_thread_scheduler.cc
@@ -9,7 +9,6 @@
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "third_party/blink/renderer/platform/scheduler/public/thread.h"
-#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace blink {
namespace scheduler {
@@ -106,13 +105,5 @@
void WebFakeThreadScheduler::OnMainFrameRequestedForInput() {}
-WebScopedVirtualTimePauser
-WebFakeThreadScheduler::CreateWebScopedVirtualTimePauser(
- const char* name,
- WebScopedVirtualTimePauser::VirtualTaskDuration duration) {
- return WebScopedVirtualTimePauser(nullptr, duration,
- WebString(WTF::String(name)));
-}
-
} // namespace scheduler
} // namespace blink