Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(693)

Unified Diff: content/renderer/browser_plugin/browser_plugin.cc

Issue 250063002: Browser Plugin: Simplified guest attachment (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed New Window API test Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/browser_plugin/browser_plugin.cc
diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc
index b4cbebee86ea9a8135d5ae13d3e15e8817882614..131f71215f0095e3427a9bfd8c13438cfb221fef 100644
--- a/content/renderer/browser_plugin/browser_plugin.cc
+++ b/content/renderer/browser_plugin/browser_plugin.cc
@@ -61,11 +61,6 @@ static std::string GetInternalEventName(const char* event_name) {
return base::StringPrintf("-internal-%s", event_name);
}
-typedef std::map<blink::WebPluginContainer*,
- BrowserPlugin*> PluginContainerMap;
-static base::LazyInstance<PluginContainerMap> g_plugin_container_map =
- LAZY_INSTANCE_INITIALIZER;
-
} // namespace
BrowserPlugin::BrowserPlugin(RenderViewImpl* render_view,
@@ -108,14 +103,6 @@ BrowserPlugin::~BrowserPlugin() {
guest_instance_id_));
}
-/*static*/
-BrowserPlugin* BrowserPlugin::FromContainer(
- blink::WebPluginContainer* container) {
- PluginContainerMap* browser_plugins = g_plugin_container_map.Pointer();
- PluginContainerMap::iterator it = browser_plugins->find(container);
- return it == browser_plugins->end() ? NULL : it->second;
-}
-
bool BrowserPlugin::OnMessageReceived(const IPC::Message& message) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(BrowserPlugin, message)
@@ -380,13 +367,10 @@ bool BrowserPlugin::UsesPendingDamageBuffer(
void BrowserPlugin::OnInstanceIDAllocated(int guest_instance_id) {
CHECK(guest_instance_id != browser_plugin::kInstanceIDNone);
- before_first_navigation_ = false;
- guest_instance_id_ = guest_instance_id;
- browser_plugin_manager()->AddBrowserPlugin(guest_instance_id, this);
if (auto_navigate_) {
scoped_ptr<base::DictionaryValue> params(new base::DictionaryValue());
- Attach(params.Pass());
+ Attach(guest_instance_id, params.Pass());
return;
}
@@ -396,7 +380,20 @@ void BrowserPlugin::OnInstanceIDAllocated(int guest_instance_id) {
TriggerEvent(browser_plugin::kEventInternalInstanceIDAllocated, &props);
}
-void BrowserPlugin::Attach(scoped_ptr<base::DictionaryValue> extra_params) {
+void BrowserPlugin::Attach(int guest_instance_id,
+ scoped_ptr<base::DictionaryValue> extra_params) {
+ CHECK(guest_instance_id != browser_plugin::kInstanceIDNone);
+
+ // If this BrowserPlugin is already attached to a guest, then do nothing.
+ if (HasGuestInstanceID())
+ return;
+
+ // This API may be called directly without setting the src attribute.
+ // In that case, we need to make sure we don't allocate another instance ID.
+ before_first_navigation_ = false;
+ guest_instance_id_ = guest_instance_id;
+ browser_plugin_manager()->AddBrowserPlugin(guest_instance_id, this);
+
BrowserPluginHostMsg_Attach_Params attach_params;
attach_params.focused = ShouldGuestBeFocused();
attach_params.visible = visible_;
@@ -693,57 +690,6 @@ NPObject* BrowserPlugin::GetContentWindow() const {
return guest_frame->windowObject();
}
-// static
-bool BrowserPlugin::AttachWindowTo(const blink::WebNode& node, int window_id) {
- if (node.isNull())
- return false;
-
- if (!node.isElementNode())
- return false;
-
- blink::WebElement shim_element = node.toConst<blink::WebElement>();
- // The shim containing the BrowserPlugin must be attached to a document.
- if (shim_element.document().isNull())
- return false;
-
- blink::WebNode shadow_root = shim_element.shadowRoot();
- if (shadow_root.isNull() || !shadow_root.hasChildNodes())
- return false;
-
- blink::WebNode plugin_element = shadow_root.firstChild();
- blink::WebPluginContainer* plugin_container =
- plugin_element.pluginContainer();
- if (!plugin_container)
- return false;
-
- BrowserPlugin* browser_plugin =
- BrowserPlugin::FromContainer(plugin_container);
- if (!browser_plugin)
- return false;
-
- // If the BrowserPlugin has already begun to navigate then we shouldn't allow
- // attaching a different guest.
- //
- // Navigation happens in two stages.
- // 1. BrowserPlugin requests an instance ID from the browser process.
- // 2. The browser process returns an instance ID and BrowserPlugin is
- // "Attach"ed to that instance ID.
- // If the instance ID is new then a new guest will be created.
- // If the instance ID corresponds to an unattached guest then BrowserPlugin
- // is attached to that guest.
- //
- // Between step 1, and step 2, BrowserPlugin::AttachWindowTo may be called.
- // The check below ensures that BrowserPlugin:Attach does not get called with
- // a different instance ID after step 1 has happened.
- // TODO(fsamuel): We may wish to support reattaching guests in the future:
- // http://crbug.com/156219.
- if (browser_plugin->HasNavigated())
- return false;
-
- browser_plugin->OnInstanceIDAllocated(window_id);
- return true;
-}
-
bool BrowserPlugin::HasNavigated() const {
return !before_first_navigation_;
}
@@ -914,7 +860,6 @@ bool BrowserPlugin::initialize(WebPluginContainer* container) {
container_ = container;
container_->setWantsWheelEvents(true);
ParseAttributes();
- g_plugin_container_map.Get().insert(std::make_pair(container_, this));
return true;
}
@@ -961,9 +906,6 @@ void BrowserPlugin::destroy() {
if (container_)
container_->clearScriptObjects();
- // The BrowserPlugin's WebPluginContainer is deleted immediately after this
- // call returns, so let's not keep a reference to it around.
- g_plugin_container_map.Get().erase(container_);
if (compositing_helper_.get())
compositing_helper_->OnContainerDestroy();
container_ = NULL;
« no previous file with comments | « content/renderer/browser_plugin/browser_plugin.h ('k') | content/renderer/browser_plugin/browser_plugin_bindings.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698