Changeset 246190 in webkit


Ignore:
Timestamp:
Jun 6, 2019 11:09:40 PM (5 years ago)
Author:
aestes@apple.com
Message:

process-swap-on-navigation error when loading blocked website on iOS 12.2 only.
https://bugs.webkit.org/show_bug.cgi?id=196930
<rdar://problem/47819301>

Reviewed by Chris Dumez.

When the content filter blocks a navigation, it will continue to load the content filter
error page in the provisional web process. When dispatching didFailProvisionalLoad, we need
to specify WillContinueLoading::Yes so that WebKit presents the error page rather than
switching back to the committed web process.

Testing blocked by <https://webkit.org/b/198626>.

  • loader/ContentFilter.cpp:

(WebCore::ContentFilter::willHandleProvisionalLoadFailure):
(WebCore::ContentFilter::handleProvisionalLoadFailure):

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

(WebCore::FrameLoader::dispatchDidFailProvisionalLoad):
(WebCore::FrameLoader::checkLoadCompleteForThisFrame):

  • loader/FrameLoader.h:
Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r246187 r246190  
     12019-06-06  Andy Estes  <aestes@apple.com>
     2
     3        process-swap-on-navigation error when loading blocked website on iOS 12.2 only.
     4        https://bugs.webkit.org/show_bug.cgi?id=196930
     5        <rdar://problem/47819301>
     6
     7        Reviewed by Chris Dumez.
     8
     9        When the content filter blocks a navigation, it will continue to load the content filter
     10        error page in the provisional web process. When dispatching didFailProvisionalLoad, we need
     11        to specify WillContinueLoading::Yes so that WebKit presents the error page rather than
     12        switching back to the committed web process.
     13
     14        Testing blocked by <https://webkit.org/b/198626>.
     15
     16        * loader/ContentFilter.cpp:
     17        (WebCore::ContentFilter::willHandleProvisionalLoadFailure):
     18        (WebCore::ContentFilter::handleProvisionalLoadFailure):
     19        * loader/ContentFilter.h:
     20        * loader/FrameLoader.cpp:
     21        (WebCore::FrameLoader::dispatchDidFailProvisionalLoad):
     22        (WebCore::FrameLoader::checkLoadCompleteForThisFrame):
     23        * loader/FrameLoader.h:
     24
    1252019-06-06  Chris Dumez  <cdumez@apple.com>
    226
  • trunk/Source/WebCore/loader/ContentFilter.cpp

    r241906 r246190  
    275275}
    276276
     277bool ContentFilter::willHandleProvisionalLoadFailure(const ResourceError& error) const
     278{
     279    if (m_state != State::Blocked)
     280        return false;
     281
     282    if (m_blockedError.errorCode() != error.errorCode() || m_blockedError.domain() != error.domain())
     283        return false;
     284
     285    ASSERT(m_blockedError.failingURL() == error.failingURL());
     286    return true;
     287}
     288
    277289void ContentFilter::handleProvisionalLoadFailure(const ResourceError& error)
    278290{
    279     if (m_state != State::Blocked)
    280         return;
    281 
    282     if (m_blockedError.errorCode() != error.errorCode() || m_blockedError.domain() != error.domain())
    283         return;
    284 
    285     ASSERT(m_blockedError.failingURL() == error.failingURL());
     291    ASSERT(willHandleProvisionalLoadFailure(error));
    286292
    287293    RefPtr<SharedBuffer> replacementData { m_blockingContentFilter->replacementData() };
  • trunk/Source/WebCore/loader/ContentFilter.h

    r222113 r246190  
    6363
    6464    static bool continueAfterSubstituteDataRequest(const DocumentLoader& activeLoader, const SubstituteData&);
     65    bool willHandleProvisionalLoadFailure(const ResourceError&) const;
    6566    void handleProvisionalLoadFailure(const ResourceError&);
    6667
  • trunk/Source/WebCore/loader/FrameLoader.cpp

    r245508 r246190  
    24282428}
    24292429
     2430void FrameLoader::dispatchDidFailProvisionalLoad(DocumentLoader& provisionalDocumentLoader, const ResourceError& error)
     2431{
     2432    m_provisionalLoadErrorBeingHandledURL = provisionalDocumentLoader.url();
     2433
     2434#if ENABLE(CONTENT_FILTERING)
     2435    auto contentFilter = provisionalDocumentLoader.contentFilter();
     2436    auto contentFilterWillContinueLoading = false;
     2437#endif
     2438
     2439    auto willContinueLoading = WillContinueLoading::No;
     2440    if (history().provisionalItem())
     2441        willContinueLoading = WillContinueLoading::Yes;
     2442#if ENABLE(CONTENT_FILTERING)
     2443    if (contentFilter && contentFilter->willHandleProvisionalLoadFailure(error)) {
     2444        willContinueLoading = WillContinueLoading::Yes;
     2445        contentFilterWillContinueLoading = true;
     2446    }
     2447#endif
     2448
     2449    m_client.dispatchDidFailProvisionalLoad(error, willContinueLoading);
     2450
     2451#if ENABLE(CONTENT_FILTERING)
     2452    if (contentFilterWillContinueLoading)
     2453        contentFilter->handleProvisionalLoadFailure(error);
     2454#endif
     2455
     2456    m_provisionalLoadErrorBeingHandledURL = { };
     2457}
     2458
    24302459void FrameLoader::checkLoadCompleteForThisFrame()
    24312460{
     
    24662495            if (!pdl->isLoadingInAPISense() || pdl->isStopping()) {
    24672496                RELEASE_LOG_IF_ALLOWED("checkLoadCompleteForThisFrame: Failed provisional load (frame = %p, main = %d, isTimeout = %d, isCancellation = %d, errorCode = %d)", &m_frame, m_frame.isMainFrame(), error.isTimeout(), error.isCancellation(), error.errorCode());
    2468                 m_provisionalLoadErrorBeingHandledURL = m_provisionalDocumentLoader->url();
    2469 
    2470                 m_client.dispatchDidFailProvisionalLoad(error, history().provisionalItem() ? WillContinueLoading::Yes : WillContinueLoading::No);
    2471 #if ENABLE(CONTENT_FILTERING)
    2472                 if (auto contentFilter = pdl->contentFilter())
    2473                     contentFilter->handleProvisionalLoadFailure(error);
    2474 #endif
    2475                 m_provisionalLoadErrorBeingHandledURL = { };
    2476 
     2497
     2498                dispatchDidFailProvisionalLoad(*pdl, error);
    24772499                ASSERT(!pdl->isLoading());
    24782500
  • trunk/Source/WebCore/loader/FrameLoader.h

    r244161 r246190  
    362362    void scrollToFragmentWithParentBoundary(const URL&, bool isNewNavigation = true);
    363363
     364    void dispatchDidFailProvisionalLoad(DocumentLoader& provisionalDocumentLoader, const ResourceError&);
    364365    void checkLoadCompleteForThisFrame();
    365366
Note: See TracChangeset for help on using the changeset viewer.