Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (230457 => 230458)
--- trunk/Source/WebCore/loader/FrameLoader.cpp 2018-04-10 00:28:24 UTC (rev 230457)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp 2018-04-10 00:31:02 UTC (rev 230458)
@@ -1316,7 +1316,7 @@
if (!targetFrame && !frameName.isEmpty()) {
action = "" frameLoadRequest));
- policyChecker().checkNewWindowPolicy(WTFMove(action), request, formState, frameName, [this, allowNavigationToInvalidURL, openerPolicy, completionHandler = completionHandlerCaller.release()] (const ResourceRequest& request, FormState* formState, const String& frameName, const NavigationAction& action, bool shouldContinue) {
+ policyChecker().checkNewWindowPolicy(WTFMove(action), request, formState, frameName, [this, allowNavigationToInvalidURL, openerPolicy, completionHandler = completionHandlerCaller.release()] (const ResourceRequest& request, FormState* formState, const String& frameName, const NavigationAction& action, ShouldContinue shouldContinue) {
continueLoadAfterNewWindowPolicy(request, formState, frameName, action, shouldContinue, allowNavigationToInvalidURL, openerPolicy);
completionHandler();
});
@@ -1337,10 +1337,10 @@
policyChecker().stopCheck();
policyChecker().setLoadType(newLoadType);
auto completionHandlerCalled = adoptRef(*new SharedBool);
- policyChecker().checkNavigationPolicy(ResourceRequest(request), false /* didReceiveRedirectResponse */, oldDocumentLoader.get(), formState, [this, protectedFrame = makeRef(m_frame), completionHandlerCalled = completionHandlerCalled.copyRef()] (const ResourceRequest& request, FormState*, bool shouldContinue) {
+ policyChecker().checkNavigationPolicy(ResourceRequest(request), false /* didReceiveRedirectResponse */, oldDocumentLoader.get(), formState, [this, protectedFrame = makeRef(m_frame), completionHandlerCalled = completionHandlerCalled.copyRef()] (const ResourceRequest& request, FormState*, ShouldContinue shouldContinue) {
if (!completionHandlerCalled->value) {
completionHandlerCalled->value = true;
- continueFragmentScrollAfterNavigationPolicy(request, shouldContinue);
+ continueFragmentScrollAfterNavigationPolicy(request, shouldContinue == ShouldContinue::Yes);
}
});
if (!completionHandlerCalled->value) {
@@ -1399,7 +1399,7 @@
if (request.shouldCheckNewWindowPolicy()) {
NavigationAction action { request.requester(), request.resourceRequest(), InitiatedByMainFrame::Unknown, NavigationType::Other, request.shouldOpenExternalURLsPolicy() };
- policyChecker().checkNewWindowPolicy(WTFMove(action), request.resourceRequest(), nullptr, request.frameName(), [this] (const ResourceRequest& request, FormState* formState, const String& frameName, const NavigationAction& action, bool shouldContinue) {
+ policyChecker().checkNewWindowPolicy(WTFMove(action), request.resourceRequest(), nullptr, request.frameName(), [this] (const ResourceRequest& request, FormState* formState, const String& frameName, const NavigationAction& action, ShouldContinue shouldContinue) {
continueLoadAfterNewWindowPolicy(request, formState, frameName, action, shouldContinue, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Suppress);
});
@@ -1513,10 +1513,10 @@
oldDocumentLoader->setLastCheckedRequest(ResourceRequest());
policyChecker().stopCheck();
auto completionHandlerCalled = adoptRef(*new SharedBool);
- policyChecker().checkNavigationPolicy(ResourceRequest(loader->request()), false /* didReceiveRedirectResponse */, oldDocumentLoader.get(), formState, [this, protectedFrame = makeRef(m_frame), completionHandlerCalled = completionHandlerCalled.copyRef()] (const ResourceRequest& request, FormState*, bool shouldContinue) {
+ policyChecker().checkNavigationPolicy(ResourceRequest(loader->request()), false /* didReceiveRedirectResponse */, oldDocumentLoader.get(), formState, [this, protectedFrame = makeRef(m_frame), completionHandlerCalled = completionHandlerCalled.copyRef()] (const ResourceRequest& request, FormState*, ShouldContinue shouldContinue) {
if (!completionHandlerCalled->value) {
completionHandlerCalled->value = true;
- continueFragmentScrollAfterNavigationPolicy(request, shouldContinue);
+ continueFragmentScrollAfterNavigationPolicy(request, shouldContinue == ShouldContinue::Yes);
}
});
if (!completionHandlerCalled->value) {
@@ -1542,7 +1542,7 @@
// a new URL, the parent frame shouldn't learn the URL.
if (!m_stateMachine.committedFirstRealDocumentLoad()
&& !ownerElement->dispatchBeforeLoadEvent(loader->request().url().string())) {
- continueLoadAfterNavigationPolicy(loader->request(), formState, false, allowNavigationToInvalidURL);
+ continueLoadAfterNavigationPolicy(loader->request(), formState, ShouldContinue::No, allowNavigationToInvalidURL);
return;
}
}
@@ -1550,11 +1550,11 @@
m_frame.navigationScheduler().cancel(true);
if (!m_currentLoadShouldCheckNavigationPolicy) {
- continueLoadAfterNavigationPolicy(loader->request(), formState, true, allowNavigationToInvalidURL);
+ continueLoadAfterNavigationPolicy(loader->request(), formState, ShouldContinue::Yes, allowNavigationToInvalidURL);
return;
}
- policyChecker().checkNavigationPolicy(ResourceRequest(loader->request()), false /* didReceiveRedirectResponse */, loader, formState, [this, protectedFrame = makeRef(m_frame), allowNavigationToInvalidURL, completionHandler = completionHandlerCaller.release()] (const ResourceRequest& request, FormState* formState, bool shouldContinue) {
+ policyChecker().checkNavigationPolicy(ResourceRequest(loader->request()), false /* didReceiveRedirectResponse */, loader, formState, [this, protectedFrame = makeRef(m_frame), allowNavigationToInvalidURL, completionHandler = completionHandlerCaller.release()] (const ResourceRequest& request, FormState* formState, ShouldContinue shouldContinue) {
continueLoadAfterNavigationPolicy(request, formState, shouldContinue, allowNavigationToInvalidURL);
completionHandler();
});
@@ -2814,7 +2814,7 @@
return;
}
- policyChecker().checkNewWindowPolicy(WTFMove(action), workingResourceRequest, WTFMove(formState), frameName, [this, allowNavigationToInvalidURL, openerPolicy, completionHandler = WTFMove(completionHandler)] (const ResourceRequest& request, FormState* formState, const String& frameName, const NavigationAction& action, bool shouldContinue) {
+ policyChecker().checkNewWindowPolicy(WTFMove(action), workingResourceRequest, WTFMove(formState), frameName, [this, allowNavigationToInvalidURL, openerPolicy, completionHandler = WTFMove(completionHandler)] (const ResourceRequest& request, FormState* formState, const String& frameName, const NavigationAction& action, ShouldContinue shouldContinue) {
continueLoadAfterNewWindowPolicy(request, formState, frameName, action, shouldContinue, allowNavigationToInvalidURL, openerPolicy);
completionHandler();
});
@@ -3169,7 +3169,7 @@
return chrome.runBeforeUnloadConfirmPanel(text, m_frame);
}
-void FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest& request, FormState* formState, bool shouldContinue, AllowNavigationToInvalidURL allowNavigationToInvalidURL)
+void FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest& request, FormState* formState, ShouldContinue shouldContinue, AllowNavigationToInvalidURL allowNavigationToInvalidURL)
{
// If we loaded an alternate page to replace an unreachableURL, we'll get in here with a
// nil policyDataSource because loading the alternate page will have passed
@@ -3179,14 +3179,8 @@
bool isTargetItem = history().provisionalItem() ? history().provisionalItem()->isTargetItem() : false;
bool urlIsDisallowed = allowNavigationToInvalidURL == AllowNavigationToInvalidURL::No && !request.url().isValid();
+ bool canContinue = shouldContinue != ShouldContinue::No && shouldClose() && !urlIsDisallowed;
- // Three reasons we can't continue:
- // 1) Navigation policy delegate said we can't so request is nil. A primary case of this
- // is the user responding Cancel to the form repost nag sheet.
- // 2) User responded Cancel to an alert popped up by the before unload event handler.
- // 3) The request's URL is invalid and navigation to invalid URLs is disallowed.
- bool canContinue = shouldContinue && shouldClose() && !urlIsDisallowed;
-
if (!canContinue) {
// If we were waiting for a quick redirect, but the policy delegate decided to ignore it, then we
// need to report that the client redirect was cancelled.
@@ -3269,9 +3263,10 @@
}
void FrameLoader::continueLoadAfterNewWindowPolicy(const ResourceRequest& request,
- FormState* formState, const String& frameName, const NavigationAction& action, bool shouldContinue, AllowNavigationToInvalidURL allowNavigationToInvalidURL, NewFrameOpenerPolicy openerPolicy)
+ FormState* formState, const String& frameName, const NavigationAction& action, ShouldContinue shouldContinue, AllowNavigationToInvalidURL allowNavigationToInvalidURL, NewFrameOpenerPolicy openerPolicy)
{
- if (!shouldContinue)
+ ASSERT(shouldContinue != ShouldContinue::ForSuspension);
+ if (shouldContinue != ShouldContinue::Yes)
return;
Ref<Frame> frame(m_frame);
Modified: trunk/Source/WebCore/loader/PolicyChecker.cpp (230457 => 230458)
--- trunk/Source/WebCore/loader/PolicyChecker.cpp 2018-04-10 00:28:24 UTC (rev 230457)
+++ trunk/Source/WebCore/loader/PolicyChecker.cpp 2018-04-10 00:31:02 UTC (rev 230458)
@@ -92,7 +92,7 @@
// Don't ask more than once for the same request or if we are loading an empty URL.
// This avoids confusion on the part of the client.
if (equalIgnoringHeaderFields(request, loader->lastCheckedRequest()) || (!request.isNull() && request.url().isEmpty())) {
- function(ResourceRequest(request), nullptr, true);
+ function(ResourceRequest(request), nullptr, ShouldContinue::Yes);
loader->setLastCheckedRequest(WTFMove(request));
return;
}
@@ -107,7 +107,7 @@
#endif
if (isBackForwardLoadType(m_loadType))
m_loadType = FrameLoadType::Reload;
- function(WTFMove(request), nullptr, shouldContinue);
+ function(WTFMove(request), nullptr, shouldContinue ? ShouldContinue::Yes : ShouldContinue::No);
return;
}
@@ -117,7 +117,7 @@
// reveal that the frame was blocked. This way, it looks like any other cross-origin page load.
m_frame.ownerElement()->dispatchEvent(Event::create(eventNames().loadEvent, false, false));
}
- function(WTFMove(request), nullptr, false);
+ function(WTFMove(request), nullptr, ShouldContinue::No);
return;
}
@@ -124,12 +124,12 @@
loader->setLastCheckedRequest(ResourceRequest(request));
if (request.url() == blankURL())
- return function(WTFMove(request), formState, true);
+ return function(WTFMove(request), formState, ShouldContinue::Yes);
#if USE(QUICK_LOOK)
// Always allow QuickLook-generated URLs based on the protocol scheme.
if (!request.isNull() && isQuickLookPreviewURL(request.url()))
- return function(WTFMove(request), formState, true);
+ return function(WTFMove(request), formState, ShouldContinue::Yes);
#endif
#if ENABLE(CONTENT_FILTERING)
@@ -139,7 +139,7 @@
if (unblocked)
frame->loader().reload();
});
- return function({ }, nullptr, false);
+ return function({ }, nullptr, ShouldContinue::No);
}
m_contentFilterUnblockHandler = { };
#endif
@@ -160,16 +160,15 @@
m_frame.loader().client().startDownload(request, suggestedFilename);
FALLTHROUGH;
case PolicyAction::Ignore:
- return function({ }, nullptr, false);
+ return function({ }, nullptr, ShouldContinue::No);
case PolicyAction::Suspend:
- LOG(Loading, "PolicyAction::Suspend encountered - Treating as PolicyAction::Ignore for now");
- return function({ }, nullptr, false);
+ return function({ }, nullptr, ShouldContinue::ForSuspension);
case PolicyAction::Use:
if (!m_frame.loader().client().canHandleRequest(request)) {
handleUnimplementablePolicy(m_frame.loader().client().cannotShowURLError(request));
- return function({ }, nullptr, false);
+ return function({ }, nullptr, ShouldContinue::No);
}
- return function(WTFMove(request), formState.get(), true);
+ return function(WTFMove(request), formState.get(), ShouldContinue::Yes);
}
ASSERT_NOT_REACHED();
});
@@ -178,10 +177,10 @@
void PolicyChecker::checkNewWindowPolicy(NavigationAction&& navigationAction, const ResourceRequest& request, FormState* formState, const String& frameName, NewWindowPolicyDecisionFunction&& function)
{
if (m_frame.document() && m_frame.document()->isSandboxed(SandboxPopups))
- return function({ }, nullptr, { }, { }, false);
+ return function({ }, nullptr, { }, { }, ShouldContinue::No);
if (!DOMWindow::allowPopUp(m_frame))
- return function({ }, nullptr, { }, { }, false);
+ return function({ }, nullptr, { }, { }, ShouldContinue::No);
m_frame.loader().client().dispatchDecidePolicyForNewWindowAction(navigationAction, request, formState, frameName, [frame = makeRef(m_frame), request, formState = makeRefPtr(formState), frameName, navigationAction, function = WTFMove(function)](PolicyAction policyAction) mutable {
switch (policyAction) {
@@ -189,13 +188,13 @@
frame->loader().client().startDownload(request);
FALLTHROUGH;
case PolicyAction::Ignore:
- function({ }, nullptr, { }, { }, false);
+ function({ }, nullptr, { }, { }, ShouldContinue::No);
return;
case PolicyAction::Suspend:
// It is invalid to get a "Suspend" policy for new windows, as the old document is not going away.
RELEASE_ASSERT_NOT_REACHED();
case PolicyAction::Use:
- function(request, formState.get(), frameName, navigationAction, true);
+ function(request, formState.get(), frameName, navigationAction, ShouldContinue::Yes);
return;
}
ASSERT_NOT_REACHED();