Title: [116716] trunk
Revision
116716
Author
[email protected]
Date
2012-05-10 18:49:40 -0700 (Thu, 10 May 2012)

Log Message

WebKit2: Add a way to blacklist specific plug-ins/plug-in versions
https://bugs.webkit.org/show_bug.cgi?id=86164
<rdar://problem/9551196>

Reviewed by Sam Weinig.

Source/WebKit2:

* Shared/API/c/WKError.h:
Add kWKErrorCodeInsecurePlugInVersion error code.

* Shared/APIClientTraits.cpp:
Update now that didFailToInitializePlugin is deprecated.

* UIProcess/API/C/WKPage.h:
Deprecate didFailToInitializePlugin and replace it with the more generic pluginDidFail.
Also, deprecate missingPluginButtonClicked and replace it with unavailablePluginButtonClicked.

* UIProcess/Plugins/PluginInfoStore.cpp:
(WebKit::PluginInfoStore::shouldBlockPlugin):
Non-Mac version, always return false.

* UIProcess/Plugins/mac/PluginInfoStoreMac.mm:
(WebKit::PluginInfoStore::shouldBlockPlugin):
Call WKShouldBlockPlugin.

* UIProcess/WebContext.cpp:
(WebKit::WebContext::getPluginPath):
Check if the plug-in should be blocked.

* UIProcess/WebContext.messages.in:
GetPluginPath now takes an additional out parameter, a boolean that determines whether the plug-in
should be blocked from loading or not.

* UIProcess/WebLoaderClient.cpp:
(WebKit::WebLoaderClient::didFailToInitializePlugin):
Call m_client.pluginDidFail.

(WebKit::WebLoaderClient::didBlockInsecurePluginVersion):
Ditto.

* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::unavailablePluginButtonClicked):
Call the loader client.

(WebKit::WebPageProxy::didBlockInsecurePluginVersion):
Ditto.

* UIProcess/WebPageProxy.messages.in:
Rename MissingPluginButtonClicked to UnavailablePluginButtonClicked and add a new DidBlockInsecurePluginVersion message.

* UIProcess/WebUIClient.cpp:
(WebKit::WebUIClient::unavailablePluginButtonClicked):
Call missingPluginButtonClicked and unavailablePluginButtonClicked.

* WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::shouldUnavailablePluginMessageBeButton):
(WebKit::WebChromeClient::unavailablePluginButtonClicked):
Handle RenderEmbeddedObject::InsecurePluginVersion.

* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::createPlugin):
WebPage::createPlugin now takes the plug-in element.

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::createPlugin):
If the plug-in is blocked, set the appropriate unavailability reason.

* WebProcess/WebProcess.cpp:
(WebKit::canPluginHandleResponse):
Update now that GetPluginPath returns a blocked parameter as well.

Tools:

Update for WK2 API changes.

* MiniBrowser/mac/BrowserWindowController.m:
(-[BrowserWindowController awakeFromNib]):
* WebKitTestRunner/TestController.cpp:
(WTR::TestController::createOtherPage):
(WTR::TestController::initialize):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (116715 => 116716)


--- trunk/Source/WebKit2/ChangeLog	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/ChangeLog	2012-05-11 01:49:40 UTC (rev 116716)
@@ -1,5 +1,77 @@
 2012-05-10  Anders Carlsson  <[email protected]>
 
+        WebKit2: Add a way to blacklist specific plug-ins/plug-in versions
+        https://bugs.webkit.org/show_bug.cgi?id=86164
+        <rdar://problem/9551196>
+
+        Reviewed by Sam Weinig.
+
+        * Shared/API/c/WKError.h:
+        Add kWKErrorCodeInsecurePlugInVersion error code.
+
+        * Shared/APIClientTraits.cpp:
+        Update now that didFailToInitializePlugin is deprecated.
+
+        * UIProcess/API/C/WKPage.h:
+        Deprecate didFailToInitializePlugin and replace it with the more generic pluginDidFail. 
+        Also, deprecate missingPluginButtonClicked and replace it with unavailablePluginButtonClicked.
+
+        * UIProcess/Plugins/PluginInfoStore.cpp:
+        (WebKit::PluginInfoStore::shouldBlockPlugin):
+        Non-Mac version, always return false.
+
+        * UIProcess/Plugins/mac/PluginInfoStoreMac.mm:
+        (WebKit::PluginInfoStore::shouldBlockPlugin):
+        Call WKShouldBlockPlugin.
+
+        * UIProcess/WebContext.cpp:
+        (WebKit::WebContext::getPluginPath):
+        Check if the plug-in should be blocked.
+
+        * UIProcess/WebContext.messages.in:
+        GetPluginPath now takes an additional out parameter, a boolean that determines whether the plug-in
+        should be blocked from loading or not.
+
+        * UIProcess/WebLoaderClient.cpp:
+        (WebKit::WebLoaderClient::didFailToInitializePlugin):
+        Call m_client.pluginDidFail.
+
+        (WebKit::WebLoaderClient::didBlockInsecurePluginVersion):
+        Ditto.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::unavailablePluginButtonClicked):
+        Call the loader client.
+
+        (WebKit::WebPageProxy::didBlockInsecurePluginVersion):
+        Ditto.
+
+        * UIProcess/WebPageProxy.messages.in:
+        Rename MissingPluginButtonClicked to UnavailablePluginButtonClicked and add a new DidBlockInsecurePluginVersion message.
+
+        * UIProcess/WebUIClient.cpp:
+        (WebKit::WebUIClient::unavailablePluginButtonClicked):
+        Call missingPluginButtonClicked and unavailablePluginButtonClicked.
+
+        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
+        (WebKit::WebChromeClient::shouldUnavailablePluginMessageBeButton):
+        (WebKit::WebChromeClient::unavailablePluginButtonClicked):
+        Handle RenderEmbeddedObject::InsecurePluginVersion.
+
+        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+        (WebKit::WebFrameLoaderClient::createPlugin):
+        WebPage::createPlugin now takes the plug-in element.
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::createPlugin):
+        If the plug-in is blocked, set the appropriate unavailability reason.
+
+        * WebProcess/WebProcess.cpp:
+        (WebKit::canPluginHandleResponse):
+        Update now that GetPluginPath returns a blocked parameter as well.
+
+2012-05-10  Anders Carlsson  <[email protected]>
+
         Rename the missing plug-in indicator to the unavailable plug-in indicator
         https://bugs.webkit.org/show_bug.cgi?id=86136
 

