Title: [162629] trunk
Revision
162629
Author
timothy_hor...@apple.com
Date
2014-01-23 11:31:18 -0800 (Thu, 23 Jan 2014)

Log Message

PDFPlugin: Use PDFPlugin even if there's an external plugin installed, if it's blocked
https://bugs.webkit.org/show_bug.cgi?id=127415
<rdar://problem/12482452>

Reviewed by Sam Weinig.

Allow use of PDFPlugin even if an external plugin is installed but blocked.
If an external plugin is installed and not blocked, we will continue to use that.

Inject a context menu item into the PDFPlugin context menu that allows the client
to unblock the plugin and reload the page (via the same mechanism that the
unavailable plugin button uses).

* UIProcess/API/C/WKPageLoaderClient.h:
* UIProcess/API/Cocoa/WKBrowsingContextController.mm:
(setUpPageLoaderClient):
* UIProcess/WebLoaderClient.cpp:
(WebKit::WebLoaderClient::pluginLoadPolicy):
* UIProcess/WebLoaderClient.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::findPlugin):
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:
Add a new PluginLoadPolicy callback for the V4 client with
yet another string out-argument, to allow clients to customize the string
that will appear in the PDFPlugin context menu when it is used in place
of a blocked plugin.

* WebProcess/Plugins/PDF/PDFPlugin.h:
Add setUsedInPlaceOfBlockedPlugin(), which determines whether or not
we should include an item in the PDFPlugin context menu that acts identically
to the unavailable plugin button, allowing the client to potentially unblock
the plugin.

* WebProcess/Plugins/PDF/PDFPlugin.mm:
(-[WKPDFPluginContextMenuTarget initWithPDFPlugin:WebKit::]):
(-[WKPDFPluginContextMenuTarget useBlockedPlugin:]):
Added WKPDFPluginContextMenuTarget, which is the Objective-C object that the
aforementioned context menu item targets.

(WebKit::PDFPlugin::PDFPlugin):
By default, we won't show the extra context menu item.

(WebKit::PDFPlugin::handleContextMenuEvent):
If we were used in place of a blocked plugin, inject our additional context
menu item into the menu. If we were handed a custom string via setUsedInPlaceOfBlockedPlugin,
use that. Otherwise, use the generic string from WebCore's localized strings.

(WebKit::PDFPlugin::openWithPlugin):
Pretend that the user clicked the unavailable plugin button when they click
the injected context menu item.

(WebKit::PDFPlugin::setUsedInPlaceOfBlockedPlugin):

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::createPlugin):
If we end up with a blocked plugin, but could have used PDFPlugin to display
the content, do so instead of showing the unavailable plugin indicator.

Pass PDFPlugin the custom context menu item title acquired from the client.

(WebKit::WebPage::canPluginHandleResponse):

* English.lproj/Localizable.strings:
* WebCore.exp.in:
* platform/LocalizedStrings.cpp:
(WebCore::useBlockedPlugInContextMenuTitle):
* platform/LocalizedStrings.h:
Add a localizable string for the generic case, where the client
didn't provide a more specific string for the context menu item.

Adopt the new page loader client plugin load callback.

* WebKitTestRunner/TestController.cpp:
(WTR::TestController::createWebViewWithOptions):
(WTR::TestController::pluginLoadPolicy):
* WebKitTestRunner/TestController.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (162628 => 162629)


--- trunk/Source/WebCore/ChangeLog	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Source/WebCore/ChangeLog	2014-01-23 19:31:18 UTC (rev 162629)
@@ -1,3 +1,19 @@
+2014-01-23  Tim Horton  <timothy_hor...@apple.com>
+
+        PDFPlugin: Use PDFPlugin even if there's an external plugin installed, if it's blocked
+        https://bugs.webkit.org/show_bug.cgi?id=127415
+        <rdar://problem/12482452>
+
+        Reviewed by Sam Weinig.
+
+        * English.lproj/Localizable.strings:
+        * WebCore.exp.in:
+        * platform/LocalizedStrings.cpp:
+        (WebCore::useBlockedPlugInContextMenuTitle):
+        * platform/LocalizedStrings.h:
+        Add a localizable string for the generic case, where the client
+        didn't provide a more specific string for the context menu item.
+
 2014-01-23  pe...@outlook.com  <pe...@outlook.com>
 
         [Curl] There is no way to specify cache folder.

Modified: trunk/Source/WebCore/English.lproj/Localizable.strings (162628 => 162629)


--- trunk/Source/WebCore/English.lproj/Localizable.strings	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Source/WebCore/English.lproj/Localizable.strings	2014-01-23 19:31:18 UTC (rev 162629)
@@ -985,3 +985,5 @@
 /* accessibility label for video element controller */
 "video playback" = "video playback";
 
+/* title of the context menu item to show when PDFPlugin was used instead of a blocked plugin */
+"Show in blocked plug-in" = "Show in blocked plug-in";

