Title: [209558] trunk
Revision
209558
Author
achristen...@apple.com
Date
2016-12-08 12:52:35 -0800 (Thu, 08 Dec 2016)

Log Message

Add SPI for sending WebsiteSettings to WebProcess during navigation
https://bugs.webkit.org/show_bug.cgi?id=165517
<rdar://29341068>

Source/WebKit2:

We add the ability for the navigation client to send settings to the WebProcess 
based on the URL of the document being navigated to. This approach adds no new IPC 
messages and allows the application to decide what settings to use during navigation 
instead of declaratively before navigation. Right now there is only one setting, 
whether to disable content blockers, but this infrastructure can be used for more settings.

Reviewed by Anders Carlsson.

* CMakeLists.txt:
* PlatformMac.cmake:
* Shared/API/APIObject.h:
* Shared/API/c/WKBase.h:
* Shared/WebsitePolicies.h: Added.
(WebKit::WebsitePolicies::encode):
(WebKit::WebsitePolicies::decode):
* UIProcess/API/APINavigationClient.h:
(API::NavigationClient::decidePolicyForNavigationAction):
(API::NavigationClient::decidePolicyForNavigationResponse):
* UIProcess/API/APIPolicyClient.h:
(API::PolicyClient::decidePolicyForNavigationAction):
(API::PolicyClient::decidePolicyForNewWindowAction):
(API::PolicyClient::decidePolicyForResponse):
* UIProcess/API/APIWebsitePolicies.cpp: Added.
(API::WebsitePolicies::create):
* UIProcess/API/APIWebsitePolicies.h: Added.
* UIProcess/API/C/WKAPICast.h:
* UIProcess/API/C/WKFramePolicyListener.cpp:
(WKFramePolicyListenerUse):
(WKFramePolicyListenerUseWithPolicies):
* UIProcess/API/C/WKFramePolicyListener.h:
* UIProcess/API/C/WKPage.cpp:
(WKPageSetPagePolicyClient):
* UIProcess/API/C/WKWebsitePolicies.cpp: Added.
(WKWebsitePoliciesGetTypeID):
(WKWebsitePoliciesCreate):
(WKWebsitePoliciesSetContentBlockersEnabled):
(WKWebsitePoliciesGetContentBlockersEnabled):
* UIProcess/API/C/WKWebsitePolicies.h: Added.
* UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h:
* UIProcess/API/Cocoa/_WKWebsitePolicies.h: Added.
* UIProcess/API/Cocoa/_WKWebsitePolicies.mm: Added.
(-[_WKWebsitePolicies dealloc]):
(-[_WKWebsitePolicies init]):
(-[_WKWebsitePolicies setContentBlockersEnabled:]):
(-[_WKWebsitePolicies contentBlockersEnabled]):
(-[_WKWebsitePolicies description]):
(-[_WKWebsitePolicies _apiObject]):
* UIProcess/API/Cocoa/_WKWebsitePoliciesInternal.h: Added.
(WebKit::wrapper):
* UIProcess/Automation/WebAutomationSession.cpp:
(WebKit::WebAutomationSession::reloadBrowsingContext):
* UIProcess/Cocoa/NavigationState.h:
* UIProcess/Cocoa/NavigationState.mm:
(WebKit::NavigationState::setNavigationDelegate):
(WebKit::tryAppLink):
(WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction):
(WebKit::NavigationState::NavigationClient::decidePolicyForNavigationResponse):
* UIProcess/WebFormSubmissionListenerProxy.cpp:
(WebKit::WebFormSubmissionListenerProxy::continueSubmission):
* UIProcess/WebFrameListenerProxy.cpp:
(WebKit::WebFrameListenerProxy::receivedPolicyDecision):
* UIProcess/WebFrameListenerProxy.h:
* UIProcess/WebFramePolicyListenerProxy.cpp:
(WebKit::WebFramePolicyListenerProxy::use):
(WebKit::WebFramePolicyListenerProxy::download):
(WebKit::WebFramePolicyListenerProxy::ignore):
* UIProcess/WebFramePolicyListenerProxy.h:
(WebKit::WebFramePolicyListenerProxy::create):
* UIProcess/WebFrameProxy.cpp:
(WebKit::WebFrameProxy::receivedPolicyDecision):
* UIProcess/WebFrameProxy.h:
* UIProcess/WebInspectorProxy.cpp:
(WebKit::decidePolicyForNavigationAction):
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::receivedPolicyDecision):
(WebKit::WebPageProxy::decidePolicyForNavigationAction):
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:
* WebKit2.xcodeproj/project.pbxproj:
* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction):

Tools:

Reviewed by Anders Carlsson.

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WebKit2/contentBlockerCheck.html: Added.
* TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm: Added.
(-[WebsitePoliciesDelegate webView:decidePolicyForNavigationAction:decisionHandler:]):
(-[WebsitePoliciesDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]):
(-[WebsitePoliciesDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
(TEST):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit2/CMakeLists.txt (209557 => 209558)


--- trunk/Source/WebKit2/CMakeLists.txt	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/CMakeLists.txt	2016-12-08 20:52:35 UTC (rev 209558)
@@ -433,6 +433,7 @@
     UIProcess/API/APIUserScript.cpp
     UIProcess/API/APIUserStyleSheet.cpp
     UIProcess/API/APIWebsiteDataStore.cpp
+    UIProcess/API/APIWebsitePolicies.cpp
     UIProcess/API/APIWindowFeatures.cpp
 
     UIProcess/API/C/WKApplicationCacheManager.cpp
@@ -482,6 +483,7 @@
     UIProcess/API/C/WKVibration.cpp
     UIProcess/API/C/WKViewportAttributes.cpp
     UIProcess/API/C/WKWebsiteDataStoreRef.cpp
+    UIProcess/API/C/WKWebsitePolicies.cpp
     UIProcess/API/C/WKWindowFeaturesRef.cpp
 
     UIProcess/Authentication/AuthenticationChallengeProxy.cpp

Modified: trunk/Source/WebKit2/ChangeLog (209557 => 209558)


--- trunk/Source/WebKit2/ChangeLog	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/ChangeLog	2016-12-08 20:52:35 UTC (rev 209558)
@@ -1,3 +1,91 @@
+2016-12-08  Alex Christensen  <achristen...@webkit.org>
+
+        Add SPI for sending WebsiteSettings to WebProcess during navigation
+        https://bugs.webkit.org/show_bug.cgi?id=165517
+        <rdar://29341068>
+
+        We add the ability for the navigation client to send settings to the WebProcess 
+        based on the URL of the document being navigated to. This approach adds no new IPC 
+        messages and allows the application to decide what settings to use during navigation 
+        instead of declaratively before navigation. Right now there is only one setting, 
+        whether to disable content blockers, but this infrastructure can be used for more settings.
+
+        Reviewed by Anders Carlsson.
+
+        * CMakeLists.txt:
+        * PlatformMac.cmake:
+        * Shared/API/APIObject.h:
+        * Shared/API/c/WKBase.h:
+        * Shared/WebsitePolicies.h: Added.
+        (WebKit::WebsitePolicies::encode):
+        (WebKit::WebsitePolicies::decode):
+        * UIProcess/API/APINavigationClient.h:
+        (API::NavigationClient::decidePolicyForNavigationAction):
+        (API::NavigationClient::decidePolicyForNavigationResponse):
+        * UIProcess/API/APIPolicyClient.h:
+        (API::PolicyClient::decidePolicyForNavigationAction):
+        (API::PolicyClient::decidePolicyForNewWindowAction):
+        (API::PolicyClient::decidePolicyForResponse):
+        * UIProcess/API/APIWebsitePolicies.cpp: Added.
+        (API::WebsitePolicies::create):
+        * UIProcess/API/APIWebsitePolicies.h: Added.
+        * UIProcess/API/C/WKAPICast.h:
+        * UIProcess/API/C/WKFramePolicyListener.cpp:
+        (WKFramePolicyListenerUse):
+        (WKFramePolicyListenerUseWithPolicies):
+        * UIProcess/API/C/WKFramePolicyListener.h:
+        * UIProcess/API/C/WKPage.cpp:
+        (WKPageSetPagePolicyClient):
+        * UIProcess/API/C/WKWebsitePolicies.cpp: Added.
+        (WKWebsitePoliciesGetTypeID):
+        (WKWebsitePoliciesCreate):
+        (WKWebsitePoliciesSetContentBlockersEnabled):
+        (WKWebsitePoliciesGetContentBlockersEnabled):
+        * UIProcess/API/C/WKWebsitePolicies.h: Added.
+        * UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h:
+        * UIProcess/API/Cocoa/_WKWebsitePolicies.h: Added.
+        * UIProcess/API/Cocoa/_WKWebsitePolicies.mm: Added.
+        (-[_WKWebsitePolicies dealloc]):
+        (-[_WKWebsitePolicies init]):
+        (-[_WKWebsitePolicies setContentBlockersEnabled:]):
+        (-[_WKWebsitePolicies contentBlockersEnabled]):
+        (-[_WKWebsitePolicies description]):
+        (-[_WKWebsitePolicies _apiObject]):
+        * UIProcess/API/Cocoa/_WKWebsitePoliciesInternal.h: Added.
+        (WebKit::wrapper):
+        * UIProcess/Automation/WebAutomationSession.cpp:
+        (WebKit::WebAutomationSession::reloadBrowsingContext):
+        * UIProcess/Cocoa/NavigationState.h:
+        * UIProcess/Cocoa/NavigationState.mm:
+        (WebKit::NavigationState::setNavigationDelegate):
+        (WebKit::tryAppLink):
+        (WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction):
+        (WebKit::NavigationState::NavigationClient::decidePolicyForNavigationResponse):
+        * UIProcess/WebFormSubmissionListenerProxy.cpp:
+        (WebKit::WebFormSubmissionListenerProxy::continueSubmission):
+        * UIProcess/WebFrameListenerProxy.cpp:
+        (WebKit::WebFrameListenerProxy::receivedPolicyDecision):
+        * UIProcess/WebFrameListenerProxy.h:
+        * UIProcess/WebFramePolicyListenerProxy.cpp:
+        (WebKit::WebFramePolicyListenerProxy::use):
+        (WebKit::WebFramePolicyListenerProxy::download):
+        (WebKit::WebFramePolicyListenerProxy::ignore):
+        * UIProcess/WebFramePolicyListenerProxy.h:
+        (WebKit::WebFramePolicyListenerProxy::create):
+        * UIProcess/WebFrameProxy.cpp:
+        (WebKit::WebFrameProxy::receivedPolicyDecision):
+        * UIProcess/WebFrameProxy.h:
+        * UIProcess/WebInspectorProxy.cpp:
+        (WebKit::decidePolicyForNavigationAction):
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::receivedPolicyDecision):
+        (WebKit::WebPageProxy::decidePolicyForNavigationAction):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+        * WebKit2.xcodeproj/project.pbxproj:
+        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+        (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction):
+
 2016-12-08  Antti Koivisto  <an...@apple.com>
 
         Salt network cache hashes

Modified: trunk/Source/WebKit2/PlatformMac.cmake (209557 => 209558)


--- trunk/Source/WebKit2/PlatformMac.cmake	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/PlatformMac.cmake	2016-12-08 20:52:35 UTC (rev 209558)
@@ -223,6 +223,7 @@
     UIProcess/API/Cocoa/_WKVisitedLinkStore.mm
     UIProcess/API/Cocoa/_WKWebsiteDataSize.mm
     UIProcess/API/Cocoa/_WKWebsiteDataStore.mm
+    UIProcess/API/Cocoa/_WKWebsitePolicies.mm
 
     UIProcess/API/mac/WKView.mm
 

Modified: trunk/Source/WebKit2/Shared/API/APIObject.h (209557 => 209558)


--- trunk/Source/WebKit2/Shared/API/APIObject.h	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/Shared/API/APIObject.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -156,6 +156,7 @@
         VisitedLinkStore,
         WebsiteDataRecord,
         WebsiteDataStore,
+        WebsitePolicies,
         WindowFeatures,
 
 #if ENABLE(MEDIA_SESSION)

Modified: trunk/Source/WebKit2/Shared/API/c/WKBase.h (209557 => 209558)


--- trunk/Source/WebKit2/Shared/API/c/WKBase.h	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/Shared/API/c/WKBase.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -139,6 +139,7 @@
 typedef const struct OpaqueWKVibration* WKVibrationRef;
 typedef const struct OpaqueWKViewportAttributes* WKViewportAttributesRef;
 typedef const struct OpaqueWKWebsiteDataStore* WKWebsiteDataStoreRef;
+typedef const struct OpaqueWKWebsitePolicies* WKWebsitePoliciesRef;
 typedef const struct OpaqueWKWindowFeatures* WKWindowFeaturesRef;
 
 /* WebKit2 Bundle types */

Added: trunk/Source/WebKit2/Shared/WebsitePolicies.h (0 => 209558)


--- trunk/Source/WebKit2/Shared/WebsitePolicies.h	                        (rev 0)
+++ trunk/Source/WebKit2/Shared/WebsitePolicies.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+namespace WebKit {
+
+struct WebsitePolicies {
+
+    bool contentBlockersEnabled { true };
+    
+    template<class Encoder> void encode(Encoder&) const;
+    template<class Decoder> static bool decode(Decoder&, WebsitePolicies&);
+};
+
+template<class Encoder> void WebsitePolicies::encode(Encoder& encoder) const
+{
+    encoder << contentBlockersEnabled;
+}
+
+template<class Decoder> bool WebsitePolicies::decode(Decoder& decoder, WebsitePolicies& result)
+{
+    if (!decoder.decode(result.contentBlockersEnabled))
+        return false;
+    return true;
+}
+
+} // namespace WebKit

Modified: trunk/Source/WebKit2/UIProcess/API/APINavigationClient.h (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/API/APINavigationClient.h	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/API/APINavigationClient.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -23,8 +23,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef APINavigationClient_h
-#define APINavigationClient_h
+#pragma once
 
 #include "APIData.h"
 #include "PluginModuleInfo.h"
@@ -31,6 +30,7 @@
 #include "SameDocumentNavigationType.h"
 #include "WebEvent.h"
 #include "WebFramePolicyListenerProxy.h"
+#include "WebsitePolicies.h"
 #include <WebCore/FrameLoaderTypes.h>
 #include <WebCore/LayoutMilestones.h>
 #include <wtf/Forward.h>
@@ -95,12 +95,12 @@
 
     virtual void decidePolicyForNavigationAction(WebKit::WebPageProxy&, API::NavigationAction&, Ref<WebKit::WebFramePolicyListenerProxy>&& listener, API::Object*)
     {
-        listener->use();
+        listener->use({ });
     }
 
     virtual void decidePolicyForNavigationResponse(WebKit::WebPageProxy&, API::NavigationResponse&, Ref<WebKit::WebFramePolicyListenerProxy>&& listener, API::Object*)
     {
-        listener->use();
+        listener->use({ });
     }
     
 #if ENABLE(NETSCAPE_PLUGIN_API)
@@ -117,5 +117,3 @@
 };
 
 } // namespace API
