Changeset 225989 in webkit


Ignore:
Timestamp:
Dec 15, 2017 3:14:33 PM (6 years ago)
Author:
achristensen@apple.com
Message:

Introduce SPI _WKWebsitePolicies.websiteDataStore
https://bugs.webkit.org/show_bug.cgi?id=180880
<rdar://problem/35535328>

Reviewed by Andy Estes.

Source/WebKit:

The SPI doesn't do anything yet, but it already has some restrictions and tests!
WKWebView._updateWebsitePolicies can't be used to update a WKWebsiteDataStore. Only during navigation.
Even during navigation, we are only supporting the default and ephemeral data stores right now.
This functionality won't be supported in the C API. This is enforced with RELEASE_ASSERTs.
If we change our minds, we can change them and add restrictions similar to the ObjC restrictions.

  • Shared/WebsitePoliciesData.cpp:

(WebKit::WebsitePoliciesData::encode const):
(WebKit::WebsitePoliciesData::decode):

  • Shared/WebsitePoliciesData.h:
  • UIProcess/API/APIWebsitePolicies.cpp:

(API::WebsitePolicies::WebsitePolicies):
(API::WebsitePolicies::setWebsiteDataStore):
(API::WebsitePolicies::data):

  • UIProcess/API/APIWebsitePolicies.h:
  • UIProcess/API/C/WKFramePolicyListener.cpp:

(WKFramePolicyListenerUseWithPolicies):

  • UIProcess/API/C/WKPage.cpp:

(WKPageUpdateWebsitePolicies):

  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView _updateWebsitePolicies:]):

  • UIProcess/API/Cocoa/_WKWebsitePolicies.h:
  • UIProcess/API/Cocoa/_WKWebsitePolicies.mm:

(-[_WKWebsitePolicies websiteDataStore]):
(-[_WKWebsitePolicies setWebsiteDataStore:]):

  • UIProcess/Cocoa/NavigationState.mm:

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

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm:

(-[WebsitePoliciesWebsiteDataStoreDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]):
(-[WebsitePoliciesWebsiteDataStoreDelegate webView:startURLSchemeTask:]):
(-[WebsitePoliciesWebsiteDataStoreDelegate webView:stopURLSchemeTask:]):
(TEST):