Modified: trunk/Source/WebKit2/Shared/API/c/WKError.h (116715 => 116716)


--- trunk/Source/WebKit2/Shared/API/c/WKError.h	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/Shared/API/c/WKError.h	2012-05-11 01:49:40 UTC (rev 116716)
@@ -42,6 +42,7 @@
     kWKErrorCodeJavaUnavailable =                                202,
     kWKErrorCodePlugInCancelledConnection =                      203,
     kWKErrorCodePlugInWillHandleLoad =                           204,
+    kWKErrorCodeInsecurePlugInVersion =                          205,
 };
 typedef uint32_t WKErrorCode;
 

Modified: trunk/Source/WebKit2/Shared/APIClientTraits.cpp (116715 => 116716)


--- trunk/Source/WebKit2/Shared/APIClientTraits.cpp	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/Shared/APIClientTraits.cpp	2012-05-11 01:49:40 UTC (rev 116716)
@@ -52,7 +52,7 @@
 };
 
 const size_t APIClientTraits<WKPageLoaderClient>::interfaceSizesByVersion[] = {
-    offsetof(WKPageLoaderClient, didFailToInitializePlugin),
+    offsetof(WKPageLoaderClient, didFailToInitializePlugin_deprecatedForUseWithV0),
     sizeof(WKPageLoaderClient)
 };
 

Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPage.h (116715 => 116716)


--- trunk/Source/WebKit2/UIProcess/API/C/WKPage.h	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPage.h	2012-05-11 01:49:40 UTC (rev 116716)
@@ -27,6 +27,7 @@
 #define WKPage_h
 
 #include <WebKit2/WKBase.h>
+#include <WebKit2/WKError.h>
 #include <WebKit2/WKEvent.h>
 #include <WebKit2/WKFindOptions.h>
 #include <WebKit2/WKGeometry.h>
@@ -69,10 +70,13 @@
 typedef void (*WKPageDidReceiveAuthenticationChallengeInFrameCallback)(WKPageRef page, WKFrameRef frame, WKAuthenticationChallengeRef authenticationChallenge, const void *clientInfo);
 typedef void (*WKPageDidChangeBackForwardListCallback)(WKPageRef page, WKBackForwardListItemRef addedItem, WKArrayRef removedItems, const void *clientInfo);
 typedef bool (*WKPageShouldGoToBackForwardListItemCallback)(WKPageRef page, WKBackForwardListItemRef item, const void *clientInfo);
-typedef void (*WKPageDidFailToInitializePluginCallback)(WKPageRef page, WKStringRef mimeType, const void* clientInfo);
 typedef void (*WKPageDidNewFirstVisuallyNonEmptyLayoutCallback)(WKPageRef page, WKTypeRef userData, const void *clientInfo);
 typedef void (*WKPageWillGoToBackForwardListItemCallback)(WKPageRef page, WKBackForwardListItemRef item, WKTypeRef userData, const void *clientInfo);
+typedef void (*WKPagePluginDidFailCallback)(WKPageRef page, WKErrorCode errorCode, WKStringRef mimeType, const void* clientInfo);
 
