⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 279079 in webkit


Ignore:
Timestamp:
Jun 21, 2021, 1:47:29 PM (5 years ago)
Author:
Chris Dumez
Message:

[WK2] Don't process-swap on navigations within the same non-HTTP(s) protocol
https://bugs.webkit.org/show_bug.cgi?id=227220

Reviewed by Tim Horton.

Source/WebKit:

Don't process-swap on navigations within the same non-HTTP(s) protocol. Trying to extract registrable domains
from non-HTTP(s) URLs does not make much sense and leads to unexpected process swaps.

  • UIProcess/API/APIProcessPoolConfiguration.cpp:

(API::ProcessPoolConfiguration::copy):

  • UIProcess/API/APIProcessPoolConfiguration.h:
  • UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h:
  • UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm:

(-[_WKProcessPoolConfiguration setProcessSwapsOnNavigationWithinSameNonHTTPFamilyProtocol:]):
(-[_WKProcessPoolConfiguration processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol]):

  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::processForNavigationInternal):

  • UIProcess/WebProcessProxy.cpp:

(WebKit::WebProcessProxy::didStartProvisionalLoadForMainFrame):

Tools:

Add API test coverage.

  • TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm:
Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r279078 r279079  
     12021-06-21  Chris Dumez  <cdumez@apple.com>
     2
     3        [WK2] Don't process-swap on navigations within the same non-HTTP(s) protocol
     4        https://bugs.webkit.org/show_bug.cgi?id=227220
     5
     6        Reviewed by Tim Horton.
     7
     8        Don't process-swap on navigations within the same non-HTTP(s) protocol. Trying to extract registrable domains
     9        from non-HTTP(s) URLs does not make much sense and leads to unexpected process swaps.
     10
     11        * UIProcess/API/APIProcessPoolConfiguration.cpp:
     12        (API::ProcessPoolConfiguration::copy):
     13        * UIProcess/API/APIProcessPoolConfiguration.h:
     14        * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h:
     15        * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm:
     16        (-[_WKProcessPoolConfiguration setProcessSwapsOnNavigationWithinSameNonHTTPFamilyProtocol:]):
     17        (-[_WKProcessPoolConfiguration processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol]):
     18        * UIProcess/WebProcessPool.cpp:
     19        (WebKit::WebProcessPool::processForNavigationInternal):
     20        * UIProcess/WebProcessProxy.cpp:
     21        (WebKit::WebProcessProxy::didStartProvisionalLoadForMainFrame):
     22
    1232021-06-21  Megan Gardner  <megan_gardner@apple.com>
    224
  • trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp

    r275013 r279079  
    6565    copy->m_alwaysKeepAndReuseSwappedProcesses = this->m_alwaysKeepAndReuseSwappedProcesses;
    6666    copy->m_processSwapsOnWindowOpenWithOpener = this->m_processSwapsOnWindowOpenWithOpener;
     67    copy->m_processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol = this->m_processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol;
    6768    copy->m_isAutomaticProcessWarmingEnabledByClient = this->m_isAutomaticProcessWarmingEnabledByClient;
    6869    copy->m_usesWebProcessCache = this->m_usesWebProcessCache;
  • trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h

    r278253 r279079  
    129129    void setAlwaysKeepAndReuseSwappedProcesses(bool keepAndReuse) { m_alwaysKeepAndReuseSwappedProcesses = keepAndReuse; }
    130130
     131    bool processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol() const { return m_processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol; }
     132    void setProcessSwapsOnNavigationWithinSameNonHTTPFamilyProtocol(bool swaps) { m_processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol = swaps; }
     133
    131134    bool processSwapsOnWindowOpenWithOpener() const { return m_processSwapsOnWindowOpenWithOpener; }
    132135    void setProcessSwapsOnWindowOpenWithOpener(bool swaps) { m_processSwapsOnWindowOpenWithOpener = swaps; }
     
    170173    bool m_alwaysKeepAndReuseSwappedProcesses { false };
    171174    bool m_processSwapsOnWindowOpenWithOpener { false };
     175    bool m_processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol { false };
    172176    std::optional<bool> m_isAutomaticProcessWarmingEnabledByClient;
    173177    bool m_usesWebProcessCache { false };
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h

    r275013 r279079  
    6868@property (nonatomic) BOOL alwaysKeepAndReuseSwappedProcesses WK_API_AVAILABLE(macos(10.14), ios(12.0));
    6969@property (nonatomic) BOOL processSwapsOnWindowOpenWithOpener WK_API_AVAILABLE(macos(10.14), ios(12.0));
     70@property (nonatomic) BOOL processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    7071@property (nonatomic) BOOL prewarmsProcessesAutomatically WK_API_AVAILABLE(macos(10.14.4), ios(12.2));
    7172@property (nonatomic) BOOL usesWebProcessCache WK_API_AVAILABLE(macos(10.14.4), ios(12.2));
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm

    r275013 r279079  
    286286}
    287287
     288- (void)setProcessSwapsOnNavigationWithinSameNonHTTPFamilyProtocol:(BOOL)swaps
     289{
     290    _processPoolConfiguration->setProcessSwapsOnNavigationWithinSameNonHTTPFamilyProtocol(swaps);
     291}
     292
     293- (BOOL)processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol
     294{
     295    return _processPoolConfiguration->processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol();
     296}
     297
    288298- (BOOL)pageCacheEnabled
    289299{
  • trunk/Source/WebKit/UIProcess/WebProcessPool.cpp

    r278934 r279079  
    18451845    }
    18461846
     1847    // For non-HTTP(s) URLs, we only swap when navigating to a new scheme, unless processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol is set.
     1848    if (!m_configuration->processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol() && !sourceURL.protocolIsInHTTPFamily() && sourceURL.protocol() == targetURL.protocol())
     1849        return completionHandler(WTFMove(sourceProcess), nullptr, "Navigation within the same non-HTTP(s) protocol"_s);
     1850
    18471851    if (!sourceURL.isValid() || !targetURL.isValid() || sourceURL.isEmpty() || sourceURL.protocolIsAbout() || targetRegistrableDomain.matches(sourceURL))
    18481852        return completionHandler(WTFMove(sourceProcess), nullptr, "Navigation is same-site"_s);
  • trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp

    r279014 r279079  
    16271627        return;
    16281628
     1629    if (!url.protocolIsInHTTPFamily() && !processPool().configuration().processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol()) {
     1630        // Unless the processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol flag is set, we don't process swap on navigations withing the same
     1631        // non HTTP(s) protocol. For this reason, we ignore the registrable domain and processes are not eligible for the process cache.
     1632        m_registrableDomain = WebCore::RegistrableDomain { };
     1633        return;
     1634    }
     1635
    16291636    auto registrableDomain = WebCore::RegistrableDomain { url };
    16301637    if (m_registrableDomain && *m_registrableDomain != registrableDomain) {
  • trunk/Tools/ChangeLog

    r279074 r279079  
     12021-06-21  Chris Dumez  <cdumez@apple.com>
     2
     3        [WK2] Don't process-swap on navigations within the same non-HTTP(s) protocol
     4        https://bugs.webkit.org/show_bug.cgi?id=227220
     5
     6        Reviewed by Tim Horton.
     7
     8        Add API test coverage.
     9
     10        * TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm:
     11
    1122021-06-21  Alex Christensen  <achristensen@webkit.org>
    213
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm

    r278318 r279079  
    507507    processPoolConfiguration.get().usesWebProcessCache = YES;
    508508    processPoolConfiguration.get().prewarmsProcessesAutomatically = YES;
     509    processPoolConfiguration.get().processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol = YES;
    509510    return processPoolConfiguration;
    510511}
     
    565566{
    566567    runBasicTest(SchemeHandlerShouldBeAsync::Yes);
     568}
     569
     570TEST(ProcessSwap, NoProcessSwappingWithinSameNonHTTPFamilyProtocol)
     571{
     572    auto processPoolConfiguration = psonProcessPoolConfiguration();
     573    processPoolConfiguration.get().processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol = NO;
     574    auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
     575
     576    auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
     577    [webViewConfiguration setProcessPool:processPool.get()];
     578    auto handler = adoptNS([[PSONScheme alloc] init]);
     579    [webViewConfiguration setURLSchemeHandler:handler.get() forURLScheme:@"CUSTOM"];
     580
     581    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]);
     582    auto delegate = adoptNS([[PSONNavigationDelegate alloc] init]);
     583    [webView setNavigationDelegate:delegate.get()];
     584
     585    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"custom://abc/main1.html"]];
     586    [webView loadRequest:request];
     587    TestWebKitAPI::Util::run(&done);
     588    done = false;
     589
     590    auto pid1 = [webView _webProcessIdentifier];
     591
     592    request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"custom://def/main2.html"]];
     593    [webView loadRequest:request];
     594    TestWebKitAPI::Util::run(&done);
     595    done = false;
     596
     597    EXPECT_EQ(pid1, [webView _webProcessIdentifier]);
     598
     599    request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"custom://ghi/main3.html"]];
     600    [webView loadRequest:request];
     601    TestWebKitAPI::Util::run(&done);
     602    done = false;
     603
     604    EXPECT_EQ(pid1, [webView _webProcessIdentifier]);
     605
     606    // Switch to the file protocol.
     607    [webView loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"simple" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]]];
     608    TestWebKitAPI::Util::run(&done);
     609    done = false;
     610
     611    auto pid2 = [webView _webProcessIdentifier];
     612    EXPECT_NE(pid1, pid2);
     613
     614    [webView loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"simple2" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]]];
     615    TestWebKitAPI::Util::run(&done);
     616    done = false;
     617
     618    EXPECT_EQ(pid2, [webView _webProcessIdentifier]);
    567619}
    568620
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ResourceLoadStatistics.mm

    r276620 r279079  
    3636#import <WebKit/WKWebsiteDataRecordPrivate.h>
    3737#import <WebKit/WKWebsiteDataStorePrivate.h>
     38#import <WebKit/_WKProcessPoolConfiguration.h>
    3839#import <WebKit/_WKWebsiteDataStoreConfiguration.h>
    3940#import <wtf/RetainPtr.h>
     
    13391340TEST(ResourceLoadStatistics, BackForwardPerPageData)
    13401341{
     1342    auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
     1343    processPoolConfiguration.get().processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol = YES;
     1344    auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
     1345
    13411346    auto *dataStore = [WKWebsiteDataStore defaultDataStore];
    13421347    auto delegate = adoptNS([TestNavigationDelegate new]);
     
    13441349    auto schemeHandler = adoptNS([[ResourceLoadStatisticsSchemeHandler alloc] init]);
    13451350    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     1351    [configuration setProcessPool:processPool.get()];
    13461352    [configuration setURLSchemeHandler:schemeHandler.get() forURLScheme:@"resource-load-statistics"];
    13471353
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebViewEvaluateJavaScript.mm

    r277713 r279079  
    3939#import <WebKit/WKPreferencesPrivate.h>
    4040#import <WebKit/WKPreferencesRef.h>
     41#import <WebKit/WKProcessPoolPrivate.h>
    4142#import <WebKit/WKUserContentControllerPrivate.h>
    4243#import <WebKit/WKWebViewConfigurationPrivate.h>
    4344#import <WebKit/WKWebViewPrivate.h>
    4445#import <WebKit/_WKFrameTreeNode.h>
     46#import <WebKit/_WKProcessPoolConfiguration.h>
    4547#import <wtf/RetainPtr.h>
    4648
     
    751753TEST(EvaluateJavaScript, JavaScriptInMissingFrameAfterNavigationError)
    752754{
     755    auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
     756    processPoolConfiguration.get().processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol = YES;
     757    auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
     758
    753759    allFrames = adoptNS([[NSMutableSet<WKFrameInfo *> alloc] init]);
    754760
     
    775781
    776782    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     783    [configuration setProcessPool:processPool.get()];
    777784    [configuration setURLSchemeHandler:handler.get() forURLScheme:@"framestest"];
    778785    [configuration setURLSchemeHandler:handler.get() forURLScheme:@"otherprotocol"];
Note: See TracChangeset for help on using the changeset viewer.