-
-#endif // APINavigationClient_h

Modified: trunk/Source/WebKit2/UIProcess/API/APIPolicyClient.h (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/API/APIPolicyClient.h	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/API/APIPolicyClient.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -53,15 +53,15 @@
 
     virtual void decidePolicyForNavigationAction(WebKit::WebPageProxy&, WebKit::WebFrameProxy*, const WebKit::NavigationActionData&, WebKit::WebFrameProxy*, const WebCore::ResourceRequest&, const WebCore::ResourceRequest&, Ref<WebKit::WebFramePolicyListenerProxy>&& listener, API::Object*)
     {
-        listener->use();
+        listener->use({ });
     }
     virtual void decidePolicyForNewWindowAction(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, const WebKit::NavigationActionData&, const WebCore::ResourceRequest&, const WTF::String&, Ref<WebKit::WebFramePolicyListenerProxy>&& listener, API::Object*)
     {
-        listener->use();
+        listener->use({ });
     }
     virtual void decidePolicyForResponse(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool, Ref<WebKit::WebFramePolicyListenerProxy>&& listener, API::Object*)
     {
-        listener->use();
+        listener->use({ });
     }
     virtual void unableToImplementPolicy(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, const WebCore::ResourceError&, API::Object*) { }
 };

Added: trunk/Source/WebKit2/UIProcess/API/APIWebsitePolicies.cpp (0 => 209558)


--- trunk/Source/WebKit2/UIProcess/API/APIWebsitePolicies.cpp	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/APIWebsitePolicies.cpp	2016-12-08 20:52:35 UTC (rev 209558)
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "APIWebsitePolicies.h"
+
+namespace API {
+
+Ref<WebsitePolicies> WebsitePolicies::create()
+{
+    return adoptRef(*new WebsitePolicies());
+}
+
+WebsitePolicies::WebsitePolicies()
+{
+}
+
+WebsitePolicies::~WebsitePolicies()
+{
+}
+
+}

Added: trunk/Source/WebKit2/UIProcess/API/APIWebsitePolicies.h (0 => 209558)


--- trunk/Source/WebKit2/UIProcess/API/APIWebsitePolicies.h	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/APIWebsitePolicies.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "APIObject.h"
+#include "WebsitePolicies.h"
+
+namespace API {
+
+class WebsitePolicies final : public ObjectImpl<Object::Type::WebsitePolicies> {
+public:
+    static Ref<WebsitePolicies> create();
+    explicit WebsitePolicies();
+    virtual ~WebsitePolicies();
+
+    bool contentBlockersEnabled() const { return m_websitePolicies.contentBlockersEnabled; }
+    void setContentBlockersEnabled(bool enabled) { m_websitePolicies.contentBlockersEnabled = enabled; }
+    
+    const WebKit::WebsitePolicies& websitePolicies() { return m_websitePolicies; }
+    
+private:
+    WebKit::WebsitePolicies m_websitePolicies;
+};
+
+}

Modified: trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKAPICast.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -67,6 +67,7 @@
 class UserContentExtensionStore;
 class UserScript;
 class WebsiteDataStore;
+class WebsitePolicies;
 class WindowFeatures;
 }
 
@@ -110,6 +111,7 @@
 class WebUserContentControllerProxy;
 class WebVibrationProxy;
 class WebViewportAttributes;
+struct WebsitePolicies;
 
 WK_ADD_API_MAPPING(WKAuthenticationChallengeRef, AuthenticationChallengeProxy)
 WK_ADD_API_MAPPING(WKAuthenticationDecisionListenerRef, AuthenticationDecisionListener)
@@ -165,6 +167,7 @@
 WK_ADD_API_MAPPING(WKVibrationRef, WebVibrationProxy)
 WK_ADD_API_MAPPING(WKViewportAttributesRef, WebViewportAttributes)
 WK_ADD_API_MAPPING(WKWebsiteDataStoreRef, API::WebsiteDataStore)
+WK_ADD_API_MAPPING(WKWebsitePoliciesRef, API::WebsitePolicies)
 WK_ADD_API_MAPPING(WKWindowFeaturesRef, API::WindowFeatures)
 
 /* Enum conversions */

