Changeset 230458 in webkit
- Timestamp:
- Apr 9, 2018 5:31:02 PM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r230456 r230458 1 2018-04-09 Brady Eidson <beidson@apple.com> 2 3 Expand WebCore policy concept of "shouldContinue" to allow for more than true/false 4 https://bugs.webkit.org/show_bug.cgi?id=184424 5 6 Reviewed by Alex Christensen. 7 8 No new tests (No behavior change, refactor only) 9 10 Specifically this expands the "shouldContinue" bool to be an enum class with: 11 -Yes 12 -No 13 -ForSuspension 14 15 * loader/DocumentLoader.cpp: 16 (WebCore::DocumentLoader::willSendRequest): 17 * loader/FrameLoader.cpp: 18 (WebCore::FrameLoader::loadURL): 19 (WebCore::FrameLoader::load): 20 (WebCore::FrameLoader::loadWithDocumentLoader): 21 (WebCore::FrameLoader::loadPostRequest): 22 (WebCore::FrameLoader::continueLoadAfterNavigationPolicy): 23 (WebCore::FrameLoader::continueLoadAfterNewWindowPolicy): 24 * loader/FrameLoader.h: 25 * loader/PolicyChecker.cpp: 26 (WebCore::PolicyChecker::checkNavigationPolicy): 27 (WebCore::PolicyChecker::checkNewWindowPolicy): 28 * loader/PolicyChecker.h: 29 1 30 2018-04-09 Sihui Liu <sihui_liu@apple.com> 2 31 -
trunk/Source/WebCore/loader/DocumentLoader.cpp
r230211 r230458 640 640 ASSERT(!m_waitingForNavigationPolicy); 641 641 m_waitingForNavigationPolicy = true; 642 frameLoader()->policyChecker().checkNavigationPolicy(ResourceRequest(newRequest), didReceiveRedirectResponse, [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)] (ResourceRequest&& request, FormState*, boolshouldContinue) mutable {642 frameLoader()->policyChecker().checkNavigationPolicy(ResourceRequest(newRequest), didReceiveRedirectResponse, [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)] (ResourceRequest&& request, FormState*, ShouldContinue shouldContinue) mutable { 643 643 m_waitingForNavigationPolicy = false; 644 if (!shouldContinue) 644 switch (shouldContinue) { 645 case ShouldContinue::ForSuspension: 646 FALLTHROUGH; 647 // FIXME: Setup this page for suspension (e.g. Page Cache) here. 648 case ShouldContinue::No: 645 649 stopLoadingForPolicyChange(); 650 break; 651 case ShouldContinue::Yes: 652 break; 653 } 654 646 655 completionHandler(WTFMove(request)); 647 656 }); -
trunk/Source/WebCore/loader/FrameLoader.cpp
r230211 r230458 1317 1317 if (!targetFrame && !frameName.isEmpty()) { 1318 1318 action = action.copyWithShouldOpenExternalURLsPolicy(shouldOpenExternalURLsPolicyToApply(m_frame, frameLoadRequest)); 1319 policyChecker().checkNewWindowPolicy(WTFMove(action), request, formState, frameName, [this, allowNavigationToInvalidURL, openerPolicy, completionHandler = completionHandlerCaller.release()] (const ResourceRequest& request, FormState* formState, const String& frameName, const NavigationAction& action, boolshouldContinue) {1319 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) { 1320 1320 continueLoadAfterNewWindowPolicy(request, formState, frameName, action, shouldContinue, allowNavigationToInvalidURL, openerPolicy); 1321 1321 completionHandler(); … … 1338 1338 policyChecker().setLoadType(newLoadType); 1339 1339 auto completionHandlerCalled = adoptRef(*new SharedBool); 1340 policyChecker().checkNavigationPolicy(ResourceRequest(request), false /* didReceiveRedirectResponse */, oldDocumentLoader.get(), formState, [this, protectedFrame = makeRef(m_frame), completionHandlerCalled = completionHandlerCalled.copyRef()] (const ResourceRequest& request, FormState*, boolshouldContinue) {1340 policyChecker().checkNavigationPolicy(ResourceRequest(request), false /* didReceiveRedirectResponse */, oldDocumentLoader.get(), formState, [this, protectedFrame = makeRef(m_frame), completionHandlerCalled = completionHandlerCalled.copyRef()] (const ResourceRequest& request, FormState*, ShouldContinue shouldContinue) { 1341 1341 if (!completionHandlerCalled->value) { 1342 1342 completionHandlerCalled->value = true; 1343 continueFragmentScrollAfterNavigationPolicy(request, shouldContinue );1343 continueFragmentScrollAfterNavigationPolicy(request, shouldContinue == ShouldContinue::Yes); 1344 1344 } 1345 1345 }); … … 1400 1400 if (request.shouldCheckNewWindowPolicy()) { 1401 1401 NavigationAction action { request.requester(), request.resourceRequest(), InitiatedByMainFrame::Unknown, NavigationType::Other, request.shouldOpenExternalURLsPolicy() }; 1402 policyChecker().checkNewWindowPolicy(WTFMove(action), request.resourceRequest(), nullptr, request.frameName(), [this] (const ResourceRequest& request, FormState* formState, const String& frameName, const NavigationAction& action, boolshouldContinue) {1402 policyChecker().checkNewWindowPolicy(WTFMove(action), request.resourceRequest(), nullptr, request.frameName(), [this] (const ResourceRequest& request, FormState* formState, const String& frameName, const NavigationAction& action, ShouldContinue shouldContinue) { 1403 1403 continueLoadAfterNewWindowPolicy(request, formState, frameName, action, shouldContinue, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Suppress); 1404 1404 }); … … 1514 1514 policyChecker().stopCheck(); 1515 1515 auto completionHandlerCalled = adoptRef(*new SharedBool); 1516 policyChecker().checkNavigationPolicy(ResourceRequest(loader->request()), false /* didReceiveRedirectResponse */, oldDocumentLoader.get(), formState, [this, protectedFrame = makeRef(m_frame), completionHandlerCalled = completionHandlerCalled.copyRef()] (const ResourceRequest& request, FormState*, boolshouldContinue) {1516 policyChecker().checkNavigationPolicy(ResourceRequest(loader->request()), false /* didReceiveRedirectResponse */, oldDocumentLoader.get(), formState, [this, protectedFrame = makeRef(m_frame), completionHandlerCalled = completionHandlerCalled.copyRef()] (const ResourceRequest& request, FormState*, ShouldContinue shouldContinue) { 1517 1517 if (!completionHandlerCalled->value) { 1518 1518 completionHandlerCalled->value = true; 1519 continueFragmentScrollAfterNavigationPolicy(request, shouldContinue );1519 continueFragmentScrollAfterNavigationPolicy(request, shouldContinue == ShouldContinue::Yes); 1520 1520 } 1521 1521 }); … … 1543 1543 if (!m_stateMachine.committedFirstRealDocumentLoad() 1544 1544 && !ownerElement->dispatchBeforeLoadEvent(loader->request().url().string())) { 1545 continueLoadAfterNavigationPolicy(loader->request(), formState, false, allowNavigationToInvalidURL);1545 continueLoadAfterNavigationPolicy(loader->request(), formState, ShouldContinue::No, allowNavigationToInvalidURL); 1546 1546 return; 1547 1547 } … … 1551 1551 1552 1552 if (!m_currentLoadShouldCheckNavigationPolicy) { 1553 continueLoadAfterNavigationPolicy(loader->request(), formState, true, allowNavigationToInvalidURL);1554 return; 1555 } 1556 1557 policyChecker().checkNavigationPolicy(ResourceRequest(loader->request()), false /* didReceiveRedirectResponse */, loader, formState, [this, protectedFrame = makeRef(m_frame), allowNavigationToInvalidURL, completionHandler = completionHandlerCaller.release()] (const ResourceRequest& request, FormState* formState, boolshouldContinue) {1553 continueLoadAfterNavigationPolicy(loader->request(), formState, ShouldContinue::Yes, allowNavigationToInvalidURL); 1554 return; 1555 } 1556 1557 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) { 1558 1558 continueLoadAfterNavigationPolicy(request, formState, shouldContinue, allowNavigationToInvalidURL); 1559 1559 completionHandler(); … … 2815 2815 } 2816 2816 2817 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, boolshouldContinue) {2817 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) { 2818 2818 continueLoadAfterNewWindowPolicy(request, formState, frameName, action, shouldContinue, allowNavigationToInvalidURL, openerPolicy); 2819 2819 completionHandler(); … … 3170 3170 } 3171 3171 3172 void FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest& request, FormState* formState, boolshouldContinue, AllowNavigationToInvalidURL allowNavigationToInvalidURL)3172 void FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest& request, FormState* formState, ShouldContinue shouldContinue, AllowNavigationToInvalidURL allowNavigationToInvalidURL) 3173 3173 { 3174 3174 // If we loaded an alternate page to replace an unreachableURL, we'll get in here with a … … 3180 3180 3181 3181 bool urlIsDisallowed = allowNavigationToInvalidURL == AllowNavigationToInvalidURL::No && !request.url().isValid(); 3182 3183 // Three reasons we can't continue: 3184 // 1) Navigation policy delegate said we can't so request is nil. A primary case of this 3185 // is the user responding Cancel to the form repost nag sheet. 3186 // 2) User responded Cancel to an alert popped up by the before unload event handler. 3187 // 3) The request's URL is invalid and navigation to invalid URLs is disallowed. 3188 bool canContinue = shouldContinue && shouldClose() && !urlIsDisallowed; 3182 bool canContinue = shouldContinue != ShouldContinue::No && shouldClose() && !urlIsDisallowed; 3189 3183 3190 3184 if (!canContinue) { … … 3270 3264 3271 3265 void FrameLoader::continueLoadAfterNewWindowPolicy(const ResourceRequest& request, 3272 FormState* formState, const String& frameName, const NavigationAction& action, bool shouldContinue, AllowNavigationToInvalidURL allowNavigationToInvalidURL, NewFrameOpenerPolicy openerPolicy) 3273 { 3274 if (!shouldContinue) 3266 FormState* formState, const String& frameName, const NavigationAction& action, ShouldContinue shouldContinue, AllowNavigationToInvalidURL allowNavigationToInvalidURL, NewFrameOpenerPolicy openerPolicy) 3267 { 3268 ASSERT(shouldContinue != ShouldContinue::ForSuspension); 3269 if (shouldContinue != ShouldContinue::Yes) 3275 3270 return; 3276 3271 -
trunk/Source/WebCore/loader/FrameLoader.h
r229926 r230458 82 82 83 83 enum class NavigationPolicyCheck; 84 enum class ShouldContinue; 84 85 85 86 struct WindowFeatures; … … 339 340 void dispatchUnloadEvents(UnloadEventPolicy); 340 341 341 void continueLoadAfterNavigationPolicy(const ResourceRequest&, FormState*, bool shouldContinue, AllowNavigationToInvalidURL);342 void continueLoadAfterNewWindowPolicy(const ResourceRequest&, FormState*, const String& frameName, const NavigationAction&, bool shouldContinue, AllowNavigationToInvalidURL, NewFrameOpenerPolicy);342 void continueLoadAfterNavigationPolicy(const ResourceRequest&, FormState*, ShouldContinue, AllowNavigationToInvalidURL); 343 void continueLoadAfterNewWindowPolicy(const ResourceRequest&, FormState*, const String& frameName, const NavigationAction&, ShouldContinue, AllowNavigationToInvalidURL, NewFrameOpenerPolicy); 343 344 void continueFragmentScrollAfterNavigationPolicy(const ResourceRequest&, bool shouldContinue); 344 345 -
trunk/Source/WebCore/loader/PolicyChecker.cpp
r230128 r230458 93 93 // This avoids confusion on the part of the client. 94 94 if (equalIgnoringHeaderFields(request, loader->lastCheckedRequest()) || (!request.isNull() && request.url().isEmpty())) { 95 function(ResourceRequest(request), nullptr, true);95 function(ResourceRequest(request), nullptr, ShouldContinue::Yes); 96 96 loader->setLastCheckedRequest(WTFMove(request)); 97 97 return; … … 108 108 if (isBackForwardLoadType(m_loadType)) 109 109 m_loadType = FrameLoadType::Reload; 110 function(WTFMove(request), nullptr, shouldContinue );110 function(WTFMove(request), nullptr, shouldContinue ? ShouldContinue::Yes : ShouldContinue::No); 111 111 return; 112 112 } … … 118 118 m_frame.ownerElement()->dispatchEvent(Event::create(eventNames().loadEvent, false, false)); 119 119 } 120 function(WTFMove(request), nullptr, false);120 function(WTFMove(request), nullptr, ShouldContinue::No); 121 121 return; 122 122 } … … 125 125 126 126 if (request.url() == blankURL()) 127 return function(WTFMove(request), formState, true);127 return function(WTFMove(request), formState, ShouldContinue::Yes); 128 128 129 129 #if USE(QUICK_LOOK) 130 130 // Always allow QuickLook-generated URLs based on the protocol scheme. 131 131 if (!request.isNull() && isQuickLookPreviewURL(request.url())) 132 return function(WTFMove(request), formState, true);132 return function(WTFMove(request), formState, ShouldContinue::Yes); 133 133 #endif 134 134 … … 140 140 frame->loader().reload(); 141 141 }); 142 return function({ }, nullptr, false);142 return function({ }, nullptr, ShouldContinue::No); 143 143 } 144 144 m_contentFilterUnblockHandler = { }; … … 161 161 FALLTHROUGH; 162 162 case PolicyAction::Ignore: 163 return function({ }, nullptr, false);163 return function({ }, nullptr, ShouldContinue::No); 164 164 case PolicyAction::Suspend: 165 LOG(Loading, "PolicyAction::Suspend encountered - Treating as PolicyAction::Ignore for now"); 166 return function({ }, nullptr, false); 165 return function({ }, nullptr, ShouldContinue::ForSuspension); 167 166 case PolicyAction::Use: 168 167 if (!m_frame.loader().client().canHandleRequest(request)) { 169 168 handleUnimplementablePolicy(m_frame.loader().client().cannotShowURLError(request)); 170 return function({ }, nullptr, false);169 return function({ }, nullptr, ShouldContinue::No); 171 170 } 172 return function(WTFMove(request), formState.get(), true);171 return function(WTFMove(request), formState.get(), ShouldContinue::Yes); 173 172 } 174 173 ASSERT_NOT_REACHED(); … … 179 178 { 180 179 if (m_frame.document() && m_frame.document()->isSandboxed(SandboxPopups)) 181 return function({ }, nullptr, { }, { }, false);180 return function({ }, nullptr, { }, { }, ShouldContinue::No); 182 181 183 182 if (!DOMWindow::allowPopUp(m_frame)) 184 return function({ }, nullptr, { }, { }, false);183 return function({ }, nullptr, { }, { }, ShouldContinue::No); 185 184 186 185 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 { … … 190 189 FALLTHROUGH; 191 190 case PolicyAction::Ignore: 192 function({ }, nullptr, { }, { }, false);191 function({ }, nullptr, { }, { }, ShouldContinue::No); 193 192 return; 194 193 case PolicyAction::Suspend: … … 196 195 RELEASE_ASSERT_NOT_REACHED(); 197 196 case PolicyAction::Use: 198 function(request, formState.get(), frameName, navigationAction, true);197 function(request, formState.get(), frameName, navigationAction, ShouldContinue::Yes); 199 198 return; 200 199 } -
trunk/Source/WebCore/loader/PolicyChecker.h
r224758 r230458 51 51 class ResourceResponse; 52 52 53 using NewWindowPolicyDecisionFunction = WTF::CompletionHandler<void(const ResourceRequest&, FormState*, const String& frameName, const NavigationAction&, bool shouldContinue)>; 54 using NavigationPolicyDecisionFunction = WTF::CompletionHandler<void(ResourceRequest&&, FormState*, bool shouldContinue)>; 53 enum class ShouldContinue { 54 Yes, 55 No, 56 ForSuspension 57 }; 58 59 using NewWindowPolicyDecisionFunction = CompletionHandler<void(const ResourceRequest&, FormState*, const String& frameName, const NavigationAction&, ShouldContinue)>; 60 using NavigationPolicyDecisionFunction = CompletionHandler<void(ResourceRequest&&, FormState*, ShouldContinue)>; 55 61 56 62 class PolicyChecker {
Note: See TracChangeset
for help on using the changeset viewer.