Enable Chromium media player to instantiate a plugin
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 4 Jun 2012 19:03:02 +0000 (19:03 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 4 Jun 2012 19:03:02 +0000 (19:03 +0000)
https://bugs.webkit.org/show_bug.cgi?id=87399

Patch by David Dorwin <ddorwin@chromium.org> on 2012-06-04
Reviewed by Kent Tamura.

Adds WebHelperPlugin, an off-screen widget that contains an <object> tag.

Source/WebKit/chromium:

* WebKit.gyp:
* public/WebHelperPlugin.h: Copied from Source/WebKit/chromium/public/WebPopupType.h.
(WebKit):
(WebHelperPlugin):
(WebKit::WebHelperPlugin::~WebHelperPlugin):
* public/WebMediaPlayerClient.h:
(WebKit):
* public/WebPopupType.h:
* public/WebView.h:
* public/WebViewClient.h:
(WebKit):
(WebViewClient):
(WebKit::WebViewClient::initializeHelperPluginWebFrame):
* src/WebFrameImpl.cpp:
(WebKit::WebFrameImpl::WebFrameImpl):
(WebKit::WebFrameImpl::initializeAsMainFrame):
* src/WebFrameImpl.h:
(WebFrameImpl):
* src/WebHelperPluginImpl.cpp: Added.
(WebKit):
(WebKit::addString):
(WebKit::writeDocument):
(HelperPluginChromeClient):
(WebKit::HelperPluginChromeClient::HelperPluginChromeClient):
(WebKit::WebHelperPluginImpl::WebHelperPluginImpl):
(WebKit::WebHelperPluginImpl::~WebHelperPluginImpl):
(WebKit::WebHelperPluginImpl::init):
(WebKit::WebHelperPluginImpl::initializeFrame):
(WebKit::WebHelperPluginImpl::initPage):
(WebKit::WebHelperPluginImpl::setCompositorSurfaceReady):
(WebKit::WebHelperPluginImpl::composite):
(WebKit::WebHelperPluginImpl::layout):
(WebKit::WebHelperPluginImpl::setFocus):
(WebKit::WebHelperPluginImpl::close):
(WebKit::WebHelperPluginImpl::closeHelperPlugin):
(WebKit::WebHelperPlugin::create):
* src/WebHelperPluginImpl.h: Copied from Source/WebKit/chromium/public/WebPopupType.h.
(WebCore):
(WebKit):
(WebHelperPluginImpl):
* src/WebMediaPlayerClientImpl.cpp:
(WebKit::WebMediaPlayerClientImpl::~WebMediaPlayerClientImpl):
(WebKit::WebMediaPlayerClientImpl::createHelperPlugin):
(WebKit):
(WebKit::WebMediaPlayerClientImpl::closeHelperPlugin):
* src/WebMediaPlayerClientImpl.h:
(WebKit):
(WebMediaPlayerClientImpl):
* src/WebViewImpl.cpp:
(WebKit::WebViewImpl::initializeMainFrame):
(WebKit::WebViewImpl::initializeHelperPluginFrame):
(WebKit):
(WebKit::WebViewImpl::createHelperPlugin):
* src/WebViewImpl.h:
(WebKit):
(WebViewImpl):

Tools:

* DumpRenderTree/chromium/WebViewHost.cpp:
(WebViewHost::createPopupMenu):

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

17 files changed:
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/WebKit.gyp
Source/WebKit/chromium/public/WebHelperPlugin.h [new file with mode: 0644]
Source/WebKit/chromium/public/WebMediaPlayerClient.h
Source/WebKit/chromium/public/WebPopupType.h
Source/WebKit/chromium/public/WebView.h
Source/WebKit/chromium/public/WebViewClient.h
Source/WebKit/chromium/src/WebFrameImpl.cpp
Source/WebKit/chromium/src/WebFrameImpl.h
Source/WebKit/chromium/src/WebHelperPluginImpl.cpp [new file with mode: 0644]
Source/WebKit/chromium/src/WebHelperPluginImpl.h [new file with mode: 0644]
Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp
Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h
Source/WebKit/chromium/src/WebViewImpl.cpp
Source/WebKit/chromium/src/WebViewImpl.h
Tools/ChangeLog
Tools/DumpRenderTree/chromium/WebViewHost.cpp

index 3c82dbe..b80c857 100644 (file)
@@ -1,3 +1,69 @@
+2012-06-04  David Dorwin  <ddorwin@chromium.org>
+
+        Enable Chromium media player to instantiate a plugin
+        https://bugs.webkit.org/show_bug.cgi?id=87399
+
+        Reviewed by Kent Tamura.
+
+        Adds WebHelperPlugin, an off-screen widget that contains an <object> tag.
+
+        * WebKit.gyp:
+        * public/WebHelperPlugin.h: Copied from Source/WebKit/chromium/public/WebPopupType.h.
+        (WebKit):
+        (WebHelperPlugin):
+        (WebKit::WebHelperPlugin::~WebHelperPlugin):
+        * public/WebMediaPlayerClient.h:
+        (WebKit):
+        * public/WebPopupType.h:
+        * public/WebView.h:
+        * public/WebViewClient.h:
+        (WebKit):
+        (WebViewClient):
+        (WebKit::WebViewClient::initializeHelperPluginWebFrame):
+        * src/WebFrameImpl.cpp:
+        (WebKit::WebFrameImpl::WebFrameImpl):
+        (WebKit::WebFrameImpl::initializeAsMainFrame):
+        * src/WebFrameImpl.h:
+        (WebFrameImpl):
+        * src/WebHelperPluginImpl.cpp: Added.
+        (WebKit):
+        (WebKit::addString):
+        (WebKit::writeDocument):
+        (HelperPluginChromeClient):
+        (WebKit::HelperPluginChromeClient::HelperPluginChromeClient):
+        (WebKit::WebHelperPluginImpl::WebHelperPluginImpl):
+        (WebKit::WebHelperPluginImpl::~WebHelperPluginImpl):
+        (WebKit::WebHelperPluginImpl::init):
+        (WebKit::WebHelperPluginImpl::initializeFrame):
+        (WebKit::WebHelperPluginImpl::initPage):
+        (WebKit::WebHelperPluginImpl::setCompositorSurfaceReady):
+        (WebKit::WebHelperPluginImpl::composite):
+        (WebKit::WebHelperPluginImpl::layout):
+        (WebKit::WebHelperPluginImpl::setFocus):
+        (WebKit::WebHelperPluginImpl::close):
+        (WebKit::WebHelperPluginImpl::closeHelperPlugin):
+        (WebKit::WebHelperPlugin::create):
+        * src/WebHelperPluginImpl.h: Copied from Source/WebKit/chromium/public/WebPopupType.h.
+        (WebCore):
+        (WebKit):
+        (WebHelperPluginImpl):
+        * src/WebMediaPlayerClientImpl.cpp:
+        (WebKit::WebMediaPlayerClientImpl::~WebMediaPlayerClientImpl):
+        (WebKit::WebMediaPlayerClientImpl::createHelperPlugin):
+        (WebKit):
+        (WebKit::WebMediaPlayerClientImpl::closeHelperPlugin):
+        * src/WebMediaPlayerClientImpl.h:
+        (WebKit):
+        (WebMediaPlayerClientImpl):
+        * src/WebViewImpl.cpp:
+        (WebKit::WebViewImpl::initializeMainFrame):
+        (WebKit::WebViewImpl::initializeHelperPluginFrame):
+        (WebKit):
+        (WebKit::WebViewImpl::createHelperPlugin):
+        * src/WebViewImpl.h:
+        (WebKit):
+        (WebViewImpl):
+
 2012-06-04  Raymes Khoury  <raymes@chromium.org>
 
         Remove obsolete acceptMIMETypes member.
index dc155c9..baacf40 100644 (file)
                 'public/WebGeolocationPermissionRequestManager.h',
                 'public/WebGeolocationPosition.h',
                 'public/WebGlyphCache.h',
+                'public/WebHelperPlugin.h',
                 'public/WebHistoryItem.h',
                 'public/WebHitTestResult.h',
                 'public/WebIDBCallbacks.h',
                 'src/GraphicsContext3DChromium.cpp',
                 'src/GraphicsContext3DPrivate.h',
                 'src/gtk/WebInputEventFactory.cpp',
+                'src/WebHelperPluginImpl.cpp',
+                'src/WebHelperPluginImpl.h',
                 'src/IDBCallbacksProxy.cpp',
                 'src/IDBCallbacksProxy.h',
                 'src/IDBCursorBackendProxy.cpp',
diff --git a/Source/WebKit/chromium/public/WebHelperPlugin.h b/Source/WebKit/chromium/public/WebHelperPlugin.h
new file mode 100644 (file)
index 0000000..b6cc17d
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebHelperPlugin_h
+#define WebHelperPlugin_h
+
+#include "WebWidget.h"
+#include "platform/WebCommon.h"
+
+namespace WebKit {
+
+class WebFrameClient;
+class WebWidgetClient;
+
+class WebHelperPlugin : public WebWidget {
+public:
+    WEBKIT_EXPORT static WebHelperPlugin* create(WebWidgetClient*);
+
+    virtual void initializeFrame(WebFrameClient*) = 0;
+
+protected:
+    ~WebHelperPlugin() { }
+};
+
+} // namespace WebKit
+
+#endif
index 786bf5a..a46ee5c 100644 (file)
@@ -35,6 +35,7 @@
 
 namespace WebKit {
 
+class WebFrame;
 class WebRequest;
 class WebURL;
 
@@ -75,6 +76,8 @@ public:
     virtual void keyError(const WebString&, const WebString&, MediaKeyErrorCode, unsigned short systemCode) = 0;
     virtual void keyMessage(const WebString&, const WebString&, const unsigned char*, unsigned) = 0;
     virtual void keyNeeded(const WebString&, const WebString&, const unsigned char* initData, unsigned initDataLength) = 0;
+    virtual void createHelperPlugin(const WebString& pluginType, WebFrame*) = 0;
+    virtual void closeHelperPlugin() = 0;
     virtual void disableAcceleratedCompositing() = 0;
 protected:
     ~WebMediaPlayerClient() { }
index 2d0e8e4..1a84dd6 100644 (file)
@@ -38,6 +38,7 @@ enum WebPopupType {
     WebPopupTypeSelect, // An HTML select (combo-box) popup.
     WebPopupTypeSuggestion, // An autofill/autocomplete popup.
     WebPopupTypePage, // An HTML-capable popup.
+    WebPopupTypeHelperPlugin, // An off-screen helper plugin.
 };
 
 } // namespace WebKit
index 0f7093a..542b102 100644 (file)
@@ -103,6 +103,8 @@ public:
     // child frames.  It is valid to pass a null WebFrameClient pointer.
     virtual void initializeMainFrame(WebFrameClient*) = 0;
 
+    virtual void initializeHelperPluginFrame(WebFrameClient*) = 0;
+
     // Initializes the various client interfaces.
     virtual void setAutofillClient(WebAutofillClient*) = 0;
     virtual void setDevToolsAgentClient(WebDevToolsAgentClient*) = 0;
index 9a8ad05..9b39da7 100644 (file)
@@ -60,6 +60,7 @@ class WebFileChooserCompletion;
 class WebFrame;
 class WebGeolocationClient;
 class WebGeolocationService;
+class WebHelperPlugin;
 class WebIconLoadingCompletion;
 class WebImage;
 class WebInputElement;
@@ -144,6 +145,10 @@ public:
     // will never be called.
     virtual bool enumerateChosenDirectory(const WebString& path, WebFileChooserCompletion*) { return false; }
 
+    // Creates the main WebFrame for the specified WebHelperPlugin.
+    // Called by WebHelperPlugin to provide the WebFrameClient interface for the WebFrame.
+    virtual void initializeHelperPluginWebFrame(WebHelperPlugin*) { }
+
 
     // Navigational --------------------------------------------------------
 
index fadb8c0..73bf3fa 100644 (file)
@@ -2023,6 +2023,7 @@ PassRefPtr<WebFrameImpl> WebFrameImpl::create(WebFrameClient* client)
 WebFrameImpl::WebFrameImpl(WebFrameClient* client)
     : m_frameLoaderClient(this)
     , m_client(client)
+    , m_frame(0)
     , m_currentActiveMatchFrame(0)
     , m_activeMatchIndexInCurrentFrame(-1)
     , m_locatingActiveRect(false)
@@ -2048,9 +2049,9 @@ WebFrameImpl::~WebFrameImpl()
     cancelPendingScopingEffort();
 }
 
