Move VirtualTimePauser from LocalFrameClientImpl to FrameLoader

LocalFrameClientImpl is a glue class, it should not do any work
in DispatchXXX methods - this makes refactoring them difficult.

FrameLoader knows best about navigations and can control virtual
time pauser itself.

Bug: 855189
Change-Id: I8947146b593f5dd356f7edcd439961f8a731a2f1
Reviewed-on: https://chromium-review.googlesource.com/c/1267735
Commit-Queue: Dmitry Gozman <dgozman@chromium.org>
Reviewed-by: Alex Clarke <alexclarke@chromium.org>
Cr-Commit-Position: refs/heads/master@{#598019}
diff --git a/third_party/blink/renderer/core/exported/local_frame_client_impl.cc b/third_party/blink/renderer/core/exported/local_frame_client_impl.cc
index d7e2cf8d..5aa6477 100644
--- a/third_party/blink/renderer/core/exported/local_frame_client_impl.cc
+++ b/third_party/blink/renderer/core/exported/local_frame_client_impl.cc
@@ -433,7 +433,6 @@
     web_frame_->Client()->DidFinishSameDocumentNavigation(
         WebHistoryItem(item), commit_type, content_initiated);
   }
-  virtual_time_pauser_.UnpauseVirtualTime();
 }
 
 void LocalFrameClientImpl::DispatchWillCommitProvisionalLoad() {
@@ -449,7 +448,6 @@
     web_frame_->Client()->DidStartProvisionalLoad(
         WebDocumentLoaderImpl::FromDocumentLoader(loader), wrapped_request);
   }
-  virtual_time_pauser_.PauseVirtualTime();
 }
 
 void LocalFrameClientImpl::DispatchDidReceiveTitle(const String& title) {
@@ -486,15 +484,12 @@
   }
   if (WebDevToolsAgentImpl* dev_tools = DevToolsAgent())
     dev_tools->DidCommitLoadForLocalFrame(web_frame_->GetFrame());
-
-  virtual_time_pauser_.UnpauseVirtualTime();
 }
 
 void LocalFrameClientImpl::DispatchDidFailProvisionalLoad(
     const ResourceError& error,
     WebHistoryCommitType commit_type) {
   web_frame_->DidFail(error, true, commit_type);
-  virtual_time_pauser_.UnpauseVirtualTime();
 }
 
 void LocalFrameClientImpl::DispatchDidFailLoad(
@@ -1099,11 +1094,6 @@
                                                          granularity);
 }
 