+// Deprecated
+typedef void (*WKPageDidFailToInitializePluginCallback_deprecatedForUseWithV0)(WKPageRef page, WKStringRef mimeType, const void* clientInfo);
+
 struct WKPageLoaderClient {
     int                                                                 version;
     const void *                                                        clientInfo;
@@ -104,7 +108,7 @@
     WKPageCallback                                                      processDidCrash;
     WKPageDidChangeBackForwardListCallback                              didChangeBackForwardList;
     WKPageShouldGoToBackForwardListItemCallback                         shouldGoToBackForwardListItem;
-    WKPageDidFailToInitializePluginCallback                             didFailToInitializePlugin;
+    WKPageDidFailToInitializePluginCallback_deprecatedForUseWithV0      didFailToInitializePlugin_deprecatedForUseWithV0;
 
     // Version 1
     WKPageDidDetectXSSForFrameCallback                                  didDetectXSSForFrame;
@@ -115,6 +119,7 @@
     WKPageWillGoToBackForwardListItemCallback                           willGoToBackForwardListItem;
 
     WKPageCallback                                                      interactionOccurredWhileProcessUnresponsive;
+    WKPagePluginDidFailCallback                                         pluginDidFail;
 };
 typedef struct WKPageLoaderClient WKPageLoaderClient;
 
@@ -172,6 +177,13 @@
 
 enum { kWKPageResourceLoadClientCurrentVersion = 0 };
 
+enum {
+    kWKPluginUnavailabilityReasonPluginMissing,
+    kWKPluginUnavailabilityReasonPluginCrashed,
+    kWKPluginUnavailabilityReasonInsecurePluginVersion
+};
+typedef uint32_t WKPluginUnavailabilityReason;
+
 // UI Client
 typedef WKPageRef (*WKPageCreateNewPageCallback)(WKPageRef page, WKURLRequestRef urlRequest, WKDictionaryRef features, WKEventModifiers modifiers, WKEventMouseButton mouseButton, const void *clientInfo);
 typedef void (*WKPageRunJavaScriptAlertCallback)(WKPageRef page, WKStringRef alertText, WKFrameRef frame, const void *clientInfo);
@@ -182,7 +194,6 @@
 typedef void (*WKPageUnfocusCallback)(WKPageRef page, const void *clientInfo);
 typedef void (*WKPageSetStatusTextCallback)(WKPageRef page, WKStringRef text, const void *clientInfo);
 typedef void (*WKPageMouseDidMoveOverElementCallback)(WKPageRef page, WKHitTestResultRef hitTestResult, WKEventModifiers modifiers, WKTypeRef userData, const void *clientInfo);
-typedef void (*WKPageMissingPluginButtonClickedCallback)(WKPageRef page, WKStringRef mimeType, WKStringRef url, WKStringRef pluginsPageURL, const void* clientInfo);
 typedef void (*WKPageDidNotHandleKeyEventCallback)(WKPageRef page, WKNativeEventPtr event, const void *clientInfo);
 typedef void (*WKPageDidNotHandleWheelEventCallback)(WKPageRef page, WKNativeEventPtr event, const void *clientInfo);
 typedef bool (*WKPageGetToolbarsAreVisibleCallback)(WKPageRef page, const void *clientInfo);
@@ -207,10 +218,12 @@
 typedef void (*WKPageSaveDataToFileInDownloadsFolderCallback)(WKPageRef page, WKStringRef suggestedFilename, WKStringRef mimeType, WKURLRef originatingURL, WKDataRef data, const void* clientInfo);
 typedef bool (*WKPageShouldInterruptJavaScriptCallback)(WKPageRef page, const void *clientInfo);
 typedef void (*WKPageDecidePolicyForNotificationPermissionRequestCallback)(WKPageRef page, WKSecurityOriginRef origin, WKNotificationPermissionRequestRef permissionRequest, const void *clientInfo);
+typedef void (*WKPageUnavailablePluginButtonClickedCallback)(WKPageRef page, WKPluginUnavailabilityReason pluginUnavailabilityReason, WKStringRef mimeType, WKStringRef url, WKStringRef pluginsPageURL, const void* clientInfo);
 
 // Deprecated    
 typedef WKPageRef (*WKPageCreateNewPageCallback_deprecatedForUseWithV0)(WKPageRef page, WKDictionaryRef features, WKEventModifiers modifiers, WKEventMouseButton mouseButton, const void *clientInfo);
 typedef void      (*WKPageMouseDidMoveOverElementCallback_deprecatedForUseWithV0)(WKPageRef page, WKEventModifiers modifiers, WKTypeRef userData, const void *clientInfo);