-void WebFrameImpl::initializeAsMainFrame(WebViewImpl* webViewImpl)
+void WebFrameImpl::initializeAsMainFrame(WebCore::Page* page)
 {
-    RefPtr<Frame> frame = Frame::create(webViewImpl->page(), 0, &m_frameLoaderClient);
+    RefPtr<Frame> frame = Frame::create(page, 0, &m_frameLoaderClient);
     m_frame = frame.get();
 
     // Add reference on behalf of FrameLoader.  See comments in
index d8ae6dc..0146bd5 100644 (file)
@@ -235,8 +235,8 @@ public:
     static PassRefPtr<WebFrameImpl> create(WebFrameClient* client);
     virtual ~WebFrameImpl();
 
-    // Called by the WebViewImpl to initialize its main frame:
-    void initializeAsMainFrame(WebViewImpl*);
+    // Called by the WebViewImpl to initialize the main frame for the page.
+    void initializeAsMainFrame(WebCore::Page*);
 
     PassRefPtr<WebCore::Frame> createChildFrame(
         const WebCore::FrameLoadRequest&, WebCore::HTMLFrameOwnerElement*);
diff --git a/Source/WebKit/chromium/src/WebHelperPluginImpl.cpp b/Source/WebKit/chromium/src/WebHelperPluginImpl.cpp
new file mode 100644 (file)
index 0000000..d308bd8
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WebHelperPluginImpl.h"
+
+#include "EmptyClients.h"
+#include "FocusController.h"
+#include "FrameView.h"
+#include "Page.h"
+#include "PageWidgetDelegate.h"
+#include "Settings.h"
+#include "WebFrameImpl.h"
+#include "WebViewClient.h"
+#include "WebViewImpl.h"
+#include "WebWidgetClient.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+#define addLiteral(literal, writer)    writer.addData(literal, sizeof(literal) - 1)
+
+static inline void addString(const String& str, DocumentWriter& writer)
+{
+    CString str8 = str.utf8();
+    writer.addData(str8.data(), str8.length());
+}
+
+void writeDocument(WebCore::DocumentWriter& writer, const String& pluginType)
+{
+    writer.setMIMEType("text/html");
+    writer.setEncoding("UTF-8", false);
+    writer.begin();
+
+    addLiteral("<!DOCTYPE html><head><meta charset='UTF-8'></head><body>\n", writer);
+    String objectTag = "<object type=\"" + pluginType + "\"></object>";
+    addString(objectTag, writer);
+    addLiteral("</body>\n", writer);
+
+    writer.end();
+}
+
+class HelperPluginChromeClient : public EmptyChromeClient {
+    WTF_MAKE_NONCOPYABLE(HelperPluginChromeClient);
+    WTF_MAKE_FAST_ALLOCATED;
+
+public:
+    explicit HelperPluginChromeClient(WebHelperPluginImpl* widget)
+        : m_widget(widget)
+    {
+        ASSERT(m_widget->m_widgetClient);
+    }
+
+private:
+    virtual void closeWindowSoon() OVERRIDE
+    {
+        m_widget->closeHelperPlugin();
+    }
+
+    virtual void* webView() const OVERRIDE
+    {
+        return m_widget->m_webView;
+    }
+
+    WebHelperPluginImpl* m_widget;
+};
+
+// WebHelperPluginImpl ----------------------------------------------------------------
+
+WebHelperPluginImpl::WebHelperPluginImpl(WebWidgetClient* client)
+    : m_widgetClient(client)
+{
+    ASSERT(client);
+}
+
+WebHelperPluginImpl::~WebHelperPluginImpl()
+{
+    ASSERT(!m_page);
+}
+
+bool WebHelperPluginImpl::init(WebViewImpl* webView, const String& pluginType)
+{
+    ASSERT(webView);
+    m_webView = webView;
+
+    if (!initPage(webView, pluginType))
+        return false;
+    m_widgetClient->show(WebNavigationPolicy());
+
+    setFocus(true);
+
+    return true;
+}
+
+void WebHelperPluginImpl::closeHelperPlugin()
+{
+    if (m_page) {
+        m_page->setGroupName(String());
+        m_page->mainFrame()->loader()->stopAllLoaders();
+        m_page->mainFrame()->loader()->stopLoading(UnloadEventPolicyNone);
+    }
+    // m_widgetClient might be 0 because this widget might be already closed.
+    if (m_widgetClient) {
+        // closeWidgetSoon() will call this->close() later.
+        m_widgetClient->closeWidgetSoon();
+    }
+}
+
+void WebHelperPluginImpl::initializeFrame(WebFrameClient* client)
+{
+    ASSERT(m_page);
+    RefPtr<WebFrameImpl> frame = WebFrameImpl::create(client);
+    frame->initializeAsMainFrame(m_page.get());
+}
+
+bool WebHelperPluginImpl::initPage(WebKit::WebViewImpl* webView, const String& pluginType)
+{
+    Page::PageClients pageClients;
+    fillWithEmptyClients(pageClients);
+    m_chromeClient = adoptPtr(new HelperPluginChromeClient(this));
+    pageClients.chromeClient = m_chromeClient.get();
+
+    m_page = adoptPtr(new Page(pageClients));
+    // Scripting must be enabled in ScriptController::windowScriptNPObject().
+    m_page->settings()->setScriptEnabled(true);
+    m_page->settings()->setPluginsEnabled(true);
+
+    webView->client()->initializeHelperPluginWebFrame(this);
+
+    // The page's main frame was set in initializeMainFrame() as a result of the above call.
+    Frame* frame = m_page->mainFrame();
+    ASSERT(frame);
+    frame->setView(FrameView::create(frame));
+    // No need to set a size or make it not transparent.
+
+    DocumentWriter* writer = frame->loader()->activeDocumentLoader()->writer();
+    writeDocument(*writer, pluginType);
+
+    return true;
+}
+
+void WebHelperPluginImpl::setCompositorSurfaceReady()
+{
+}
+
+void WebHelperPluginImpl::composite(bool)
+{
+}
+
+void WebHelperPluginImpl::layout()
+{
+    PageWidgetDelegate::layout(m_page.get());
+}
+
+void WebHelperPluginImpl::setFocus(bool enable)
+{
+    if (!m_page)
+        return;
+    m_page->focusController()->setFocused(enable);
+    if (enable)
+        m_page->focusController()->setActive(true);
+}
+
+void WebHelperPluginImpl::close()
+{
+    m_page.clear();
+    m_widgetClient = 0;
+    deref();
+}
+
+// WebHelperPlugin ----------------------------------------------------------------
+
+WebHelperPlugin* WebHelperPlugin::create(WebWidgetClient* client)
+{
+    if (!client)
+        CRASH();
+    // A WebHelperPluginImpl instance usually has two references.
+    //  - One owned by the instance itself. It represents the visible widget.
+    //  - One owned by a WebViewImpl. It's released when the WebViewImpl ask the
+    //    WebHelperPluginImpl to close.
+    // We need them because the closing operation is asynchronous and the widget
+    // can be closed while the WebViewImpl is unaware of it.
+    return adoptRef(new WebHelperPluginImpl(client)).leakRef();
+}
+
+} // namespace WebKit
diff --git a/Source/WebKit/chromium/src/WebHelperPluginImpl.h b/Source/WebKit/chromium/src/WebHelperPluginImpl.h
new file mode 100644 (file)
index 0000000..6bdd335
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebHelperPluginImpl_h
+#define WebHelperPluginImpl_h
+
+#include "WebHelperPlugin.h"
+#include <wtf/OwnPtr.h>
+#include <wtf/RefCounted.h>
+
+namespace WebCore {
+class Page;
+}
+
+namespace WebKit {
+
+class HelperPluginChromeClient;
+class WebFrameImpl;
+class WebViewImpl;
+class WebWidgetClient;
+
+// Hosts a simple page that instantiates a plugin using an <object> tag.
+// The widget is offscreen, and the plugin will not receive painting, resize, etc. events.
+class WebHelperPluginImpl : public WebHelperPlugin,
+                            public RefCounted<WebHelperPluginImpl> {
+    WTF_MAKE_NONCOPYABLE(WebHelperPluginImpl);
+    WTF_MAKE_FAST_ALLOCATED;
+
+public:
+    virtual ~WebHelperPluginImpl();
+    bool init(WebViewImpl*, const String& pluginType);
+    void closeHelperPlugin();
+
+    // WebHelperPlugin methods:
+    virtual void initializeFrame(WebFrameClient*) OVERRIDE;
+
+private:
+    explicit WebHelperPluginImpl(WebWidgetClient*);
+    bool initPage(WebKit::WebViewImpl*, const String& pluginType);
+
+    // WebWidget methods:
+    virtual void setCompositorSurfaceReady() OVERRIDE;
+    virtual void composite(bool) OVERRIDE;
+    virtual void layout() OVERRIDE;
+    virtual void setFocus(bool) OVERRIDE;
+    virtual void close() OVERRIDE;
+
+    WebWidgetClient* m_widgetClient;
+    WebViewImpl* m_webView;
+    OwnPtr<WebCore::Page> m_page;
+    OwnPtr<HelperPluginChromeClient> m_chromeClient;
+
+    friend class WebHelperPlugin;
+    friend class HelperPluginChromeClient;
+};
+
+} // namespace WebKit
+
+#endif // WebHelperPluginImpl_h
index 44e51cd..40be4d6 100644 (file)
@@ -23,6 +23,7 @@
 #include "WebAudioSourceProvider.h"
 #include "WebFrameClient.h"
 #include "WebFrameImpl.h"
