Changeset 225989 in webkit
- Timestamp:
- Dec 15, 2017, 3:14:33 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r225987 r225989 1 2017-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 1 37 2017-12-15 Alex Christensen <achristensen@webkit.org> 2 38 -
trunk/Source/WebKit/Shared/WebsitePoliciesData.cpp
r225977 r225989 38 38 encoder << allowedAutoplayQuirks; 39 39 encoder << customHeaderFields; 40 encoder << websiteDataStoreParameters; 40 41 } 41 42 … … 62 63 return std::nullopt; 63 64 65 std::optional<std::optional<WebsiteDataStoreParameters>> websiteDataStoreParameters; 66 decoder >> websiteDataStoreParameters; 67 if (!websiteDataStoreParameters) 68 return std::nullopt; 69 64 70 return { { 65 71 WTFMove(*contentBlockersEnabled), … … 67 73 WTFMove(*autoplayPolicy), 68 74 WTFMove(*customHeaderFields), 75 WTFMove(*websiteDataStoreParameters), 69 76 } }; 70 77 } -
trunk/Source/WebKit/Shared/WebsitePoliciesData.h
r225977 r225989 28 28 #include "WebsiteAutoplayPolicy.h" 29 29 #include "WebsiteAutoplayQuirk.h" 30 #include "WebsiteDataStoreParameters.h" 30 31 #include <WebCore/HTTPHeaderField.h> 31 32 #include <wtf/OptionSet.h> … … 49 50 WebsiteAutoplayPolicy autoplayPolicy { WebsiteAutoplayPolicy::Default }; 50 51 Vector<WebCore::HTTPHeaderField> customHeaderFields; 52 std::optional<WebsiteDataStoreParameters> websiteDataStoreParameters; 51 53 52 54 void encode(IPC::Encoder&) const; -
trunk/Source/WebKit/UIProcess/API/APIWebsitePolicies.cpp
r225977 r225989 27 27 #include "APIWebsitePolicies.h" 28 28 29 #include "APIWebsiteDataStore.h" 29 30 #include "WebsitePoliciesData.h" 30 31 31 32 namespace API { 33 34 WebsitePolicies::WebsitePolicies() = default; 35 36 WebsitePolicies::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 { } 32 43 33 44 WebsitePolicies::~WebsitePolicies() … … 35 46 } 36 47 48 void WebsitePolicies::setWebsiteDataStore(RefPtr<WebsiteDataStore>&& websiteDataStore) 49 { 50 m_websiteDataStore = WTFMove(websiteDataStore); 51 } 52 37 53 WebKit::WebsitePoliciesData WebsitePolicies::data() 38 54 { 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) }; 40 59 } 41 60 -
trunk/Source/WebKit/UIProcess/API/APIWebsitePolicies.h
r225977 r225989 41 41 namespace API { 42 42 43 class WebsiteDataStore; 44 43 45 class WebsitePolicies final : public API::ObjectImpl<API::Object::Type::WebsitePolicies> { 44 46 public: 45 47 static Ref<WebsitePolicies> create() { return adoptRef(*new WebsitePolicies); } 46 WebsitePolicies() = default;48 WebsitePolicies(); 47 49 ~WebsitePolicies(); 48 50 … … 59 61 Vector<WebCore::HTTPHeaderField>&& takeCustomHeaderFields() { return WTFMove(m_customHeaderFields); } 60 62 void setCustomHeaderFields(Vector<WebCore::HTTPHeaderField>&& fields) { m_customHeaderFields = WTFMove(fields); } 63 64 WebsiteDataStore* websiteDataStore() const { return m_websiteDataStore.get(); } 65 void setWebsiteDataStore(RefPtr<WebsiteDataStore>&&); 61 66 62 67 WebKit::WebsitePoliciesData data(); 63 68 64 69 private: 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>&&); 71 71 72 72 bool m_contentBlockersEnabled { true }; … … 74 74 WebKit::WebsiteAutoplayPolicy m_autoplayPolicy { WebKit::WebsiteAutoplayPolicy::Default }; 75 75 Vector<WebCore::HTTPHeaderField> m_customHeaderFields; 76 RefPtr<WebsiteDataStore> m_websiteDataStore; 76 77 }; 77 78 -
trunk/Source/WebKit/UIProcess/API/C/WKFramePolicyListener.cpp
r225977 r225989 47 47 void WKFramePolicyListenerUseWithPolicies(WKFramePolicyListenerRef policyListenerRef, WKWebsitePoliciesRef websitePolicies) 48 48 { 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)); 50 52 } 51 53 -
trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp
r225977 r225989 326 326 void WKPageUpdateWebsitePolicies(WKPageRef pageRef, WKWebsitePoliciesRef websitePoliciesRef) 327 327 { 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)); 329 331 } 330 332 -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm
r225981 r225989 4239 4239 - (void)_updateWebsitePolicies:(_WKWebsitePolicies *)websitePolicies 4240 4240 { 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)); 4242 4245 } 4243 4246 -
trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsitePolicies.h
r225977 r225989 41 41 } WK_API_AVAILABLE(macosx(10.13), ios(11.0)); 42 42 43 @class WKWebsiteDataStore; 44 43 45 WK_CLASS_AVAILABLE(macosx(10.12.3), ios(10.3)) 44 46 @interface _WKWebsitePolicies : NSObject … … 48 50 @property (nonatomic) _WKWebsiteAutoplayPolicy autoplayPolicy WK_API_AVAILABLE(macosx(10.13), ios(11.0)); 49 51 @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)); 50 53 51 54 @end -
trunk/Source/WebKit/UIProcess/API/Cocoa/_WKWebsitePolicies.mm
r225977 r225989 147 147 } 148 148 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 149 160 - (NSString *)description 150 161 { -
trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.mm
r225977 r225989 467 467 468 468 std::optional<WebsitePoliciesData> data; 469 if (websitePolicies) 469 if (websitePolicies) { 470 470 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 } 471 477 472 478 switch (actionPolicy) { -
trunk/Tools/ChangeLog
r225972 r225989 1 2017-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 1 15 2017-12-15 Nael Ouedraogo <nael.ouedraogo@crf.canon.fr> 2 16 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm
r224237 r225989 35 35 #import <WebKit/WKUserContentControllerPrivate.h> 36 36 #import <WebKit/WKWebViewPrivate.h> 37 #import <WebKit/WKWebsiteDataStorePrivate.h> 37 38 #import <WebKit/_WKUserContentExtensionStorePrivate.h> 39 #import <WebKit/_WKWebsiteDataStoreConfiguration.h> 38 40 #import <WebKit/_WKWebsitePolicies.h> 39 41 #import <wtf/MainThread.h> … … 786 788 } 787 789 790 static 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 825 TEST(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. 788 848 789 849 #endif // WK_API_ENABLED
Note:
See TracChangeset
for help on using the changeset viewer.