+typedef void (*WKPageMissingPluginButtonClickedCallback_deprecatedForUseWithV0)(WKPageRef page, WKStringRef mimeType, WKStringRef url, WKStringRef pluginsPageURL, const void* clientInfo);
 
 struct WKPageUIClient {
     int                                                                 version;
@@ -228,7 +241,7 @@
     WKPageRunJavaScriptPromptCallback                                   runJavaScriptPrompt;
     WKPageSetStatusTextCallback                                         setStatusText;
     WKPageMouseDidMoveOverElementCallback_deprecatedForUseWithV0        mouseDidMoveOverElement_deprecatedForUseWithV0;
-    WKPageMissingPluginButtonClickedCallback                            missingPluginButtonClicked;
+    WKPageMissingPluginButtonClickedCallback_deprecatedForUseWithV0     missingPluginButtonClicked_deprecatedForUseWithV0;
     WKPageDidNotHandleKeyEventCallback                                  didNotHandleKeyEvent;
     WKPageDidNotHandleWheelEventCallback                                didNotHandleWheelEvent;
     WKPageGetToolbarsAreVisibleCallback                                 toolbarsAreVisible;
@@ -261,6 +274,7 @@
     WKPageCreateNewPageCallback                                         createNewPage;
     WKPageMouseDidMoveOverElementCallback                               mouseDidMoveOverElement;
     WKPageDecidePolicyForNotificationPermissionRequestCallback          decidePolicyForNotificationPermissionRequest;
+    WKPageUnavailablePluginButtonClickedCallback                        unavailablePluginButtonClicked;
 };
 typedef struct WKPageUIClient WKPageUIClient;
 

Modified: trunk/Source/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp (116715 => 116716)


--- trunk/Source/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp	2012-05-11 01:49:40 UTC (rev 116716)
@@ -174,6 +174,11 @@
 }
 
 #if !PLATFORM(MAC)
+bool PluginInfoStore::shouldBlockPlugin(const PluginModuleInfo&) const
+{
+    return false;
+}
+
 String PluginInfoStore::getMIMETypeForExtension(const String& extension)
 {
     return MIMETypeRegistry::getMIMETypeForExtension(extension);

Modified: trunk/Source/WebKit2/UIProcess/Plugins/PluginInfoStore.h (116715 => 116716)


--- trunk/Source/WebKit2/UIProcess/Plugins/PluginInfoStore.h	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/UIProcess/Plugins/PluginInfoStore.h	2012-05-11 01:49:40 UTC (rev 116716)
@@ -53,8 +53,11 @@
     // Returns the info for the plug-in with the given path.
     PluginModuleInfo infoForPluginWithPath(const String& pluginPath) const;
 
+    // Return whether this plug-in should be blocked from being instantiated.
+    // Note that the plug-in will still be seen by e.g. navigator.plugins
+    bool shouldBlockPlugin(const PluginModuleInfo&) const;
+
 private:
-
     PluginModuleInfo findPluginForMIMEType(const String& mimeType) const;
     PluginModuleInfo findPluginForExtension(const String& extension, String& mimeType) const;
 

Modified: trunk/Source/WebKit2/UIProcess/Plugins/mac/PluginInfoStoreMac.mm (116715 => 116716)


--- trunk/Source/WebKit2/UIProcess/Plugins/mac/PluginInfoStoreMac.mm	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/UIProcess/Plugins/mac/PluginInfoStoreMac.mm	2012-05-11 01:49:40 UTC (rev 116716)
@@ -89,6 +89,11 @@
     return true;
 }
 
+bool PluginInfoStore::shouldBlockPlugin(const PluginModuleInfo& plugin) const
+{
+    return WKShouldBlockPlugin(plugin.bundleIdentifier, plugin.versionString);
+}
+
 String PluginInfoStore::getMIMETypeForExtension(const String& extension)
 {
     // FIXME: This should just call MIMETypeRegistry::getMIMETypeForExtension and be

Modified: trunk/Source/WebKit2/UIProcess/WebContext.cpp (116715 => 116716)


--- trunk/Source/WebKit2/UIProcess/WebContext.cpp	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/UIProcess/WebContext.cpp	2012-05-11 01:49:40 UTC (rev 116716)
@@ -620,7 +620,7 @@
 #endif
 }
 
-void WebContext::getPluginPath(const String& mimeType, const String& urlString, String& pluginPath)
+void WebContext::getPluginPath(const String& mimeType, const String& urlString, String& pluginPath, bool& blocked)
 {
     MESSAGE_CHECK_URL(urlString);
 
@@ -630,6 +630,12 @@
     if (!plugin.path)
         return;
 
+    blocked = false;
+    if (pluginInfoStore().shouldBlockPlugin(plugin)) {
+        blocked = true;
+        return;
+    }
+
     pluginPath = plugin.path;
 }
 

Modified: trunk/Source/WebKit2/UIProcess/WebContext.h (116715 => 116716)


--- trunk/Source/WebKit2/UIProcess/WebContext.h	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/UIProcess/WebContext.h	2012-05-11 01:49:40 UTC (rev 116716)
@@ -217,7 +217,7 @@
 
     // Plugins
     void getPlugins(bool refresh, Vector<WebCore::PluginInfo>&);
-    void getPluginPath(const String& mimeType, const String& urlString, String& pluginPath);
+    void getPluginPath(const String& mimeType, const String& urlString, String& pluginPath, bool& blocked);
 #if !ENABLE(PLUGIN_PROCESS)
     void didGetSitesWithPluginData(const Vector<String>& sites, uint64_t callbackID);
     void didClearPluginSiteData(uint64_t callbackID);