+#include "WebHelperPluginImpl.h"
 #include "WebKit.h"
 #include "WebMediaPlayer.h"
 #include "WebViewImpl.h"
@@ -96,6 +97,8 @@ WebMediaPlayerClientImpl::~WebMediaPlayerClientImpl()
     if (m_webMediaPlayer)
         m_webMediaPlayer->setStreamTextureClient(0);
 #endif
+    if (m_helperPlugin)
+        closeHelperPlugin();
 }
 
 void WebMediaPlayerClientImpl::networkStateChanged()
@@ -265,6 +268,20 @@ void WebMediaPlayerClientImpl::keyNeeded(const WebString& keySystem, const WebSt
 #endif
 }
 
+void WebMediaPlayerClientImpl::createHelperPlugin(const WebString& pluginType, WebFrame* frame)
+{
+    ASSERT(!m_helperPlugin);
+    WebViewImpl* webView = static_cast<WebViewImpl*>(frame->view());
+    m_helperPlugin = webView->createHelperPlugin(pluginType);
+}
+
+void WebMediaPlayerClientImpl::closeHelperPlugin()
+{
+    ASSERT(m_helperPlugin);
+    m_helperPlugin->closeHelperPlugin();
+    m_helperPlugin = 0;
+}
+
 void WebMediaPlayerClientImpl::disableAcceleratedCompositing()
 {
     m_supportsAcceleratedCompositing = false;
index 0888d5e..902ddc8 100644 (file)
@@ -47,6 +47,7 @@ namespace WebCore { class AudioSourceProviderClient; }
 
 namespace WebKit {
 
+class WebHelperPluginImpl;
 class WebAudioSourceProvider;
 class WebMediaPlayer;
 
@@ -89,6 +90,8 @@ public:
     virtual void keyError(const WebString& keySystem, const WebString& sessionId, MediaKeyErrorCode, unsigned short systemCode);
     virtual void keyMessage(const WebString& keySystem, const WebString& sessionId, const unsigned char* message, unsigned messageLength);
     virtual void keyNeeded(const WebString& keySystem, const WebString& sessionId, const unsigned char* initData, unsigned initDataLength);
+    virtual void createHelperPlugin(const WebString& pluginType, WebFrame*);
+    virtual void closeHelperPlugin();
     virtual void disableAcceleratedCompositing();
 
     // MediaPlayerPrivateInterface methods:
@@ -198,6 +201,7 @@ private:
     String m_url;
     bool m_delayingLoad;
     WebCore::MediaPlayer::Preload m_preload;
+    RefPtr<WebHelperPluginImpl> m_helperPlugin;
 #if USE(ACCELERATED_COMPOSITING)
     WebVideoLayer m_videoLayer;
     bool m_supportsAcceleratedCompositing;
index 5abcd16..91c3029 100644 (file)
 #include "WebDevToolsAgentImpl.h"
 #include "WebDevToolsAgentPrivate.h"
 #include "WebFrameImpl.h"
+#include "WebHelperPluginImpl.h"
 #include "WebInputElement.h"
 #include "WebInputEvent.h"
 #include "WebInputEventConversion.h"
@@ -308,13 +309,18 @@ void WebViewImpl::initializeMainFrame(WebFrameClient* frameClient)
     // and releases that reference once the corresponding Frame is destroyed.
     RefPtr<WebFrameImpl> frame = WebFrameImpl::create(frameClient);
 
-    frame->initializeAsMainFrame(this);
+    frame->initializeAsMainFrame(page());
 
     // Restrict the access to the local file system
     // (see WebView.mm WebView::_commonInitializationWithFrameName).
     SecurityPolicy::setLocalLoadPolicy(SecurityPolicy::AllowLocalLoadsForLocalOnly);
 }
 
+void WebViewImpl::initializeHelperPluginFrame(WebFrameClient* client)
+{
+    RefPtr<WebFrameImpl> frame = WebFrameImpl::create(client);
+}
+
 void WebViewImpl::setAutofillClient(WebAutofillClient* autofillClient)
 {
     m_autofillClient = autofillClient;
@@ -1266,6 +1272,19 @@ void WebViewImpl::hideAutofillPopup()
     }
 }
 
