⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 244540 in webkit


Ignore:
Timestamp:
Apr 23, 2019, 8:38:11 AM (7 years ago)
Author:
Chris Dumez
Message:

[Process-Swap-On-Navigation] WebKit hangs when going back to a form submission's page due to Process-Swap-On-Navigation on iOS 12.2 and higher
https://bugs.webkit.org/show_bug.cgi?id=197097
<rdar://problem/50048318>

Reviewed by Alex Christensen.

Source/WebCore:

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

(WebCore::FrameLoader::checkLoadCompleteForThisFrame):
If we still have a provisional item (new load has been started or we did not clear it because we're about to retry),
then let the client know the load will continue by passing an extra flag with the didFailProvisionalLoad.

  • loader/FrameLoaderClient.h:
  • loader/FrameLoaderTypes.h:

Source/WebKit:

The issue is that when doing a history navigation with form data, we try to resubmit the form.
We initially use the ReturnCacheDataDontLoad cache policy without prompting the user to get
cached data. If this fails, we sent a DidFailProvisionalLoadForFrame IPC to the UIProcess but
the WebContent process actually retries the load with ReturnCacheDataElseLoad cache policy.
This new load triggers a new decidePolicyForNavigationAction.

This would cause trouble with process-swapping because we normally destroy the
ProvisionalPageProxy as soon as we receive a DidFailProvisionalLoadForFrame IPC from the
provisional process. As a result, the provisional process would not be able to retry.

To address the issue, we add pass a flag with the DidFailProvisionalLoadForFrame IPC to
if the load will continue or not. When this flag is set, the UIProcess does not destroy
the provisional page.

  • Scripts/webkit/messages.py:

Minor IPC message handler build fix.

  • UIProcess/API/Cocoa/WKURLSchemeTask.mm:

(-[WKURLSchemeTaskImpl _onlyIfCached]):

  • UIProcess/API/Cocoa/WKURLSchemeTaskPrivate.h:

Add new _onlyIfCached SPI to WKURLSchemeTaskPrivate to allow for API testing.

  • UIProcess/ProvisionalPageProxy.cpp:

(WebKit::ProvisionalPageProxy::cancel):
Pass WillContinueLoading flag.

(WebKit::ProvisionalPageProxy::validateInput):
Consider IPC with a navigationID of 0 as valid. When the navigation is triggered by the
WebContent process, it sends us a DecidePolicyForNavigationActionAsync IPC with a navigationID
of 0, until the UIProcess can generate a valid identifier.

(WebKit::ProvisionalPageProxy::didFailProvisionalLoadForFrame):

(WebKit::ProvisionalPageProxy::decidePolicyForNavigationActionAsync):
When the WebPageProxy has generated a navigationID for the new WebContent process-initiated
navigation, update m_navigationID so that follow-up IPC is considered valid.

  • UIProcess/ProvisionalPageProxy.h:
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::didFailProvisionalLoadForFrame):
(WebKit::WebPageProxy::didFailProvisionalLoadForFrameShared):
(WebKit::WebPageProxy::decidePolicyForNavigationActionAsyncShared):
(WebKit::WebPageProxy::decidePolicyForNavigationAction):

  • UIProcess/WebPageProxy.h:
  • UIProcess/WebPageProxy.messages.in:
  • WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:

(WebKit::WebFrameLoaderClient::dispatchDidFailProvisionalLoad):

  • WebProcess/WebCoreSupport/WebFrameLoaderClient.h:

Source/WebKitLegacy/mac:

  • WebCoreSupport/WebFrameLoaderClient.h:
  • WebCoreSupport/WebFrameLoaderClient.mm:

(WebFrameLoaderClient::dispatchDidFailProvisionalLoad):

Source/WebKitLegacy/win:

  • WebCoreSupport/WebFrameLoaderClient.cpp:

(WebFrameLoaderClient::dispatchDidFailProvisionalLoad):

  • WebCoreSupport/WebFrameLoaderClient.h:

Tools:

Add API test coverage.

  • TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm:

(-[PSONScheme webView:startURLSchemeTask:]):

