Changeset 293248 in webkit


Ignore:
Timestamp:
Apr 22, 2022 1:39:17 PM (2 years ago)
Author:
Russell Epstein
Message:

Apply patch. rdar://problem/91446317

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  
     12022-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
    1342022-04-22  Russell Epstein  <repstein@apple.com>
    235
  • branches/safari-613.2.7.1-branch/Source/WebKit/UIProcess/API/APINavigation.h

    r293247 r293248  
    2727
    2828#include "APIObject.h"
     29#include "APIWebsitePolicies.h"
    2930#include "DataReference.h"
    3031#include "FrameInfoData.h"
     
    172173    bool isLoadedWithNavigationShared() const { return m_isLoadedWithNavigationShared; }
    173174
     175    void setWebsitePolicies(RefPtr<API::WebsitePolicies>&& policies) { m_websitePolicies = WTFMove(policies); }
     176    API::WebsitePolicies* websitePolicies() { return m_websitePolicies.get(); }
     177
    174178private:
    175179    explicit Navigation(WebKit::WebNavigationState&);
     
    198202    WebKit::ProcessThrottler::TimedActivity m_clientNavigationActivity;
    199203    bool m_isLoadedWithNavigationShared { false };
     204    RefPtr<API::WebsitePolicies> m_websitePolicies;
    200205};
    201206
  • branches/safari-613.2.7.1-branch/Source/WebKit/UIProcess/WebPageProxy.cpp

    r293247 r293248  
    34013401}
    34023402
    3403 void WebPageProxy::receivedNavigationPolicyDecision(PolicyAction policyAction, API::Navigation* navigation, Ref<API::NavigationAction>&& navigationAction, ProcessSwapRequestedByClient processSwapRequestedByClient, WebFrameProxy& frame, const FrameInfoData& frameInfo, RefPtr<API::WebsitePolicies>&& policies, Ref<PolicyDecisionSender>&& sender)
     3403void WebPageProxy::receivedNavigationPolicyDecision(PolicyAction policyAction, API::Navigation* navigation, Ref<API::NavigationAction>&& navigationAction, ProcessSwapRequestedByClient processSwapRequestedByClient, WebFrameProxy& frame, const FrameInfoData& frameInfo, Ref<PolicyDecisionSender>&& sender)
    34043404{
    34053405    WEBPAGEPROXY_RELEASE_LOG(Loading, "receivedNavigationPolicyDecision: frameID=%llu, navigationID=%llu, policyAction=%u", frame.frameID().toUInt64(), navigation ? navigation->navigationID() : 0, (unsigned)policyAction);
    34063406
    34073407    Ref<WebsiteDataStore> websiteDataStore = m_websiteDataStore.copyRef();
    3408     if (policies) {
     3408    if (auto* policies = navigation->websitePolicies()) {
    34093409        if (policies->websiteDataStore() && policies->websiteDataStore() != websiteDataStore.ptr()) {
    34103410            websiteDataStore = *policies->websiteDataStore();
     
    34163416
    34173417    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);
    34213421    }
    34223422
    34233423#if ENABLE(DEVICE_ORIENTATION)
    3424     if (navigation && (!policies || policies->deviceOrientationAndMotionAccessState() == WebCore::DeviceOrientationOrMotionPermissionState::Prompt)) {
     3424    if (navigation && (!navigation->websitePolicies() || navigation->websitePolicies()->deviceOrientationAndMotionAccessState() == WebCore::DeviceOrientationOrMotionPermissionState::Prompt)) {
    34253425        auto deviceOrientationPermission = websiteDataStore->deviceOrientationAndMotionAccessController().cachedDeviceOrientationPermission(SecurityOriginData::fromURL(navigation->currentRequest().url()));
    34263426        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);
    34303430        }
    34313431    }
     
    34413441
    34423442    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));
    34443444        return;
    34453445    }
     
    34543454    }
    34553455
    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 {
    34603459        // If the navigation has been destroyed, then no need to proceed.
    34613460        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));
    34633462            return;
    34643463        }
     
    34723471            WEBPAGEPROXY_RELEASE_LOG(ProcessSwapping, "decidePolicyForNavigationAction: keep using process %i for navigation, reason=%" PUBLIC_LOG_STRING, processIdentifier(), reason.utf8().data());
    34733472
    3474         std::optional<SandboxExtension::Handle> optionalHandle;
    34753473        if (shouldProcessSwap) {
    34763474            // Make sure the process to be used for the navigation does not get shutDown now due to destroying SuspendedPageProxy or ProvisionalPageProxy objects.
     
    34903488                suspendedPage = nullptr;
    34913489
    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);
    35023503            }
    35033504        }
    35043505
    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));
    35063507    });
    35073508}
    35083509
    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)
     3510void 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)
    35103511{
    35113512    if (!hasRunningProcess()) {
     
    35973598}
    35983599
    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)
     3600void WebPageProxy::continueNavigationInNewProcess(API::Navigation& navigation, std::unique_ptr<SuspendedPageProxy>&& suspendedPage, Ref<WebProcessProxy>&& newProcess, ProcessSwapRequestedByClient processSwapRequestedByClient, ShouldTreatAsContinuingLoad shouldTreatAsContinuingLoad, std::optional<NetworkResourceLoadIdentifier> existingNetworkResourceLoadIdentifierToResume)
    36003601{
    36013602    WEBPAGEPROXY_RELEASE_LOG(Loading, "continueNavigationInNewProcess: newProcessPID=%i, hasSuspendedPage=%i", newProcess->processIdentifier(), !!suspendedPage);
     
    36113612    }
    36123613
     3614    RefPtr websitePolicies = navigation.websitePolicies();
    36133615    bool isServerSideRedirect = shouldTreatAsContinuingLoad == ShouldTreatAsContinuingLoad::YesAfterNavigationPolicyDecision && navigation.currentRequestIsRedirect();
    36143616    bool isProcessSwappingOnNavigationResponse = shouldTreatAsContinuingLoad == ShouldTreatAsContinuingLoad::YesAfterProvisionalLoadStarted;
     
    54735475        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);
    54745476
    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 {
    54765479            if (frame->isMainFrame()) {
    5477                 if (!policies) {
     5480                if (!navigation->websitePolicies()) {
    54785481                    if (auto* defaultPolicies = m_configuration->defaultWebsitePolicies())
    5479                         policies = defaultPolicies->copy();
     5482                        navigation->setWebsitePolicies(defaultPolicies->copy());
    54805483                }
    5481                 if (policies)
     5484                if (auto* policies = navigation->websitePolicies())
    54825485                    navigation->setEffectiveContentMode(effectiveContentModeAfterAdjustingPolicies(*policies, navigation->currentRequest()));
    54835486            }
    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));
    54855488        };
    54865489
     
    57405743        processForNavigation = m_process->processPool().processForRegistrableDomain(websiteDataStore(), responseDomain, m_process->captivePortalMode());
    57415744
    5742     continueNavigationInNewProcess(*navigation, nullptr, processForNavigation.releaseNonNull(), ProcessSwapRequestedByClient::No, ShouldTreatAsContinuingLoad::YesAfterProvisionalLoadStarted, nullptr, existingNetworkResourceLoadIdentifierToResume);
     5745    continueNavigationInNewProcess(*navigation, nullptr, processForNavigation.releaseNonNull(), ProcessSwapRequestedByClient::No, ShouldTreatAsContinuingLoad::YesAfterProvisionalLoadStarted, existingNetworkResourceLoadIdentifierToResume);
    57435746    completionHandler(true);
    57445747}
  • branches/safari-613.2.7.1-branch/Source/WebKit/UIProcess/WebPageProxy.h

    r293247 r293248  
    12491249    class PolicyDecisionSender;
    12501250    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&, RefPtr<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>&&);
    12531253
    12541254    void backForwardRemovedItem(const WebCore::BackForwardItemIdentifier&);
     
    25122512    void reportPageLoadResult(const WebCore::ResourceError& = { });
    25132513
    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);
    25152515
    25162516    void setNeedsFontAttributes(bool);
  • branches/safari-613.2.7.1-branch/Tools/ChangeLog

    r293247 r293248  
     12022-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
    1152022-04-22  Russell Epstein  <repstein@apple.com>
    216
  • branches/safari-613.2.7.1-branch/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm

    r293247 r293248  
    82598259
    82608260#endif
     8261
     8262#if PLATFORM(IOS_FAMILY)
     8263TEST(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
     8335TEST(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.