Index: third_party/WebKit/Source/core/loader/FrameLoader.cpp |
diff --git a/third_party/WebKit/Source/core/loader/FrameLoader.cpp b/third_party/WebKit/Source/core/loader/FrameLoader.cpp |
index 66aa1f2aeaf50bff4420f900c6186943fb9d8b15..f773065636dfe57d0ae6fe63423fc7970a3b896d 100644 |
--- a/third_party/WebKit/Source/core/loader/FrameLoader.cpp |
+++ b/third_party/WebKit/Source/core/loader/FrameLoader.cpp |
@@ -1730,26 +1730,44 @@ void FrameLoader::startLoad(FrameLoadRequest& frameLoadRequest, |
if (!checkLoadCanStart(frameLoadRequest, type, navigationPolicy, |
navigationType)) { |
- // PlzNavigate: if the navigation is a commit of a client-handled |
- // navigation, record that there is no longer a navigation handled by the |
- // client. |
- if (m_isNavigationHandledByClient && |
- !frameLoadRequest.resourceRequest().checkForBrowserSideNavigation()) { |
- m_isNavigationHandledByClient = false; |
+ if (m_isNavigationHandledByClient) { |
+ // PlzNavigate: if the navigation is a commit of a client-handled |
+ // navigation, record that there is no longer a navigation handled by the |
+ // client. |
+ if (!frameLoadRequest.resourceRequest().checkForBrowserSideNavigation()) { |
+ m_isNavigationHandledByClient = false; |
+ } else { |
+ DocumentLoader* loader = createDocumentLoader( |
+ resourceRequest, frameLoadRequest, type, navigationType); |
+ // PlzNavigate: If the navigation is handled by the client, then the |
+ // didFinishDocumentLoad() event occurs before the |
+ // didStartProvisionalLoad() notification which occurs after the |
+ // navigation |
+ // is committed. This causes a number of layout tests to fail. We |
+ // workaround this by invoking the didStartProvisionalLoad() |
+ // notification |
+ // here. Consumers of the didStartProvisionalLoad() notification rely on |
+ // the provisional loader and save navigation state in it. We want to |
+ // avoid |
+ // this dependency on the provisional loader. For now we create a |
+ // temporary |
+ // loader and pass it to the didStartProvisionalLoad() function. |
+ // TODO(ananta) |
+ // We should get rid of the dependency on the DocumentLoader in |
+ // consumers |
+ // of |
+ // the didStartProvisionalLoad() notification. |
+ client()->dispatchDidStartProvisionalLoad(loader); |
+ DCHECK(loader); |
+ loader->setSentDidFinishLoad(); |
+ loader->detachFromFrame(); |
+ } |
} |
return; |
} |
- m_provisionalDocumentLoader = client()->createDocumentLoader( |
- m_frame, resourceRequest, |
- frameLoadRequest.substituteData().isValid() |
- ? frameLoadRequest.substituteData() |
- : defaultSubstituteDataForURL(resourceRequest.url()), |
- frameLoadRequest.clientRedirect()); |
- m_provisionalDocumentLoader->setLoadType(type); |
- m_provisionalDocumentLoader->setNavigationType(navigationType); |
- m_provisionalDocumentLoader->setReplacesCurrentHistoryItem( |
- type == FrameLoadTypeReplaceCurrentItem); |
+ m_provisionalDocumentLoader = createDocumentLoader( |
+ resourceRequest, frameLoadRequest, type, navigationType); |
// PlzNavigate: We need to ensure that script initiated navigations are |
// honored. |
@@ -1771,8 +1789,12 @@ void FrameLoader::startLoad(FrameLoadRequest& frameLoadRequest, |
m_provisionalDocumentLoader->appendRedirect( |
m_provisionalDocumentLoader->getRequest().url()); |
- client()->dispatchDidStartProvisionalLoad(); |
+ // TODO(ananta) |
+ // We should get rid of the dependency on the DocumentLoader in consumers of |
+ // the didStartProvisionalLoad() notification. |
+ client()->dispatchDidStartProvisionalLoad(m_provisionalDocumentLoader); |
DCHECK(m_provisionalDocumentLoader); |
+ |
m_provisionalDocumentLoader->startLoadingMainResource(); |
takeObjectSnapshot(); |
@@ -1963,4 +1985,22 @@ inline void FrameLoader::takeObjectSnapshot() const { |
toTracedValue()); |
} |
+DocumentLoader* FrameLoader::createDocumentLoader( |
+ const ResourceRequest& request, |
+ const FrameLoadRequest& frameLoadRequest, |
+ FrameLoadType loadType, |
+ NavigationType navigationType) { |
+ DocumentLoader* loader = client()->createDocumentLoader( |
+ m_frame, request, frameLoadRequest.substituteData().isValid() |
+ ? frameLoadRequest.substituteData() |
+ : defaultSubstituteDataForURL(request.url()), |
+ frameLoadRequest.clientRedirect()); |
+ |
+ loader->setLoadType(loadType); |
+ loader->setNavigationType(navigationType); |
+ loader->setReplacesCurrentHistoryItem(loadType == |
+ FrameLoadTypeReplaceCurrentItem); |
+ return loader; |
+} |
+ |
} // namespace blink |