Modified: trunk/Source/WebCore/WebCore.exp.in (162628 => 162629)


--- trunk/Source/WebCore/WebCore.exp.in	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Source/WebCore/WebCore.exp.in	2014-01-23 19:31:18 UTC (rev 162629)
@@ -2078,6 +2078,7 @@
 __ZN7WebCore32applicationIsAOLInstantMessengerEv
 __ZN7WebCore32contextMenuItemTagInspectElementEv
 __ZN7WebCore32contextMenuItemTagSmartCopyPasteEv
+__ZN7WebCore32useBlockedPlugInContextMenuTitleEv
 __ZN7WebCore33contextMenuItemTagTextReplacementEv
 __ZN7WebCore33postScriptDocumentTypeDescriptionEv
 __ZN7WebCore33setDefaultThreadViolationBehaviorENS_23ThreadViolationBehaviorENS_20ThreadViolationRoundE

Modified: trunk/Source/WebCore/platform/LocalizedStrings.cpp (162628 => 162629)


--- trunk/Source/WebCore/platform/LocalizedStrings.cpp	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Source/WebCore/platform/LocalizedStrings.cpp	2014-01-23 19:31:18 UTC (rev 162629)
@@ -1113,4 +1113,9 @@
     return WEB_UI_STRING("Click to restart", "Subtitle of the label to show on a snapshotted plug-in");
 }
 
+String useBlockedPlugInContextMenuTitle()
+{
+    return formatLocalizedString(WEB_UI_STRING("Show in blocked plug-in", "Title of the context menu item to show when PDFPlugin was used instead of a blocked plugin"));
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/LocalizedStrings.h (162628 => 162629)


--- trunk/Source/WebCore/platform/LocalizedStrings.h	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Source/WebCore/platform/LocalizedStrings.h	2014-01-23 19:31:18 UTC (rev 162629)
@@ -261,6 +261,8 @@
     String snapshottedPlugInLabelTitle();
     String snapshottedPlugInLabelSubtitle();
 
+    String useBlockedPlugInContextMenuTitle();
+
 #define WEB_UI_STRING(string, description) WebCore::localizedString(string)
 #define WEB_UI_STRING_KEY(string, key, description) WebCore::localizedString(key)
 

Modified: trunk/Source/WebKit2/ChangeLog (162628 => 162629)


--- trunk/Source/WebKit2/ChangeLog	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Source/WebKit2/ChangeLog	2014-01-23 19:31:18 UTC (rev 162629)
@@ -1,5 +1,70 @@
 2014-01-23  Tim Horton  <timothy_hor...@apple.com>
 
+        PDFPlugin: Use PDFPlugin even if there's an external plugin installed, if it's blocked
+        https://bugs.webkit.org/show_bug.cgi?id=127415
+        <rdar://problem/12482452>
+
+        Reviewed by Sam Weinig.
+
+        Allow use of PDFPlugin even if an external plugin is installed but blocked.
+        If an external plugin is installed and not blocked, we will continue to use that.
+
+        Inject a context menu item into the PDFPlugin context menu that allows the client
+        to unblock the plugin and reload the page (via the same mechanism that the
+        unavailable plugin button uses).
+
+        * UIProcess/API/C/WKPageLoaderClient.h:
+        * UIProcess/API/Cocoa/WKBrowsingContextController.mm:
+        (setUpPageLoaderClient):
+        * UIProcess/WebLoaderClient.cpp:
+        (WebKit::WebLoaderClient::pluginLoadPolicy):
+        * UIProcess/WebLoaderClient.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::findPlugin):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+        Add a new PluginLoadPolicy callback for the V4 client with
+        yet another string out-argument, to allow clients to customize the string
+        that will appear in the PDFPlugin context menu when it is used in place
+        of a blocked plugin.
+
+        * WebProcess/Plugins/PDF/PDFPlugin.h:
+        Add setUsedInPlaceOfBlockedPlugin(), which determines whether or not
+        we should include an item in the PDFPlugin context menu that acts identically
+        to the unavailable plugin button, allowing the client to potentially unblock
+        the plugin.
+
+        * WebProcess/Plugins/PDF/PDFPlugin.mm:
+        (-[WKPDFPluginContextMenuTarget initWithPDFPlugin:WebKit::]):
+        (-[WKPDFPluginContextMenuTarget useBlockedPlugin:]):
+        Added WKPDFPluginContextMenuTarget, which is the Objective-C object that the
+        aforementioned context menu item targets.
+
+        (WebKit::PDFPlugin::PDFPlugin):
+        By default, we won't show the extra context menu item.
+
+        (WebKit::PDFPlugin::handleContextMenuEvent):
+        If we were used in place of a blocked plugin, inject our additional context
+        menu item into the menu. If we were handed a custom string via setUsedInPlaceOfBlockedPlugin,
+        use that. Otherwise, use the generic string from WebCore's localized strings.
+
+        (WebKit::PDFPlugin::openWithPlugin):
+        Pretend that the user clicked the unavailable plugin button when they click
+        the injected context menu item.
+
+        (WebKit::PDFPlugin::setUsedInPlaceOfBlockedPlugin):
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::createPlugin):
+        If we end up with a blocked plugin, but could have used PDFPlugin to display
+        the content, do so instead of showing the unavailable plugin indicator.
+
+        Pass PDFPlugin the custom context menu item title acquired from the client.
+
+        (WebKit::WebPage::canPluginHandleResponse):
+
+2014-01-23  Tim Horton  <timothy_hor...@apple.com>
+
         [iOS] [WK2] WKContentView has a black background
         https://bugs.webkit.org/show_bug.cgi?id=127471
         <rdar://problem/12287363>

Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPageLoaderClient.h (162628 => 162629)


