Changeset 226325 in webkit


Ignore:
Timestamp:
Jan 2, 2018 9:21:37 AM (6 years ago)
Author:
achristensen@apple.com
Message:

Use new WebsiteDataStore passed in through decidePolicyForNavigation SPI
https://bugs.webkit.org/show_bug.cgi?id=180897
<rdar://problem/35535328>

Reviewed by Brent Fulgham.

Source/WebKit:

  • Shared/WebsitePoliciesData.cpp:

(WebKit::WebsitePoliciesData::applyToDocumentLoader):

  • UIProcess/Cocoa/NavigationState.mm:

(WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::changeWebsiteDataStore):

  • UIProcess/WebPageProxy.h:
  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::pageBeginUsingWebsiteDataStore):
(WebKit::WebProcessPool::pageEndUsingWebsiteDataStore):
(WebKit::WebProcessPool::pageAddedToProcess): Deleted.
(WebKit::WebProcessPool::pageRemovedFromProcess): Deleted.

  • UIProcess/WebProcessPool.h:
  • UIProcess/WebProcessProxy.cpp:

(WebKit::WebProcessProxy::addExistingWebPage):
(WebKit::WebProcessProxy::removeWebPage):

  • WebProcess/WebCoreSupport/mac/WebFrameNetworkingContext.mm:

(WebKit::WebFrameNetworkingContext::ensureWebsiteDataStoreSession):

Tools:

Test two forms of storage to be sure we are using a different WebsiteDataStore: cookies and sessionStorage.

  • TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm:

(-[WebsitePoliciesWebsiteDataStoreDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]):
(-[WebsitePoliciesWebsiteDataStoreDelegate webView:startURLSchemeTask:]):
(-[WebsitePoliciesWebsiteDataStoreDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
(websiteDataStoreTestWebView):
(TEST):

Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r226324 r226325  
     12018-01-02  Alex Christensen  <achristensen@webkit.org>
     2
     3        Use new WebsiteDataStore passed in through decidePolicyForNavigation SPI
     4        https://bugs.webkit.org/show_bug.cgi?id=180897
     5        <rdar://problem/35535328>
     6
     7        Reviewed by Brent Fulgham.
     8
     9        * Shared/WebsitePoliciesData.cpp:
     10        (WebKit::WebsitePoliciesData::applyToDocumentLoader):
     11        * UIProcess/Cocoa/NavigationState.mm:
     12        (WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction):
     13        * UIProcess/WebPageProxy.cpp:
     14        (WebKit::WebPageProxy::changeWebsiteDataStore):
     15        * UIProcess/WebPageProxy.h:
     16        * UIProcess/WebProcessPool.cpp:
     17        (WebKit::WebProcessPool::pageBeginUsingWebsiteDataStore):
     18        (WebKit::WebProcessPool::pageEndUsingWebsiteDataStore):
     19        (WebKit::WebProcessPool::pageAddedToProcess): Deleted.
     20        (WebKit::WebProcessPool::pageRemovedFromProcess): Deleted.
     21        * UIProcess/WebProcessPool.h:
     22        * UIProcess/WebProcessProxy.cpp:
     23        (WebKit::WebProcessProxy::addExistingWebPage):
     24        (WebKit::WebProcessProxy::removeWebPage):
     25        * WebProcess/WebCoreSupport/mac/WebFrameNetworkingContext.mm:
     26        (WebKit::WebFrameNetworkingContext::ensureWebsiteDataStoreSession):
     27
    1282018-01-02  Alex Christensen  <achristensen@webkit.org>
    229
  • trunk/Source/WebKit/Shared/WebsitePoliciesData.cpp

    r225989 r226325  
    2828
    2929#include "ArgumentCoders.h"
     30#include "WebProcess.h"
    3031#include <WebCore/DocumentLoader.h>
     32#include <WebCore/Frame.h>
     33#include <WebCore/Page.h>
    3134
    3235namespace WebKit {
     
    113116        break;
    114117    }
     118   
     119    if (websitePolicies.websiteDataStoreParameters) {
     120        if (auto* frame = documentLoader.frame()) {
     121            if (auto* page = frame->page()) {
     122                auto sessionID = websitePolicies.websiteDataStoreParameters->networkSessionParameters.sessionID;
     123                WebProcess::singleton().addWebsiteDataStore(WTFMove(*websitePolicies.websiteDataStoreParameters));
     124                page->setSessionID(sessionID);
     125            }
     126        }
     127    }
    115128}
    116129
  • trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.mm

    r225989 r226325  
    3434#import "APIString.h"
    3535#import "APIURL.h"
     36#import "APIWebsiteDataStore.h"
    3637#import "AuthenticationDecisionListener.h"
    3738#import "CompletionHandlerCallChecker.h"
     
    461462    auto checker = CompletionHandlerCallChecker::create(navigationDelegate.get(), delegateHasWebsitePolicies ? @selector(_webView:decidePolicyForNavigationAction:decisionHandler:) : @selector(webView:decidePolicyForNavigationAction:decisionHandler:));
    462463   
    463     auto decisionHandlerWithPolicies = [localListener = WTFMove(listener), navigationAction = navigationAction.copyRef(), checker = WTFMove(checker), mainFrameURLString](WKNavigationActionPolicy actionPolicy, _WKWebsitePolicies *websitePolicies) mutable {
     464    auto decisionHandlerWithPolicies = [localListener = WTFMove(listener), navigationAction = navigationAction.copyRef(), checker = WTFMove(checker), mainFrameURLString, webPageProxy = makeRef(webPageProxy)](WKNavigationActionPolicy actionPolicy, _WKWebsitePolicies *websitePolicies) mutable {
    464465        if (checker->completionHandlerHasBeenCalled())
    465466            return;
     
    473474                if (!sessionID.isEphemeral() && sessionID != PAL::SessionID::defaultSessionID())
    474475                    [NSException raise:NSInvalidArgumentException format:@"_WKWebsitePolicies.websiteDataStore must be nil, default, or non-persistent."];
     476                webPageProxy->changeWebsiteDataStore(websitePolicies->_websitePolicies->websiteDataStore()->websiteDataStore());
    475477            }
    476478        }
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r226323 r226325  
    445445}
    446446
     447void WebPageProxy::changeWebsiteDataStore(WebsiteDataStore& websiteDataStore)
     448{
     449    m_process->processPool().pageEndUsingWebsiteDataStore(*this);
     450    m_websiteDataStore = websiteDataStore;
     451    m_process->processPool().pageBeginUsingWebsiteDataStore(*this);
     452}
     453
    447454const API::PageConfiguration& WebPageProxy::configuration() const
    448455{
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r226323 r226325  
    325325
    326326    WebsiteDataStore& websiteDataStore() { return m_websiteDataStore; }
     327    void changeWebsiteDataStore(WebsiteDataStore&);
    327328
    328329#if ENABLE(DATA_DETECTION)
  • trunk/Source/WebKit/UIProcess/WebProcessPool.cpp

    r226257 r226325  
    10461046#endif
    10471047
    1048 void WebProcessPool::pageAddedToProcess(WebPageProxy& page)
     1048void WebProcessPool::pageBeginUsingWebsiteDataStore(WebPageProxy& page)
    10491049{
    10501050    auto result = m_sessionToPagesMap.add(page.sessionID(), HashSet<WebPageProxy*>()).iterator->value.add(&page);
     
    10751075}
    10761076
    1077 void WebProcessPool::pageRemovedFromProcess(WebPageProxy& page)
     1077void WebProcessPool::pageEndUsingWebsiteDataStore(WebPageProxy& page)
    10781078{
    10791079    auto sessionID = page.sessionID();
  • trunk/Source/WebKit/UIProcess/WebProcessPool.h

    r226257 r226325  
    177177    Ref<WebPageProxy> createWebPage(PageClient&, Ref<API::PageConfiguration>&&);
    178178
    179     void pageAddedToProcess(WebPageProxy&);
    180     void pageRemovedFromProcess(WebPageProxy&);
     179    void pageBeginUsingWebsiteDataStore(WebPageProxy&);
     180    void pageEndUsingWebsiteDataStore(WebPageProxy&);
    181181
    182182    const String& injectedBundlePath() const { return m_configuration->injectedBundlePath(); }
  • trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp

    r225984 r226325  
    361361    ASSERT(!globalPageMap().contains(pageID));
    362362
    363     m_processPool->pageAddedToProcess(webPage);
     363    m_processPool->pageBeginUsingWebsiteDataStore(webPage);
    364364
    365365    m_pageMap.set(pageID, &webPage);
     
    376376    ASSERT_UNUSED(removedPage, removedPage == &webPage);
    377377
    378     m_processPool->pageRemovedFromProcess(webPage);
     378    m_processPool->pageEndUsingWebsiteDataStore(webPage);
    379379
    380380    updateBackgroundResponsivenessTimer();
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/mac/WebFrameNetworkingContext.mm

    r224827 r226325  
    6363
    6464    RetainPtr<CFHTTPCookieStorageRef> uiProcessCookieStorage;
    65     if (!sessionID.isEphemeral())
     65    if (!sessionID.isEphemeral() && !parameters.uiProcessCookieStorageIdentifier.isEmpty())
    6666        uiProcessCookieStorage = cookieStorageFromIdentifyingData(parameters.uiProcessCookieStorageIdentifier);
    67     else
    68         ASSERT(parameters.uiProcessCookieStorageIdentifier.isEmpty());
    6967
    7068    NetworkStorageSession::ensureSession(sessionID, base + '.' + String::number(sessionID.sessionID()), WTFMove(uiProcessCookieStorage));
  • trunk/Tools/ChangeLog

    r226320 r226325  
     12018-01-02  Alex Christensen  <achristensen@webkit.org>
     2
     3        Use new WebsiteDataStore passed in through decidePolicyForNavigation SPI
     4        https://bugs.webkit.org/show_bug.cgi?id=180897
     5        <rdar://problem/35535328>
     6
     7        Reviewed by Brent Fulgham.
     8
     9        Test two forms of storage to be sure we are using a different WebsiteDataStore: cookies and sessionStorage.
     10
     11        * TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm:
     12        (-[WebsitePoliciesWebsiteDataStoreDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]):
     13        (-[WebsitePoliciesWebsiteDataStoreDelegate webView:startURLSchemeTask:]):
     14        (-[WebsitePoliciesWebsiteDataStoreDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
     15        (websiteDataStoreTestWebView):
     16        (TEST):
     17
    118== Rolled over to ChangeLog-2018-01-01 ==
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm

    r225989 r226325  
    790790static bool done;
    791791
    792 @interface WebsitePoliciesWebsiteDataStoreDelegate : NSObject <WKNavigationDelegatePrivate, WKURLSchemeHandler>
     792@interface WebsitePoliciesWebsiteDataStoreDelegate : NSObject <WKNavigationDelegatePrivate, WKURLSchemeHandler, WKUIDelegate>
    793793@end
    794794
     
    797797- (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler
    798798{
    799     if ([navigationAction.request.URL.path isEqualToString:@"/invalid"]) {
     799    NSURL *url = navigationAction.request.URL;
     800    if ([url.path isEqualToString:@"/invalid"]) {
    800801        _WKWebsitePolicies *websitePolicies = [[[_WKWebsitePolicies alloc] init] autorelease];
    801802        websitePolicies.websiteDataStore = [[[WKWebsiteDataStore alloc] _initWithConfiguration:[[[_WKWebsiteDataStoreConfiguration alloc] init] autorelease]] autorelease];
     
    811812        done = true;
    812813    }
    813 }
    814 
    815 - (void)webView:(WKWebView *)webView startURLSchemeTask:(id <WKURLSchemeTask>)urlSchemeTask
    816 {
     814    if ([url.path isEqualToString:@"/checkStorage"] || [url.path isEqualToString:@"/checkCookies"]) {
     815        _WKWebsitePolicies *websitePolicies = [[[_WKWebsitePolicies alloc] init] autorelease];
     816        websitePolicies.websiteDataStore = [WKWebsiteDataStore nonPersistentDataStore];
     817        decisionHandler(WKNavigationActionPolicyAllow, websitePolicies);
     818    }
     819}
     820
     821- (void)webView:(WKWebView *)webView startURLSchemeTask:(id <WKURLSchemeTask>)task
     822{
     823    NSURL *url = task.request.URL;
     824    if ([url.path isEqualToString:@"/checkStorage"]) {
     825        NSString *html = @"<script>var oldValue = window.sessionStorage['storageKey']; window.sessionStorage['storageKey'] = 'value'; alert('old value: <' + (oldValue ? 'fail' : '') + '>');</script>";
     826        [task didReceiveResponse:[[NSURLResponse alloc] initWithURL:url MIMEType:@"text/html" expectedContentLength:html.length textEncodingName:nil]];
     827        [task didReceiveData:[html dataUsingEncoding:NSUTF8StringEncoding]];
     828        [task didFinish];
     829    }
    817830}
    818831
     
    821834}
    822835
    823 @end
     836- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
     837{
     838    EXPECT_STREQ(message.UTF8String, "old value: <>");
     839    completionHandler();
     840    done = true;
     841}
     842
     843@end
     844
     845RetainPtr<WKWebView> websiteDataStoreTestWebView()
     846{
     847    auto delegate = adoptNS([[WebsitePoliciesWebsiteDataStoreDelegate alloc] init]);
     848    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     849    [configuration setURLSchemeHandler:delegate.get() forURLScheme:@"test"];
     850    [configuration setWebsiteDataStore:[WKWebsiteDataStore nonPersistentDataStore]];
     851    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
     852    [webView setNavigationDelegate:delegate.get()];
     853    [webView setUIDelegate:delegate.get()];
     854    return webView;
     855}
    824856
    825857TEST(WebKit, UpdateWebsitePoliciesInvalid)
    826858{
    827     auto delegate = adoptNS([[WebsitePoliciesWebsiteDataStoreDelegate alloc] init]);
    828     auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
    829     [configuration setURLSchemeHandler:delegate.get() forURLScheme:@"test"];
    830     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
    831     [webView setNavigationDelegate:delegate.get()];
    832 
     859    auto webView = websiteDataStoreTestWebView();
    833860    auto policies = adoptNS([[_WKWebsitePolicies alloc] init]);
    834861    [policies setWebsiteDataStore:[WKWebsiteDataStore nonPersistentDataStore]];
     
    845872}
    846873
    847 // FIXME: Use _WKWebsitePolicies.websiteDataStore and test that it is used.
     874TEST(WebKit, WebsitePoliciesDataStore)
     875{
     876    auto cookieWebView = websiteDataStoreTestWebView();
     877    NSString *alertOldCookie = @"<script>var oldCookie = document.cookie; document.cookie = 'key=value'; alert('old value: <' + oldCookie + '>');</script>";
     878    [cookieWebView loadHTMLString:alertOldCookie baseURL:[NSURL URLWithString:@"http://example.com/checkCookies"]];
     879    TestWebKitAPI::Util::run(&done);
     880    done = false;
     881    [cookieWebView loadHTMLString:alertOldCookie baseURL:[NSURL URLWithString:@"http://example.com/checkCookies"]];
     882    TestWebKitAPI::Util::run(&done);
     883}
    848884
    849885#endif // WK_API_ENABLED
Note: See TracChangeset for help on using the changeset viewer.