Index: chrome/browser/extensions/extension_process_manager.cc |
diff --git a/chrome/browser/extensions/extension_process_manager.cc b/chrome/browser/extensions/extension_process_manager.cc |
index ac453d6182d0aec5ae03f332171aeadcec37c91a..0de5da4243f6f88e95b851033719c2a931739df7 100644 |
--- a/chrome/browser/extensions/extension_process_manager.cc |
+++ b/chrome/browser/extensions/extension_process_manager.cc |
@@ -112,9 +112,9 @@ struct ExtensionProcessManager::BackgroundPageData { |
int close_sequence_id; |
// True if the page responded to the ShouldUnload message and is currently |
- // dispatching the unload event. We use this to ignore any activity |
- // generated during the unload event that would otherwise keep the |
- // extension alive. |
+ // dispatching the unload event. During this time any events that arrive will |
+ // cancel the unload process and an onSuspendCanceled event will be dispatched |
+ // to the page. |
bool is_closing; |
// Keeps track of when this page was last unloaded. Used for perf metrics. |
@@ -431,17 +431,12 @@ int ExtensionProcessManager::DecrementLazyKeepaliveCount( |
int& count = background_page_data_[extension->id()].lazy_keepalive_count; |
DCHECK_GT(count, 0); |
- if (--count == 0) { |
- MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&ExtensionProcessManager::OnLazyBackgroundPageIdle, |
- weak_ptr_factory_.GetWeakPtr(), extension->id(), |
- ++background_page_data_[extension->id()].close_sequence_id), |
- event_page_idle_time_); |
- } |
+ --count; |
+ MaybePostOnLazyBackgroundPageIdle(extension->id()); |
return count; |
} |
+ |
void ExtensionProcessManager::IncrementLazyKeepaliveCountForView( |
RenderViewHost* render_view_host) { |
WebContents* web_contents = |
@@ -456,6 +451,18 @@ void ExtensionProcessManager::IncrementLazyKeepaliveCountForView( |
} |
} |
+void ExtensionProcessManager::MaybePostOnLazyBackgroundPageIdle( |
+ const std::string& extension_id) { |
+ if (background_page_data_[extension_id].lazy_keepalive_count == 0) { |
+ MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, |
+ base::Bind(&ExtensionProcessManager::OnLazyBackgroundPageIdle, |
+ weak_ptr_factory_.GetWeakPtr(), extension_id, |
+ ++background_page_data_[extension_id].close_sequence_id), |
+ event_page_idle_time_); |
+ } |
+} |
+ |
void ExtensionProcessManager::OnLazyBackgroundPageIdle( |
const std::string& extension_id, int sequence_id) { |
ExtensionHost* host = GetBackgroundHostForExtension(extension_id); |
@@ -492,19 +499,24 @@ void ExtensionProcessManager::OnShouldUnloadAck( |
} |
void ExtensionProcessManager::OnUnloadAck(const std::string& extension_id) { |
+ background_page_data_[extension_id].is_closing = true; |
+ int sequence_id = background_page_data_[extension_id].close_sequence_id; |
MessageLoop::current()->PostDelayedTask( |
FROM_HERE, |
base::Bind(&ExtensionProcessManager::CloseLazyBackgroundPageNow, |
- weak_ptr_factory_.GetWeakPtr(), extension_id), |
+ weak_ptr_factory_.GetWeakPtr(), extension_id, sequence_id), |
event_page_unloading_time_); |
} |
void ExtensionProcessManager::CloseLazyBackgroundPageNow( |
- const std::string& extension_id) { |
- background_page_data_[extension_id].is_closing = true; |
+ const std::string& extension_id, int sequence_id) { |
ExtensionHost* host = GetBackgroundHostForExtension(extension_id); |
- if (host) |
- CloseBackgroundHost(host); |
+ if (host && |
+ sequence_id == background_page_data_[extension_id].close_sequence_id) { |
+ ExtensionHost* host = GetBackgroundHostForExtension(extension_id); |
+ if (host) |
+ CloseBackgroundHost(host); |
+ } |
} |
void ExtensionProcessManager::OnNetworkRequestStarted( |
@@ -523,6 +535,20 @@ void ExtensionProcessManager::OnNetworkRequestDone( |
DecrementLazyKeepaliveCount(host->extension()); |
} |
+void ExtensionProcessManager::CancelSuspend(const std::string& extension_id) { |
+ ExtensionHost* host = GetBackgroundHostForExtension(extension_id); |
+ if (host) { |
+ bool& is_closing = background_page_data_[extension_id].is_closing; |
+ if (is_closing) { |
+ host->render_view_host()->Send( |
+ new ExtensionMsg_CancelUnload(extension_id)); |
+ is_closing = false; |
+ } |
+ } |
+ OnLazyBackgroundPageActive(extension_id); |
+ MaybePostOnLazyBackgroundPageIdle(extension_id); |
+} |
+ |
void ExtensionProcessManager::Observe( |
int type, |
const content::NotificationSource& source, |