Modified: trunk/Source/WebKit2/UIProcess/API/C/WKFramePolicyListener.cpp (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/API/C/WKFramePolicyListener.cpp	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKFramePolicyListener.cpp	2016-12-08 20:52:35 UTC (rev 209558)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010, 2016 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -26,9 +26,11 @@
 #include "config.h"
 #include "WKFramePolicyListener.h"
 
+#include "APIWebsitePolicies.h"
 #include "WKAPICast.h"
 #include "WebFramePolicyListenerProxy.h"
 #include "WebFrameProxy.h"
+#include "WebsitePolicies.h"
 
 using namespace WebKit;
 
@@ -39,9 +41,14 @@
 
 void WKFramePolicyListenerUse(WKFramePolicyListenerRef policyListenerRef)
 {
-    toImpl(policyListenerRef)->use();
+    toImpl(policyListenerRef)->use({ });
 }
 
+void WKFramePolicyListenerUseWithPolicies(WKFramePolicyListenerRef policyListenerRef, WKWebsitePoliciesRef websitePolicies)
+{
+    toImpl(policyListenerRef)->use(toImpl(websitePolicies)->websitePolicies());
+}
+
 void WKFramePolicyListenerDownload(WKFramePolicyListenerRef policyListenerRef)
 {
     toImpl(policyListenerRef)->download();

Modified: trunk/Source/WebKit2/UIProcess/API/C/WKFramePolicyListener.h (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/API/C/WKFramePolicyListener.h	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKFramePolicyListener.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010, 2016 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -23,8 +23,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef WKFramePolicyListener_h
-#define WKFramePolicyListener_h
+#pragma once
 
 #include <WebKit/WKBase.h>
 
@@ -34,12 +33,11 @@
 
 WK_EXPORT WKTypeID WKFramePolicyListenerGetTypeID();
 
-WK_EXPORT void WKFramePolicyListenerUse(WKFramePolicyListenerRef policyListener);
-WK_EXPORT void WKFramePolicyListenerDownload(WKFramePolicyListenerRef policyListener);
-WK_EXPORT void WKFramePolicyListenerIgnore(WKFramePolicyListenerRef policyListener);
+WK_EXPORT void WKFramePolicyListenerUse(WKFramePolicyListenerRef);
+WK_EXPORT void WKFramePolicyListenerDownload(WKFramePolicyListenerRef);
+WK_EXPORT void WKFramePolicyListenerIgnore(WKFramePolicyListenerRef);
+WK_EXPORT void WKFramePolicyListenerUseWithPolicies(WKFramePolicyListenerRef, WKWebsitePoliciesRef);
 
 #ifdef __cplusplus
 }
 #endif
-
-#endif /* WKFramePolicyListener_h */

Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp	2016-12-08 20:52:35 UTC (rev 209558)
@@ -1348,7 +1348,7 @@
         void decidePolicyForNavigationAction(WebPageProxy& page, WebFrameProxy* frame, const NavigationActionData& navigationActionData, WebFrameProxy* originatingFrame, const WebCore::ResourceRequest& originalResourceRequest, const WebCore::ResourceRequest& resourceRequest, Ref<WebFramePolicyListenerProxy>&& listener, API::Object* userData) override
         {
             if (!m_client.decidePolicyForNavigationAction_deprecatedForUseWithV0 && !m_client.decidePolicyForNavigationAction_deprecatedForUseWithV1 && !m_client.decidePolicyForNavigationAction) {
-                listener->use();
+                listener->use({ });
                 return;
             }
 
@@ -1366,7 +1366,7 @@
         void decidePolicyForNewWindowAction(WebPageProxy& page, WebFrameProxy& frame, const NavigationActionData& navigationActionData, const ResourceRequest& resourceRequest, const String& frameName, Ref<WebFramePolicyListenerProxy>&& listener, API::Object* userData) override
         {
             if (!m_client.decidePolicyForNewWindowAction) {
-                listener->use();
+                listener->use({ });
                 return;
             }
 
@@ -1378,7 +1378,7 @@
         void decidePolicyForResponse(WebPageProxy& page, WebFrameProxy& frame, const ResourceResponse& resourceResponse, const ResourceRequest& resourceRequest, bool canShowMIMEType, Ref<WebFramePolicyListenerProxy>&& listener, API::Object* userData) override
         {
             if (!m_client.decidePolicyForResponse_deprecatedForUseWithV0 && !m_client.decidePolicyForResponse) {
-                listener->use();
+                listener->use({ });
                 return;
             }
 

Added: trunk/Source/WebKit2/UIProcess/API/C/WKWebsitePolicies.cpp (0 => 209558)


--- trunk/Source/WebKit2/UIProcess/API/C/WKWebsitePolicies.cpp	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKWebsitePolicies.cpp	2016-12-08 20:52:35 UTC (rev 209558)
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WKWebsitePolicies.h"
+
+#include "APIWebsitePolicies.h"
+#include "WKAPICast.h"
+#include "WebsitePolicies.h"
+
+using namespace WebKit;
+
+WKTypeID WKWebsitePoliciesGetTypeID()
+{
+    return toAPI(API::WebsitePolicies::APIType);
+}
+
+WKWebsitePoliciesRef WKWebsitePoliciesCreate()
+{
+    return toAPI(&API::WebsitePolicies::create().leakRef());
+}
+
+void WKWebsitePoliciesSetContentBlockersEnabled(WKWebsitePoliciesRef websitePolicies, bool enabled)
+{
+    toImpl(websitePolicies)->setContentBlockersEnabled(enabled);
+}
+
+bool WKWebsitePoliciesGetContentBlockersEnabled(WKWebsitePoliciesRef websitePolicies)
+{
+    return toImpl(websitePolicies)->contentBlockersEnabled();
+}

Added: trunk/Source/WebKit2/UIProcess/API/C/WKWebsitePolicies.h (0 => 209558)


--- trunk/Source/WebKit2/UIProcess/API/C/WKWebsitePolicies.h	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKWebsitePolicies.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <WebKit/WKBase.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+WK_EXPORT WKTypeID WKWebsitePoliciesGetTypeID();
+
+WK_EXPORT WKWebsitePoliciesRef WKWebsitePoliciesCreate();
+
+WK_EXPORT bool WKWebsitePoliciesGetContentBlockersEnabled(WKWebsitePoliciesRef);
+WK_EXPORT void WKWebsitePoliciesSetContentBlockersEnabled(WKWebsitePoliciesRef, bool);
+
+#ifdef __cplusplus
+}
+#endif

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -31,6 +31,8 @@
 
 #if WK_API_ENABLED
 
+@class _WKWebsitePolicies;
+
 static const WKNavigationActionPolicy _WKNavigationActionPolicyDownload = (WKNavigationActionPolicy)(WKNavigationActionPolicyAllow + 1);
 static const WKNavigationActionPolicy WK_API_AVAILABLE(macosx(10.11), ios(9.0)) _WKNavigationActionPolicyAllowWithoutTryingAppLink = (WKNavigationActionPolicy)(WKNavigationActionPolicyAllow + 2);
 
@@ -63,6 +65,7 @@
 - (void)_webViewWillEndNavigationGesture:(WKWebView *)webView withNavigationToBackForwardListItem:(WKBackForwardListItem *)item;
 - (void)_webView:(WKWebView *)webView willSnapshotBackForwardListItem:(WKBackForwardListItem *)item;
 - (void)_webViewDidRemoveNavigationGestureSnapshot:(WKWebView *)webView WK_API_AVAILABLE(macosx(10.12), ios(10.0));
+- (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 
 #if TARGET_OS_IPHONE
 - (void)_webView:(WKWebView *)webView didStartLoadForQuickLookDocumentInMainFrameWithFileName:(NSString *)fileName uti:(NSString *)uti;

Added: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePolicies.h (0 => 209558)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePolicies.h	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePolicies.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import <WebKit/WKFoundation.h>
+
+#if WK_API_ENABLED
+
+WK_CLASS_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA))
+@interface _WKWebsitePolicies : NSObject
+
+@property (nonatomic) BOOL contentBlockersEnabled;
+
+@end
+
+#endif // WK_API_ENABLED

Added: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePolicies.mm (0 => 209558)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePolicies.mm	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePolicies.mm	2016-12-08 20:52:35 UTC (rev 209558)
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+#import "_WKWebsitePoliciesInternal.h"
+
+#if WK_API_ENABLED
+
+@implementation _WKWebsitePolicies
+
+- (void)dealloc
+{
+    _websitePolicies->API::WebsitePolicies::~WebsitePolicies();
+    
+    [super dealloc];
+}
+
+- (instancetype)init
+{
+    if (!(self = [super init]))
+        return nil;
+    
+    API::Object::constructInWrapper<API::WebsitePolicies>(self);
+    
+    return self;
+}
+
+- (void)setContentBlockersEnabled:(BOOL)contentBlockersEnabled
+{
+    _websitePolicies->setContentBlockersEnabled(contentBlockersEnabled);
+}
+
+- (BOOL)contentBlockersEnabled
+{
+    return _websitePolicies->contentBlockersEnabled();
+}
+
+- (NSString *)description
+{
+    return [NSString stringWithFormat:@"<%@: %p; contentBlockersEnabled = %d>", NSStringFromClass(self.class), self, self.contentBlockersEnabled];
+}
+
+- (API::Object&)_apiObject
+{
+    return *_websitePolicies;
+}
+
+@end
+
+#endif

Added: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePoliciesInternal.h (0 => 209558)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePoliciesInternal.h	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsitePoliciesInternal.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "_WKWebsitePolicies.h"
+
+#if WK_API_ENABLED
+
+#import "APIWebsitePolicies.h"
+#import "WKObject.h"
+
+namespace WebKit {
+
+inline _WKWebsitePolicies *wrapper(API::WebsitePolicies& websitePolicies)
+{
+    ASSERT([websitePolicies.wrapper() isKindOfClass:[_WKWebsitePolicies class]]);
+    return (_WKWebsitePolicies *)websitePolicies.wrapper();
+}
+
+}
+
+@interface _WKWebsitePolicies () <WKObject> {
+@package
+    API::ObjectStorage<API::WebsitePolicies> _websitePolicies;
+}
+@end
+
+#endif

Modified: trunk/Source/WebKit2/UIProcess/Automation/WebAutomationSession.cpp (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/Automation/WebAutomationSession.cpp	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/Automation/WebAutomationSession.cpp	2016-12-08 20:52:35 UTC (rev 209558)
@@ -435,8 +435,7 @@
     m_pendingNavigationInBrowsingContextCallbacksPerPage.set(page->pageID(), WTFMove(callback));
 
     const bool reloadFromOrigin = false;
-    const bool contentBlockersEnabled = true;
-    page->reload(reloadFromOrigin, contentBlockersEnabled);
+    page->reload(reloadFromOrigin, { });
 }
 
 void WebAutomationSession::inspectBrowsingContext(Inspector::ErrorString& errorString, const String& handle, const bool* optionalEnableAutoCapturing, Ref<InspectBrowsingContextCallback>&& callback)

Modified: trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.h (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.h	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -162,6 +162,7 @@
 
     struct {
         bool webViewDecidePolicyForNavigationActionDecisionHandler : 1;
+        bool webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies : 1;
         bool webViewDecidePolicyForNavigationResponseDecisionHandler : 1;
 
         bool webViewDidStartProvisionalNavigation : 1;

Modified: trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.mm (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.mm	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.mm	2016-12-08 20:52:35 UTC (rev 209558)
@@ -62,6 +62,7 @@
 #import "_WKFrameHandleInternal.h"
 #import "_WKRenderingProgressEventsInternal.h"
 #import "_WKSameDocumentNavigationTypeInternal.h"
+#import "_WKWebsitePoliciesInternal.h"
 #import <WebCore/Credential.h>
 #import <WebCore/SecurityOriginData.h>
 #import <WebCore/SerializedCryptoKeyWrap.h>
@@ -137,6 +138,7 @@
     m_navigationDelegate = delegate;
 
     m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandler = [delegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)];
+    m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies = [delegate respondsToSelector:@selector(_webView:decidePolicyForNavigationAction:decisionHandler:)];
     m_navigationDelegateMethods.webViewDecidePolicyForNavigationResponseDecisionHandler = [delegate respondsToSelector:@selector(webView:decidePolicyForNavigationResponse:decisionHandler:)];
 
     m_navigationDelegateMethods.webViewDidStartProvisionalNavigation = [delegate respondsToSelector:@selector(webView:didStartProvisionalNavigation:)];
@@ -265,7 +267,7 @@
 {
 }
 
-static void tryAppLink(RefPtr<API::NavigationAction> navigationAction, const String& currentMainFrameURL, std::function<void (bool)> completionHandler)
+static void tryAppLink(RefPtr<API::NavigationAction>&& navigationAction, const String& currentMainFrameURL, std::function<void(bool)> completionHandler)
 {
 #if HAVE(APP_LINKS)
     if (!navigationAction->shouldOpenAppLinks()) {
@@ -289,11 +291,12 @@
 {
     String mainFrameURLString = webPageProxy.mainFrame()->url();
 
-    if (!m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandler) {
+    if (!m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandler
+        && !m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies) {
         RefPtr<API::NavigationAction> localNavigationAction = &navigationAction;
         RefPtr<WebFramePolicyListenerProxy> localListener = WTFMove(listener);
 
-        tryAppLink(localNavigationAction, mainFrameURLString, [localListener, localNavigationAction] (bool followedLinkToApp) {
+        tryAppLink(WTFMove(localNavigationAction), mainFrameURLString, [localListener, localNavigationAction = RefPtr<API::NavigationAction>(&navigationAction)] (bool followedLinkToApp) {
             if (followedLinkToApp) {
                 localListener->ignore();
                 return;
@@ -300,7 +303,7 @@
             }
 
             if (!localNavigationAction->targetFrame()) {
-                localListener->use();
+                localListener->use({ });
                 return;
             }
 
@@ -309,7 +312,7 @@
                 if (localNavigationAction->shouldPerformDownload())
                     localListener->download();
                 else
-                    localListener->use();
+                    localListener->use({ });
                 return;
             }
 
@@ -329,21 +332,26 @@
     if (!navigationDelegate)
         return;
 
-    RefPtr<API::NavigationAction> localNavigationAction = &navigationAction;
-    RefPtr<WebFramePolicyListenerProxy> localListener = WTFMove(listener);
-    RefPtr<CompletionHandlerCallChecker> checker = CompletionHandlerCallChecker::create(navigationDelegate.get(), @selector(webView:decidePolicyForNavigationAction:decisionHandler:));
-    [navigationDelegate webView:m_navigationState.m_webView decidePolicyForNavigationAction:wrapper(navigationAction) decisionHandler:[localListener, localNavigationAction, checker, mainFrameURLString](WKNavigationActionPolicy actionPolicy) {
+    bool delegateHasWebsitePolicies = m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies;
+    
+    RefPtr<CompletionHandlerCallChecker> checker = CompletionHandlerCallChecker::create(navigationDelegate.get(), delegateHasWebsitePolicies ? @selector(_webView:decidePolicyForNavigationAction:decisionHandler:) : @selector(webView:decidePolicyForNavigationAction:decisionHandler:));
+    
+    auto decisionHandlerWithPolicies = [localListener = RefPtr<WebFramePolicyListenerProxy>(WTFMove(listener)), localNavigationAction = RefPtr<API::NavigationAction>(&navigationAction), checker = WTFMove(checker), mainFrameURLString](WKNavigationActionPolicy actionPolicy, _WKWebsitePolicies *websitePolicies) mutable {
         checker->didCallCompletionHandler();
 
+        WebsitePolicies policies;
+        if (websitePolicies)
+            policies = websitePolicies->_websitePolicies->websitePolicies();
+
         switch (actionPolicy) {
         case WKNavigationActionPolicyAllow:
-            tryAppLink(localNavigationAction, mainFrameURLString, [localListener](bool followedLinkToApp) {
+            tryAppLink(WTFMove(localNavigationAction), mainFrameURLString, [localListener = WTFMove(localListener), policies = WTFMove(policies)](bool followedLinkToApp) mutable {
                 if (followedLinkToApp) {
                     localListener->ignore();
                     return;
                 }
 
-                localListener->use();
+                localListener->use(policies);
             });
         
             break;
@@ -356,17 +364,23 @@
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wswitch"
         case _WKNavigationActionPolicyDownload:
-#pragma clang diagnostic pop
             localListener->download();
             break;
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wswitch"
         case _WKNavigationActionPolicyAllowWithoutTryingAppLink:
 #pragma clang diagnostic pop
-            localListener->use();
+            localListener->use(policies);
             break;
         }
-    }];
+    };
+    
+    if (delegateHasWebsitePolicies)
+        [(id <WKNavigationDelegatePrivate>)navigationDelegate _webView:m_navigationState.m_webView decidePolicyForNavigationAction:wrapper(navigationAction) decisionHandler:decisionHandlerWithPolicies];
+    else {
+        auto decisionHandlerWithoutPolicies = [decisionHandlerWithPolicies] (WKNavigationActionPolicy actionPolicy) mutable {
+            decisionHandlerWithPolicies(actionPolicy, nil);
+        };
+        [navigationDelegate webView:m_navigationState.m_webView decidePolicyForNavigationAction:wrapper(navigationAction) decisionHandler:decisionHandlerWithoutPolicies];
+    }
 }
 
 void NavigationState::NavigationClient::decidePolicyForNavigationResponse(WebPageProxy&, API::NavigationResponse& navigationResponse, Ref<WebFramePolicyListenerProxy>&& listener, API::Object* userData)
@@ -378,7 +392,7 @@
             BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:url.path isDirectory:&isDirectory];
 
             if (exists && !isDirectory && navigationResponse.canShowMIMEType())
-                listener->use();
+                listener->use({ });
             else
                 listener->ignore();
             return;
@@ -385,7 +399,7 @@
         }
 
         if (navigationResponse.canShowMIMEType())
-            listener->use();
+            listener->use({ });
         else
             listener->ignore();
         return;
@@ -402,7 +416,7 @@
 
         switch (responsePolicy) {
         case WKNavigationResponsePolicyAllow:
-            localListener->use();
+            localListener->use({ });
             break;
 
         case WKNavigationResponsePolicyCancel:

Modified: trunk/Source/WebKit2/UIProcess/WebFormSubmissionListenerProxy.cpp (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/WebFormSubmissionListenerProxy.cpp	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/WebFormSubmissionListenerProxy.cpp	2016-12-08 20:52:35 UTC (rev 209558)
@@ -26,6 +26,8 @@
 #include "config.h"
 #include "WebFormSubmissionListenerProxy.h"
 
+#include "WebsitePolicies.h"
+
 namespace WebKit {
 
 WebFormSubmissionListenerProxy::WebFormSubmissionListenerProxy(WebFrameProxy* frame, uint64_t listenerID)
@@ -35,7 +37,7 @@
 
 void WebFormSubmissionListenerProxy::continueSubmission()
 {
-    receivedPolicyDecision(WebCore::PolicyUse);
+    receivedPolicyDecision(WebCore::PolicyUse, { });
 }
 
 } // namespace WebKit

Modified: trunk/Source/WebKit2/UIProcess/WebFrameListenerProxy.cpp (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/WebFrameListenerProxy.cpp	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/WebFrameListenerProxy.cpp	2016-12-08 20:52:35 UTC (rev 209558)
@@ -45,12 +45,12 @@
     m_frame = nullptr;
 }
 
-void WebFrameListenerProxy::receivedPolicyDecision(WebCore::PolicyAction action)
+void WebFrameListenerProxy::receivedPolicyDecision(WebCore::PolicyAction action, const WebsitePolicies& websitePolicies)
 {
     if (!m_frame)
         return;
 
-    m_frame->receivedPolicyDecision(action, m_listenerID, m_navigation.get());
+    m_frame->receivedPolicyDecision(action, m_listenerID, m_navigation.get(), websitePolicies);
     m_frame = nullptr;
 }
 

Modified: trunk/Source/WebKit2/UIProcess/WebFrameListenerProxy.h (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/WebFrameListenerProxy.h	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/WebFrameListenerProxy.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -23,8 +23,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef WebFrameListenerProxy_h
-#define WebFrameListenerProxy_h
+#pragma once
 
 #include "APINavigation.h"
 #include "APIObject.h"
@@ -36,6 +35,7 @@
 namespace WebKit {
 
 class WebFrameProxy;
+struct WebsitePolicies;
 
 class WebFrameListenerProxy : public API::Object {
 public:
@@ -50,7 +50,7 @@
 protected:
     WebFrameListenerProxy(WebFrameProxy*, uint64_t listenerID);
 
-    void receivedPolicyDecision(WebCore::PolicyAction);
+    void receivedPolicyDecision(WebCore::PolicyAction, const WebsitePolicies&);
 
 private:
     RefPtr<WebFrameProxy> m_frame;
@@ -59,5 +59,3 @@
 };
 
 } // namespace WebKit
-
-#endif // WebFrameListenerProxy_h

Modified: trunk/Source/WebKit2/UIProcess/WebFramePolicyListenerProxy.cpp (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/WebFramePolicyListenerProxy.cpp	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/WebFramePolicyListenerProxy.cpp	2016-12-08 20:52:35 UTC (rev 209558)
@@ -27,6 +27,7 @@
 #include "WebFramePolicyListenerProxy.h"
 
 #include "WebFrameProxy.h"
+#include "WebsitePolicies.h"
 
 namespace WebKit {
 
@@ -35,19 +36,19 @@
 {
 }
 
-void WebFramePolicyListenerProxy::use()
+void WebFramePolicyListenerProxy::use(const WebsitePolicies& websitePolicies)
 {
-    receivedPolicyDecision(WebCore::PolicyUse);
+    receivedPolicyDecision(WebCore::PolicyUse, websitePolicies);
 }
 
 void WebFramePolicyListenerProxy::download()
 {
-    receivedPolicyDecision(WebCore::PolicyDownload);
+    receivedPolicyDecision(WebCore::PolicyDownload, { });
 }
 
 void WebFramePolicyListenerProxy::ignore()
 {
-    receivedPolicyDecision(WebCore::PolicyIgnore);
+    receivedPolicyDecision(WebCore::PolicyIgnore, { });
 }
 
 } // namespace WebKit

Modified: trunk/Source/WebKit2/UIProcess/WebFramePolicyListenerProxy.h (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/WebFramePolicyListenerProxy.h	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/WebFramePolicyListenerProxy.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -23,8 +23,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef WebFramePolicyListenerProxy_h
-#define WebFramePolicyListenerProxy_h
+#pragma once
 
 #include "WebFrameListenerProxy.h"
 
@@ -40,12 +39,12 @@
 public:
     static const Type APIType = Type::FramePolicyListener;
 
-    static PassRefPtr<WebFramePolicyListenerProxy> create(WebFrameProxy* frame, uint64_t listenerID)
+    static Ref<WebFramePolicyListenerProxy> create(WebFrameProxy* frame, uint64_t listenerID)
     {
-        return adoptRef(new WebFramePolicyListenerProxy(frame, listenerID));
+        return adoptRef(*new WebFramePolicyListenerProxy(frame, listenerID));
     }
 
-    void use();
+    void use(const WebsitePolicies&);
     void download();
     void ignore();
 
@@ -62,5 +61,3 @@
 } // namespace WebKit
 
 #undef DELEGATE_REF_COUNTING_TO_COCOA
-
-#endif // WebFramePolicyListenerProxy_h

Modified: trunk/Source/WebKit2/UIProcess/WebFrameProxy.cpp (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/WebFrameProxy.cpp	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/WebFrameProxy.cpp	2016-12-08 20:52:35 UTC (rev 209558)
@@ -176,7 +176,7 @@
     m_title = title;
 }
 
-void WebFrameProxy::receivedPolicyDecision(WebCore::PolicyAction action, uint64_t listenerID, API::Navigation* navigation)
+void WebFrameProxy::receivedPolicyDecision(WebCore::PolicyAction action, uint64_t listenerID, API::Navigation* navigation, const WebsitePolicies& websitePolicies)
 {
     if (!m_page)
         return;
@@ -183,7 +183,7 @@
 
     ASSERT(m_activeListener);
     ASSERT(m_activeListener->listenerID() == listenerID);
-    m_page->receivedPolicyDecision(action, this, listenerID, navigation);
+    m_page->receivedPolicyDecision(action, *this, listenerID, navigation, websitePolicies);
 }
 
 WebFramePolicyListenerProxy& WebFrameProxy::setUpPolicyListenerProxy(uint64_t listenerID)

Modified: trunk/Source/WebKit2/UIProcess/WebFrameProxy.h (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/WebFrameProxy.h	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/WebFrameProxy.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -23,8 +23,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef WebFrameProxy_h
-#define WebFrameProxy_h
+#pragma once
 
 #include "APIObject.h"
 #include "FrameLoadState.h"
@@ -53,6 +52,7 @@
 class WebFormSubmissionListenerProxy;
 class WebFramePolicyListenerProxy;
 class WebPageProxy;
+struct WebsitePolicies;
 
 typedef GenericCallback<API::Data*> DataCallback;
 
@@ -115,7 +115,7 @@
     void didChangeTitle(const String&);
 
     // Policy operations.
-    void receivedPolicyDecision(WebCore::PolicyAction, uint64_t listenerID, API::Navigation* = nullptr);
+    void receivedPolicyDecision(WebCore::PolicyAction, uint64_t listenerID, API::Navigation*, const WebsitePolicies&);
     WebFramePolicyListenerProxy& setUpPolicyListenerProxy(uint64_t listenerID);
     WebFormSubmissionListenerProxy& setUpFormSubmissionListenerProxy(uint64_t listenerID);
 
@@ -149,5 +149,3 @@
 };
 
 } // namespace WebKit
-
-#endif // WebFrameProxy_h

Modified: trunk/Source/WebKit2/UIProcess/WebInspectorProxy.cpp (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/WebInspectorProxy.cpp	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/WebInspectorProxy.cpp	2016-12-08 20:52:35 UTC (rev 209558)
@@ -334,7 +334,7 @@
     // Allow non-main frames to navigate anywhere.
     API::FrameInfo* sourceFrame = toImpl(navigationActionRef)->sourceFrame();
     if (sourceFrame && !sourceFrame->isMainFrame()) {
-        toImpl(listenerRef)->use();
+        toImpl(listenerRef)->use({ });
         return;
     }
 
@@ -345,7 +345,7 @@
 
     // Allow loading of the main inspector file.
     if (WebInspectorProxy::isMainOrTestInspectorPage(request.url())) {
-        toImpl(listenerRef)->use();
+        toImpl(listenerRef)->use({ });
         return;
     }
 

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2016-12-08 20:52:35 UTC (rev 209558)
@@ -2253,7 +2253,7 @@
     m_process->send(Messages::WebPage::CenterSelectionInVisibleArea(), m_pageID);
 }
 
-void WebPageProxy::receivedPolicyDecision(PolicyAction action, WebFrameProxy* frame, uint64_t listenerID, API::Navigation* navigation)
+void WebPageProxy::receivedPolicyDecision(PolicyAction action, WebFrameProxy& frame, uint64_t listenerID, API::Navigation* navigation, const WebsitePolicies& websitePolicies)
 {
     if (!isValid())
         return;
@@ -2293,10 +2293,11 @@
         m_syncNavigationActionPolicyActionIsValid = true;
         m_syncNavigationActionPolicyAction = action;
         m_syncNavigationActionPolicyDownloadID = downloadID;
+        m_syncNavigationActionPolicyWebsitePolicies = websitePolicies;
         return;
     }
     
-    m_process->send(Messages::WebPage::DidReceivePolicyDecision(frame->frameID(), listenerID, action, navigation ? navigation->navigationID() : 0, downloadID), m_pageID);
+    m_process->send(Messages::WebPage::DidReceivePolicyDecision(frame.frameID(), listenerID, action, navigation ? navigation->navigationID() : 0, downloadID), m_pageID);
 }
 
 void WebPageProxy::setUserAgent(const String& userAgent)
@@ -3609,7 +3610,7 @@
         m_frameSetLargestFrame = value ? m_mainFrame : 0;
 }
 
-void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData& navigationActionData, uint64_t originatingFrameID, const SecurityOriginData& originatingFrameSecurityOrigin, const WebCore::ResourceRequest& originalRequest, const ResourceRequest& request, uint64_t listenerID, const UserData& userData, bool& receivedPolicyAction, uint64_t& newNavigationID, uint64_t& policyAction, DownloadID& downloadID)
+void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData& navigationActionData, uint64_t originatingFrameID, const SecurityOriginData& originatingFrameSecurityOrigin, const WebCore::ResourceRequest& originalRequest, const ResourceRequest& request, uint64_t listenerID, const UserData& userData, bool& receivedPolicyAction, uint64_t& newNavigationID, uint64_t& policyAction, DownloadID& downloadID, WebsitePolicies& websitePolicies)
 {
     PageClientProtector protector(m_pageClient);
 
@@ -3677,6 +3678,7 @@
     if (m_syncNavigationActionPolicyActionIsValid) {
         policyAction = m_syncNavigationActionPolicyAction;
         downloadID = m_syncNavigationActionPolicyDownloadID;
+        websitePolicies = m_syncNavigationActionPolicyWebsitePolicies;
     }
 }
 

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2016-12-08 20:52:35 UTC (rev 209558)
@@ -60,6 +60,7 @@
 #include "WebPageProxyMessages.h"
 #include "WebPopupMenuProxy.h"
 #include "WebProcessLifetimeTracker.h"
+#include "WebsitePolicies.h"
 #include <WebCore/ActivityState.h>
 #include <WebCore/Color.h>
 #include <WebCore/DragActions.h>
@@ -803,7 +804,7 @@
     void performDictionaryLookupOfCurrentSelection();
 #endif
 
-    void receivedPolicyDecision(WebCore::PolicyAction, WebFrameProxy*, uint64_t listenerID, API::Navigation* navigationID);
+    void receivedPolicyDecision(WebCore::PolicyAction, WebFrameProxy&, uint64_t listenerID, API::Navigation* navigationID, const WebsitePolicies&);
 
     void backForwardRemovedItem(uint64_t itemID);
 
@@ -1244,7 +1245,7 @@
 
     void didDestroyNavigation(uint64_t navigationID);
 
-    void decidePolicyForNavigationAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData&, uint64_t originatingFrameID, const WebCore::SecurityOriginData& originatingFrameSecurityOrigin, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, uint64_t listenerID, const UserData&, bool& receivedPolicyAction, uint64_t& newNavigationID, uint64_t& policyAction, DownloadID&);
+    void decidePolicyForNavigationAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData&, uint64_t originatingFrameID, const WebCore::SecurityOriginData& originatingFrameSecurityOrigin, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, uint64_t listenerID, const UserData&, bool& receivedPolicyAction, uint64_t& newNavigationID, uint64_t& policyAction, DownloadID&, WebsitePolicies&);
     void decidePolicyForNewWindowAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const NavigationActionData&, const WebCore::ResourceRequest&, const String& frameName, uint64_t listenerID, const UserData&);
     void decidePolicyForResponse(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, uint64_t listenerID, const UserData&);
     void decidePolicyForResponseSync(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, uint64_t listenerID, const UserData&, bool& receivedPolicyAction, uint64_t& policyAction, DownloadID&);
@@ -1770,6 +1771,7 @@
     bool m_syncNavigationActionPolicyActionIsValid;
     WebCore::PolicyAction m_syncNavigationActionPolicyAction;
     DownloadID m_syncNavigationActionPolicyDownloadID;
+    WebsitePolicies m_syncNavigationActionPolicyWebsitePolicies;
     bool m_shouldSuppressAppLinksInNextNavigationPolicyDecision { false };
 
     Deque<NativeWebKeyboardEvent> m_keyEventQueue;

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in (209557 => 209558)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in	2016-12-08 20:52:35 UTC (rev 209558)
@@ -111,7 +111,7 @@
 
     # Policy messages
     DecidePolicyForResponseSync(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, WebCore::ResourceResponse response, WebCore::ResourceRequest request, bool canShowMIMEType, uint64_t listenerID, WebKit::UserData userData) -> (bool receivedPolicyAction, uint64_t policyAction, WebKit::DownloadID downloadID)
-    DecidePolicyForNavigationAction(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, uint64_t navigationID, struct WebKit::NavigationActionData navigationActionData, uint64_t originatingFrameID, struct WebCore::SecurityOriginData originatingFrameSecurityOrigin, WebCore::ResourceRequest originalRequest, WebCore::ResourceRequest request, uint64_t listenerID, WebKit::UserData userData) -> (bool receivedPolicyAction, uint64_t newNavigationID, uint64_t policyAction, WebKit::DownloadID downloadID)
+    DecidePolicyForNavigationAction(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, uint64_t navigationID, struct WebKit::NavigationActionData navigationActionData, uint64_t originatingFrameID, struct WebCore::SecurityOriginData originatingFrameSecurityOrigin, WebCore::ResourceRequest originalRequest, WebCore::ResourceRequest request, uint64_t listenerID, WebKit::UserData userData) -> (bool receivedPolicyAction, uint64_t newNavigationID, uint64_t policyAction, WebKit::DownloadID downloadID, struct WebKit::WebsitePolicies websitePolicies)
     DecidePolicyForNewWindowAction(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, struct WebKit::NavigationActionData navigationActionData, WebCore::ResourceRequest request, String frameName, uint64_t listenerID, WebKit::UserData userData)
     UnableToImplementPolicy(uint64_t frameID, WebCore::ResourceError error, WebKit::UserData userData)
 

Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (209557 => 209558)


--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj	2016-12-08 20:52:35 UTC (rev 209558)
@@ -1099,6 +1099,13 @@
 		5C7706741D1138380012700F /* WebSocketProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C7706731D111D8B0012700F /* WebSocketProvider.cpp */; };
 		5C79439B1D762D62003102D4 /* WebKit2InitializeCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C79439A1D762CDF003102D4 /* WebKit2InitializeCocoa.mm */; };
 		5C85C7881C3F23CE0061A4FA /* PendingDownload.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C85C7861C3F23C50061A4FA /* PendingDownload.cpp */; };
+		5C9E56821DF7F1AB00C9EE33 /* WKWebsitePolicies.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C9E56801DF7F05500C9EE33 /* WKWebsitePolicies.cpp */; };
+		5C9E56831DF7F1B300C9EE33 /* WKWebsitePolicies.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C9E56811DF7F05500C9EE33 /* WKWebsitePolicies.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		5CB2378B1DF0DE5300117AA3 /* _WKWebsitePolicies.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5CB2378A1DF0DD4300117AA3 /* _WKWebsitePolicies.mm */; };
+		5CB2378C1DF0DE6E00117AA3 /* _WKWebsitePolicies.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CB237891DF0DD4300117AA3 /* _WKWebsitePolicies.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		5CB2378E1DF0E0D300117AA3 /* _WKWebsitePoliciesInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CB2378D1DF0E0C200117AA3 /* _WKWebsitePoliciesInternal.h */; };
+		5CB237911DF0E2E600117AA3 /* APIWebsitePolicies.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CB237901DF0E1DD00117AA3 /* APIWebsitePolicies.cpp */; };
+		5CB237921DF0E2EE00117AA3 /* APIWebsitePolicies.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CB2378F1DF0E1B800117AA3 /* APIWebsitePolicies.h */; };
 		5CBC9B8D1C65279C00A8FDCF /* NetworkDataTaskCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5CBC9B8B1C65257300A8FDCF /* NetworkDataTaskCocoa.mm */; };
 		5CBC9B8E1C652CA000A8FDCF /* NetworkDataTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CBC9B891C6524A500A8FDCF /* NetworkDataTask.h */; };
 		5CE85B201C88E64B0070BFCE /* PingLoad.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CE85B1F1C88E6430070BFCE /* PingLoad.h */; };
