WebKit Bugzilla
Attachment 362355 Details for
Bug 194797
: REGRESSION (PSON): Can't access optumbank.com from myuhc.com
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-194797-20190218161721.patch (text/plain), 29.64 KB, created by
Chris Dumez
on 2019-02-18 16:17:22 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Chris Dumez
Created:
2019-02-18 16:17:22 PST
Size:
29.64 KB
patch
obsolete
>Subversion Revision: 241652 >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 8522ca45ea81707e2fc853bee7a09b30c9b6015e..94cdb73ffab808d5a3b5225c87b1d664e797657e 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,37 @@ >+2019-02-18 Chris Dumez <cdumez@apple.com> >+ >+ REGRESSION (PSON): Can't access optumbank.com from myuhc.com >+ https://bugs.webkit.org/show_bug.cgi?id=194797 >+ <rdar://problem/48055151> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ The issue was caused by us mistakenly process-swapping for a same-site server side redirect. >+ The reason we were getting it wrong is because the logic in >+ WebProcessPool::processForNavigationInternal() was expecting page.process() to be the source >+ process and page.pageLoadState().url() to be the source URL. Those assumptions are incorrect >+ when a server-side redirect occurs in a provisional process. In such case, the source process >+ is the ProvisionalPageProxy's process and the source URL is the provisional URL, not the >+ committed one. >+ >+ * UIProcess/ProvisionalPageProxy.cpp: >+ (WebKit::ProvisionalPageProxy::didPerformServerRedirect): >+ (WebKit::ProvisionalPageProxy::didReceiveServerRedirectForProvisionalLoadForFrame): >+ (WebKit::ProvisionalPageProxy::didReceiveMessage): >+ * UIProcess/ProvisionalPageProxy.h: >+ Make sure the provisional page forwards IPC related to server-side redirects to the page so >+ that the client gets informed. >+ >+ * UIProcess/WebPageProxy.cpp: >+ (WebKit::WebPageProxy::receivedNavigationPolicyDecision): >+ (WebKit::WebPageProxy::didPerformServerRedirect): >+ (WebKit::WebPageProxy::didPerformServerRedirectShared): >+ * UIProcess/WebPageProxy.h: >+ * UIProcess/WebProcessPool.cpp: >+ (WebKit::WebProcessPool::processForNavigation): >+ (WebKit::WebProcessPool::processForNavigationInternal): >+ * UIProcess/WebProcessPool.h: >+ > 2019-02-15 Youenn Fablet <youenn@apple.com> > > NetworkDataTask should check its client before calling shouldCaptureExtraNetworkLoadMetrics >diff --git a/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp b/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp >index b66ff9b4dd1d07f66aaaa4a1196f9a834df97c83..1f8d4a35fca0d74e6bb86625b2b082aa26a217af 100644 >--- a/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp >+++ b/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp >@@ -284,6 +284,16 @@ void ProvisionalPageProxy::decidePolicyForResponse(uint64_t frameID, const WebCo > m_page.decidePolicyForResponseShared(m_process.copyRef(), frameID, frameSecurityOrigin, identifier, navigationID, response, request, canShowMIMEType, listenerID, userData); > } > >+void ProvisionalPageProxy::didPerformServerRedirect(const String& sourceURLString, const String& destinationURLString, uint64_t frameID) >+{ >+ m_page.didPerformServerRedirectShared(m_process.copyRef(), sourceURLString, destinationURLString, frameID); >+} >+ >+void ProvisionalPageProxy::didReceiveServerRedirectForProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, WebCore::ResourceRequest&& request, const UserData& userData) >+{ >+ m_page.didReceiveServerRedirectForProvisionalLoadForFrameShared(m_process.copyRef(), frameID, navigationID, WTFMove(request), userData); >+} >+ > void ProvisionalPageProxy::startURLSchemeTask(URLSchemeTaskParameters&& parameters) > { > m_page.startURLSchemeTaskShared(m_process.copyRef(), WTFMove(parameters)); >@@ -374,6 +384,16 @@ void ProvisionalPageProxy::didReceiveMessage(IPC::Connection& connection, IPC::D > return; > } > >+ if (decoder.messageName() == Messages::WebPageProxy::DidReceiveServerRedirectForProvisionalLoadForFrame::name()) { >+ IPC::handleMessage<Messages::WebPageProxy::DidReceiveServerRedirectForProvisionalLoadForFrame>(decoder, this, &ProvisionalPageProxy::didReceiveServerRedirectForProvisionalLoadForFrame); >+ return; >+ } >+ >+ if (decoder.messageName() == Messages::WebPageProxy::DidPerformServerRedirect::name()) { >+ IPC::handleMessage<Messages::WebPageProxy::DidPerformServerRedirect>(decoder, this, &ProvisionalPageProxy::didPerformServerRedirect); >+ return; >+ } >+ > LOG(ProcessSwapping, "Unhandled message %s::%s from provisional process", decoder.messageReceiverName().toString().data(), decoder.messageName().toString().data()); > } > >diff --git a/Source/WebKit/UIProcess/ProvisionalPageProxy.h b/Source/WebKit/UIProcess/ProvisionalPageProxy.h >index fc0016919c7176caef28f5ff88b59882c98167b0..60d391083bffc678bf9945d2bab9443e8de4aa8f 100644 >--- a/Source/WebKit/UIProcess/ProvisionalPageProxy.h >+++ b/Source/WebKit/UIProcess/ProvisionalPageProxy.h >@@ -64,6 +64,7 @@ public: > WebProcessProxy& process() { return m_process.get(); } > ProcessSwapRequestedByClient processSwapRequestedByClient() const { return m_processSwapRequestedByClient; } > uint64_t navigationID() const { return m_navigationID; } >+ const URL& provisionalURL() const { return m_provisionalLoadURL; } > > DrawingAreaProxy* drawingArea() const { return m_drawingArea.get(); } > std::unique_ptr<DrawingAreaProxy> takeDrawingArea(); >@@ -91,6 +92,8 @@ private: > void decidePolicyForResponse(uint64_t frameID, const WebCore::SecurityOriginData&, WebCore::PolicyCheckIdentifier, uint64_t navigationID, const WebCore::ResourceResponse&, > const WebCore::ResourceRequest&, bool canShowMIMEType, uint64_t listenerID, const UserData&); > void didChangeProvisionalURLForFrame(uint64_t frameID, uint64_t navigationID, URL&&); >+ void didPerformServerRedirect(const String& sourceURLString, const String& destinationURLString, uint64_t frameID); >+ void didReceiveServerRedirectForProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, WebCore::ResourceRequest&&, const UserData&); > void didNavigateWithNavigationData(const WebNavigationDataStore&, uint64_t frameID); > void didPerformClientRedirect(const String& sourceURLString, const String& destinationURLString, uint64_t frameID); > void didCreateMainFrame(uint64_t frameID); >diff --git a/Source/WebKit/UIProcess/WebPageProxy.cpp b/Source/WebKit/UIProcess/WebPageProxy.cpp >index f0a3d4c8fafaa111337f87e2dd058c81260baade..173585c7e7fb3de9e6130276dc61a393dd838871 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.cpp >+++ b/Source/WebKit/UIProcess/WebPageProxy.cpp >@@ -2748,7 +2748,17 @@ void WebPageProxy::receivedNavigationPolicyDecision(PolicyAction policyAction, A > return; > } > >- process().processPool().processForNavigation(*this, *navigation, processSwapRequestedByClient, [this, protectedThis = makeRef(*this), policyAction, navigation = makeRef(*navigation), >+ Ref<WebProcessProxy> sourceProcess = process(); >+ URL sourceURL = URL { URL(), pageLoadState().url() }; >+ if (auto* provisionalPage = provisionalPageProxy()) { >+ if (provisionalPage->navigationID() == navigation->navigationID()) { >+ ASSERT(navigation->currentRequestIsRedirect()); >+ sourceProcess = provisionalPage->process(); >+ sourceURL = provisionalPage->provisionalURL(); >+ } >+ } >+ >+ process().processPool().processForNavigation(*this, *navigation, sourceProcess.copyRef(), sourceURL, processSwapRequestedByClient, [this, protectedThis = makeRef(*this), policyAction, navigation = makeRef(*navigation), sourceProcess = sourceProcess.copyRef(), > data = WTFMove(data), sender = WTFMove(sender), processSwapRequestedByClient] (Ref<WebProcessProxy>&& processForNavigation, SuspendedPageProxy* destinationSuspendedPage, const String& reason) mutable { > // If the navigation has been destroyed, then no need to proceed. > if (isClosed() || !navigationState().hasNavigation(navigation->navigationID())) { >@@ -2756,14 +2766,14 @@ void WebPageProxy::receivedNavigationPolicyDecision(PolicyAction policyAction, A > return; > } > >- if (processForNavigation.ptr() != &process()) { >+ bool shouldProcessSwap = processForNavigation.ptr() != sourceProcess.ptr(); >+ if (shouldProcessSwap) { > policyAction = PolicyAction::StopAllLoads; > RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "decidePolicyForNavigationAction, swapping process %i with process %i for navigation, reason: %{public}s", processIdentifier(), processForNavigation->processIdentifier(), reason.utf8().data()); > LOG(ProcessSwapping, "(ProcessSwapping) Switching from process %i to new process (%i) for navigation %" PRIu64 " '%s'", processIdentifier(), processForNavigation->processIdentifier(), navigation->navigationID(), navigation->loggingString()); > } else > RELEASE_LOG_IF_ALLOWED(ProcessSwapping, "decidePolicyForNavigationAction: keep using process %i for navigation, reason: %{public}s", processIdentifier(), reason.utf8().data()); > >- bool shouldProcessSwap = processForNavigation.ptr() != &process(); > receivedPolicyDecision(policyAction, navigation.ptr(), shouldProcessSwap ? WTF::nullopt : WTFMove(data), WTFMove(sender), shouldProcessSwap ? WillContinueLoadInNewProcess::Yes : WillContinueLoadInNewProcess::No); > > if (!shouldProcessSwap) >@@ -4796,23 +4806,28 @@ void WebPageProxy::didPerformClientRedirectShared(Ref<WebProcessProxy>&& process > > void WebPageProxy::didPerformServerRedirect(const String& sourceURLString, const String& destinationURLString, uint64_t frameID) > { >- RELEASE_LOG_IF_ALLOWED(Loading, "didPerformServerRedirect: webPID = %i, pageID = %" PRIu64, m_process->processIdentifier(), m_pageID); >+ didPerformServerRedirectShared(m_process.copyRef(), sourceURLString, destinationURLString, frameID); >+} >+ >+void WebPageProxy::didPerformServerRedirectShared(Ref<WebProcessProxy>&& process, const String& sourceURLString, const String& destinationURLString, uint64_t frameID) >+{ >+ RELEASE_LOG_IF_ALLOWED(Loading, "didPerformServerRedirect: webPID = %i, pageID = %" PRIu64, process->processIdentifier(), m_pageID); > > PageClientProtector protector(pageClient()); > > if (sourceURLString.isEmpty() || destinationURLString.isEmpty()) > return; > >- WebFrameProxy* frame = m_process->webFrame(frameID); >- MESSAGE_CHECK(m_process, frame); >- MESSAGE_CHECK(m_process, frame->page() == this); >+ WebFrameProxy* frame = process->webFrame(frameID); >+ MESSAGE_CHECK(process, frame); >+ MESSAGE_CHECK(process, frame->page() == this); > >- MESSAGE_CHECK_URL(m_process, sourceURLString); >- MESSAGE_CHECK_URL(m_process, destinationURLString); >+ MESSAGE_CHECK_URL(process, sourceURLString); >+ MESSAGE_CHECK_URL(process, destinationURLString); > > if (frame->isMainFrame()) > m_historyClient->didPerformServerRedirect(*this, sourceURLString, destinationURLString); >- process().processPool().historyClient().didPerformServerRedirect(process().processPool(), *this, sourceURLString, destinationURLString, *frame); >+ process->processPool().historyClient().didPerformServerRedirect(process->processPool(), *this, sourceURLString, destinationURLString, *frame); > } > > void WebPageProxy::didUpdateHistoryTitle(const String& title, const String& url, uint64_t frameID) >diff --git a/Source/WebKit/UIProcess/WebPageProxy.h b/Source/WebKit/UIProcess/WebPageProxy.h >index b4d8af3cd2e397441e6380cc4c6d1e0a839d649b..b2b0e85d2e0d159b08d09b33817c8fc126c0d84f 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.h >+++ b/Source/WebKit/UIProcess/WebPageProxy.h >@@ -1442,6 +1442,7 @@ public: > void didStartProvisionalLoadForFrameShared(Ref<WebProcessProxy>&&, uint64_t frameID, uint64_t navigationID, URL&&, URL&& unreachableURL, const UserData&); > void didFailProvisionalLoadForFrameShared(Ref<WebProcessProxy>&&, uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const String& provisionalURL, const WebCore::ResourceError&, const UserData&); > void didReceiveServerRedirectForProvisionalLoadForFrameShared(Ref<WebProcessProxy>&&, uint64_t frameID, uint64_t navigationID, WebCore::ResourceRequest&&, const UserData&); >+ void didPerformServerRedirectShared(Ref<WebProcessProxy>&&, const String& sourceURLString, const String& destinationURLString, uint64_t frameID); > void didPerformClientRedirectShared(Ref<WebProcessProxy>&&, const String& sourceURLString, const String& destinationURLString, uint64_t frameID); > void didNavigateWithNavigationDataShared(Ref<WebProcessProxy>&&, const WebNavigationDataStore&, uint64_t frameID); > void didChangeProvisionalURLForFrameShared(Ref<WebProcessProxy>&&, uint64_t frameID, uint64_t navigationID, URL&&); >diff --git a/Source/WebKit/UIProcess/WebProcessPool.cpp b/Source/WebKit/UIProcess/WebProcessPool.cpp >index 7e8788a1fc5b3d4c1fb56abeed613b0fb9e491b0..13e3e0c75ff2cd33c550467f7132880a980d7027 100644 >--- a/Source/WebKit/UIProcess/WebProcessPool.cpp >+++ b/Source/WebKit/UIProcess/WebProcessPool.cpp >@@ -2115,14 +2115,14 @@ ServiceWorkerProcessProxy* WebProcessPool::serviceWorkerProcessProxyFromPageID(u > } > #endif > >-void WebProcessPool::addProcessToOriginCacheSet(WebPageProxy& page) >+void WebProcessPool::addProcessToOriginCacheSet(WebProcessProxy& process, const URL& url) > { >- auto registrableDomain = toRegistrableDomain({ { }, page.pageLoadState().url() }); >- auto result = m_swappedProcessesPerRegistrableDomain.add(registrableDomain, &page.process()); >+ auto registrableDomain = toRegistrableDomain(url); >+ auto result = m_swappedProcessesPerRegistrableDomain.add(registrableDomain, &process); > if (!result.isNewEntry) >- result.iterator->value = &page.process(); >+ result.iterator->value = &process; > >- LOG(ProcessSwapping, "(ProcessSwapping) Registrable domain %s just saved a cached process with pid %i", registrableDomain.utf8().data(), page.process().processIdentifier()); >+ LOG(ProcessSwapping, "(ProcessSwapping) Registrable domain %s just saved a cached process with pid %i", registrableDomain.utf8().data(), process.processIdentifier()); > if (!result.isNewEntry) > LOG(ProcessSwapping, "(ProcessSwapping) Note: It already had one saved"); > } >@@ -2142,32 +2142,32 @@ void WebProcessPool::removeProcessFromOriginCacheSet(WebProcessProxy& process) > m_swappedProcessesPerRegistrableDomain.remove(registrableDomain); > } > >-void WebProcessPool::processForNavigation(WebPageProxy& page, const API::Navigation& navigation, ProcessSwapRequestedByClient processSwapRequestedByClient, CompletionHandler<void(Ref<WebProcessProxy>&&, SuspendedPageProxy*, const String&)>&& completionHandler) >+void WebProcessPool::processForNavigation(WebPageProxy& page, const API::Navigation& navigation, Ref<WebProcessProxy>&& sourceProcess, const URL& sourceURL, ProcessSwapRequestedByClient processSwapRequestedByClient, CompletionHandler<void(Ref<WebProcessProxy>&&, SuspendedPageProxy*, const String&)>&& completionHandler) > { >- processForNavigationInternal(page, navigation, processSwapRequestedByClient, [this, page = makeRefPtr(page), navigation = makeRef(navigation), processSwapRequestedByClient, completionHandler = WTFMove(completionHandler)](Ref<WebProcessProxy>&& process, SuspendedPageProxy* suspendedPage, const String& reason) mutable { >+ processForNavigationInternal(page, navigation, sourceProcess.copyRef(), sourceURL, processSwapRequestedByClient, [this, page = makeRefPtr(page), navigation = makeRef(navigation), sourceProcess = sourceProcess.copyRef(), sourceURL, processSwapRequestedByClient, completionHandler = WTFMove(completionHandler)](Ref<WebProcessProxy>&& process, SuspendedPageProxy* suspendedPage, const String& reason) mutable { > // We are process-swapping so automatic process prewarming would be beneficial if the client has not explicitly enabled / disabled it. >- bool doingAnAutomaticProcessSwap = processSwapRequestedByClient == ProcessSwapRequestedByClient::No && process.ptr() != &page->process(); >+ bool doingAnAutomaticProcessSwap = processSwapRequestedByClient == ProcessSwapRequestedByClient::No && process.ptr() != sourceProcess.ptr(); > if (doingAnAutomaticProcessSwap && !configuration().wasAutomaticProcessWarmingSetByClient() && !configuration().clientWouldBenefitFromAutomaticProcessPrewarming()) { > RELEASE_LOG(PerformanceLogging, "Automatically turning on process prewarming because the client would benefit from it"); > configuration().setClientWouldBenefitFromAutomaticProcessPrewarming(true); > } > >- if (m_configuration->alwaysKeepAndReuseSwappedProcesses() && process.ptr() != &page->process()) { >+ if (m_configuration->alwaysKeepAndReuseSwappedProcesses() && process.ptr() != sourceProcess.ptr()) { > static std::once_flag onceFlag; > std::call_once(onceFlag, [] { > WTFLogAlways("WARNING: The option to always keep swapped web processes alive is active. This is meant for debugging and testing only."); > }); > >- addProcessToOriginCacheSet(*page); >+ addProcessToOriginCacheSet(sourceProcess, sourceURL); > >- LOG(ProcessSwapping, "(ProcessSwapping) Navigating from %s to %s, keeping around old process. Now holding on to old processes for %u origins.", page->currentURL().utf8().data(), navigation->currentRequest().url().string().utf8().data(), m_swappedProcessesPerRegistrableDomain.size()); >+ LOG(ProcessSwapping, "(ProcessSwapping) Navigating from %s to %s, keeping around old process. Now holding on to old processes for %u origins.", sourceURL.string().utf8().data(), navigation->currentRequest().url().string().utf8().data(), m_swappedProcessesPerRegistrableDomain.size()); > } > > completionHandler(WTFMove(process), suspendedPage, reason); > }); > } > >-void WebProcessPool::processForNavigationInternal(WebPageProxy& page, const API::Navigation& navigation, ProcessSwapRequestedByClient processSwapRequestedByClient, CompletionHandler<void(Ref<WebProcessProxy>&&, SuspendedPageProxy*, const String&)>&& completionHandler) >+void WebProcessPool::processForNavigationInternal(WebPageProxy& page, const API::Navigation& navigation, Ref<WebProcessProxy>&& sourceProcess, const URL& pageSourceURL, ProcessSwapRequestedByClient processSwapRequestedByClient, CompletionHandler<void(Ref<WebProcessProxy>&&, SuspendedPageProxy*, const String&)>&& completionHandler) > { > auto& targetURL = navigation.currentRequest().url(); > auto registrableDomain = toRegistrableDomain(targetURL); >@@ -2193,30 +2193,30 @@ void WebProcessPool::processForNavigationInternal(WebPageProxy& page, const API: > }; > > if (usesSingleWebProcess()) >- return completionHandler(page.process(), nullptr, "Single WebProcess mode is enabled"_s); >+ return completionHandler(WTFMove(sourceProcess), nullptr, "Single WebProcess mode is enabled"_s); > > if (processSwapRequestedByClient == ProcessSwapRequestedByClient::Yes) > return completionHandler(createNewProcess(), nullptr, "Process swap was requested by the client"_s); > > if (!m_configuration->processSwapsOnNavigation()) >- return completionHandler(page.process(), nullptr, "Feature is disabled"_s); >+ return completionHandler(WTFMove(sourceProcess), nullptr, "Feature is disabled"_s); > > if (m_automationSession) >- return completionHandler(page.process(), nullptr, "An automation session is active"_s); >+ return completionHandler(WTFMove(sourceProcess), nullptr, "An automation session is active"_s); > >- if (!page.process().hasCommittedAnyProvisionalLoads()) { >- tryPrewarmWithDomainInformation(page.process(), targetURL); >- return completionHandler(page.process(), nullptr, "Process has not yet committed any provisional loads"_s); >+ if (!sourceProcess->hasCommittedAnyProvisionalLoads()) { >+ tryPrewarmWithDomainInformation(sourceProcess, targetURL); >+ return completionHandler(WTFMove(sourceProcess), nullptr, "Process has not yet committed any provisional loads"_s); > } > > // FIXME: We should support process swap when a window has been opened via window.open() without 'noopener'. > // The issue is that the opener has a handle to the WindowProxy. > if (navigation.openedByDOMWithOpener() && !m_configuration->processSwapsOnWindowOpenWithOpener()) >- return completionHandler(page.process(), nullptr, "Browsing context been opened by DOM without 'noopener'"_s); >+ return completionHandler(WTFMove(sourceProcess), nullptr, "Browsing context been opened by DOM without 'noopener'"_s); > > // FIXME: We should support process swap when a window has opened other windows via window.open. > if (navigation.hasOpenedFrames()) >- return completionHandler(page.process(), nullptr, "Browsing context has opened other windows"_s); >+ return completionHandler(WTFMove(sourceProcess), nullptr, "Browsing context has opened other windows"_s); > > if (auto* targetItem = navigation.targetItem()) { > if (auto* suspendedPage = targetItem->suspendedPage()) { >@@ -2245,13 +2245,13 @@ void WebProcessPool::processForNavigationInternal(WebPageProxy& page, const API: > } > > if (navigation.treatAsSameOriginNavigation()) >- return completionHandler(page.process(), nullptr, "The treatAsSameOriginNavigation flag is set"_s); >+ return completionHandler(WTFMove(sourceProcess), nullptr, "The treatAsSameOriginNavigation flag is set"_s); > > URL sourceURL; > if (page.isPageOpenedByDOMShowingInitialEmptyDocument() && !navigation.requesterOrigin().isEmpty()) > sourceURL = URL { URL(), navigation.requesterOrigin().toString() }; > else >- sourceURL = URL { { }, page.pageLoadState().url() }; >+ sourceURL = pageSourceURL; > > if (sourceURL.isEmpty() && page.configuration().relatedPage()) { > sourceURL = URL { { }, page.configuration().relatedPage()->pageLoadState().url() }; >@@ -2259,7 +2259,7 @@ void WebProcessPool::processForNavigationInternal(WebPageProxy& page, const API: > } > > if (!sourceURL.isValid() || !targetURL.isValid() || sourceURL.isEmpty() || sourceURL.protocolIsAbout() || registrableDomainsAreEqual(sourceURL, targetURL)) >- return completionHandler(page.process(), nullptr, "Navigation is same-site"_s); >+ return completionHandler(WTFMove(sourceProcess), nullptr, "Navigation is same-site"_s); > > String reason = "Navigation is cross-site"_s; > >diff --git a/Source/WebKit/UIProcess/WebProcessPool.h b/Source/WebKit/UIProcess/WebProcessPool.h >index ebff9bf97fa9696d327164ab6caee454baa2b2eb..35d090f4ffcb20dbbcbf1193c10b0801a02e4e66 100644 >--- a/Source/WebKit/UIProcess/WebProcessPool.h >+++ b/Source/WebKit/UIProcess/WebProcessPool.h >@@ -457,7 +457,7 @@ public: > BackgroundWebProcessToken backgroundWebProcessToken() const { return BackgroundWebProcessToken(m_backgroundWebProcessCounter.count()); } > #endif > >- void processForNavigation(WebPageProxy&, const API::Navigation&, ProcessSwapRequestedByClient, CompletionHandler<void(Ref<WebProcessProxy>&&, SuspendedPageProxy*, const String&)>&&); >+ void processForNavigation(WebPageProxy&, const API::Navigation&, Ref<WebProcessProxy>&& sourceProcess, const URL& sourceURL, ProcessSwapRequestedByClient, CompletionHandler<void(Ref<WebProcessProxy>&&, SuspendedPageProxy*, const String&)>&&); > > // SuspendedPageProxy management. > void addSuspendedPage(std::unique_ptr<SuspendedPageProxy>&&); >@@ -499,7 +499,7 @@ private: > void platformInitializeWebProcess(WebProcessCreationParameters&); > void platformInvalidateContext(); > >- void processForNavigationInternal(WebPageProxy&, const API::Navigation&, ProcessSwapRequestedByClient, CompletionHandler<void(Ref<WebProcessProxy>&&, SuspendedPageProxy*, const String&)>&&); >+ void processForNavigationInternal(WebPageProxy&, const API::Navigation&, Ref<WebProcessProxy>&& sourceProcess, const URL& sourceURL, ProcessSwapRequestedByClient, CompletionHandler<void(Ref<WebProcessProxy>&&, SuspendedPageProxy*, const String&)>&&); > > RefPtr<WebProcessProxy> tryTakePrewarmedProcess(WebsiteDataStore&); > >@@ -562,7 +562,7 @@ private: > void resolvePathsForSandboxExtensions(); > void platformResolvePathsForSandboxExtensions(); > >- void addProcessToOriginCacheSet(WebPageProxy&); >+ void addProcessToOriginCacheSet(WebProcessProxy&, const URL&); > void removeProcessFromOriginCacheSet(WebProcessProxy&); > > void tryPrewarmWithDomainInformation(WebProcessProxy&, const URL&); >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index 5470296a61a22a0a8ee358dcee000aa598fc7411..e1b211de9a5fbe8fdb66e5c6ce643094e6dcf145 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,15 @@ >+2019-02-18 Chris Dumez <cdumez@apple.com> >+ >+ REGRESSION (PSON): Can't access optumbank.com from myuhc.com >+ https://bugs.webkit.org/show_bug.cgi?id=194797 >+ <rdar://problem/48055151> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add API test coverage. >+ >+ * TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm: >+ > 2019-02-16 Zalan Bujtas <zalan@apple.com> > > [LFC] RenderImage's default intrinsic size is 0. >diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm b/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm >index 510ffba5b3e54c8e9f8fd52f9011c64fb944d3fe..b20e328257fedc069210997580e2c1206db5ef26 100644 >--- a/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm >+++ b/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm >@@ -1406,11 +1406,15 @@ TEST(ProcessSwap, ServerRedirect) > serverRedirected = false; > > seenPIDs.add([webView _webProcessIdentifier]); >+ if (auto provisionalPID = [webView _provisionalWebProcessIdentifier]) >+ seenPIDs.add(provisionalPID); > > TestWebKitAPI::Util::run(&done); > done = false; > > seenPIDs.add([webView _webProcessIdentifier]); >+ if (auto provisionalPID = [webView _provisionalWebProcessIdentifier]) >+ seenPIDs.add(provisionalPID); > > EXPECT_FALSE(serverRedirected); > EXPECT_EQ(3, numberOfDecidePolicyCalls); >@@ -1455,11 +1459,15 @@ TEST(ProcessSwap, ServerRedirect2) > serverRedirected = false; > > seenPIDs.add([webView _webProcessIdentifier]); >+ if (auto provisionalPID = [webView _provisionalWebProcessIdentifier]) >+ seenPIDs.add(provisionalPID); > > TestWebKitAPI::Util::run(&done); > done = false; > > seenPIDs.add([webView _webProcessIdentifier]); >+ if (auto provisionalPID = [webView _provisionalWebProcessIdentifier]) >+ seenPIDs.add(provisionalPID); > > EXPECT_FALSE(serverRedirected); > EXPECT_EQ(3, numberOfDecidePolicyCalls); >@@ -1475,6 +1483,87 @@ TEST(ProcessSwap, ServerRedirect2) > EXPECT_WK_STREQ(@"pson://www.webkit.org/main1.html", [[webView URL] absoluteString]); > } > >+enum class ShouldCacheProcessFirst { No, Yes }; >+static void runSameOriginServerRedirectTest(ShouldCacheProcessFirst shouldCacheProcessFirst) >+{ >+ auto processPoolConfiguration = psonProcessPoolConfiguration(); >+ processPoolConfiguration.get().processSwapsOnNavigation = YES; >+ auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]); >+ >+ auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]); >+ [webViewConfiguration setProcessPool:processPool.get()]; >+ auto handler = adoptNS([[PSONScheme alloc] init]); >+ [handler addMappingFromURLString:@"pson://www.webkit.org/main.html" toData:crossSiteClientSideRedirectBytes]; >+ [handler addRedirectFromURLString:@"pson://www.apple.com/main.html" toURLString:@"pson://www.apple.com/main2.html"]; >+ [webViewConfiguration setURLSchemeHandler:handler.get() forURLScheme:@"pson"]; >+ >+ auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]); >+ auto delegate = adoptNS([[PSONNavigationDelegate alloc] init]); >+ [webView setNavigationDelegate:delegate.get()]; >+ >+ NSURLRequest *request; >+ >+ if (shouldCacheProcessFirst == ShouldCacheProcessFirst::Yes) { >+ request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"pson://www.apple.com/main3.html"]]; >+ [webView loadRequest:request]; >+ >+ TestWebKitAPI::Util::run(&done); >+ done = false; >+ } >+ >+ delegate->didStartProvisionalNavigationHandler = ^{ >+ seenPIDs.add([webView _webProcessIdentifier]); >+ if (auto provisionalPID = [webView _provisionalWebProcessIdentifier]) >+ seenPIDs.add(provisionalPID); >+ }; >+ >+ willPerformClientRedirect = false; >+ didPerformClientRedirect = false; >+ serverRedirected = false; >+ request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"pson://www.webkit.org/main.html"]]; >+ [webView loadRequest:request]; >+ >+ TestWebKitAPI::Util::run(&willPerformClientRedirect); >+ >+ seenPIDs.add([webView _webProcessIdentifier]); >+ if (auto provisionalPID = [webView _provisionalWebProcessIdentifier]) >+ seenPIDs.add(provisionalPID); >+ >+ TestWebKitAPI::Util::run(&didPerformClientRedirect); >+ didPerformClientRedirect = false; >+ willPerformClientRedirect = false; >+ >+ seenPIDs.add([webView _webProcessIdentifier]); >+ if (auto provisionalPID = [webView _provisionalWebProcessIdentifier]) >+ seenPIDs.add(provisionalPID); >+ >+ TestWebKitAPI::Util::run(&serverRedirected); >+ serverRedirected = false; >+ >+ seenPIDs.add([webView _webProcessIdentifier]); >+ if (auto provisionalPID = [webView _provisionalWebProcessIdentifier]) >+ seenPIDs.add(provisionalPID); >+ >+ TestWebKitAPI::Util::run(&done); >+ done = false; >+ >+ seenPIDs.add([webView _webProcessIdentifier]); >+ if (auto provisionalPID = [webView _provisionalWebProcessIdentifier]) >+ seenPIDs.add(provisionalPID); >+ >+ EXPECT_EQ(2u, seenPIDs.size()); >+} >+ >+TEST(ProcessSwap, SameOriginServerRedirect) >+{ >+ runSameOriginServerRedirectTest(ShouldCacheProcessFirst::No); >+} >+ >+TEST(ProcessSwap, SameOriginServerRedirectFromCachedProcess) >+{ >+ runSameOriginServerRedirectTest(ShouldCacheProcessFirst::Yes); >+} >+ > TEST(ProcessSwap, TerminateProcessRightAfterSwap) > { > auto processPoolConfiguration = psonProcessPoolConfiguration();
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 194797
: 362355