Modified: trunk/Source/WebKit2/UIProcess/WebContext.messages.in (116715 => 116716)


--- trunk/Source/WebKit2/UIProcess/WebContext.messages.in	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/UIProcess/WebContext.messages.in	2012-05-11 01:49:40 UTC (rev 116716)
@@ -33,7 +33,7 @@
     
     # Plugin messages.
     GetPlugins(bool refresh) -> (Vector<WebCore::PluginInfo> plugins)
-    GetPluginPath(WTF::String mimeType, WTF::String urlString) -> (WTF::String pluginPath)
+    GetPluginPath(WTF::String mimeType, WTF::String urlString) -> (WTF::String pluginPath, bool blocked)
 
 #if !ENABLE(PLUGIN_PROCESS)
     void DidGetSitesWithPluginData(Vector<WTF::String> sites, uint64_t callbackID)

Modified: trunk/Source/WebKit2/UIProcess/WebLoaderClient.cpp (116715 => 116716)


--- trunk/Source/WebKit2/UIProcess/WebLoaderClient.cpp	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/UIProcess/WebLoaderClient.cpp	2012-05-11 01:49:40 UTC (rev 116716)
@@ -266,10 +266,21 @@
 
 void WebLoaderClient::didFailToInitializePlugin(WebPageProxy* page, const String& mimeType)
 {
-    if (!m_client.didFailToInitializePlugin)
+    if (m_client.didFailToInitializePlugin_deprecatedForUseWithV0)
+        m_client.didFailToInitializePlugin_deprecatedForUseWithV0(toAPI(page), toAPI(mimeType.impl()), m_client.clientInfo);
+
+    if (!m_client.pluginDidFail)
         return;
 
-    m_client.didFailToInitializePlugin(toAPI(page), toAPI(mimeType.impl()), m_client.clientInfo);
+    m_client.pluginDidFail(toAPI(page), kWKErrorCodeCannotLoadPlugIn, toAPI(mimeType.impl()), m_client.clientInfo);
 }
 
+void WebLoaderClient::didBlockInsecurePluginVersion(WebPageProxy* page, const String& mimeType)
+{
+    if (!m_client.pluginDidFail)
+        return;
+
+    m_client.pluginDidFail(toAPI(page), kWKErrorCodeInsecurePlugInVersion, toAPI(mimeType.impl()), m_client.clientInfo);
+}
+
 } // namespace WebKit

Modified: trunk/Source/WebKit2/UIProcess/WebLoaderClient.h (116715 => 116716)


--- trunk/Source/WebKit2/UIProcess/WebLoaderClient.h	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/UIProcess/WebLoaderClient.h	2012-05-11 01:49:40 UTC (rev 116716)
@@ -87,6 +87,7 @@
     void willGoToBackForwardListItem(WebPageProxy*, WebBackForwardListItem*, APIObject*);
 
     void didFailToInitializePlugin(WebPageProxy*, const String& mimeType);
+    void didBlockInsecurePluginVersion(WebPageProxy*, const String& mimeType);
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (116715 => 116716)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2012-05-11 01:49:40 UTC (rev 116716)
@@ -2399,12 +2399,13 @@
     m_uiClient.mouseDidMoveOverElement(this, hitTestResultData, modifiers, userData.get());
 }
 
-void WebPageProxy::missingPluginButtonClicked(const String& mimeType, const String& url, const String& pluginsPageURL)
+void WebPageProxy::unavailablePluginButtonClicked(uint32_t opaquePluginUnavailabilityReason, const String& mimeType, const String& url, const String& pluginsPageURL)
 {
     MESSAGE_CHECK_URL(url);
     MESSAGE_CHECK_URL(pluginsPageURL);
 
-    m_uiClient.missingPluginButtonClicked(this, mimeType, url, pluginsPageURL);
+    WKPluginUnavailabilityReason pluginUnavailabilityReason = static_cast<WKPluginUnavailabilityReason>(opaquePluginUnavailabilityReason);
+    m_uiClient.unavailablePluginButtonClicked(this, pluginUnavailabilityReason, mimeType, url, pluginsPageURL);
 }
 
 void WebPageProxy::setToolbarsAreVisible(bool toolbarsAreVisible)
@@ -3620,6 +3621,11 @@
     m_loaderClient.didFailToInitializePlugin(this, mimeType);
 }
 
