"Plug-in is blocked" message doesn't draw correctly
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 4 Oct 2015 02:38:19 +0000 (02:38 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 4 Oct 2015 02:38:19 +0000 (02:38 +0000)
https://bugs.webkit.org/show_bug.cgi?id=149741
<rdar://problem/22920949>

Patch by Conrad Shultz and Ricky Mondello.

Patch by Ricky Mondello <rmondello@apple.com> on 2015-10-03
Reviewed by Anders Carlsson.

Source/WebCore:

No new tests are added.

Add PluginData API to check whether a MIME type is supported, regardless of plug-in visibility.

* plugins/PluginData.cpp:
(WebCore::PluginData::getWebVisibleMimesAndPluginIndices): Adopt getMimesAndPluginIndiciesForPlugins.
(WebCore::PluginData::getMimesAndPluginIndices): Added.
(WebCore::PluginData::getMimesAndPluginIndiciesForPlugins): Essentially factored out of
    getWebVisibleMimesAndPluginIndices.
(WebCore::PluginData::supportsMimeType): Added. Somewhat similar to preexisting supportsWebVisibleMimeType.
* plugins/PluginData.h: Declare supportsMimeType.

Source/WebKit2:

If a WebKit client sets plug-in X to not be visible to the web, that doesn't mean we shouldn't consult
that plug-in when determining what kind of object type an object is. Properly classifying a non-web-visible
Netscape plug-in as such allows its bounds to properly measured, allowing it to be drawn properly.

* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::objectContentType): Use PluginData's supportsMimeType, rather than its
    supportsWebVisibleMimeType, when determining the ObjectContentType for a MIME type on a url.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@190547 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/plugins/PluginData.cpp
Source/WebCore/plugins/PluginData.h
Source/WebKit2/ChangeLog
Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

index 024616d..0fcf71e 100644 (file)
@@ -1,3 +1,25 @@
+2015-10-03  Ricky Mondello  <rmondello@apple.com>
+
+        "Plug-in is blocked" message doesn't draw correctly
+        https://bugs.webkit.org/show_bug.cgi?id=149741
+        <rdar://problem/22920949>
+
+        Patch by Conrad Shultz and Ricky Mondello.
+
+        Reviewed by Anders Carlsson.
+
+        No new tests are added.
+
+        Add PluginData API to check whether a MIME type is supported, regardless of plug-in visibility.
+
+        * plugins/PluginData.cpp:
+        (WebCore::PluginData::getWebVisibleMimesAndPluginIndices): Adopt getMimesAndPluginIndiciesForPlugins.
+        (WebCore::PluginData::getMimesAndPluginIndices): Added.
+        (WebCore::PluginData::getMimesAndPluginIndiciesForPlugins): Essentially factored out of
+            getWebVisibleMimesAndPluginIndices.
+        (WebCore::PluginData::supportsMimeType): Added. Somewhat similar to preexisting supportsWebVisibleMimeType.
+        * plugins/PluginData.h: Declare supportsMimeType.
+
 2015-10-02  Antti Koivisto  <antti@apple.com>
 
         Inserting a child to a slot assigned node doesn't trigger repaint
index a178adb..a082621 100644 (file)
@@ -46,10 +46,19 @@ Vector<PluginInfo> PluginData::webVisiblePlugins() const
 
 void PluginData::getWebVisibleMimesAndPluginIndices(Vector<MimeClassInfo>& mimes, Vector<size_t>& mimePluginIndices) const
 {
+    getMimesAndPluginIndiciesForPlugins(webVisiblePlugins(), mimes, mimePluginIndices);
+}
+
+void PluginData::getMimesAndPluginIndices(Vector<MimeClassInfo>& mimes, Vector<size_t>& mimePluginIndices) const
+{
+    getMimesAndPluginIndiciesForPlugins(plugins(), mimes, mimePluginIndices);
+}
+
+void PluginData::getMimesAndPluginIndiciesForPlugins(const Vector<PluginInfo>& plugins, Vector<MimeClassInfo>& mimes, Vector<size_t>& mimePluginIndices) const
+{
     ASSERT_ARG(mimes, mimes.isEmpty());
     ASSERT_ARG(mimePluginIndices, mimePluginIndices.isEmpty());
 
-    const Vector<PluginInfo>& plugins = webVisiblePlugins();
     for (unsigned i = 0; i < plugins.size(); ++i) {
         const PluginInfo& plugin = plugins[i];
         for (auto& mime : plugin.mimes) {
@@ -108,6 +117,20 @@ String PluginData::pluginFileForWebVisibleMimeType(const String& mimeType) const
     return String();
 }
 
+bool PluginData::supportsMimeType(const String& mimeType, const AllowedPluginTypes allowedPluginTypes) const
+{
+    Vector<MimeClassInfo> mimes;
+    Vector<size_t> mimePluginIndices;
+    const Vector<PluginInfo>& plugins = this->plugins();
+    getMimesAndPluginIndices(mimes, mimePluginIndices);
+
+    for (unsigned i = 0; i < mimes.size(); ++i) {
+        if (mimes[i].type == mimeType && (allowedPluginTypes == AllPlugins || plugins[mimePluginIndices[i]].isApplicationPlugin))
+            return true;
+    }
+    return false;
+}
+
 void PluginData::refresh()
 {
     platformStrategies()->pluginStrategy()->refreshPlugins();
index 76112d4..f5283f0 100644 (file)
@@ -100,12 +100,16 @@ public:
     String pluginNameForWebVisibleMimeType(const String& mimeType) const;
     String pluginFileForWebVisibleMimeType(const String& mimeType) const;
 
+    WEBCORE_EXPORT bool supportsMimeType(const String& mimeType, const AllowedPluginTypes) const;
+
     static void refresh();
 
 private:
     explicit PluginData(const Page*);
     void initPlugins();
     bool getPluginInfoForWebVisibleMimeType(const String& mimeType, PluginInfo&) const;
+    void getMimesAndPluginIndices(Vector<MimeClassInfo>&, Vector<size_t>&) const;
+    void getMimesAndPluginIndiciesForPlugins(const Vector<PluginInfo>&, Vector<MimeClassInfo>&, Vector<size_t>&) const;
 
 protected:
 #if defined ENABLE_WEB_REPLAY && ENABLE_WEB_REPLAY
index 2290f9e..9a3fd4e 100644 (file)
@@ -1,3 +1,21 @@
+2015-10-03  Ricky Mondello  <rmondello@apple.com>
+
+        "Plug-in is blocked" message doesn't draw correctly
+        https://bugs.webkit.org/show_bug.cgi?id=149741
+        <rdar://problem/22920949>
+
+        Patch by Conrad Shultz and Ricky Mondello.
+
+        Reviewed by Anders Carlsson.
+
+        If a WebKit client sets plug-in X to not be visible to the web, that doesn't mean we shouldn't consult
+        that plug-in when determining what kind of object type an object is. Properly classifying a non-web-visible
+        Netscape plug-in as such allows its bounds to properly measured, allowing it to be drawn properly.
+
+        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+        (WebKit::WebFrameLoaderClient::objectContentType): Use PluginData's supportsMimeType, rather than its
+            supportsWebVisibleMimeType, when determining the ObjectContentType for a MIME type on a url.
+
 2015-10-02  Enrica Casucci  <enrica@apple.com>
 
         Text selection is inaccurate in Wikipedia pages when starting navigation from wikipedia.org.
index 0ed84d3..046d6f2 100644 (file)
@@ -1534,9 +1534,9 @@ ObjectContentType WebFrameLoaderClient::objectContentType(const URL& url, const
     bool plugInSupportsMIMEType = false;
     if (WebPage* webPage = m_frame->page()) {
         const PluginData& pluginData = webPage->corePage()->pluginData();
-        if (pluginData.supportsWebVisibleMimeType(mimeType, PluginData::AllPlugins) && webFrame()->coreFrame()->loader().subframeLoader().allowPlugins())
+        if (pluginData.supportsMimeType(mimeType, PluginData::AllPlugins) && webFrame()->coreFrame()->loader().subframeLoader().allowPlugins())
             plugInSupportsMIMEType = true;
-        else if (pluginData.supportsWebVisibleMimeType(mimeType, PluginData::OnlyApplicationPlugins))
+        else if (pluginData.supportsMimeType(mimeType, PluginData::OnlyApplicationPlugins))
             plugInSupportsMIMEType = true;
     }