Location:
trunk
Files:
24 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r244538 r244540  
     12019-04-23  Chris Dumez  <cdumez@apple.com>
     2
     3        [Process-Swap-On-Navigation] WebKit hangs when going back to a form submission's page due to Process-Swap-On-Navigation on iOS 12.2 and higher
     4        https://bugs.webkit.org/show_bug.cgi?id=197097
     5        <rdar://problem/50048318>
     6
     7        Reviewed by Alex Christensen.
     8
     9        * loader/EmptyFrameLoaderClient.h:
     10        * loader/FrameLoader.cpp:
     11        (WebCore::FrameLoader::checkLoadCompleteForThisFrame):
     12        If we still have a provisional item (new load has been started or we did not clear it because we're about to retry),
     13        then let the client know the load will continue by passing an extra flag with the didFailProvisionalLoad.
     14
     15        * loader/FrameLoaderClient.h:
     16        * loader/FrameLoaderTypes.h:
     17
    1182019-04-23  Carlos Garcia Campos  <cgarcia@igalia.com>
    219
  • trunk/Source/WebCore/loader/EmptyFrameLoaderClient.h

    r244161 r244540  
    8585    void dispatchDidReceiveTitle(const StringWithDirection&) final { }
    8686    void dispatchDidCommitLoad(Optional<HasInsecureContent>) final { }
    87     void dispatchDidFailProvisionalLoad(const ResourceError&) final { }
     87    void dispatchDidFailProvisionalLoad(const ResourceError&, WillContinueLoading) final { }
    8888    void dispatchDidFailLoad(const ResourceError&) final { }
    8989    void dispatchDidFinishDocumentLoad() final { }
  • trunk/Source/WebCore/loader/FrameLoader.cpp

    r244361 r244540  
    24662466                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());
    24672467                m_provisionalLoadErrorBeingHandledURL = m_provisionalDocumentLoader->url();
    2468                 m_client.dispatchDidFailProvisionalLoad(error);
     2468
     2469                m_client.dispatchDidFailProvisionalLoad(error, history().provisionalItem() ? WillContinueLoading::Yes : WillContinueLoading::No);
    24692470#if ENABLE(CONTENT_FILTERING)
    24702471                if (auto contentFilter = pdl->contentFilter())
  • trunk/Source/WebCore/loader/FrameLoaderClient.h

    r244361 r244540  
    178178    virtual void dispatchDidReceiveTitle(const StringWithDirection&) = 0;
    179179    virtual void dispatchDidCommitLoad(Optional<HasInsecureContent>) = 0;
    180     virtual void dispatchDidFailProvisionalLoad(const ResourceError&) = 0;
     180    virtual void dispatchDidFailProvisionalLoad(const ResourceError&, WillContinueLoading) = 0;
    181181    virtual void dispatchDidFailLoad(const ResourceError&) = 0;
    182182    virtual void dispatchDidFinishDocumentLoad() = 0;
  • trunk/Source/WebCore/loader/FrameLoaderTypes.h

    r240909 r244540  
    6868};
    6969
     70enum class WillContinueLoading : bool { No, Yes };
     71
    7072class PolicyCheckIdentifier {
    7173public:
  • trunk/Source/WebKit/ChangeLog

    r244537 r244540  
     12019-04-23  Chris Dumez  <cdumez@apple.com>
     2
     3        [Process-Swap-On-Navigation] WebKit hangs when going back to a form submission's page due to Process-Swap-On-Navigation on iOS 12.2 and higher
     4        https://bugs.webkit.org/show_bug.cgi?id=197097
     5        <rdar://problem/50048318>
     6
     7        Reviewed by Alex Christensen.
     8
     9        The issue is that when doing a history navigation with form data, we try to resubmit the form.
     10        We initially use the ReturnCacheDataDontLoad cache policy without prompting the user to get
     11        cached data. If this fails, we sent a DidFailProvisionalLoadForFrame IPC to the UIProcess but
     12        the WebContent process actually retries the load with ReturnCacheDataElseLoad cache policy.
     13        This new load triggers a new decidePolicyForNavigationAction.
     14
     15        This would cause trouble with process-swapping because we normally destroy the
     16        ProvisionalPageProxy as soon as we receive a DidFailProvisionalLoadForFrame IPC from the
     17        provisional process. As a result, the provisional process would not be able to retry.
     18
     19        To address the issue, we add pass a flag with the DidFailProvisionalLoadForFrame IPC to
     20        if the load will continue or not. When this flag is set, the UIProcess does not destroy
     21        the provisional page.
     22
     23        * Scripts/webkit/messages.py:
     24        Minor IPC message handler build fix.
     25
     26        * UIProcess/API/Cocoa/WKURLSchemeTask.mm:
     27        (-[WKURLSchemeTaskImpl _onlyIfCached]):
     28        * UIProcess/API/Cocoa/WKURLSchemeTaskPrivate.h:
     29        Add new _onlyIfCached SPI to WKURLSchemeTaskPrivate to allow for API testing.
     30
     31        * UIProcess/ProvisionalPageProxy.cpp:
     32        (WebKit::ProvisionalPageProxy::cancel):
     33        Pass WillContinueLoading flag.
     34
     35        (WebKit::ProvisionalPageProxy::validateInput):
     36        Consider IPC with a navigationID of 0 as valid. When the navigation is triggered by the
     37        WebContent process, it sends us a DecidePolicyForNavigationActionAsync IPC with a navigationID
     38        of 0, until the UIProcess can generate a valid identifier.
     39
     40        (WebKit::ProvisionalPageProxy::didFailProvisionalLoadForFrame):
     41
     42        (WebKit::ProvisionalPageProxy::decidePolicyForNavigationActionAsync):
     43        When the WebPageProxy has generated a navigationID for the new WebContent process-initiated
     44        navigation, update m_navigationID so that follow-up IPC is considered valid.
     45
     46        * UIProcess/ProvisionalPageProxy.h:
     47        * UIProcess/WebPageProxy.cpp:
     48        (WebKit::WebPageProxy::didFailProvisionalLoadForFrame):
     49        (WebKit::WebPageProxy::didFailProvisionalLoadForFrameShared):
     50        (WebKit::WebPageProxy::decidePolicyForNavigationActionAsyncShared):
     51        (WebKit::WebPageProxy::decidePolicyForNavigationAction):
     52        * UIProcess/WebPageProxy.h:
     53        * UIProcess/WebPageProxy.messages.in:
     54        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
     55        (WebKit::WebFrameLoaderClient::dispatchDidFailProvisionalLoad):
     56        * WebProcess/WebCoreSupport/WebFrameLoaderClient.h:
     57
    1582019-04-22  Zalan Bujtas  <zalan@apple.com>
    259
  • trunk/Source/WebKit/Scripts/webkit/messages.py

    r244095 r244540  
    463463        'WebCore::TextIndicatorData': ['<WebCore/TextIndicator.h>'],
    464464        'WebCore::ViewportAttributes': ['<WebCore/ViewportArguments.h>'],
     465        'WebCore::WillContinueLoading': ['<WebCore/FrameLoaderTypes.h>'],
    465466        'WebCore::SelectionRect': ['"EditorState.h"'],
    466467        'WebKit::ActivityStateChangeID': ['"DrawingAreaInfo.h"'],
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKURLSchemeTask.mm

    r242339 r244540  
    7171}
    7272
     73- (BOOL)_requestOnlyIfCached
     74{
     75    return _urlSchemeTask->task().request().cachePolicy() == WebCore::ResourceRequestCachePolicy::ReturnCacheDataDontLoad;
     76}
     77
    7378- (void)didReceiveResponse:(NSURLResponse *)response
    7479{
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKURLSchemeTaskPrivate.h

    r243376 r244540  
    3131- (void)_didPerformRedirection:(NSURLResponse *)response newRequest:(NSURLRequest *)request;
    3232
     33@property (nonatomic, readonly) BOOL _requestOnlyIfCached WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
     34
    3335@end
  • trunk/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp

    r244307 r244540  
    135135    auto error = WebKit::cancelledError(m_request);
    136136    error.setType(WebCore::ResourceError::Type::Cancellation);
    137     didFailProvisionalLoadForFrame(m_mainFrame->frameID(), { }, m_navigationID, m_provisionalLoadURL, error, UserData { }); // Will delete |this|.
     137    didFailProvisionalLoadForFrame(m_mainFrame->frameID(), { }, m_navigationID, m_provisionalLoadURL, error, WebCore::WillContinueLoading::No, UserData { }); // Will delete |this|.
    138138}
    139139
     
    190190        return false;
    191191
    192     return !navigationID || *navigationID == m_navigationID;
     192    return !navigationID || !*navigationID || *navigationID == m_navigationID;
    193193}
    194194
     
    248248}
    249249
    250 void ProvisionalPageProxy::didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError& error, const UserData& userData)
     250void ProvisionalPageProxy::didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError& error, WebCore::WillContinueLoading willContinueLoading, const UserData& userData)
    251251{
    252252    if (!validateInput(frameID, navigationID))
     
    261261        pageMainFrame->didFailProvisionalLoad();
    262262
    263     m_page.didFailProvisionalLoadForFrameShared(m_process.copyRef(), frameID, frameSecurityOrigin, navigationID, provisionalURL, error, userData); // Will delete |this|.
     263    m_page.didFailProvisionalLoadForFrameShared(m_process.copyRef(), frameID, frameSecurityOrigin, navigationID, provisionalURL, error, willContinueLoading, userData); // May delete |this|.
    264264}
    265265
     
    379379    if (decoder.messageName() == Messages::WebPageProxy::DidStartProgress::name()
    380380        || decoder.messageName() == Messages::WebPageProxy::DidChangeProgress::name()
     381        || decoder.messageName() == Messages::WebPageProxy::DidDestroyNavigation::name()
     382        || decoder.messageName() == Messages::WebPageProxy::DidFinishProgress::name()
    381383        || decoder.messageName() == Messages::WebPageProxy::BackForwardAddItem::name()
    382384        || decoder.messageName() == Messages::WebPageProxy::LogDiagnosticMessage::name()
     
    384386        || decoder.messageName() == Messages::WebPageProxy::LogDiagnosticMessageWithValueDictionary::name()
    385387        || decoder.messageName() == Messages::WebPageProxy::SetNetworkRequestsInProgress::name()
     388        || decoder.messageName() == Messages::WebPageProxy::WillGoToBackForwardListItem::name()
    386389#if USE(QUICK_LOOK)
    387390        || decoder.messageName() == Messages::WebPageProxy::DidStartLoadForQuickLookDocumentInMainFrame::name()
  • trunk/Source/WebKit/UIProcess/ProvisionalPageProxy.h

    r244243 r244540  
    7575    std::unique_ptr<DrawingAreaProxy> takeDrawingArea();
    7676
     77    void setNavigationID(uint64_t navigationID) { m_navigationID = navigationID; }
     78
    7779#if PLATFORM(COCOA)
    7880    Vector<uint8_t> takeAccessibilityToken() { return WTFMove(m_accessibilityToken); }
     
    105107    void didStartProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, URL&&, URL&& unreachableURL, const UserData&);
    106108    void didCommitLoadForFrame(uint64_t frameID, uint64_t navigationID, const String& mimeType, bool frameHasCustomContentProvider, uint32_t frameLoadType, const WebCore::CertificateInfo&, bool containsPluginDocument, Optional<WebCore::HasInsecureContent> forcedHasInsecureContent, const UserData&);
    107     void didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError&, const UserData&);
     109    void didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError&, WebCore::WillContinueLoading, const UserData&);
    108110    void startURLSchemeTask(URLSchemeTaskParameters&&);
    109111    void backForwardGoToItem(const WebCore::BackForwardItemIdentifier&, CompletionHandler<void(SandboxExtension::Handle&&)>&&);
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r244516 r244540  
    27792779    if (auto* provisionalPage = provisionalPageProxy()) {
    27802780        if (provisionalPage->navigationID() == navigation->navigationID()) {
    2781             ASSERT(navigation->currentRequestIsRedirect());
    27822781            sourceProcess = provisionalPage->process();
    27832782            sourceURL = provisionalPage->provisionalURL();
     
    40394038}
    40404039
    4041 void WebPageProxy::didFailProvisionalLoadForFrame(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const ResourceError& error, const UserData& userData)
     4040void WebPageProxy::didFailProvisionalLoadForFrame(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const ResourceError& error, WillContinueLoading willContinueLoading, const UserData& userData)
    40424041{
    40434042    if (m_provisionalPage && m_provisionalPage->navigationID() == navigationID) {
     
    40464045    }
    40474046
    4048     didFailProvisionalLoadForFrameShared(m_process.copyRef(), frameID, frameSecurityOrigin, navigationID, provisionalURL, error, userData);
    4049 }
    4050 
    4051 void WebPageProxy::didFailProvisionalLoadForFrameShared(Ref<WebProcessProxy>&& process, uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const ResourceError& error, const UserData& userData)
     4047    didFailProvisionalLoadForFrameShared(m_process.copyRef(), frameID, frameSecurityOrigin, navigationID, provisionalURL, error, willContinueLoading, userData);
     4048}
     4049
     4050void WebPageProxy::didFailProvisionalLoadForFrameShared(Ref<WebProcessProxy>&& process, uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const ResourceError& error, WillContinueLoading willContinueLoading, const UserData& userData)
    40524051{
    40534052    LOG(Loading, "(Loading) WebPageProxy %" PRIu64 " in web process pid %i didFailProvisionalLoadForFrame to provisionalURL %s", m_pageID, process->processIdentifier(), provisionalURL.utf8().data());
     
    40964095
    40974096    // If the provisional page's load fails then we destroy the provisional page.
    4098     if (m_provisionalPage && m_provisionalPage->mainFrame() == frame)
     4097    if (m_provisionalPage && m_provisionalPage->mainFrame() == frame && willContinueLoading == WillContinueLoading::No)
    40994098        m_provisionalPage = nullptr;
    41004099}
     
    45814580    }
    45824581
    4583     uint64_t newNavigationID = navigation->navigationID();
     4582    navigationID = navigation->navigationID();
     4583
     4584    // Make sure the provisional page always has the latest navigationID.
     4585    if (m_provisionalPage && &m_provisionalPage->process() == process.ptr())
     4586        m_provisionalPage->setNavigationID(navigationID);
     4587
    45844588    navigation->setCurrentRequest(ResourceRequest(request), process->coreProcessIdentifier());
    45854589    navigation->setLastNavigationAction(navigationActionData);
     
    45894593#if ENABLE(CONTENT_FILTERING)
    45904594    if (frame.didHandleContentFilterUnblockNavigation(request))
    4591         return receivedPolicyDecision(PolicyAction::Ignore, m_navigationState->navigation(newNavigationID), WTF::nullopt, WTFMove(sender));
    4592 #else
    4593     UNUSED_PARAM(newNavigationID);
     4595        return receivedPolicyDecision(PolicyAction::Ignore, m_navigationState->navigation(navigationID), WTF::nullopt, WTFMove(sender));
    45944596#endif
    45954597
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r244516 r244540  
    14851485    // Logic shared between the WebPageProxy and the ProvisionalPageProxy.
    14861486    void didStartProvisionalLoadForFrameShared(Ref<WebProcessProxy>&&, uint64_t frameID, uint64_t navigationID, URL&&, URL&& unreachableURL, const UserData&);
    1487     void didFailProvisionalLoadForFrameShared(Ref<WebProcessProxy>&&, uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError&, const UserData&);
     1487    void didFailProvisionalLoadForFrameShared(Ref<WebProcessProxy>&&, uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError&, WebCore::WillContinueLoading, const UserData&);
    14881488    void didReceiveServerRedirectForProvisionalLoadForFrameShared(Ref<WebProcessProxy>&&, uint64_t frameID, uint64_t navigationID, WebCore::ResourceRequest&&, const UserData&);
    14891489    void didPerformServerRedirectShared(Ref<WebProcessProxy>&&, const String& sourceURLString, const String& destinationURLString, uint64_t frameID);
     
    15871587    void didCancelClientRedirectForFrame(uint64_t frameID);
    15881588    void didChangeProvisionalURLForFrame(uint64_t frameID, uint64_t navigationID, URL&&);
    1589     void didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError&, const UserData&);
     1589    void didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError&, WebCore::WillContinueLoading, const UserData&);
    15901590    void didCommitLoadForFrame(uint64_t frameID, uint64_t navigationID, const String& mimeType, bool frameHasCustomContentProvider, uint32_t frameLoadType, const WebCore::CertificateInfo&, bool containsPluginDocument, Optional<WebCore::HasInsecureContent> forcedHasInsecureContent, const UserData&);
    15911591    void didFinishDocumentLoadForFrame(uint64_t frameID, uint64_t navigationID, const UserData&);
  • trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in

    r244446 r244540  
    128128    DidCancelClientRedirectForFrame(uint64_t frameID)
    129129    DidChangeProvisionalURLForFrame(uint64_t frameID, uint64_t navigationID, URL url)
    130     DidFailProvisionalLoadForFrame(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, uint64_t navigationID, String provisionalURL, WebCore::ResourceError error, WebKit::UserData userData)
     130    DidFailProvisionalLoadForFrame(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, uint64_t navigationID, String provisionalURL, WebCore::ResourceError error, enum:bool WebCore::WillContinueLoading willContinueLoading, WebKit::UserData userData)
    131131    DidCommitLoadForFrame(uint64_t frameID, uint64_t navigationID, String mimeType, bool hasCustomContentProvider, uint32_t loadType, WebCore::CertificateInfo certificateInfo, bool containsPluginDocument, Optional<WebCore::HasInsecureContent> forcedHasInsecureContent, WebKit::UserData userData)
    132132    DidFailLoadForFrame(uint64_t frameID, uint64_t navigationID, WebCore::ResourceError error, WebKit::UserData userData)
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

    r244361 r244540  
    536536}
    537537
    538 void WebFrameLoaderClient::dispatchDidFailProvisionalLoad(const ResourceError& error)
     538void WebFrameLoaderClient::dispatchDidFailProvisionalLoad(const ResourceError& error, WillContinueLoading willContinueLoading)
    539539{
    540540    WebPage* webPage = m_frame->page();
     
    565565    // Notify the UIProcess.
    566566    WebCore::Frame* coreFrame = m_frame ? m_frame->coreFrame() : nullptr;
    567     webPage->send(Messages::WebPageProxy::DidFailProvisionalLoadForFrame(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), navigationID, m_frame->coreFrame()->loader().provisionalLoadErrorBeingHandledURL(), error, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
     567    webPage->send(Messages::WebPageProxy::DidFailProvisionalLoadForFrame(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), navigationID, m_frame->coreFrame()->loader().provisionalLoadErrorBeingHandledURL(), error, willContinueLoading, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
    568568
    569569    // If we have a load listener, notify it.
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.h

    r244361 r244540  
    113113    void dispatchDidReceiveTitle(const WebCore::StringWithDirection&) final;
    114114    void dispatchDidCommitLoad(Optional<WebCore::HasInsecureContent>) final;
    115     void dispatchDidFailProvisionalLoad(const WebCore::ResourceError&) final;
     115    void dispatchDidFailProvisionalLoad(const WebCore::ResourceError&, WebCore::WillContinueLoading) final;
    116116    void dispatchDidFailLoad(const WebCore::ResourceError&) final;
    117117    void dispatchDidFinishDocumentLoad() final;
  • trunk/Source/WebKitLegacy/mac/ChangeLog

    r244471 r244540  
     12019-04-23  Chris Dumez  <cdumez@apple.com>
     2
     3        [Process-Swap-On-Navigation] WebKit hangs when going back to a form submission's page due to Process-Swap-On-Navigation on iOS 12.2 and higher
     4        https://bugs.webkit.org/show_bug.cgi?id=197097
     5        <rdar://problem/50048318>
     6
     7        Reviewed by Alex Christensen.
     8
     9        * WebCoreSupport/WebFrameLoaderClient.h:
     10        * WebCoreSupport/WebFrameLoaderClient.mm:
     11        (WebFrameLoaderClient::dispatchDidFailProvisionalLoad):
     12
    1132019-04-18  Daniel Bates  <dabates@apple.com>
    214
  • trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.h

    r244161 r244540  
    118118    void dispatchDidReceiveTitle(const WebCore::StringWithDirection&) final;
    119119    void dispatchDidCommitLoad(Optional<WebCore::HasInsecureContent>) final;
    120     void dispatchDidFailProvisionalLoad(const WebCore::ResourceError&) final;
     120    void dispatchDidFailProvisionalLoad(const WebCore::ResourceError&, WebCore::WillContinueLoading) final;
    121121    void dispatchDidFailLoad(const WebCore::ResourceError&) final;
    122122    void dispatchDidFinishDocumentLoad() final;
  • trunk/Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm

    r244161 r244540  
    725725}
    726726
    727 void WebFrameLoaderClient::dispatchDidFailProvisionalLoad(const ResourceError& error)
     727void WebFrameLoaderClient::dispatchDidFailProvisionalLoad(const ResourceError& error, WillContinueLoading)
    728728{
    729729    m_webFrame->_private->provisionalURL = nullptr;
  • trunk/Source/WebKitLegacy/win/ChangeLog

    r244488 r244540  
     12019-04-23  Chris Dumez  <cdumez@apple.com>
     2
     3        [Process-Swap-On-Navigation] WebKit hangs when going back to a form submission's page due to Process-Swap-On-Navigation on iOS 12.2 and higher
     4        https://bugs.webkit.org/show_bug.cgi?id=197097
     5        <rdar://problem/50048318>
     6
     7        Reviewed by Alex Christensen.
     8
     9        * WebCoreSupport/WebFrameLoaderClient.cpp:
     10        (WebFrameLoaderClient::dispatchDidFailProvisionalLoad):
     11        * WebCoreSupport/WebFrameLoaderClient.h:
     12
    1132019-04-20  Don Olmstead  <don.olmstead@sony.com>
    214
  • trunk/Source/WebKitLegacy/win/WebCoreSupport/WebFrameLoaderClient.cpp

    r244161 r244540  
    446446}
    447447
    448 void WebFrameLoaderClient::dispatchDidFailProvisionalLoad(const ResourceError& error)
     448void WebFrameLoaderClient::dispatchDidFailProvisionalLoad(const ResourceError& error, WillContinueLoading)
    449449{
    450450    WebView* webView = m_webFrame->webView();
  • trunk/Source/WebKitLegacy/win/WebCoreSupport/WebFrameLoaderClient.h

    r244161 r244540  
    9595    void dispatchDidReceiveTitle(const WebCore::StringWithDirection&) override;
    9696    void dispatchDidCommitLoad(Optional<WebCore::HasInsecureContent>) override;
    97     void dispatchDidFailProvisionalLoad(const WebCore::ResourceError&) override;
     97    void dispatchDidFailProvisionalLoad(const WebCore::ResourceError&, WebCore::WillContinueLoading) override;
    9898    void dispatchDidFailLoad(const WebCore::ResourceError&) override;
    9999    void dispatchDidFinishDocumentLoad() override;
  • trunk/Tools/ChangeLog

    r244538 r244540  
     12019-04-23  Chris Dumez  <cdumez@apple.com>
     2
     3        [Process-Swap-On-Navigation] WebKit hangs when going back to a form submission's page due to Process-Swap-On-Navigation on iOS 12.2 and higher
     4        https://bugs.webkit.org/show_bug.cgi?id=197097
     5        <rdar://problem/50048318>
     6
     7        Reviewed by Alex Christensen.
     8
     9        Add API test coverage.
     10
     11        * TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm:
     12        (-[PSONScheme webView:startURLSchemeTask:]):
     13
    1142019-04-23  Carlos Garcia Campos  <cgarcia@igalia.com>
    215
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm

    r244516 r244540  
    277277    }
    278278
     279    if ([(id<WKURLSchemeTaskPrivate>)task _requestOnlyIfCached]) {
     280        [task didFailWithError:[NSError errorWithDomain:@"TestWebKitAPI" code:1 userInfo:nil]];
     281        return;
     282    }
     283
    279284    RetainPtr<NSURLResponse> response = adoptNS([[NSURLResponse alloc] initWithURL:finalURL MIMEType:@"text/html" expectedContentLength:1 textEncodingName:nil]);
    280285    [task didReceiveResponse:response.get()];
     
    42794284}
    42804285
     4286static const char* crossSiteFormSubmissionBytes = R"PSONRESOURCE(
     4287<body>
     4288<form action="pson://www.apple.com/main.html" method="post">
     4289Name: <input type="text" name="name" placeholder="Name">
     4290<input id="submitButton" type="submit">
     4291</form>
     4292</body>
     4293)PSONRESOURCE";
     4294
     4295TEST(ProcessSwap, SwapOnFormSubmission)
     4296{
     4297    auto processPoolConfiguration = psonProcessPoolConfiguration();
     4298    auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
     4299
     4300    auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
     4301    [webViewConfiguration setProcessPool:processPool.get()];
     4302    auto handler = adoptNS([[PSONScheme alloc] init]);
     4303    [handler addMappingFromURLString:@"pson://www.webkit.org/main.html" toData:crossSiteFormSubmissionBytes];
     4304    [webViewConfiguration setURLSchemeHandler:handler.get() forURLScheme:@"PSON"];
     4305
     4306    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]);
     4307    auto navigationDelegate = adoptNS([[PSONNavigationDelegate alloc] init]);
     4308    [webView setNavigationDelegate:navigationDelegate.get()];
     4309
     4310    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"pson://www.webkit.org/main.html"]]];
     4311    TestWebKitAPI::Util::run(&done);
     4312    done = false;
     4313    auto webkitPID = [webView _webProcessIdentifier];
     4314    EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html", [[webView URL] absoluteString]);
     4315
     4316    [webView evaluateJavaScript:@"submitButton.click()" completionHandler:nil];
     4317    TestWebKitAPI::Util::run(&done);
     4318    done = false;
     4319    auto applePID = [webView _webProcessIdentifier];
     4320    EXPECT_NE(webkitPID, applePID);
     4321    EXPECT_WK_STREQ(@"pson://www.apple.com/main.html", [[webView URL] absoluteString]);
     4322
     4323    [webView reload];
     4324    TestWebKitAPI::Util::run(&done);
     4325    done = false;
     4326    EXPECT_EQ(applePID, [webView _webProcessIdentifier]);
     4327    EXPECT_WK_STREQ(@"pson://www.apple.com/main.html", [[webView URL] absoluteString]);
     4328
     4329    [webView goBack];
     4330    TestWebKitAPI::Util::run(&done);
     4331    done = false;
     4332    EXPECT_EQ(webkitPID, [webView _webProcessIdentifier]);
     4333    EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html", [[webView URL] absoluteString]);
     4334
     4335    [webView goForward];
     4336    TestWebKitAPI::Util::run(&done);
     4337    done = false;
     4338    EXPECT_EQ(applePID, [webView _webProcessIdentifier]);
     4339    EXPECT_WK_STREQ(@"pson://www.apple.com/main.html", [[webView URL] absoluteString]);
     4340
     4341    [webView goBack];
     4342    TestWebKitAPI::Util::run(&done);
     4343    done = false;
     4344#if !PLATFORM(IOS_FAMILY)
     4345    // This is not guaranteed on iOS because the WebProcess cache is disabled on devices with too little RAM.
     4346    EXPECT_EQ(webkitPID, [webView _webProcessIdentifier]);
     4347#else
     4348    EXPECT_NE(applePID, [webView _webProcessIdentifier]);
     4349#endif
     4350    EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html", [[webView URL] absoluteString]);
     4351}
    42814352
    42824353TEST(ProcessSwap, ClosePageAfterCrossSiteProvisionalLoad)
Note: See TracChangeset for help on using the changeset viewer.