@@ -3229,6 +3236,14 @@
 		5C79439A1D762CDF003102D4 /* WebKit2InitializeCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebKit2InitializeCocoa.mm; sourceTree = "<group>"; };
 		5C7C88DC1D0F41A0009D2F6D /* WebSocketProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebSocketProvider.h; path = Network/WebSocketProvider.h; sourceTree = "<group>"; };
 		5C85C7861C3F23C50061A4FA /* PendingDownload.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PendingDownload.cpp; path = NetworkProcess/Downloads/PendingDownload.cpp; sourceTree = "<group>"; };
+		5C9E567F1DF7930900C9EE33 /* WebsitePolicies.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebsitePolicies.h; sourceTree = "<group>"; };
+		5C9E56801DF7F05500C9EE33 /* WKWebsitePolicies.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKWebsitePolicies.cpp; sourceTree = "<group>"; };
+		5C9E56811DF7F05500C9EE33 /* WKWebsitePolicies.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKWebsitePolicies.h; sourceTree = "<group>"; };
+		5CB237891DF0DD4300117AA3 /* _WKWebsitePolicies.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKWebsitePolicies.h; sourceTree = "<group>"; };
+		5CB2378A1DF0DD4300117AA3 /* _WKWebsitePolicies.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKWebsitePolicies.mm; sourceTree = "<group>"; };
+		5CB2378D1DF0E0C200117AA3 /* _WKWebsitePoliciesInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKWebsitePoliciesInternal.h; sourceTree = "<group>"; };
+		5CB2378F1DF0E1B800117AA3 /* APIWebsitePolicies.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIWebsitePolicies.h; sourceTree = "<group>"; };
+		5CB237901DF0E1DD00117AA3 /* APIWebsitePolicies.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = APIWebsitePolicies.cpp; sourceTree = "<group>"; };
 		5CBC9B891C6524A500A8FDCF /* NetworkDataTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkDataTask.h; path = NetworkProcess/NetworkDataTask.h; sourceTree = "<group>"; };
 		5CBC9B8B1C65257300A8FDCF /* NetworkDataTaskCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = NetworkDataTaskCocoa.mm; path = NetworkProcess/cocoa/NetworkDataTaskCocoa.mm; sourceTree = "<group>"; };
 		5CE85B1F1C88E6430070BFCE /* PingLoad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PingLoad.h; path = NetworkProcess/PingLoad.h; sourceTree = "<group>"; };
@@ -4746,6 +4761,7 @@
 				3760881D150413E900FC82C7 /* WebRenderObject.h */,
 				8360349D1ACB34D600626549 /* WebSQLiteDatabaseTracker.cpp */,
 				8360349E1ACB34D600626549 /* WebSQLiteDatabaseTracker.h */,
