Changeset 293248 in webkit
- Timestamp:
- Apr 22, 2022 1:39:17 PM (2 years ago)
- Location:
- branches/safari-613.2.7.1-branch
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/safari-613.2.7.1-branch/Source/WebKit/ChangeLog
r293247 r293248 1 2022-04-22 Russell Epstein <repstein@apple.com> 2 3 Apply patch. rdar://problem/91446317 4 5 2022-04-21 Youenn Fablet <youenn@apple.com> 6 7 Website policies are not respected when doing COOP based process swap 8 https://bugs.webkit.org/show_bug.cgi?id=238036 9 <rdar://89616625> 10 11 Reviewed by Chris Dumez. 12 13 In case of normal process swap, we make use of website policies so everything is fine. 14 For COOP based process swap, this happens later on, at a point where we lost website policies. 15 To overcome this, we store the website policies used by a navigation inside the API::Navigation object. 16 It is used by continueNavigationInNewProcess to correctly initialize the new WebPage website policies. 17 We then set the website policies in the navigation object just before continuing the load in the same process, 18 as process swap may happen later when inspecting the response. 19 Minor refactoring in continueNavigationInNewProcess to get the policies directly from the given Navigation object. 20 Minor refactoring in receivedNavigationPolicyDecision to make the code doing process swap clearer. 21 22 Covered by API test. 23 24 * UIProcess/API/APINavigation.h: 25 (API::Navigation::setWebsitePoliciesForProcessSwap): 26 (API::Navigation::takeWebsitePoliciesForProcessSwap): 27 * UIProcess/WebPageProxy.cpp: 28 (WebKit::WebPageProxy::receivedNavigationPolicyDecision): 29 (WebKit::WebPageProxy::receivedPolicyDecision): 30 (WebKit::WebPageProxy::continueNavigationInNewProcess): 31 (WebKit::WebPageProxy::triggerBrowsingContextGroupSwitchForNavigation): 32 * UIProcess/WebPageProxy.h: 33 1 34 2022-04-22 Russell Epstein <repstein@apple.com> 2 35 -
branches/safari-613.2.7.1-branch/Source/WebKit/UIProcess/API/APINavigation.h
r293247 r293248 27 27 28 28 #include "APIObject.h" 29 #include "APIWebsitePolicies.h" 29 30 #include "DataReference.h" 30 31 #include "FrameInfoData.h" … … 172 173 bool isLoadedWithNavigationShared() const { return m_isLoadedWithNavigationShared; } 173 174 175 void setWebsitePolicies(RefPtr<API::WebsitePolicies>&& policies) { m_websitePolicies = WTFMove(policies); } 176 API::WebsitePolicies* websitePolicies() { return m_websitePolicies.get(); } 177 174 178 private: 175 179 explicit Navigation(WebKit::WebNavigationState&); … … 198 202 WebKit::ProcessThrottler::TimedActivity m_clientNavigationActivity; 199 203 bool m_isLoadedWithNavigationShared { false }; 204 RefPtr<API::WebsitePolicies> m_websitePolicies; 200 205 }; 201 206 -
branches/safari-613.2.7.1-branch/Source/WebKit/UIProcess/WebPageProxy.cpp
r293247 r293248 3401 3401 } 3402 3402 3403 void WebPageProxy::receivedNavigationPolicyDecision(PolicyAction policyAction, API::Navigation* navigation, Ref<API::NavigationAction>&& navigationAction, ProcessSwapRequestedByClient processSwapRequestedByClient, WebFrameProxy& frame, const FrameInfoData& frameInfo, Ref Ptr<API::WebsitePolicies>&& policies, Ref<PolicyDecisionSender>&& sender)3403 void WebPageProxy::receivedNavigationPolicyDecision(PolicyAction policyAction, API::Navigation* navigation, Ref<API::NavigationAction>&& navigationAction, ProcessSwapRequestedByClient processSwapRequestedByClient, WebFrameProxy& frame, const FrameInfoData& frameInfo, Ref<PolicyDecisionSender>&& sender) 3404 3404 { 3405 3405 WEBPAGEPROXY_RELEASE_LOG(Loading, "receivedNavigationPolicyDecision: frameID=%llu, navigationID=%llu, policyAction=%u", frame.frameID().toUInt64(), navigation ? navigation->navigationID() : 0, (unsigned)policyAction); 3406 3406 3407 3407 Ref<WebsiteDataStore> websiteDataStore = m_websiteDataStore.copyRef(); 3408 if ( policies) {3408 if (auto* policies = navigation->websitePolicies()) { 3409 3409 if (policies->websiteDataStore() && policies->websiteDataStore() != websiteDataStore.ptr()) { 3410 3410 websiteDataStore = *policies->websiteDataStore(); … … 3416 3416 3417 3417 if (navigation && !navigation->userContentExtensionsEnabled()) { 3418 if (! policies)3419 policies = API::WebsitePolicies::create();3420 policies->setContentBlockersEnabled(false);3418 if (!navigation->websitePolicies()) 3419 navigation->setWebsitePolicies(API::WebsitePolicies::create()); 3420 navigation->websitePolicies()->setContentBlockersEnabled(false); 3421 3421 } 3422 3422 3423 3423 #if ENABLE(DEVICE_ORIENTATION) 3424 if (navigation && (! policies || policies->deviceOrientationAndMotionAccessState() == WebCore::DeviceOrientationOrMotionPermissionState::Prompt)) {3424 if (navigation && (!navigation->websitePolicies() || navigation->websitePolicies()->deviceOrientationAndMotionAccessState() == WebCore::DeviceOrientationOrMotionPermissionState::Prompt)) { 3425 3425 auto deviceOrientationPermission = websiteDataStore->deviceOrientationAndMotionAccessController().cachedDeviceOrientationPermission(SecurityOriginData::fromURL(navigation->currentRequest().url())); 3426 3426 if (deviceOrientationPermission != WebCore::DeviceOrientationOrMotionPermissionState::Prompt) { 3427 if (! policies)3428 policies = API::WebsitePolicies::create();3429 policies->setDeviceOrientationAndMotionAccessState(deviceOrientationPermission);3427 if (!navigation->websitePolicies()) 3428 navigation->setWebsitePolicies(API::WebsitePolicies::create()); 3429 navigation->websitePolicies()->setDeviceOrientationAndMotionAccessState(deviceOrientationPermission); 3430 3430 } 3431 3431 } … … 3441 3441 3442 3442 if (policyAction != PolicyAction::Use || !frame.isMainFrame() || !navigation) { 3443 receivedPolicyDecision(policyAction, navigation, WTFMove(policies), WTFMove(navigationAction), WTFMove(sender));3443 receivedPolicyDecision(policyAction, navigation, navigation->websitePolicies(), WTFMove(navigationAction), WTFMove(sender)); 3444 3444 return; 3445 3445 } … … 3454 3454 } 3455 3455 3456 m_isCaptivePortalModeExplicitlySet = (policies && policies->isCaptivePortalModeExplicitlySet()) || m_configuration->isCaptivePortalModeExplicitlySet(); 3457 auto captivePortalMode = (policies ? policies->captivePortalModeEnabled() : shouldEnableCaptivePortalMode()) ? WebProcessProxy::CaptivePortalMode::Enabled : WebProcessProxy::CaptivePortalMode::Disabled; 3458 process().processPool().processForNavigation(*this, *navigation, sourceProcess.copyRef(), sourceURL, processSwapRequestedByClient, captivePortalMode, frameInfo, WTFMove(websiteDataStore), [this, protectedThis = Ref { *this }, policyAction, navigation = Ref { *navigation }, navigationAction = WTFMove(navigationAction), sourceProcess = sourceProcess.copyRef(), 3459 policies = WTFMove(policies), sender = WTFMove(sender), processSwapRequestedByClient] (Ref<WebProcessProxy>&& processForNavigation, SuspendedPageProxy* destinationSuspendedPage, const String& reason) mutable { 3456 m_isCaptivePortalModeExplicitlySet = (navigation->websitePolicies() && navigation->websitePolicies()->isCaptivePortalModeExplicitlySet()) || m_configuration->isCaptivePortalModeExplicitlySet(); 3457 auto captivePortalMode = (navigation->websitePolicies() ? navigation->websitePolicies()->captivePortalModeEnabled() : shouldEnableCaptivePortalMode()) ? WebProcessProxy::CaptivePortalMode::Enabled : WebProcessProxy::CaptivePortalMode::Disabled; 3458 process().processPool().processForNavigation(*this, *navigation, sourceProcess.copyRef(), sourceURL, processSwapRequestedByClient, captivePortalMode, frameInfo, WTFMove(websiteDataStore), [this, protectedThis = Ref { *this }, policyAction, navigation = Ref { *navigation }, navigationAction = WTFMove(navigationAction), sourceProcess = sourceProcess.copyRef(), sender = WTFMove(sender), processSwapRequestedByClient] (Ref<WebProcessProxy>&& processForNavigation, SuspendedPageProxy* destinationSuspendedPage, const String& reason) mutable { 3460 3459 // If the navigation has been destroyed, then no need to proceed. 3461 3460 if (isClosed() || !navigationState().hasNavigation(navigation->navigationID())) { 3462 receivedPolicyDecision(policyAction, navigation.ptr(), WTFMove(policies), WTFMove(navigationAction), WTFMove(sender));3461 receivedPolicyDecision(policyAction, navigation.ptr(), navigation->websitePolicies(), WTFMove(navigationAction), WTFMove(sender)); 3463 3462 return; 3464 3463 } … … 3472 3471 WEBPAGEPROXY_RELEASE_LOG(ProcessSwapping, "decidePolicyForNavigationAction: keep using process %i for navigation, reason=%" PUBLIC_LOG_STRING, processIdentifier(), reason.utf8().data()); 3473 3472 3474 std::optional<SandboxExtension::Handle> optionalHandle;3475 3473 if (shouldProcessSwap) { 3476 3474 // Make sure the process to be used for the navigation does not get shutDown now due to destroying SuspendedPageProxy or ProvisionalPageProxy objects. … … 3490 3488 suspendedPage = nullptr; 3491 3489 3492 continueNavigationInNewProcess(navigation, WTFMove(suspendedPage), WTFMove(processForNavigation), processSwapRequestedByClient, ShouldTreatAsContinuingLoad::YesAfterNavigationPolicyDecision, std::exchange(policies, nullptr)); 3493 } else { 3494 auto item = navigation->reloadItem() ? navigation->reloadItem() : navigation->targetItem(); 3495 if (policyAction == PolicyAction::Use && item) { 3496 auto fullURL = URL { URL(), item->url() }; 3497 if (fullURL.protocolIs("file"_s)) { 3498 SandboxExtension::Handle sandboxExtensionHandle; 3499 maybeInitializeSandboxExtensionHandle(processForNavigation.get(), fullURL, item->resourceDirectoryURL(), sandboxExtensionHandle); 3500 optionalHandle = WTFMove(sandboxExtensionHandle); 3501 } 3490 continueNavigationInNewProcess(navigation, WTFMove(suspendedPage), WTFMove(processForNavigation), processSwapRequestedByClient, ShouldTreatAsContinuingLoad::YesAfterNavigationPolicyDecision); 3491 3492 receivedPolicyDecision(policyAction, navigation.ptr(), nullptr, WTFMove(navigationAction), WTFMove(sender), WillContinueLoadInNewProcess::Yes); 3493 return; 3494 } 3495 auto item = navigation->reloadItem() ? navigation->reloadItem() : navigation->targetItem(); 3496 std::optional<SandboxExtension::Handle> optionalHandle; 3497 if (policyAction == PolicyAction::Use && item) { 3498 URL fullURL { URL(), item->url() }; 3499 if (fullURL.protocolIs("file"_s)) { 3500 SandboxExtension::Handle sandboxExtensionHandle; 3501 maybeInitializeSandboxExtensionHandle(processForNavigation.get(), fullURL, item->resourceDirectoryURL(), sandboxExtensionHandle); 3502 optionalHandle = WTFMove(sandboxExtensionHandle); 3502 3503 } 3503 3504 } 3504 3505 3505 receivedPolicyDecision(policyAction, navigation.ptr(), shouldProcessSwap ? nullptr : WTFMove(policies), WTFMove(navigationAction), WTFMove(sender), WTFMove(optionalHandle), shouldProcessSwap ? WillContinueLoadInNewProcess::Yes : WillContinueLoadInNewProcess::No);3506 receivedPolicyDecision(policyAction, navigation.ptr(), navigation->websitePolicies(), WTFMove(navigationAction), WTFMove(sender), WillContinueLoadInNewProcess::No, WTFMove(optionalHandle)); 3506 3507 }); 3507 3508 } 3508 3509 3509 void WebPageProxy::receivedPolicyDecision(PolicyAction action, API::Navigation* navigation, RefPtr<API::WebsitePolicies>&& websitePolicies, std::variant<Ref<API::NavigationResponse>, Ref<API::NavigationAction>>&& navigationActionOrResponse, Ref<PolicyDecisionSender>&& sender, std::optional<SandboxExtension::Handle> sandboxExtensionHandle, WillContinueLoadInNewProcess willContinueLoadInNewProcess)3510 void WebPageProxy::receivedPolicyDecision(PolicyAction action, API::Navigation* navigation, RefPtr<API::WebsitePolicies>&& websitePolicies, std::variant<Ref<API::NavigationResponse>, Ref<API::NavigationAction>>&& navigationActionOrResponse, Ref<PolicyDecisionSender>&& sender, WillContinueLoadInNewProcess willContinueLoadInNewProcess, std::optional<SandboxExtension::Handle> sandboxExtensionHandle) 3510 3511 { 3511 3512 if (!hasRunningProcess()) { … … 3597 3598 } 3598 3599 3599 void WebPageProxy::continueNavigationInNewProcess(API::Navigation& navigation, std::unique_ptr<SuspendedPageProxy>&& suspendedPage, Ref<WebProcessProxy>&& newProcess, ProcessSwapRequestedByClient processSwapRequestedByClient, ShouldTreatAsContinuingLoad shouldTreatAsContinuingLoad, RefPtr<API::WebsitePolicies>&& websitePolicies,std::optional<NetworkResourceLoadIdentifier> existingNetworkResourceLoadIdentifierToResume)3600 void WebPageProxy::continueNavigationInNewProcess(API::Navigation& navigation, std::unique_ptr<SuspendedPageProxy>&& suspendedPage, Ref<WebProcessProxy>&& newProcess, ProcessSwapRequestedByClient processSwapRequestedByClient, ShouldTreatAsContinuingLoad shouldTreatAsContinuingLoad, std::optional<NetworkResourceLoadIdentifier> existingNetworkResourceLoadIdentifierToResume) 3600 3601 { 3601 3602 WEBPAGEPROXY_RELEASE_LOG(Loading, "continueNavigationInNewProcess: newProcessPID=%i, hasSuspendedPage=%i", newProcess->processIdentifier(), !!suspendedPage); … … 3611 3612 } 3612 3613 3614 RefPtr websitePolicies = navigation.websitePolicies(); 3613 3615 bool isServerSideRedirect = shouldTreatAsContinuingLoad == ShouldTreatAsContinuingLoad::YesAfterNavigationPolicyDecision && navigation.currentRequestIsRedirect(); 3614 3616 bool isProcessSwappingOnNavigationResponse = shouldTreatAsContinuingLoad == ShouldTreatAsContinuingLoad::YesAfterProvisionalLoadStarted; … … 5473 5475 WEBPAGEPROXY_RELEASE_LOG(Loading, "decidePolicyForNavigationAction: listener called: frameID=%llu, navigationID=%llu, policyAction=%u, safeBrowsingWarning=%d, isAppBoundDomain=%d", frame->frameID().toUInt64(), navigation ? navigation->navigationID() : 0, (unsigned)policyAction, !!safeBrowsingWarning, !!isAppBoundDomain); 5474 5476 5475 auto completionHandler = [this, protectedThis, frame, frameInfo, sender = WTFMove(sender), navigation, navigationAction = WTFMove(navigationAction), processSwapRequestedByClient, policies = RefPtr { policies }] (PolicyAction policyAction) mutable { 5477 navigation->setWebsitePolicies(WTFMove(policies)); 5478 auto completionHandler = [this, protectedThis, frame, frameInfo, sender = WTFMove(sender), navigation, navigationAction = WTFMove(navigationAction), processSwapRequestedByClient] (PolicyAction policyAction) mutable { 5476 5479 if (frame->isMainFrame()) { 5477 if (! policies) {5480 if (!navigation->websitePolicies()) { 5478 5481 if (auto* defaultPolicies = m_configuration->defaultWebsitePolicies()) 5479 policies = defaultPolicies->copy();5482 navigation->setWebsitePolicies(defaultPolicies->copy()); 5480 5483 } 5481 if ( policies)5484 if (auto* policies = navigation->websitePolicies()) 5482 5485 navigation->setEffectiveContentMode(effectiveContentModeAfterAdjustingPolicies(*policies, navigation->currentRequest())); 5483 5486 } 5484 receivedNavigationPolicyDecision(policyAction, navigation.get(), WTFMove(navigationAction), processSwapRequestedByClient, frame, frameInfo, WTFMove( policies), WTFMove(sender));5487 receivedNavigationPolicyDecision(policyAction, navigation.get(), WTFMove(navigationAction), processSwapRequestedByClient, frame, frameInfo, WTFMove(sender)); 5485 5488 }; 5486 5489 … … 5740 5743 processForNavigation = m_process->processPool().processForRegistrableDomain(websiteDataStore(), responseDomain, m_process->captivePortalMode()); 5741 5744 5742 continueNavigationInNewProcess(*navigation, nullptr, processForNavigation.releaseNonNull(), ProcessSwapRequestedByClient::No, ShouldTreatAsContinuingLoad::YesAfterProvisionalLoadStarted, nullptr,existingNetworkResourceLoadIdentifierToResume);5745 continueNavigationInNewProcess(*navigation, nullptr, processForNavigation.releaseNonNull(), ProcessSwapRequestedByClient::No, ShouldTreatAsContinuingLoad::YesAfterProvisionalLoadStarted, existingNetworkResourceLoadIdentifierToResume); 5743 5746 completionHandler(true); 5744 5747 } -
branches/safari-613.2.7.1-branch/Source/WebKit/UIProcess/WebPageProxy.h
r293247 r293248 1249 1249 class PolicyDecisionSender; 1250 1250 enum class WillContinueLoadInNewProcess : bool { No, Yes }; 1251 void receivedPolicyDecision(WebCore::PolicyAction, API::Navigation*, RefPtr<API::WebsitePolicies>&&, std::variant<Ref<API::NavigationResponse>, Ref<API::NavigationAction>>&&, Ref<PolicyDecisionSender>&&, std::optional<SandboxExtension::Handle> = { }, WillContinueLoadInNewProcess = WillContinueLoadInNewProcess::No);1252 void receivedNavigationPolicyDecision(WebCore::PolicyAction, API::Navigation*, Ref<API::NavigationAction>&&, ProcessSwapRequestedByClient, WebFrameProxy&, const FrameInfoData&, Ref Ptr<API::WebsitePolicies>&&, Ref<PolicyDecisionSender>&&);1251 void receivedPolicyDecision(WebCore::PolicyAction, API::Navigation*, RefPtr<API::WebsitePolicies>&&, std::variant<Ref<API::NavigationResponse>, Ref<API::NavigationAction>>&&, Ref<PolicyDecisionSender>&&, WillContinueLoadInNewProcess = WillContinueLoadInNewProcess::No, std::optional<SandboxExtension::Handle> = { }); 1252 void receivedNavigationPolicyDecision(WebCore::PolicyAction, API::Navigation*, Ref<API::NavigationAction>&&, ProcessSwapRequestedByClient, WebFrameProxy&, const FrameInfoData&, Ref<PolicyDecisionSender>&&); 1253 1253 1254 1254 void backForwardRemovedItem(const WebCore::BackForwardItemIdentifier&); … … 2512 2512 void reportPageLoadResult(const WebCore::ResourceError& = { }); 2513 2513 2514 void continueNavigationInNewProcess(API::Navigation&, std::unique_ptr<SuspendedPageProxy>&&, Ref<WebProcessProxy>&&, ProcessSwapRequestedByClient, WebCore::ShouldTreatAsContinuingLoad, RefPtr<API::WebsitePolicies>&&,std::optional<NetworkResourceLoadIdentifier> existingNetworkResourceLoadIdentifierToResume = std::nullopt);2514 void continueNavigationInNewProcess(API::Navigation&, std::unique_ptr<SuspendedPageProxy>&&, Ref<WebProcessProxy>&&, ProcessSwapRequestedByClient, WebCore::ShouldTreatAsContinuingLoad, std::optional<NetworkResourceLoadIdentifier> existingNetworkResourceLoadIdentifierToResume = std::nullopt); 2515 2515 2516 2516 void setNeedsFontAttributes(bool); -
branches/safari-613.2.7.1-branch/Tools/ChangeLog
r293247 r293248 1 2022-04-22 Russell Epstein <repstein@apple.com> 2 3 Apply patch. rdar://problem/91446317 4 5 2022-04-21 Youenn Fablet <youenn@apple.com> 6 7 Website policies are not respected when doing COOP based process swap 8 https://bugs.webkit.org/show_bug.cgi?id=238036 9 <rdar://89616625> 10 11 Reviewed by Chris Dumez. 12 13 * TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm: 14 1 15 2022-04-22 Russell Epstein <repstein@apple.com> 2 16 -
branches/safari-613.2.7.1-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm
r293247 r293248 8259 8259 8260 8260 #endif 8261 8262 #if PLATFORM(IOS_FAMILY) 8263 TEST(ProcessSwap, ContentModeInCaseOfCoopProcessSwap) 8264 { 8265 using namespace TestWebKitAPI; 8266 8267 HTTPServer server({ 8268 { "/source.html", { "foo" } }, 8269 { "/destination.html", { { { "Content-Type", "text/html" }, { "Cross-Origin-Opener-Policy", "same-origin" } }, "bar" } }, 8270 }, HTTPServer::Protocol::Https); 8271 8272 auto processPoolConfiguration = psonProcessPoolConfiguration(); 8273 auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]); 8274 8275 auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]); 8276 [webViewConfiguration setProcessPool:processPool.get()]; 8277 8278 auto webpagePreferences = adoptNS([[WKWebpagePreferences alloc] init]); 8279 [webpagePreferences setPreferredContentMode:WKContentModeDesktop]; 8280 [webViewConfiguration setDefaultWebpagePreferences:webpagePreferences.get()]; 8281 8282 auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768) configuration:webViewConfiguration.get()]); 8283 auto navigationDelegate = adoptNS([[PSONNavigationDelegate alloc] init]); 8284 [webView setNavigationDelegate:navigationDelegate.get()]; 8285 8286 done = false; 8287 [webView loadRequest:server.request("/source.html")]; 8288 Util::run(&done); 8289 done = false; 8290 8291 [webView evaluateJavaScript:@"navigator.userAgent;" completionHandler:^(id _Nullable response, NSError * _Nullable error) { 8292 done = true; 8293 8294 ASSERT_TRUE(!error); 8295 NSString *userAgent = (NSString *)response; 8296 ASSERT_TRUE([userAgent containsString:@"Macintosh; Intel Mac"]); 8297 }]; 8298 Util::run(&done); 8299 done = false; 8300 8301 auto pid1 = [webView _webProcessIdentifier]; 8302 8303 [webView loadRequest:server.request("/destination.html")]; 8304 Util::run(&done); 8305 done = false; 8306 8307 [webView evaluateJavaScript:@"navigator.userAgent;" completionHandler:^(id _Nullable response, NSError * _Nullable error) { 8308 done = true; 8309 8310 ASSERT_TRUE(!error); 8311 NSString *userAgent = (NSString *)response; 8312 ASSERT_TRUE([userAgent containsString:@"Macintosh; Intel Mac"]); 8313 }]; 8314 Util::run(&done); 8315 done = false; 8316 8317 auto pid2 = [webView _webProcessIdentifier]; 8318 EXPECT_NE(pid1, pid2); 8319 8320 [webView goBack]; // Back to source.html. 8321 Util::run(&done); 8322 done = false; 8323 8324 [webView evaluateJavaScript:@"navigator.userAgent;" completionHandler:^(id _Nullable response, NSError * _Nullable error) { 8325 done = true; 8326 8327 ASSERT_TRUE(!error); 8328 NSString *userAgent = (NSString *)response; 8329 ASSERT_TRUE([userAgent containsString:@"Macintosh; Intel Mac"]); 8330 }]; 8331 Util::run(&done); 8332 done = false; 8333 } 8334 8335 TEST(ProcessSwap, ContentModeInCaseOfPSONThenCoopProcessSwap) 8336 { 8337 using namespace TestWebKitAPI; 8338 8339 HTTPServer server1({ 8340 { "/source.html", { "foo" } }, 8341 }, HTTPServer::Protocol::Https); 8342 8343 HTTPServer server2({ 8344 { "/destination.html", { { { "Content-Type", "text/html" }, { "Cross-Origin-Opener-Policy", "same-origin" } }, "bar" } }, 8345 }, HTTPServer::Protocol::Http); 8346 8347 auto processPoolConfiguration = psonProcessPoolConfiguration(); 8348 auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]); 8349 8350 auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]); 8351 [webViewConfiguration setProcessPool:processPool.get()]; 8352 8353 auto webpagePreferences = adoptNS([[WKWebpagePreferences alloc] init]); 8354 [webpagePreferences setPreferredContentMode:WKContentModeDesktop]; 8355 [webViewConfiguration setDefaultWebpagePreferences:webpagePreferences.get()]; 8356 8357 auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768) configuration:webViewConfiguration.get()]); 8358 auto navigationDelegate = adoptNS([[PSONNavigationDelegate alloc] init]); 8359 [webView setNavigationDelegate:navigationDelegate.get()]; 8360 8361 done = false; 8362 [webView loadRequest:server1.request("/source.html")]; 8363 Util::run(&done); 8364 done = false; 8365 8366 [webView evaluateJavaScript:@"navigator.userAgent;" completionHandler:^(id _Nullable response, NSError * _Nullable error) { 8367 done = true; 8368 8369 ASSERT_TRUE(!error); 8370 NSString *userAgent = (NSString *)response; 8371 ASSERT_TRUE([userAgent containsString:@"Macintosh; Intel Mac"]); 8372 }]; 8373 Util::run(&done); 8374 done = false; 8375 8376 auto pid1 = [webView _webProcessIdentifier]; 8377 8378 [webView loadRequest:server2.request("/destination.html")]; 8379 Util::run(&done); 8380 done = false; 8381 8382 [webView evaluateJavaScript:@"navigator.userAgent;" completionHandler:^(id _Nullable response, NSError * _Nullable error) { 8383 done = true; 8384 8385 ASSERT_TRUE(!error); 8386 NSString *userAgent = (NSString *)response; 8387 ASSERT_TRUE([userAgent containsString:@"Macintosh; Intel Mac"]); 8388 }]; 8389 Util::run(&done); 8390 done = false; 8391 8392 auto pid2 = [webView _webProcessIdentifier]; 8393 EXPECT_NE(pid1, pid2); 8394 8395 [webView goBack]; // Back to source.html. 8396 Util::run(&done); 8397 done = false; 8398 8399 [webView evaluateJavaScript:@"navigator.userAgent;" completionHandler:^(id _Nullable response, NSError * _Nullable error) { 8400 done = true; 8401 8402 ASSERT_TRUE(!error); 8403 NSString *userAgent = (NSString *)response; 8404 ASSERT_TRUE([userAgent containsString:@"Macintosh; Intel Mac"]); 8405 }]; 8406 Util::run(&done); 8407 done = false; 8408 } 8409 #endif // PLATFORM(IOS_FAMILY)
Note: See TracChangeset
for help on using the changeset viewer.