| Index: Source/core/loader/FrameLoader.cpp
|
| diff --git a/Source/core/loader/FrameLoader.cpp b/Source/core/loader/FrameLoader.cpp
|
| index f9ac63b279dda900df889b425685309cd7d8048c..eabe65b2bfb0b4fd1b47484b94ac4118b604aae4 100644
|
| --- a/Source/core/loader/FrameLoader.cpp
|
| +++ b/Source/core/loader/FrameLoader.cpp
|
| @@ -1281,6 +1281,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, IGNORE_EXCEPTION);
|
| + if (elementData.isEmpty() || !validateTransitionNavigationMode())
|
| + return false;
|
| +
|
| + Vector<Document::TransitionElementData>::iterator iter = elementData.begin();
|
| + for (; iter != elementData.end(); ++iter)
|
| + client()->dispatchAddNavigationTransitionData(iter->scope, iter->markup);
|
| +
|
| + return true;
|
| +}
|
| +
|
| void FrameLoader::loadWithNavigationAction(const NavigationAction& action, FrameLoadType type, PassRefPtrWillBeRawPtr<FormState> formState, const SubstituteData& substituteData, ClientRedirectPolicy clientRedirect, const AtomicString& overrideEncoding)
|
| {
|
| ASSERT(client()->hasWebView());
|
| @@ -1310,9 +1335,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) || !shouldClose()) && m_policyDocumentLoader) {
|
| + if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request, isTransitionNavigation) || !shouldClose()) && m_policyDocumentLoader) {
|
| m_policyDocumentLoader->detachFromFrame();
|
| m_policyDocumentLoader = nullptr;
|
| return;
|
| @@ -1346,7 +1376,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();
|
| }
|
|
|