+				5C9E567F1DF7930900C9EE33 /* WebsitePolicies.h */,
 				C0337DD7127A51B6008FF4F4 /* WebTouchEvent.cpp */,
 				7C065F291C8CD95F00C2D950 /* WebUserContentControllerDataTypes.cpp */,
 				7C065F2A1C8CD95F00C2D950 /* WebUserContentControllerDataTypes.h */,
@@ -5318,6 +5334,9 @@
 				1AE286761C7E76510069AC4F /* _WKWebsiteDataSize.h */,
 				1AE286751C7E76510069AC4F /* _WKWebsiteDataSize.mm */,
 				1AE2867F1C7F92BF0069AC4F /* _WKWebsiteDataSizeInternal.h */,
+				5CB237891DF0DD4300117AA3 /* _WKWebsitePolicies.h */,
+				5CB2378A1DF0DD4300117AA3 /* _WKWebsitePolicies.mm */,
+				5CB2378D1DF0E0C200117AA3 /* _WKWebsitePoliciesInternal.h */,
 				FED3C1DA1B447AE800E0EB7F /* APISerializedScriptValueCocoa.mm */,
 				7CEFA9601AC0999300B910FD /* APIUserContentExtensionStoreCocoa.mm */,
 				1A3635AB1A3145E500ED6197 /* APIWebsiteDataStoreCocoa.mm */,