--- trunk/Source/WebKit2/UIProcess/API/C/WKPageLoaderClient.h	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPageLoaderClient.h	2014-01-23 19:31:18 UTC (rev 162629)
@@ -71,7 +71,7 @@
 typedef bool (*WKPageShouldGoToBackForwardListItemCallback)(WKPageRef page, WKBackForwardListItemRef item, const void *clientInfo);
 typedef void (*WKPageWillGoToBackForwardListItemCallback)(WKPageRef page, WKBackForwardListItemRef item, WKTypeRef userData, const void *clientInfo);
 typedef void (*WKPageDidLayoutCallback)(WKPageRef page, WKLayoutMilestones milestones, WKTypeRef userData, const void *clientInfo);
-typedef WKPluginLoadPolicy (*WKPagePluginLoadPolicyCallback)(WKPageRef page, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInfoDictionary, WKStringRef* unavailabilityDescription, const void* clientInfo);
+typedef WKPluginLoadPolicy (*WKPagePluginLoadPolicyCallback)(WKPageRef page, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInfoDictionary, WKStringRef* unavailabilityDescription, WKStringRef* useBlockedPluginTitle, const void* clientInfo);
 typedef void (*WKPagePluginDidFailCallback)(WKPageRef page, WKErrorCode errorCode, WKDictionaryRef pluginInfoDictionary, const void* clientInfo);
 typedef WKWebGLLoadPolicy (*WKPageWebGLLoadPolicyCallback)(WKPageRef page, WKStringRef url, const void* clientInfo);
 
@@ -79,6 +79,7 @@
 typedef void (*WKPageDidFailToInitializePluginCallback_deprecatedForUseWithV0)(WKPageRef page, WKStringRef mimeType, const void* clientInfo);
 typedef void (*WKPagePluginDidFailCallback_deprecatedForUseWithV1)(WKPageRef page, WKErrorCode errorCode, WKStringRef mimeType, WKStringRef pluginIdentifier, WKStringRef pluginVersion, const void* clientInfo);
 typedef WKPluginLoadPolicy (*WKPagePluginLoadPolicyCallback_deprecatedForUseWithV2)(WKPageRef page, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInfoDictionary, const void* clientInfo);
+typedef WKPluginLoadPolicy (*WKPagePluginLoadPolicyCallback_deprecatedForUseWithV3)(WKPageRef page, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInfoDictionary, WKStringRef* unavailabilityDescription, const void* clientInfo);
 
 typedef struct WKPageLoaderClientBase {
     int                                                                 version;
@@ -271,7 +272,7 @@
     WKPagePluginDidFailCallback                                         pluginDidFail;
 
     // Version 3.
-    WKPagePluginLoadPolicyCallback                                      pluginLoadPolicy;
+    WKPagePluginLoadPolicyCallback_deprecatedForUseWithV3               pluginLoadPolicy_deprecatedForUseWithV3;
 } WKPageLoaderClientV3;
 
 typedef struct WKPageLoaderClientV4 {
@@ -327,10 +328,11 @@
     WKPagePluginDidFailCallback                                         pluginDidFail;
     
     // Version 3.
-    WKPagePluginLoadPolicyCallback                                      pluginLoadPolicy;
+    WKPagePluginLoadPolicyCallback_deprecatedForUseWithV3               pluginLoadPolicy_deprecatedForUseWithV3;
     
-    // Version 4
+    // Version 4.
     WKPageWebGLLoadPolicyCallback                                       webGLLoadPolicy;
+    WKPagePluginLoadPolicyCallback                                      pluginLoadPolicy;
 } WKPageLoaderClientV4;
 
 // FIXME: These should be deprecated.

Modified: trunk/Source/WebKit2/UIProcess/WebLoaderClient.cpp (162628 => 162629)


--- trunk/Source/WebKit2/UIProcess/WebLoaderClient.cpp	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Source/WebKit2/UIProcess/WebLoaderClient.cpp	2014-01-23 19:31:18 UTC (rev 162629)
@@ -313,20 +313,28 @@
             m_client.base.clientInfo);
 }
 
