Instantiate WebKit plug-ins at layout time, instead of at style resolution time
authorandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 10 Aug 2016 01:31:17 +0000 (01:31 +0000)
committerandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 10 Aug 2016 01:31:17 +0000 (01:31 +0000)
https://bugs.webkit.org/show_bug.cgi?id=160715

Reviewed by Tim Horton.

Source/WebCore:

This gets rid of the differentiation of WebKit plug-ins and Netscape plug-ins, and
always instantiates plug-ins at layout time.

Initially, plug-ins were always instantiated after style recalc, but that lead to bugs
where plug-ins wouldn't be instantiated with their correct size. Fixing that bug lead
to a regression in the Web Clip widget which is why the special casing was introduced.

The Web Clip widget has now been fixed, so we can get rid of the special case.

* html/HTMLAppletElement.cpp:
(WebCore::HTMLAppletElement::updateWidget):
* html/HTMLAppletElement.h:
* html/HTMLEmbedElement.cpp:
(WebCore::HTMLEmbedElement::updateWidget):
* html/HTMLEmbedElement.h:
* html/HTMLObjectElement.cpp:
(WebCore::HTMLObjectElement::updateWidget):
* html/HTMLObjectElement.h:
* html/HTMLPlugInImageElement.cpp:
(WebCore::HTMLPlugInImageElement::isImageType):
(WebCore::HTMLPlugInImageElement::wouldLoadAsPlugIn):
(WebCore::HTMLPlugInImageElement::updateWidgetIfNecessary):
(WebCore::HTMLPlugInImageElement::wouldLoadAsNetscapePlugin): Deleted.
* html/HTMLPlugInImageElement.h:
* loader/EmptyClients.h:
* loader/FrameLoaderTypes.h:
* loader/SubframeLoader.cpp:
(WebCore::SubframeLoader::shouldUsePlugin):
* page/FrameView.cpp:
(WebCore::FrameView::updateEmbeddedObject):

Source/WebKit/mac:

* WebCoreSupport/WebFrameLoaderClient.mm:
(WebFrameLoaderClient::objectContentType):

Source/WebKit/win:

* WebCoreSupport/WebFrameLoaderClient.cpp:
(WebFrameLoaderClient::objectContentType):

Source/WebKit2:

* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::objectContentType):

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

19 files changed:
Source/WebCore/ChangeLog
Source/WebCore/html/HTMLAppletElement.cpp
Source/WebCore/html/HTMLAppletElement.h
Source/WebCore/html/HTMLEmbedElement.cpp
Source/WebCore/html/HTMLEmbedElement.h
Source/WebCore/html/HTMLObjectElement.cpp
Source/WebCore/html/HTMLObjectElement.h
Source/WebCore/html/HTMLPlugInImageElement.cpp
Source/WebCore/html/HTMLPlugInImageElement.h
Source/WebCore/loader/EmptyClients.h
Source/WebCore/loader/FrameLoaderTypes.h
Source/WebCore/loader/SubframeLoader.cpp
Source/WebCore/page/FrameView.cpp
Source/WebKit/mac/ChangeLog
Source/WebKit/mac/WebCoreSupport/WebFrameLoaderClient.mm
Source/WebKit/win/ChangeLog
Source/WebKit/win/WebCoreSupport/WebFrameLoaderClient.cpp
Source/WebKit2/ChangeLog
Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

index 7be62ad..e75dc4c 100644 (file)
@@ -1,3 +1,41 @@
+2016-08-09  Anders Carlsson  <andersca@apple.com>
+
+        Instantiate WebKit plug-ins at layout time, instead of at style resolution time
+        https://bugs.webkit.org/show_bug.cgi?id=160715
+
+        Reviewed by Tim Horton.
+
+        This gets rid of the differentiation of WebKit plug-ins and Netscape plug-ins, and
+        always instantiates plug-ins at layout time.
+        
+        Initially, plug-ins were always instantiated after style recalc, but that lead to bugs
+        where plug-ins wouldn't be instantiated with their correct size. Fixing that bug lead
+        to a regression in the Web Clip widget which is why the special casing was introduced.
+        
+        The Web Clip widget has now been fixed, so we can get rid of the special case.
+
+        * html/HTMLAppletElement.cpp:
+        (WebCore::HTMLAppletElement::updateWidget):
+        * html/HTMLAppletElement.h:
+        * html/HTMLEmbedElement.cpp:
+        (WebCore::HTMLEmbedElement::updateWidget):
+        * html/HTMLEmbedElement.h:
+        * html/HTMLObjectElement.cpp:
+        (WebCore::HTMLObjectElement::updateWidget):
+        * html/HTMLObjectElement.h:
+        * html/HTMLPlugInImageElement.cpp:
+        (WebCore::HTMLPlugInImageElement::isImageType):
+        (WebCore::HTMLPlugInImageElement::wouldLoadAsPlugIn):
+        (WebCore::HTMLPlugInImageElement::updateWidgetIfNecessary):
+        (WebCore::HTMLPlugInImageElement::wouldLoadAsNetscapePlugin): Deleted.
+        * html/HTMLPlugInImageElement.h:
+        * loader/EmptyClients.h:
+        * loader/FrameLoaderTypes.h:
+        * loader/SubframeLoader.cpp:
+        (WebCore::SubframeLoader::shouldUsePlugin):
+        * page/FrameView.cpp:
+        (WebCore::FrameView::updateEmbeddedObject):
+
 2016-08-09  Chris Dumez  <cdumez@apple.com>
 
         Unreviewed, fix assertions after r204311.
index 03a8229..b88956e 100644 (file)
@@ -95,7 +95,7 @@ RenderWidget* HTMLAppletElement::renderWidgetLoadingPlugin() const
     return renderWidget();
 }
 
