Changeset 237267 in webkit


Ignore:
Timestamp:
Oct 18, 2018 2:41:41 PM (6 years ago)
Author:
Chris Dumez
Message:

[PSON] SuspendedPages do not report meaningful domains in Activity Monitor
https://bugs.webkit.org/show_bug.cgi?id=190721
<rdar://problem/45059699>

Reviewed by Alex Christensen.

Source/WebKit:

SuspendedPages do not report meaningful domains in Activity Monitor, which makes
debugging harder.

  • WebProcess/cocoa/WebProcessCocoa.mm:

(WebKit::origin):
(WebKit::WebProcess::updateActivePages):

Tools:

Add API test coverage.

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

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r237266 r237267  
     12018-10-18  Chris Dumez  <cdumez@apple.com>
     2
     3        [PSON] SuspendedPages do not report meaningful domains in Activity Monitor
     4        https://bugs.webkit.org/show_bug.cgi?id=190721
     5        <rdar://problem/45059699>
     6
     7        Reviewed by Alex Christensen.
     8
     9        SuspendedPages do not report meaningful domains in Activity Monitor, which makes
     10        debugging harder.
     11
     12        * WebProcess/cocoa/WebProcessCocoa.mm:
     13        (WebKit::origin):
     14        (WebKit::WebProcess::updateActivePages):
     15
    1162018-10-18  Alexey Proskuryakov  <ap@apple.com>
    217
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm

    r237266 r237267  
    575575}
    576576
     577- (NSArray<NSString *> *)_getActivePagesOriginsInWebProcessForTesting:(pid_t)pid
     578{
     579    auto activePagesOrigins = _processPool->activePagesOriginsInWebProcessForTesting(pid);
     580
     581    NSMutableArray<NSString *> *array = [[NSMutableArray alloc] initWithCapacity:activePagesOrigins.size()];
     582    for (auto& origin : activePagesOrigins)
     583        [array addObject:(NSString *)origin];
     584    return [array autorelease];
     585}
     586
    577587@end
    578588
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h

    r236690 r237267  
    114114- (void)_registerURLSchemeServiceWorkersCanHandle:(NSString *)scheme WK_API_AVAILABLE(macosx(10.13.4), ios(11.3));
    115115- (void)_setMaximumNumberOfProcesses:(NSUInteger)value WK_API_AVAILABLE(macosx(10.13.4), ios(11.3));
     116- (NSArray<NSString *> *)_getActivePagesOriginsInWebProcessForTesting:(pid_t)pid WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
    116117
    117118@property (nonatomic, getter=_isCookieStoragePartitioningEnabled, setter=_setCookieStoragePartitioningEnabled:) BOOL _cookieStoragePartitioningEnabled WK_API_DEPRECATED("Partitioned cookies are no longer supported", macosx(10.12.3, WK_MAC_TBA), ios(10.3, WK_IOS_TBA));
  • trunk/Source/WebKit/UIProcess/WebProcessPool.cpp

    r237266 r237267  
    13261326}
    13271327
     1328Vector<String> WebProcessPool::activePagesOriginsInWebProcessForTesting(ProcessID pid)
     1329{
     1330    for (auto& process : m_processes) {
     1331        if (process->processIdentifier() == pid)
     1332            return process->activePagesDomainsForTesting();
     1333    }
     1334    return { };
     1335}
     1336
    13281337void WebProcessPool::setAlwaysUsesComplexTextCodePath(bool alwaysUseComplexText)
    13291338{
  • trunk/Source/WebKit/UIProcess/WebProcessPool.h

    r237266 r237267  
    216216
    217217    ProcessID networkProcessIdentifier();
     218    Vector<String> activePagesOriginsInWebProcessForTesting(ProcessID);
    218219
    219220    WebPageGroup& defaultPageGroup() { return m_defaultPageGroup.get(); }
  • trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp

    r237266 r237267  
    14051405}
    14061406
     1407Vector<String> WebProcessProxy::activePagesDomainsForTesting()
     1408{
     1409    Vector<String> activeDomains;
     1410    sendSync(Messages::WebProcess::GetActivePagesOriginsForTesting(), Messages::WebProcess::GetActivePagesOriginsForTesting::Reply(activeDomains), 0);
     1411    return activeDomains;
     1412}
     1413
    14071414#if PLATFORM(WATCHOS)
    14081415
  • trunk/Source/WebKit/UIProcess/WebProcessProxy.h

    r237266 r237267  
    122122    unsigned visiblePageCount() const { return m_visiblePageCounter.value(); }
    123123
     124    Vector<String> activePagesDomainsForTesting(); // This is what is reported to ActivityMonitor.
     125
    124126    virtual bool isServiceWorkerProcess() const { return false; }
    125127
  • trunk/Source/WebKit/WebProcess/WebProcess.cpp

    r237266 r237267  
    13291329}
    13301330
     1331void WebProcess::getActivePagesOriginsForTesting(Vector<String>&)
     1332{
     1333}
     1334
    13311335void WebProcess::updateCPULimit()
    13321336{
  • trunk/Source/WebKit/WebProcess/WebProcess.h

    r237266 r237267  
    193193
    194194    void updateActivePages();
     195    void getActivePagesOriginsForTesting(Vector<String>&);
    195196    void pageActivityStateDidChange(uint64_t pageID, OptionSet<WebCore::ActivityState::Flag> changed);
    196197
  • trunk/Source/WebKit/WebProcess/WebProcess.messages.in

    r236959 r237267  
    130130
    131131    UpdateActivePages()
     132    GetActivePagesOriginsForTesting() -> (Vector<String> activeOrigins)
    132133
    133134#if PLATFORM(MAC)
  • trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm

    r237266 r237267  
    5555#import <WebCore/FontCache.h>
    5656#import <WebCore/FontCascade.h>
     57#import <WebCore/HistoryController.h>
     58#import <WebCore/HistoryItem.h>
    5759#import <WebCore/LocalizedStrings.h>
    5860#import <WebCore/LogInitialization.h>
     
    410412        return nil;
    411413
    412     URL mainFrameURL(URL(), mainFrame->url());
     414    URL mainFrameURL = { URL(), mainFrame->url() };
     415    if (page.isSuspended()) {
     416        // Suspended page are navigated to about:blank upon suspension so we really want to report the previous URL.
     417        if (auto* coreFrame = mainFrame->coreFrame()) {
     418            if (auto* backHistoryItem = coreFrame->loader().history().previousItem())
     419                mainFrameURL = { URL(), backHistoryItem->urlString() };
     420        }
     421    }
     422
    413423    Ref<SecurityOrigin> mainFrameOrigin = SecurityOrigin::create(mainFrameURL);
    414424    String mainFrameOriginString;
     
    427437#endif
    428438
     439#if PLATFORM(MAC)
     440static RetainPtr<NSArray<NSString *>> activePagesOrigins(const HashMap<uint64_t, RefPtr<WebPage>>& pageMap)
     441{
     442    RetainPtr<NSMutableArray<NSString *>> activeOrigins = adoptNS([[NSMutableArray alloc] init]);
     443
     444    for (auto& page : pageMap.values()) {
     445        if (page->usesEphemeralSession())
     446            continue;
     447
     448        if (NSURL *originAsURL = origin(*page))
     449            [activeOrigins addObject:userVisibleString(originAsURL)];
     450    }
     451
     452    return activeOrigins;
     453}
     454#endif
     455
    429456void WebProcess::updateActivePages()
    430457{
    431458#if PLATFORM(MAC)
    432     auto activePageURLs = adoptNS([[NSMutableArray alloc] init]);
    433 
    434     for (auto& page : m_pageMap.values()) {
    435         if (page->usesEphemeralSession() || page->isSuspended())
    436             continue;
    437 
    438         if (NSURL *originAsURL = origin(*page))
    439             [activePageURLs addObject:userVisibleString(originAsURL)];
    440     }
    441 
    442     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), [activePageURLs] {
    443         _LSSetApplicationInformationItem(kLSDefaultSessionID, _LSGetCurrentApplicationASN(), CFSTR("LSActivePageUserVisibleOriginsKey"), (__bridge CFArrayRef)activePageURLs.get(), nullptr);
     459    auto activeOrigins = activePagesOrigins(m_pageMap);
     460
     461    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), [activeOrigins = WTFMove(activeOrigins)] {
     462        _LSSetApplicationInformationItem(kLSDefaultSessionID, _LSGetCurrentApplicationASN(), CFSTR("LSActivePageUserVisibleOriginsKey"), (__bridge CFArrayRef)activeOrigins.get(), nullptr);
    444463    });
     464#endif
     465}
     466
     467void WebProcess::getActivePagesOriginsForTesting(Vector<String>& activeOrigins)
     468{
     469#if PLATFORM(MAC)
     470    auto activeOriginsAsNSStrings = activePagesOrigins(m_pageMap);
     471    activeOrigins.reserveCapacity([activeOriginsAsNSStrings count]);
     472    for (NSString* activeOrigin in activeOriginsAsNSStrings.get())
     473        activeOrigins.uncheckedAppend(activeOrigin);
     474#else
     475    UNUSED_PARAM(activeOrigins);
    445476#endif
    446477}
  • trunk/Tools/ChangeLog

    r237266 r237267  
     12018-10-18  Chris Dumez  <cdumez@apple.com>
     2
     3        [PSON] SuspendedPages do not report meaningful domains in Activity Monitor
     4        https://bugs.webkit.org/show_bug.cgi?id=190721
     5        <rdar://problem/45059699>
     6
     7        Reviewed by Alex Christensen.
     8
     9        Add API test coverage.
     10
     11        * TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm:
     12
    1132018-10-18  Alexey Proskuryakov  <ap@apple.com>
    214
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm

    r237257 r237267  
    517517}
    518518
     519#if PLATFORM(MAC)
     520TEST(ProcessSwap, SuspendedPagesInActivityMonitor)
     521{
     522    auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
     523    processPoolConfiguration.get().processSwapsOnNavigation = YES;
     524    auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
     525
     526    auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
     527    [webViewConfiguration setProcessPool:processPool.get()];
     528    auto handler = adoptNS([[PSONScheme alloc] init]);
     529    [handler addMappingFromURLString:@"pson://www.webkit.org/main.html" toData:testBytes];
     530    [handler addMappingFromURLString:@"pson://www.google.com/main.html" toData:testBytes];
     531    [webViewConfiguration setURLSchemeHandler:handler.get() forURLScheme:@"PSON"];
     532
     533    RetainPtr<PSONMessageHandler> messageHandler = adoptNS([[PSONMessageHandler alloc] init]);
     534    [[webViewConfiguration userContentController] addScriptMessageHandler:messageHandler.get() name:@"pson"];
     535
     536    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]);
     537    auto delegate = adoptNS([[PSONNavigationDelegate alloc] init]);
     538    [webView setNavigationDelegate:delegate.get()];
     539
     540    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"pson://www.webkit.org/main.html"]];
     541    [webView loadRequest:request];
     542
     543    TestWebKitAPI::Util::run(&done);
     544    done = false;
     545
     546    auto webkitPID = [webView _webProcessIdentifier];
     547    auto* activeDomains = [processPool _getActivePagesOriginsInWebProcessForTesting:webkitPID];
     548    EXPECT_EQ(1u, activeDomains.count);
     549    EXPECT_WK_STREQ(@"pson://www.webkit.org", activeDomains[0]);
     550
     551    request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"pson://www.google.com/main.html"]];
     552    [webView loadRequest:request];
     553
     554    TestWebKitAPI::Util::run(&done);
     555    done = false;
     556
     557    auto googlePID = [webView _webProcessIdentifier];
     558    EXPECT_NE(webkitPID, googlePID);
     559
     560    activeDomains = [processPool _getActivePagesOriginsInWebProcessForTesting:googlePID];
     561    EXPECT_EQ(1u, activeDomains.count);
     562    EXPECT_WK_STREQ(@"pson://www.google.com", activeDomains[0]);
     563
     564    activeDomains = [processPool _getActivePagesOriginsInWebProcessForTesting:webkitPID];
     565    EXPECT_EQ(1u, activeDomains.count);
     566    EXPECT_WK_STREQ(@"pson://www.webkit.org", activeDomains[0]);
     567
     568    [webView goBack]; // Back to webkit.org.
     569
     570    TestWebKitAPI::Util::run(&receivedMessage);
     571    receivedMessage = false;
     572    TestWebKitAPI::Util::run(&done);
     573    done = false;
     574
     575    auto pidAfterBackNavigation = [webView _webProcessIdentifier];
     576    EXPECT_EQ(webkitPID, pidAfterBackNavigation);
     577
     578    activeDomains = [processPool _getActivePagesOriginsInWebProcessForTesting:googlePID];
     579    EXPECT_EQ(1u, activeDomains.count);
     580    EXPECT_WK_STREQ(@"pson://www.google.com", activeDomains[0]);
     581
     582    activeDomains = [processPool _getActivePagesOriginsInWebProcessForTesting:webkitPID];
     583    EXPECT_EQ(1u, activeDomains.count);
     584    EXPECT_WK_STREQ(@"pson://www.webkit.org", activeDomains[0]);
     585}
     586#endif // PLATFORM(MAC)
     587
    519588TEST(ProcessSwap, BackWithoutSuspendedPage)
    520589{
Note: See TracChangeset for help on using the changeset viewer.