| Index: Source/core/loader/FrameLoader.cpp
|
| diff --git a/Source/core/loader/FrameLoader.cpp b/Source/core/loader/FrameLoader.cpp
|
| index da94bb9a311f10e48f390a2acd1eb878ca99b753..09399338684934c1311ec77fb16363483661d599 100644
|
| --- a/Source/core/loader/FrameLoader.cpp
|
| +++ b/Source/core/loader/FrameLoader.cpp
|
| @@ -1263,6 +1263,31 @@ bool FrameLoader::shouldClose()
|
| return shouldClose;
|
| }
|
|
|
| +bool FrameLoader::validateTransitionNavigationMode()
|
| +{
|
| + if (frame()->document()->inQuirksMode()) {
|
| + frame()->document()->addConsoleMessage(JSMessageSource, ErrorMessageLevel, "Ignoring transition elements due to quirks mode.");
|
| + return false;
|
| + }
|
| +
|
| + // FIXME(oysteine): Also check for width=device-width here, to avoid zoom/scaling issues.
|
| + return true;
|
| +}
|
| +
|
| +bool FrameLoader::dispatchNavigationTransitionData()
|
| +{
|
| + Vector<Document::TransitionElementData> elementData;
|
| + frame()->document()->getTransitionElementData(elementData);
|
| + if (elementData.isEmpty() || !validateTransitionNavigationMode())
|
| + return false;
|
| +
|
| + Vector<Document::TransitionElementData>::iterator iter = elementData.begin();
|
| + for (; iter != elementData.end(); ++iter)
|
| + client()->dispatchAddNavigationTransitionData(iter->scope, iter->selector, iter->markup);
|
| +
|
| + return true;
|
| +}
|
| +
|
| void FrameLoader::loadWithNavigationAction(const NavigationAction& action, FrameLoadType type, PassRefPtrWillBeRawPtr<FormState> formState, const SubstituteData& substituteData, ContentSecurityPolicyCheck shouldCheckMainWorldContentSecurityPolicy, ClientRedirectPolicy clientRedirect, const AtomicString& overrideEncoding)
|
| {
|
| ASSERT(client()->hasWebView());
|
| @@ -1292,9 +1317,14 @@ void FrameLoader::loadWithNavigationAction(const NavigationAction& action, Frame
|
| else if (m_documentLoader)
|
| m_policyDocumentLoader->setOverrideEncoding(m_documentLoader->overrideEncoding());
|
|
|
| +
|
| + bool isTransitionNavigation = false;
|
| + if (RuntimeEnabledFeatures::navigationTransitionsEnabled())
|
| + isTransitionNavigation = dispatchNavigationTransitionData();
|
| +
|
| // stopAllLoaders can detach the LocalFrame, so protect it.
|
| RefPtr<LocalFrame> protect(m_frame);
|
| - if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request, shouldCheckMainWorldContentSecurityPolicy) || !shouldClose()) && m_policyDocumentLoader) {
|
| + if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request, shouldCheckMainWorldContentSecurityPolicy, isTransitionNavigation) || !shouldClose()) && m_policyDocumentLoader) {
|
| m_policyDocumentLoader->detachFromFrame();
|
| m_policyDocumentLoader = nullptr;
|
| return;
|
| @@ -1328,7 +1358,7 @@ void FrameLoader::loadWithNavigationAction(const NavigationAction& action, Frame
|
| if (m_provisionalDocumentLoader->isClientRedirect())
|
| m_provisionalDocumentLoader->appendRedirect(m_frame->document()->url());
|
| m_provisionalDocumentLoader->appendRedirect(m_provisionalDocumentLoader->request().url());
|
| - client()->dispatchDidStartProvisionalLoad();
|
| + client()->dispatchDidStartProvisionalLoad(isTransitionNavigation);
|
| ASSERT(m_provisionalDocumentLoader);
|
| m_provisionalDocumentLoader->startLoadingMainResource();
|
| }
|
|
|