+void WebPageProxy::didBlockInsecurePluginVersion(const String& mimeType)
+{
+    m_loaderClient.didBlockInsecurePluginVersion(this, mimeType);
+}
+
 bool WebPageProxy::willHandleHorizontalScrollEvents() const
 {
     return !m_canShortCircuitHorizontalWheelEvents;

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (116715 => 116716)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2012-05-11 01:49:40 UTC (rev 116716)
@@ -718,7 +718,7 @@
     void shouldInterruptJavaScript(bool& result);
     void setStatusText(const String&);
     void mouseDidMoveOverElement(const WebHitTestResult::Data& hitTestResultData, uint32_t modifiers, CoreIPC::ArgumentDecoder*);
-    void missingPluginButtonClicked(const String& mimeType, const String& url, const String& pluginsPageURL);
+    void unavailablePluginButtonClicked(uint32_t opaquePluginUnavailabilityReason, const String& mimeType, const String& url, const String& pluginsPageURL);
     void setToolbarsAreVisible(bool toolbarsAreVisible);
     void getToolbarsAreVisible(bool& toolbarsAreVisible);
     void setMenuBarIsVisible(bool menuBarIsVisible);
@@ -745,6 +745,7 @@
     void didChangeScrollOffsetPinningForMainFrame(bool pinnedToLeftSide, bool pinnedToRightSide);
     void didChangePageCount(unsigned);
     void didFailToInitializePlugin(const String& mimeType);
+    void didBlockInsecurePluginVersion(const String& mimeType);
     void setCanShortCircuitHorizontalWheelEvents(bool canShortCircuitHorizontalWheelEvents) { m_canShortCircuitHorizontalWheelEvents = canShortCircuitHorizontalWheelEvents; }
 
     void reattachToWebProcess();

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in (116715 => 116716)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in	2012-05-11 01:49:40 UTC (rev 116716)
@@ -30,7 +30,7 @@
     RunJavaScriptPrompt(uint64_t frameID, WTF::String message, WTF::String defaultValue) -> (WTF::String result)
     ShouldInterruptJavaScript() -> (bool shouldInterupt)
     MouseDidMoveOverElement(WebKit::WebHitTestResult::Data hitTestResultData, uint32_t modifiers, WebKit::InjectedBundleUserMessageEncoder userData);
-    MissingPluginButtonClicked(WTF::String mimeType, WTF::String url, WTF::String pluginsPageURL)
+    UnavailablePluginButtonClicked(uint32_t pluginUnavailabilityReason, WTF::String mimeType, WTF::String url, WTF::String pluginsPageURL)
     DidChangeViewportProperties(WebCore::ViewportAttributes attributes)
     DidReceiveEvent(uint32_t type, bool handled)
     StopResponsivenessTimer()
@@ -66,6 +66,7 @@
     DidChangeScrollOffsetPinningForMainFrame(bool hasHorizontalScrollbar, bool hasVerticalScrollbar)
     DidChangePageCount(unsigned pageCount);
     DidFailToInitializePlugin(WTF::String mimeType)
+    DidBlockInsecurePluginVersion(WTF::String mimeType)
     SetCanShortCircuitHorizontalWheelEvents(bool canShortCircuitHorizontalWheelEvents)
 
 #if USE(TILED_BACKING_STORE)

Modified: trunk/Source/WebKit2/UIProcess/WebUIClient.cpp (116715 => 116716)


--- trunk/Source/WebKit2/UIProcess/WebUIClient.cpp	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/UIProcess/WebUIClient.cpp	2012-05-11 01:49:40 UTC (rev 116716)
@@ -174,12 +174,18 @@
     m_client.mouseDidMoveOverElement(toAPI(page), toAPI(webHitTestResult.get()), toAPI(modifiers), toAPI(userData), m_client.clientInfo);
 }
 
-void WebUIClient::missingPluginButtonClicked(WebPageProxy* page, const String& mimeType, const String& url, const String& pluginsPageURL)
+void WebUIClient::unavailablePluginButtonClicked(WebPageProxy* page, WKPluginUnavailabilityReason pluginUnavailabilityReason, const String& mimeType, const String& url, const String& pluginsPageURL)
 {
-    if (!m_client.missingPluginButtonClicked)
+    if (pluginUnavailabilityReason == kWKPluginUnavailabilityReasonPluginMissing) {
+        if (m_client.missingPluginButtonClicked_deprecatedForUseWithV0)
+            m_client.missingPluginButtonClicked_deprecatedForUseWithV0(toAPI(page), toAPI(mimeType.impl()), toAPI(url.impl()), toAPI(pluginsPageURL.impl()), m_client.clientInfo);
+    }
+
+    if (!m_client.unavailablePluginButtonClicked)
         return;
 
-    m_client.missingPluginButtonClicked(toAPI(page), toAPI(mimeType.impl()), toAPI(url.impl()), toAPI(pluginsPageURL.impl()), m_client.clientInfo);
+    m_client.unavailablePluginButtonClicked(toAPI(page), pluginUnavailabilityReason, toAPI(mimeType.impl()), toAPI(url.impl()), toAPI(pluginsPageURL.impl()), m_client.clientInfo);
+
 }
 
 bool WebUIClient::implementsDidNotHandleKeyEvent() const

Modified: trunk/Source/WebKit2/UIProcess/WebUIClient.h (116715 => 116716)


