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 0e95003d07cc5c1f1954a070275bd698fecff34c..acbbb669c0ba47e754d295abb7e0c1fce67bcb2c 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_in_flight_(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 |
lazyboy
2013/01/17 17:39:25
Do we have a test that destroys BrowserPlugin befo
Fady Samuel
2013/01/17 18:40:38
Done. Added a test.
|
+ // 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( |
@@ -152,6 +158,8 @@ bool BrowserPlugin::OnMessageReceived(const IPC::Message& message) { |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP(BrowserPlugin, message) |
IPC_MESSAGE_HANDLER(BrowserPluginMsg_AdvanceFocus, OnAdvanceFocus) |
+ IPC_MESSAGE_HANDLER(BrowserPluginMsg_AllocateInstanceIDResponse, |
+ OnAllocateInstanceIDResponse) |
IPC_MESSAGE_HANDLER(BrowserPluginMsg_BuffersSwapped, OnBuffersSwapped) |
IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestContentWindowReady, |
OnGuestContentWindowReady) |
@@ -219,23 +227,17 @@ 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)); |
+ if (!allocate_instance_id_in_flight_) { |
lazyboy
2013/01/17 17:39:25
I'd put a short version of your CL description as
Fady Samuel
2013/01/17 18:40:38
Done.
Fady Samuel
2013/01/17 18:40:38
Done.
Fady Samuel
2013/01/17 18:40:38
Done.
|
+ browser_plugin_manager()->AllocateInstanceID(this); |
+ allocate_instance_id_in_flight_ = true; |
lazyboy
2013/01/17 17:39:25
more state booleans. possible cleanup opportunitie
Fady Samuel
2013/01/17 18:40:38
Agreed, there's room for cleanup here. mthiesse@ i
|
+ } |
+ return true; |
} |
browser_plugin_manager()->Send( |
@@ -243,11 +245,6 @@ bool BrowserPlugin::SetSrcAttribute(const std::string& src, |
render_view_routing_id_, |
instance_id_, |
src)); |
- // Record that we sent a NavigateGuest message to embedder. |
lazyboy
2013/01/17 17:39:25
Keep this comment in OnAllocateInstanceIDResponse(
Fady Samuel
2013/01/17 18:40:38
Done.
|
- // 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 +311,29 @@ bool BrowserPlugin::UsesPendingDamageBuffer( |
return damage_buffer_sequence_id_ == params.damage_buffer_sequence_id; |
} |
+void BrowserPlugin::OnAllocateInstanceIDResponse(int request_id, |
+ int instance_id) { |
+ 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)); |
+ |
+ navigate_src_sent_ = true; |
+} |
+ |
void BrowserPlugin::OnAdvanceFocus(int instance_id, bool reverse) { |
DCHECK(render_view_); |
render_view_->GetWebView()->advanceFocus(reverse); |