Changeset 239993 in webkit
- Timestamp:
- Jan 15, 2019, 11:01:43 AM (8 years ago)
- Location:
- trunk
- 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
-
trunk/LayoutTests/ChangeLog
r239991 r239993 1 2019-01-15 Chris Dumez <cdumez@apple.com> 2 3 Regression(PSON) View becomes blank after click a cross-site download link 4 https://bugs.webkit.org/show_bug.cgi?id=193361 5 <rdar://problem/47099573> 6 7 Reviewed by Geoff Garen. 8 9 Skip test testing the cross-process DOMWindow API as I broke it with this patch. 10 The feature is far from ready and off by default anyway. I will add support back 11 in a follow-up. 12 13 * platform/wk2/TestExpectations: 14 1 15 2019-01-15 Zalan Bujtas <zalan@apple.com> 2 16 -
trunk/LayoutTests/platform/wk2/TestExpectations
r239337 r239993 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. -
trunk/Source/WebCore/ChangeLog
r239991 r239993 1 2019-01-15 Chris Dumez <cdumez@apple.com> 2 3 Regression(PSON) View becomes blank after click a cross-site download link 4 https://bugs.webkit.org/show_bug.cgi?id=193361 5 <rdar://problem/47099573> 6 7 Reviewed by Geoff Garen. 8 9 * loader/FrameLoader.cpp: 10 (WebCore::FrameLoader::commitProvisionalLoad): 11 When restoring from PageCache, make sure we notify the client that the load was committed 12 *before* we tell it that the navigation is complete. This would confuse the ProvisionalPageProxy 13 logic in the UIProcess. 14 1 15 2019-01-15 Zalan Bujtas <zalan@apple.com> 2 16 -
trunk/Source/WebCore/loader/FrameLoader.cpp
r239726 r239993 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) -
trunk/Source/WebKit/ChangeLog
r239988 r239993 1 2019-01-15 Chris Dumez <cdumez@apple.com> 2 3 Regression(PSON) View becomes blank after click a cross-site download link 4 https://bugs.webkit.org/show_bug.cgi?id=193361 5 <rdar://problem/47099573> 6 7 Reviewed by Geoff Garen. 8 9 The issue tracked by rdar://problem/47099573 is that a provisional load may get 10 canceled (or converted into a download) *after* we've decided to process-swap. 11 In such cases, the view should keep displaying the current site and it should 12 still be interactive. However, with the previous PSON model, the view (pageProxy) 13 would have already swapped to the new process and would end up displaying the 14 initially empty document. 15 16 To address the issue, this patch introduces the concept of a provisional load 17 in the UIProcess, handled by a ProvisionalPageProxy which has its own privisional 18 process. The WebPageProxy owns the ProvisionalPageProxy but we do not commit the 19 provisional page until after the load was committed in the new process. This means 20 that the view / WebPageProxy keeps using the old process and displays the current 21 content until a load has committed in the provisional page. If no load commits 22 in the provisional process (e.g. because the load is cancelled or converted into 23 a download), then we merely destroy the ProvisionalPageProxy and terminate its 24 process, without impacting the WebPageProxy. 25 26 * Shared/WebPageCreationParameters.cpp: 27 (WebKit::WebPageCreationParameters::encode const): 28 (WebKit::WebPageCreationParameters::decode): 29 * Shared/WebPageCreationParameters.h: 30 Rename isSwapFromSuspended to isProcessSwap for clarity as we always want to 31 delay attaching the drawing area in case of a process-swap, no matter what 32 now that the previous process is kept alive until the provisional load is 33 committed in the new process. 34 35 * Shared/WebPolicyAction.h: 36 Drop Suspend policy action. At decidePolicyForNavigationAction time, in case of 37 process-swap, we now tell the previous process to simply ignore the load, while 38 we create a ProvisionalPageProxy to do the new load in a new process. 39 Suspension of the previous page in the old process, happens later, when a load 40 is actually committed in the new process. 41 42 * Sources.txt: 43 Add new ProvisionalPageProxy file. 44 45 * UIProcess/API/Cocoa/WKWebView.mm: 46 (-[WKWebView _killWebContentProcessAndResetState]): 47 When calling _killWebContentProcessAndResetState on a WKWebView, kill both the current 48 process and the provisional one, to maintain previous behavior in our API tests. 49 50 * UIProcess/PageClient.h: 51 Tiny build fix. 52 53 * UIProcess/ProvisionalPageProxy.cpp: Added. 54 (WebKit::ProvisionalPageProxy::ProvisionalPageProxy): 55 (WebKit::ProvisionalPageProxy::~ProvisionalPageProxy): 56 (WebKit::ProvisionalPageProxy::takeDrawingArea): 57 (WebKit::ProvisionalPageProxy::cancel): 58 (WebKit::ProvisionalPageProxy::initializeWebPage): 59 (WebKit::ProvisionalPageProxy::loadDataWithNavigation): 60 (WebKit::ProvisionalPageProxy::loadRequestWithNavigation): 61 (WebKit::ProvisionalPageProxy::goToBackForwardItem): 62 (WebKit::ProvisionalPageProxy::didCreateMainFrame): 63 (WebKit::ProvisionalPageProxy::didStartProvisionalLoadForFrame): 64 (WebKit::ProvisionalPageProxy::didFailProvisionalLoadForFrame): 65 (WebKit::ProvisionalPageProxy::didCommitLoadForFrame): 66 (WebKit::ProvisionalPageProxy::didReceiveMessage): 67 (WebKit::ProvisionalPageProxy::didReceiveSyncMessage): 68 * UIProcess/ProvisionalPageProxy.h: Added. 69 (WebKit::ProvisionalPageProxy::page): 70 (WebKit::ProvisionalPageProxy::mainFrame const): 71 (WebKit::ProvisionalPageProxy::process): 72 (WebKit::ProvisionalPageProxy::processSwapRequestedByClient const): 73 (WebKit::ProvisionalPageProxy::navigationID const): 74 Add new ProvisionalPageProxy class to wrap the provisional load in the new process 75 after a swap. The provisional page is owned by the WebPageProxy and we only commit 76 the provisional page when the load is committed. Until then, the WebPageProxy keeps 77 using the old process and displaying the current content. 78 79 * UIProcess/SuspendedPageProxy.cpp: 80 (WebKit::SuspendedPageProxy::~SuspendedPageProxy): 81 (WebKit::SuspendedPageProxy::unsuspend): 82 (WebKit::SuspendedPageProxy::didProcessRequestToSuspend): 83 Unregister the SuspendedPageProxy as an IPC message receiver a little bit earlier 84 when we're going to unsuspend it. This avoids conflicting with the ProvisionalPageProxy 85 which tries to register itself as an IPC message receiver for the same pageID when 86 a process-swap occurs and we're switching to a suspended page. 87 88 * UIProcess/WebFrameProxy.cpp: 89 (WebKit::WebFrameProxy::isMainFrame const): 90 WebFrameProxy::isMainFrame() relies on checking that the frame is the WebPageProxy's m_mainFrame. 91 Now that the WebPageProxy can have a ProvisionalPageProxy, also check if it is the ProvisionalPageProxy's 92 m_mainFrame to maintain previous behavior. 93 94 * UIProcess/WebPageProxy.cpp: 95 (WebKit::WebPageProxy::swapToWebProcess): 96 swapToWebProcess() no longer takes care of unsuspending the SuspendedPage because we now call swapToWebProcess() 97 later, when a load is actually committed in the provisional page / process. swapToWebProcess() now also needs 98 to initialize some data members such as the drawing area and the main frame as it is transferring them over from 99 the ProvisionalPageProxy which started the provisional load. 100 101 (WebKit::WebPageProxy::finishAttachingToWebProcess): 102 We no longer need IsSwapFromSuspended parameter as this is called later now, after a load has actually been 103 committed in the provisional process. 104 105 (WebKit::WebPageProxy::initializeWebPage): 106 - We no longer need IsSwapFromSuspended parameter as this is called later now, after a load has actually been 107 committed in the provisional process. 108 - Factor some code out to WebPageProxy::setDrawingArea() so that it can be shared with swapToWebProcess(). 109 110 (WebKit::WebPageProxy::loadRequestWithNavigation): 111 Only call setPendingAPIRequestURL() in loadRequestWithNavigation() only if ShouldTreatAsContinuingLoad is not 112 Yes. This avoids hitting some assertions as this was already called during the first API call if needed. 113 114 (WebKit::WebPageProxy::receivedNavigationPolicyDecision): 115 In case of process swap, tell the previous process to ignore the load instead of suspending it right away. 116 Suspension now happens later, only if we end up committing the provisional load in the new process. 117 Also discard the SuspendedPage if it failed to suspend (we only reuse its process in this case). This used 118 to happen a bit later but it is clearer if we do this as early as possible I think. 119 120 (WebKit::WebPageProxy::commitProvisionalPage): 121 When the load is committed in the new process, we call WebPageProxy::commitProvisionalPage(). It takes care of: 122 - Actually swapping the WebPageProxy to the new process by calling processDidTerminate() / swapToWebProcess(). 123 - Suspending the current page. 124 - Letting the client know the load is comitted 125 - Destroy the ProvisionalPageProxy. 126 This work used to happen earlier in continueNavigationInNewProcess(). 127 128 (WebKit::WebPageProxy::continueNavigationInNewProcess): 129 Moved some of the logic to commitProvisionalPage(). We now merely start the load in a new ProvisionalPageProxy, 130 without actually having the WebPageProxy switch to the new process yet. 131 132 (WebKit::WebPageProxy::didCreateMainFrame): 133 (WebKit::WebPageProxy::didCreateWindow): 134 Drop some code that is no longer needed, now that the ProvisionalPageProxy takes care of this. 135 136 (WebKit::WebPageProxy::didDestroyNavigation): 137 On process-swap, when telling the previous process to ignore the load and starting the new load in a new 138 ProvisionalPageProxy, the previous WebPage attempts to destroy the navigation. In this case, we ignore 139 the call since the navigation is merely taken over by the ProvisionalPageProxy. 140 141 (WebKit::WebPageProxy::didStartProvisionalLoadForFrame): 142 Moved some PSON logic to the ProvisionalPageProxy instead. 143 144 (WebKit::WebPageProxy::didFailProvisionalLoadForFrame): 145 When didFailProvisionalLoadForFrame() is called for a ProvisionalPageProxy, destroy it. 146 147 (WebKit::WebPageProxy::decidePolicyForNavigationActionAsync): 148 (WebKit::WebPageProxy::decidePolicyForResponse): 149 Capture the process in the lambda, to make sure we send the policy decision to the same process that 150 asked for it, so as to not get confused by process swaps. 151 152 (WebKit::WebPageProxy::resetState): 153 Drop some code that is no longer needed. 154 155 (WebKit::WebPageProxy::creationParameters): 156 Move the hasRegisteredServiceWorkers flag initialization from the call site to here now that we have 157 more than one call site. This was just some bad factoring. 158 159 (WebKit::WebPageProxy::PageProcessOverride::PageProcessOverride): 160 (WebKit::WebPageProxy::PageProcessOverride::~PageProcessOverride): 161 * UIProcess/WebPageProxy.h: 162 (WebKit::WebPageProxy::temporarilyOverrideProcess): 163 Add utility class to temporarily override the WebPageProxy's m_process with the provisional one when 164 the ProvisionalPageProxy interacts with the WebPageProxy. 165 166 * UIProcess/WebProcessProxy.cpp: 167 (WebKit::WebProcessProxy::hasProvisionalPageWithID const): 168 (WebKit::WebProcessProxy::updateBackForwardItem): 169 Before updating a BackForwardListItem, we normally make sure the process has a WebPageProxy with the 170 item's pageID. We have to tweak the logic because there may now be no WebPageProxy with this pageID 171 associated with this process yet, because it is still a ProvisionalPageProxy. 172 173 (WebKit::WebProcessProxy::canTerminateChildProcess): 174 Do not terminate the WebProcess if there are ProvisionalPageProxy objects using it. 175 176 * UIProcess/WebProcessProxy.h: 177 (WebKit::WebProcessProxy::addProvisionalPageProxy): 178 (WebKit::WebProcessProxy::removeProvisionalPageProxy): 179 180 * WebKit.xcodeproj/project.pbxproj: 181 182 * WebProcess/WebPage/WebFrame.cpp: 183 (WebKit::toPolicyAction): 184 (WebKit::WebFrame::didReceivePolicyDecision): 185 Stop dealing with WebPolicyAction::Suspend as it no longer exists. 186 187 * WebProcess/WebPage/WebPage.cpp: 188 (WebKit::WebPage::reinitializeWebPage): 189 (WebKit::WebPage::didReceivePolicyDecision): 190 191 (WebKit::WebPage::setIsSuspended): 192 Suspend the Page when setIsSuspended(true) is called, now that there is no longer a WebPolicyAction::Suspend. 193 setIsSuspended(true) IPC is sent when we actually commit the provisional page. 194 195 * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: 196 (WebKit::TiledCoreAnimationDrawingArea::TiledCoreAnimationDrawingArea): 197 1 198 2019-01-15 Brian Burg <bburg@apple.com> 2 199 -
trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp
r239777 r239993 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 -
trunk/Source/WebKit/Shared/WebPageCreationParameters.h
r239777 r239993 130 130 131 131 bool controlledByAutomation; 132 bool is SwapFromSuspended{ false };132 bool isProcessSwap { false }; 133 133 134 134 #if PLATFORM(MAC) -
trunk/Source/WebKit/Shared/WebPolicyAction.h
r239219 r239993 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 }; -
trunk/Source/WebKit/Sources.txt
r239815 r239993 231 231 UIProcess/ProcessAssertion.cpp 232 232 UIProcess/ProcessThrottler.cpp 233 UIProcess/ProvisionalPageProxy.cpp 233 234 UIProcess/RemoteWebInspectorProxy.cpp 234 235 UIProcess/ResponsivenessTimer.cpp -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm
r239931 r239993 45 45 #import "ObjCObjectGraph.h" 46 46 #import "PageClient.h" 47 #import "ProvisionalPageProxy.h" 47 48 #import "RemoteLayerTreeScrollingPerformanceData.h" 48 49 #import "RemoteLayerTreeTransaction.h" … … 4701 4702 Ref<WebKit::WebProcessProxy> protectedProcessProxy(_page->process()); 4702 4703 protectedProcessProxy->requestTermination(WebKit::ProcessTerminationReason::RequestedByClient); 4704 4705 if (auto* provisionalPageProxy = _page->provisionalPageProxy()) { 4706 Ref<WebKit::WebProcessProxy> protectedProcessProxy(provisionalPageProxy->process()); 4707 protectedProcessProxy->requestTermination(WebKit::ProcessTerminationReason::RequestedByClient); 4708 } 4703 4709 } 4704 4710 -
trunk/Source/WebKit/UIProcess/PageClient.h
r239843 r239993 49 49 OBJC_CLASS CALayer; 50 50 OBJC_CLASS NSFileWrapper; 51 OBJC_CLASS NSMenu; 51 52 OBJC_CLASS NSSet; 52 53 OBJC_CLASS WKDrawingView; -
trunk/Source/WebKit/UIProcess/SuspendedPageProxy.cpp
r239437 r239993 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) -
trunk/Source/WebKit/UIProcess/WebFrameProxy.cpp
r239219 r239993 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 -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r239881 r239993 78 78 #include "PluginProcessManager.h" 79 79 #include "PrintInfo.h" 80 #include "ProvisionalPageProxy.h" 80 81 #include "SafeBrowsingWarning.h" 81 82 #include "ShareSheetCallbackID.h" … … 546 547 } 547 548 549 DrawingAreaProxy* WebPageProxy::drawingArea() const 550 { 551 if (m_provisionalPage && m_process.ptr() == &m_provisionalPage->process() && m_provisionalPage->drawingArea()) 552 return m_provisionalPage->drawingArea(); 553 return m_drawingArea.get(); 554 } 555 548 556 void WebPageProxy::changeWebsiteDataStore(WebsiteDataStore& websiteDataStore) 549 557 { … … 769 777 } 770 778 771 void WebPageProxy::swapToWebProcess(Ref<WebProcessProxy>&& process, std::unique_ptr< SuspendedPageProxy>&& destinationSuspendedPage, IsSwapFromSuspended isSwapFromSuspended)779 void WebPageProxy::swapToWebProcess(Ref<WebProcessProxy>&& process, std::unique_ptr<DrawingAreaProxy>&& drawingArea, RefPtr<WebFrameProxy>&& mainFrame) 772 780 { 773 781 ASSERT(!m_isClosed); … … 775 783 776 784 m_process = WTFMove(process); 785 ASSERT(!m_drawingArea); 786 setDrawingArea(WTFMove(drawingArea)); 787 ASSERT(!m_mainFrame); 788 m_mainFrame = WTFMove(mainFrame); 777 789 m_isValid = true; 778 779 // If we are reattaching to a SuspendedPage, then the WebProcess' WebPage already exists and780 // WebPageProxy::didCreateMainFrame() will not be called to initialize m_mainFrame. In such781 // case, we need to initialize m_mainFrame to reflect the fact the the WebProcess' WebPage782 // already exists and already has a main frame.783 if (destinationSuspendedPage) {784 if (!destinationSuspendedPage->failedToSuspend()) {785 ASSERT(!m_mainFrame);786 ASSERT(&destinationSuspendedPage->process() == m_process.ptr());787 destinationSuspendedPage->unsuspend();788 m_mainFrame = WebFrameProxy::create(*this, destinationSuspendedPage->mainFrameID());789 m_process->frameCreated(destinationSuspendedPage->mainFrameID(), *m_mainFrame);790 } else {791 // We failed to suspend the page so destroy it now and merely reuse its WebContent process.792 destinationSuspendedPage = nullptr;793 }794 }795 790 796 791 m_process->addExistingWebPage(*this, m_pageID, WebProcessProxy::BeginsUsingDataStore::No); 797 792 m_process->addMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_pageID, *this); 798 793 799 finishAttachingToWebProcess(isSwapFromSuspended); 800 } 801 802 void WebPageProxy::finishAttachingToWebProcess(IsSwapFromSuspended isSwapFromSuspended) 794 // No need to initialize the WebPage since it was created when we created the ProvisionalPageProxy. 795 finishAttachingToWebProcess(ShouldInitializeWebPage::No); 796 } 797 798 void WebPageProxy::finishAttachingToWebProcess(ShouldInitializeWebPage shouldInitializePage) 803 799 { 804 800 ASSERT(m_process->state() != ChildProcessProxy::State::Terminated); … … 836 832 #endif 837 833 838 initializeWebPage(isSwapFromSuspended); 834 if (shouldInitializePage == ShouldInitializeWebPage::Yes) 835 initializeWebPage(); 839 836 840 837 m_inspector->updateForNewPageProcess(this); … … 901 898 } 902 899 903 void WebPageProxy::initializeWebPage(IsSwapFromSuspended isSwapFromSuspended) 904 { 905 ASSERT(isValid()); 906 907 m_drawingArea = pageClient().createDrawingAreaProxy(); 908 ASSERT(m_drawingArea); 900 void WebPageProxy::setDrawingArea(std::unique_ptr<DrawingAreaProxy>&& drawingArea) 901 { 902 m_drawingArea = WTFMove(drawingArea); 903 if (!m_drawingArea) 904 return; 909 905 910 906 #if ENABLE(ASYNC_SCROLLING) && PLATFORM(COCOA) … … 917 913 } 918 914 #endif 919 920 auto parameters = creationParameters(); 921 parameters.isSwapFromSuspended = isSwapFromSuspended == IsSwapFromSuspended::Yes; 922 923 #if ENABLE(SERVICE_WORKER) 924 parameters.hasRegisteredServiceWorkers = process().processPool().mayHaveRegisteredServiceWorkers(m_websiteDataStore); 925 #endif 926 927 process().send(Messages::WebProcess::CreateWebPage(m_pageID, parameters), 0); 915 } 916 917 void WebPageProxy::initializeWebPage() 918 { 919 ASSERT(isValid()); 920 921 setDrawingArea(pageClient().createDrawingAreaProxy()); 922 ASSERT(m_drawingArea); 923 924 process().send(Messages::WebProcess::CreateWebPage(m_pageID, creationParameters()), 0); 928 925 929 926 m_needsToFinishInitializingWebPageAfterProcessLaunch = true; … … 1077 1074 1078 1075 auto url = request.url(); 1079 m_pageLoadState.setPendingAPIRequestURL(transaction, url); 1076 if (shouldTreatAsContinuingLoad != ShouldTreatAsContinuingLoad::Yes) 1077 m_pageLoadState.setPendingAPIRequestURL(transaction, url); 1080 1078 1081 1079 if (!isValid()) … … 1295 1293 1296 1294 m_process->send(Messages::WebPage::StopLoading(), m_pageID); 1295 if (m_provisionalPage) { 1296 m_provisionalPage->cancel(); 1297 m_provisionalPage = nullptr; 1298 } 1297 1299 m_process->responsivenessTimer().start(); 1298 1300 } … … 2699 2701 2700 2702 if (processForNavigation.ptr() != &process()) { 2701 policyAction = isPageOpenedByDOMShowingInitialEmptyDocument() ? WebPolicyAction::Ignore : WebPolicyAction::Suspend;2703 policyAction = WebPolicyAction::Ignore; 2702 2704 RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "decidePolicyForNavigationAction, swapping process %i with process %i for navigation, reason: %{public}s", processIdentifier(), processForNavigation->processIdentifier(), reason.utf8().data()); 2703 2705 LOG(ProcessSwapping, "(ProcessSwapping) Switching from process %i to new process (%i) for navigation %" PRIu64 " '%s'", processIdentifier(), processForNavigation->processIdentifier(), navigation->navigationID(), navigation->loggingString()); … … 2708 2710 receivedPolicyDecision(policyAction, navigation.ptr(), shouldProcessSwap ? WTF::nullopt : WTFMove(data), WTFMove(sender)); 2709 2711 2710 if (shouldProcessSwap) 2711 continueNavigationInNewProcess(navigation, destinationSuspendedPage ? process().processPool().takeSuspendedPage(*destinationSuspendedPage) : nullptr, WTFMove(processForNavigation), processSwapRequestedByClient, WTFMove(data)); 2712 if (!shouldProcessSwap) 2713 return; 2714 2715 auto suspendedPage = destinationSuspendedPage ? process().processPool().takeSuspendedPage(*destinationSuspendedPage) : nullptr; 2716 if (suspendedPage && suspendedPage->failedToSuspend()) 2717 suspendedPage = nullptr; 2718 2719 continueNavigationInNewProcess(navigation, WTFMove(suspendedPage), WTFMove(processForNavigation), processSwapRequestedByClient, WTFMove(data)); 2712 2720 }); 2713 2721 } … … 2745 2753 } 2746 2754 2747 void WebPageProxy::continueNavigationInNewProcess(API::Navigation& navigation, std::unique_ptr<SuspendedPageProxy>&& suspendedPageProxy, Ref<WebProcessProxy>&& process, ProcessSwapRequestedByClient processSwapRequestedByClient, Optional<WebsitePoliciesData>&& websitePolicies) 2755 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) 2756 { 2757 ASSERT(m_provisionalPage); 2758 RELEASE_LOG_IF_ALLOWED(Loading, "commitProvisionalPage: previousPID = %i, newPID = %i, pageID = %" PRIu64, m_process->processIdentifier(), m_provisionalPage->process().processIdentifier(), m_pageID); 2759 2760 Optional<uint64_t> mainFrameIDInPreviousProcess = m_mainFrame ? makeOptional(m_mainFrame->frameID()) : WTF::nullopt; 2761 2762 ASSERT(m_process.ptr() != &m_provisionalPage->process()); 2763 2764 processDidTerminate(ProcessTerminationReason::NavigationSwap); 2765 2766 m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_pageID); 2767 auto* navigation = navigationState().navigation(m_provisionalPage->navigationID()); 2768 bool didSuspendPreviousPage = navigation ? suspendCurrentPageIfPossible(*navigation, mainFrameIDInPreviousProcess, m_provisionalPage->processSwapRequestedByClient()) : false; 2769 m_process->removeWebPage(*this, m_pageID, WebProcessProxy::EndsUsingDataStore::No); 2770 2771 // There is no way we'll be able to return to the page in the previous page so close it. 2772 if (!didSuspendPreviousPage) 2773 m_process->send(Messages::WebPage::Close(), pageID()); 2774 2775 swapToWebProcess(m_provisionalPage->process(), m_provisionalPage->takeDrawingArea(), m_provisionalPage->mainFrame()); 2776 2777 didCommitLoadForFrame(frameID, navigationID, mimeType, frameHasCustomContentProvider, frameLoadType, certificateInfo, containsPluginDocument, forcedHasInsecureContent, userData); 2778 2779 m_provisionalPage = nullptr; 2780 } 2781 2782 void WebPageProxy::continueNavigationInNewProcess(API::Navigation& navigation, std::unique_ptr<SuspendedPageProxy>&& suspendedPageProxy, Ref<WebProcessProxy>&& newProcess, ProcessSwapRequestedByClient processSwapRequestedByClient, Optional<WebsitePoliciesData>&& websitePolicies) 2748 2783 { 2749 2784 RELEASE_LOG_IF_ALLOWED(Loading, "continueNavigationInNewProcess: webPID = %i, pageID = %" PRIu64, m_process->processIdentifier(), m_pageID); 2750 2785 LOG(Loading, "Continuing navigation %" PRIu64 " '%s' in a new web process", navigation.navigationID(), navigation.loggingString()); 2751 2786 2752 Ref<WebProcessProxy> previousProcess = m_process.copyRef(); 2753 Optional<uint64_t> mainFrameIDInPreviousProcess = m_mainFrame ? makeOptional(m_mainFrame->frameID()) : WTF::nullopt; 2754 auto mainFrameURL = m_mainFrame ? m_mainFrame->url() : URL(); 2755 2756 ASSERT(m_process.ptr() != process.ptr()); 2757 2758 processDidTerminate(ProcessTerminationReason::NavigationSwap); 2759 2760 m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_pageID); 2761 bool didSuspendPreviousPage = suspendCurrentPageIfPossible(navigation, mainFrameIDInPreviousProcess, processSwapRequestedByClient); 2762 m_process->removeWebPage(*this, m_pageID, WebProcessProxy::EndsUsingDataStore::No); 2763 2764 swapToWebProcess(WTFMove(process), WTFMove(suspendedPageProxy), didSuspendPreviousPage ? IsSwapFromSuspended::Yes : IsSwapFromSuspended::No); 2787 if (m_provisionalPage) { 2788 if (m_provisionalPage->navigationID() != navigation.navigationID()) 2789 m_provisionalPage->cancel(); 2790 m_provisionalPage = nullptr; 2791 } 2792 2793 m_provisionalPage = std::make_unique<ProvisionalPageProxy>(*this, newProcess.copyRef(), WTFMove(suspendedPageProxy), navigation.navigationID(), navigation.currentRequestIsRedirect(), navigation.currentRequest(), processSwapRequestedByClient); 2765 2794 2766 2795 if (auto* item = navigation.targetItem()) { … … 2770 2799 m_pageLoadState.setPendingAPIRequestURL(transaction, item->url()); 2771 2800 2772 auto itemStates = m_backForwardList->filteredItemStates([this, targetItem = item](WebBackForwardListItem& item) { 2773 if (auto* page = item.suspendedPage()) { 2774 if (&page->process() == m_process.ptr()) 2775 return false; 2776 } 2777 return &item != targetItem; 2778 }); 2779 m_process->send(Messages::WebPage::UpdateBackForwardListForReattach(WTFMove(itemStates)), m_pageID); 2780 m_process->send(Messages::WebPage::GoToBackForwardItem(navigation.navigationID(), item->itemID(), *navigation.backForwardFrameLoadType(), ShouldTreatAsContinuingLoad::Yes, WTFMove(websitePolicies)), m_pageID); 2781 m_process->responsivenessTimer().start(); 2782 2801 m_provisionalPage->goToBackForwardItem(navigation, *item, WTFMove(websitePolicies)); 2783 2802 return; 2784 2803 } … … 2787 2806 // 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 2788 2807 // it instead of creating a new one. 2789 m_process->send(Messages::WebPage::SetCurrentHistoryItemForReattach(m_backForwardList->currentItem()->itemState()), m_pageID);2808 newProcess->send(Messages::WebPage::SetCurrentHistoryItemForReattach(m_backForwardList->currentItem()->itemState()), m_pageID); 2790 2809 } 2791 2810 … … 2793 2812 ASSERT(!navigation.currentRequest().isEmpty()); 2794 2813 if (auto& substituteData = navigation.substituteData()) 2795 loadDataWithNavigation(navigation, { substituteData->content.data(), substituteData->content.size() }, substituteData->MIMEType, substituteData->encoding, substituteData->baseURL, substituteData->userData.get(), ShouldTreatAsContinuingLoad::Yes, WTFMove(websitePolicies));2814 m_provisionalPage->loadDataWithNavigation(navigation, { substituteData->content.data(), substituteData->content.size() }, substituteData->MIMEType, substituteData->encoding, substituteData->baseURL, substituteData->userData.get(), WTFMove(websitePolicies)); 2796 2815 else 2797 loadRequestWithNavigation(navigation, ResourceRequest { navigation.currentRequest() }, WebCore::ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes, nullptr, ShouldTreatAsContinuingLoad::Yes, WTFMove(websitePolicies)); 2798 2799 ASSERT(!m_mainFrame); 2800 m_mainFrameCreationHandler = [this, weakThis = makeWeakPtr(*this), navigationID = navigation.navigationID(), request = navigation.currentRequest(), mainFrameURL, isServerRedirect = navigation.currentRequestIsRedirect()]() mutable { 2801 if (!weakThis) 2802 return; 2803 2804 ASSERT(m_mainFrame); 2805 // This navigation was destroyed so no need to notify of redirect. 2806 if (!navigationState().navigation(navigationID)) 2807 return; 2808 2809 // Restore the main frame's committed URL as some clients may rely on it until the next load is committed. 2810 m_mainFrame->frameLoadState().setURL(mainFrameURL); 2811 2812 // Normally, notification of a server redirect comes from the WebContent process. 2813 // If we are process swapping in response to a server redirect then that notification will not come from the new WebContent process. 2814 // In this case we have the UIProcess synthesize the redirect notification at the appropriate time. 2815 if (isServerRedirect) { 2816 m_mainFrame->frameLoadState().didStartProvisionalLoad(request.url()); 2817 didReceiveServerRedirectForProvisionalLoadForFrame(m_mainFrame->frameID(), navigationID, WTFMove(request), { }); 2818 } 2819 }; 2820 2821 if (!m_process->processPool().configuration().processSwapsOnWindowOpenWithOpener() || !isPageOpenedByDOMShowingInitialEmptyDocument() || !mainFrameIDInPreviousProcess) { 2822 // There is no way we'll be able to return to the page in the previous page so close it. 2823 if (!didSuspendPreviousPage) 2824 previousProcess->send(Messages::WebPage::Close(), m_pageID); 2825 return; 2826 } 2827 2828 m_mainFrameWindowCreationHandler = [this, previousProcess = WTFMove(previousProcess), mainFrameIDInPreviousProcess = *mainFrameIDInPreviousProcess](const GlobalWindowIdentifier& windowIdentifier) { 2829 ASSERT(m_mainFrame); 2830 GlobalFrameIdentifier navigatedFrameIdentifierInNewProcess { pageID(), m_mainFrame->frameID() }; 2831 previousProcess->send(Messages::WebPage::FrameBecameRemote(mainFrameIDInPreviousProcess, navigatedFrameIdentifierInNewProcess, windowIdentifier), pageID()); 2832 }; 2816 m_provisionalPage->loadRequestWithNavigation(navigation, ResourceRequest { navigation.currentRequest() }, WebCore::ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes, nullptr, WTFMove(websitePolicies)); 2833 2817 } 2834 2818 … … 3695 3679 // Add the frame to the process wide map. 3696 3680 m_process->frameCreated(frameID, *m_mainFrame); 3697 3698 if (m_mainFrameCreationHandler) {3699 m_mainFrameCreationHandler();3700 m_mainFrameCreationHandler = nullptr;3701 }3702 3681 } 3703 3682 … … 3724 3703 void WebPageProxy::didCreateWindow(uint64_t frameID, GlobalWindowIdentifier&& windowIdentifier) 3725 3704 { 3726 if (m_mainFrame && m_mainFrame->frameID() == frameID) {3727 if (auto mainFrameWindowCreationHandler = WTFMove(m_mainFrameWindowCreationHandler))3728 mainFrameWindowCreationHandler(windowIdentifier);3729 }3730 3705 } 3731 3706 … … 3779 3754 { 3780 3755 PageClientProtector protector(pageClient()); 3756 3757 // On process-swap, the previous process tries to destroy the navigation but the provisional process is actually taking over the navigation. 3758 if (m_provisionalPage && m_provisionalPage->navigationID() == navigationID) 3759 return; 3781 3760 3782 3761 // FIXME: Message check the navigationID. … … 3796 3775 if (frame->isMainFrame() && navigationID) 3797 3776 navigation = navigationState().navigation(navigationID); 3798 3799 // If this seemingly new load is actually continuing a server redirect for a previous navigation in a new process,3800 // then we ignore this notification.3801 if (navigation && navigation->currentRequestIsRedirect()) {3802 auto navigationProcessIdentifier = navigation->currentRequestProcessIdentifier();3803 if (navigationProcessIdentifier && *navigationProcessIdentifier != m_process->coreProcessIdentifier())3804 return;3805 }3806 3777 3807 3778 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()); … … 3911 3882 3912 3883 PageClientProtector protector(pageClient()); 3884 3885 if (m_provisionalPage && m_provisionalPage->navigationID() == navigationID && &m_provisionalPage->process() != m_process.ptr()) { 3886 // The load did not fail, it is merely happening in a new provisional process. 3887 return; 3888 } 3913 3889 3914 3890 WebFrameProxy* frame = m_process->webFrame(frameID); … … 3950 3926 3951 3927 m_failingProvisionalLoadURL = { }; 3928 3929 // If the provisional page's load fails then we destroy the provisional page. 3930 if (m_provisionalPage && m_provisionalPage->mainFrame() == frame) 3931 m_provisionalPage = nullptr; 3952 3932 } 3953 3933 … … 4341 4321 MESSAGE_CHECK(frame); 4342 4322 4343 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) {4344 m_process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID);4323 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) { 4324 process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID); 4345 4325 })); 4346 4326 } … … 4576 4556 4577 4557 RefPtr<API::Navigation> navigation = navigationID ? m_navigationState->navigation(navigationID) : nullptr; 4578 auto listener = makeRef(frame->setUpPolicyListenerProxy([this, protectedThis = makeRef(*this), frameID, listenerID, navigation = WTFMove(navigation) ] (WebPolicyAction policyAction, API::WebsitePolicies*, ProcessSwapRequestedByClient processSwapRequestedByClient, RefPtr<SafeBrowsingWarning>&& safeBrowsingWarning) mutable {4558 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 { 4579 4559 // FIXME: Assert the API::WebsitePolicies* is nullptr here once clients of WKFramePolicyListenerUseWithPolicies go away. 4580 4560 RELEASE_ASSERT(processSwapRequestedByClient == ProcessSwapRequestedByClient::No); 4581 4561 ASSERT_UNUSED(safeBrowsingWarning, !safeBrowsingWarning); 4582 receivedPolicyDecision(policyAction, navigation.get(), WTF::nullopt, PolicyDecisionSender::create([this, protectedThis = WTFMove(protectedThis), frameID, listenerID ] (auto... args) {4583 m_process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID);4562 receivedPolicyDecision(policyAction, navigation.get(), WTF::nullopt, PolicyDecisionSender::create([this, protectedThis = WTFMove(protectedThis), frameID, listenerID, process = WTFMove(process)] (auto... args) { 4563 process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID); 4584 4564 })); 4585 4565 }, ShouldExpectSafeBrowsingResult::No)); … … 6401 6381 } 6402 6382 6383 void WebPageProxy::provisionalProcessDidTerminate() 6384 { 6385 ASSERT(m_provisionalPage); 6386 m_provisionalPage->cancel(); 6387 m_provisionalPage = nullptr; 6388 } 6389 6403 6390 static bool shouldReloadAfterProcessTermination(ProcessTerminationReason reason) 6404 6391 { … … 6488 6475 { 6489 6476 m_mainFrame = nullptr; 6490 m_mainFrameCreationHandler = nullptr;6491 m_mainFrameWindowCreationHandler = nullptr;6492 6477 6493 6478 #if PLATFORM(COCOA) … … 6780 6765 #endif 6781 6766 6767 #if ENABLE(SERVICE_WORKER) 6768 parameters.hasRegisteredServiceWorkers = process().processPool().mayHaveRegisteredServiceWorkers(m_websiteDataStore); 6769 #endif 6770 6782 6771 parameters.needsFontAttributes = m_needsFontAttributes; 6783 6772 … … 8541 8530 } 8542 8531 8532 WebPageProxy::PageProcessOverride::PageProcessOverride(WebPageProxy& page, WebProcessProxy& newProcess) 8533 : m_page(&page) 8534 , m_previousProcess(page.process()) 8535 { 8536 page.m_process = newProcess; 8537 } 8538 8539 WebPageProxy::PageProcessOverride::PageProcessOverride(PageProcessOverride&&) = default; 8540 8541 WebPageProxy::PageProcessOverride::~PageProcessOverride() 8542 { 8543 if (m_page) 8544 m_page->m_process = WTFMove(m_previousProcess); 8545 } 8546 8543 8547 #if ENABLE(DATA_DETECTION) 8544 8548 -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r239881 r239993 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; } … … 1416 1432 #endif 1417 1433 1434 ProvisionalPageProxy* provisionalPageProxy() const { return m_provisionalPage.get(); } 1435 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&); 1436 1437 void didStartProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, URL&&, URL&& unreachableURL, const UserData&); 1438 void didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError&, const UserData&); 1439 void didReceiveServerRedirectForProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, WebCore::ResourceRequest&&, const UserData&); 1440 1441 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); 1442 void loadRequestWithNavigation(API::Navigation&, WebCore::ResourceRequest&&, WebCore::ShouldOpenExternalURLsPolicy, API::Object* userData, WebCore::ShouldTreatAsContinuingLoad, Optional<WebsitePoliciesData>&& = WTF::nullopt); 1443 1444 // IPC::MessageReceiver 1445 // Implemented in generated WebPageProxyMessageReceiver.cpp 1446 void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override; 1447 void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) override; 1448 1418 1449 private: 1419 1450 WebPageProxy(PageClient&, WebProcessProxy&, uint64_t pageID, Ref<API::PageConfiguration>&&); … … 1440 1471 void setUserAgent(String&&); 1441 1472 1442 // IPC::MessageReceiver1443 // Implemented in generated WebPageProxyMessageReceiver.cpp1444 void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;1445 void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) override;1446 1447 1448 1473 // IPC::MessageSender 1449 1474 bool sendMessage(std::unique_ptr<IPC::Encoder>, OptionSet<IPC::SendOption>) override; … … 1467 1492 void didCreateWindow(uint64_t frameID, WebCore::GlobalWindowIdentifier&&); 1468 1493 1469 void didStartProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, URL&&, URL&& unreachableURL, const UserData&);1470 void didReceiveServerRedirectForProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, WebCore::ResourceRequest&&, const UserData&);1471 1494 void willPerformClientRedirectForFrame(uint64_t frameID, const String& url, double delay, WebCore::LockBackForwardList); 1472 1495 void didCancelClientRedirectForFrame(uint64_t frameID); 1473 1496 void didChangeProvisionalURLForFrame(uint64_t frameID, uint64_t navigationID, URL&&); 1474 void didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError&, const UserData&);1475 1497 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&); 1476 1498 void didFinishDocumentLoadForFrame(uint64_t frameID, uint64_t navigationID, const UserData&); … … 1576 1598 1577 1599 void reattachToWebProcess(); 1578 void swapToWebProcess(Ref<WebProcessProxy>&&, std::unique_ptr< SuspendedPageProxy>&&, IsSwapFromSuspended);1600 void swapToWebProcess(Ref<WebProcessProxy>&&, std::unique_ptr<DrawingAreaProxy>&&, RefPtr<WebFrameProxy>&& mainFrame); 1579 1601 void didFailToSuspendAfterProcessSwap(); 1580 1602 void didSuspendAfterProcessSwap(); 1581 1603 1582 void finishAttachingToWebProcess(IsSwapFromSuspended = IsSwapFromSuspended::No); 1604 enum class ShouldInitializeWebPage { No, Yes }; 1605 void finishAttachingToWebProcess(ShouldInitializeWebPage = ShouldInitializeWebPage::Yes); 1583 1606 1584 1607 RefPtr<API::Navigation> reattachToWebProcessForReload(); 1585 1608 RefPtr<API::Navigation> reattachToWebProcessWithItem(WebBackForwardListItem&); 1586 1587 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);1588 void loadRequestWithNavigation(API::Navigation&, WebCore::ResourceRequest&&, WebCore::ShouldOpenExternalURLsPolicy, API::Object* userData, WebCore::ShouldTreatAsContinuingLoad, Optional<WebsitePoliciesData>&& = WTF::nullopt);1589 1609 1590 1610 void requestNotificationPermission(uint64_t notificationID, const String& originString); … … 1953 1973 1954 1974 RefPtr<WebFrameProxy> m_mainFrame; 1955 Function<void()> m_mainFrameCreationHandler;1956 Function<void(const WebCore::GlobalWindowIdentifier&)> m_mainFrameWindowCreationHandler;1957 1975 1958 1976 RefPtr<WebFrameProxy> m_focusedFrame; … … 2325 2343 bool m_mayHaveUniversalFileReadSandboxExtension { false }; 2326 2344 2345 std::unique_ptr<ProvisionalPageProxy> m_provisionalPage; 2346 2327 2347 #if HAVE(PENCILKIT) 2328 2348 std::unique_ptr<EditableImageController> m_editableImageController; -
trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp
r239427 r239993 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 -
trunk/Source/WebKit/UIProcess/WebProcessProxy.h
r239427 r239993 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 -
trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj
r239841 r239993 3071 3071 466BC0391FA266C9002FA9C1 /* WebSWContextManagerConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebSWContextManagerConnection.h; sourceTree = "<group>"; }; 3072 3072 466BC03A1FA266C9002FA9C1 /* WebSWContextManagerConnection.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebSWContextManagerConnection.messages.in; sourceTree = "<group>"; }; 3073 4683569A21E81CC7006E27A3 /* ProvisionalPageProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProvisionalPageProxy.h; sourceTree = "<group>"; }; 3074 4683569B21E81CC7006E27A3 /* ProvisionalPageProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProvisionalPageProxy.cpp; sourceTree = "<group>"; }; 3073 3075 46A2B6061E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BackgroundProcessResponsivenessTimer.cpp; sourceTree = "<group>"; }; 3074 3076 46A2B6071E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BackgroundProcessResponsivenessTimer.h; sourceTree = "<group>"; }; … … 7313 7315 86E67A21190F411800004AB7 /* ProcessThrottler.h */, 7314 7316 83048AE51ACA45DC0082C832 /* ProcessThrottlerClient.h */, 7317 4683569B21E81CC7006E27A3 /* ProvisionalPageProxy.cpp */, 7318 4683569A21E81CC7006E27A3 /* ProvisionalPageProxy.h */, 7315 7319 A55BA81B1BA25B1E007CD33D /* RemoteWebInspectorProxy.cpp */, 7316 7320 A55BA8191BA25B1E007CD33D /* RemoteWebInspectorProxy.h */, -
trunk/Source/WebKit/WebProcess/WebPage/WebFrame.cpp
r239535 r239993 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 -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp
r239881 r239993 402 402 , m_cpuLimit(parameters.cpuLimit) 403 403 #if PLATFORM(MAC) 404 , m_shouldAttachDrawingAreaOnPageTransition(parameters.is SwapFromSuspended)404 , m_shouldAttachDrawingAreaOnPageTransition(parameters.isProcessSwap) 405 405 #endif 406 406 { … … 472 472 m_drawingArea->setShouldScaleViewToFitDocument(parameters.shouldScaleViewToFitDocument); 473 473 474 if (parameters.is SwapFromSuspended)475 freezeLayerTree(LayerTreeFreezeReason:: SwapFromSuspended);474 if (parameters.isProcessSwap) 475 freezeLayerTree(LayerTreeFreezeReason::ProcessSwap); 476 476 477 477 #if ENABLE(ASYNC_SCROLLING) … … 697 697 m_drawingArea->setPaintingEnabled(true); 698 698 #if PLATFORM(MAC) 699 m_shouldAttachDrawingAreaOnPageTransition = parameters.is SwapFromSuspended;699 m_shouldAttachDrawingAreaOnPageTransition = parameters.isProcessSwap; 700 700 #endif 701 701 unfreezeLayerTree(LayerTreeFreezeReason::PageSuspended); … … 3054 3054 if (!frame) 3055 3055 return; 3056 if (policyAction == WebPolicyAction::Suspend) {3057 ASSERT(frame == m_mainFrame);3058 setIsSuspended(true);3059 3060 WebProcess::singleton().sendPrewarmInformation(mainWebFrame()->url());3061 }3062 3056 frame->didReceivePolicyDecision(listenerID, policyAction, navigationID, downloadID, WTFMove(websitePolicies)); 3063 3057 } … … 3101 3095 bool isInitialEmptyDocument = !m_mainFrame; 3102 3096 if (!isInitialEmptyDocument) 3103 unfreezeLayerTree(LayerTreeFreezeReason:: SwapFromSuspended);3097 unfreezeLayerTree(LayerTreeFreezeReason::ProcessSwap); 3104 3098 3105 3099 #if PLATFORM(MAC) … … 6313 6307 // Unfrozen on drawing area reset. 6314 6308 freezeLayerTree(LayerTreeFreezeReason::PageSuspended); 6309 6310 WebProcess::singleton().sendPrewarmInformation(mainWebFrame()->url()); 6311 6312 suspendForProcessSwap(); 6315 6313 } else 6316 6314 m_shouldResetDrawingAreaAfterSuspend = true; -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.h
r239777 r239993 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); -
trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm
r239777 r239993 98 98 setColorSpace(parameters.colorSpace); 99 99 100 if (!parameters.is SwapFromSuspended)100 if (!parameters.isProcessSwap) 101 101 attach(); 102 102 } -
trunk/Tools/ChangeLog
r239991 r239993 1 2019-01-15 Chris Dumez <cdumez@apple.com> 2 3 Regression(PSON) View becomes blank after click a cross-site download link 4 https://bugs.webkit.org/show_bug.cgi?id=193361 5 <rdar://problem/47099573> 6 7 Reviewed by Geoff Garen. 8 9 Add API test coverage. 10 11 * TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm: 12 (-[PSONNavigationDelegate webView:decidePolicyForNavigationResponse:decisionHandler:]): 13 1 14 2019-01-15 Zalan Bujtas <zalan@apple.com> 2 15 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm
r239726 r239993 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.