| 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 64b18820671c123d1df68c6e62678bb1f10d7e5c..f42e02a72f91e9e18d022dc70de4f78e57d517c0 100644
|
| --- a/content/renderer/browser_plugin/browser_plugin.cc
|
| +++ b/content/renderer/browser_plugin/browser_plugin.cc
|
| @@ -48,6 +48,8 @@ namespace content {
|
|
|
| namespace {
|
|
|
| +const int INSTANCE_ID_NONE = 0;
|
| +
|
| // Events.
|
| const char kEventExit[] = "exit";
|
| const char kEventLoadAbort[] = "loadabort";
|
| @@ -105,11 +107,10 @@ static std::string GetInternalEventName(const char* event_name) {
|
| }
|
|
|
| BrowserPlugin::BrowserPlugin(
|
| - int instance_id,
|
| RenderViewImpl* render_view,
|
| WebKit::WebFrame* frame,
|
| const WebPluginParams& params)
|
| - : instance_id_(instance_id),
|
| + : instance_id_(INSTANCE_ID_NONE),
|
| render_view_(render_view->AsWeakPtr()),
|
| render_view_routing_id_(render_view->GetRoutingID()),
|
| container_(NULL),
|
| @@ -130,17 +131,22 @@ BrowserPlugin::BrowserPlugin(
|
| plugin_focused_(false),
|
| visible_(true),
|
| size_changed_in_flight_(false),
|
| + allocate_instance_id_sent_(false),
|
| browser_plugin_manager_(render_view->browser_plugin_manager()),
|
| current_nav_entry_index_(0),
|
| nav_entry_count_(0),
|
| compositing_enabled_(false) {
|
| - browser_plugin_manager()->AddBrowserPlugin(instance_id, this);
|
| bindings_.reset(new BrowserPluginBindings(this));
|
|
|
| ParseAttributes(params);
|
| }
|
|
|
| BrowserPlugin::~BrowserPlugin() {
|
| + // If the BrowserPlugin has never navigated then the browser process and
|
| + // BrowserPluginManager don't know about it and so there is nothing to do
|
| + // here.
|
| + if (!navigate_src_sent_)
|
| + return;
|
| browser_plugin_manager()->RemoveBrowserPlugin(instance_id_);
|
| browser_plugin_manager()->Send(
|
| new BrowserPluginHostMsg_PluginDestroyed(
|
| @@ -219,23 +225,26 @@ bool BrowserPlugin::SetSrcAttribute(const std::string& src,
|
| if (src.empty() || (src == src_ && !guest_crashed_))
|
| return true;
|
|
|
| + src_ = src;
|
| +
|
| // If we haven't created the guest yet, do so now. We will navigate it right
|
| // after creation. If |src| is empty, we can delay the creation until we
|
| // actually need it.
|
| if (!navigate_src_sent_) {
|
| - BrowserPluginHostMsg_CreateGuest_Params create_guest_params;
|
| - create_guest_params.storage_partition_id = storage_partition_id_;
|
| - create_guest_params.persist_storage = persist_storage_;
|
| - create_guest_params.focused = ShouldGuestBeFocused();
|
| - create_guest_params.visible = visible_;
|
| - create_guest_params.name = name_;
|
| - GetDamageBufferWithSizeParams(&create_guest_params.auto_size_params,
|
| - &create_guest_params.resize_guest_params);
|
| - browser_plugin_manager()->Send(
|
| - new BrowserPluginHostMsg_CreateGuest(
|
| - render_view_routing_id_,
|
| - instance_id_,
|
| - create_guest_params));
|
| + // On initial navigation, we request an instance ID from the browser
|
| + // process. We essentially ignore all subsequent calls to SetSrcAttribute
|
| + // until we receive an instance ID. |allocate_instance_id_sent_|
|
| + // prevents BrowserPlugin from allocating more than one instance ID.
|
| + // Upon receiving an instance ID from the browser process, we continue
|
| + // the process of navigation by populating the
|
| + // BrowserPluginHostMsg_CreateGuest_Params with the current state of
|
| + // BrowserPlugin and sending a BrowserPluginHostMsg_CreateGuest to the
|
| + // browser process in order to create a new guest.
|
| + if (!allocate_instance_id_sent_) {
|
| + browser_plugin_manager()->AllocateInstanceID(this);
|
| + allocate_instance_id_sent_ = true;
|
| + }
|
| + return true;
|
| }
|
|
|
| browser_plugin_manager()->Send(
|
| @@ -243,11 +252,6 @@ bool BrowserPlugin::SetSrcAttribute(const std::string& src,
|
| render_view_routing_id_,
|
| instance_id_,
|
| src));
|
| - // Record that we sent a NavigateGuest message to embedder.
|
| - // Once this instance has navigated, the storage partition cannot be changed,
|
| - // so this value is used for enforcing this.
|
| - navigate_src_sent_ = true;
|
| - src_ = src;
|
| return true;
|
| }
|
|
|
| @@ -314,6 +318,32 @@ bool BrowserPlugin::UsesPendingDamageBuffer(
|
| return damage_buffer_sequence_id_ == params.damage_buffer_sequence_id;
|
| }
|
|
|
| +void BrowserPlugin::SetInstanceID(int instance_id) {
|
| + CHECK(instance_id != INSTANCE_ID_NONE);
|
| + instance_id_ = instance_id;
|
| + browser_plugin_manager()->AddBrowserPlugin(instance_id, this);
|
| +
|
| + BrowserPluginHostMsg_CreateGuest_Params create_guest_params;
|
| + create_guest_params.storage_partition_id = storage_partition_id_;
|
| + create_guest_params.persist_storage = persist_storage_;
|
| + create_guest_params.focused = ShouldGuestBeFocused();
|
| + create_guest_params.visible = visible_;
|
| + create_guest_params.name = name_;
|
| + create_guest_params.src = src_;
|
| + GetDamageBufferWithSizeParams(&create_guest_params.auto_size_params,
|
| + &create_guest_params.resize_guest_params);
|
| + browser_plugin_manager()->Send(
|
| + new BrowserPluginHostMsg_CreateGuest(
|
| + render_view_routing_id_,
|
| + instance_id_,
|
| + create_guest_params));
|
| +
|
| + // Record that we sent a navigation request to the browser process.
|
| + // Once this instance has navigated, the storage partition cannot be changed,
|
| + // so this value is used for enforcing this.
|
| + navigate_src_sent_ = true;
|
| +}
|
| +
|
| void BrowserPlugin::OnAdvanceFocus(int instance_id, bool reverse) {
|
| DCHECK(render_view_);
|
| render_view_->GetWebView()->advanceFocus(reverse);
|
|
|