@@ -6430,6 +6449,8 @@
 				1AE286821C7F93860069AC4F /* APIWebsiteDataRecord.h */,
 				1A3635A71A3144A300ED6197 /* APIWebsiteDataStore.cpp */,
 				1A3635A81A3144A300ED6197 /* APIWebsiteDataStore.h */,
+				5CB237901DF0E1DD00117AA3 /* APIWebsitePolicies.cpp */,
+				5CB2378F1DF0E1B800117AA3 /* APIWebsitePolicies.h */,
 				1A6563E21B7A8C50009CF787 /* APIWindowFeatures.cpp */,
 				1A6563E31B7A8C50009CF787 /* APIWindowFeatures.h */,
 			);
@@ -6565,6 +6586,8 @@
 				7C89D2A21A678875003A5FDE /* WKUserScriptRef.h */,
 				1A57109C1ABA0027002FABBE /* WKWebsiteDataStoreRef.cpp */,
 				1A57109D1ABA0027002FABBE /* WKWebsiteDataStoreRef.h */,
+				5C9E56801DF7F05500C9EE33 /* WKWebsitePolicies.cpp */,
+				5C9E56811DF7F05500C9EE33 /* WKWebsitePolicies.h */,
 				1A7C0DF41B7D1F1000A9B848 /* WKWindowFeaturesRef.cpp */,
 				1A7C0DF51B7D1F1000A9B848 /* WKWindowFeaturesRef.h */,
 			);
