Changeset 240280 in webkit
- Timestamp:
- Jan 22, 2019, 12:58:17 PM (8 years ago)
- Location:
- branches/safari-607-branch
- Files:
-
- 2 added
- 24 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/platform/wk2/TestExpectations (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/loader/FrameLoader.cpp (modified) (1 diff)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/Shared/WebPageCreationParameters.cpp (modified) (2 diffs)
-
Source/WebKit/Shared/WebPageCreationParameters.h (modified) (1 diff)
-
Source/WebKit/Shared/WebPolicyAction.h (modified) (2 diffs)
-
Source/WebKit/Sources.txt (modified) (1 diff)
-
Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (modified) (2 diffs)
-
Source/WebKit/UIProcess/PageClient.h (modified) (1 diff)
-
Source/WebKit/UIProcess/ProvisionalPageProxy.cpp (added)
-
Source/WebKit/UIProcess/ProvisionalPageProxy.h (added)
-
Source/WebKit/UIProcess/SuspendedPageProxy.cpp (modified) (3 diffs)
-
Source/WebKit/UIProcess/WebFrameProxy.cpp (modified) (2 diffs)
-
Source/WebKit/UIProcess/WebPageProxy.cpp (modified) (27 diffs)
-
Source/WebKit/UIProcess/WebPageProxy.h (modified) (12 diffs)
-
Source/WebKit/UIProcess/WebProcessProxy.cpp (modified) (7 diffs)
-
Source/WebKit/UIProcess/WebProcessProxy.h (modified) (4 diffs)
-
Source/WebKit/WebKit.xcodeproj/project.pbxproj (modified) (2 diffs)
-
Source/WebKit/WebProcess/WebPage/WebFrame.cpp (modified) (3 diffs)
-
Source/WebKit/WebProcess/WebPage/WebPage.cpp (modified) (6 diffs)
-
Source/WebKit/WebProcess/WebPage/WebPage.h (modified) (1 diff)
-
Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/safari-607-branch/LayoutTests/ChangeLog
r240279 r240280 1 2019-01-22 Alan Coon <alancoon@apple.com> 2 3 Revert r240262. rdar://problem/47099573 4 1 5 2019-01-22 Alan Coon <alancoon@apple.com> 2 6 -
branches/safari-607-branch/LayoutTests/platform/wk2/TestExpectations
r240279 r240280 734 734 http/tests/resourceLoadStatistics/cap-cache-max-age-for-prevalent-resource.html [ Skip ] 735 735 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>. 737 http/tests/navigation/process-swap-window-open.html [ Skip ] 738 738 739 739 # Cross-Origin-Resource-Policy response header is only implemented in WebKit2. -
branches/safari-607-branch/Source/WebCore/ChangeLog
r240279 r240280 1 2019-01-22 Alan Coon <alancoon@apple.com> 2 3 Revert r240262. rdar://problem/47099573 4 1 5 2019-01-22 Alan Coon <alancoon@apple.com> 2 6 -
branches/safari-607-branch/Source/WebCore/loader/FrameLoader.cpp
r240279 r240280 2033 2033 Optional<HasInsecureContent> hasInsecureContent = cachedPage->cachedMainFrame()->hasInsecureContent(); 2034 2034 2035 dispatchDidCommitLoad(hasInsecureContent); 2036 2035 2037 // FIXME: This API should be turned around so that we ground CachedPage into the Page. 2036 2038 cachedPage->restore(*m_frame.page()); 2037 2038 dispatchDidCommitLoad(hasInsecureContent);2039 2039 2040 2040 #if PLATFORM(IOS_FAMILY) -
branches/safari-607-branch/Source/WebKit/ChangeLog
r240279 r240280 1 2019-01-22 Alan Coon <alancoon@apple.com> 2 3 Revert r240262. rdar://problem/47099573 4 1 5 2019-01-22 Alan Coon <alancoon@apple.com> 2 6 -
branches/safari-607-branch/Source/WebKit/Shared/WebPageCreationParameters.cpp
r240279 r240280 74 74 encoder << mimeTypesWithCustomContentProviders; 75 75 encoder << controlledByAutomation; 76 encoder << is SwapFromSuspended;76 encoder << isProcessSwap; 77 77 78 78 #if PLATFORM(MAC) … … 228 228 if (!decoder.decode(parameters.controlledByAutomation)) 229 229 return WTF::nullopt; 230 if (!decoder.decode(parameters.is SwapFromSuspended))230 if (!decoder.decode(parameters.isProcessSwap)) 231 231 return WTF::nullopt; 232 232 -
branches/safari-607-branch/Source/WebKit/Shared/WebPageCreationParameters.h
r240279 r240280 130 130 131 131 bool controlledByAutomation; 132 bool is SwapFromSuspended{ false };132 bool isProcessSwap { false }; 133 133 134 134 #if PLATFORM(MAC) -
branches/safari-607-branch/Source/WebKit/Shared/WebPolicyAction.h
r240279 r240280 30 30 namespace WebKit { 31 31 32 // FIXME: Remove this type and use WebCore::PolicyAction instead. 32 33 enum class WebPolicyAction : uint8_t { 33 34 Use, 34 35 Download, 35 Ignore, 36 Suspend 36 Ignore 37 37 }; 38 38 … … 46 46 WebKit::WebPolicyAction::Use, 47 47 WebKit::WebPolicyAction::Download, 48 WebKit::WebPolicyAction::Ignore, 49 WebKit::WebPolicyAction::Suspend 48 WebKit::WebPolicyAction::Ignore 50 49 >; 51 50 }; -
branches/safari-607-branch/Source/WebKit/Sources.txt
r240279 r240280 229 229 UIProcess/ProcessAssertion.cpp 230 230 UIProcess/ProcessThrottler.cpp 231 UIProcess/ProvisionalPageProxy.cpp 231 232 UIProcess/RemoteWebInspectorProxy.cpp 232 233 UIProcess/ResourceLoadStatisticsMemoryStore.cpp -
branches/safari-607-branch/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm
r240279 r240280 45 45 #import "ObjCObjectGraph.h" 46 46 #import "PageClient.h" 47 #import "ProvisionalPageProxy.h" 47 48 #import "RemoteLayerTreeScrollingPerformanceData.h" 48 49 #import "RemoteLayerTreeTransaction.h" … … 4683 4684 Ref<WebKit::WebProcessProxy> protectedProcessProxy(_page->process()); 4684 4685 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 } 4685 4691 } 4686 4692 -
branches/safari-607-branch/Source/WebKit/UIProcess/PageClient.h
r240279 r240280 49 49 OBJC_CLASS CALayer; 50 50 OBJC_CLASS NSFileWrapper; 51 OBJC_CLASS NSMenu; 51 52 OBJC_CLASS NSSet; 52 53 OBJC_CLASS WKDrawingView; -
branches/safari-607-branch/Source/WebKit/UIProcess/SuspendedPageProxy.cpp
r240279 r240280 101 101 // on the WebProcess side. 102 102 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()); 104 106 105 107 // We call maybeShutDown() asynchronously since the SuspendedPage is currently being removed from the WebProcessPool … … 135 137 136 138 m_suspensionState = SuspensionState::Resumed; 137 m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_page.pageID());138 139 m_process->send(Messages::WebPage::SetIsSuspended(false), m_page.pageID()); 139 140 } … … 151 152 m_suspensionToken = nullptr; 152 153 #endif 154 155 m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_page.pageID()); 153 156 154 157 if (m_readyToUnsuspendHandler) -
branches/safari-607-branch/Source/WebKit/UIProcess/WebFrameProxy.cpp
r240279 r240280 28 28 29 29 #include "APINavigation.h" 30 #include "ProvisionalPageProxy.h" 30 31 #include "WebCertificateInfo.h" 31 32 #include "WebFramePolicyListenerProxy.h" … … 75 76 return false; 76 77 77 return this == m_page->mainFrame() ;78 return this == m_page->mainFrame() || (m_page->provisionalPageProxy() && this == m_page->provisionalPageProxy()->mainFrame()); 78 79 } 79 80 -
branches/safari-607-branch/Source/WebKit/UIProcess/WebPageProxy.cpp
r240279 r240280 78 78 #include "PluginProcessManager.h" 79 79 #include "PrintInfo.h" 80 #include "ProvisionalPageProxy.h" 80 81 #include "SafeBrowsingWarning.h" 81 82 #include "ShareSheetCallbackID.h" … … 550 551 } 551 552 553 DrawingAreaProxy* 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 552 560 void WebPageProxy::changeWebsiteDataStore(WebsiteDataStore& websiteDataStore) 553 561 { … … 773 781 } 774 782 775 void WebPageProxy::swapToWebProcess(Ref<WebProcessProxy>&& process, std::unique_ptr< SuspendedPageProxy>&& destinationSuspendedPage, IsSwapFromSuspended isSwapFromSuspended)783 void WebPageProxy::swapToWebProcess(Ref<WebProcessProxy>&& process, std::unique_ptr<DrawingAreaProxy>&& drawingArea, RefPtr<WebFrameProxy>&& mainFrame) 776 784 { 777 785 ASSERT(!m_isClosed); … … 779 787 780 788 m_process = WTFMove(process); 789 ASSERT(!m_drawingArea); 790 setDrawingArea(WTFMove(drawingArea)); 791 ASSERT(!m_mainFrame); 792 m_mainFrame = WTFMove(mainFrame); 781 793 m_isValid = true; 782 783 // If we are reattaching to a SuspendedPage, then the WebProcess' WebPage already exists and784 // WebPageProxy::didCreateMainFrame() will not be called to initialize m_mainFrame. In such785 // case, we need to initialize m_mainFrame to reflect the fact the the WebProcess' WebPage786 // 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 }799 794 800 795 m_process->addExistingWebPage(*this, m_pageID, WebProcessProxy::BeginsUsingDataStore::No); 801 796 m_process->addMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_pageID, *this); 802 797 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 802 void WebPageProxy::finishAttachingToWebProcess(ShouldInitializeWebPage shouldInitializePage) 807 803 { 808 804 ASSERT(m_process->state() != ChildProcessProxy::State::Terminated); … … 840 836 #endif 841 837 842 initializeWebPage(isSwapFromSuspended); 838 if (shouldInitializePage == ShouldInitializeWebPage::Yes) 839 initializeWebPage(); 843 840 844 841 m_inspector->updateForNewPageProcess(this); … … 905 902 } 906 903 907 void WebPageProxy::initializeWebPage(IsSwapFromSuspended isSwapFromSuspended) 908 { 909 ASSERT(isValid()); 910 911 m_drawingArea = pageClient().createDrawingAreaProxy(); 912 ASSERT(m_drawingArea); 904 void WebPageProxy::setDrawingArea(std::unique_ptr<DrawingAreaProxy>&& drawingArea) 905 { 906 m_drawingArea = WTFMove(drawingArea); 907 if (!m_drawingArea) 908 return; 913 909 914 910 #if ENABLE(ASYNC_SCROLLING) && PLATFORM(COCOA) … … 921 917 } 922 918 #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 921 void 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); 932 929 933 930 m_needsToFinishInitializingWebPageAfterProcessLaunch = true; … … 1081 1078 1082 1079 auto url = request.url(); 1083 m_pageLoadState.setPendingAPIRequestURL(transaction, url); 1080 if (shouldTreatAsContinuingLoad != ShouldTreatAsContinuingLoad::Yes) 1081 m_pageLoadState.setPendingAPIRequestURL(transaction, url); 1084 1082 1085 1083 if (!isValid()) … … 1299 1297 1300 1298 m_process->send(Messages::WebPage::StopLoading(), m_pageID); 1299 if (m_provisionalPage) { 1300 m_provisionalPage->cancel(); 1301 m_provisionalPage = nullptr; 1302 } 1301 1303 m_process->responsivenessTimer().start(); 1302 1304 } … … 2697 2699 2698 2700 if (processForNavigation.ptr() != &process()) { 2699 policyAction = isPageOpenedByDOMShowingInitialEmptyDocument() ? WebPolicyAction::Ignore : WebPolicyAction::Suspend;2701 policyAction = WebPolicyAction::Ignore; 2700 2702 RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "decidePolicyForNavigationAction, swapping process %i with process %i for navigation, reason: %{public}s", processIdentifier(), processForNavigation->processIdentifier(), reason.utf8().data()); 2701 2703 LOG(ProcessSwapping, "(ProcessSwapping) Switching from process %i to new process (%i) for navigation %" PRIu64 " '%s'", processIdentifier(), processForNavigation->processIdentifier(), navigation->navigationID(), navigation->loggingString()); … … 2706 2708 receivedPolicyDecision(policyAction, navigation.ptr(), shouldProcessSwap ? WTF::nullopt : WTFMove(data), WTFMove(sender)); 2707 2709 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)); 2710 2718 }); 2711 2719 } … … 2743 2751 } 2744 2752 2745 void WebPageProxy::continueNavigationInNewProcess(API::Navigation& navigation, std::unique_ptr<SuspendedPageProxy>&& suspendedPageProxy, Ref<WebProcessProxy>&& process, ProcessSwapRequestedByClient processSwapRequestedByClient, Optional<WebsitePoliciesData>&& websitePolicies) 2753 void 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 2780 void WebPageProxy::continueNavigationInNewProcess(API::Navigation& navigation, std::unique_ptr<SuspendedPageProxy>&& suspendedPageProxy, Ref<WebProcessProxy>&& newProcess, ProcessSwapRequestedByClient processSwapRequestedByClient, Optional<WebsitePoliciesData>&& websitePolicies) 2746 2781 { 2747 2782 RELEASE_LOG_IF_ALLOWED(Loading, "continueNavigationInNewProcess: webPID = %i, pageID = %" PRIu64, m_process->processIdentifier(), m_pageID); 2748 2783 LOG(Loading, "Continuing navigation %" PRIu64 " '%s' in a new web process", navigation.navigationID(), navigation.loggingString()); 2749 2784 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); 2763 2792 2764 2793 if (auto* item = navigation.targetItem()) { … … 2768 2797 m_pageLoadState.setPendingAPIRequestURL(transaction, item->url()); 2769 2798 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)); 2781 2800 return; 2782 2801 } … … 2785 2804 // 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 2786 2805 // 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); 2788 2807 } 2789 2808 … … 2791 2810 ASSERT(!navigation.currentRequest().isEmpty()); 2792 2811 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)); 2794 2813 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)); 2831 2815 } 2832 2816 … … 3693 3677 // Add the frame to the process wide map. 3694 3678 m_process->frameCreated(frameID, *m_mainFrame); 3695 3696 if (m_mainFrameCreationHandler) {3697 m_mainFrameCreationHandler();3698 m_mainFrameCreationHandler = nullptr;3699 }3700 3679 } 3701 3680 … … 3722 3701 void WebPageProxy::didCreateWindow(uint64_t frameID, GlobalWindowIdentifier&& windowIdentifier) 3723 3702 { 3724 if (m_mainFrame && m_mainFrame->frameID() == frameID) {3725 if (auto mainFrameWindowCreationHandler = WTFMove(m_mainFrameWindowCreationHandler))3726 mainFrameWindowCreationHandler(windowIdentifier);3727 }3728 3703 } 3729 3704 … … 3777 3752 { 3778 3753 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; 3779 3758 3780 3759 // FIXME: Message check the navigationID. … … 3794 3773 if (frame->isMainFrame() && navigationID) 3795 3774 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 }3804 3775 3805 3776 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()); … … 3909 3880 3910 3881 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 } 3911 3887 3912 3888 WebFrameProxy* frame = m_process->webFrame(frameID); … … 3948 3924 3949 3925 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; 3950 3930 } 3951 3931 … … 4339 4319 MESSAGE_CHECK(frame); 4340 4320 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); 4343 4323 })); 4344 4324 } … … 4539 4519 4540 4520 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 { 4542 4522 // FIXME: Assert the API::WebsitePolicies* is nullptr here once clients of WKFramePolicyListenerUseWithPolicies go away. 4543 4523 RELEASE_ASSERT(processSwapRequestedByClient == ProcessSwapRequestedByClient::No); 4544 4524 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); 4547 4527 })); 4548 4528 }, ShouldExpectSafeBrowsingResult::No)); … … 6364 6344 } 6365 6345 6346 void WebPageProxy::provisionalProcessDidTerminate() 6347 { 6348 ASSERT(m_provisionalPage); 6349 m_provisionalPage->cancel(); 6350 m_provisionalPage = nullptr; 6351 } 6352 6366 6353 static bool shouldReloadAfterProcessTermination(ProcessTerminationReason reason) 6367 6354 { … … 6451 6438 { 6452 6439 m_mainFrame = nullptr; 6453 m_mainFrameCreationHandler = nullptr;6454 m_mainFrameWindowCreationHandler = nullptr;6455 6440 6456 6441 #if PLATFORM(COCOA) … … 6743 6728 #endif 6744 6729 6730 #if ENABLE(SERVICE_WORKER) 6731 parameters.hasRegisteredServiceWorkers = process().processPool().mayHaveRegisteredServiceWorkers(m_websiteDataStore); 6732 #endif 6733 6745 6734 parameters.needsFontAttributes = m_needsFontAttributes; 6746 6735 … … 8504 8493 } 8505 8494 8495 WebPageProxy::PageProcessOverride::PageProcessOverride(WebPageProxy& page, WebProcessProxy& newProcess) 8496 : m_page(&page) 8497 , m_previousProcess(page.process()) 8498 { 8499 page.m_process = newProcess; 8500 } 8501 8502 WebPageProxy::PageProcessOverride::PageProcessOverride(PageProcessOverride&&) = default; 8503 8504 WebPageProxy::PageProcessOverride::~PageProcessOverride() 8505 { 8506 if (m_page) 8507 m_page->m_process = WTFMove(m_previousProcess); 8508 } 8509 8506 8510 #if ENABLE(DATA_DETECTION) 8507 8511 -
branches/safari-607-branch/Source/WebKit/UIProcess/WebPageProxy.h
r240279 r240280 226 226 class NativeWebWheelEvent; 227 227 class PageClient; 228 class ProvisionalPageProxy; 228 229 class RemoteLayerTreeHost; 229 230 class RemoteLayerTreeScrollingPerformanceData; … … 357 358 WebFrameProxy* frameSetLargestFrame() const { return m_frameSetLargestFrame.get(); } 358 359 359 DrawingAreaProxy* drawingArea() const { return m_drawingArea.get(); }360 DrawingAreaProxy* drawingArea() const; 360 361 361 362 WebNavigationState& navigationState() { return *m_navigationState.get(); } … … 380 381 bool addsVisitedLinks() const { return m_addsVisitedLinks; } 381 382 void setAddsVisitedLinks(bool addsVisitedLinks) { m_addsVisitedLinks = addsVisitedLinks; } 383 VisitedLinkStore& visitedLinkStore() { return m_visitedLinkStore; } 382 384 383 385 void exitFullscreenImmediately(); … … 459 461 void setIconLoadingClient(std::unique_ptr<API::IconLoadingClient>&&); 460 462 461 enum class IsSwapFromSuspended { No, Yes };462 void initializeWebPage(IsSwapFromSuspended = IsSwapFromSuspended::No);463 void initializeWebPage(); 464 void setDrawingArea(std::unique_ptr<DrawingAreaProxy>&&); 463 465 464 466 WeakPtr<SecKeyProxyStore> secKeyProxyStore(const WebCore::AuthenticationChallenge&); … … 998 1000 void processDidBecomeResponsive(); 999 1001 void processDidTerminate(ProcessTerminationReason); 1002 void provisionalProcessDidTerminate(); 1000 1003 void dispatchProcessDidTerminate(ProcessTerminationReason); 1001 1004 void willChangeProcessIsResponsive(); … … 1025 1028 WebProcessProxy& process() { return m_process; } 1026 1029 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); } 1027 1043 1028 1044 WebPreferences& preferences() { return m_preferences; } … … 1415 1431 #endif 1416 1432 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 1417 1448 private: 1418 1449 WebPageProxy(PageClient&, WebProcessProxy&, uint64_t pageID, Ref<API::PageConfiguration>&&); … … 1439 1470 void setUserAgent(String&&); 1440 1471 1441 // IPC::MessageReceiver1442 // Implemented in generated WebPageProxyMessageReceiver.cpp1443 void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;1444 void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) override;1445 1446 1447 1472 // IPC::MessageSender 1448 1473 bool sendMessage(std::unique_ptr<IPC::Encoder>, OptionSet<IPC::SendOption>) override; … … 1466 1491 void didCreateWindow(uint64_t frameID, WebCore::GlobalWindowIdentifier&&); 1467 1492 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&);1470 1493 void willPerformClientRedirectForFrame(uint64_t frameID, const String& url, double delay, WebCore::LockBackForwardList); 1471 1494 void didCancelClientRedirectForFrame(uint64_t frameID); 1472 1495 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&);1474 1496 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&); 1475 1497 void didFinishDocumentLoadForFrame(uint64_t frameID, uint64_t navigationID, const UserData&); … … 1575 1597 1576 1598 void reattachToWebProcess(); 1577 void swapToWebProcess(Ref<WebProcessProxy>&&, std::unique_ptr< SuspendedPageProxy>&&, IsSwapFromSuspended);1599 void swapToWebProcess(Ref<WebProcessProxy>&&, std::unique_ptr<DrawingAreaProxy>&&, RefPtr<WebFrameProxy>&& mainFrame); 1578 1600 void didFailToSuspendAfterProcessSwap(); 1579 1601 void didSuspendAfterProcessSwap(); 1580 1602 1581 void finishAttachingToWebProcess(IsSwapFromSuspended = IsSwapFromSuspended::No); 1603 enum class ShouldInitializeWebPage { No, Yes }; 1604 void finishAttachingToWebProcess(ShouldInitializeWebPage = ShouldInitializeWebPage::Yes); 1582 1605 1583 1606 RefPtr<API::Navigation> reattachToWebProcessForReload(); 1584 1607 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);1588 1608 1589 1609 void requestNotificationPermission(uint64_t notificationID, const String& originString); … … 1948 1968 1949 1969 RefPtr<WebFrameProxy> m_mainFrame; 1950 Function<void()> m_mainFrameCreationHandler;1951 Function<void(const WebCore::GlobalWindowIdentifier&)> m_mainFrameWindowCreationHandler;1952 1970 1953 1971 RefPtr<WebFrameProxy> m_focusedFrame; … … 2319 2337 bool m_mayHaveUniversalFileReadSandboxExtension { false }; 2320 2338 2339 std::unique_ptr<ProvisionalPageProxy> m_provisionalPage; 2340 2321 2341 #if HAVE(PENCILKIT) 2322 2342 std::unique_ptr<EditableImageController> m_editableImageController; -
branches/safari-607-branch/Source/WebKit/UIProcess/WebProcessProxy.cpp
r240279 r240280 35 35 #include "PluginInfoStore.h" 36 36 #include "PluginProcessManager.h" 37 #include "ProvisionalPageProxy.h" 37 38 #include "TextChecker.h" 38 39 #include "TextCheckerState.h" … … 585 586 #endif 586 587 588 bool 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 587 597 void WebProcessProxy::updateBackForwardItem(const BackForwardListItemState& itemState) 588 598 { … … 592 602 // e.g. The old web process is navigating to about:blank for suspension. 593 603 // We ignore these updates. 594 if (m_pageMap.contains(item->pageID()) )604 if (m_pageMap.contains(item->pageID()) || hasProvisionalPageWithID(item->pageID())) 595 605 item->setPageState(itemState.pageState); 596 606 } … … 695 705 696 706 auto pages = copyToVectorOf<RefPtr<WebPageProxy>>(m_pageMap.values()); 707 auto provisionalPages = WTF::map(m_provisionalPages, [](auto* provisionalPage) { return makeWeakPtr(provisionalPage); }); 697 708 698 709 shutDown(); … … 709 720 for (auto& page : pages) 710 721 page->processDidTerminate(ProcessTerminationReason::Crash); 722 723 for (auto& provisionalPage : provisionalPages) { 724 if (provisionalPage) 725 provisionalPage->processDidTerminate(); 726 } 711 727 } 712 728 … … 780 796 page->processDidFinishLaunching(); 781 797 } 798 799 for (auto* provisionalPage : m_provisionalPages) { 800 ASSERT(this == &provisionalPage->process()); 801 provisionalPage->processDidFinishLaunching(); 802 } 803 782 804 783 805 RELEASE_ASSERT(!m_webConnection); … … 874 896 bool WebProcessProxy::canTerminateChildProcess() 875 897 { 876 if (!m_pageMap.isEmpty() || m_processPool->hasSuspendedPageFor(*this) )898 if (!m_pageMap.isEmpty() || m_processPool->hasSuspendedPageFor(*this) || !m_provisionalPages.isEmpty()) 877 899 return false; 878 900 -
branches/safari-607-branch/Source/WebKit/UIProcess/WebProcessProxy.h
r240279 r240280 71 71 class ObjCObjectGraph; 72 72 class PageClient; 73 class ProvisionalPageProxy; 73 74 class UserMediaCaptureManagerProxy; 74 75 class VisitedLinkStore; … … 125 126 void removeWebPage(WebPageProxy&, uint64_t pageID, EndsUsingDataStore); 126 127 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 127 131 typename WebPageProxyMap::ValuesConstIteratorRange pages() const { return m_pageMap.values(); } 128 132 unsigned pageCount() const { return m_pageMap.size(); } … … 331 335 void logDiagnosticMessageForResourceLimitTermination(const String& limitKey); 332 336 337 bool hasProvisionalPageWithID(uint64_t pageID) const; 338 333 339 enum class IsWeak { No, Yes }; 334 340 template<typename T> class WeakOrStrongPtr { … … 374 380 WebPageProxyMap m_pageMap; 375 381 WebFrameProxyMap m_frameMap; 382 HashSet<ProvisionalPageProxy*> m_provisionalPages; 376 383 UserInitiatedActionMap m_userInitiatedActionMap; 377 384 -
branches/safari-607-branch/Source/WebKit/WebKit.xcodeproj/project.pbxproj
r240279 r240280 3096 3096 466BC0391FA266C9002FA9C1 /* WebSWContextManagerConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebSWContextManagerConnection.h; sourceTree = "<group>"; }; 3097 3097 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>"; }; 3098 3100 46A2B6061E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BackgroundProcessResponsivenessTimer.cpp; sourceTree = "<group>"; }; 3099 3101 46A2B6071E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BackgroundProcessResponsivenessTimer.h; sourceTree = "<group>"; }; … … 7321 7323 86E67A21190F411800004AB7 /* ProcessThrottler.h */, 7322 7324 83048AE51ACA45DC0082C832 /* ProcessThrottlerClient.h */, 7325 4683569B21E81CC7006E27A3 /* ProvisionalPageProxy.cpp */, 7326 4683569A21E81CC7006E27A3 /* ProvisionalPageProxy.h */, 7323 7327 A55BA81B1BA25B1E007CD33D /* RemoteWebInspectorProxy.cpp */, 7324 7328 A55BA8191BA25B1E007CD33D /* RemoteWebInspectorProxy.h */, -
branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/WebFrame.cpp
r240279 r240280 264 264 case WebPolicyAction::Download: 265 265 return WebCore::PolicyAction::Download; 266 case WebPolicyAction::Suspend:267 break;268 266 } 269 267 ASSERT_NOT_REACHED(); … … 273 271 void WebFrame::didReceivePolicyDecision(uint64_t listenerID, WebPolicyAction action, uint64_t navigationID, DownloadID downloadID, Optional<WebsitePoliciesData>&& websitePolicies) 274 272 { 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) 278 274 return; 279 }280 275 281 276 FramePolicyFunction function = WTFMove(m_policyFunction); … … 293 288 } 294 289 295 bool shouldSuspend = false;296 if (action == WebPolicyAction::Suspend) {297 shouldSuspend = true;298 action = WebPolicyAction::Ignore;299 }300 301 290 function(toPolicyAction(action)); 302 303 if (shouldSuspend)304 page()->suspendForProcessSwap();305 291 } 306 292 -
branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp
r240279 r240280 403 403 , m_cpuLimit(parameters.cpuLimit) 404 404 #if PLATFORM(MAC) 405 , m_shouldAttachDrawingAreaOnPageTransition(parameters.is SwapFromSuspended)405 , m_shouldAttachDrawingAreaOnPageTransition(parameters.isProcessSwap) 406 406 #endif 407 407 { … … 473 473 m_drawingArea->setShouldScaleViewToFitDocument(parameters.shouldScaleViewToFitDocument); 474 474 475 if (parameters.is SwapFromSuspended)476 freezeLayerTree(LayerTreeFreezeReason:: SwapFromSuspended);475 if (parameters.isProcessSwap) 476 freezeLayerTree(LayerTreeFreezeReason::ProcessSwap); 477 477 478 478 #if ENABLE(ASYNC_SCROLLING) … … 698 698 m_drawingArea->setPaintingEnabled(true); 699 699 #if PLATFORM(MAC) 700 m_shouldAttachDrawingAreaOnPageTransition = parameters.is SwapFromSuspended;700 m_shouldAttachDrawingAreaOnPageTransition = parameters.isProcessSwap; 701 701 #endif 702 702 unfreezeLayerTree(LayerTreeFreezeReason::PageSuspended); … … 3057 3057 if (!frame) 3058 3058 return; 3059 if (policyAction == WebPolicyAction::Suspend) {3060 ASSERT(frame == m_mainFrame);3061 setIsSuspended(true);3062 3063 WebProcess::singleton().sendPrewarmInformation(mainWebFrame()->url());3064 }3065 3059 frame->didReceivePolicyDecision(listenerID, policyAction, navigationID, downloadID, WTFMove(websitePolicies)); 3066 3060 } … … 3104 3098 bool isInitialEmptyDocument = !m_mainFrame; 3105 3099 if (!isInitialEmptyDocument) 3106 unfreezeLayerTree(LayerTreeFreezeReason:: SwapFromSuspended);3100 unfreezeLayerTree(LayerTreeFreezeReason::ProcessSwap); 3107 3101 3108 3102 #if PLATFORM(MAC) … … 6316 6310 // Unfrozen on drawing area reset. 6317 6311 freezeLayerTree(LayerTreeFreezeReason::PageSuspended); 6312 6313 WebProcess::singleton().sendPrewarmInformation(mainWebFrame()->url()); 6314 6315 suspendForProcessSwap(); 6318 6316 } else 6319 6317 m_shouldResetDrawingAreaAfterSuspend = true; -
branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/WebPage.h
r240279 r240280 697 697 PageSuspended = 1 << 3, 698 698 Printing = 1 << 4, 699 SwapFromSuspended= 1 << 5,699 ProcessSwap = 1 << 5, 700 700 }; 701 701 void freezeLayerTree(LayerTreeFreezeReason); -
branches/safari-607-branch/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm
r240279 r240280 98 98 setColorSpace(parameters.colorSpace); 99 99 100 if (!parameters.is SwapFromSuspended)100 if (!parameters.isProcessSwap) 101 101 attach(); 102 102 } -
branches/safari-607-branch/Tools/ChangeLog
r240279 r240280 1 2019-01-22 Alan Coon <alancoon@apple.com> 2 3 Revert r240262. rdar://problem/47099573 4 1 5 2019-01-22 Alan Coon <alancoon@apple.com> 2 6 -
branches/safari-607-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm
r240279 r240280 1 1 /* 2 * Copyright (C) 2017 Apple Inc. All rights reserved.2 * Copyright (C) 2017-2019 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 73 73 static bool willPerformClientRedirect; 74 74 static bool didPerformClientRedirect; 75 static bool shouldConvertToDownload; 75 76 static RetainPtr<NSURL> clientRedirectSourceURL; 76 77 static RetainPtr<NSURL> clientRedirectDestinationURL; … … 127 128 decisionHandler(WKNavigationActionPolicyAllow); 128 129 didRepondToPolicyDecisionCall = true; 130 } 131 132 - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler 133 { 134 decisionHandler(shouldConvertToDownload ? _WKNavigationResponsePolicyBecomeDownload : WKNavigationResponsePolicyAllow); 129 135 } 130 136 … … 1406 1412 EXPECT_FALSE(serverRedirected); 1407 1413 EXPECT_EQ(3, numberOfDecidePolicyCalls); 1408 EXPECT_EQ( 2u, seenPIDs.size());1414 EXPECT_EQ(3u, seenPIDs.size()); 1409 1415 } 1410 1416 … … 1466 1472 1467 1473 EXPECT_WK_STREQ(@"pson://www.webkit.org/main1.html", [[webView URL] absoluteString]); 1474 } 1475 1476 static 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 1482 TEST(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 1536 TEST(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; 1468 1577 } 1469 1578 … … 2233 2342 EXPECT_EQ(7u, [receivedMessages count]); 2234 2343 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 } 2241 2365 } 2242 2366 … … 2308 2432 EXPECT_EQ(7u, [receivedMessages count]); 2309 2433 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 } 2316 2455 } 2317 2456
Note:
See TracChangeset
for help on using the changeset viewer.