Diff
Modified: trunk/Source/WebCore/ChangeLog (152327 => 152328)
--- trunk/Source/WebCore/ChangeLog 2013-07-02 23:04:47 UTC (rev 152327)
+++ trunk/Source/WebCore/ChangeLog 2013-07-03 00:06:13 UTC (rev 152328)
@@ -1,3 +1,14 @@
+2013-07-02 Jessie Berlin <[email protected]>
+
+ The callback for WKPageGetPlugInInformation needs info about whether or not there are any
+ non-playing instances of the plug-in on the page
+ https://bugs.webkit.org/show_bug.cgi?id=118330
+
+ Reviewed by Anders Carlsson.
+
+ * WebCore.exp.in:
+ Expose a symbol so it can be used in WebKit2.
+
2013-07-02 Alex Christensen <[email protected]>
Added getProcAddress implementation for Windows in OpenGLShims.
Modified: trunk/Source/WebCore/WebCore.exp.in (152327 => 152328)
--- trunk/Source/WebCore/WebCore.exp.in 2013-07-02 23:04:47 UTC (rev 152327)
+++ trunk/Source/WebCore/WebCore.exp.in 2013-07-03 00:06:13 UTC (rev 152328)
@@ -846,6 +846,7 @@
__ZN7WebCore4Node17stopIgnoringLeaksEv
__ZN7WebCore4Node18startIgnoringLeaksEv
__ZN7WebCore4Node19setNeedsStyleRecalcENS_15StyleChangeTypeE
+__ZN7WebCore4Node20getElementsByTagNameERKN3WTF12AtomicStringE
__ZN7WebCore4Page10findStringERKN3WTF6StringEj
__ZN7WebCore4Page11PageClientsC1Ev
__ZN7WebCore4Page11PageClientsD1Ev
Modified: trunk/Source/WebKit2/ChangeLog (152327 => 152328)
--- trunk/Source/WebKit2/ChangeLog 2013-07-02 23:04:47 UTC (rev 152327)
+++ trunk/Source/WebKit2/ChangeLog 2013-07-03 00:06:13 UTC (rev 152328)
@@ -1,3 +1,37 @@
+2013-07-02 Jessie Berlin <[email protected]>
+
+ The callback for WKPageGetPlugInInformation needs info about whether or not there are any
+ non-playing instances of the plug-in on the page
+ https://bugs.webkit.org/show_bug.cgi?id=118330
+
+ Reviewed by Anders Carlsson.
+
+ Add another key value pair to the dictionary passed to the callback.
+
+ * Shared/API/c/WKPluginInformation.cpp:
+ (WKPlugInInformationPageContainsNonPlayingInstanceOfPlugInKey):
+ * Shared/API/c/WKPluginInformation.h:
+
+ * Shared/Plugins/Netscape/PluginInformation.cpp:
+ (WebKit::plugInInformationPageContainsNonPlayingInstanceOfPlugInKey):
+ (WebKit::createPlugInInformationDictionary):
+ Add the information about whether or not the page contains a non-playing instance of that
+ plug-in to the plug-in information dictionary.
+ * Shared/Plugins/Netscape/PluginInformation.h:
+
+ * UIProcess/WebPageProxy.h:
+ * UIProcess/WebPageProxy.messages.in:
+ * UIProcess/mac/WebPageProxyMac.mm:
+ (WebKit::WebPageProxy::containsPlugInCallback):
+ Check if any of the MIME types of the plug-in instances that are present on the page but are
+ not playing match the instance of plug-in being searched for.
+ * WebProcess/WebPage/mac/WebPageMac.mm:
+ (WebKit::addPlugInMimeTypesFromNodeListForNonPlayingPlugIns):
+ Based roughly off of addPlugInsFromNodeListMatchingPlugInOrigin in
+ HTMLPlugInImageElement.cpp.
+ (WebKit::WebPage::containsPluginViewsWithPluginProcessToken):
+ Based roughly off of HTMLPlugInImageElement::restartSimilarPlugIns.
+
2013-07-02 Alexey Proskuryakov <[email protected]>
security/block-test.html fails when NetworkProcess is enabled
Modified: trunk/Source/WebKit2/Shared/API/c/WKPluginInformation.cpp (152327 => 152328)
--- trunk/Source/WebKit2/Shared/API/c/WKPluginInformation.cpp 2013-07-02 23:04:47 UTC (rev 152327)
+++ trunk/Source/WebKit2/Shared/API/c/WKPluginInformation.cpp 2013-07-03 00:06:13 UTC (rev 152328)
@@ -109,3 +109,9 @@
static WebString* key = WebString::create(pluginInformationPluginURLKey()).leakRef();
return toAPI(key);
}
+
+WKStringRef WKPlugInInformationPageContainsNonPlayingInstanceOfPlugInKey()
+{
+ static WebString* key = WebString::create(plugInInformationPageContainsNonPlayingInstanceOfPlugInKey()).leakRef();
+ return toAPI(key);
+}
Modified: trunk/Source/WebKit2/Shared/API/c/WKPluginInformation.h (152327 => 152328)
--- trunk/Source/WebKit2/Shared/API/c/WKPluginInformation.h 2013-07-02 23:04:47 UTC (rev 152327)
+++ trunk/Source/WebKit2/Shared/API/c/WKPluginInformation.h 2013-07-03 00:06:13 UTC (rev 152328)
@@ -76,6 +76,9 @@
/* Value type: WKURLRef */
WK_EXPORT WKStringRef WKPluginInformationPluginURLKey();
+/* Value type: WKBooleanRef */
+WK_EXPORT WKStringRef WKPlugInInformationPageContainsNonPlayingInstanceOfPlugInKey();
+
#ifdef __cplusplus
}
#endif
Modified: trunk/Source/WebKit2/Shared/Plugins/Netscape/PluginInformation.cpp (152327 => 152328)
--- trunk/Source/WebKit2/Shared/Plugins/Netscape/PluginInformation.cpp 2013-07-02 23:04:47 UTC (rev 152327)
+++ trunk/Source/WebKit2/Shared/Plugins/Netscape/PluginInformation.cpp 2013-07-03 00:06:13 UTC (rev 152328)
@@ -101,6 +101,11 @@
return ASCIILiteral("PluginInformationPluginURL");
}
+String plugInInformationPageContainsNonPlayingInstanceOfPlugInKey()
+{
+ return ASCIILiteral("PlugInInformationPageContainsNonPlayingInstanceOfPlugIn");
+}
+
void getPluginModuleInformation(const PluginModuleInfo& plugin, ImmutableDictionary::MapType& map)
{
#if ENABLE(NETSCAPE_PLUGIN_API)
@@ -120,6 +125,16 @@
return ImmutableDictionary::adopt(map);
}
+PassRefPtr<ImmutableDictionary> createPlugInInformationDictionary(const PluginModuleInfo& plugInModuleInfo, bool pageContainsNonPlayingInstanceOfPlugIn)
+{
+ ImmutableDictionary::MapType map;
+ getPluginModuleInformation(plugInModuleInfo, map);
+
+ map.set(plugInInformationPageContainsNonPlayingInstanceOfPlugInKey(), WebBoolean::create(pageContainsNonPlayingInstanceOfPlugIn));
+
+ return ImmutableDictionary::adopt(map);
+}
+
PassRefPtr<ImmutableDictionary> createPluginInformationDictionary(const PluginModuleInfo& plugin, const String& frameURLString, const String& mimeType, const String& pageURLString, const String& pluginspageAttributeURLString, const String& pluginURLString)
{
ImmutableDictionary::MapType map;
Modified: trunk/Source/WebKit2/Shared/Plugins/Netscape/PluginInformation.h (152327 => 152328)
--- trunk/Source/WebKit2/Shared/Plugins/Netscape/PluginInformation.h 2013-07-02 23:04:47 UTC (rev 152327)
+++ trunk/Source/WebKit2/Shared/Plugins/Netscape/PluginInformation.h 2013-07-03 00:06:13 UTC (rev 152328)
@@ -49,12 +49,13 @@
String pluginInformationPageURLKey();
String pluginInformationPluginspageAttributeURLKey();
String pluginInformationPluginURLKey();
+String plugInInformationPageContainsNonPlayingInstanceOfPlugInKey();
PassRefPtr<ImmutableDictionary> createPluginInformationDictionary(const PluginModuleInfo&);
PassRefPtr<ImmutableDictionary> createPluginInformationDictionary(const PluginModuleInfo&, const String& frameURLString, const String& mimeType, const String& pageURLString, const String& pluginspageAttributeURLString, const String& pluginURLString);
PassRefPtr<ImmutableDictionary> createPluginInformationDictionary(const String& mimeType, const String& frameURLString, const String& pageURLString);
+PassRefPtr<ImmutableDictionary> createPlugInInformationDictionary(const PluginModuleInfo&, bool pageContainsNonPlayingInstanceOfPlugIn);
-
void getPluginModuleInformation(const PluginModuleInfo&, ImmutableDictionary::MapType&);
void getPlatformPluginModuleInformation(const PluginModuleInfo&, ImmutableDictionary::MapType&);
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (152327 => 152328)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2013-07-02 23:04:47 UTC (rev 152327)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2013-07-03 00:06:13 UTC (rev 152328)
@@ -539,7 +539,7 @@
ColorSpaceData colorSpace();
void getPlugInInformation(pid_t plugInProcessID, PassRefPtr<DictionaryCallback>);
- void containsPlugInCallback(bool containsPlugIn, uint64_t plugInToken, uint64_t callbackID);
+ void containsPlugInCallback(bool containsPlugIn, const Vector<String>& nonPlayingPlugInInstanceMimeTypes, uint64_t plugInToken, uint64_t callbackID);
#endif
void pageScaleFactorDidChange(double);
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in (152327 => 152328)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in 2013-07-02 23:04:47 UTC (rev 152327)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in 2013-07-03 00:06:13 UTC (rev 152328)
@@ -264,7 +264,7 @@
# Plug-in complex text input support messages
PluginFocusOrWindowFocusChanged(uint64_t pluginComplexTextInputIdentifier, bool pluginHasFocusAndWindowHasFocus)
SetPluginComplexTextInputState(uint64_t pluginComplexTextInputIdentifier, uint64_t complexTextInputState)
- ContainsPlugInCallback(bool containsPlugIn, uint64_t plugInProcessToken, uint64_t callbackID)
+ ContainsPlugInCallback(bool containsPlugIn, Vector<String> nonPlayingPlugInInstanceMimeTypes, uint64_t plugInProcessToken, uint64_t callbackID)
# Speech messages
GetIsSpeaking() -> (bool isSpeaking)
Modified: trunk/Source/WebKit2/UIProcess/mac/WebPageProxyMac.mm (152327 => 152328)
--- trunk/Source/WebKit2/UIProcess/mac/WebPageProxyMac.mm 2013-07-02 23:04:47 UTC (rev 152327)
+++ trunk/Source/WebKit2/UIProcess/mac/WebPageProxyMac.mm 2013-07-03 00:06:13 UTC (rev 152328)
@@ -40,6 +40,7 @@
#import "PluginProcessProxy.h"
#import "StringUtilities.h"
#import "TextChecker.h"
+#import "WebContext.h"
#import "WebPageMessages.h"
#import "WebProcessProxy.h"
#import <WebCore/DictationAlternative.h>
@@ -480,7 +481,7 @@
m_process->send(Messages::WebPage::ContainsPluginViewsWithPluginProcessToken(plugInProcessProxy->pluginProcessToken(), callbackID), m_pageID);
}
-void WebPageProxy::containsPlugInCallback(bool containsPlugIn, uint64_t plugInToken, uint64_t callbackID)
+void WebPageProxy::containsPlugInCallback(bool containsPlugIn, const Vector<String>& nonPlayingPlugInInstanceMimeTypes, uint64_t plugInToken, uint64_t callbackID)
{
RefPtr<DictionaryCallback> callback = m_plugInInformationCallbacks.take(callbackID);
if (!callback) {
@@ -496,10 +497,20 @@
PluginProcessProxy* plugInProcessProxy = PluginProcessManager::shared().findPlugInProcessByToken(plugInToken);
ASSERT(plugInProcessProxy);
- ImmutableDictionary::MapType map;
- getPluginModuleInformation(plugInProcessProxy->pluginProcessAttributes().moduleInfo, map);
- RefPtr<ImmutableDictionary> plugInInformation = ImmutableDictionary::adopt(map);
+ String plugInBundleIdentifier = plugInProcessProxy->pluginProcessAttributes().moduleInfo.bundleIdentifier;
+ bool containsNonPlayingInstanceOfPlugIn = false;
+ for (const String& plugInMimeType: nonPlayingPlugInInstanceMimeTypes) {
+ String mimeType = plugInMimeType;
+ PluginModuleInfo plugInInfo = m_process->context()->pluginInfoStore().findPlugin(mimeType, KURL());
+ if (plugInInfo.bundleIdentifier == plugInBundleIdentifier) {
+ containsNonPlayingInstanceOfPlugIn = true;
+ break;
+ }
+ }
+
+ RefPtr<ImmutableDictionary> plugInInformation = createPlugInInformationDictionary(plugInProcessProxy->pluginProcessAttributes().moduleInfo, containsNonPlayingInstanceOfPlugIn);
+
callback->performCallbackWithReturnValue(plugInInformation.get());
}
Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm (152327 => 152328)
--- trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm 2013-07-02 23:04:47 UTC (rev 152327)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm 2013-07-03 00:06:13 UTC (rev 152328)
@@ -52,9 +52,11 @@
#import <WebCore/FrameLoader.h>
#import <WebCore/FrameView.h>
#import <WebCore/HTMLConverter.h>
+#import <WebCore/HTMLPlugInImageElement.h>
#import <WebCore/HitTestResult.h>
#import <WebCore/KeyboardEvent.h>
#import <WebCore/MIMETypeRegistry.h>
+#import <WebCore/NodeList.h>
#import <WebCore/NetworkingContext.h>
#import <WebCore/Page.h>
#import <WebCore/PlatformKeyboardEvent.h>
@@ -980,6 +982,31 @@
}
}
+static void addPlugInMimeTypesFromNodeListForNonPlayingPlugIns(PassRefPtr<NodeList> plugIns, HashSet<String>& mimeTypes)
+{
+ if (!plugIns)
+ return;
+
+ for (unsigned i = 0, length = plugIns->length(); i < length; i++) {
+ Node* node = plugIns->item(i);
+ if (!node->isPluginElement())
+ continue;
+
+ HTMLPlugInElement* plugInElement = toHTMLPlugInElement(node);
+
+ ASSERT(!plugInElement->hasTagName(WebCore::HTMLNames::appletTag));
+
+ if (plugInElement->displayState() == HTMLPlugInElement::DisplayState::Playing)
+ continue;
+
+ if (!plugInElement->isPlugInImageElement())
+ continue;
+
+ HTMLPlugInImageElement* plugInImageElement = toHTMLPlugInImageElement(node);
+ mimeTypes.add(plugInImageElement->loadedMimeType());
+ }
+}
+
void WebPage::containsPluginViewsWithPluginProcessToken(uint64_t plugInProcessToken, uint64_t callbackID)
{
bool containsPlugIn = false;
@@ -990,7 +1017,22 @@
}
}
- send(Messages::WebPageProxy::ContainsPlugInCallback(containsPlugIn, plugInProcessToken, callbackID));
+ HashSet<String> nonPlayingPlugInMimeTypes;
+ for (Frame* frame = corePage()->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
+ if (!frame->loader()->subframeLoader()->containsPlugins())
+ continue;
+
+ if (!frame->document())
+ continue;
+
+ addPlugInMimeTypesFromNodeListForNonPlayingPlugIns(frame->document()->getElementsByTagName(WebCore::HTMLNames::embedTag.localName()), nonPlayingPlugInMimeTypes);
+ addPlugInMimeTypesFromNodeListForNonPlayingPlugIns(frame->document()->getElementsByTagName(WebCore::HTMLNames::objectTag.localName()), nonPlayingPlugInMimeTypes);
+ }
+
+ Vector<String> nonPlayingPlugInMimeTypesVector;
+ copyToVector(nonPlayingPlugInMimeTypes, nonPlayingPlugInMimeTypesVector);
+
+ send(Messages::WebPageProxy::ContainsPlugInCallback(containsPlugIn, nonPlayingPlugInMimeTypesVector, plugInProcessToken, callbackID));
}
} // namespace WebKit