@@ -7818,6 +7841,7 @@
 				1AC75A1B1B3368270056745B /* HangDetectionDisabler.h in Headers */,
 				37F90DE31376560E0051CF68 /* HTTPCookieAcceptPolicy.h in Headers */,
 				51E351CB180F2CCC00E53BE9 /* IDBUtilities.h in Headers */,
+				5CB237921DF0E2EE00117AA3 /* APIWebsitePolicies.h in Headers */,
 				BCCF6B2512C93E7A008F9C35 /* ImageOptions.h in Headers */,
 				1A1EC69E1872092100B951F0 /* ImportanceAssertion.h in Headers */,
 				BC204EE311C83E98008F3375 /* InjectedBundle.h in Headers */,
@@ -8135,6 +8159,7 @@
 				51834593134532E90092B696 /* WebIconDatabaseClient.h in Headers */,
 				51D02F6A132EC73700BEAA96 /* WebIconDatabaseMessages.h in Headers */,
 				511B24A7132E095700065A0C /* WebIconDatabaseProxy.h in Headers */,
+				5CB2378C1DF0DE6E00117AA3 /* _WKWebsitePolicies.h in Headers */,
 				51D02F6C132EC73700BEAA96 /* WebIconDatabaseProxyMessages.h in Headers */,
 				510523701C739D42007993CB /* WebIDBConnectionToClient.h in Headers */,
 				5105237A1C73DA77007993CB /* WebIDBConnectionToClientMessages.h in Headers */,
@@ -8336,6 +8361,7 @@
 				377EAD4517E2C51A002D193D /* WKDeclarationSpecifiers.h in Headers */,
 				8372DB2F1A677D4A00C697C5 /* WKDiagnosticLoggingResultType.h in Headers */,
 				BC4075FA124FF0270068F20A /* WKDictionary.h in Headers */,
+				5CB2378E1DF0E0D300117AA3 /* _WKWebsitePoliciesInternal.h in Headers */,
 				BC017D0716260FF4007054F5 /* WKDOMDocument.h in Headers */,
 				BC017D0916260FF4007054F5 /* WKDOMElement.h in Headers */,
 				BC017D0B16260FF4007054F5 /* WKDOMInternals.h in Headers */,
@@ -8547,6 +8573,7 @@
 				53DEA3661DDE423100E82648 /* json.hpp in Headers */,
 				373D122D18A4B6EB0066D9CC /* WKWebProcessPlugInFramePrivate.h in Headers */,
 				1F7506B21859163E00EC0FF7 /* WKWebProcessPlugInHitTestResult.h in Headers */,
+				5C9E56831DF7F1B300C9EE33 /* WKWebsitePolicies.h in Headers */,
 				1F7506B71859165A00EC0FF7 /* WKWebProcessPlugInHitTestResultInternal.h in Headers */,
 				BC989D85161A9890000D46D3 /* WKWebProcessPlugInInternal.h in Headers */,
 				1F335BC0185B84F0001A201A /* WKWebProcessPlugInLoadDelegate.h in Headers */,
@@ -9360,6 +9387,7 @@
 				31EA25D2134F78C0005B1452 /* NativeWebMouseEventMac.mm in Sources */,
 				2DA9449F1884E4F000ED86DB /* NativeWebTouchEventIOS.mm in Sources */,
 				DF58C6361371ACA000F9A37C /* NativeWebWheelEventMac.mm in Sources */,
+				5CB2378B1DF0DE5300117AA3 /* _WKWebsitePolicies.mm in Sources */,
 				1ADCB86A189831B30022EE5A /* NavigationActionData.cpp in Sources */,
 				1ABC3DF51899E437004F0626 /* NavigationState.mm in Sources */,
 				1A6FBA2B11E6862700DB1371 /* NetscapeBrowserFuncs.cpp in Sources */,
@@ -9405,6 +9433,7 @@
 				517CF0E3163A486C00C2950E /* NetworkProcessConnectionMessageReceiver.cpp in Sources */,
 				5C1426EC1C23F80900D41183 /* NetworkProcessCreationParameters.cpp in Sources */,
 				2DA944BD188511E700ED86DB /* NetworkProcessIOS.mm in Sources */,
+				5CB237911DF0E2E600117AA3 /* APIWebsitePolicies.cpp in Sources */,
 				51795567162876CB00FA43B6 /* NetworkProcessMac.mm in Sources */,
 				5163199416289A6000E22F00 /* NetworkProcessMessageReceiver.cpp in Sources */,
 				E14A954916E016A40068DE82 /* NetworkProcessPlatformStrategies.cpp in Sources */,
@@ -9593,6 +9622,7 @@
 				728E86F21795188C0087879E /* WebColorPickerMac.mm in Sources */,
 				7C4ABED01AA8E9F00088AA37 /* WebCompiledContentExtension.cpp in Sources */,
 				7C4ABED41AA8FCB80088AA37 /* WebCompiledContentExtensionData.cpp in Sources */,
+				5C9E56821DF7F1AB00C9EE33 /* WKWebsitePolicies.cpp in Sources */,
 				BC4A628F147312BE006C681A /* WebConnection.cpp in Sources */,
 				BC4A6291147312BE006C681A /* WebConnectionClient.cpp in Sources */,
 				1A1FEC1C1627B45700700F6D /* WebConnectionMessageReceiver.cpp in Sources */,

Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (209557 => 209558)


--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp	2016-12-08 20:52:35 UTC (rev 209558)
@@ -53,6 +53,7 @@
 #include "WebPageProxyMessages.h"
 #include "WebProcess.h"
 #include "WebProcessPoolMessages.h"
+#include "WebsitePolicies.h"
 #include <_javascript_Core/APICast.h>
 #include <_javascript_Core/JSObject.h>
 #include <WebCore/CachedFrame.h>
@@ -807,11 +808,16 @@
     // Notify the UIProcess.
     Ref<WebFrame> protect(*m_frame);
     WebCore::Frame* originatingCoreFrame = originatingFrame ? originatingFrame->coreFrame() : nullptr;
-    if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), documentLoader->navigationID(), navigationActionData, originatingFrame ? originatingFrame->frameID() : 0, SecurityOriginData::fromFrame(originatingCoreFrame), navigationAction.resourceRequest(), request, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(receivedPolicyAction, newNavigationID, policyAction, downloadID))) {
+    WebsitePolicies websitePolicies;
+    if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), documentLoader->navigationID(), navigationActionData, originatingFrame ? originatingFrame->frameID() : 0, SecurityOriginData::fromFrame(originatingCoreFrame), navigationAction.resourceRequest(), request, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(receivedPolicyAction, newNavigationID, policyAction, downloadID, websitePolicies))) {
         m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { });
         return;
     }
 
+    // Only setUserContentExtensionsEnabled if it hasn't already been disabled by reloading without content blockers.
+    if (documentLoader->userContentExtensionsEnabled())
+        documentLoader->setUserContentExtensionsEnabled(websitePolicies.contentBlockersEnabled);
+
     // We call this synchronously because WebCore cannot gracefully handle a frame load without a synchronous navigation policy reply.
     if (receivedPolicyAction)
         m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), newNavigationID, downloadID);

Modified: trunk/Tools/ChangeLog (209557 => 209558)


--- trunk/Tools/ChangeLog	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Tools/ChangeLog	2016-12-08 20:52:35 UTC (rev 209558)
@@ -1,3 +1,19 @@
+2016-12-08  Alex Christensen  <achristen...@webkit.org>
+
+        Add SPI for sending WebsiteSettings to WebProcess during navigation
+        https://bugs.webkit.org/show_bug.cgi?id=165517
+        <rdar://29341068>
+
+        Reviewed by Anders Carlsson.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebKit2/contentBlockerCheck.html: Added.
+        * TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm: Added.
+        (-[WebsitePoliciesDelegate webView:decidePolicyForNavigationAction:decisionHandler:]):
+        (-[WebsitePoliciesDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]):
+        (-[WebsitePoliciesDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
+        (TEST):
+
 2016-12-08  Chris Dumez  <cdu...@apple.com>
 
         Unreviewed, rolling out r209489.

Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (209557 => 209558)


--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2016-12-08 20:23:41 UTC (rev 209557)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2016-12-08 20:52:35 UTC (rev 209558)
@@ -168,6 +168,8 @@
 		5C6E65441D5CEFD400F7862E /* URLParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C6E65411D5CEF8500F7862E /* URLParser.cpp */; };
 		5C726D6F1D3EE06E00C5E1A1 /* InstanceMethodSwizzler.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C726D6E1D3EE06800C5E1A1 /* InstanceMethodSwizzler.mm */; };
 		5C838F7F1DB04F900082858F /* LoadInvalidURLRequest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 57901FAE1CAF137100ED64F9 /* LoadInvalidURLRequest.mm */; };
