Title: [152328] trunk/Source
Revision
152328
Author
[email protected]
Date
2013-07-02 17:06:13 -0700 (Tue, 02 Jul 2013)

Log Message

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.

Source/WebCore:

* WebCore.exp.in:
Expose a symbol so it can be used in WebKit2.

Source/WebKit2:

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.

Modified Paths

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
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to