Changeset 230458 in webkit


Ignore:
Timestamp:
Apr 9, 2018 5:31:02 PM (6 years ago)
Author:
beidson@apple.com
Message:

Expand WebCore policy concept of "shouldContinue" to allow for more than true/false
https://bugs.webkit.org/show_bug.cgi?id=184424

Reviewed by Alex Christensen.

No new tests (No behavior change, refactor only)

Specifically this expands the "shouldContinue" bool to be an enum class with:
-Yes
-No
-ForSuspension

  • loader/DocumentLoader.cpp:

(WebCore::DocumentLoader::willSendRequest):

  • loader/FrameLoader.cpp:

(WebCore::FrameLoader::loadURL):
(WebCore::FrameLoader::load):
(WebCore::FrameLoader::loadWithDocumentLoader):
(WebCore::FrameLoader::loadPostRequest):
(WebCore::FrameLoader::continueLoadAfterNavigationPolicy):
(WebCore::FrameLoader::continueLoadAfterNewWindowPolicy):

  • loader/FrameLoader.h:
  • loader/PolicyChecker.cpp:

(WebCore::PolicyChecker::checkNavigationPolicy):
(WebCore::PolicyChecker::checkNewWindowPolicy):

  • loader/PolicyChecker.h:
Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r230456 r230458  
     12018-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
    1302018-04-09  Sihui Liu  <sihui_liu@apple.com>
    231
  • trunk/Source/WebCore/loader/DocumentLoader.cpp

    r230211 r230458  
    640640    ASSERT(!m_waitingForNavigationPolicy);
    641641    m_waitingForNavigationPolicy = true;
    642     frameLoader()->policyChecker().checkNavigationPolicy(ResourceRequest(newRequest), didReceiveRedirectResponse, [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)] (ResourceRequest&& request, FormState*, bool shouldContinue) mutable {
     642    frameLoader()->policyChecker().checkNavigationPolicy(ResourceRequest(newRequest), didReceiveRedirectResponse, [this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)] (ResourceRequest&& request, FormState*, ShouldContinue shouldContinue) mutable {
    643643        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:
    645649            stopLoadingForPolicyChange();
     650            break;
     651        case ShouldContinue::Yes:
     652            break;
     653        }
     654
    646655        completionHandler(WTFMove(request));
    647656    });
  • trunk/Source/WebCore/loader/FrameLoader.cpp

    r230211 r230458  
    13171317    if (!targetFrame && !frameName.isEmpty()) {
    13181318        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, bool shouldContinue) {
     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) {
    13201320            continueLoadAfterNewWindowPolicy(request, formState, frameName, action, shouldContinue, allowNavigationToInvalidURL, openerPolicy);
    13211321            completionHandler();
     
    13381338        policyChecker().setLoadType(newLoadType);
    13391339        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*, bool shouldContinue) {
     1340        policyChecker().checkNavigationPolicy(ResourceRequest(request), false /* didReceiveRedirectResponse */, oldDocumentLoader.get(), formState, [this, protectedFrame = makeRef(m_frame), completionHandlerCalled = completionHandlerCalled.copyRef()] (const ResourceRequest& request, FormState*, ShouldContinue shouldContinue) {
    13411341            if (!completionHandlerCalled->value) {
    13421342                completionHandlerCalled->value = true;
    1343                 continueFragmentScrollAfterNavigationPolicy(request, shouldContinue);
     1343                continueFragmentScrollAfterNavigationPolicy(request, shouldContinue == ShouldContinue::Yes);
    13441344            }
    13451345        });
     
    14001400    if (request.shouldCheckNewWindowPolicy()) {
    14011401        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, bool shouldContinue) {
     1402        policyChecker().checkNewWindowPolicy(WTFMove(action), request.resourceRequest(), nullptr, request.frameName(), [this] (const ResourceRequest& request, FormState* formState, const String& frameName, const NavigationAction& action, ShouldContinue shouldContinue) {
    14031403            continueLoadAfterNewWindowPolicy(request, formState, frameName, action, shouldContinue, AllowNavigationToInvalidURL::Yes, NewFrameOpenerPolicy::Suppress);
    14041404        });
     
    15141514        policyChecker().stopCheck();
    15151515        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*, bool shouldContinue) {
     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) {
    15171517            if (!completionHandlerCalled->value) {
    15181518                completionHandlerCalled->value = true;
    1519                 continueFragmentScrollAfterNavigationPolicy(request, shouldContinue);
     1519                continueFragmentScrollAfterNavigationPolicy(request, shouldContinue == ShouldContinue::Yes);
    15201520            }
    15211521        });
     
    15431543        if (!m_stateMachine.committedFirstRealDocumentLoad()
    15441544            && !ownerElement->dispatchBeforeLoadEvent(loader->request().url().string())) {
    1545             continueLoadAfterNavigationPolicy(loader->request(), formState, false, allowNavigationToInvalidURL);
     1545            continueLoadAfterNavigationPolicy(loader->request(), formState, ShouldContinue::No, allowNavigationToInvalidURL);
    15461546            return;
    15471547        }
     
    15511551
    15521552    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, bool shouldContinue) {
     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) {
    15581558        continueLoadAfterNavigationPolicy(request, formState, shouldContinue, allowNavigationToInvalidURL);
    15591559        completionHandler();
     
    28152815        }
    28162816
    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, bool shouldContinue) {
     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) {
    28182818            continueLoadAfterNewWindowPolicy(request, formState, frameName, action, shouldContinue, allowNavigationToInvalidURL, openerPolicy);
    28192819            completionHandler();
     
    31703170}
    31713171
    3172 void FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest& request, FormState* formState, bool shouldContinue, AllowNavigationToInvalidURL allowNavigationToInvalidURL)
     3172void FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest& request, FormState* formState, ShouldContinue shouldContinue, AllowNavigationToInvalidURL allowNavigationToInvalidURL)
    31733173{
    31743174    // If we loaded an alternate page to replace an unreachableURL, we'll get in here with a
     
    31803180
    31813181    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;
    31893183
    31903184    if (!canContinue) {
     
    32703264
    32713265void 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)
    32753270        return;
    32763271
  • trunk/Source/WebCore/loader/FrameLoader.h

    r229926 r230458  
    8282
    8383enum class NavigationPolicyCheck;
     84enum class ShouldContinue;
    8485
    8586struct WindowFeatures;
     
    339340    void dispatchUnloadEvents(UnloadEventPolicy);
    340341
    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);
    343344    void continueFragmentScrollAfterNavigationPolicy(const ResourceRequest&, bool shouldContinue);
    344345
  • trunk/Source/WebCore/loader/PolicyChecker.cpp

    r230128 r230458  
    9393    // This avoids confusion on the part of the client.
    9494    if (equalIgnoringHeaderFields(request, loader->lastCheckedRequest()) || (!request.isNull() && request.url().isEmpty())) {
    95         function(ResourceRequest(request), nullptr, true);
     95        function(ResourceRequest(request), nullptr, ShouldContinue::Yes);
    9696        loader->setLastCheckedRequest(WTFMove(request));
    9797        return;
     
    108108        if (isBackForwardLoadType(m_loadType))
    109109            m_loadType = FrameLoadType::Reload;
    110         function(WTFMove(request), nullptr, shouldContinue);
     110        function(WTFMove(request), nullptr, shouldContinue ? ShouldContinue::Yes : ShouldContinue::No);
    111111        return;
    112112    }
     
    118118            m_frame.ownerElement()->dispatchEvent(Event::create(eventNames().loadEvent, false, false));
    119119        }
    120         function(WTFMove(request), nullptr, false);
     120        function(WTFMove(request), nullptr, ShouldContinue::No);
    121121        return;
    122122    }
     
    125125
    126126    if (request.url() == blankURL())
    127         return function(WTFMove(request), formState, true);
     127        return function(WTFMove(request), formState, ShouldContinue::Yes);
    128128
    129129#if USE(QUICK_LOOK)
    130130    // Always allow QuickLook-generated URLs based on the protocol scheme.
    131131    if (!request.isNull() && isQuickLookPreviewURL(request.url()))
    132         return function(WTFMove(request), formState, true);
     132        return function(WTFMove(request), formState, ShouldContinue::Yes);
    133133#endif
    134134
     
    140140                frame->loader().reload();
    141141        });
    142         return function({ }, nullptr, false);
     142        return function({ }, nullptr, ShouldContinue::No);
    143143    }
    144144    m_contentFilterUnblockHandler = { };
     
    161161            FALLTHROUGH;
    162162        case PolicyAction::Ignore:
    163             return function({ }, nullptr, false);
     163            return function({ }, nullptr, ShouldContinue::No);
    164164        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);
    167166        case PolicyAction::Use:
    168167            if (!m_frame.loader().client().canHandleRequest(request)) {
    169168                handleUnimplementablePolicy(m_frame.loader().client().cannotShowURLError(request));
    170                 return function({ }, nullptr, false);
     169                return function({ }, nullptr, ShouldContinue::No);
    171170            }
    172             return function(WTFMove(request), formState.get(), true);
     171            return function(WTFMove(request), formState.get(), ShouldContinue::Yes);
    173172        }
    174173        ASSERT_NOT_REACHED();
     
    179178{
    180179    if (m_frame.document() && m_frame.document()->isSandboxed(SandboxPopups))
    181         return function({ }, nullptr, { }, { }, false);
     180        return function({ }, nullptr, { }, { }, ShouldContinue::No);
    182181
    183182    if (!DOMWindow::allowPopUp(m_frame))
    184         return function({ }, nullptr, { }, { }, false);
     183        return function({ }, nullptr, { }, { }, ShouldContinue::No);
    185184
    186185    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 {
     
    190189            FALLTHROUGH;
    191190        case PolicyAction::Ignore:
    192             function({ }, nullptr, { }, { }, false);
     191            function({ }, nullptr, { }, { }, ShouldContinue::No);
    193192            return;
    194193        case PolicyAction::Suspend:
     
    196195            RELEASE_ASSERT_NOT_REACHED();
    197196        case PolicyAction::Use:
    198             function(request, formState.get(), frameName, navigationAction, true);
     197            function(request, formState.get(), frameName, navigationAction, ShouldContinue::Yes);
    199198            return;
    200199        }
  • trunk/Source/WebCore/loader/PolicyChecker.h

    r224758 r230458  
    5151class ResourceResponse;
    5252
    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)>;
     53enum class ShouldContinue {
     54    Yes,
     55    No,
     56    ForSuspension
     57};
     58
     59using NewWindowPolicyDecisionFunction = CompletionHandler<void(const ResourceRequest&, FormState*, const String& frameName, const NavigationAction&, ShouldContinue)>;
     60using NavigationPolicyDecisionFunction = CompletionHandler<void(ResourceRequest&&, FormState*, ShouldContinue)>;
    5561
    5662class PolicyChecker {
Note: See TracChangeset for help on using the changeset viewer.