+		5C9E56851DF9145400C9EE33 /* WebsitePolicies.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C9E56841DF9143D00C9EE33 /* WebsitePolicies.mm */; };
+		5C9E56871DF914AE00C9EE33 /* contentBlockerCheck.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 5C9E56861DF9148E00C9EE33 /* contentBlockerCheck.html */; };
 		5C9E59411D3EB5AC00E3C62E /* ApplicationCache.db in Copy Resources */ = {isa = PBXBuildFile; fileRef = 5C9E593E1D3EB1DE00E3C62E /* ApplicationCache.db */; };
 		5C9E59421D3EB5AC00E3C62E /* ApplicationCache.db-shm in Copy Resources */ = {isa = PBXBuildFile; fileRef = 5C9E593F1D3EB1DE00E3C62E /* ApplicationCache.db-shm */; };
 		5C9E59431D3EB5AC00E3C62E /* ApplicationCache.db-wal in Copy Resources */ = {isa = PBXBuildFile; fileRef = 5C9E59401D3EB1DE00E3C62E /* ApplicationCache.db-wal */; };
@@ -586,6 +588,7 @@
 			dstPath = TestWebKitAPI.resources;
 			dstSubfolderSpec = 7;
 			files = (
+				5C9E56871DF914AE00C9EE33 /* contentBlockerCheck.html in Copy Resources */,
 				07492B3C1DF8B86600633DE1 /* enumerateMediaDevices.html in Copy Resources */,
 				9B270FEE1DDC2C0B002D53F3 /* closed-shadow-tree-test.html in Copy Resources */,
 				F4C2AB221DD6D95E00E06D5B /* enormous-video-with-sound.html in Copy Resources */,
@@ -981,6 +984,8 @@
 		5C6E65411D5CEF8500F7862E /* URLParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = URLParser.cpp; sourceTree = "<group>"; };
 		5C726D6D1D3EE06800C5E1A1 /* InstanceMethodSwizzler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = InstanceMethodSwizzler.h; path = cocoa/InstanceMethodSwizzler.h; sourceTree = "<group>"; };
 		5C726D6E1D3EE06800C5E1A1 /* InstanceMethodSwizzler.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = InstanceMethodSwizzler.mm; path = cocoa/InstanceMethodSwizzler.mm; sourceTree = "<group>"; };
+		5C9E56841DF9143D00C9EE33 /* WebsitePolicies.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebsitePolicies.mm; sourceTree = "<group>"; };
+		5C9E56861DF9148E00C9EE33 /* contentBlockerCheck.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = contentBlockerCheck.html; sourceTree = "<group>"; };
 		5C9E593E1D3EB1DE00E3C62E /* ApplicationCache.db */ = {isa = PBXFileReference; lastKnownFileType = file; path = ApplicationCache.db; sourceTree = "<group>"; };
 		5C9E593F1D3EB1DE00E3C62E /* ApplicationCache.db-shm */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ApplicationCache.db-shm"; sourceTree = "<group>"; };
 		5C9E59401D3EB1DE00E3C62E /* ApplicationCache.db-wal */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ApplicationCache.db-wal"; sourceTree = "<group>"; };
@@ -1477,6 +1482,7 @@
 				7CCB99201D3B41F6003922F6 /* UserInitiatedActionInNavigationAction.mm */,
 				93E943F11CD3E87E00AC08C2 /* VideoControlsManager.mm */,
 				51714EB61CF8C7A4004723C4 /* WebProcessKillIDBCleanup.mm */,
+				5C9E56841DF9143D00C9EE33 /* WebsitePolicies.mm */,
 				1F83571A1D3FFB0E00E3967B /* WKBackForwardList.mm */,
 				375E0E151D66674400EFEC2C /* WKNSNumber.mm */,
 				37B47E2E1D64E7CA005F4EFF /* WKObject.mm */,
@@ -1895,6 +1901,7 @@
 				7C486BA01AA1254B003F6F9B /* bundle-file.html */,
 				1A50AA1F1A2A4EA500F4C345 /* close-from-within-create-page.html */,
 				9B270FED1DDC25FD002D53F3 /* closed-shadow-tree-test.html */,
+				5C9E56861DF9148E00C9EE33 /* contentBlockerCheck.html */,
 				290F4274172A1FDE00939FF0 /* custom-protocol-sync-xhr.html */,
 				C5E1AFFD16B22179006CC1F2 /* execCopy.html */,
 				BC2D004A12A9FEB300E732A3 /* file-with-anchor.html */,
@@ -2451,6 +2458,7 @@
 				7CCE7EEB1A411AE600447C4C /* DocumentStartUserScriptAlertCrash.cpp in Sources */,
 				37A22AA71DCAA27200AFBFC4 /* ObservedRenderingProgressEventsAfterCrash.mm in Sources */,
 				7CCE7EBB1A411A7E00447C4C /* DOMHTMLTableCellCellAbove.mm in Sources */,
+				5C9E56851DF9145400C9EE33 /* WebsitePolicies.mm in Sources */,
 				2D51A0C71C8BF00C00765C45 /* DOMHTMLVideoElementWrapper.mm in Sources */,
 				5C0BF8921DD599B600B00328 /* EarlyKVOCrash.mm in Sources */,
 				7CCE7EBC1A411A7E00447C4C /* DOMNodeFromJSObject.mm in Sources */,

Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2/contentBlockerCheck.html (0 => 209558)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit2/contentBlockerCheck.html	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2/contentBlockerCheck.html	2016-12-08 20:52:35 UTC (rev 209558)
@@ -0,0 +1,13 @@
+<html>
+    <head>
+        <script>
+            function sendMessage() { alert(getComputedStyle(document.querySelector(".hidden")).display == "none" ? "content blockers enabled" :"content blockers disabled"); }
+        </script>
+    </head>
+    <body _onload_="sendMessage()">
+        <p class="hidden">
+            This text exists to determine if content blockers are enabled.
+            If they're enabled, the computed style of this text will be display:none.
+        </p>
+    </body>
+</html>

Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm (0 => 209558)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm	2016-12-08 20:52:35 UTC (rev 209558)
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#import "PlatformUtilities.h"
+#import <WebKit/WKUserContentControllerPrivate.h>
+#import <WebKit/WKWebViewPrivate.h>
+#import <WebKit/_WKUserContentExtensionStorePrivate.h>
+#import <WebKit/_WKWebsitePolicies.h>
+#import <wtf/RetainPtr.h>
+
+#if WK_API_ENABLED
+
+static bool doneCompiling;
+static bool receivedAlert;
+static size_t alertCount;
+
+@interface WebsitePoliciesDelegate : NSObject <WKNavigationDelegate, WKUIDelegate>
+@end
+
+@implementation WebsitePoliciesDelegate
+
+- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
+{
+    // _webView:decidePolicyForNavigationAction:decisionHandler: should be called instead if it is implemented.
+    EXPECT_TRUE(false);
+    decisionHandler(WKNavigationActionPolicyAllow);
+}
+
+- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
+{
+    switch (alertCount++) {
+    case 0:
+        // FIXME: The first content blocker should be enabled here.
+        // ContentExtensionsBackend::addContentExtension isn't being called in the WebProcess
+        // until after the first main resource starts loading, so we need to send a message to the
+        // WebProcess before loading if we have installed content blockers.
+        // See rdar://problem/27788755
+        EXPECT_STREQ("content blockers disabled", message.UTF8String);
+        break;
+    case 1:
+        // Default behavior.
+        EXPECT_STREQ("content blockers enabled", message.UTF8String);
+        break;
+    case 2:
+        // After having set websitePolicies.contentBlockersEnabled to false.
+        EXPECT_STREQ("content blockers disabled", message.UTF8String);
+        break;
+    case 3:
+        // After having reloaded without content blockers.
+        EXPECT_STREQ("content blockers disabled", message.UTF8String);
+        break;
+    default:
+        EXPECT_TRUE(false);
+    }
+    receivedAlert = true;
+    completionHandler();
+}
+
+- (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler
+{
+    _WKWebsitePolicies *websitePolicies = [[[_WKWebsitePolicies alloc] init] autorelease];
+    switch (alertCount) {
+    case 0:
+        // Verify an existing bug the first time a page is loaded in a new WebProcess.
+        break;
+    case 1:
+        // Verify the content blockers behave correctly with the default behavior.
+        break;
+    case 2:
+        // Verify disabling content blockers works correctly.
+        websitePolicies.contentBlockersEnabled = false;
+        break;
+    case 3:
+        // Verify enabling content blockers has no effect when reloading without content blockers.
+        websitePolicies.contentBlockersEnabled = true;
+        break;
+    default:
+        EXPECT_TRUE(false);
+    }
+    decisionHandler(WKNavigationActionPolicyAllow, websitePolicies);
+}
+
+@end
+
+TEST(WebKit2, WebsitePoliciesContentBlockersEnabled)
+{
+    [[_WKUserContentExtensionStore defaultStore] _removeAllContentExtensions];
+
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+
+    doneCompiling = false;
+    NSString* contentBlocker = @"[{\"action\":{\"type\":\"css-display-none\",\"selector\":\".hidden\"},\"trigger\":{\"url-filter\":\".*\"}}]";
+    [[_WKUserContentExtensionStore defaultStore] compileContentExtensionForIdentifier:@"WebsitePoliciesTest" encodedContentExtension:contentBlocker completionHandler:^(_WKUserContentFilter *filter, NSError *error) {
+        EXPECT_TRUE(error == nil);
+        [[configuration userContentController] _addUserContentFilter:filter];
+        doneCompiling = true;
+    }];
+    TestWebKitAPI::Util::run(&doneCompiling);
+
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+
+    auto delegate = adoptNS([[WebsitePoliciesDelegate alloc] init]);
+    [webView setNavigationDelegate:delegate.get()];
+    [webView setUIDelegate:delegate.get()];
+
+    NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"contentBlockerCheck" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
+    alertCount = 0;
+    receivedAlert = false;
+    [webView loadRequest:request];
+    TestWebKitAPI::Util::run(&receivedAlert);
+
+    receivedAlert = false;
+    [webView reload];
+    TestWebKitAPI::Util::run(&receivedAlert);
+
+    receivedAlert = false;
+    [webView reload];
+    TestWebKitAPI::Util::run(&receivedAlert);
+
+    receivedAlert = false;
+    [webView _reloadWithoutContentBlockers];
+    TestWebKitAPI::Util::run(&receivedAlert);
+
+    [[_WKUserContentExtensionStore defaultStore] _removeAllContentExtensions];
+}
+
+#endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to