summaryrefslogtreecommitdiffstats
path: root/webkit/glue
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/glue')
-rw-r--r--webkit/glue/plugins/gtk_plugin_container_manager.cc2
-rw-r--r--webkit/glue/plugins/gtk_plugin_container_manager.h5
-rw-r--r--webkit/glue/plugins/mozilla_extensions.cc4
-rw-r--r--webkit/glue/plugins/plugin_instance.h13
-rw-r--r--webkit/glue/plugins/plugin_stream.h6
-rw-r--r--webkit/glue/plugins/plugin_stream_url.h6
-rw-r--r--webkit/glue/plugins/webplugin_delegate_impl.cc15
-rw-r--r--webkit/glue/plugins/webplugin_delegate_impl.h28
-rw-r--r--webkit/glue/plugins/webplugin_delegate_impl_gtk.cc4
-rw-r--r--webkit/glue/plugins/webplugin_delegate_impl_mac.mm6
-rw-r--r--webkit/glue/plugins/webplugin_delegate_impl_win.cc6
-rw-r--r--webkit/glue/webframeloaderclient_impl.cc131
-rw-r--r--webkit/glue/webplugin.h34
-rw-r--r--webkit/glue/webplugin_delegate.cc34
-rw-r--r--webkit/glue/webplugin_delegate.h30
-rw-r--r--webkit/glue/webplugin_impl.cc351
-rw-r--r--webkit/glue/webplugin_impl.h92
-rw-r--r--webkit/glue/webplugin_impl_unittest.cc21
-rw-r--r--webkit/glue/webplugin_page_delegate.h65
-rw-r--r--webkit/glue/webview_delegate.h42
20 files changed, 409 insertions, 486 deletions
diff --git a/webkit/glue/plugins/gtk_plugin_container_manager.cc b/webkit/glue/plugins/gtk_plugin_container_manager.cc
index 4683e08..ecde3fb 100644
--- a/webkit/glue/plugins/gtk_plugin_container_manager.cc
+++ b/webkit/glue/plugins/gtk_plugin_container_manager.cc
@@ -52,7 +52,7 @@ void GtkPluginContainerManager::DestroyPluginContainer(
}
void GtkPluginContainerManager::MovePluginContainer(
- const WebPluginGeometry& move) {
+ const webkit_glue::WebPluginGeometry& move) {
DCHECK(host_widget_);
GtkWidget *widget = MapIDToWidget(move.window);
if (!widget)
diff --git a/webkit/glue/plugins/gtk_plugin_container_manager.h b/webkit/glue/plugins/gtk_plugin_container_manager.h
index 30a6b1a..54ce819 100644
--- a/webkit/glue/plugins/gtk_plugin_container_manager.h
+++ b/webkit/glue/plugins/gtk_plugin_container_manager.h
@@ -11,7 +11,10 @@
#include "base/gfx/native_widget_types.h"
typedef struct _GtkWidget GtkWidget;
+
+namespace webkit_glue {
struct WebPluginGeometry;
+}
// Helper class that creates and manages plugin containers (GtkSocket).
class GtkPluginContainerManager {
@@ -29,7 +32,7 @@ class GtkPluginContainerManager {
// Takes an update from WebKit about a plugin's position and side and moves
// the plugin accordingly.
- void MovePluginContainer(const WebPluginGeometry& move);
+ void MovePluginContainer(const webkit_glue::WebPluginGeometry& move);
private:
// Maps a plugin XID to the corresponding container widget.
diff --git a/webkit/glue/plugins/mozilla_extensions.cc b/webkit/glue/plugins/mozilla_extensions.cc
index 4b1b46e..2ca0a50 100644
--- a/webkit/glue/plugins/mozilla_extensions.cc
+++ b/webkit/glue/plugins/mozilla_extensions.cc
@@ -273,7 +273,7 @@ NS_IMETHODIMP MozillaExtensionApi::GetCookie(
if (!plugin_instance_)
return NS_ERROR_FAILURE;
- WebPlugin* webplugin = plugin_instance_->webplugin();
+ webkit_glue::WebPlugin* webplugin = plugin_instance_->webplugin();
if (!webplugin)
return NS_ERROR_FAILURE;
@@ -306,7 +306,7 @@ NS_IMETHODIMP MozillaExtensionApi::SetCookie(
if (!plugin_instance_)
return NS_ERROR_FAILURE;
- WebPlugin* webplugin = plugin_instance_->webplugin();
+ webkit_glue::WebPlugin* webplugin = plugin_instance_->webplugin();
if (!webplugin)
return NS_ERROR_FAILURE;
diff --git a/webkit/glue/plugins/plugin_instance.h b/webkit/glue/plugins/plugin_instance.h
index 5639211..352dab5 100644
--- a/webkit/glue/plugins/plugin_instance.h
+++ b/webkit/glue/plugins/plugin_instance.h
@@ -21,9 +21,12 @@
#include "googleurl/src/gurl.h"
#include "third_party/npapi/bindings/npapi.h"
-class WebPlugin;
class MessageLoop;
+namespace webkit_glue {
+class WebPlugin;
+}
+
namespace NPAPI
{
class PluginLib;
@@ -88,8 +91,10 @@ class PluginInstance : public base::RefCountedThreadSafe<PluginInstance> {
void set_transparent(bool value) { transparent_ = value; }
// Get/Set the WebPlugin associated with this instance
- WebPlugin* webplugin() { return webplugin_; }
- void set_web_plugin(WebPlugin* webplugin) { webplugin_ = webplugin; }
+ webkit_glue::WebPlugin* webplugin() { return webplugin_; }
+ void set_web_plugin(webkit_glue::WebPlugin* webplugin) {
+ webplugin_ = webplugin;
+ }
// Get the mimeType for this plugin stream
const std::string &mime_type() { return mime_type_; }
@@ -225,7 +230,7 @@ class PluginInstance : public base::RefCountedThreadSafe<PluginInstance> {
gfx::PluginWindowHandle window_handle_;
bool windowless_;
bool transparent_;
- WebPlugin* webplugin_;
+ webkit_glue::WebPlugin* webplugin_;
std::string mime_type_;
GURL get_url_;
intptr_t get_notify_data_;
diff --git a/webkit/glue/plugins/plugin_stream.h b/webkit/glue/plugins/plugin_stream.h
index 80b88c56..97bea1c 100644
--- a/webkit/glue/plugins/plugin_stream.h
+++ b/webkit/glue/plugins/plugin_stream.h
@@ -12,7 +12,9 @@
#include "base/ref_counted.h"
#include "third_party/npapi/bindings/npapi.h"
+namespace webkit_glue {
class WebPluginResourceClient;
+}
namespace NPAPI {
@@ -59,7 +61,9 @@ class PluginStream : public base::RefCounted<PluginStream> {
// Close the stream.
virtual bool Close(NPReason reason);
- virtual WebPluginResourceClient* AsResourceClient() { return NULL; }
+ virtual webkit_glue::WebPluginResourceClient* AsResourceClient() {
+ return NULL;
+ }
// Cancels any HTTP requests initiated by the stream.
virtual void CancelRequest() {}
diff --git a/webkit/glue/plugins/plugin_stream_url.h b/webkit/glue/plugins/plugin_stream_url.h
index 1f5fe57..b4a61c3 100644
--- a/webkit/glue/plugins/plugin_stream_url.h
+++ b/webkit/glue/plugins/plugin_stream_url.h
@@ -16,7 +16,7 @@ class PluginInstance;
// A NPAPI Stream based on a URL.
class PluginStreamUrl : public PluginStream,
- public WebPluginResourceClient {
+ public webkit_glue::WebPluginResourceClient {
public:
// Create a new stream for sending to the plugin by fetching
// a URL. If notifyNeeded is set, then the plugin will be notified
@@ -34,8 +34,8 @@ class PluginStreamUrl : public PluginStream,
// it is still loading.
virtual bool Close(NPReason reason);
- virtual WebPluginResourceClient* AsResourceClient() {
- return static_cast<WebPluginResourceClient*>(this);
+ virtual webkit_glue::WebPluginResourceClient* AsResourceClient() {
+ return static_cast<webkit_glue::WebPluginResourceClient*>(this);
}
virtual void CancelRequest();
diff --git a/webkit/glue/plugins/webplugin_delegate_impl.cc b/webkit/glue/plugins/webplugin_delegate_impl.cc
index 89285b6..078b6cf 100644
--- a/webkit/glue/plugins/webplugin_delegate_impl.cc
+++ b/webkit/glue/plugins/webplugin_delegate_impl.cc
@@ -21,6 +21,9 @@
#include "webkit/glue/plugins/plugin_stream_url.h"
#include "webkit/glue/webkit_glue.h"
+using webkit_glue::WebPlugin;
+using webkit_glue::WebPluginDelegate;
+using webkit_glue::WebPluginResourceClient;
using WebKit::WebCursorInfo;
using WebKit::WebKeyboardEvent;
using WebKit::WebInputEvent;
@@ -30,17 +33,17 @@ WebPluginDelegate* WebPluginDelegate::Create(
const FilePath& filename,
const std::string& mime_type,
gfx::PluginWindowHandle containing_view) {
- scoped_refptr<NPAPI::PluginLib> plugin =
+ scoped_refptr<NPAPI::PluginLib> plugin_lib =
NPAPI::PluginLib::CreatePluginLib(filename);
- if (plugin.get() == NULL)
+ if (plugin_lib.get() == NULL)
return NULL;
- NPError err = plugin->NP_Initialize();
+ NPError err = plugin_lib->NP_Initialize();
if (err != NPERR_NO_ERROR)
return NULL;
scoped_refptr<NPAPI::PluginInstance> instance =
- plugin->CreateInstance(mime_type);
+ plugin_lib->CreateInstance(mime_type);
return new WebPluginDelegateImpl(containing_view, instance.get());
}
@@ -52,7 +55,7 @@ bool WebPluginDelegateImpl::Initialize(const GURL& url,
bool load_manually) {
plugin_ = plugin;
- instance_->set_web_plugin(plugin);
+ instance_->set_web_plugin(plugin_);
NPAPI::PluginInstance* old_instance =
NPAPI::PluginInstance::SetInitializingInstance(instance_);
@@ -86,7 +89,7 @@ bool WebPluginDelegateImpl::Initialize(const GURL& url,
instance_->set_window_handle(parent_);
}
- PlatformInitialize(plugin);
+ PlatformInitialize();
plugin_url_ = url.spec();
diff --git a/webkit/glue/plugins/webplugin_delegate_impl.h b/webkit/glue/plugins/webplugin_delegate_impl.h
index 9ecd733..51f3839 100644
--- a/webkit/glue/plugins/webplugin_delegate_impl.h
+++ b/webkit/glue/plugins/webplugin_delegate_impl.h
@@ -29,7 +29,7 @@ class PluginInstance;
// An implementation of WebPluginDelegate that proxies all calls to
// the plugin process.
-class WebPluginDelegateImpl : public WebPluginDelegate {
+class WebPluginDelegateImpl : public webkit_glue::WebPluginDelegate {
public:
static bool IsPluginDelegateWindow(gfx::NativeWindow window);
static bool GetPluginNameFromWindow(gfx::NativeWindow window,
@@ -45,7 +45,7 @@ class WebPluginDelegateImpl : public WebPluginDelegate {
char** argn,
char** argv,
int argc,
- WebPlugin* plugin,
+ webkit_glue::WebPlugin* plugin,
bool load_manually);
virtual void UpdateGeometry(const gfx::Rect& window_rect,
const gfx::Rect& clip_rect);
@@ -76,15 +76,16 @@ class WebPluginDelegateImpl : public WebPluginDelegate {
virtual void DidManualLoadFail();
virtual FilePath GetPluginPath();
virtual void InstallMissingPlugin();
- virtual WebPluginResourceClient* CreateResourceClient(int resource_id,
- const GURL& url,
- bool notify_needed,
- intptr_t notify_data,
- intptr_t stream);
+ virtual webkit_glue::WebPluginResourceClient* CreateResourceClient(
+ int resource_id,
+ const GURL& url,
+ bool notify_needed,
+ intptr_t notify_data,
+ intptr_t stream);
virtual bool IsWindowless() const { return windowless_ ; }
- virtual const gfx::Rect& GetRect() const { return window_rect_; }
- virtual const gfx::Rect& GetClipRect() const { return clip_rect_; }
+ virtual gfx::Rect GetRect() const { return window_rect_; }
+ virtual gfx::Rect GetClipRect() const { return clip_rect_; }
virtual int GetQuirks() const { return quirks_; }
#if defined(OS_MACOSX)
@@ -100,9 +101,8 @@ class WebPluginDelegateImpl : public WebPluginDelegate {
NPAPI::PluginInstance *instance);
~WebPluginDelegateImpl();
- // Called by Initialize(), used for platform-specific initialization
- // code.
- void PlatformInitialize(WebPlugin* plugin);
+ // Called by Initialize() for platform-specific initialization.
+ void PlatformInitialize();
// Called by DestroyInstance(), used for platform-specific destruction.
void PlatformDestroyInstance();
@@ -185,7 +185,7 @@ class WebPluginDelegateImpl : public WebPluginDelegate {
// used by windowed and windowless plugins
bool windowless_;
- WebPlugin* plugin_;
+ webkit_glue::WebPlugin* plugin_;
scoped_refptr<NPAPI::PluginInstance> instance_;
#if defined(OS_WIN)
@@ -308,7 +308,7 @@ class WebPluginDelegateImpl : public WebPluginDelegate {
// Holds the current cursor set by the windowless plugin.
WebCursor current_windowless_cursor_;
- friend class WebPluginDelegate;
+ friend class webkit_glue::WebPluginDelegate;
DISALLOW_EVIL_CONSTRUCTORS(WebPluginDelegateImpl);
};
diff --git a/webkit/glue/plugins/webplugin_delegate_impl_gtk.cc b/webkit/glue/plugins/webplugin_delegate_impl_gtk.cc
index ae169ae..7673699 100644
--- a/webkit/glue/plugins/webplugin_delegate_impl_gtk.cc
+++ b/webkit/glue/plugins/webplugin_delegate_impl_gtk.cc
@@ -84,10 +84,10 @@ WebPluginDelegateImpl::~WebPluginDelegateImpl() {
}
}
-void WebPluginDelegateImpl::PlatformInitialize(WebPlugin* plugin) {
+void WebPluginDelegateImpl::PlatformInitialize() {
gfx::PluginWindowHandle handle =
windowless_ ? 0 : gtk_plug_get_id(GTK_PLUG(plug_));
- plugin->SetWindow(handle);
+ plugin_->SetWindow(handle);
}
void WebPluginDelegateImpl::PlatformDestroyInstance() {
diff --git a/webkit/glue/plugins/webplugin_delegate_impl_mac.mm b/webkit/glue/plugins/webplugin_delegate_impl_mac.mm
index 485c6af..08e91bc 100644
--- a/webkit/glue/plugins/webplugin_delegate_impl_mac.mm
+++ b/webkit/glue/plugins/webplugin_delegate_impl_mac.mm
@@ -26,6 +26,9 @@
#include "webkit/glue/plugins/plugin_stream_url.h"
#include "webkit/glue/webkit_glue.h"
+using webkit_glue::WebPlugin;
+using webkit_glue::WebPluginDelegate;
+using webkit_glue::WebPluginResourceClient;
using WebKit::WebCursorInfo;
using WebKit::WebKeyboardEvent;
using WebKit::WebInputEvent;
@@ -160,9 +163,10 @@ void WebPluginDelegateImpl::DestroyInstance() {
}
}
-void WebPluginDelegateImpl::PlatformInitialize(WebPlugin* plugin) {
+void WebPluginDelegateImpl::PlatformInitialize() {
// TODO(port): implement these after unforking.
}
+
void WebPluginDelegateImpl::PlatformDestroyInstance() {
// TODO(port): implement these after unforking.
}
diff --git a/webkit/glue/plugins/webplugin_delegate_impl_win.cc b/webkit/glue/plugins/webplugin_delegate_impl_win.cc
index 1a3c091..a36d5fc 100644
--- a/webkit/glue/plugins/webplugin_delegate_impl_win.cc
+++ b/webkit/glue/plugins/webplugin_delegate_impl_win.cc
@@ -245,12 +245,12 @@ void WebPluginDelegateImpl::PluginDestroyed() {
}
}
-void WebPluginDelegateImpl::PlatformInitialize(WebPlugin* plugin) {
- plugin->SetWindow(windowed_handle_);
+void WebPluginDelegateImpl::PlatformInitialize() {
+ plugin_->SetWindow(windowed_handle_);
if (windowless_) {
CreateDummyWindowForActivation();
handle_event_pump_messages_event_ = CreateEvent(NULL, TRUE, FALSE, NULL);
- plugin->SetWindowlessPumpEvent(handle_event_pump_messages_event_);
+ plugin_->SetWindowlessPumpEvent(handle_event_pump_messages_event_);
}
// The windowless version of the Silverlight plugin calls the
diff --git a/webkit/glue/webframeloaderclient_impl.cc b/webkit/glue/webframeloaderclient_impl.cc
index f423c2a..63d4d9f 100644
--- a/webkit/glue/webframeloaderclient_impl.cc
+++ b/webkit/glue/webframeloaderclient_impl.cc
@@ -31,10 +31,9 @@
#include "base/string_util.h"
#include "net/base/mime_util.h"
#include "net/base/net_errors.h"
-#if defined(OS_WIN)
-#include "webkit/activex_shim/activex_shared.h"
-#endif
#include "webkit/api/public/WebForm.h"
+#include "webkit/api/public/WebPlugin.h"
+#include "webkit/api/public/WebPluginParams.h"
#include "webkit/api/public/WebURL.h"
#include "webkit/api/public/WebURLError.h"
#include "webkit/api/public/WebVector.h"
@@ -49,8 +48,6 @@
#include "webkit/glue/webframe_impl.h"
#include "webkit/glue/webframeloaderclient_impl.h"
#include "webkit/glue/webkit_glue.h"
-#include "webkit/glue/webplugin_delegate.h"
-#include "webkit/glue/webplugin_impl.h"
#include "webkit/glue/webview_delegate.h"
#include "webkit/glue/webview_impl.h"
@@ -63,8 +60,10 @@ using WebKit::WebData;
using WebKit::WebDataSourceImpl;
using WebKit::WebNavigationType;
using WebKit::WebNavigationPolicy;
+using WebKit::WebPlugin;
using WebKit::WebPluginContainerImpl;
using WebKit::WebPluginLoadObserver;
+using WebKit::WebPluginParams;
using WebKit::WebString;
using WebKit::WebURL;
using WebKit::WebURLError;
@@ -82,6 +81,14 @@ enum {
ERR_POLICY_CHANGE = -10000,
};
+static void CopyStringVector(
+ const Vector<String>& input, WebVector<WebString>* output) {
+ WebVector<WebString> result(input.size());
+ for (size_t i = 0; i < input.size(); ++i)
+ result[i] = webkit_glue::StringToWebString(input[i]);
+ output->swap(result);
+}
+
WebFrameLoaderClient::WebFrameLoaderClient(WebFrameImpl* frame)
: webframe_(frame),
has_representation_(false),
@@ -1212,78 +1219,14 @@ PassRefPtr<Frame> WebFrameLoaderClient::createFrame(
return webframe_->CreateChildFrame(frame_request, owner_element);
}
-// Utility function to convert a vector to an array of char*'s.
-// Caller is responsible to free memory with DeleteToArray().
-static char** ToArray(const Vector<WebCore::String> &vector) {
- char **rv = new char *[vector.size()+1];
- unsigned int index = 0;
- for (index = 0; index < vector.size(); ++index) {
- WebCore::CString src = vector[index].utf8();
- rv[index] = new char[src.length() + 1];
- base::strlcpy(rv[index], src.data(), src.length() + 1);
- rv[index][src.length()] = '\0';
- }
- rv[index] = 0;
- return rv;
-}
-
-static void DeleteToArray(char** arr) {
- char **ptr = arr;
- while (*ptr != 0) {
- delete [] *ptr;
- ++ptr;
- }
- delete [] arr;
-}
-
-PassRefPtr<Widget> WebFrameLoaderClient::createPlugin(const IntSize& size, // TODO(erikkay): how do we use this?
- HTMLPlugInElement* element,
- const KURL&url,
- const Vector<String>& param_names,
- const Vector<String>& param_values,
- const String& mime_type,
- bool load_manually) {
- WebViewImpl* webview = webframe_->GetWebViewImpl();
- WebViewDelegate* d = webview->delegate();
- if (!d)
- return NULL;
-
- GURL gurl = webkit_glue::KURLToGURL(url);
- std::string my_mime_type =
- webkit_glue::CStringToStdString(mime_type.latin1());
- StringToLowerASCII(&my_mime_type);
-
- // Get the classid and version from attributes of the object.
- std::string combined_clsid;
-#if defined(OS_WIN)
- std::string clsid, version;
- if (activex_shim::IsMimeTypeActiveX(my_mime_type)) {
- GURL url = webframe_->url();
- for (unsigned int i = 0; i < param_names.size(); i++) {
- String lowercase_param_name = param_names[i].lower();
- if (lowercase_param_name == "classid") {
- activex_shim::GetClsidFromClassidAttribute(
- webkit_glue::CStringToStdString(param_values[i].latin1()), &clsid);
- } else if (lowercase_param_name == "codebase") {
- version = activex_shim::GetVersionFromCodebaseAttribute(
- webkit_glue::CStringToStdString(param_values[i].latin1()));
- }
- }
-
- // Attempt to map this clsid to a known NPAPI mime type if possible, failing
- // which we attempt to load the activex shim for the clsid.
- if (!activex_shim::GetMimeTypeForClsid(clsid, &my_mime_type)) {
- // We need to pass the combined clsid + version to PluginsList, so that it
- // would detect if the requested version is installed. If not, it needs
- // to use the default plugin to update the control.
- if (!version.empty())
- combined_clsid = clsid + "#" + version;
- else
- combined_clsid = clsid;
- }
- }
-#endif
-
+PassRefPtr<Widget> WebFrameLoaderClient::createPlugin(
+ const IntSize& size, // TODO(erikkay): how do we use this?
+ HTMLPlugInElement* element,
+ const KURL& url,
+ const Vector<String>& param_names,
+ const Vector<String>& param_values,
+ const String& mime_type,
+ bool load_manually) {
#if defined(OS_POSIX)
// WebCore asks us to make a plugin even if we don't have a
// registered handler, with a comment saying it's so we can display
@@ -1298,29 +1241,29 @@ PassRefPtr<Widget> WebFrameLoaderClient::createPlugin(const IntSize& size, // TO
return NULL;
#endif
- std::string actual_mime_type;
- WebPluginDelegate* plugin_delegate =
- d->CreatePluginDelegate(webframe_->GetWebViewImpl(), gurl, my_mime_type,
- combined_clsid, &actual_mime_type);
- if (!plugin_delegate)
+ WebViewImpl* webview = webframe_->GetWebViewImpl();
+ if (!webview->delegate())
return NULL;
- if (!actual_mime_type.empty())
- my_mime_type = actual_mime_type;
+ WebPluginParams params;
+ params.url = webkit_glue::KURLToWebURL(url);
+ params.mimeType = webkit_glue::StringToWebString(mime_type);
+ CopyStringVector(param_names, &params.attributeNames);
+ CopyStringVector(param_values, &params.attributeValues);
+ params.loadManually = load_manually;
- DCHECK(param_names.size() == param_values.size());
+ WebPlugin* webplugin = webview->delegate()->CreatePlugin(webframe_, params);
+ if (!webplugin)
+ return NULL;
- char **argn = ToArray(param_names);
- char **argv = ToArray(param_values);
- int argc = static_cast<int>(param_names.size());
- RefPtr<Widget> result = WebPluginImpl::Create(gurl, argn, argv, argc, element,
- webframe_, plugin_delegate,
- load_manually, my_mime_type);
+ // The container takes ownership of the WebPlugin.
+ RefPtr<WebPluginContainerImpl> container =
+ WebPluginContainerImpl::create(element, webplugin);
- DeleteToArray(argn);
- DeleteToArray(argv);
+ if (!webplugin->initialize(container.get()))
+ return NULL;
- return result;
+ return container;
}
// This method gets called when a plugin is put in place of html content
diff --git a/webkit/glue/webplugin.h b/webkit/glue/webplugin.h
index 886b031..3ab6d35 100644
--- a/webkit/glue/webplugin.h
+++ b/webkit/glue/webplugin.h
@@ -1,9 +1,9 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef WEBKIT_GLUE_WEBPLUGIN_H__
-#define WEBKIT_GLUE_WEBPLUGIN_H__
+#ifndef WEBKIT_GLUE_WEBPLUGIN_H_
+#define WEBKIT_GLUE_WEBPLUGIN_H_
#include <string>
#include <vector>
@@ -18,10 +18,17 @@
typedef void* HANDLE;
class GURL;
-class WebPluginResourceClient;
-
struct NPObject;
+namespace WebKit {
+class WebFrame;
+}
+
+namespace webkit_glue {
+
+class WebPluginParentView;
+class WebPluginResourceClient;
+
// Describes the new location for a plugin window.
struct WebPluginGeometry {
// On Windows, this is the plugin window in the plugin process.
@@ -37,20 +44,11 @@ struct WebPluginGeometry {
bool visible;
};
-
-enum RoutingStatus {
- ROUTED,
- NOT_ROUTED,
- INVALID_URL,
- GENERAL_FAILURE
-};
-
// The WebKit side of a plugin implementation. It provides wrappers around
// operations that need to interact with the frame and other WebCore objects.
class WebPlugin {
public:
- WebPlugin() { }
- virtual ~WebPlugin() { }
+ virtual ~WebPlugin() {}
// Called by the plugin delegate to let the WebPlugin know if the plugin is
// windowed (i.e. handle is not NULL) or windowless (handle is NULL). This
@@ -127,9 +125,6 @@ class WebPlugin {
// Defers the loading of the resource identified by resource_id. This is
// controlled by the defer parameter.
virtual void SetDeferResourceLoading(int resource_id, bool defer) = 0;
-
- private:
- DISALLOW_EVIL_CONSTRUCTORS(WebPlugin);
};
// Simpler version of ResourceHandleClient that lends itself to proxying.
@@ -151,5 +146,6 @@ class WebPluginResourceClient {
virtual bool IsMultiByteResponseExpected() = 0;
};
+} // namespace webkit_glue
-#endif // #ifndef WEBKIT_GLUE_WEBPLUGIN_H__
+#endif // #ifndef WEBKIT_GLUE_WEBPLUGIN_H_
diff --git a/webkit/glue/webplugin_delegate.cc b/webkit/glue/webplugin_delegate.cc
deleted file mode 100644
index bc8f692..0000000
--- a/webkit/glue/webplugin_delegate.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "config.h"
-
-#undef LOG
-
-#include "webkit/glue/webplugin_delegate.h"
-
-#include "base/logging.h"
-#include "base/gfx/rect.h"
-
-bool WebPluginDelegate::IsWindowless() const {
- NOTREACHED();
- return false;
-}
-
-const gfx::Rect& WebPluginDelegate::GetRect() const {
- NOTREACHED();
- static gfx::Rect dummy;
- return dummy;
-}
-
-const gfx::Rect& WebPluginDelegate::GetClipRect() const {
- NOTREACHED();
- return GetRect();
-}
-
-// Returns a combinaison of PluginQuirks.
-int WebPluginDelegate::GetQuirks() const {
- NOTREACHED();
- return 0;
-}
diff --git a/webkit/glue/webplugin_delegate.h b/webkit/glue/webplugin_delegate.h
index c1427cd..de83954 100644
--- a/webkit/glue/webplugin_delegate.h
+++ b/webkit/glue/webplugin_delegate.h
@@ -11,12 +11,9 @@
#include "base/string16.h"
#include "third_party/npapi/bindings/npapi.h"
-struct NPObject;
-
class FilePath;
class GURL;
-class WebPlugin;
-class WebPluginResourceClient;
+struct NPObject;
namespace WebKit {
class WebInputEvent;
@@ -27,6 +24,11 @@ namespace gfx {
class Rect;
}
+namespace webkit_glue {
+
+class WebPlugin;
+class WebPluginResourceClient;
+
// This is the interface that a plugin implementation needs to provide.
class WebPluginDelegate {
public:
@@ -43,7 +45,6 @@ class WebPluginDelegate {
PLUGIN_QUIRK_WINDOWLESS_INVALIDATE_AFTER_SET_WINDOW = 512, // Linux
};
- WebPluginDelegate() {}
virtual ~WebPluginDelegate() {}
static WebPluginDelegate* Create(const FilePath& filename,
@@ -59,8 +60,8 @@ class WebPluginDelegate {
// be passed from webkit. if false indicates that the plugin should download
// the data. This also controls whether the plugin is instantiated as a full
// page plugin (NP_FULL) or embedded (NP_EMBED).
- virtual bool Initialize(const GURL& url, char** argn, char** argv,
- int argc, WebPlugin* plugin, bool load_manually) = 0;
+ virtual bool Initialize(const GURL& url, char** argn, char** argv, int argc,
+ WebPlugin* plugin, bool load_manually) = 0;
// Called when the WebPlugin is being destroyed. This is a signal to the
// delegate that it should tear-down the plugin implementation and not call
@@ -138,17 +139,16 @@ class WebPluginDelegate {
intptr_t notify_data,
intptr_t stream) = 0;
- virtual bool IsWindowless() const;
+ virtual bool IsWindowless() const = 0;
- virtual const gfx::Rect& GetRect() const;
+ virtual gfx::Rect GetRect() const = 0;
- virtual const gfx::Rect& GetClipRect() const;
+ virtual gfx::Rect GetClipRect() const = 0;
// Returns a combination of PluginQuirks.
- virtual int GetQuirks() const;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(WebPluginDelegate);
+ virtual int GetQuirks() const = 0;
};
-#endif // #ifndef WEBKIT_GLUE_WEBPLUGIN_DELEGATE_H_
+} // namespace webkit_glue
+
+#endif // WEBKIT_GLUE_WEBPLUGIN_DELEGATE_H_
diff --git a/webkit/glue/webplugin_impl.cc b/webkit/glue/webplugin_impl.cc
index 09f2b3b..54576a6 100644
--- a/webkit/glue/webplugin_impl.cc
+++ b/webkit/glue/webplugin_impl.cc
@@ -1,58 +1,45 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "config.h"
-
-#include "Document.h"
-#include "DocumentLoader.h"
-#include "FormState.h"
-#include "Frame.h"
-#include "FrameLoader.h"
-#include "FrameLoadRequest.h"
-#include "HTMLFormElement.h"
-#include "KURL.h"
-#include "PlatformString.h"
-#include "ResourceResponse.h"
-#include "ScriptController.h"
-#include "ScriptValue.h"
-#include "Widget.h"
-
-#undef LOG
#include "base/gfx/rect.h"
#include "base/logging.h"
#include "base/message_loop.h"
#include "base/string_util.h"
#include "net/base/escape.h"
+#include "skia/ext/platform_canvas.h"
+#if defined(OS_WIN)
+#include "webkit/activex_shim/activex_shared.h"
+#endif
#include "webkit/api/public/WebConsoleMessage.h"
+#include "webkit/api/public/WebCString.h"
#include "webkit/api/public/WebCursorInfo.h"
#include "webkit/api/public/WebData.h"
+#include "webkit/api/public/WebFrame.h"
#include "webkit/api/public/WebHTTPBody.h"
#include "webkit/api/public/WebHTTPHeaderVisitor.h"
#include "webkit/api/public/WebInputEvent.h"
#include "webkit/api/public/WebKit.h"
#include "webkit/api/public/WebKitClient.h"
+#include "webkit/api/public/WebPluginContainer.h"
+#include "webkit/api/public/WebPluginParams.h"
#include "webkit/api/public/WebRect.h"
-#include "webkit/api/public/WebString.h"
#include "webkit/api/public/WebURL.h"
#include "webkit/api/public/WebURLLoader.h"
#include "webkit/api/public/WebURLLoaderClient.h"
#include "webkit/api/public/WebURLResponse.h"
-#include "webkit/api/public/WebVector.h"
-#include "webkit/api/src/WebPluginContainerImpl.h"
-#include "webkit/glue/chrome_client_impl.h"
-#include "webkit/glue/glue_util.h"
#include "webkit/glue/multipart_response_delegate.h"
-#include "webkit/glue/webkit_glue.h"
#include "webkit/glue/webplugin_impl.h"
#include "webkit/glue/plugins/plugin_host.h"
#include "webkit/glue/plugins/plugin_instance.h"
#include "webkit/glue/webplugin_delegate.h"
-#include "webkit/glue/webview_impl.h"
+#include "webkit/glue/webplugin_page_delegate.h"
+#include "webkit/glue/webview.h"
#include "googleurl/src/gurl.h"
using WebKit::WebCanvas;
using WebKit::WebConsoleMessage;
+using WebKit::WebCString;
using WebKit::WebCursorInfo;
using WebKit::WebData;
using WebKit::WebDataSource;
@@ -63,7 +50,7 @@ using WebKit::WebInputEvent;
using WebKit::WebKeyboardEvent;
using WebKit::WebMouseEvent;
using WebKit::WebPluginContainer;
-using WebKit::WebPluginContainerImpl;
+using WebKit::WebPluginParams;
using WebKit::WebRect;
using WebKit::WebString;
using WebKit::WebURL;
@@ -75,6 +62,7 @@ using WebKit::WebURLResponse;
using WebKit::WebVector;
using webkit_glue::MultipartResponseDelegate;
+namespace webkit_glue {
namespace {
// This class handles individual multipart responses. It is instantiated when
@@ -209,60 +197,87 @@ void GetResponseInfo(const WebURLResponse& response,
}
}
+// Utility function to convert a vector to an array of char*'s.
+// Caller is responsible to free memory with DeleteArray().
+static char** ToArray(const WebVector<WebString>& input) {
+ char** array = new char*[input.size() + 1];
+ size_t index;
+ for (index = 0; index < input.size(); ++index) {
+ const WebCString& src = input[index].utf8();
+ array[index] = new char[src.length() + 1];
+ base::strlcpy(array[index], src.data(), src.length() + 1);
+ array[index][src.length()] = '\0';
+ }
+ array[index] = 0;
+ return array;
+}
+
+static void DeleteArray(char** array) {
+ char** ptr = array;
+ while (*ptr) {
+ delete[] *ptr;
+ ++ptr;
+ }
+ delete[] array;
+}
+
} // namespace
-PassRefPtr<WebCore::Widget> WebPluginImpl::Create(
- const GURL& url,
- char** argn,
- char** argv,
- int argc,
- WebCore::HTMLPlugInElement* element,
- WebFrameImpl* frame,
- WebPluginDelegate* delegate,
- bool load_manually,
- const std::string& mime_type) {
- // NOTE: frame contains element
-
- WebPluginImpl* webplugin = new WebPluginImpl(
- frame, delegate, url, load_manually, mime_type, argc, argn, argv);
-
- if (!delegate->Initialize(url, argn, argv, argc, webplugin, load_manually)) {
- delegate->PluginDestroyed();
- delete webplugin;
- return NULL;
+// WebKit::WebPlugin ----------------------------------------------------------
+
+bool WebPluginImpl::initialize(WebPluginContainer* container) {
+ if (!page_delegate_)
+ return false;
+
+ // Get the classid and version from attributes of the object.
+ std::string combined_clsid;
+#if defined(OS_WIN)
+ std::string clsid, version;
+ if (activex_shim::IsMimeTypeActiveX(mime_type_)) {
+ for (size_t i = 0; i < arg_count_; i++) {
+ const char* param_name = arg_names_[i];
+ const char* param_value = arg_values_[i];
+ if (base::strcasecmp(param_name, "classid") == 0) {
+ activex_shim::GetClsidFromClassidAttribute(param_value, &clsid);
+ } else if (base::strcasecmp(param_name, "codebase") == 0) {
+ version = activex_shim::GetVersionFromCodebaseAttribute(param_value);
+ }
+ }
+
+ // Attempt to map this clsid to a known NPAPI mime type if possible, failing
+ // which we attempt to load the activex shim for the clsid.
+ if (!activex_shim::GetMimeTypeForClsid(clsid, &mime_type_)) {
+ // We need to pass the combined clsid + version to PluginsList, so that it
+ // would detect if the requested version is installed. If not, it needs
+ // to use the default plugin to update the control.
+ if (!version.empty())
+ combined_clsid = clsid + "#" + version;
+ else
+ combined_clsid = clsid;
+ }
}
+#endif
- PassRefPtr<WebPluginContainerImpl> container =
- WebPluginContainerImpl::create(element, webplugin);
- webplugin->SetContainer(container.get());
- return container;
-}
+ std::string actual_mime_type;
+ WebPluginDelegate* plugin_delegate = page_delegate_->CreatePluginDelegate(
+ plugin_url_, mime_type_, combined_clsid, &actual_mime_type);
+ if (!plugin_delegate)
+ return NULL;
-WebPluginImpl::WebPluginImpl(WebFrameImpl* webframe,
- WebPluginDelegate* delegate,
- const GURL& plugin_url,
- bool load_manually,
- const std::string& mime_type,
- int arg_count,
- char** arg_names,
- char** arg_values)
- : windowless_(false),
- window_(NULL),
- webframe_(webframe),
- delegate_(delegate),
- container_(NULL),
- plugin_url_(plugin_url),
- load_manually_(load_manually),
- first_geometry_update_(true),
- ignore_response_error_(false),
- mime_type_(mime_type),
- ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
+ bool ok = plugin_delegate->Initialize(
+ plugin_url_, arg_names_, arg_values_, arg_count_, this, load_manually_);
+ if (!ok) {
+ plugin_delegate->PluginDestroyed();
+ return false;
+ }
- ArrayToVector(arg_count, arg_names, &arg_names_);
- ArrayToVector(arg_count, arg_values, &arg_values_);
-}
+ if (!actual_mime_type.empty())
+ mime_type_ = actual_mime_type;
+ delegate_ = plugin_delegate;
-// WebKit::WebPlugin -----------------------------------------------------------
+ SetContainer(container);
+ return true;
+}
void WebPluginImpl::destroy() {
SetContainer(NULL);
@@ -291,23 +306,20 @@ void WebPluginImpl::paint(WebCanvas* canvas, const WebRect& paint_rect) {
void WebPluginImpl::updateGeometry(
const WebRect& window_rect, const WebRect& clip_rect,
const WebVector<WebRect>& cutout_rects, bool is_visible) {
- if (window_) {
- WebViewDelegate* view_delegate = GetWebViewDelegate();
- if (view_delegate) {
- // Notify the window hosting the plugin (the WebViewDelegate) that
- // it needs to adjust the plugin, so that all the HWNDs can be moved
- // at the same time.
- WebPluginGeometry move;
- move.window = window_;
- move.window_rect = window_rect;
- move.clip_rect = clip_rect;
- for (size_t i = 0; i < cutout_rects.size(); ++i)
- move.cutout_rects.push_back(cutout_rects[i]);
- move.rects_valid = true;
- move.visible = is_visible;
-
- view_delegate->DidMovePlugin(move);
- }
+ if (window_ && page_delegate_) {
+ // Notify the window hosting the plugin (the WebViewDelegate) that
+ // it needs to adjust the plugin, so that all the HWNDs can be moved
+ // at the same time.
+ WebPluginGeometry move;
+ move.window = window_;
+ move.window_rect = window_rect;
+ move.clip_rect = clip_rect;
+ for (size_t i = 0; i < cutout_rects.size(); ++i)
+ move.cutout_rects.push_back(cutout_rects[i]);
+ move.rects_valid = true;
+ move.visible = is_visible;
+
+ page_delegate_->DidMovePlugin(move);
}
if (first_geometry_update_ || window_rect != window_rect_ ||
@@ -343,11 +355,7 @@ void WebPluginImpl::updateFocus(bool focused) {
}
void WebPluginImpl::updateVisibility(bool visible) {
- if (!window_)
- return;
-
- WebViewDelegate* view_delegate = GetWebViewDelegate();
- if (!view_delegate)
+ if (!window_ || !page_delegate_)
return;
WebPluginGeometry move;
@@ -357,7 +365,7 @@ void WebPluginImpl::updateVisibility(bool visible) {
move.rects_valid = false;
move.visible = visible;
- view_delegate->DidMovePlugin(move);
+ page_delegate_->DidMovePlugin(move);
}
bool WebPluginImpl::acceptsInputEvents() {
@@ -415,19 +423,43 @@ void WebPluginImpl::didFailLoadingFrameRequest(
// -----------------------------------------------------------------------------
-WebPluginImpl::~WebPluginImpl() {
+WebPluginImpl::WebPluginImpl(
+ WebFrame* webframe, const WebPluginParams& params,
+ const base::WeakPtr<WebPluginPageDelegate>& page_delegate)
+ : windowless_(false),
+ window_(NULL),
+ page_delegate_(page_delegate),
+ webframe_(webframe),
+ delegate_(NULL),
+ container_(NULL),
+ plugin_url_(params.url),
+ load_manually_(params.loadManually),
+ first_geometry_update_(true),
+ ignore_response_error_(false),
+ mime_type_(params.mimeType.utf8()),
+ arg_names_(ToArray(params.attributeNames)),
+ arg_values_(ToArray(params.attributeValues)),
+ arg_count_(params.attributeNames.size()),
+ ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
+ DCHECK_EQ(params.attributeNames.size(), params.attributeValues.size());
+ StringToLowerASCII(&mime_type_);
}
+WebPluginImpl::~WebPluginImpl() {
+ if (arg_names_)
+ DeleteArray(arg_names_);
+ if (arg_values_)
+ DeleteArray(arg_values_);
+}
void WebPluginImpl::SetWindow(gfx::PluginWindowHandle window) {
if (window) {
DCHECK(!windowless_); // Make sure not called twice.
window_ = window;
- WebViewDelegate* view_delegate = GetWebViewDelegate();
- if (view_delegate) {
+ if (page_delegate_) {
// Tell the view delegate that the plugin window was created, so that it
// can create necessary container widgets.
- view_delegate->CreatedPluginWindow(window);
+ page_delegate_->CreatedPluginWindow(window);
}
} else {
DCHECK(!window_); // Make sure not called twice.
@@ -438,10 +470,8 @@ void WebPluginImpl::SetWindow(gfx::PluginWindowHandle window) {
void WebPluginImpl::WillDestroyWindow(gfx::PluginWindowHandle window) {
DCHECK_EQ(window, window_);
window_ = NULL;
- WebViewDelegate* view_delegate = GetWebViewDelegate();
- if (!view_delegate)
- return;
- view_delegate->WillDestroyPluginWindow(window);
+ if (page_delegate_)
+ page_delegate_->WillDestroyPluginWindow(window);
}
GURL WebPluginImpl::CompleteURL(const char* url) {
@@ -475,8 +505,8 @@ bool WebPluginImpl::SetPostData(WebURLRequest* request,
bool rv = NPAPI::PluginHost::SetPostData(buf, length, &names, &values, &body);
for (size_t i = 0; i < names.size(); ++i) {
- request->addHTTPHeaderField(webkit_glue::StdStringToWebString(names[i]),
- webkit_glue::StdStringToWebString(values[i]));
+ request->addHTTPHeaderField(WebString::fromUTF8(names[i]),
+ WebString::fromUTF8(values[i]));
}
WebString content_type_header = WebString::fromUTF8("Content-Type");
@@ -498,13 +528,16 @@ bool WebPluginImpl::SetPostData(WebURLRequest* request,
return rv;
}
-RoutingStatus WebPluginImpl::RouteToFrame(const char *method,
- bool is_javascript_url,
- const char* target, unsigned int len,
- const char* buf, bool is_file_data,
- bool notify_needed,
- intptr_t notify_data,
- const char* url, GURL* unused) {
+WebPluginImpl::RoutingStatus WebPluginImpl::RouteToFrame(
+ const char *method,
+ bool is_javascript_url,
+ const char* target,
+ unsigned int len,
+ const char* buf,
+ bool is_file_data,
+ bool notify_needed,
+ intptr_t notify_data,
+ const char* url) {
// If there is no target, there is nothing to do
if (!target)
return NOT_ROUTED;
@@ -594,10 +627,9 @@ std::string WebPluginImpl::GetCookies(const GURL& url, const GURL& policy_url) {
void WebPluginImpl::ShowModalHTMLDialog(const GURL& url, int width, int height,
const std::string& json_arguments,
std::string* json_retval) {
- WebViewDelegate* view_delegate = GetWebViewDelegate();
- if (view_delegate) {
- view_delegate->ShowModalHTMLDialog(
- url, width, height, json_arguments, json_retval);
+ if (page_delegate_) {
+ page_delegate_->ShowModalHTMLDialogForPlugin(
+ url, gfx::Size(width, height), json_arguments, json_retval);
}
}
@@ -767,9 +799,8 @@ void WebPluginImpl::didFinishLoading(WebURLLoader* loader) {
if (index != multi_part_response_map_.end()) {
delete (*index).second;
multi_part_response_map_.erase(index);
-
- WebView* webview = webframe_->GetWebViewImpl();
- webview->GetDelegate()->DidStopLoading(webview);
+ if (page_delegate_)
+ page_delegate_->DidStopLoadingForPlugin();
}
loader->setDefersLoading(true);
WebPluginResourceClient* resource_client = client_info->client;
@@ -807,9 +838,8 @@ void WebPluginImpl::RemoveClient(WebURLLoader* loader) {
}
void WebPluginImpl::SetContainer(WebPluginContainer* container) {
- if (container == NULL) {
+ if (!container)
TearDownPluginInstance(NULL);
- }
container_ = container;
}
@@ -836,10 +866,9 @@ void WebPluginImpl::HandleURLRequestInternal(
// case in that the request is a javascript url and the target is "_self",
// in which case we route the output to the plugin rather than routing it
// to the plugin's frame.
- GURL complete_url;
- int routing_status = RouteToFrame(method, is_javascript_url, target, len,
- buf, is_file_data, notify, notify_data,
- url, &complete_url);
+ RoutingStatus routing_status =
+ RouteToFrame(method, is_javascript_url, target, len, buf, is_file_data,
+ notify, notify_data, url);
if (routing_status == ROUTED)
return;
@@ -931,9 +960,9 @@ bool WebPluginImpl::InitiateHTTPRequest(int resource_id,
}
void WebPluginImpl::CancelDocumentLoad() {
- if (frame()->loader()->activeDocumentLoader()) {
+ if (webframe_) {
ignore_response_error_ = true;
- frame()->loader()->activeDocumentLoader()->stopLoading();
+ webframe_->stopLoading();
}
}
@@ -988,8 +1017,8 @@ void WebPluginImpl::HandleHttpMultipartResponse(
return;
}
- WebView* webview = webframe_->GetWebViewImpl();
- webview->GetDelegate()->DidStartLoading(webview);
+ if (page_delegate_)
+ page_delegate_->DidStartLoadingForPlugin();
MultiPartResponseClient* multi_part_response_client =
new MultiPartResponseClient(client);
@@ -1003,11 +1032,11 @@ void WebPluginImpl::HandleHttpMultipartResponse(
bool WebPluginImpl::ReinitializePluginForResponse(
WebURLLoader* loader) {
- WebFrameImpl* webframe = webframe_;
+ WebFrame* webframe = webframe_;
if (!webframe)
return false;
- WebViewImpl* webview = webframe->GetWebViewImpl();
+ WebView* webview = webframe->view();
if (!webview)
return false;
@@ -1019,28 +1048,14 @@ bool WebPluginImpl::ReinitializePluginForResponse(
container_ = container_widget;
webframe_ = webframe;
- WebViewDelegate* webview_delegate = webview->GetDelegate();
std::string actual_mime_type;
- WebPluginDelegate* plugin_delegate =
- webview_delegate->CreatePluginDelegate(webview, plugin_url_,
- mime_type_, std::string(),
- &actual_mime_type);
-
- char** arg_names = new char*[arg_names_.size()];
- char** arg_values = new char*[arg_values_.size()];
+ WebPluginDelegate* plugin_delegate = page_delegate_->CreatePluginDelegate(
+ plugin_url_, mime_type_, std::string(), &actual_mime_type);
- for (unsigned int index = 0; index < arg_names_.size(); ++index) {
- arg_names[index] = const_cast<char*>(arg_names_[index].c_str());
- arg_values[index] = const_cast<char*>(arg_values_[index].c_str());
- }
-
- bool init_ok = plugin_delegate->Initialize(plugin_url_, arg_names,
- arg_values, arg_names_.size(),
- this, load_manually_);
- delete[] arg_names;
- delete[] arg_values;
+ bool ok = plugin_delegate->Initialize(
+ plugin_url_, arg_names_, arg_values_, arg_count_, this, load_manually_);
- if (!init_ok) {
+ if (!ok) {
container_ = NULL;
// TODO(iyengar) Should we delete the current plugin instance here?
return false;
@@ -1050,8 +1065,9 @@ bool WebPluginImpl::ReinitializePluginForResponse(
delegate_ = plugin_delegate;
// Force a geometry update to occur to ensure that the plugin becomes
- // visible. TODO(darin): Avoid this cast!
- static_cast<WebPluginContainerImpl*>(container_)->frameRectsChanged();
+ // visible.
+ container_->reportGeometry();
+
// The plugin move sequences accumulated via DidMove are sent to the browser
// whenever the renderer paints. Force a paint here to ensure that changes
// to the plugin window are propagated to the browser.
@@ -1059,25 +1075,13 @@ bool WebPluginImpl::ReinitializePluginForResponse(
return true;
}
-void WebPluginImpl::ArrayToVector(int total_values, char** values,
- std::vector<std::string>* value_vector) {
- DCHECK(value_vector != NULL);
- for (int index = 0; index < total_values; ++index) {
- value_vector->push_back(values[index]);
- }
-}
-
void WebPluginImpl::TearDownPluginInstance(
WebURLLoader* loader_to_ignore) {
- // The frame maintains a list of JSObjects which are related to this
- // plugin. Tell the frame we're gone so that it can invalidate all
- // of those sub JSObjects.
- if (frame()) {
- ASSERT(container_);
- // TODO(darin): Avoid this cast!
- frame()->script()->cleanupScriptObjectsForPlugin(
- static_cast<WebKit::WebPluginContainerImpl*>(container_));
- }
+ // The container maintains a list of JSObjects which are related to this
+ // plugin. Tell the frame we're gone so that it can invalidate all of
+ // those sub JSObjects.
+ if (container_)
+ container_->clearScriptObjects();
if (delegate_) {
// Call PluginDestroyed() first to prevent the plugin from calling us back
@@ -1109,9 +1113,4 @@ void WebPluginImpl::TearDownPluginInstance(
method_factory_.RevokeAll();
}
-WebViewDelegate* WebPluginImpl::GetWebViewDelegate() {
- if (!webframe_)
- return NULL;
- WebViewImpl* webview = webframe_->GetWebViewImpl();
- return webview ? webview->delegate() : NULL;
-}
+} // namespace webkit_glue
diff --git a/webkit/glue/webplugin_impl.h b/webkit/glue/webplugin_impl.h
index 09505af..07e043c 100644
--- a/webkit/glue/webplugin_impl.h
+++ b/webkit/glue/webplugin_impl.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -9,45 +9,33 @@
#include <map>
#include <vector>
-#include "Widget.h"
-
#include "base/basictypes.h"
#include "base/gfx/native_widget_types.h"
#include "base/linked_ptr.h"
+#include "base/task.h"
+#include "base/weak_ptr.h"
+#include "googleurl/src/gurl.h"
#include "webkit/api/public/WebPlugin.h"
+#include "webkit/api/public/WebString.h"
#include "webkit/api/public/WebURLLoaderClient.h"
#include "webkit/api/public/WebURLRequest.h"
-#include "webkit/glue/webframe_impl.h"
+#include "webkit/api/public/WebVector.h"
#include "webkit/glue/webplugin.h"
-
-class WebFrameImpl;
-class WebPluginDelegate;
-
-namespace WebCore {
-class Event;
-class Frame;
-class HTMLPlugInElement;
-class IntRect;
-class KeyboardEvent;
-class KURL;
-class MouseEvent;
-class ResourceError;
-class ResourceResponse;
-class ScrollView;
-class String;
-class Widget;
-}
+class WebViewDelegate;
namespace WebKit {
+class WebFrame;
class WebPluginContainer;
class WebURLResponse;
class WebURLLoader;
}
namespace webkit_glue {
+
class MultipartResponseDelegate;
-}
+class WebPluginDelegate;
+class WebPluginPageDelegate;
// This is the WebKit side of the plugin implementation that forwards calls,
// after changing out of WebCore types, to a delegate. The delegate may
@@ -56,19 +44,11 @@ class WebPluginImpl : public WebPlugin,
public WebKit::WebPlugin,
public WebKit::WebURLLoaderClient {
public:
- // Creates a WebPlugin instance, as long as the delegate's initialization
- // succeeds. If it fails, the delegate is deleted and NULL is returned.
- // Note that argn and argv are UTF8.
- static PassRefPtr<WebCore::Widget> Create(const GURL& url,
- char** argn,
- char** argv,
- int argc,
- WebCore::HTMLPlugInElement* element,
- WebFrameImpl* frame,
- WebPluginDelegate* delegate,
- bool load_manually,
- const std::string& mime_type);
- virtual ~WebPluginImpl();
+ WebPluginImpl(
+ WebKit::WebFrame* frame,
+ const WebKit::WebPluginParams& params,
+ const base::WeakPtr<WebPluginPageDelegate>& page_delegate);
+ ~WebPluginImpl();
// Helper function for sorting post data.
static bool SetPostData(WebKit::WebURLRequest* request,
@@ -76,12 +56,9 @@ class WebPluginImpl : public WebPlugin,
uint32 length);
private:
- WebPluginImpl(
- WebFrameImpl* frame, WebPluginDelegate* delegate, const GURL& plugin_url,
- bool load_manually, const std::string& mime_type, int arg_count,
- char** arg_names, char** arg_values);
-
// WebKit::WebPlugin methods:
+ virtual bool initialize(
+ WebKit::WebPluginContainer* container);
virtual void destroy();
virtual NPObject* scriptableObject();
virtual void paint(
@@ -123,6 +100,13 @@ class WebPluginImpl : public WebPlugin,
bool notify_needed, intptr_t notify_data,
bool popups_allowed);
+ enum RoutingStatus {
+ ROUTED,
+ NOT_ROUTED,
+ INVALID_URL,
+ GENERAL_FAILURE
+ };
+
// Given a download request, check if we need to route the output to a frame.
// Returns ROUTED if the load is done and routed to a frame, NOT_ROUTED or
// corresponding error codes otherwise.
@@ -130,7 +114,7 @@ class WebPluginImpl : public WebPlugin,
const char* target, unsigned int len,
const char* buf, bool is_file_data,
bool notify_needed, intptr_t notify_data,
- const char* url, GURL* completeURL);
+ const char* url);
// Cancels a pending request.
void CancelResource(int id);
@@ -195,8 +179,6 @@ class WebPluginImpl : public WebPlugin,
// request given a handle.
void RemoveClient(WebKit::WebURLLoader* loader);
- WebCore::Frame* frame() { return webframe_ ? webframe_->frame() : NULL; }
-
void HandleURLRequest(const char *method,
bool is_javascript_url,
const char* target, unsigned int len,
@@ -231,16 +213,9 @@ class WebPluginImpl : public WebPlugin,
// to handle the response identified by the loader parameter.
bool ReinitializePluginForResponse(WebKit::WebURLLoader* loader);
- // Helper functions to convert an array of names/values to a vector.
- static void ArrayToVector(int total_values, char** values,
- std::vector<std::string>* value_vector);
-
// Delayed task for downloading the plugin source URL.
void OnDownloadPluginSrcUrl();
- // Returns the WebViewDelegate associated with webframe_;
- WebViewDelegate* GetWebViewDelegate();
-
struct ClientInfo {
int id;
WebPluginResourceClient* client;
@@ -257,7 +232,8 @@ class WebPluginImpl : public WebPlugin,
bool windowless_;
gfx::PluginWindowHandle window_;
- WebFrameImpl* webframe_;
+ base::WeakPtr<WebPluginPageDelegate> page_delegate_;
+ WebKit::WebFrame* webframe_;
WebPluginDelegate* delegate_;
@@ -290,15 +266,17 @@ class WebPluginImpl : public WebPlugin,
// The mime type of the plugin.
std::string mime_type_;
- // Holds the list of argument names passed to the plugin.
- std::vector<std::string> arg_names_;
-
- // Holds the list of argument values passed to the plugin.
- std::vector<std::string> arg_values_;
+ // Holds the list of argument names and values passed to the plugin. We keep
+ // these so that we can re-initialize the plugin if we need to.
+ char** arg_names_;
+ char** arg_values_;
+ size_t arg_count_;
ScopedRunnableMethodFactory<WebPluginImpl> method_factory_;
DISALLOW_COPY_AND_ASSIGN(WebPluginImpl);
};
+} // namespace webkit_glue
+
#endif // #ifndef WEBKIT_GLUE_WEBPLUGIN_IMPL_H_
diff --git a/webkit/glue/webplugin_impl_unittest.cc b/webkit/glue/webplugin_impl_unittest.cc
index b6c62f6..70c9436 100644
--- a/webkit/glue/webplugin_impl_unittest.cc
+++ b/webkit/glue/webplugin_impl_unittest.cc
@@ -1,23 +1,18 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "config.h"
-
-// Avoid collisions with the LOG macro
-#include <wtf/Assertions.h>
-#undef LOG
-
#include "base/string_util.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "webkit/api/public/WebCString.h"
#include "webkit/api/public/WebString.h"
#include "webkit/api/public/WebURLRequest.h"
-#include "webkit/glue/glue_util.h"
#include "webkit/glue/webplugin_impl.h"
using WebKit::WebHTTPBody;
using WebKit::WebString;
using WebKit::WebURLRequest;
+using webkit_glue::WebPluginImpl;
namespace {
@@ -26,18 +21,10 @@ class WebPluginImplTest : public testing::Test {
}
-// These exist only to support the gTest assertion macros, and
-// shouldn't be used in normal program code.
-std::ostream& operator<<(std::ostream& out, const WebCore::String& str)
-{
- return out << str.latin1().data();
-}
-
static std::string GetHeader(const WebURLRequest& request, const char* name) {
std::string result;
TrimWhitespace(
- webkit_glue::WebStringToStdString(
- request.httpHeaderField(WebString::fromUTF8(name))),
+ request.httpHeaderField(WebString::fromUTF8(name)).utf8(),
TRIM_ALL,
&result);
return result;
diff --git a/webkit/glue/webplugin_page_delegate.h b/webkit/glue/webplugin_page_delegate.h
new file mode 100644
index 0000000..56a8cec
--- /dev/null
+++ b/webkit/glue/webplugin_page_delegate.h
@@ -0,0 +1,65 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef WEBKIT_GLUE_WEBPLUGIN_PAGE_DELEGATE_
+#define WEBKIT_GLUE_WEBPLUGIN_PAGE_DELEGATE_
+
+#include "base/gfx/native_widget_types.h"
+
+class GURL;
+
+namespace webkit_glue {
+
+class WebPluginDelegate;
+struct WebPluginGeometry;
+
+// Used by the WebPlugin to communicate back to the containing page.
+class WebPluginPageDelegate {
+ public:
+ // This method is called to create a WebPluginDelegate implementation when a
+ // new plugin is instanced. See webkit_glue::CreateWebPluginDelegateHelper
+ // for a default WebPluginDelegate implementation.
+ // TODO(port): clsid is very Win- and ActiveX-specific; refactor to be more
+ // platform-neutral
+ virtual WebPluginDelegate* CreatePluginDelegate(
+ const GURL& url,
+ const std::string& mime_type,
+ const std::string& clsid,
+ std::string* actual_mime_type) = 0;
+
+ // Called when a windowed plugin is created.
+ // Lets the view delegate create anything it is using to wrap the plugin.
+ virtual void CreatedPluginWindow(
+ gfx::PluginWindowHandle handle) = 0;
+
+ // Called when a windowed plugin is closing.
+ // Lets the view delegate shut down anything it is using to wrap the plugin.
+ virtual void WillDestroyPluginWindow(
+ gfx::PluginWindowHandle handle) = 0;
+
+ // Keeps track of the necessary window move for a plugin window that resulted
+ // from a scroll operation. That way, all plugin windows can be moved at the
+ // same time as each other and the page.
+ virtual void DidMovePlugin(
+ const WebPluginGeometry& move) = 0;
+
+ // Notifies the parent view that a load has begun.
+ virtual void DidStartLoadingForPlugin() = 0;
+
+ // Notifies the parent view that all loads are finished.
+ virtual void DidStopLoadingForPlugin() = 0;
+
+ // Asks the browser to show a modal HTML dialog. The dialog is passed the
+ // given arguments as a JSON string, and returns its result as a JSON string
+ // through json_retval.
+ virtual void ShowModalHTMLDialogForPlugin(
+ const GURL& url,
+ const gfx::Size& size,
+ const std::string& json_arguments,
+ std::string* json_retval) = 0;
+};
+
+} // namespace webkit_glue
+
+#endif // WEBKIT_GLUE_WEBPLUGIN_PAGE_DELEGATE_H_
diff --git a/webkit/glue/webview_delegate.h b/webkit/glue/webview_delegate.h
index 386f2e8..11a55f8 100644
--- a/webkit/glue/webview_delegate.h
+++ b/webkit/glue/webview_delegate.h
@@ -28,7 +28,6 @@
#include <vector>
-#include "base/gfx/native_widget_types.h"
#include "webkit/api/public/WebFrame.h"
#include "webkit/api/public/WebNavigationPolicy.h"
#include "webkit/api/public/WebNavigationType.h"
@@ -38,6 +37,7 @@
namespace webkit_glue {
class WebMediaPlayerDelegate;
+struct WebPluginGeometry;
}
namespace WebCore {
@@ -54,9 +54,11 @@ class WebMediaPlayer;
class WebMediaPlayerClient;
class WebNode;
class WebNotificationPresenter;
+class WebPlugin;
class WebURLRequest;
class WebURLResponse;
class WebWidget;
+struct WebPluginParams;
struct WebPoint;
struct WebPopupMenuInfo;
struct WebRect;
@@ -67,10 +69,8 @@ class FilePath;
class SkBitmap;
class WebDevToolsAgentDelegate;
class WebMediaPlayerDelegate;
-class WebPluginDelegate;
class WebView;
struct ContextMenuMediaParams;
-struct WebPluginGeometry;
struct WebPreferences;
enum NavigationGesture {
@@ -136,28 +136,12 @@ class WebViewDelegate : virtual public WebKit::WebWidgetClient {
return NULL;
}
- // This method is called to create a WebPluginDelegate implementation when a
- // new plugin is instanced. See webkit_glue::CreateWebPluginDelegateHelper
- // for a default WebPluginDelegate implementation.
- // TODO(port): clsid is very Win- and ActiveX-specific; refactor to be more
- // platform-neutral
- virtual WebPluginDelegate* CreatePluginDelegate(
- WebView* webview,
- const GURL& url,
- const std::string& mime_type,
- const std::string& clsid,
- std::string* actual_mime_type) {
+ virtual WebKit::WebPlugin* CreatePlugin(
+ WebKit::WebFrame* parent_frame,
+ const WebKit::WebPluginParams& params) {
return NULL;
}
- // Called when a windowed plugin is created.
- // Lets the view delegate create anything it is using to wrap the plugin.
- virtual void CreatedPluginWindow(gfx::PluginWindowHandle handle) { }
-
- // Called when a windowed plugin is closing.
- // Lets the view delegate shut down anything it is using to wrap the plugin.
- virtual void WillDestroyPluginWindow(gfx::PluginWindowHandle handle) { }
-
// This method is called when the renderer creates a worker object.
virtual WebKit::WebWorker* CreateWebWorker(WebKit::WebWorkerClient* client) {
return NULL;
@@ -205,12 +189,6 @@ class WebViewDelegate : virtual public WebKit::WebWidgetClient {
virtual void FocusAccessibilityObject(WebCore::AccessibilityObject* acc_obj) {
}
- // Keeps track of the necessary window move for a plugin window that resulted
- // from a scroll operation. That way, all plugin windows can be moved at the
- // same time as each other and the page.
- virtual void DidMovePlugin(const WebPluginGeometry& move) {
- }
-
// FrameLoaderClient -------------------------------------------------------
virtual bool CanAcceptLoadDrops() const {
@@ -558,14 +536,6 @@ class WebViewDelegate : virtual public WebKit::WebWidgetClient {
// UIDelegate --------------------------------------------------------------
- // Asks the browser to show a modal HTML dialog. The dialog is passed the
- // given arguments as a JSON string, and returns its result as a JSON string
- // through json_retval.
- virtual void ShowModalHTMLDialog(const GURL& url, int width, int height,
- const std::string& json_arguments,
- std::string* json_retval) {
- }
-
// Displays a JavaScript alert panel associated with the given view. Clients
// should visually indicate that this panel comes from JavaScript and some
// information about the originating frame (at least the domain). The panel