| 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,
|
|
|