Changeset 238218 in webkit


Ignore:
Timestamp:
Nov 14, 2018 7:35:37 PM (5 years ago)
Author:
Chris Dumez
Message:

WebKit.DecidePolicyForNavigationActionForHyperlinkThatRedirects API fails when PSON is enabled
https://bugs.webkit.org/show_bug.cgi?id=191640

Reviewed by Alex Christensen.

Source/WebKit:

The issue was that when process-swapping on a redirect, the parameters provided by the new
WebContent process for navigationActionData / originatingFrameInfoData / frameSecurityOrigin
are not correct because it does not have sufficient information (it does not know a swap
happened).

To address the issue, we now store the navigationActionData / originatingFrameInfoData /
frameSecurityOrigin on the Navigation object whenever decidePolicyForNavigationAction is
called. If the decidePolicyForNavigationAction is for a redirect, use the ones we stored
on the Navigation object instead of the ones provided by the WebContent process. In case
of redirect, those do not change anyway.

This fixes all WebKit.DecidePolicyForNavigationAction* tests with PSON enabled.

  • UIProcess/API/APINavigation.h:

(API::Navigation::currentRequestIsRedirect const):
(API::Navigation::wasUserInitiated const):
(API::Navigation::shouldForceDownload const):
(API::Navigation::treatAsSameOriginNavigation const):
(API::Navigation::hasOpenedFrames const):
(API::Navigation::openedViaWindowOpenWithOpener const):
(API::Navigation::opener const):
(API::Navigation::requesterOrigin const):
(API::Navigation::lockHistory const):
(API::Navigation::lockBackForwardList const):
(API::Navigation::clientRedirectSourceForHistory const):
(API::Navigation::setLastNavigationAction):
(API::Navigation::lastNavigationAction const):
(API::Navigation::setOriginatingFrameInfo):
(API::Navigation::originatingFrameInfo const):
(API::Navigation::setDestinationFrameSecurityOrigin):
(API::Navigation::destinationFrameSecurityOrigin const):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::decidePolicyForNavigationActionAsync):
(WebKit::WebPageProxy::decidePolicyForNavigationAction):
(WebKit::WebPageProxy::decidePolicyForNavigationActionSync):

  • UIProcess/WebPageProxy.h:

Tools:

Add API test coverage.

  • TestWebKitAPI/Tests/WebKitCocoa/DecidePolicyForNavigationAction.mm:

(runDecidePolicyForNavigationActionForHyperlinkThatRedirects):
(TEST):

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r238215 r238218  
     12018-11-14  Chris Dumez  <cdumez@apple.com>
     2
     3        WebKit.DecidePolicyForNavigationActionForHyperlinkThatRedirects API fails when PSON is enabled
     4        https://bugs.webkit.org/show_bug.cgi?id=191640
     5
     6        Reviewed by Alex Christensen.
     7
     8        The issue was that when process-swapping on a redirect, the parameters provided by the new
     9        WebContent process for navigationActionData / originatingFrameInfoData / frameSecurityOrigin
     10        are not correct because it does not have sufficient information (it does not know a swap
     11        happened).
     12
     13        To address the issue, we now store the navigationActionData / originatingFrameInfoData /
     14        frameSecurityOrigin on the Navigation object whenever decidePolicyForNavigationAction is
     15        called. If the decidePolicyForNavigationAction is for a redirect, use the ones we stored
     16        on the Navigation object instead of the ones provided by the WebContent process. In case
     17        of redirect, those do not change anyway.
     18
     19        This fixes all WebKit.DecidePolicyForNavigationAction* tests with PSON enabled.
     20
     21        * UIProcess/API/APINavigation.h:
     22        (API::Navigation::currentRequestIsRedirect const):
     23        (API::Navigation::wasUserInitiated const):
     24        (API::Navigation::shouldForceDownload const):
     25        (API::Navigation::treatAsSameOriginNavigation const):
     26        (API::Navigation::hasOpenedFrames const):
     27        (API::Navigation::openedViaWindowOpenWithOpener const):
     28        (API::Navigation::opener const):
     29        (API::Navigation::requesterOrigin const):
     30        (API::Navigation::lockHistory const):
     31        (API::Navigation::lockBackForwardList const):
     32        (API::Navigation::clientRedirectSourceForHistory const):
     33        (API::Navigation::setLastNavigationAction):
     34        (API::Navigation::lastNavigationAction const):
     35        (API::Navigation::setOriginatingFrameInfo):
     36        (API::Navigation::originatingFrameInfo const):
     37        (API::Navigation::setDestinationFrameSecurityOrigin):
     38        (API::Navigation::destinationFrameSecurityOrigin const):
     39        * UIProcess/WebPageProxy.cpp:
     40        (WebKit::WebPageProxy::decidePolicyForNavigationActionAsync):
     41        (WebKit::WebPageProxy::decidePolicyForNavigationAction):
     42        (WebKit::WebPageProxy::decidePolicyForNavigationActionSync):
     43        * UIProcess/WebPageProxy.h:
     44
    1452018-11-14  Chris Dumez  <cdumez@apple.com>
    246
  • trunk/Source/WebKit/UIProcess/API/APINavigation.h

    r238179 r238218  
    2828#include "APIObject.h"
    2929#include "DataReference.h"
     30#include "FrameInfoData.h"
     31#include "NavigationActionData.h"
    3032#include "WebBackForwardListItem.h"
    3133#include <WebCore/Process.h>
     
    9496    std::optional<WebCore::ProcessIdentifier> currentRequestProcessIdentifier() const { return m_currentRequestProcessIdentifier; }
    9597
    96     void setCurrentRequestIsRedirect(bool isRedirect) { m_isRedirect = isRedirect; }
    97     bool currentRequestIsRedirect() const { return m_isRedirect; }
     98    bool currentRequestIsRedirect() const { return m_lastNavigationAction.isRedirect; }
    9899
    99100    void setTargetItem(WebKit::WebBackForwardListItem& item) { m_targetItem = &item; }
     
    105106    Vector<WebCore::URL> takeRedirectChain() { return WTFMove(m_redirectChain); }
    106107
    107     void setWasUserInitiated(bool value) { m_wasUserInitiated = value; }
    108     bool wasUserInitiated() const { return m_wasUserInitiated; }
     108    bool wasUserInitiated() const { return !!m_lastNavigationAction.userGestureTokenIdentifier; }
    109109
    110     void setShouldForceDownload(bool value) { m_shouldForceDownload = value; }
    111     bool shouldForceDownload() const { return m_shouldForceDownload; }
     110    bool shouldForceDownload() const
     111    {
     112#if USE(SYSTEM_PREVIEW)
     113        return !m_lastNavigationAction.downloadAttribute.isNull() || currentRequest().isSystemPreview();
     114#else
     115        return !m_lastNavigationAction.downloadAttribute.isNull();
     116#endif
     117    }
    112118
    113     void setTreatAsSameOriginNavigation(bool value) { m_treatAsSameOriginNavigation = value; }
    114     bool treatAsSameOriginNavigation() const { return m_treatAsSameOriginNavigation; }
     119    bool treatAsSameOriginNavigation() const { return m_lastNavigationAction.treatAsSameOriginNavigation; }
     120    bool hasOpenedFrames() const { return m_lastNavigationAction.hasOpenedFrames; }
     121    bool openedViaWindowOpenWithOpener() const { return m_lastNavigationAction.openedViaWindowOpenWithOpener; }
     122    const std::optional<std::pair<uint64_t, uint64_t>>& opener() const { return m_lastNavigationAction.opener; }
     123    const WebCore::SecurityOriginData& requesterOrigin() const { return m_lastNavigationAction.requesterOrigin; }
    115124
    116     void setHasOpenedFrames(bool value) { m_hasOpenedFrames = value; }
    117     bool hasOpenedFrames() const { return m_hasOpenedFrames; }
     125    WebCore::LockHistory lockHistory() const { return m_lastNavigationAction.lockHistory; }
     126    WebCore::LockBackForwardList lockBackForwardList() const { return m_lastNavigationAction.lockBackForwardList; }
    118127
    119     bool openedViaWindowOpenWithOpener() const { return m_openedViaWindowOpenWithOpener; }
    120     void setOpenedViaWindowOpenWithOpener() { m_openedViaWindowOpenWithOpener = true; }
     128    WTF::String clientRedirectSourceForHistory() const { return m_lastNavigationAction.clientRedirectSourceForHistory; }
    121129
    122     void setOpener(const std::optional<std::pair<uint64_t, uint64_t>>& opener) { m_opener = opener; }
    123     const std::optional<std::pair<uint64_t, uint64_t>>& opener() const { return m_opener; }
     130    void setLastNavigationAction(const WebKit::NavigationActionData& navigationAction) { m_lastNavigationAction = navigationAction; }
     131    const WebKit::NavigationActionData& lastNavigationAction() const { return m_lastNavigationAction; }
    124132
    125     void setRequesterOrigin(const WebCore::SecurityOriginData& origin) { m_requesterOrigin = origin; }
    126     const WebCore::SecurityOriginData& requesterOrigin() const { return m_requesterOrigin; }
     133    void setOriginatingFrameInfo(const WebKit::FrameInfoData& frameInfo) { m_originatingFrameInfo = frameInfo; }
     134    const WebKit::FrameInfoData& originatingFrameInfo() const { return m_originatingFrameInfo; }
    127135
    128     void setLockHistory(WebCore::LockHistory lockHistory) { m_lockHistory = lockHistory; }
    129     WebCore::LockHistory lockHistory() const { return m_lockHistory; }
    130 
    131     void setLockBackForwardList(WebCore::LockBackForwardList lockBackForwardList) { m_lockBackForwardList = lockBackForwardList; }
    132     WebCore::LockBackForwardList lockBackForwardList() const { return m_lockBackForwardList; }
    133 
    134     void setClientRedirectSourceForHistory(const WTF::String& clientRedirectSourceForHistory) { m_clientRedirectSourceForHistory = clientRedirectSourceForHistory; }
    135     WTF::String clientRedirectSourceForHistory() const { return m_clientRedirectSourceForHistory; }
     136    void setDestinationFrameSecurityOrigin(const WebCore::SecurityOriginData& origin) { m_destinationFrameSecurityOrigin = origin; }
     137    const WebCore::SecurityOriginData& destinationFrameSecurityOrigin() const { return m_destinationFrameSecurityOrigin; }
    136138
    137139#if !LOG_DISABLED
     
    152154    std::optional<WebCore::ProcessIdentifier> m_currentRequestProcessIdentifier;
    153155    Vector<WebCore::URL> m_redirectChain;
    154     bool m_wasUserInitiated { true };
    155     bool m_shouldForceDownload { false };
    156     bool m_isRedirect { false };
    157156
    158157    RefPtr<WebKit::WebBackForwardListItem> m_targetItem;
    159158    RefPtr<WebKit::WebBackForwardListItem> m_fromItem;
    160159    std::optional<WebCore::FrameLoadType> m_backForwardFrameLoadType;
    161     bool m_treatAsSameOriginNavigation { false };
    162     bool m_hasOpenedFrames { false };
    163     bool m_openedViaWindowOpenWithOpener { false };
    164     std::optional<std::pair<uint64_t, uint64_t>> m_opener;
    165     WebCore::SecurityOriginData m_requesterOrigin;
    166     WebCore::LockHistory m_lockHistory;
    167     WebCore::LockBackForwardList m_lockBackForwardList;
    168     WTF::String m_clientRedirectSourceForHistory;
    169160    std::unique_ptr<SubstituteData> m_substituteData;
     161    WebKit::NavigationActionData m_lastNavigationAction;
     162    WebKit::FrameInfoData m_originatingFrameInfo;
     163    WebCore::SecurityOriginData m_destinationFrameSecurityOrigin;
    170164};
    171165
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r238193 r238218  
    41594159#endif
    41604160
    4161 void WebPageProxy::decidePolicyForNavigationActionAsync(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&& navigationActionData, const FrameInfoData& frameInfoData, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&& request, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&& redirectResponse, const UserData& userData, WebCore::ShouldSkipSafeBrowsingCheck shouldSkipSafeBrowsingCheck, uint64_t listenerID)
     4161void WebPageProxy::decidePolicyForNavigationActionAsync(uint64_t frameID, WebCore::SecurityOriginData&& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&& navigationActionData, FrameInfoData&& frameInfoData, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&& request, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&& redirectResponse, const UserData& userData, WebCore::ShouldSkipSafeBrowsingCheck shouldSkipSafeBrowsingCheck, uint64_t listenerID)
    41624162{
    41634163    auto* frame = m_process->webFrame(frameID);
    41644164    MESSAGE_CHECK(frame);
    41654165
    4166     decidePolicyForNavigationAction(*frame, frameSecurityOrigin, navigationID, WTFMove(navigationActionData), frameInfoData, originatingPageID, originalRequest, WTFMove(request), WTFMove(requestBody), WTFMove(redirectResponse), userData, shouldSkipSafeBrowsingCheck, PolicyDecisionSender::create([this, protectedThis = makeRef(*this), frameID, listenerID] (auto... args) {
     4166    decidePolicyForNavigationAction(*frame, WTFMove(frameSecurityOrigin), navigationID, WTFMove(navigationActionData), WTFMove(frameInfoData), originatingPageID, originalRequest, WTFMove(request), WTFMove(requestBody), WTFMove(redirectResponse), userData, shouldSkipSafeBrowsingCheck, PolicyDecisionSender::create([this, protectedThis = makeRef(*this), frameID, listenerID] (auto... args) {
    41674167        m_process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID);
    41684168    }));
    41694169}
    41704170
    4171 void WebPageProxy::decidePolicyForNavigationAction(WebFrameProxy& frame, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&& navigationActionData, const FrameInfoData& originatingFrameInfoData, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&& request, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&& redirectResponse, const UserData& userData, WebCore::ShouldSkipSafeBrowsingCheck shouldSkipSafeBrowsingCheck, Ref<PolicyDecisionSender>&& sender)
     4171void WebPageProxy::decidePolicyForNavigationAction(WebFrameProxy& frame, WebCore::SecurityOriginData&& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&& navigationActionData, FrameInfoData&& originatingFrameInfoData, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&& request, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&& redirectResponse, const UserData& userData, WebCore::ShouldSkipSafeBrowsingCheck shouldSkipSafeBrowsingCheck, Ref<PolicyDecisionSender>&& sender)
    41724172{
    41734173    LOG(Loading, "WebPageProxy::decidePolicyForNavigationAction - Original URL %s, current target URL %s", originalRequest.url().string().utf8().data(), request.url().string().utf8().data());
     
    41904190    if (navigationID)
    41914191        navigation = m_navigationState->navigation(navigationID);
     4192
     4193    // When process-swapping on a redirect, the navigationActionData / originatingFrameInfoData / frameSecurityOrigin provided by the fresh new WebProcess are inaccurate since
     4194    // the new process does not have sufficient information. To address the issue, we restore the information we stored on the NavigationAction during the original request
     4195    // policy decision.
     4196    if (navigationActionData.isRedirect && navigation) {
     4197        navigationActionData = navigation->lastNavigationAction();
     4198        navigationActionData.isRedirect = true;
     4199        originatingFrameInfoData = navigation->originatingFrameInfo();
     4200        frameSecurityOrigin = navigation->destinationFrameSecurityOrigin();
     4201    }
    41924202
    41934203    if (auto targetBackForwardItemIdentifier = navigationActionData.targetBackForwardItemIdentifier) {
     
    42044214
    42054215    uint64_t newNavigationID = navigation->navigationID();
    4206     navigation->setWasUserInitiated(!!navigationActionData.userGestureTokenIdentifier);
    4207 #if USE(SYSTEM_PREVIEW)
    4208     navigation->setShouldForceDownload(!navigationActionData.downloadAttribute.isNull() || request.isSystemPreview());
    4209 #else
    4210     navigation->setShouldForceDownload(!navigationActionData.downloadAttribute.isNull());
    4211 #endif
    42124216    navigation->setCurrentRequest(ResourceRequest(request), m_process->coreProcessIdentifier());
    4213     navigation->setCurrentRequestIsRedirect(navigationActionData.isRedirect);
    4214     navigation->setTreatAsSameOriginNavigation(navigationActionData.treatAsSameOriginNavigation);
    4215     navigation->setHasOpenedFrames(navigationActionData.hasOpenedFrames);
    4216     if (navigationActionData.openedViaWindowOpenWithOpener)
    4217         navigation->setOpenedViaWindowOpenWithOpener();
    4218     navigation->setOpener(navigationActionData.opener);
    4219     navigation->setRequesterOrigin(navigationActionData.requesterOrigin);
    4220     navigation->setLockHistory(navigationActionData.lockHistory);
    4221     navigation->setLockBackForwardList(navigationActionData.lockBackForwardList);
    4222     navigation->setClientRedirectSourceForHistory(navigationActionData.clientRedirectSourceForHistory);
     4217    navigation->setLastNavigationAction(navigationActionData);
     4218    navigation->setOriginatingFrameInfo(originatingFrameInfoData);
     4219    navigation->setDestinationFrameSecurityOrigin(frameSecurityOrigin);
    42234220
    42244221#if ENABLE(CONTENT_FILTERING)
     
    42944291}
    42954292
    4296 void WebPageProxy::decidePolicyForNavigationActionSync(uint64_t frameID, bool isMainFrame, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&& navigationActionData, const FrameInfoData& frameInfoData, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&& request, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&& redirectResponse, const UserData& userData, WebCore::ShouldSkipSafeBrowsingCheck shouldSkipSafeBrowsingCheck, Messages::WebPageProxy::DecidePolicyForNavigationActionSync::DelayedReply&& reply)
     4293void WebPageProxy::decidePolicyForNavigationActionSync(uint64_t frameID, bool isMainFrame, WebCore::SecurityOriginData&& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&& navigationActionData, FrameInfoData&& frameInfoData, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&& request, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&& redirectResponse, const UserData& userData, WebCore::ShouldSkipSafeBrowsingCheck shouldSkipSafeBrowsingCheck, Messages::WebPageProxy::DecidePolicyForNavigationActionSync::DelayedReply&& reply)
    42974294{
    42984295    auto sender = PolicyDecisionSender::create(WTFMove(reply));
     
    43104307    }
    43114308
    4312     decidePolicyForNavigationAction(*frame, frameSecurityOrigin, navigationID, WTFMove(navigationActionData), frameInfoData, originatingPageID, originalRequest, WTFMove(request), WTFMove(requestBody), WTFMove(redirectResponse), userData, shouldSkipSafeBrowsingCheck, sender.copyRef());
     4309    decidePolicyForNavigationAction(*frame, WTFMove(frameSecurityOrigin), navigationID, WTFMove(navigationActionData), WTFMove(frameInfoData), originatingPageID, originalRequest, WTFMove(request), WTFMove(requestBody), WTFMove(redirectResponse), userData, shouldSkipSafeBrowsingCheck, sender.copyRef());
    43134310
    43144311    // If the client did not respond synchronously, proceed with the load.
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r238193 r238218  
    14681468    void didDestroyNavigation(uint64_t navigationID);
    14691469
    1470     void decidePolicyForNavigationAction(WebFrameProxy&, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&&, const FrameInfoData&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&&, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&& redirectResponse, const UserData&, WebCore::ShouldSkipSafeBrowsingCheck, Ref<PolicyDecisionSender>&&);
    1471     void decidePolicyForNavigationActionAsync(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&&, const FrameInfoData&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&&, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&& redirectResponse, const UserData&, WebCore::ShouldSkipSafeBrowsingCheck, uint64_t listenerID);
    1472     void decidePolicyForNavigationActionSync(uint64_t frameID, bool isMainFrame, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&&, const FrameInfoData&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&&, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&& redirectResponse, const UserData&, WebCore::ShouldSkipSafeBrowsingCheck, Messages::WebPageProxy::DecidePolicyForNavigationActionSync::DelayedReply&&);
     1470    void decidePolicyForNavigationAction(WebFrameProxy&, WebCore::SecurityOriginData&& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&&, FrameInfoData&&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&&, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&& redirectResponse, const UserData&, WebCore::ShouldSkipSafeBrowsingCheck, Ref<PolicyDecisionSender>&&);
     1471    void decidePolicyForNavigationActionAsync(uint64_t frameID, WebCore::SecurityOriginData&& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&&, FrameInfoData&&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&&, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&& redirectResponse, const UserData&, WebCore::ShouldSkipSafeBrowsingCheck, uint64_t listenerID);
     1472    void decidePolicyForNavigationActionSync(uint64_t frameID, bool isMainFrame, WebCore::SecurityOriginData&& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&&, FrameInfoData&&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&&, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&& redirectResponse, const UserData&, WebCore::ShouldSkipSafeBrowsingCheck, Messages::WebPageProxy::DecidePolicyForNavigationActionSync::DelayedReply&&);
    14731473    void decidePolicyForNewWindowAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, NavigationActionData&&, WebCore::ResourceRequest&&, const String& frameName, uint64_t listenerID, const UserData&);
    14741474    void decidePolicyForResponse(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, uint64_t listenerID, const UserData&);
  • trunk/Tools/ChangeLog

    r238216 r238218  
     12018-11-14  Chris Dumez  <cdumez@apple.com>
     2
     3        WebKit.DecidePolicyForNavigationActionForHyperlinkThatRedirects API fails when PSON is enabled
     4        https://bugs.webkit.org/show_bug.cgi?id=191640
     5
     6        Reviewed by Alex Christensen.
     7
     8        Add API test coverage.
     9
     10        * TestWebKitAPI/Tests/WebKitCocoa/DecidePolicyForNavigationAction.mm:
     11        (runDecidePolicyForNavigationActionForHyperlinkThatRedirects):
     12        (TEST):
     13
    1142018-11-14  Chris Dumez  <cdumez@apple.com>
    215
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/DecidePolicyForNavigationAction.mm

    r230919 r238218  
    3131#import "TestProtocol.h"
    3232#import <WebKit/WKNavigationActionPrivate.h>
     33#import <WebKit/WKProcessPoolPrivate.h>
     34#import <WebKit/_WKProcessPoolConfiguration.h>
    3335#import <wtf/RetainPtr.h>
    3436#import <wtf/mac/AppKitCompatibilityDeclarations.h>
     
    432434}
    433435
    434 TEST(WebKit, DecidePolicyForNavigationActionForHyperlinkThatRedirects)
    435 {
    436     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
     436enum class ShouldEnableProcessSwap { No, Yes };
     437static void runDecidePolicyForNavigationActionForHyperlinkThatRedirects(ShouldEnableProcessSwap shouldEnableProcessSwap)
     438{
     439    auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
     440    processPoolConfiguration.get().processSwapsOnNavigation = shouldEnableProcessSwap == ShouldEnableProcessSwap::Yes ? YES : NO;
     441    auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
     442
     443    auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
     444    [webViewConfiguration setProcessPool:processPool.get()];
     445
     446    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]);
    437447
    438448    auto window = adoptNS([[NSWindow alloc] initWithContentRect:[webView frame] styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:YES]);
     
    480490    newWebView = nullptr;
    481491    action = nullptr;
     492}
     493
     494TEST(WebKit, DecidePolicyForNavigationActionForHyperlinkThatRedirectsWithoutPSON)
     495{
     496    runDecidePolicyForNavigationActionForHyperlinkThatRedirects(ShouldEnableProcessSwap::No);
     497}
     498
     499TEST(WebKit, DecidePolicyForNavigationActionForHyperlinkThatRedirectsWithPSON)
     500{
     501    runDecidePolicyForNavigationActionForHyperlinkThatRedirects(ShouldEnableProcessSwap::Yes);
    482502}
    483503
Note: See TracChangeset for help on using the changeset viewer.