--- trunk/Source/WebKit2/UIProcess/WebUIClient.h	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/UIProcess/WebUIClient.h	2012-05-11 01:49:40 UTC (rev 116716)
@@ -70,7 +70,7 @@
 
     void setStatusText(WebPageProxy*, const String&);
     void mouseDidMoveOverElement(WebPageProxy*, const WebHitTestResult::Data&, WebEvent::Modifiers, APIObject*);
-    void missingPluginButtonClicked(WebPageProxy*, const String& mimeType, const String& url, const String& pluginsPageURL);
+    void unavailablePluginButtonClicked(WebPageProxy*, WKPluginUnavailabilityReason, const String& mimeType, const String& url, const String& pluginsPageURL);
     
     bool implementsDidNotHandleKeyEvent() const;
     void didNotHandleKeyEvent(WebPageProxy*, const NativeWebKeyboardEvent&);

Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp (116715 => 116716)


--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp	2012-05-11 01:49:40 UTC (rev 116716)
@@ -470,7 +470,7 @@
 
 bool WebChromeClient::shouldUnavailablePluginMessageBeButton(RenderEmbeddedObject::PluginUnavailabilityReason pluginUnavailabilityReason) const
 {
-    if (pluginUnavailabilityReason == RenderEmbeddedObject::PluginMissing) {
+    if (pluginUnavailabilityReason == RenderEmbeddedObject::PluginMissing || pluginUnavailabilityReason == RenderEmbeddedObject::InsecurePluginVersion) {
         // FIXME: <rdar://problem/8794397> We should only return true when there is a
         // missingPluginButtonClicked callback defined on the Page UI client.
         return true;
@@ -482,12 +482,11 @@
 void WebChromeClient::unavailablePluginButtonClicked(Element* element, RenderEmbeddedObject::PluginUnavailabilityReason pluginUnavailabilityReason) const
 {
     ASSERT(element->hasTagName(objectTag) || element->hasTagName(embedTag));
-    ASSERT(pluginUnavailabilityReason == RenderEmbeddedObject::PluginMissing);
+    ASSERT(pluginUnavailabilityReason == RenderEmbeddedObject::PluginMissing || pluginUnavailabilityReason == RenderEmbeddedObject::InsecurePluginVersion);
 
     HTMLPlugInImageElement* pluginElement = static_cast<HTMLPlugInImageElement*>(element);
 
-    if (pluginUnavailabilityReason == RenderEmbeddedObject::PluginMissing)
-        m_page->send(Messages::WebPageProxy::MissingPluginButtonClicked(pluginElement->serviceType(), pluginElement->url(), pluginElement->getAttribute(pluginspageAttr)));
+    m_page->send(Messages::WebPageProxy::UnavailablePluginButtonClicked(pluginUnavailabilityReason, pluginElement->serviceType(), pluginElement->url(), pluginElement->getAttribute(pluginspageAttr)));
 }
 
 void WebChromeClient::scrollbarsModeDidChange() const

Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (116715 => 116716)


--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp	2012-05-11 01:49:40 UTC (rev 116716)
@@ -1317,7 +1317,7 @@
     }
 #endif
 
-    RefPtr<Plugin> plugin = webPage->createPlugin(m_frame, parameters);
+    RefPtr<Plugin> plugin = webPage->createPlugin(m_frame, pluginElement, parameters);
     if (!plugin)
         return 0;
     

Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (116715 => 116716)


--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2012-05-11 01:49:40 UTC (rev 116716)
@@ -91,6 +91,7 @@
 #include <WebCore/FrameView.h>
 #include <WebCore/HTMLFormElement.h>
 #include <WebCore/HTMLInputElement.h>
+#include <WebCore/HTMLPlugInElement.h>
 #include <WebCore/HistoryItem.h>
 #include <WebCore/KeyboardEvent.h>
 #include <WebCore/MouseEvent.h>
@@ -385,16 +386,25 @@
 }
 #endif
 
-PassRefPtr<Plugin> WebPage::createPlugin(WebFrame* frame, const Plugin::Parameters& parameters)
+PassRefPtr<Plugin> WebPage::createPlugin(WebFrame* frame, HTMLPlugInElement* pluginElement, const Plugin::Parameters& parameters)
 {
     String pluginPath;
+    bool blocked;
 
     if (!WebProcess::shared().connection()->sendSync(
             Messages::WebContext::GetPluginPath(parameters.mimeType, parameters.url.string()), 
-            Messages::WebContext::GetPluginPath::Reply(pluginPath), 0)) {
+            Messages::WebContext::GetPluginPath::Reply(pluginPath, blocked), 0)) {
         return 0;
     }
 
+    if (blocked) {
+        if (pluginElement->renderer()->isEmbeddedObject())
+            toRenderEmbeddedObject(pluginElement->renderer())->setPluginUnavailabilityReason(RenderEmbeddedObject::InsecurePluginVersion);
+
+        send(Messages::WebPageProxy::DidBlockInsecurePluginVersion(parameters.mimeType));
+        return 0;
+    }
+
     if (pluginPath.isNull()) {
 #if PLATFORM(MAC)
         if (parameters.mimeType == "application/pdf"

Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (116715 => 116716)


--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h	2012-05-11 01:49:40 UTC (rev 116716)
@@ -103,6 +103,7 @@
     class GraphicsContext;
     class Frame;
     class FrameView;
+    class HTMLPlugInElement;
     class KeyboardEvent;
     class Page;
     class PrintContext;
@@ -256,7 +257,7 @@
     WebCore::Frame* mainFrame() const; // May return 0.
     WebCore::FrameView* mainFrameView() const; // May return 0.
 
-    PassRefPtr<Plugin> createPlugin(WebFrame*, const Plugin::Parameters&);
+    PassRefPtr<Plugin> createPlugin(WebFrame*, WebCore::HTMLPlugInElement*, const Plugin::Parameters&);
 
     EditorState editorState() const;
 

Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (116715 => 116716)


--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp	2012-05-11 01:49:40 UTC (rev 116716)
@@ -764,11 +764,12 @@
 static bool canPluginHandleResponse(const ResourceResponse& response)
 {
     String pluginPath;
+    bool blocked;
 
-    if (!WebProcess::shared().connection()->sendSync(Messages::WebContext::GetPluginPath(response.mimeType(), response.url().string()), Messages::WebContext::GetPluginPath::Reply(pluginPath), 0))
+    if (!WebProcess::shared().connection()->sendSync(Messages::WebContext::GetPluginPath(response.mimeType(), response.url().string()), Messages::WebContext::GetPluginPath::Reply(pluginPath, blocked), 0))
         return false;
 
-    return !pluginPath.isEmpty();
+    return !blocked && !pluginPath.isEmpty();
 }
 
 bool WebProcess::shouldUseCustomRepresentationForResponse(const ResourceResponse& response) const

Modified: trunk/Tools/ChangeLog (116715 => 116716)


--- trunk/Tools/ChangeLog	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Tools/ChangeLog	2012-05-11 01:49:40 UTC (rev 116716)
@@ -1,3 +1,19 @@
+2012-05-10  Anders Carlsson  <[email protected]>
+
+        WebKit2: Add a way to blacklist specific plug-ins/plug-in versions
+        https://bugs.webkit.org/show_bug.cgi?id=86164
+        <rdar://problem/9551196>
+
+        Reviewed by Sam Weinig.
+
+        Update for WK2 API changes.
+
+        * MiniBrowser/mac/BrowserWindowController.m:
+        (-[BrowserWindowController awakeFromNib]):
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::createOtherPage):
+        (WTR::TestController::initialize):
+
 2012-05-10  Dirk Pranke  <[email protected]>
 
         nrwt: [chromium] fix path to asan symbolize script

Modified: trunk/Tools/MiniBrowser/mac/BrowserWindowController.m (116715 => 116716)


--- trunk/Tools/MiniBrowser/mac/BrowserWindowController.m	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Tools/MiniBrowser/mac/BrowserWindowController.m	2012-05-11 01:49:40 UTC (rev 116716)
@@ -611,6 +611,7 @@
         0, // didNewFirstVisuallyNonEmptyLayout
         0, // willGoToBackForwardListItem
         0, // interactionOccurredWhileProcessUnresponsive
+        0, // pluginDidFail
     };
     WKPageSetPageLoaderClient(_webView.pageRef, &loadClient);
     
@@ -669,6 +670,7 @@
         createNewPage,
         mouseDidMoveOverElement,
         0, // decidePolicyForNotificationPermissionRequest
+        0, // unavailablePluginButtonClicked
     };
     WKPageSetPageUIClient(_webView.pageRef, &uiClient);
 }

