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

Changeset 240280 in webkit


Ignore:
Timestamp:
Jan 22, 2019, 12:58:17 PM (8 years ago)
Author:
Alan Coon
Message:

Revert r240262. rdar://problem/47099573

Location:
branches/safari-607-branch
Files:
2 added
24 edited

Legend:

Unmodified
Added
Removed
  • branches/safari-607-branch/LayoutTests/ChangeLog

    r240279 r240280  
     12019-01-22  Alan Coon  <alancoon@apple.com>
     2
     3        Revert r240262. rdar://problem/47099573
     4
    152019-01-22  Alan Coon  <alancoon@apple.com>
    26
  • branches/safari-607-branch/LayoutTests/platform/wk2/TestExpectations

    r240279 r240280  
    734734http/tests/resourceLoadStatistics/cap-cache-max-age-for-prevalent-resource.html [ Skip ]
    735735
    736 # Process swapping is only implemented on WebKit2.
    737 http/tests/navigation/process-swap-window-open.html [ Pass ]
     736# This feature is currently disabled by default and unfinished <rdar://problem/38925077>.
     737http/tests/navigation/process-swap-window-open.html [ Skip ]
    738738
    739739# Cross-Origin-Resource-Policy response header is only implemented in WebKit2.
  • branches/safari-607-branch/Source/WebCore/ChangeLog

    r240279 r240280  
     12019-01-22  Alan Coon  <alancoon@apple.com>
     2
     3        Revert r240262. rdar://problem/47099573
     4
    152019-01-22  Alan Coon  <alancoon@apple.com>
    26
  • branches/safari-607-branch/Source/WebCore/loader/FrameLoader.cpp

    r240279 r240280  
    20332033        Optional<HasInsecureContent> hasInsecureContent = cachedPage->cachedMainFrame()->hasInsecureContent();
    20342034
     2035        dispatchDidCommitLoad(hasInsecureContent);
     2036
    20352037        // FIXME: This API should be turned around so that we ground CachedPage into the Page.
    20362038        cachedPage->restore(*m_frame.page());
    2037 
    2038         dispatchDidCommitLoad(hasInsecureContent);
    20392039
    20402040#if PLATFORM(IOS_FAMILY)
  • branches/safari-607-branch/Source/WebKit/ChangeLog

    r240279 r240280  
     12019-01-22  Alan Coon  <alancoon@apple.com>
     2
     3        Revert r240262. rdar://problem/47099573
     4
    152019-01-22  Alan Coon  <alancoon@apple.com>
    26
  • branches/safari-607-branch/Source/WebKit/Shared/WebPageCreationParameters.cpp

    r240279 r240280  
    7474    encoder << mimeTypesWithCustomContentProviders;
    7575    encoder << controlledByAutomation;
    76     encoder << isSwapFromSuspended;
     76    encoder << isProcessSwap;
    7777
    7878#if PLATFORM(MAC)
    … …  
    228228    if (!decoder.decode(parameters.controlledByAutomation))
    229229        return WTF::nullopt;
    230     if (!decoder.decode(parameters.isSwapFromSuspended))
     230    if (!decoder.decode(parameters.isProcessSwap))
    231231        return WTF::nullopt;
    232232
  • branches/safari-607-branch/Source/WebKit/Shared/WebPageCreationParameters.h

    r240279 r240280  
    130130
    131131    bool controlledByAutomation;
    132     bool isSwapFromSuspended { false };
     132    bool isProcessSwap { false };
    133133
    134134#if PLATFORM(MAC)
  • branches/safari-607-branch/Source/WebKit/Shared/WebPolicyAction.h

    r240279 r240280  
    3030namespace WebKit {
    3131
     32// FIXME: Remove this type and use WebCore::PolicyAction instead.
    3233enum class WebPolicyAction : uint8_t {
    3334    Use,
    3435    Download,
    35     Ignore,
    36     Suspend
     36    Ignore
    3737};
    3838
    … …  
    4646        WebKit::WebPolicyAction::Use,
    4747        WebKit::WebPolicyAction::Download,
    48         WebKit::WebPolicyAction::Ignore,
    49         WebKit::WebPolicyAction::Suspend
     48        WebKit::WebPolicyAction::Ignore
    5049    >;
    5150};
  • branches/safari-607-branch/Source/WebKit/Sources.txt

    r240279 r240280  
    229229UIProcess/ProcessAssertion.cpp
    230230UIProcess/ProcessThrottler.cpp
     231UIProcess/ProvisionalPageProxy.cpp
    231232UIProcess/RemoteWebInspectorProxy.cpp
    232233UIProcess/ResourceLoadStatisticsMemoryStore.cpp
  • branches/safari-607-branch/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm

    r240279 r240280  
    4545#import "ObjCObjectGraph.h"
    4646#import "PageClient.h"
     47#import "ProvisionalPageProxy.h"
    4748#import "RemoteLayerTreeScrollingPerformanceData.h"
    4849#import "RemoteLayerTreeTransaction.h"
    … …  
    46834684    Ref<WebKit::WebProcessProxy> protectedProcessProxy(_page->process());
    46844685    protectedProcessProxy->requestTermination(WebKit::ProcessTerminationReason::RequestedByClient);
     4686
     4687    if (auto* provisionalPageProxy = _page->provisionalPageProxy()) {
     4688        Ref<WebKit::WebProcessProxy> protectedProcessProxy(provisionalPageProxy->process());
     4689        protectedProcessProxy->requestTermination(WebKit::ProcessTerminationReason::RequestedByClient);
     4690    }
    46854691}
    46864692
  • branches/safari-607-branch/Source/WebKit/UIProcess/PageClient.h

    r240279 r240280  
    4949OBJC_CLASS CALayer;
    5050OBJC_CLASS NSFileWrapper;
     51OBJC_CLASS NSMenu;
    5152OBJC_CLASS NSSet;
    5253OBJC_CLASS WKDrawingView;
  • branches/safari-607-branch/Source/WebKit/UIProcess/SuspendedPageProxy.cpp

    r240279 r240280  
    101101    // on the WebProcess side.
    102102    m_process->send(Messages::WebPage::Close(), m_page.pageID());
    103     m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_page.pageID());
     103
     104    if (m_suspensionState == SuspensionState::Suspending)
     105        m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_page.pageID());
    104106
    105107    // We call maybeShutDown() asynchronously since the SuspendedPage is currently being removed from the WebProcessPool
    … …  
    135137
    136138    m_suspensionState = SuspensionState::Resumed;
    137     m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_page.pageID());
    138139    m_process->send(Messages::WebPage::SetIsSuspended(false), m_page.pageID());
    139140}
    … …  
    151152    m_suspensionToken = nullptr;
    152153#endif
     154
     155    m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_page.pageID());
    153156
    154157    if (m_readyToUnsuspendHandler)
  • branches/safari-607-branch/Source/WebKit/UIProcess/WebFrameProxy.cpp

    r240279 r240280  
    2828
    2929#include "APINavigation.h"
     30#include "ProvisionalPageProxy.h"
    3031#include "WebCertificateInfo.h"
    3132#include "WebFramePolicyListenerProxy.h"
    … …  
    7576        return false;
    7677
    77     return this == m_page->mainFrame();
     78    return this == m_page->mainFrame() || (m_page->provisionalPageProxy() && this == m_page->provisionalPageProxy()->mainFrame());
    7879}
    7980
  • branches/safari-607-branch/Source/WebKit/UIProcess/WebPageProxy.cpp

    r240279 r240280  
    7878#include "PluginProcessManager.h"
    7979#include "PrintInfo.h"
     80#include "ProvisionalPageProxy.h"
    8081#include "SafeBrowsingWarning.h"
    8182#include "ShareSheetCallbackID.h"
    … …  
    550551}
    551552
     553DrawingAreaProxy* WebPageProxy::drawingArea() const
     554{
     555    if (m_provisionalPage && m_process.ptr() == &m_provisionalPage->process() && m_provisionalPage->drawingArea())
     556        return m_provisionalPage->drawingArea();
     557    return m_drawingArea.get();
     558}
     559
    552560void WebPageProxy::changeWebsiteDataStore(WebsiteDataStore& websiteDataStore)
    553561{
    … …  
    773781}
    774782
    775 void WebPageProxy::swapToWebProcess(Ref<WebProcessProxy>&& process, std::unique_ptr<SuspendedPageProxy>&& destinationSuspendedPage, IsSwapFromSuspended isSwapFromSuspended)
     783void WebPageProxy::swapToWebProcess(Ref<WebProcessProxy>&& process, std::unique_ptr<DrawingAreaProxy>&& drawingArea, RefPtr<WebFrameProxy>&& mainFrame)
    776784{
    777785    ASSERT(!m_isClosed);
    … …  
    779787
    780788    m_process = WTFMove(process);
     789    ASSERT(!m_drawingArea);
     790    setDrawingArea(WTFMove(drawingArea));
     791    ASSERT(!m_mainFrame);
     792    m_mainFrame = WTFMove(mainFrame);
    781793    m_isValid = true;
    782 
    783     // If we are reattaching to a SuspendedPage, then the WebProcess' WebPage already exists and
    784     // WebPageProxy::didCreateMainFrame() will not be called to initialize m_mainFrame. In such
    785     // case, we need to initialize m_mainFrame to reflect the fact the the WebProcess' WebPage
    786     // already exists and already has a main frame.
    787     if (destinationSuspendedPage) {
    788         if (!destinationSuspendedPage->failedToSuspend()) {
    789             ASSERT(!m_mainFrame);
    790             ASSERT(&destinationSuspendedPage->process() == m_process.ptr());
    791             destinationSuspendedPage->unsuspend();
    792             m_mainFrame = WebFrameProxy::create(*this, destinationSuspendedPage->mainFrameID());
    793             m_process->frameCreated(destinationSuspendedPage->mainFrameID(), *m_mainFrame);
    794         } else {
    795             // We failed to suspend the page so destroy it now and merely reuse its WebContent process.
    796             destinationSuspendedPage = nullptr;
    797         }
    798     }
    799794
    800795    m_process->addExistingWebPage(*this, m_pageID, WebProcessProxy::BeginsUsingDataStore::No);
    801796    m_process->addMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_pageID, *this);
    802797
    803     finishAttachingToWebProcess(isSwapFromSuspended);
    804 }
    805 
    806 void WebPageProxy::finishAttachingToWebProcess(IsSwapFromSuspended isSwapFromSuspended)
     798    // No need to initialize the WebPage since it was created when we created the ProvisionalPageProxy.
     799    finishAttachingToWebProcess(ShouldInitializeWebPage::No);
     800}
     801
     802void WebPageProxy::finishAttachingToWebProcess(ShouldInitializeWebPage shouldInitializePage)
    807803{
    808804    ASSERT(m_process->state() != ChildProcessProxy::State::Terminated);
    … …  
    840836#endif
    841837
    842     initializeWebPage(isSwapFromSuspended);
     838    if (shouldInitializePage == ShouldInitializeWebPage::Yes)
     839        initializeWebPage();
    843840
    844841    m_inspector->updateForNewPageProcess(this);
    … …  
    905902}
    906903
    907 void WebPageProxy::initializeWebPage(IsSwapFromSuspended isSwapFromSuspended)
    908 {
    909     ASSERT(isValid());
    910 
    911     m_drawingArea = pageClient().createDrawingAreaProxy();
    912     ASSERT(m_drawingArea);
     904void WebPageProxy::setDrawingArea(std::unique_ptr<DrawingAreaProxy>&& drawingArea)
     905{
     906    m_drawingArea = WTFMove(drawingArea);
     907    if (!m_drawingArea)
     908        return;
    913909
    914910#if ENABLE(ASYNC_SCROLLING) && PLATFORM(COCOA)
    … …  
    921917    }
    922918#endif
    923 
    924     auto parameters = creationParameters();
    925     parameters.isSwapFromSuspended = isSwapFromSuspended == IsSwapFromSuspended::Yes;
    926 
    927 #if ENABLE(SERVICE_WORKER)
    928     parameters.hasRegisteredServiceWorkers = process().processPool().mayHaveRegisteredServiceWorkers(m_websiteDataStore);
    929 #endif
    930 
    931     process().send(Messages::WebProcess::CreateWebPage(m_pageID, parameters), 0);
     919}
     920
     921void WebPageProxy::initializeWebPage()
     922{
     923    ASSERT(isValid());
     924
     925    setDrawingArea(pageClient().createDrawingAreaProxy());
     926    ASSERT(m_drawingArea);
     927
     928    process().send(Messages::WebProcess::CreateWebPage(m_pageID, creationParameters()), 0);
    932929
    933930    m_needsToFinishInitializingWebPageAfterProcessLaunch = true;
    … …  
    10811078
    10821079    auto url = request.url();
    1083     m_pageLoadState.setPendingAPIRequestURL(transaction, url);
     1080    if (shouldTreatAsContinuingLoad != ShouldTreatAsContinuingLoad::Yes)
     1081        m_pageLoadState.setPendingAPIRequestURL(transaction, url);
    10841082
    10851083    if (!isValid())
    … …  
    12991297
    13001298    m_process->send(Messages::WebPage::StopLoading(), m_pageID);
     1299    if (m_provisionalPage) {
     1300        m_provisionalPage->cancel();
     1301        m_provisionalPage = nullptr;
     1302    }
    13011303    m_process->responsivenessTimer().start();
    13021304}
    … …  
    26972699
    26982700        if (processForNavigation.ptr() != &process()) {
    2699             policyAction = isPageOpenedByDOMShowingInitialEmptyDocument() ? WebPolicyAction::Ignore : WebPolicyAction::Suspend;
     2701            policyAction = WebPolicyAction::Ignore;
    27002702            RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "decidePolicyForNavigationAction, swapping process %i with process %i for navigation, reason: %{public}s", processIdentifier(), processForNavigation->processIdentifier(), reason.utf8().data());
    27012703            LOG(ProcessSwapping, "(ProcessSwapping) Switching from process %i to new process (%i) for navigation %" PRIu64 " '%s'", processIdentifier(), processForNavigation->processIdentifier(), navigation->navigationID(), navigation->loggingString());
    … …  
    27062708        receivedPolicyDecision(policyAction, navigation.ptr(), shouldProcessSwap ? WTF::nullopt : WTFMove(data), WTFMove(sender));
    27072709
    2708         if (shouldProcessSwap)
    2709             continueNavigationInNewProcess(navigation, destinationSuspendedPage ? process().processPool().takeSuspendedPage(*destinationSuspendedPage) : nullptr, WTFMove(processForNavigation), processSwapRequestedByClient, WTFMove(data));
     2710        if (!shouldProcessSwap)
     2711            return;
     2712
     2713        auto suspendedPage = destinationSuspendedPage ? process().processPool().takeSuspendedPage(*destinationSuspendedPage) : nullptr;
     2714        if (suspendedPage && suspendedPage->failedToSuspend())
     2715            suspendedPage = nullptr;
     2716
     2717        continueNavigationInNewProcess(navigation, WTFMove(suspendedPage), WTFMove(processForNavigation), processSwapRequestedByClient, WTFMove(data));
    27102718    });
    27112719}
    … …  
    27432751}
    27442752
    2745 void WebPageProxy::continueNavigationInNewProcess(API::Navigation& navigation, std::unique_ptr<SuspendedPageProxy>&& suspendedPageProxy, Ref<WebProcessProxy>&& process, ProcessSwapRequestedByClient processSwapRequestedByClient, Optional<WebsitePoliciesData>&& websitePolicies)
     2753void WebPageProxy::commitProvisionalPage(uint64_t frameID, uint64_t navigationID, const String& mimeType, bool frameHasCustomContentProvider, uint32_t frameLoadType, const WebCore::CertificateInfo& certificateInfo, bool containsPluginDocument, Optional<WebCore::HasInsecureContent> forcedHasInsecureContent, const UserData& userData)
     2754{
     2755    ASSERT(m_provisionalPage);
     2756    RELEASE_LOG_IF_ALLOWED(Loading, "commitProvisionalPage: previousPID = %i, newPID = %i, pageID = %" PRIu64, m_process->processIdentifier(), m_provisionalPage->process().processIdentifier(), m_pageID);
     2757
     2758    Optional<uint64_t> mainFrameIDInPreviousProcess = m_mainFrame ? makeOptional(m_mainFrame->frameID()) : WTF::nullopt;
     2759
     2760    ASSERT(m_process.ptr() != &m_provisionalPage->process());
     2761
     2762    processDidTerminate(ProcessTerminationReason::NavigationSwap);
     2763
     2764    m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_pageID);
     2765    auto* navigation = navigationState().navigation(m_provisionalPage->navigationID());
     2766    bool didSuspendPreviousPage = navigation ? suspendCurrentPageIfPossible(*navigation, mainFrameIDInPreviousProcess, m_provisionalPage->processSwapRequestedByClient()) : false;
     2767    m_process->removeWebPage(*this, m_pageID, WebProcessProxy::EndsUsingDataStore::No);
     2768
     2769    // There is no way we'll be able to return to the page in the previous page so close it.
     2770    if (!didSuspendPreviousPage)
     2771        m_process->send(Messages::WebPage::Close(), pageID());
     2772
     2773    swapToWebProcess(m_provisionalPage->process(), m_provisionalPage->takeDrawingArea(), m_provisionalPage->mainFrame());
     2774
     2775    didCommitLoadForFrame(frameID, navigationID, mimeType, frameHasCustomContentProvider, frameLoadType, certificateInfo, containsPluginDocument, forcedHasInsecureContent, userData);
     2776
     2777    m_provisionalPage = nullptr;
     2778}
     2779
     2780void WebPageProxy::continueNavigationInNewProcess(API::Navigation& navigation, std::unique_ptr<SuspendedPageProxy>&& suspendedPageProxy, Ref<WebProcessProxy>&& newProcess, ProcessSwapRequestedByClient processSwapRequestedByClient, Optional<WebsitePoliciesData>&& websitePolicies)
    27462781{
    27472782    RELEASE_LOG_IF_ALLOWED(Loading, "continueNavigationInNewProcess: webPID = %i, pageID = %" PRIu64, m_process->processIdentifier(), m_pageID);
    27482783    LOG(Loading, "Continuing navigation %" PRIu64 " '%s' in a new web process", navigation.navigationID(), navigation.loggingString());
    27492784
    2750     Ref<WebProcessProxy> previousProcess = m_process.copyRef();
    2751     Optional<uint64_t> mainFrameIDInPreviousProcess = m_mainFrame ? makeOptional(m_mainFrame->frameID()) : WTF::nullopt;
    2752     auto mainFrameURL = m_mainFrame ? m_mainFrame->url() : URL();
    2753 
    2754     ASSERT(m_process.ptr() != process.ptr());
    2755 
    2756     processDidTerminate(ProcessTerminationReason::NavigationSwap);
    2757 
    2758     m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_pageID);
    2759     bool didSuspendPreviousPage = suspendCurrentPageIfPossible(navigation, mainFrameIDInPreviousProcess, processSwapRequestedByClient);
    2760     m_process->removeWebPage(*this, m_pageID, WebProcessProxy::EndsUsingDataStore::No);
    2761 
    2762     swapToWebProcess(WTFMove(process), WTFMove(suspendedPageProxy), didSuspendPreviousPage ? IsSwapFromSuspended::Yes : IsSwapFromSuspended::No);
     2785    if (m_provisionalPage) {
     2786        if (m_provisionalPage->navigationID() != navigation.navigationID())
     2787            m_provisionalPage->cancel();
     2788        m_provisionalPage = nullptr;
     2789    }
     2790
     2791    m_provisionalPage = std::make_unique<ProvisionalPageProxy>(*this, newProcess.copyRef(), WTFMove(suspendedPageProxy), navigation.navigationID(), navigation.currentRequestIsRedirect(), navigation.currentRequest(), processSwapRequestedByClient);
    27632792
    27642793    if (auto* item = navigation.targetItem()) {
    … …  
    27682797        m_pageLoadState.setPendingAPIRequestURL(transaction, item->url());
    27692798
    2770         auto itemStates = m_backForwardList->filteredItemStates([this, targetItem = item](WebBackForwardListItem& item) {
    2771             if (auto* page = item.suspendedPage()) {
    2772                 if (&page->process() == m_process.ptr())
    2773                     return false;
    2774             }
    2775             return &item != targetItem;
    2776         });
    2777         m_process->send(Messages::WebPage::UpdateBackForwardListForReattach(WTFMove(itemStates)), m_pageID);
    2778         m_process->send(Messages::WebPage::GoToBackForwardItem(navigation.navigationID(), item->itemID(), *navigation.backForwardFrameLoadType(), ShouldTreatAsContinuingLoad::Yes, WTFMove(websitePolicies)), m_pageID);
    2779         m_process->responsivenessTimer().start();
    2780 
     2799        m_provisionalPage->goToBackForwardItem(navigation, *item, WTFMove(websitePolicies));
    27812800        return;
    27822801    }
    … …  
    27852804        // If WebCore is supposed to lock the history for this load, then the new process needs to know about the current history item so it can update
    27862805        // it instead of creating a new one.
    2787         m_process->send(Messages::WebPage::SetCurrentHistoryItemForReattach(m_backForwardList->currentItem()->itemState()), m_pageID);
     2806        newProcess->send(Messages::WebPage::SetCurrentHistoryItemForReattach(m_backForwardList->currentItem()->itemState()), m_pageID);
    27882807    }
    27892808
    … …  
    27912810    ASSERT(!navigation.currentRequest().isEmpty());
    27922811    if (auto& substituteData = navigation.substituteData())
    2793         loadDataWithNavigation(navigation, { substituteData->content.data(), substituteData->content.size() }, substituteData->MIMEType, substituteData->encoding, substituteData->baseURL, substituteData->userData.get(), ShouldTreatAsContinuingLoad::Yes, WTFMove(websitePolicies));
     2812        m_provisionalPage->loadDataWithNavigation(navigation, { substituteData->content.data(), substituteData->content.size() }, substituteData->MIMEType, substituteData->encoding, substituteData->baseURL, substituteData->userData.get(), WTFMove(websitePolicies));
    27942813    else
    2795         loadRequestWithNavigation(navigation, ResourceRequest { navigation.currentRequest() }, WebCore::ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes, nullptr, ShouldTreatAsContinuingLoad::Yes, WTFMove(websitePolicies));
    2796 
    2797     ASSERT(!m_mainFrame);
    2798     m_mainFrameCreationHandler = [this, weakThis = makeWeakPtr(*this), navigationID = navigation.navigationID(), request =  navigation.currentRequest(), mainFrameURL, isServerRedirect = navigation.currentRequestIsRedirect()]() mutable {
    2799         if (!weakThis)
    2800             return;
    2801 
    2802         ASSERT(m_mainFrame);
    2803         // This navigation was destroyed so no need to notify of redirect.
    2804         if (!navigationState().navigation(navigationID))
    2805             return;
    2806 
    2807         // Restore the main frame's committed URL as some clients may rely on it until the next load is committed.
    2808         m_mainFrame->frameLoadState().setURL(mainFrameURL);
    2809 
    2810         // Normally, notification of a server redirect comes from the WebContent process.
    2811         // If we are process swapping in response to a server redirect then that notification will not come from the new WebContent process.
    2812         // In this case we have the UIProcess synthesize the redirect notification at the appropriate time.
    2813         if (isServerRedirect) {
    2814             m_mainFrame->frameLoadState().didStartProvisionalLoad(request.url());
    2815             didReceiveServerRedirectForProvisionalLoadForFrame(m_mainFrame->frameID(), navigationID, WTFMove(request), { });
    2816         }
    2817     };
    2818 
    2819     if (!m_process->processPool().configuration().processSwapsOnWindowOpenWithOpener() || !isPageOpenedByDOMShowingInitialEmptyDocument() || !mainFrameIDInPreviousProcess) {
    2820         // There is no way we'll be able to return to the page in the previous page so close it.
    2821         if (!didSuspendPreviousPage)
    2822             previousProcess->send(Messages::WebPage::Close(), m_pageID);
    2823         return;
    2824     }
    2825 
    2826     m_mainFrameWindowCreationHandler = [this, previousProcess = WTFMove(previousProcess), mainFrameIDInPreviousProcess = *mainFrameIDInPreviousProcess](const GlobalWindowIdentifier& windowIdentifier) {
    2827         ASSERT(m_mainFrame);
    2828         GlobalFrameIdentifier navigatedFrameIdentifierInNewProcess { pageID(), m_mainFrame->frameID() };
    2829         previousProcess->send(Messages::WebPage::FrameBecameRemote(mainFrameIDInPreviousProcess, navigatedFrameIdentifierInNewProcess, windowIdentifier), pageID());
    2830     };
     2814        m_provisionalPage->loadRequestWithNavigation(navigation, ResourceRequest { navigation.currentRequest() }, WebCore::ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes, nullptr, WTFMove(websitePolicies));
    28312815}
    28322816
    … …  
    36933677    // Add the frame to the process wide map.
    36943678    m_process->frameCreated(frameID, *m_mainFrame);
    3695 
    3696     if (m_mainFrameCreationHandler) {
    3697         m_mainFrameCreationHandler();
    3698         m_mainFrameCreationHandler = nullptr;
    3699     }
    37003679}
    37013680
    … …  
    37223701void WebPageProxy::didCreateWindow(uint64_t frameID, GlobalWindowIdentifier&& windowIdentifier)
    37233702{
    3724     if (m_mainFrame && m_mainFrame->frameID() == frameID) {
    3725         if (auto mainFrameWindowCreationHandler = WTFMove(m_mainFrameWindowCreationHandler))
    3726             mainFrameWindowCreationHandler(windowIdentifier);
    3727     }
    37283703}
    37293704
    … …  
    37773752{
    37783753    PageClientProtector protector(pageClient());
     3754
     3755    // On process-swap, the previous process tries to destroy the navigation but the provisional process is actually taking over the navigation.
     3756    if (m_provisionalPage && m_provisionalPage->navigationID() == navigationID)
     3757        return;
    37793758
    37803759    // FIXME: Message check the navigationID.
    … …  
    37943773    if (frame->isMainFrame() && navigationID)
    37953774        navigation = navigationState().navigation(navigationID);
    3796 
    3797     // If this seemingly new load is actually continuing a server redirect for a previous navigation in a new process,
    3798     // then we ignore this notification.
    3799     if (navigation && navigation->currentRequestIsRedirect()) {
    3800         auto navigationProcessIdentifier = navigation->currentRequestProcessIdentifier();
    3801         if (navigationProcessIdentifier && *navigationProcessIdentifier != m_process->coreProcessIdentifier())
    3802             return;
    3803     }
    38043775
    38053776    LOG(Loading, "WebPageProxy %" PRIu64 " in process pid %i didStartProvisionalLoadForFrame to frameID %" PRIu64 ", navigationID %" PRIu64 ", url %s", m_pageID, m_process->processIdentifier(), frameID, navigationID, url.string().utf8().data());
    … …  
    39093880
    39103881    PageClientProtector protector(pageClient());
     3882
     3883    if (m_provisionalPage && m_provisionalPage->navigationID() == navigationID && &m_provisionalPage->process() != m_process.ptr()) {
     3884        // The load did not fail, it is merely happening in a new provisional process.
     3885        return;
     3886    }
    39113887
    39123888    WebFrameProxy* frame = m_process->webFrame(frameID);
    … …  
    39483924
    39493925    m_failingProvisionalLoadURL = { };
     3926
     3927    // If the provisional page's load fails then we destroy the provisional page.
     3928    if (m_provisionalPage && m_provisionalPage->mainFrame() == frame)
     3929        m_provisionalPage = nullptr;
    39503930}
    39513931
    … …  
    43394319    MESSAGE_CHECK(frame);
    43404320
    4341     decidePolicyForNavigationAction(*frame, WTFMove(frameSecurityOrigin), navigationID, WTFMove(navigationActionData), WTFMove(frameInfoData), originatingPageID, originalRequest, WTFMove(request), WTFMove(requestBody), WTFMove(redirectResponse), userData, PolicyDecisionSender::create([this, protectedThis = makeRef(*this), frameID, listenerID] (auto... args) {
    4342         m_process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID);
     4321    decidePolicyForNavigationAction(*frame, WTFMove(frameSecurityOrigin), navigationID, WTFMove(navigationActionData), WTFMove(frameInfoData), originatingPageID, originalRequest, WTFMove(request), WTFMove(requestBody), WTFMove(redirectResponse), userData, PolicyDecisionSender::create([this, protectedThis = makeRef(*this), frameID, listenerID, process = m_process.copyRef()] (auto... args) {
     4322        process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID);
    43434323    }));
    43444324}
    … …  
    45394519
    45404520    RefPtr<API::Navigation> navigation = navigationID ? m_navigationState->navigation(navigationID) : nullptr;
    4541     auto listener = makeRef(frame->setUpPolicyListenerProxy([this, protectedThis = makeRef(*this), frameID, listenerID, navigation = WTFMove(navigation)] (WebPolicyAction policyAction, API::WebsitePolicies*, ProcessSwapRequestedByClient processSwapRequestedByClient, RefPtr<SafeBrowsingWarning>&& safeBrowsingWarning) mutable {
     4521    auto listener = makeRef(frame->setUpPolicyListenerProxy([this, protectedThis = makeRef(*this), frameID, listenerID, navigation = WTFMove(navigation), process = m_process.copyRef()] (WebPolicyAction policyAction, API::WebsitePolicies*, ProcessSwapRequestedByClient processSwapRequestedByClient, RefPtr<SafeBrowsingWarning>&& safeBrowsingWarning) mutable {
    45424522        // FIXME: Assert the API::WebsitePolicies* is nullptr here once clients of WKFramePolicyListenerUseWithPolicies go away.
    45434523        RELEASE_ASSERT(processSwapRequestedByClient == ProcessSwapRequestedByClient::No);
    45444524        ASSERT_UNUSED(safeBrowsingWarning, !safeBrowsingWarning);
    4545         receivedPolicyDecision(policyAction, navigation.get(), WTF::nullopt, PolicyDecisionSender::create([this, protectedThis = WTFMove(protectedThis), frameID, listenerID] (auto... args) {
    4546             m_process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID);
     4525        receivedPolicyDecision(policyAction, navigation.get(), WTF::nullopt, PolicyDecisionSender::create([this, protectedThis = WTFMove(protectedThis), frameID, listenerID, process = WTFMove(process)] (auto... args) {
     4526            process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID);
    45474527        }));
    45484528    }, ShouldExpectSafeBrowsingResult::No));
    … …  
    63646344}
    63656345
     6346void WebPageProxy::provisionalProcessDidTerminate()
     6347{
     6348    ASSERT(m_provisionalPage);
     6349    m_provisionalPage->cancel();
     6350    m_provisionalPage = nullptr;
     6351}
     6352
    63666353static bool shouldReloadAfterProcessTermination(ProcessTerminationReason reason)
    63676354{
    … …  
    64516438{
    64526439    m_mainFrame = nullptr;
    6453     m_mainFrameCreationHandler = nullptr;
    6454     m_mainFrameWindowCreationHandler = nullptr;
    64556440
    64566441#if PLATFORM(COCOA)
    … …  
    67436728#endif
    67446729
     6730#if ENABLE(SERVICE_WORKER)
     6731    parameters.hasRegisteredServiceWorkers = process().processPool().mayHaveRegisteredServiceWorkers(m_websiteDataStore);
     6732#endif
     6733
    67456734    parameters.needsFontAttributes = m_needsFontAttributes;
    67466735
    … …  
    85048493}
    85058494
     8495WebPageProxy::PageProcessOverride::PageProcessOverride(WebPageProxy& page, WebProcessProxy& newProcess)
     8496    : m_page(&page)
     8497    , m_previousProcess(page.process())
     8498{
     8499    page.m_process = newProcess;
     8500}
     8501
     8502WebPageProxy::PageProcessOverride::PageProcessOverride(PageProcessOverride&&) = default;
     8503
     8504WebPageProxy::PageProcessOverride::~PageProcessOverride()
     8505{
     8506    if (m_page)
     8507        m_page->m_process = WTFMove(m_previousProcess);
     8508}
     8509
    85068510#if ENABLE(DATA_DETECTION)
    85078511
  • branches/safari-607-branch/Source/WebKit/UIProcess/WebPageProxy.h

    r240279 r240280  
    226226class NativeWebWheelEvent;
    227227class PageClient;
     228class ProvisionalPageProxy;
    228229class RemoteLayerTreeHost;
    229230class RemoteLayerTreeScrollingPerformanceData;
    … …  
    357358    WebFrameProxy* frameSetLargestFrame() const { return m_frameSetLargestFrame.get(); }
    358359
    359     DrawingAreaProxy* drawingArea() const { return m_drawingArea.get(); }
     360    DrawingAreaProxy* drawingArea() const;
    360361
    361362    WebNavigationState& navigationState() { return *m_navigationState.get(); }
    … …  
    380381    bool addsVisitedLinks() const { return m_addsVisitedLinks; }
    381382    void setAddsVisitedLinks(bool addsVisitedLinks) { m_addsVisitedLinks = addsVisitedLinks; }
     383    VisitedLinkStore& visitedLinkStore() { return m_visitedLinkStore; }
    382384
    383385    void exitFullscreenImmediately();
    … …  
    459461    void setIconLoadingClient(std::unique_ptr<API::IconLoadingClient>&&);
    460462
    461     enum class IsSwapFromSuspended { No, Yes };
    462     void initializeWebPage(IsSwapFromSuspended = IsSwapFromSuspended::No);
     463    void initializeWebPage();
     464    void setDrawingArea(std::unique_ptr<DrawingAreaProxy>&&);
    463465
    464466    WeakPtr<SecKeyProxyStore> secKeyProxyStore(const WebCore::AuthenticationChallenge&);
    … …  
    9981000    void processDidBecomeResponsive();
    9991001    void processDidTerminate(ProcessTerminationReason);
     1002    void provisionalProcessDidTerminate();
    10001003    void dispatchProcessDidTerminate(ProcessTerminationReason);
    10011004    void willChangeProcessIsResponsive();
    … …  
    10251028    WebProcessProxy& process() { return m_process; }
    10261029    ProcessID processIdentifier() const;
     1030
     1031    class PageProcessOverride {
     1032    public:
     1033        PageProcessOverride(WebPageProxy&, WebProcessProxy& newProcess);
     1034        PageProcessOverride(PageProcessOverride&&);
     1035        ~PageProcessOverride();
     1036
     1037    private:
     1038        RefPtr<WebPageProxy> m_page;
     1039        Ref<WebProcessProxy> m_previousProcess;
     1040    };
     1041
     1042    PageProcessOverride temporarilyOverrideProcess(WebProcessProxy& newProcess) { return PageProcessOverride(*this, newProcess); }
    10271043
    10281044    WebPreferences& preferences() { return m_preferences; }
    … …  
    14151431#endif
    14161432
     1433    ProvisionalPageProxy* provisionalPageProxy() const { return m_provisionalPage.get(); }
     1434    void commitProvisionalPage(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&);
     1435
     1436    void didStartProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, URL&&, URL&& unreachableURL, const UserData&);
     1437    void didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError&, const UserData&);
     1438    void didReceiveServerRedirectForProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, WebCore::ResourceRequest&&, const UserData&);
     1439
     1440    void loadDataWithNavigation(API::Navigation&, const IPC::DataReference&, const String& MIMEType, const String& encoding, const String& baseURL, API::Object* userData, WebCore::ShouldTreatAsContinuingLoad, Optional<WebsitePoliciesData>&& = WTF::nullopt);
     1441    void loadRequestWithNavigation(API::Navigation&, WebCore::ResourceRequest&&, WebCore::ShouldOpenExternalURLsPolicy, API::Object* userData, WebCore::ShouldTreatAsContinuingLoad, Optional<WebsitePoliciesData>&& = WTF::nullopt);
     1442
     1443    // IPC::MessageReceiver
     1444    // Implemented in generated WebPageProxyMessageReceiver.cpp
     1445    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
     1446    void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) override;
     1447
    14171448private:
    14181449    WebPageProxy(PageClient&, WebProcessProxy&, uint64_t pageID, Ref<API::PageConfiguration>&&);
    … …  
    14391470    void setUserAgent(String&&);
    14401471
    1441     // IPC::MessageReceiver
    1442     // Implemented in generated WebPageProxyMessageReceiver.cpp
    1443     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
    1444     void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) override;
    1445 
    1446 
    14471472    // IPC::MessageSender
    14481473    bool sendMessage(std::unique_ptr<IPC::Encoder>, OptionSet<IPC::SendOption>) override;
    … …  
    14661491    void didCreateWindow(uint64_t frameID, WebCore::GlobalWindowIdentifier&&);
    14671492
    1468     void didStartProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, URL&&, URL&& unreachableURL, const UserData&);
    1469     void didReceiveServerRedirectForProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, WebCore::ResourceRequest&&, const UserData&);
    14701493    void willPerformClientRedirectForFrame(uint64_t frameID, const String& url, double delay, WebCore::LockBackForwardList);
    14711494    void didCancelClientRedirectForFrame(uint64_t frameID);
    14721495    void didChangeProvisionalURLForFrame(uint64_t frameID, uint64_t navigationID, URL&&);
    1473     void didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError&, const UserData&);
    14741496    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&);
    14751497    void didFinishDocumentLoadForFrame(uint64_t frameID, uint64_t navigationID, const UserData&);
    … …  
    15751597
    15761598    void reattachToWebProcess();
    1577     void swapToWebProcess(Ref<WebProcessProxy>&&, std::unique_ptr<SuspendedPageProxy>&&, IsSwapFromSuspended);
     1599    void swapToWebProcess(Ref<WebProcessProxy>&&, std::unique_ptr<DrawingAreaProxy>&&, RefPtr<WebFrameProxy>&& mainFrame);
    15781600    void didFailToSuspendAfterProcessSwap();
    15791601    void didSuspendAfterProcessSwap();
    15801602
    1581     void finishAttachingToWebProcess(IsSwapFromSuspended = IsSwapFromSuspended::No);
     1603    enum class ShouldInitializeWebPage { No, Yes };
     1604    void finishAttachingToWebProcess(ShouldInitializeWebPage = ShouldInitializeWebPage::Yes);
    15821605
    15831606    RefPtr<API::Navigation> reattachToWebProcessForReload();
    15841607    RefPtr<API::Navigation> reattachToWebProcessWithItem(WebBackForwardListItem&);
    1585 
    1586     void loadDataWithNavigation(API::Navigation&, const IPC::DataReference&, const String& MIMEType, const String& encoding, const String& baseURL, API::Object* userData, WebCore::ShouldTreatAsContinuingLoad, Optional<WebsitePoliciesData>&& = WTF::nullopt);
    1587     void loadRequestWithNavigation(API::Navigation&, WebCore::ResourceRequest&&, WebCore::ShouldOpenExternalURLsPolicy, API::Object* userData, WebCore::ShouldTreatAsContinuingLoad, Optional<WebsitePoliciesData>&& = WTF::nullopt);
    15881608
    15891609    void requestNotificationPermission(uint64_t notificationID, const String& originString);
    … …  
    19481968
    19491969    RefPtr<WebFrameProxy> m_mainFrame;
    1950     Function<void()> m_mainFrameCreationHandler;
    1951     Function<void(const WebCore::GlobalWindowIdentifier&)> m_mainFrameWindowCreationHandler;
    19521970
    19531971    RefPtr<WebFrameProxy> m_focusedFrame;
    … …  
    23192337    bool m_mayHaveUniversalFileReadSandboxExtension { false };
    23202338
     2339    std::unique_ptr<ProvisionalPageProxy> m_provisionalPage;
     2340
    23212341#if HAVE(PENCILKIT)
    23222342    std::unique_ptr<EditableImageController> m_editableImageController;
  • branches/safari-607-branch/Source/WebKit/UIProcess/WebProcessProxy.cpp

    r240279 r240280  
    3535#include "PluginInfoStore.h"
    3636#include "PluginProcessManager.h"
     37#include "ProvisionalPageProxy.h"
    3738#include "TextChecker.h"
    3839#include "TextCheckerState.h"
    … …  
    585586#endif
    586587
     588bool WebProcessProxy::hasProvisionalPageWithID(uint64_t pageID) const
     589{
     590    for (auto* provisionalPage : m_provisionalPages) {
     591        if (provisionalPage->page().pageID() == pageID)
     592            return true;
     593    }
     594    return false;
     595}
     596
    587597void WebProcessProxy::updateBackForwardItem(const BackForwardListItemState& itemState)
    588598{
    … …  
    592602        // e.g. The old web process is navigating to about:blank for suspension.
    593603        // We ignore these updates.
    594         if (m_pageMap.contains(item->pageID()))
     604        if (m_pageMap.contains(item->pageID()) || hasProvisionalPageWithID(item->pageID()))
    595605            item->setPageState(itemState.pageState);
    596606    }
    … …  
    695705
    696706    auto pages = copyToVectorOf<RefPtr<WebPageProxy>>(m_pageMap.values());
     707    auto provisionalPages = WTF::map(m_provisionalPages, [](auto* provisionalPage) { return makeWeakPtr(provisionalPage); });
    697708
    698709    shutDown();
    … …  
    709720    for (auto& page : pages)
    710721        page->processDidTerminate(ProcessTerminationReason::Crash);
     722
     723    for (auto& provisionalPage : provisionalPages) {
     724        if (provisionalPage)
     725            provisionalPage->processDidTerminate();
     726    }
    711727}
    712728
    … …  
    780796        page->processDidFinishLaunching();
    781797    }
     798
     799    for (auto* provisionalPage : m_provisionalPages) {
     800        ASSERT(this == &provisionalPage->process());
     801        provisionalPage->processDidFinishLaunching();
     802    }
     803
    782804
    783805    RELEASE_ASSERT(!m_webConnection);
    … …  
    874896bool WebProcessProxy::canTerminateChildProcess()
    875897{
    876     if (!m_pageMap.isEmpty() || m_processPool->hasSuspendedPageFor(*this))
     898    if (!m_pageMap.isEmpty() || m_processPool->hasSuspendedPageFor(*this) || !m_provisionalPages.isEmpty())
    877899        return false;
    878900
  • branches/safari-607-branch/Source/WebKit/UIProcess/WebProcessProxy.h

    r240279 r240280  
    7171class ObjCObjectGraph;
    7272class PageClient;
     73class ProvisionalPageProxy;
    7374class UserMediaCaptureManagerProxy;
    7475class VisitedLinkStore;
    … …  
    125126    void removeWebPage(WebPageProxy&, uint64_t pageID, EndsUsingDataStore);
    126127
     128    void addProvisionalPageProxy(ProvisionalPageProxy& provisionalPage) { ASSERT(!m_provisionalPages.contains(&provisionalPage)); m_provisionalPages.add(&provisionalPage); }
     129    void removeProvisionalPageProxy(ProvisionalPageProxy& provisionalPage) { ASSERT(m_provisionalPages.contains(&provisionalPage)); m_provisionalPages.remove(&provisionalPage); }
     130
    127131    typename WebPageProxyMap::ValuesConstIteratorRange pages() const { return m_pageMap.values(); }
    128132    unsigned pageCount() const { return m_pageMap.size(); }
    … …  
    331335    void logDiagnosticMessageForResourceLimitTermination(const String& limitKey);
    332336
     337    bool hasProvisionalPageWithID(uint64_t pageID) const;
     338
    333339    enum class IsWeak { No, Yes };
    334340    template<typename T> class WeakOrStrongPtr {
    … …  
    374380    WebPageProxyMap m_pageMap;
    375381    WebFrameProxyMap m_frameMap;
     382    HashSet<ProvisionalPageProxy*> m_provisionalPages;
    376383    UserInitiatedActionMap m_userInitiatedActionMap;
    377384
  • branches/safari-607-branch/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r240279 r240280  
    30963096                466BC0391FA266C9002FA9C1 /* WebSWContextManagerConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebSWContextManagerConnection.h; sourceTree = "<group>"; };
    30973097                466BC03A1FA266C9002FA9C1 /* WebSWContextManagerConnection.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebSWContextManagerConnection.messages.in; sourceTree = "<group>"; };
     3098                4683569A21E81CC7006E27A3 /* ProvisionalPageProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProvisionalPageProxy.h; sourceTree = "<group>"; };
     3099                4683569B21E81CC7006E27A3 /* ProvisionalPageProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProvisionalPageProxy.cpp; sourceTree = "<group>"; };
    30983100                46A2B6061E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BackgroundProcessResponsivenessTimer.cpp; sourceTree = "<group>"; };
    30993101                46A2B6071E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BackgroundProcessResponsivenessTimer.h; sourceTree = "<group>"; };
    … …  
    73217323                                86E67A21190F411800004AB7 /* ProcessThrottler.h */,
    73227324                                83048AE51ACA45DC0082C832 /* ProcessThrottlerClient.h */,
     7325                                4683569B21E81CC7006E27A3 /* ProvisionalPageProxy.cpp */,
     7326                                4683569A21E81CC7006E27A3 /* ProvisionalPageProxy.h */,
    73237327                                A55BA81B1BA25B1E007CD33D /* RemoteWebInspectorProxy.cpp */,
    73247328                                A55BA8191BA25B1E007CD33D /* RemoteWebInspectorProxy.h */,
  • branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/WebFrame.cpp

    r240279 r240280  
    264264    case WebPolicyAction::Download:
    265265        return WebCore::PolicyAction::Download;
    266     case WebPolicyAction::Suspend:
    267         break;
    268266    }
    269267    ASSERT_NOT_REACHED();
    … …  
    273271void WebFrame::didReceivePolicyDecision(uint64_t listenerID, WebPolicyAction action, uint64_t navigationID, DownloadID downloadID, Optional<WebsitePoliciesData>&& websitePolicies)
    274272{
    275     if (!m_coreFrame || !m_policyListenerID || listenerID != m_policyListenerID || !m_policyFunction) {
    276         if (action == WebPolicyAction::Suspend)
    277             page()->send(Messages::WebPageProxy::DidFailToSuspendAfterProcessSwap());
     273    if (!m_coreFrame || !m_policyListenerID || listenerID != m_policyListenerID || !m_policyFunction)
    278274        return;
    279     }
    280275
    281276    FramePolicyFunction function = WTFMove(m_policyFunction);
    … …  
    293288    }
    294289
    295     bool shouldSuspend = false;
    296     if (action == WebPolicyAction::Suspend) {
    297         shouldSuspend = true;
    298         action = WebPolicyAction::Ignore;
    299     }
    300 
    301290    function(toPolicyAction(action));
    302 
    303     if (shouldSuspend)
    304         page()->suspendForProcessSwap();
    305291}
    306292
  • branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp

    r240279 r240280  
    403403    , m_cpuLimit(parameters.cpuLimit)
    404404#if PLATFORM(MAC)
    405     , m_shouldAttachDrawingAreaOnPageTransition(parameters.isSwapFromSuspended)
     405    , m_shouldAttachDrawingAreaOnPageTransition(parameters.isProcessSwap)
    406406#endif
    407407{
    … …  
    473473    m_drawingArea->setShouldScaleViewToFitDocument(parameters.shouldScaleViewToFitDocument);
    474474
    475     if (parameters.isSwapFromSuspended)
    476         freezeLayerTree(LayerTreeFreezeReason::SwapFromSuspended);
     475    if (parameters.isProcessSwap)
     476        freezeLayerTree(LayerTreeFreezeReason::ProcessSwap);
    477477
    478478#if ENABLE(ASYNC_SCROLLING)
    … …  
    698698        m_drawingArea->setPaintingEnabled(true);
    699699#if PLATFORM(MAC)
    700         m_shouldAttachDrawingAreaOnPageTransition = parameters.isSwapFromSuspended;
     700        m_shouldAttachDrawingAreaOnPageTransition = parameters.isProcessSwap;
    701701#endif
    702702        unfreezeLayerTree(LayerTreeFreezeReason::PageSuspended);
    … …  
    30573057    if (!frame)
    30583058        return;
    3059     if (policyAction == WebPolicyAction::Suspend) {
    3060         ASSERT(frame == m_mainFrame);
    3061         setIsSuspended(true);
    3062 
    3063         WebProcess::singleton().sendPrewarmInformation(mainWebFrame()->url());
    3064     }
    30653059    frame->didReceivePolicyDecision(listenerID, policyAction, navigationID, downloadID, WTFMove(websitePolicies));
    30663060}
    … …  
    31043098    bool isInitialEmptyDocument = !m_mainFrame;
    31053099    if (!isInitialEmptyDocument)
    3106         unfreezeLayerTree(LayerTreeFreezeReason::SwapFromSuspended);
     3100        unfreezeLayerTree(LayerTreeFreezeReason::ProcessSwap);
    31073101
    31083102#if PLATFORM(MAC)
    … …  
    63166310        // Unfrozen on drawing area reset.
    63176311        freezeLayerTree(LayerTreeFreezeReason::PageSuspended);
     6312
     6313        WebProcess::singleton().sendPrewarmInformation(mainWebFrame()->url());
     6314
     6315        suspendForProcessSwap();
    63186316    } else
    63196317        m_shouldResetDrawingAreaAfterSuspend = true;
  • branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/WebPage.h

    r240279 r240280  
    697697        PageSuspended           = 1 << 3,
    698698        Printing                = 1 << 4,
    699         SwapFromSuspended       = 1 << 5,
     699        ProcessSwap             = 1 << 5,
    700700    };
    701701    void freezeLayerTree(LayerTreeFreezeReason);
  • branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm

    r240279 r240280  
    9898    setColorSpace(parameters.colorSpace);
    9999
    100     if (!parameters.isSwapFromSuspended)
     100    if (!parameters.isProcessSwap)
    101101        attach();
    102102}
  • branches/safari-607-branch/Tools/ChangeLog

    r240279 r240280  
     12019-01-22  Alan Coon  <alancoon@apple.com>
     2
     3        Revert r240262. rdar://problem/47099573
     4
    152019-01-22  Alan Coon  <alancoon@apple.com>
    26
  • branches/safari-607-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm

    r240279 r240280  
    11/*
    2  * Copyright (C) 2017 Apple Inc. All rights reserved.
     2 * Copyright (C) 2017-2019 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
    … …  
    7373static bool willPerformClientRedirect;
    7474static bool didPerformClientRedirect;
     75static bool shouldConvertToDownload;
    7576static RetainPtr<NSURL> clientRedirectSourceURL;
    7677static RetainPtr<NSURL> clientRedirectDestinationURL;
    … …  
    127128        decisionHandler(WKNavigationActionPolicyAllow);
    128129    didRepondToPolicyDecisionCall = true;
     130}
     131
     132- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
     133{
     134    decisionHandler(shouldConvertToDownload ? _WKNavigationResponsePolicyBecomeDownload : WKNavigationResponsePolicyAllow);
    129135}
    130136
    … …  
    14061412    EXPECT_FALSE(serverRedirected);
    14071413    EXPECT_EQ(3, numberOfDecidePolicyCalls);
    1408     EXPECT_EQ(2u, seenPIDs.size());
     1414    EXPECT_EQ(3u, seenPIDs.size());
    14091415}
    14101416
    … …  
    14661472
    14671473    EXPECT_WK_STREQ(@"pson://www.webkit.org/main1.html", [[webView URL] absoluteString]);
     1474}
     1475
     1476static const char* linkToWebKitBytes = R"PSONRESOURCE(
     1477<body>
     1478  <a id="testLink" href="pson://www.webkit.org/main.html">Link</a>
     1479</body>
     1480)PSONRESOURCE";
     1481
     1482TEST(ProcessSwap, PolicyCancelAfterServerRedirect)
     1483{
     1484    auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
     1485    processPoolConfiguration.get().processSwapsOnNavigation = YES;
     1486    auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
     1487
     1488    auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
     1489    [webViewConfiguration setProcessPool:processPool.get()];
     1490    auto handler = adoptNS([[PSONScheme alloc] init]);
     1491    [handler addMappingFromURLString:@"pson://www.google.com/main.html" toData:linkToWebKitBytes];
     1492    [handler addRedirectFromURLString:@"pson://www.webkit.org/main.html" toURLString:@"pson://www.apple.com/ignore.html"];
     1493    [webViewConfiguration setURLSchemeHandler:handler.get() forURLScheme:@"pson"];
     1494
     1495    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]);
     1496    auto navigationDelegate = adoptNS([[PSONNavigationDelegate alloc] init]);
     1497    [webView setNavigationDelegate:navigationDelegate.get()];
     1498
     1499    navigationDelegate->decidePolicyForNavigationAction = ^(WKNavigationAction *action, void (^decisionHandler)(WKNavigationActionPolicy)) {
     1500        if ([action.request.URL.absoluteString hasSuffix:@"ignore.html"]) {
     1501            decisionHandler(WKNavigationActionPolicyCancel);
     1502            return;
     1503        }
     1504        decisionHandler(WKNavigationActionPolicyAllow);
     1505    };
     1506
     1507    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"pson://www.google.com/main.html"]];
     1508    [webView loadRequest:request];
     1509
     1510    TestWebKitAPI::Util::run(&done);
     1511    done = false;
     1512    auto pidAfterFirstLoad = [webView _webProcessIdentifier];
     1513
     1514    EXPECT_EQ(1, numberOfDecidePolicyCalls);
     1515
     1516    [webView evaluateJavaScript:@"testLink.click()" completionHandler:nil];
     1517
     1518    TestWebKitAPI::Util::run(&failed);
     1519    failed = false;
     1520    done = false;
     1521
     1522    EXPECT_EQ(3, numberOfDecidePolicyCalls);
     1523
     1524    // We should still be on google.com.
     1525    EXPECT_EQ(pidAfterFirstLoad, [webView _webProcessIdentifier]);
     1526    EXPECT_WK_STREQ(@"pson://www.google.com/main.html", [[webView URL] absoluteString]);
     1527
     1528    [webView evaluateJavaScript:@"testLink.innerText" completionHandler: [&] (id innerText, NSError *error) {
     1529        EXPECT_WK_STREQ(@"Link", innerText);
     1530        done = true;
     1531    }];
     1532    TestWebKitAPI::Util::run(&done);
     1533    done = false;
     1534}
     1535
     1536TEST(ProcessSwap, CrossSiteDownload)
     1537{
     1538    auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
     1539    processPoolConfiguration.get().processSwapsOnNavigation = YES;
     1540    auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
     1541
     1542    auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
     1543    [webViewConfiguration setProcessPool:processPool.get()];
     1544    auto handler = adoptNS([[PSONScheme alloc] init]);
     1545    [handler addMappingFromURLString:@"pson://www.google.com/main.html" toData:linkToWebKitBytes];
     1546    [handler addMappingFromURLString:@"pson://www.webkit.org/main.html" toData:"Hello"];
     1547    [webViewConfiguration setURLSchemeHandler:handler.get() forURLScheme:@"pson"];
     1548
     1549    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]);
     1550    auto navigationDelegate = adoptNS([[PSONNavigationDelegate alloc] init]);
     1551    [webView setNavigationDelegate:navigationDelegate.get()];
     1552
     1553    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"pson://www.google.com/main.html"]];
     1554    [webView loadRequest:request];
     1555
     1556    TestWebKitAPI::Util::run(&done);
     1557    done = false;
     1558    auto pidAfterFirstLoad = [webView _webProcessIdentifier];
     1559
     1560    shouldConvertToDownload = true;
     1561    [webView evaluateJavaScript:@"testLink.click()" completionHandler:nil];
     1562
     1563    TestWebKitAPI::Util::run(&failed);
     1564    failed = false;
     1565    shouldConvertToDownload = false;
     1566
     1567    // We should still be on google.com.
     1568    EXPECT_EQ(pidAfterFirstLoad, [webView _webProcessIdentifier]);
     1569    EXPECT_WK_STREQ(@"pson://www.google.com/main.html", [[webView URL] absoluteString]);
     1570
     1571    [webView evaluateJavaScript:@"testLink.innerText" completionHandler: [&] (id innerText, NSError *error) {
     1572        EXPECT_WK_STREQ(@"Link", innerText);
     1573        done = true;
     1574    }];
     1575    TestWebKitAPI::Util::run(&done);
     1576    done = false;
    14681577}
    14691578
    … …  
    22332342    EXPECT_EQ(7u, [receivedMessages count]);
    22342343    EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pageshow NOT persisted", receivedMessages.get()[0]);
    2235     EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pagehide persisted", receivedMessages.get()[1]);
    2236     EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pageshow NOT persisted", receivedMessages.get()[2]);
    2237     EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pagehide persisted", receivedMessages.get()[3]);
    2238     EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pageshow persisted", receivedMessages.get()[4]);
    2239     EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pagehide persisted", receivedMessages.get()[5]);
    2240     EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pageshow persisted", receivedMessages.get()[6]);
     2344    if ([receivedMessages.get()[1] hasPrefix:@"pson://www.webkit.org/main.html"]) {
     2345        EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pagehide persisted", receivedMessages.get()[1]);
     2346        EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pageshow NOT persisted", receivedMessages.get()[2]);
     2347    } else {
     2348        EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pageshow NOT persisted", receivedMessages.get()[1]);
     2349        EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pagehide persisted", receivedMessages.get()[2]);
     2350    }
     2351    if ([receivedMessages.get()[3] hasPrefix:@"pson://www.apple.com/main.html"]) {
     2352        EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pagehide persisted", receivedMessages.get()[3]);
     2353        EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pageshow persisted", receivedMessages.get()[4]);
     2354    } else {
     2355        EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pageshow persisted", receivedMessages.get()[3]);
     2356        EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pagehide persisted", receivedMessages.get()[4]);
     2357    }
     2358    if ([receivedMessages.get()[5] hasPrefix:@"pson://www.webkit.org/main.html"]) {
     2359        EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pagehide persisted", receivedMessages.get()[5]);
     2360        EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pageshow persisted", receivedMessages.get()[6]);
     2361    } else {
     2362        EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - pageshow persisted", receivedMessages.get()[5]);
     2363        EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pagehide persisted", receivedMessages.get()[6]);
     2364    }
    22412365}
    22422366
    … …  
    23082432    EXPECT_EQ(7u, [receivedMessages count]);
    23092433    EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - load", receivedMessages.get()[0]);
    2310     EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - unload", receivedMessages.get()[1]);
    2311     EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - load", receivedMessages.get()[2]);
    2312     EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - unload", receivedMessages.get()[3]);
    2313     EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - load", receivedMessages.get()[4]);
    2314     EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - unload", receivedMessages.get()[5]);
    2315     EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - load", receivedMessages.get()[6]);
     2434    if ([receivedMessages.get()[1] hasPrefix:@"pson://www.webkit.org/main.html"]) {
     2435        EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - unload", receivedMessages.get()[1]);
     2436        EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - load", receivedMessages.get()[2]);
     2437    } else {
     2438        EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - load", receivedMessages.get()[1]);
     2439        EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - unload", receivedMessages.get()[2]);
     2440    }
     2441    if ([receivedMessages.get()[3] hasPrefix:@"pson://www.apple.com/main.html"]) {
     2442        EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - unload", receivedMessages.get()[3]);
     2443        EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - load", receivedMessages.get()[4]);
     2444    } else {
     2445        EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - load", receivedMessages.get()[3]);
     2446        EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - unload", receivedMessages.get()[4]);
     2447    }
     2448    if ([receivedMessages.get()[5] hasPrefix:@"pson://www.webkit.org/main.html"]) {
     2449        EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - unload", receivedMessages.get()[5]);
     2450        EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - load", receivedMessages.get()[6]);
     2451    } else {
     2452        EXPECT_WK_STREQ(@"pson://www.apple.com/main.html - load", receivedMessages.get()[5]);
     2453        EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - unload", receivedMessages.get()[6]);
     2454    }
    23162455}
    23172456
Note: See TracChangeset for help on using the changeset viewer.