-void HTMLAppletElement::updateWidget(PluginCreationOption pluginCreationOption)
+void HTMLAppletElement::updateWidget(CreatePlugins createPlugins)
 {
     setNeedsWidgetUpdate(false);
     // FIXME: This should ASSERT isFinishedParsingChildren() instead.
@@ -103,13 +103,13 @@ void HTMLAppletElement::updateWidget(PluginCreationOption pluginCreationOption)
         return;
 
 #if PLATFORM(IOS)
-    UNUSED_PARAM(pluginCreationOption);
+    UNUSED_PARAM(createPlugins);
 #else
     // FIXME: It's sadness that we have this special case here.
     //        See http://trac.webkit.org/changeset/25128 and
     //        plugins/netscape-plugin-setwindow-size.html
-    if (pluginCreationOption == CreateOnlyNonNetscapePlugins) {
-        // Ensure updateWidget() is called again during layout to create the Netscape plug-in.
+    if (createPlugins == CreatePlugins::No) {
+        // Ensure updateWidget() is called again during layout to create the plug-in.
         setNeedsWidgetUpdate(true);
         return;
     }
index 9299ba4..97fd48f 100644 (file)
@@ -40,7 +40,7 @@ private:
     RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final;
 
     RenderWidget* renderWidgetLoadingPlugin() const final;
-    void updateWidget(PluginCreationOption) final;
+    void updateWidget(CreatePlugins) final;
 
     bool canEmbedJava() const;
 };
index b96ee2b..aa352a4 100644 (file)
@@ -135,7 +135,7 @@ void HTMLEmbedElement::parametersForPlugin(Vector<String>& paramNames, Vector<St
 
 // FIXME: This should be unified with HTMLObjectElement::updateWidget and
 // moved down into HTMLPluginImageElement.cpp
-void HTMLEmbedElement::updateWidget(PluginCreationOption pluginCreationOption)
+void HTMLEmbedElement::updateWidget(CreatePlugins createPlugins)
 {
     ASSERT(!renderEmbeddedObject()->isPluginUnavailable());
     ASSERT(needsWidgetUpdate());
@@ -152,7 +152,7 @@ void HTMLEmbedElement::updateWidget(PluginCreationOption pluginCreationOption)
     // FIXME: It's sadness that we have this special case here.
     //        See http://trac.webkit.org/changeset/25128 and
     //        plugins/netscape-plugin-setwindow-size.html
-    if (pluginCreationOption == CreateOnlyNonNetscapePlugins && wouldLoadAsNetscapePlugin(m_url, m_serviceType)) {
+    if (createPlugins == CreatePlugins::No && wouldLoadAsPlugIn(m_url, m_serviceType)) {
         // Ensure updateWidget() is called again during layout to create the Netscape plug-in.
         setNeedsWidgetUpdate(true);
         return;
index 73209ce..543eb5e 100644 (file)
@@ -45,7 +45,7 @@ private:
 
     RenderWidget* renderWidgetLoadingPlugin() const final;
 
-    void updateWidget(PluginCreationOption) final;
+    void updateWidget(CreatePlugins) final;
 
     void addSubresourceAttributeURLs(ListHashSet<URL>&) const final;
 
index 1f4979a..0250ad2 100644 (file)
@@ -284,7 +284,7 @@ bool HTMLObjectElement::hasValidClassId()
 
 // FIXME: This should be unified with HTMLEmbedElement::updateWidget and
 // moved down into HTMLPluginImageElement.cpp
-void HTMLObjectElement::updateWidget(PluginCreationOption pluginCreationOption)
+void HTMLObjectElement::updateWidget(CreatePlugins createPlugins)
 {
     ASSERT(!renderEmbeddedObject()->isPluginUnavailable());
     ASSERT(needsWidgetUpdate());
@@ -314,7 +314,7 @@ void HTMLObjectElement::updateWidget(PluginCreationOption pluginCreationOption)
     // FIXME: It's sadness that we have this special case here.
     //        See http://trac.webkit.org/changeset/25128 and
     //        plugins/netscape-plugin-setwindow-size.html
-    if (pluginCreationOption == CreateOnlyNonNetscapePlugins && wouldLoadAsNetscapePlugin(url, serviceType)) {
+    if (createPlugins == CreatePlugins::No && wouldLoadAsPlugIn(url, serviceType)) {
         // Ensure updateWidget() is called again during layout to create the Netscape plug-in.
         setNeedsWidgetUpdate(true);
         return;
index 1136d20..9fc2bd0 100644 (file)
@@ -77,7 +77,7 @@ private:
 
     void addSubresourceAttributeURLs(ListHashSet<URL>&) const final;
 
-    void updateWidget(PluginCreationOption) final;
+    void updateWidget(CreatePlugins) final;
     void updateDocNamedItem();
 
     // FIXME: This function should not deal with url or serviceType
index 8b444db..26c7f71 100644 (file)
@@ -162,7 +162,7 @@ bool HTMLPlugInImageElement::isImageType()
 
     if (Frame* frame = document().frame()) {
         URL completedURL = document().completeURL(m_url);
-        return frame->loader().client().objectContentType(completedURL, m_serviceType) == ObjectContentImage;
+        return frame->loader().client().objectContentType(completedURL, m_serviceType) == ObjectContentType::Image;
     }
 
     return Image::supportsType(m_serviceType);
@@ -183,7 +183,7 @@ bool HTMLPlugInImageElement::allowedToLoadFrameURL(const String& url)
 
 // We don't use m_url, or m_serviceType as they may not be the final values
 // that <object> uses depending on <param> values.
-bool HTMLPlugInImageElement::wouldLoadAsNetscapePlugin(const String& url, const String& serviceType)
+bool HTMLPlugInImageElement::wouldLoadAsPlugIn(const String& url, const String& serviceType)
 {
     ASSERT(document().frame());
     URL completedURL;
@@ -191,7 +191,7 @@ bool HTMLPlugInImageElement::wouldLoadAsNetscapePlugin(const String& url, const
         completedURL = document().completeURL(url);
 
     FrameLoader& frameLoader = document().frame()->loader();
-    if (frameLoader.client().objectContentType(completedURL, serviceType) == ObjectContentNetscapePlugin)
+    if (frameLoader.client().objectContentType(completedURL, serviceType) == ObjectContentType::PlugIn)
         return true;
     return false;
 }
@@ -295,7 +295,7 @@ void HTMLPlugInImageElement::updateWidgetIfNecessary()
     if (!renderEmbeddedObject() || renderEmbeddedObject()->isPluginUnavailable())
         return;
 
-    updateWidget(CreateOnlyNonNetscapePlugins);
+    updateWidget(CreatePlugins::No);
 }
 
 void HTMLPlugInImageElement::finishParsingChildren()
index d33eeeb..988d9e6 100644 (file)
@@ -32,9 +32,9 @@ class MouseEvent;
 class RenderStyle;
 class Widget;
 
-enum PluginCreationOption {
-    CreateAnyWidgetType,
-    CreateOnlyNonNetscapePlugins,
+enum class CreatePlugins {
+    No,
+    Yes,
 };
 
 // Base class for HTMLAppletElement, HTMLEmbedElement, and HTMLObjectElement.
@@ -47,7 +47,7 @@ public:
 
     void setDisplayState(DisplayState) override;
 
-    virtual void updateWidget(PluginCreationOption) = 0;
+    virtual void updateWidget(CreatePlugins) = 0;
 
     const String& serviceType() const { return m_serviceType; }
     const String& url() const { return m_url; }
@@ -100,7 +100,7 @@ protected:
     HTMLImageLoader* imageLoader() { return m_imageLoader.get(); }
 
     bool allowedToLoadFrameURL(const String& url);
-    bool wouldLoadAsNetscapePlugin(const String& url, const String& serviceType);
+    bool wouldLoadAsPlugIn(const String& url, const String& serviceType);
 
     String m_serviceType;
     String m_url;
index 8c89621..936ac48 100644 (file)
@@ -390,7 +390,7 @@ public:
     void recreatePlugin(Widget*) override;
     PassRefPtr<Widget> createJavaAppletWidget(const IntSize&, HTMLAppletElement*, const URL&, const Vector<String>&, const Vector<String>&) override;
 
-    ObjectContentType objectContentType(const URL&, const String&) override { return ObjectContentType(); }
+    ObjectContentType objectContentType(const URL&, const String&) override { return ObjectContentType::None; }
     String overrideMediaType() const override { return String(); }
 
     void redirectDataToPlugin(Widget*) override { }
index 538b2b0..1bbed97 100644 (file)
@@ -81,12 +81,11 @@ enum ClearProvisionalItemPolicy {
     ShouldNotClearProvisionalItem
 };
 
-enum ObjectContentType {
-    ObjectContentNone,
-    ObjectContentImage,
-    ObjectContentFrame,
-    ObjectContentNetscapePlugin,
-    ObjectContentOtherPlugin
+enum class ObjectContentType {
+    None,
+    Image,
+    Frame,
+    PlugIn,
 };
 
 enum UnloadEventPolicy {
index 08a84a4..4a7e558 100644 (file)
@@ -375,9 +375,9 @@ bool SubframeLoader::shouldUsePlugin(const URL& url, const String& mimeType, boo
     ObjectContentType objectType = m_frame.loader().client().objectContentType(url, mimeType);
     // If an object's content can't be handled and it has no fallback, let
     // it be handled as a plugin to show the broken plugin icon.
-    useFallback = objectType == ObjectContentNone && hasFallback;
+    useFallback = objectType == ObjectContentType::None && hasFallback;
 
-    return objectType == ObjectContentNone || objectType == ObjectContentNetscapePlugin || objectType == ObjectContentOtherPlugin;
+    return objectType == ObjectContentType::None || objectType == ObjectContentType::PlugIn;
 }
 
 Document* SubframeLoader::document() const
index d7a5cff..e15059a 100644 (file)
@@ -3126,7 +3126,7 @@ void FrameView::updateEmbeddedObject(RenderEmbeddedObject& embeddedObject)
             return;
         }
         if (pluginElement.needsWidgetUpdate())
-            pluginElement.updateWidget(CreateAnyWidgetType);
+            pluginElement.updateWidget(CreatePlugins::Yes);
     } else
         ASSERT_NOT_REACHED();
 
index b9c1acb..2bcb3e0 100644 (file)
@@ -1,3 +1,13 @@
+2016-08-09  Anders Carlsson  <andersca@apple.com>
+
+        Instantiate WebKit plug-ins at layout time, instead of at style resolution time
+        https://bugs.webkit.org/show_bug.cgi?id=160715
+
+        Reviewed by Tim Horton.
+
+        * WebCoreSupport/WebFrameLoaderClient.mm:
+        (WebFrameLoaderClient::objectContentType):
+
 2016-08-09  George Ruan  <gruan@apple.com>
 
         Implement functionality of media capture on iOS
index 9c48ed7..ecf2f50 100644 (file)
@@ -1662,51 +1662,33 @@ ObjectContentType WebFrameLoaderClient::objectContentType(const URL& url, const
             type = [[NSURLFileTypeMappings sharedMappings] MIMETypeForExtension:extension];
             if (type.isEmpty()) {
                 // If no MIME type is specified, use a plug-in if we have one that can handle the extension.
-                if (WebBasePluginPackage *package = [getWebView(m_webFrame.get()) _pluginForExtension:extension]) {
-                    if ([package isKindOfClass:[WebPluginPackage class]]) 
-                        return ObjectContentOtherPlugin;
-#if ENABLE(NETSCAPE_PLUGIN_API)
-                    else {
-                        ASSERT([package isKindOfClass:[WebNetscapePluginPackage class]]);
-                        return ObjectContentNetscapePlugin;
-                    }
-#endif
-                }
+                if ([getWebView(m_webFrame.get()) _pluginForExtension:extension])
+                    return ObjectContentType::PlugIn;
             }
         }
     }
 
     if (type.isEmpty())
-        return ObjectContentFrame; // Go ahead and hope that we can display the content.
+        return ObjectContentType::Frame; // Go ahead and hope that we can display the content.
+
+    ObjectContentType plugInType = ObjectContentType::None;
+    if ([getWebView(m_webFrame.get()) _pluginForMIMEType:type])
+        plugInType = ObjectContentType::PlugIn;
 
-    WebBasePluginPackage *package = [getWebView(m_webFrame.get()) _pluginForMIMEType:type];
-    ObjectContentType plugInType = ObjectContentNone;
-    if (package) {
-#if ENABLE(NETSCAPE_PLUGIN_API)
-        if ([package isKindOfClass:[WebNetscapePluginPackage class]])
-            plugInType = ObjectContentNetscapePlugin;
-        else
-#endif
-        {
-            ASSERT([package isKindOfClass:[WebPluginPackage class]]);
-            plugInType = ObjectContentOtherPlugin;
-        }
-    }
-    
     if (MIMETypeRegistry::isSupportedImageMIMEType(type))
-        return ObjectContentImage;
+        return ObjectContentType::Image;
 
-    if (plugInType != ObjectContentNone)
+    if (plugInType != ObjectContentType::None)
         return plugInType;
 
     if ([m_webFrame->_private->webFrameView _viewClassForMIMEType:type])
-        return ObjectContentFrame;
+        return ObjectContentType::Frame;
     
-    return ObjectContentNone;
+    return ObjectContentType::None;
 
     END_BLOCK_OBJC_EXCEPTIONS;
 
-    return ObjectContentNone;
+    return ObjectContentType::None;
 }
 
 static NSMutableArray* kit(const Vector<String>& vector)
index fb2cde9..54e4b01 100644 (file)
@@ -1,3 +1,13 @@
+2016-08-09  Anders Carlsson  <andersca@apple.com>
+
+        Instantiate WebKit plug-ins at layout time, instead of at style resolution time
+        https://bugs.webkit.org/show_bug.cgi?id=160715
+
+        Reviewed by Tim Horton.
+
+        * WebCoreSupport/WebFrameLoaderClient.cpp:
+        (WebFrameLoaderClient::objectContentType):
+
 2016-08-09  Per Arne Vollan  <pvollan@apple.com>
 
         [Win] Crash in MiniBrowser.
index df2d162..c6e3344 100644 (file)
@@ -1070,20 +1070,20 @@ ObjectContentType WebFrameLoaderClient::objectContentType(const URL& url, const
     }
 
     if (mimeType.isEmpty())
-        return ObjectContentFrame; // Go ahead and hope that we can display the content.
+        return ObjectContentType::Frame; // Go ahead and hope that we can display the content.
 
     bool plugInSupportsMIMEType = PluginDatabase::installedPlugins()->isMIMETypeRegistered(mimeType);
 
     if (MIMETypeRegistry::isSupportedImageMIMEType(mimeType))
-        return WebCore::ObjectContentImage;
+        return WebCore::ObjectContentType::Image;
 
     if (plugInSupportsMIMEType)
-        return WebCore::ObjectContentNetscapePlugin;
+        return WebCore::ObjectContentType::PlugIn;
 
     if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType))
-        return WebCore::ObjectContentFrame;
+        return WebCore::ObjectContentType::Frame;
 
-    return WebCore::ObjectContentNone;
+    return WebCore::ObjectContentType::None;
 }
 
 void WebFrameLoaderClient::dispatchDidFailToStartPlugin(const PluginView* pluginView) const
index ebd9d9c..72a033c 100644 (file)
@@ -1,3 +1,13 @@
+2016-08-09  Anders Carlsson  <andersca@apple.com>
+
+        Instantiate WebKit plug-ins at layout time, instead of at style resolution time
+        https://bugs.webkit.org/show_bug.cgi?id=160715
+
+        Reviewed by Tim Horton.
+
+        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+        (WebKit::WebFrameLoaderClient::objectContentType):
+
 2016-08-09  Brady Eidson  <beidson@apple.com>
 
         [WK2] Only send gamepad input events to the currently focused page.
index 90800a9..5f76bc9 100644 (file)
@@ -1523,7 +1523,7 @@ ObjectContentType WebFrameLoaderClient::objectContentType(const URL& url, const
         String path = url.path();
         auto dotPosition = path.reverseFind('.');
         if (dotPosition == notFound)
-            return ObjectContentFrame;
+            return ObjectContentType::Frame;
         String extension = path.substring(dotPosition + 1).convertToASCIILowercase();
 
         // Try to guess the MIME type from the extension.
@@ -1532,32 +1532,32 @@ ObjectContentType WebFrameLoaderClient::objectContentType(const URL& url, const
             // Check if there's a plug-in around that can handle the extension.
             if (WebPage* webPage = m_frame->page()) {
                 if (pluginSupportsExtension(webPage->corePage()->pluginData(), extension))
-                    return ObjectContentNetscapePlugin;
+                    return ObjectContentType::PlugIn;
             }
-            return ObjectContentFrame;
+            return ObjectContentType::Frame;
         }
     }
 
     if (MIMETypeRegistry::isSupportedImageMIMEType(mimeType))
-        return ObjectContentImage;
+        return ObjectContentType::Image;
 
     if (WebPage* webPage = m_frame->page()) {
         auto allowedPluginTypes = webFrame()->coreFrame()->loader().subframeLoader().allowPlugins()
             ? PluginData::AllPlugins : PluginData::OnlyApplicationPlugins;
         if (webPage->corePage()->pluginData().supportsMimeType(mimeType, allowedPluginTypes))
-            return ObjectContentNetscapePlugin;
+            return ObjectContentType::PlugIn;
     }
 
     if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType))
-        return ObjectContentFrame;
+        return ObjectContentType::Frame;
 
 #if PLATFORM(IOS)
     // iOS can render PDF in <object>/<embed> via PDFDocumentImage.
     if (MIMETypeRegistry::isPDFOrPostScriptMIMEType(mimeType))
-        return ObjectContentImage;
+        return ObjectContentType::Image;
 #endif
 
-    return ObjectContentNone;
+    return ObjectContentType::None;
 }
 
 String WebFrameLoaderClient::overrideMediaType() const