Index: chrome/browser/extensions/lazy_background_task_queue.cc |
diff --git a/chrome/browser/extensions/lazy_background_task_queue.cc b/chrome/browser/extensions/lazy_background_task_queue.cc |
index b449f88d424bab45baa6d4df5a86684560440453..1d0b01c02b21b556b200c6239d6bed719c2c49c1 100644 |
--- a/chrome/browser/extensions/lazy_background_task_queue.cc |
+++ b/chrome/browser/extensions/lazy_background_task_queue.cc |
@@ -5,7 +5,6 @@ |
#include "chrome/browser/extensions/lazy_background_task_queue.h" |
#include "base/callback.h" |
-#include "base/message_loop.h" |
#include "chrome/browser/extensions/extension_host.h" |
#include "chrome/browser/extensions/extension_process_manager.h" |
#include "chrome/browser/extensions/extension_service.h" |
@@ -44,8 +43,7 @@ bool LazyBackgroundTaskQueue::ShouldEnqueueTask( |
Profile* profile, const Extension* extension) { |
DCHECK(extension); |
if (extension->has_lazy_background_page()) { |
- ExtensionProcessManager* pm = |
- ExtensionSystem::Get(profile)->process_manager(); |
+ ExtensionProcessManager* pm = profile->GetExtensionProcessManager(); |
ExtensionHost* background_host = |
pm->GetBackgroundHostForExtension(extension->id()); |
if (!background_host || !background_host->did_stop_loading()) |
@@ -68,37 +66,21 @@ void LazyBackgroundTaskQueue::AddPendingTask( |
tasks_list = new PendingTasksList(); |
pending_tasks_[key] = linked_ptr<PendingTasksList>(tasks_list); |
- // If this is the first enqueued task, and we're not waiting for the |
- // background page to unload, ensure the background page is loaded. |
- if (pending_page_loads_.count(key) == 0) |
- StartLazyBackgroundPage(profile, extension_id); |
- } else { |
- tasks_list = it->second.get(); |
- } |
- |
- tasks_list->push_back(task); |
-} |
- |
-void LazyBackgroundTaskQueue::StartLazyBackgroundPage( |
- Profile* profile, const std::string& extension_id) { |
- ExtensionProcessManager* pm = |
- ExtensionSystem::Get(profile)->process_manager(); |
- if (pm->IsBackgroundHostClosing(extension_id)) { |
- // When the background host finishes closing, we will reload it. |
- pending_page_loads_.insert(PendingTasksKey(profile, extension_id)); |
- return; |
- } |
- |
- const Extension* extension = |
- ExtensionSystem::Get(profile)->extension_service()-> |
- extensions()->GetByID(extension_id); |
- if (extension) { |
+ // If this is the first enqueued task, ensure the background page |
+ // is loaded. |
+ const Extension* extension = |
+ ExtensionSystem::Get(profile)->extension_service()-> |
+ extensions()->GetByID(extension_id); |
DCHECK(extension->has_lazy_background_page()); |
+ ExtensionProcessManager* pm = |
+ ExtensionSystem::Get(profile)->process_manager(); |
pm->IncrementLazyKeepaliveCount(extension); |
pm->CreateBackgroundHost(extension, extension->GetBackgroundURL()); |
+ } else { |
+ tasks_list = it->second.get(); |
} |
- pending_page_loads_.erase(PendingTasksKey(profile, extension_id)); |
+ tasks_list->push_back(task); |
} |
void LazyBackgroundTaskQueue::ProcessPendingTasks( |
@@ -153,25 +135,16 @@ void LazyBackgroundTaskQueue::Observe( |
break; |
} |
case chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED: { |
+ // Notify consumers about the load failure when the background host dies. |
+ // This can happen if the extension crashes. This is not strictly |
+ // necessary, since we also unload the extension in that case (which |
+ // dispatches the tasks below), but is a good extra precaution. |
Profile* profile = content::Source<Profile>(source).ptr(); |
ExtensionHost* host = |
content::Details<ExtensionHost>(details).ptr(); |
if (host->extension_host_type() == |
chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { |
- PendingTasksKey key(profile, host->extension()->id()); |
- if (pending_page_loads_.count(key) > 0) { |
- // We were waiting for the background page to unload. We can start it |
- // up again and dispatch any queued events. |
- MessageLoop::current()->PostTask(FROM_HERE, base::Bind( |
- &LazyBackgroundTaskQueue::StartLazyBackgroundPage, |
- AsWeakPtr(), profile, host->extension()->id())); |
- } else { |
- // This may be a load failure (e.g. a crash). In that case, notify |
- // consumers about the load failure. This is not strictly necessary, |
- // since we also unload the extension in that case (which dispatches |
- // the tasks below), but is a good extra precaution. |
- ProcessPendingTasks(NULL, profile, host->extension()); |
- } |
+ ProcessPendingTasks(NULL, profile, host->extension()); |
} |
break; |
} |