Location:
trunk
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r225987 r225989  
     12017-12-15  Alex Christensen  <achristensen@webkit.org>
     2
     3        Introduce SPI _WKWebsitePolicies.websiteDataStore
     4        https://bugs.webkit.org/show_bug.cgi?id=180880
     5        <rdar://problem/35535328>
     6
     7        Reviewed by Andy Estes.
     8
     9        The SPI doesn't do anything yet, but it already has some restrictions and tests!
     10        WKWebView._updateWebsitePolicies can't be used to update a WKWebsiteDataStore.  Only during navigation.
     11        Even during navigation, we are only supporting the default and ephemeral data stores right now.
     12        This functionality won't be supported in the C API.  This is enforced with RELEASE_ASSERTs.
     13        If we change our minds, we can change them and add restrictions similar to the ObjC restrictions.
     14
     15        * Shared/WebsitePoliciesData.cpp:
     16        (WebKit::WebsitePoliciesData::encode const):
     17        (WebKit::WebsitePoliciesData::decode):
     18        * Shared/WebsitePoliciesData.h:
     19        * UIProcess/API/APIWebsitePolicies.cpp:
     20        (API::WebsitePolicies::WebsitePolicies):
     21        (API::WebsitePolicies::setWebsiteDataStore):
     22        (API::WebsitePolicies::data):
     23        * UIProcess/API/APIWebsitePolicies.h:
     24        * UIProcess/API/C/WKFramePolicyListener.cpp:
     25        (WKFramePolicyListenerUseWithPolicies):
     26        * UIProcess/API/C/WKPage.cpp:
     27        (WKPageUpdateWebsitePolicies):
     28        * UIProcess/API/Cocoa/WKWebView.mm:
     29        (-[WKWebView _updateWebsitePolicies:]):
     30        * UIProcess/API/Cocoa/_WKWebsitePolicies.h:
     31        * UIProcess/API/Cocoa/_WKWebsitePolicies.mm:
     32        (-[_WKWebsitePolicies websiteDataStore]):
     33        (-[_WKWebsitePolicies setWebsiteDataStore:]):
     34        * UIProcess/Cocoa/NavigationState.mm:
     35        (WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction):
     36
    1372017-12-15  Alex Christensen  <achristensen@webkit.org>
    238
  • trunk/Source/WebKit/Shared/WebsitePoliciesData.cpp

    r225977 r225989  
    3838    encoder << allowedAutoplayQuirks;
    3939    encoder << customHeaderFields;
     40    encoder << websiteDataStoreParameters;
    4041}
    4142
     
    6263        return std::nullopt;
    6364   
     65    std::optional<std::optional<WebsiteDataStoreParameters>> websiteDataStoreParameters;
     66    decoder >> websiteDataStoreParameters;
     67    if (!websiteDataStoreParameters)
     68        return std::nullopt;
     69   
    6470    return { {
    6571        WTFMove(*contentBlockersEnabled),
     
    6773        WTFMove(*autoplayPolicy),
    6874        WTFMove(*customHeaderFields),
     75        WTFMove(*websiteDataStoreParameters),
    6976    } };
    7077}
  • trunk/Source/WebKit/Shared/WebsitePoliciesData.h

    r225977 r225989  
    2828#include "WebsiteAutoplayPolicy.h"
    2929#include "WebsiteAutoplayQuirk.h"
     30#include "WebsiteDataStoreParameters.h"
    3031#include <WebCore/HTTPHeaderField.h>
    3132#include <wtf/OptionSet.h>
     
    4950    WebsiteAutoplayPolicy autoplayPolicy { WebsiteAutoplayPolicy::Default };
    5051    Vector<WebCore::HTTPHeaderField> customHeaderFields;
     52    std::optional<WebsiteDataStoreParameters> websiteDataStoreParameters;
    5153   
    5254    void encode(IPC::Encoder&) const;
  • trunk/Source/WebKit/UIProcess/API/APIWebsitePolicies.cpp

    r225977 r225989  
    2727#include "APIWebsitePolicies.h"
    2828
     29#include "APIWebsiteDataStore.h"
    2930#include "WebsitePoliciesData.h"
    3031
    3132namespace API {
     33
     34WebsitePolicies::WebsitePolicies() = default;
     35
     36WebsitePolicies::WebsitePolicies(bool contentBlockersEnabled, OptionSet<WebKit::WebsiteAutoplayQuirk> allowedAutoplayQuirks, WebKit::WebsiteAutoplayPolicy autoplayPolicy, Vector<WebCore::HTTPHeaderField>&& customHeaderFields, RefPtr<WebsiteDataStore>&& websiteDataStore)
     37    : m_contentBlockersEnabled(contentBlockersEnabled)
     38    , m_allowedAutoplayQuirks(allowedAutoplayQuirks)
     39    , m_autoplayPolicy(autoplayPolicy)
     40    , m_customHeaderFields(WTFMove(customHeaderFields))
     41    , m_websiteDataStore(WTFMove(websiteDataStore))
     42{ }
    3243
    3344WebsitePolicies::~WebsitePolicies()
     
    3546}
    3647
     48void WebsitePolicies::setWebsiteDataStore(RefPtr<WebsiteDataStore>&& websiteDataStore)
     49{
     50    m_websiteDataStore = WTFMove(websiteDataStore);
     51}
     52
    3753WebKit::WebsitePoliciesData WebsitePolicies::data()
    3854{
    39     return { contentBlockersEnabled(), allowedAutoplayQuirks(), autoplayPolicy(), customHeaderFields() };
     55    std::optional<WebKit::WebsiteDataStoreParameters> parameters;
     56    if (m_websiteDataStore)
     57        parameters = m_websiteDataStore->websiteDataStore().parameters();
     58    return { contentBlockersEnabled(), allowedAutoplayQuirks(), autoplayPolicy(), customHeaderFields(), WTFMove(parameters) };
    4059}
    4160
  • trunk/Source/WebKit/UIProcess/API/APIWebsitePolicies.h

    r225977 r225989  
    4141namespace API {
    4242
     43class WebsiteDataStore;
     44
    4345class WebsitePolicies final : public API::ObjectImpl<API::Object::Type::WebsitePolicies> {
    4446public:
    4547    static Ref<WebsitePolicies> create() { return adoptRef(*new WebsitePolicies); }
    46     WebsitePolicies() = default;
     48    WebsitePolicies();
    4749    ~WebsitePolicies();
    4850
     
    5961    Vector<WebCore::HTTPHeaderField>&& takeCustomHeaderFields() { return WTFMove(m_customHeaderFields); }
    6062    void setCustomHeaderFields(Vector<WebCore::HTTPHeaderField>&& fields) { m_customHeaderFields = WTFMove(fields); }
     63   
     64    WebsiteDataStore* websiteDataStore() const { return m_websiteDataStore.get(); }
     65    void setWebsiteDataStore(RefPtr<WebsiteDataStore>&&);
    6166
    6267    WebKit::WebsitePoliciesData data();
    6368
    6469private:
    65     WebsitePolicies(bool contentBlockersEnabled, OptionSet<WebKit::WebsiteAutoplayQuirk> allowedAutoplayQuirks, WebKit::WebsiteAutoplayPolicy autoplayPolicy, Vector<WebCore::HTTPHeaderField>&& customHeaderFields)
    66         : m_contentBlockersEnabled(contentBlockersEnabled)
    67         , m_allowedAutoplayQuirks(allowedAutoplayQuirks)
    68         , m_autoplayPolicy(autoplayPolicy)
    69         , m_customHeaderFields(WTFMove(customHeaderFields))
    70     { }
     70    WebsitePolicies(bool contentBlockersEnabled, OptionSet<WebKit::WebsiteAutoplayQuirk>, WebKit::WebsiteAutoplayPolicy, Vector<WebCore::HTTPHeaderField>&&, RefPtr<WebsiteDataStore>&&);
    7171
    7272    bool m_contentBlockersEnabled { true };
     
    7474    WebKit::WebsiteAutoplayPolicy m_autoplayPolicy { WebKit::WebsiteAutoplayPolicy::Default };
    7575    Vector<WebCore::HTTPHeaderField> m_customHeaderFields;
     76    RefPtr<WebsiteDataStore> m_websiteDataStore;
    7677};
    7778
  • trunk/Source/WebKit/UIProcess/API/C/WKFramePolicyListener.cpp

    r225977 r225989  
    4747void WKFramePolicyListenerUseWithPolicies(WKFramePolicyListenerRef policyListenerRef, WKWebsitePoliciesRef websitePolicies)
    4848{
    49     toImpl(policyListenerRef)->use(toImpl(websitePolicies)->data());
     49    auto data = toImpl(websitePolicies)->data();
     50    RELEASE_ASSERT_WITH_MESSAGE(!data.websiteDataStoreParameters, "Setting WebsitePolicies.WebsiteDataStore is not supported in the C API.");
     51    toImpl(policyListenerRef)->use(WTFMove(data));
    5052}
    5153
  • trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp

    r225977 r225989  
    326326void WKPageUpdateWebsitePolicies(WKPageRef pageRef, WKWebsitePoliciesRef websitePoliciesRef)
    327327{
    328     toImpl(pageRef)->updateWebsitePolicies(toImpl(websitePoliciesRef)->data());
     328    auto data = toImpl(websitePoliciesRef)->data();
     329    RELEASE_ASSERT_WITH_MESSAGE(!data.websiteDataStoreParameters, "Setting WebsitePolicies.WebsiteDataStore is not supported in the C API.");
     330    toImpl(pageRef)->updateWebsitePolicies(WTFMove(data));
    329331}
    330332
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm

    r225981 r225989  
    42394239- (void)_updateWebsitePolicies:(_WKWebsitePolicies *)websitePolicies
    42404240{
    4241     _page->updateWebsitePolicies(websitePolicies->_websitePolicies->data());
     4241    auto data = websitePolicies->_websitePolicies->data();
     4242    if (data.websiteDataStoreParameters)
     4243        [NSException raise:NSInvalidArgumentException format:@"Updating WKWebsiteDataStore is only supported during decidePolicyForNavigationAction."];
     4244    _page->updateWebsitePolicies(WTFMove(data));
    42424245}
    42434246
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsitePolicies.h

    r225977 r225989  
    4141} WK_API_AVAILABLE(macosx(10.13), ios(11.0));
    4242
     43@class WKWebsiteDataStore;
     44
    4345WK_CLASS_AVAILABLE(macosx(10.12.3), ios(10.3))
    4446@interface _WKWebsitePolicies : NSObject
     
    4850@property (nonatomic) _WKWebsiteAutoplayPolicy autoplayPolicy WK_API_AVAILABLE(macosx(10.13), ios(11.0));
    4951@property (nonatomic, copy) NSDictionary<NSString *, NSString *> *customHeaderFields WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
     52@property (nonatomic, strong) WKWebsiteDataStore *websiteDataStore WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
    5053
    5154@end
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsitePolicies.mm

    r225977 r225989  
    147147}
    148148
     149- (WKWebsiteDataStore *)websiteDataStore
     150{
     151    auto* store = _websitePolicies->websiteDataStore();
     152    return store ? WebKit::wrapper(*store) : nil;
     153}
     154
     155- (void)setWebsiteDataStore:(WKWebsiteDataStore *)websiteDataStore
     156{
     157    _websitePolicies->setWebsiteDataStore(websiteDataStore->_websiteDataStore.get());
     158}
     159
    149160- (NSString *)description
    150161{
  • trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.mm

    r225977 r225989  
    467467
    468468        std::optional<WebsitePoliciesData> data;
    469         if (websitePolicies)
     469        if (websitePolicies) {
    470470            data = websitePolicies->_websitePolicies->data();
     471            if (data->websiteDataStoreParameters) {
     472                auto& sessionID = data->websiteDataStoreParameters->networkSessionParameters.sessionID;
     473                if (!sessionID.isEphemeral() && sessionID != PAL::SessionID::defaultSessionID())
     474                    [NSException raise:NSInvalidArgumentException format:@"_WKWebsitePolicies.websiteDataStore must be nil, default, or non-persistent."];
     475            }
     476        }
    471477
    472478        switch (actionPolicy) {
  • trunk/Tools/ChangeLog

    r225972 r225989  
     12017-12-15  Alex Christensen  <achristensen@webkit.org>
     2
     3        Introduce SPI _WKWebsitePolicies.websiteDataStore
     4        https://bugs.webkit.org/show_bug.cgi?id=180880
     5        <rdar://problem/35535328>
     6
     7        Reviewed by Andy Estes.
     8
     9        * TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm:
     10        (-[WebsitePoliciesWebsiteDataStoreDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]):
     11        (-[WebsitePoliciesWebsiteDataStoreDelegate webView:startURLSchemeTask:]):
     12        (-[WebsitePoliciesWebsiteDataStoreDelegate webView:stopURLSchemeTask:]):
     13        (TEST):
     14
    1152017-12-15  Nael Ouedraogo  <nael.ouedraogo@crf.canon.fr>
    216
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm

    r224237 r225989  
    3535#import <WebKit/WKUserContentControllerPrivate.h>
    3636#import <WebKit/WKWebViewPrivate.h>
     37#import <WebKit/WKWebsiteDataStorePrivate.h>
    3738#import <WebKit/_WKUserContentExtensionStorePrivate.h>
     39#import <WebKit/_WKWebsiteDataStoreConfiguration.h>
    3840#import <WebKit/_WKWebsitePolicies.h>
    3941#import <wtf/MainThread.h>
     
    786788}
    787789
     790static bool done;
     791
     792@interface WebsitePoliciesWebsiteDataStoreDelegate : NSObject <WKNavigationDelegatePrivate, WKURLSchemeHandler>
     793@end
     794
     795@implementation WebsitePoliciesWebsiteDataStoreDelegate
     796
     797- (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler
     798{
     799    if ([navigationAction.request.URL.path isEqualToString:@"/invalid"]) {
     800        _WKWebsitePolicies *websitePolicies = [[[_WKWebsitePolicies alloc] init] autorelease];
     801        websitePolicies.websiteDataStore = [[[WKWebsiteDataStore alloc] _initWithConfiguration:[[[_WKWebsiteDataStoreConfiguration alloc] init] autorelease]] autorelease];
     802
     803        bool sawException = false;
     804        @try {
     805            decisionHandler(WKNavigationActionPolicyAllow, websitePolicies);
     806        } @catch (NSException *exception) {
     807            sawException = true;
     808        }
     809        EXPECT_TRUE(sawException);
     810
     811        done = true;
     812    }
     813}
     814
     815- (void)webView:(WKWebView *)webView startURLSchemeTask:(id <WKURLSchemeTask>)urlSchemeTask
     816{
     817}
     818
     819- (void)webView:(WKWebView *)webView stopURLSchemeTask:(id <WKURLSchemeTask>)urlSchemeTask
     820{
     821}
     822
     823@end
     824
     825TEST(WebKit, UpdateWebsitePoliciesInvalid)
     826{
     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
     833    auto policies = adoptNS([[_WKWebsitePolicies alloc] init]);
     834    [policies setWebsiteDataStore:[WKWebsiteDataStore nonPersistentDataStore]];
     835    bool sawException = false;
     836    @try {
     837        [webView _updateWebsitePolicies:policies.get()];
     838    } @catch (NSException *exception) {
     839        sawException = true;
     840    }
     841    EXPECT_TRUE(sawException);
     842   
     843    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"test:///invalid"]]];
     844    TestWebKitAPI::Util::run(&done);
     845}
     846
     847// FIXME: Use _WKWebsitePolicies.websiteDataStore and test that it is used.
    788848
    789849#endif // WK_API_ENABLED
Note: See TracChangeset for help on using the changeset viewer.