-PluginModuleLoadPolicy WebLoaderClient::pluginLoadPolicy(WebPageProxy* page, PluginModuleLoadPolicy currentPluginLoadPolicy, ImmutableDictionary* pluginInformation, String& unavailabilityDescription)
+PluginModuleLoadPolicy WebLoaderClient::pluginLoadPolicy(WebPageProxy* page, PluginModuleLoadPolicy currentPluginLoadPolicy, ImmutableDictionary* pluginInformation, String& unavailabilityDescription, String& useBlockedPluginTitle)
 {
     WKStringRef unavailabilityDescriptionOut = 0;
+    WKStringRef useBlockedPluginTitleOut = 0;
     PluginModuleLoadPolicy loadPolicy = currentPluginLoadPolicy;
 
     if (m_client.pluginLoadPolicy_deprecatedForUseWithV2)
         loadPolicy = toPluginModuleLoadPolicy(m_client.pluginLoadPolicy_deprecatedForUseWithV2(toAPI(page), toWKPluginLoadPolicy(currentPluginLoadPolicy), toAPI(pluginInformation), m_client.base.clientInfo));
+    else if (m_client.pluginLoadPolicy_deprecatedForUseWithV3)
+        loadPolicy = toPluginModuleLoadPolicy(m_client.pluginLoadPolicy_deprecatedForUseWithV3(toAPI(page), toWKPluginLoadPolicy(currentPluginLoadPolicy), toAPI(pluginInformation), &unavailabilityDescriptionOut, m_client.base.clientInfo));
     else if (m_client.pluginLoadPolicy)
-        loadPolicy = toPluginModuleLoadPolicy(m_client.pluginLoadPolicy(toAPI(page), toWKPluginLoadPolicy(currentPluginLoadPolicy), toAPI(pluginInformation), &unavailabilityDescriptionOut, m_client.base.clientInfo));
+        loadPolicy = toPluginModuleLoadPolicy(m_client.pluginLoadPolicy(toAPI(page), toWKPluginLoadPolicy(currentPluginLoadPolicy), toAPI(pluginInformation), &unavailabilityDescriptionOut, &useBlockedPluginTitleOut, m_client.base.clientInfo));
 
     if (unavailabilityDescriptionOut) {
         RefPtr<API::String> webUnavailabilityDescription = adoptRef(toImpl(unavailabilityDescriptionOut));
         unavailabilityDescription = webUnavailabilityDescription->string();
     }
+
+    if (useBlockedPluginTitleOut) {
+        RefPtr<API::String> webUseBlockedPluginTitle = adoptRef(toImpl(useBlockedPluginTitleOut));
+        useBlockedPluginTitle = webUseBlockedPluginTitle->string();
+    }
     
     return loadPolicy;
 }

Modified: trunk/Source/WebKit2/UIProcess/WebLoaderClient.h (162628 => 162629)


--- trunk/Source/WebKit2/UIProcess/WebLoaderClient.h	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Source/WebKit2/UIProcess/WebLoaderClient.h	2014-01-23 19:31:18 UTC (rev 162629)
@@ -99,7 +99,7 @@
     void willGoToBackForwardListItem(WebPageProxy*, WebBackForwardListItem*, API::Object*);
 
 #if ENABLE(NETSCAPE_PLUGIN_API)
-    PluginModuleLoadPolicy pluginLoadPolicy(WebPageProxy*, PluginModuleLoadPolicy currentPluginLoadPolicy, ImmutableDictionary*, String& unavailabilityDescriptionOutParameter);
+    PluginModuleLoadPolicy pluginLoadPolicy(WebPageProxy*, PluginModuleLoadPolicy currentPluginLoadPolicy, ImmutableDictionary*, String& unavailabilityDescription, String& useBlockedPluginTitle);
     void didFailToInitializePlugin(WebPageProxy*, ImmutableDictionary*);
     void didBlockInsecurePluginVersion(WebPageProxy*, ImmutableDictionary*);
 #endif // ENABLE(NETSCAPE_PLUGIN_API)

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (162628 => 162629)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2014-01-23 19:31:18 UTC (rev 162629)
@@ -1326,7 +1326,7 @@
 }
 
 #if ENABLE(NETSCAPE_PLUGIN_API)