-void LocalFrameClientImpl::SetVirtualTimePauser(
-    WebScopedVirtualTimePauser virtual_time_pauser) {
-  virtual_time_pauser_ = std::move(virtual_time_pauser);
-}
-
 String LocalFrameClientImpl::evaluateInInspectorOverlayForTesting(
     const String& script) {
   if (WebDevToolsAgentImpl* devtools = DevToolsAgent())
diff --git a/third_party/blink/renderer/core/exported/local_frame_client_impl.h b/third_party/blink/renderer/core/exported/local_frame_client_impl.h
index 8ec8399b..857eb21 100644
--- a/third_party/blink/renderer/core/exported/local_frame_client_impl.h
+++ b/third_party/blink/renderer/core/exported/local_frame_client_impl.h
@@ -37,7 +37,6 @@
 #include "base/memory/scoped_refptr.h"
 
 #include "third_party/blink/public/platform/web_insecure_request_policy.h"
-#include "third_party/blink/public/platform/web_scoped_virtual_time_pauser.h"
 #include "third_party/blink/renderer/core/frame/local_frame_client.h"
 #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
@@ -269,8 +268,6 @@
   void BubbleLogicalScrollInParentFrame(ScrollDirection direction,
                                         ScrollGranularity granularity) override;
 
-  void SetVirtualTimePauser(WebScopedVirtualTimePauser) override;
-
   String evaluateInInspectorOverlayForTesting(const String& script) override;
 
   bool HandleCurrentKeyboardEvent() override;
@@ -306,8 +303,6 @@
   Member<WebLocalFrameImpl> web_frame_;
 
   String user_agent_;
-
-  mutable WebScopedVirtualTimePauser virtual_time_pauser_;
 };
 
 DEFINE_TYPE_CASTS(LocalFrameClientImpl,
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
index a535c55..64b9642 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -1791,12 +1791,6 @@
 
 void WebLocalFrameImpl::SetCoreFrame(LocalFrame* frame) {
   frame_ = frame;
-
-  local_frame_client_->SetVirtualTimePauser(
-      frame_ ? frame_->GetFrameScheduler()->CreateWebScopedVirtualTimePauser(
-                   "WebLocalFrameImpl",
-                   WebScopedVirtualTimePauser::VirtualTaskDuration::kInstant)
-             : WebScopedVirtualTimePauser());
 }
 
 void WebLocalFrameImpl::InitializeCoreFrame(Page& page,
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc
index 5f7728b..5a1b9b0 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -229,7 +229,11 @@
       forced_sandbox_flags_(kSandboxNone),
       dispatching_did_clear_window_object_in_main_world_(false),
       protect_provisional_loader_(false),
-      detached_(false) {
+      detached_(false),
+      virtual_time_pauser_(
+          frame_->GetFrameScheduler()->CreateWebScopedVirtualTimePauser(
+              "FrameLoader",
+              WebScopedVirtualTimePauser::VirtualTaskDuration::kInstant)) {
   DCHECK(frame_);
 
   TRACE_EVENT_OBJECT_CREATED_WITH_ID("loading", "FrameLoader", this);
@@ -555,6 +559,9 @@
   if (!loader)
     return;
 
+  if (loader == provisional_document_loader_)
+    virtual_time_pauser_.UnpauseVirtualTime();
+
   FrameNavigationDisabler navigation_disabler(*frame_);
   loader->DetachFromFrame(flush_microtask_queue);
   loader = nullptr;
@@ -996,6 +1003,7 @@
   Client()->DispatchDidStartProvisionalLoad(provisional_document_loader_,
                                             resource_request);
   probe::didStartProvisionalLoad(frame_);
+  virtual_time_pauser_.PauseVirtualTime();
   DCHECK(provisional_document_loader_);
   TakeObjectSnapshot();
 }
@@ -1090,6 +1098,7 @@
   Client()->DispatchDidStartProvisionalLoad(provisional_document_loader_,
                                             resource_request);
   probe::didStartProvisionalLoad(frame_);
+  virtual_time_pauser_.PauseVirtualTime();
 
   provisional_document_loader_->StartLoading();
   TakeObjectSnapshot();
@@ -1273,6 +1282,7 @@
         .SetHasSameOriginAsPreviousDocument(
             security_origin->CanRequest(frame_->GetDocument()->Url()));
   }
+  virtual_time_pauser_.UnpauseVirtualTime();
 
   if (!PrepareForCommit())
     return;
@@ -1407,6 +1417,7 @@
 
   TRACE_EVENT_OBJECT_DELETED_WITH_ID("loading", "FrameLoader", this);
   detached_ = true;
+  virtual_time_pauser_.UnpauseVirtualTime();
 }
 
 void FrameLoader::DetachProvisionalDocumentLoader(DocumentLoader* loader) {
diff --git a/third_party/blink/renderer/core/loader/frame_loader.h b/third_party/blink/renderer/core/loader/frame_loader.h
index 1a2d814..3e0b3e3 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.h
+++ b/third_party/blink/renderer/core/loader/frame_loader.h
@@ -34,6 +34,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_FRAME_LOADER_H_
 
 #include "base/macros.h"
+#include "third_party/blink/public/platform/web_scoped_virtual_time_pauser.h"
 #include "third_party/blink/public/web/web_document_loader.h"
 #include "third_party/blink/public/web/web_frame_load_type.h"
 #include "third_party/blink/public/web/web_navigation_type.h"
@@ -317,6 +318,8 @@
   bool protect_provisional_loader_;
   bool detached_;
 
+  WebScopedVirtualTimePauser virtual_time_pauser_;
+
   DISALLOW_COPY_AND_ASSIGN(FrameLoader);
 };