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*);