-void WebPageProxy::findPlugin(const String& mimeType, uint32_t processType, const String& urlString, const String& frameURLString, const String& pageURLString, bool allowOnlyApplicationPlugins, uint64_t& pluginProcessToken, String& newMimeType, uint32_t& pluginLoadPolicy, String& unavailabilityDescription)
+void WebPageProxy::findPlugin(const String& mimeType, uint32_t processType, const String& urlString, const String& frameURLString, const String& pageURLString, bool allowOnlyApplicationPlugins, uint64_t& pluginProcessToken, String& newMimeType, uint32_t& pluginLoadPolicy, String& unavailabilityDescription, String& useBlockedPluginTitle)
 {
     MESSAGE_CHECK_URL(urlString);
 
@@ -1344,11 +1344,12 @@
 
 #if PLATFORM(MAC)
     RefPtr<ImmutableDictionary> pluginInformation = createPluginInformationDictionary(plugin, frameURLString, String(), pageURLString, String(), String());
-    pluginLoadPolicy = m_loaderClient.pluginLoadPolicy(this, static_cast<PluginModuleLoadPolicy>(pluginLoadPolicy), pluginInformation.get(), unavailabilityDescription);
+    pluginLoadPolicy = m_loaderClient.pluginLoadPolicy(this, static_cast<PluginModuleLoadPolicy>(pluginLoadPolicy), pluginInformation.get(), unavailabilityDescription, useBlockedPluginTitle);
 #else
     UNUSED_PARAM(frameURLString);
     UNUSED_PARAM(pageURLString);
     UNUSED_PARAM(unavailabilityDescription);
+    UNUSED_PARAM(useBlockedPluginTitle);
 #endif
 
     PluginProcessSandboxPolicy pluginProcessSandboxPolicy = PluginProcessSandboxPolicyNormal;

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (162628 => 162629)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2014-01-23 19:31:18 UTC (rev 162629)
@@ -1159,7 +1159,7 @@
     void sendWheelEvent(const WebWheelEvent&);
 
 #if ENABLE(NETSCAPE_PLUGIN_API)
-    void findPlugin(const String& mimeType, uint32_t processType, const String& urlString, const String& frameURLString, const String& pageURLString, bool allowOnlyApplicationPlugins, uint64_t& pluginProcessToken, String& newMIMEType, uint32_t& pluginLoadPolicy, String& unavailabilityDescription);
+    void findPlugin(const String& mimeType, uint32_t processType, const String& urlString, const String& frameURLString, const String& pageURLString, bool allowOnlyApplicationPlugins, uint64_t& pluginProcessToken, String& newMIMEType, uint32_t& pluginLoadPolicy, String& unavailabilityDescription, String& useBlockedPluginTitle);
 #endif
 
     PageClient& m_pageClient;

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in (162628 => 162629)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in	2014-01-23 19:31:18 UTC (rev 162629)
@@ -335,7 +335,7 @@
 #endif
 
 #if ENABLE(NETSCAPE_PLUGIN_API)
-    FindPlugin(String mimeType, uint32_t processType, String urlString, String frameURLString, String pageURLString, bool allowOnlyApplicationPlugins) -> (uint64_t pluginProcessToken, String newMIMEType, uint32_t pluginLoadPolicy, String unavailabilityDescription)
+    FindPlugin(String mimeType, uint32_t processType, String urlString, String frameURLString, String pageURLString, bool allowOnlyApplicationPlugins) -> (uint64_t pluginProcessToken, String newMIMEType, uint32_t pluginLoadPolicy, String unavailabilityDescription, String useBlockedPluginTitle)
 #endif
 
     DidUpdateViewState()

Modified: trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h (162628 => 162629)


--- trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h	2014-01-23 19:31:18 UTC (rev 162629)
@@ -46,8 +46,9 @@
 OBJC_CLASS PDFAnnotation;
 OBJC_CLASS PDFLayerController;
 OBJC_CLASS PDFSelection;
+OBJC_CLASS WKPDFLayerControllerDelegate;
 OBJC_CLASS WKPDFPluginAccessibilityObject;
-OBJC_CLASS WKPDFLayerControllerDelegate;
+OBJC_CLASS WKPDFPluginContextMenuTarget;
 
 namespace IPC {
 class DataReference;
@@ -88,6 +89,7 @@
     void clickedLink(NSURL *);
     void saveToPDF();
     void openWithNativeApplication();
+    void openWithPlugin();
     void writeItemsToPasteboard(NSString *pasteboardName, NSArray *items, NSArray *types);
     void showDefinitionForAttributedString(NSAttributedString *, CGPoint);
     void performWebSearch(NSString *);
@@ -103,6 +105,8 @@
     
     bool showContextMenuAtPoint(const WebCore::IntPoint&);
 
+    void setUsedInPlaceOfBlockedPlugin(bool value, const String& useBlockedPluginContextMenuTitle);
+
 private:
     explicit PDFPlugin(WebFrame*);
 
@@ -258,7 +262,10 @@
 
     bool m_isPostScript;
     bool m_pdfDocumentWasMutated;
+    bool m_usedInPlaceOfBlockedPlugin;
 
+    String m_useBlockedPluginContextMenuTitle;
+
     WebCore::IntSize m_scrollOffset;
 
     RetainPtr<CALayer> m_containerLayer;
@@ -268,7 +275,8 @@
     RetainPtr<CALayer> m_scrollCornerLayer;
     RetainPtr<PDFLayerController> m_pdfLayerController;
     RetainPtr<WKPDFPluginAccessibilityObject> m_accessibilityObject;
-    
+    RetainPtr<WKPDFPluginContextMenuTarget> m_contextMenuTarget;
+
     RefPtr<PDFPluginAnnotation> m_activeAnnotation;
     RefPtr<PDFPluginPasswordField> m_passwordField;
     RefPtr<WebCore::Element> m_annotationContainer;

Modified: trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm (162628 => 162629)


--- trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm	2014-01-23 19:31:18 UTC (rev 162629)
@@ -55,6 +55,7 @@
 #import <QuartzCore/QuartzCore.h>
 #import <WebCore/ArchiveResource.h>
 #import <WebCore/Chrome.h>
+#import <WebCore/ChromeClient.h>
 #import <WebCore/Cursor.h>
 #import <WebCore/DocumentLoader.h>
 #import <WebCore/FocusController.h>
@@ -65,6 +66,7 @@
 #import <WebCore/GraphicsContext.h>
 #import <WebCore/HTMLElement.h>
 #import <WebCore/HTMLFormElement.h>
+#import <WebCore/HTMLPlugInElement.h>
 #import <WebCore/LocalizedStrings.h>
 #import <WebCore/MouseEvent.h>
 #import <WebCore/Page.h>
@@ -269,7 +271,38 @@
 
 @end
 
+@interface WKPDFPluginContextMenuTarget : NSObject
+{
+    WebKit::PDFPlugin* _pdfPlugin;
+}
 
+@property(assign) WebKit::PDFPlugin* pdfPlugin;
+
+- (id)initWithPDFPlugin:(WebKit::PDFPlugin *)plugin;
+
+@end
+
+@implementation WKPDFPluginContextMenuTarget
+
+@synthesize pdfPlugin = _pdfPlugin;
+
+- (id)initWithPDFPlugin:(WebKit::PDFPlugin *)plugin
+{
+    if (!(self = [super init]))
+        return nil;
+
+    _pdfPlugin = plugin;
+
+    return self;
+}
+
+- (void)useBlockedPlugin:(id)sender
+{
+    _pdfPlugin->openWithPlugin();
+}
+
+@end
+
 @interface WKPDFPluginScrollbarLayer : CALayer
 {
     WebKit::PDFPlugin* _pdfPlugin;
@@ -499,10 +532,12 @@
     : m_frame(frame)
     , m_isPostScript(false)
     , m_pdfDocumentWasMutated(false)
+    , m_usedInPlaceOfBlockedPlugin(false)
     , m_containerLayer(adoptNS([[CALayer alloc] init]))
     , m_contentLayer(adoptNS([[CALayer alloc] init]))
     , m_scrollCornerLayer(adoptNS([[WKPDFPluginScrollbarLayer alloc] initWithPDFPlugin:this]))
     , m_pdfLayerController(adoptNS([[pdfLayerControllerClass() alloc] init]))
+    , m_contextMenuTarget(adoptNS([[WKPDFPluginContextMenuTarget alloc] initWithPDFPlugin:this]))
     , m_pdfLayerControllerDelegate(adoptNS([[WKPDFLayerControllerDelegate alloc] initWithPDFPlugin:this]))
 {
     m_pdfLayerController.get().delegate = m_pdfLayerControllerDelegate.get();
@@ -1457,6 +1492,18 @@
     IntPoint point = frameView->contentsToScreen(IntRect(frameView->windowToContents(event.position()), IntSize())).location();
     
     if (NSMenu *nsMenu = [m_pdfLayerController menuForEvent:nsEventForWebMouseEvent(event)]) {
+        if (m_usedInPlaceOfBlockedPlugin) {
+            String title = useBlockedPlugInContextMenuTitle();
+
+            if (!m_useBlockedPluginContextMenuTitle.isEmpty())
+                title = m_useBlockedPluginContextMenuTitle;
+
+            NSMenuItem *useBlockedPluginItem = [[[NSMenuItem alloc] initWithTitle:title action:@selector(useBlockedPlugin:) keyEquivalent:@""] autorelease];
+
+            [useBlockedPluginItem setTarget:m_contextMenuTarget.get()];
+            [nsMenu insertItem:useBlockedPluginItem atIndex:0];
+            [nsMenu insertItem:[NSMenuItem separatorItem] atIndex:1];
+        }
         WKPopupContextMenu(nsMenu, point);
         return true;
     }
@@ -1643,6 +1690,11 @@
     webFrame()->page()->send(Messages::WebPageProxy::OpenPDFFromTemporaryFolderWithNativeApplication(m_temporaryPDFUUID));
 }
 
+void PDFPlugin::openWithPlugin()
+{
+    webFrame()->page()->corePage()->chrome().client().unavailablePluginButtonClicked(pluginView()->pluginElement(), RenderEmbeddedObject::InsecurePluginVersion);
+}
+
 void PDFPlugin::writeItemsToPasteboard(NSString *pasteboardName, NSArray *items, NSArray *types)
 {
     Vector<String> pasteboardTypes;
@@ -1883,6 +1935,13 @@
     return m_accessibilityObject.get();
 }
 
+
+void PDFPlugin::setUsedInPlaceOfBlockedPlugin(bool value, const String& useBlockedPluginContextMenuTitle)
+{
+    m_usedInPlaceOfBlockedPlugin = value;
+    m_useBlockedPluginContextMenuTitle = useBlockedPluginContextMenuTitle;
+}
+
 } // namespace WebKit
 
 #endif // ENABLE(PDFKIT_PLUGIN)

Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (162628 => 162629)


--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2014-01-23 19:31:18 UTC (rev 162629)
@@ -573,16 +573,26 @@
     uint64_t pluginProcessToken;
     uint32_t pluginLoadPolicy;
     String unavailabilityDescription;
-    if (!sendSync(Messages::WebPageProxy::FindPlugin(parameters.mimeType, static_cast<uint32_t>(processType), parameters.url.string(), frameURLString, pageURLString, allowOnlyApplicationPlugins), Messages::WebPageProxy::FindPlugin::Reply(pluginProcessToken, newMIMEType, pluginLoadPolicy, unavailabilityDescription))) {
-        return 0;
+    String useBlockedPluginTitle;
+    if (!sendSync(Messages::WebPageProxy::FindPlugin(parameters.mimeType, static_cast<uint32_t>(processType), parameters.url.string(), frameURLString, pageURLString, allowOnlyApplicationPlugins), Messages::WebPageProxy::FindPlugin::Reply(pluginProcessToken, newMIMEType, pluginLoadPolicy, unavailabilityDescription, useBlockedPluginTitle)))
+        return nullptr;
+
+    bool isBlockedPlugin = static_cast<PluginModuleLoadPolicy>(pluginLoadPolicy) == PluginModuleBlocked;
+
+    if (isBlockedPlugin || !pluginProcessToken) {
+#if ENABLE(PDFKIT_PLUGIN)
+        String path = parameters.url.path();
+        if (shouldUsePDFPlugin() && (MIMETypeRegistry::isPDFOrPostScriptMIMEType(parameters.mimeType) || (parameters.mimeType.isEmpty() && (path.endsWith(".pdf", false) || path.endsWith(".ps", false))))) {
+            RefPtr<PDFPlugin> pdfPlugin = PDFPlugin::create(frame);
+            pdfPlugin->setUsedInPlaceOfBlockedPlugin(isBlockedPlugin, useBlockedPluginTitle);
+            return pdfPlugin.release();
+        }
+#else
+        UNUSED_PARAM(frame);
+#endif
     }
 
-    switch (static_cast<PluginModuleLoadPolicy>(pluginLoadPolicy)) {
-    case PluginModuleLoadNormally:
-    case PluginModuleLoadUnsandboxed:
-        break;
-
-    case PluginModuleBlocked:
+    if (isBlockedPlugin) {
         bool replacementObscured = false;
         if (pluginElement->renderer()->isEmbeddedObject()) {
             RenderEmbeddedObject* renderObject = toRenderEmbeddedObject(pluginElement->renderer());
@@ -592,19 +602,11 @@
         }
 
         send(Messages::WebPageProxy::DidBlockInsecurePluginVersion(parameters.mimeType, parameters.url.string(), frameURLString, pageURLString, replacementObscured));
-        return 0;
+        return nullptr;
     }
 
-    if (!pluginProcessToken) {
-#if ENABLE(PDFKIT_PLUGIN)
-        String path = parameters.url.path();
-        if (shouldUsePDFPlugin() && (MIMETypeRegistry::isPDFOrPostScriptMIMEType(parameters.mimeType) || (parameters.mimeType.isEmpty() && (path.endsWith(".pdf", false) || path.endsWith(".ps", false)))))
-            return PDFPlugin::create(frame);
-#else
-        UNUSED_PARAM(frame);
-#endif
-        return 0;
-    }
+    if (!pluginProcessToken)
+        return nullptr;
 
     bool isRestartedProcess = (pluginElement->displayState() == HTMLPlugInElement::Restarting || pluginElement->displayState() == HTMLPlugInElement::RestartingWithPendingMouseClick);
     return PluginProxy::create(pluginProcessToken, isRestartedProcess);
@@ -3749,7 +3751,8 @@
     uint64_t pluginProcessToken;
     String newMIMEType;
     String unavailabilityDescription;
-    if (!sendSync(Messages::WebPageProxy::FindPlugin(response.mimeType(), PluginProcessTypeNormal, response.url().string(), response.url().string(), response.url().string(), allowOnlyApplicationPlugins), Messages::WebPageProxy::FindPlugin::Reply(pluginProcessToken, newMIMEType, pluginLoadPolicy, unavailabilityDescription)))
+    String useBlockedPluginTitle;
+    if (!sendSync(Messages::WebPageProxy::FindPlugin(response.mimeType(), PluginProcessTypeNormal, response.url().string(), response.url().string(), response.url().string(), allowOnlyApplicationPlugins), Messages::WebPageProxy::FindPlugin::Reply(pluginProcessToken, newMIMEType, pluginLoadPolicy, unavailabilityDescription, useBlockedPluginTitle)))
         return false;
 
     return pluginLoadPolicy != PluginModuleBlocked && pluginProcessToken;

Modified: trunk/Tools/ChangeLog (162628 => 162629)


--- trunk/Tools/ChangeLog	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Tools/ChangeLog	2014-01-23 19:31:18 UTC (rev 162629)
@@ -1,3 +1,18 @@
+2014-01-23  Tim Horton  <timothy_hor...@apple.com>
+
+        PDFPlugin: Use PDFPlugin even if there's an external plugin installed, if it's blocked
+        https://bugs.webkit.org/show_bug.cgi?id=127415
+        <rdar://problem/12482452>
+
+        Reviewed by Sam Weinig.
+
+        Adopt the new page loader client plugin load callback.
+
+        * WebKitTestRunner/TestController.cpp:
+        (WTR::TestController::createWebViewWithOptions):
+        (WTR::TestController::pluginLoadPolicy):
+        * WebKitTestRunner/TestController.h:
+
 2014-01-23  pe...@outlook.com  <pe...@outlook.com>
 
         [Curl] There is no way to specify cache folder.

Modified: trunk/Tools/WebKitTestRunner/TestController.cpp (162628 => 162629)


--- trunk/Tools/WebKitTestRunner/TestController.cpp	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Tools/WebKitTestRunner/TestController.cpp	2014-01-23 19:31:18 UTC (rev 162629)
@@ -459,8 +459,9 @@
         0, // didLayout
         0, // pluginLoadPolicy_deprecatedForUseWithV2
         0, // pluginDidFail
+        0, // pluginLoadPolicy_deprecatedForUseWithV3
+        0, // webGLLoadPolicy
         pluginLoadPolicy, // pluginLoadPolicy
-        0, // webGLLoadPolicy
     };
     WKPageSetPageLoaderClient(m_mainWebView->page(), &pageLoaderClient.base);
 
@@ -1057,12 +1058,12 @@
     static_cast<TestController*>(const_cast<void*>(clientInfo))->processDidCrash();
 }
 
-WKPluginLoadPolicy TestController::pluginLoadPolicy(WKPageRef page, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInformation, WKStringRef* unavailabilityDescription, const void* clientInfo)
+WKPluginLoadPolicy TestController::pluginLoadPolicy(WKPageRef page, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInformation, WKStringRef* unavailabilityDescription, WKStringRef* useBlockedPluginTitle, const void* clientInfo)
 {
-    return static_cast<TestController*>(const_cast<void*>(clientInfo))->pluginLoadPolicy(page, currentPluginLoadPolicy, pluginInformation, unavailabilityDescription);
+    return static_cast<TestController*>(const_cast<void*>(clientInfo))->pluginLoadPolicy(page, currentPluginLoadPolicy, pluginInformation, unavailabilityDescription, useBlockedPluginTitle);
 }
 
-WKPluginLoadPolicy TestController::pluginLoadPolicy(WKPageRef, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInformation, WKStringRef* unavailabilityDescription)
+WKPluginLoadPolicy TestController::pluginLoadPolicy(WKPageRef, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInformation, WKStringRef* unavailabilityDescription, WKStringRef* useBlockedPluginTitle)
 {
     if (m_shouldBlockAllPlugins)
         return kWKPluginLoadPolicyBlocked;

Modified: trunk/Tools/WebKitTestRunner/TestController.h (162628 => 162629)


--- trunk/Tools/WebKitTestRunner/TestController.h	2014-01-23 19:20:33 UTC (rev 162628)
+++ trunk/Tools/WebKitTestRunner/TestController.h	2014-01-23 19:31:18 UTC (rev 162629)
@@ -140,8 +140,8 @@
     static void processDidCrash(WKPageRef, const void* clientInfo);
     void processDidCrash();
 
-    static WKPluginLoadPolicy pluginLoadPolicy(WKPageRef, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInformation, WKStringRef* unavailabilityDescription, const void* clientInfo);
-    WKPluginLoadPolicy pluginLoadPolicy(WKPageRef, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInformation, WKStringRef* unavailabilityDescription);
+    static WKPluginLoadPolicy pluginLoadPolicy(WKPageRef, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInformation, WKStringRef* unavailabilityDescription, WKStringRef* useBlockedPluginTitle, const void* clientInfo);
+    WKPluginLoadPolicy pluginLoadPolicy(WKPageRef, WKPluginLoadPolicy currentPluginLoadPolicy, WKDictionaryRef pluginInformation, WKStringRef* unavailabilityDescription, WKStringRef* useBlockedPluginTitle);
     
 
     static void decidePolicyForNotificationPermissionRequest(WKPageRef, WKSecurityOriginRef, WKNotificationPermissionRequestRef, const void*);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to