Index: content/renderer/browser_plugin/browser_plugin.h |
diff --git a/content/renderer/browser_plugin/browser_plugin.h b/content/renderer/browser_plugin/browser_plugin.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..955e9ec10df7270217aee2bf0dfd4b1b89d08627 |
--- /dev/null |
+++ b/content/renderer/browser_plugin/browser_plugin.h |
@@ -0,0 +1,91 @@ |
+// Copyright (c) 2012 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 CONTENT_RENDERER_BROWSER_PLUGIN_BROWSER_PLUGIN_H_ |
+#define CONTENT_RENDERER_BROWSER_PLUGIN_BROWSER_PLUGIN_H_ |
+#pragma once |
+ |
+#include "base/process.h" |
+#include "content/renderer/render_view_impl.h" |
+#include "ipc/ipc_channel_handle.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginParams.h" |
+#include "ui/gfx/size.h" |
+#include "webkit/plugins/webview_plugin.h" |
+ |
+namespace content { |
+class RenderView; |
+} |
+ |
+namespace WebKit { |
+class WebPlugin; |
+} |
+ |
+// A browser plugin is a plugin container that hosts an out-of-process "guest" |
+// RenderView. Loading up a new process, creating a new RenderView, navigating |
+// to a given URL, and establishing a guest-to-embedder channel can take |
+// hundreds of milliseconds. Furthermore, a RenderView's associated browser-side |
+// WebContents, RenderViewHost, and SiteInstance must be created and accessed on |
+// the UI thread of the browser process. |
+// |
+// To avoid blocking the embedder RenderView and to avoid introducing the |
+// potential for deadlock, BrowserPlugin attaches a placeholder that takes |
+// place of the guest RenderView until the guest has established a connection |
+// with its embedder RenderView. This permits asynchronously loading of the |
+// guest while the embedder RenderView is permitted to continue to receive and |
+// process events. |
+// |
+// Furthermore, certain navigations can swap to a new guest RenderView on an |
+// different process. BrowserPlugin is the consistent facade that the embedder's |
+// WebKit instance talks to regardless of which process it's communicating with. |
+class BrowserPlugin { |
+ public: |
+ // Creates a new WebViewPlugin with a BrowserPlugin as a delegate. |
+ static WebKit::WebPlugin* Create( |
+ RenderViewImpl* render_view, |
+ WebKit::WebFrame* frame, |
+ const WebKit::WebPluginParams& params); |
+ |
+ static BrowserPlugin* FromID(int id); |
+ |
+ webkit::WebViewPlugin* placeholder() { return placeholder_; } |
+ |
+ webkit::ppapi::WebPluginImpl* plugin() { return plugin_; } |
+ |
+ const WebKit::WebPluginParams& plugin_params() const { |
+ return plugin_params_; |
+ } |
+ |
+ void LoadGuest(int guest_process_id, |
+ const IPC::ChannelHandle& channel_handle); |
+ |
+ RenderViewImpl* render_view() { return render_view_; } |
+ |
+ private: |
+ BrowserPlugin(RenderViewImpl* render_view, |
+ WebKit::WebFrame* frame, |
+ const WebKit::WebPluginParams& params, |
+ const std::string& html_data); |
+ virtual ~BrowserPlugin(); |
+ |
+ // Parses the width, height, and source URL of the browser plugin |
+ // from the element's attributes and outputs them to size and src. If not |
+ // found, it uses the defaults specified here as parameters. |
+ void ParsePluginParameters(int default_width, int default_height, |
+ const std::string& default_src, |
+ gfx::Size* size, |
+ std::string* src); |
+ // Replace the current guest with a new guest. |
+ void Replace(webkit::ppapi::WebPluginImpl* new_plugin); |
+ |
+ RenderViewImpl* render_view_; |
+ WebKit::WebPluginParams plugin_params_; |
+ webkit::WebViewPlugin* placeholder_; |
+ webkit::ppapi::WebPluginImpl* plugin_; |
+ int id_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BrowserPlugin); |
+}; |
+ |
+#endif // CONTENT_RENDERER_BROWSER_PLUGIN_BROWSER_PLUGIN_H_ |