Modified: trunk/Tools/WebKitTestRunner/TestController.cpp (116715 => 116716)


--- trunk/Tools/WebKitTestRunner/TestController.cpp	2012-05-11 01:45:47 UTC (rev 116715)
+++ trunk/Tools/WebKitTestRunner/TestController.cpp	2012-05-11 01:49:40 UTC (rev 116716)
@@ -212,6 +212,7 @@
         createOtherPage,
         0, // mouseDidMoveOverElement
         0, // decidePolicyForNotificationPermissionRequest
+        0, // unavailablePluginButtonClicked
     };
     WKPageSetPageUIClient(newPage, &otherPageUIClient);
 
@@ -371,6 +372,7 @@
         createOtherPage,
         0, // mouseDidMoveOverElement
         0, // decidePolicyForNotificationPermissionRequest
+        0, // unavailablePluginButtonClicked
     };
     WKPageSetPageUIClient(m_mainWebView->page(), &pageUIClient);
 
@@ -406,6 +408,7 @@
         0, // didNewFirstVisuallyNonEmptyLayout
         0, // willGoToBackForwardListItem
         0, // interactionOccurredWhileProcessUnresponsive
+        0, // pluginDidFail
     };
     WKPageSetPageLoaderClient(m_mainWebView->page(), &pageLoaderClient);
 }
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to