+WebHelperPluginImpl* WebViewImpl::createHelperPlugin(const String& pluginType)
+{
+    WebWidget* popupWidget = m_client->createPopupMenu(WebPopupTypeHelperPlugin);
+    ASSERT(popupWidget);
+    WebHelperPluginImpl* helperPlugin = static_cast<WebHelperPluginImpl*>(popupWidget);
+
+    if (!helperPlugin->init(this, pluginType)) {
+        helperPlugin->closeHelperPlugin();
+        helperPlugin = 0;
+    }
+    return helperPlugin;
+}
+
 Frame* WebViewImpl::focusedWebCoreFrame() const
 {
     return m_page ? m_page->focusController()->focusedOrMainFrame() : 0;
index 67562fe..a088967 100644 (file)
@@ -90,6 +90,7 @@ class ContextMenuClientImpl;
 class DeviceOrientationClientProxy;
 class DragScrollTimer;
 class GeolocationClientProxy;
+class WebHelperPluginImpl;
 class NonCompositedContentHost;
 class PrerendererClientImpl;
 class SpeechInputClientImpl;
@@ -162,6 +163,7 @@ public:
 
     // WebView methods:
     virtual void initializeMainFrame(WebFrameClient*);
+    virtual void initializeHelperPluginFrame(WebFrameClient*);
     virtual void setAutofillClient(WebAutofillClient*);
     virtual void setDevToolsAgentClient(WebDevToolsAgentClient*);
     virtual void setPermissionClient(WebPermissionClient*);
@@ -488,6 +490,8 @@ public:
 
     void hideAutofillPopup();
 
+    WebHelperPluginImpl* createHelperPlugin(const String& pluginType);
+
     // Returns the input event we're currently processing. This is used in some
     // cases where the WebCore DOM event doesn't have the information we need.
     static const WebInputEvent* currentInputEvent()
index ce58318..a3830f5 100644 (file)
@@ -1,3 +1,15 @@
+2012-06-04  David Dorwin  <ddorwin@chromium.org>
+
+        Enable Chromium media player to instantiate a plugin
+        https://bugs.webkit.org/show_bug.cgi?id=87399
+
+        Reviewed by Kent Tamura.
+
+        Adds WebHelperPlugin, an off-screen widget that contains an <object> tag.
+
+        * DumpRenderTree/chromium/WebViewHost.cpp:
+        (WebViewHost::createPopupMenu):
+
 2012-06-04  Mario Sanchez Prada  <msanchez@igalia.com>
 
         [GTK][WK2] Implement geolocation provider for the GTK port
index 6c48bc1..5f0db7b 100644 (file)
@@ -261,6 +261,7 @@ WebWidget* WebViewHost::createPopupMenu(WebPopupType type)
     switch (type) {
     case WebKit::WebPopupTypeNone:
     case WebKit::WebPopupTypePage:
+    case WebKit::WebPopupTypeHelperPlugin:
         break;
     case WebKit::WebPopupTypeSelect:
     case WebKit::WebPopupTypeSuggestion: