Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1283)

Unified Diff: chrome/browser/extensions/lazy_background_task_queue.cc

Issue 10082019: Have LazyBackgroundTaskQueue notify consumers when the transient page fails to (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: yoyo Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 bcf7d1c4f18d88b90ae84b4f818c9abfd3d93a44..bb1b1a21d238d00fc82d0f2161d915a13776e8f1 100644
--- a/chrome/browser/extensions/lazy_background_task_queue.cc
+++ b/chrome/browser/extensions/lazy_background_task_queue.cc
@@ -8,6 +8,7 @@
#include "chrome/browser/extensions/extension_host.h"
#include "chrome/browser/extensions/extension_process_manager.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_system.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/extensions/process_map.h"
#include "chrome/browser/profiles/profile.h"
@@ -65,10 +66,12 @@ void LazyBackgroundTaskQueue::AddPendingTask(
// If this is the first enqueued task, ensure the background page
// is loaded.
- const Extension* extension = profile->GetExtensionService()->
- extensions()->GetByID(extension_id);
+ const Extension* extension =
+ ExtensionSystem::Get(profile)->extension_service()->
+ extensions()->GetByID(extension_id);
DCHECK(extension->has_lazy_background_page());
- ExtensionProcessManager* pm = profile->GetExtensionProcessManager();
+ ExtensionProcessManager* pm =
+ ExtensionSystem::Get(profile)->process_manager();
pm->IncrementLazyKeepaliveCount(extension);
pm->CreateBackgroundHost(extension, extension->GetBackgroundURL());
} else {
@@ -78,11 +81,18 @@ void LazyBackgroundTaskQueue::AddPendingTask(
tasks_list->push_back(task);
}
-void LazyBackgroundTaskQueue::ProcessPendingTasks(ExtensionHost* host) {
- PendingTasksKey key(host->profile(), host->extension()->id());
+void LazyBackgroundTaskQueue::ProcessPendingTasks(
+ ExtensionHost* host,
+ Profile* profile,
+ const Extension* extension) {
+ if (!profile->IsSameProfile(profile_) ||
+ !extension->has_lazy_background_page())
+ return;
+
+ PendingTasksKey key(profile, extension->id());
PendingTasksMap::iterator map_it = pending_tasks_.find(key);
if (map_it == pending_tasks_.end()) {
- NOTREACHED(); // lazy page should not load without any pending tasks
+ CHECK(!host); // lazy page should not load without any pending tasks
return;
}
@@ -95,9 +105,12 @@ void LazyBackgroundTaskQueue::ProcessPendingTasks(ExtensionHost* host) {
tasks->clear();
pending_tasks_.erase(map_it);
- // Balance the keepalive in AddPendingTask.
- host->profile()->GetExtensionProcessManager()->
- DecrementLazyKeepaliveCount(host->extension());
+ // Balance the keepalive in AddPendingTask. Note we don't do this on a
+ // failure to load, because the keepalive count is reset in that case.
+ if (host) {
+ ExtensionSystem::Get(profile)->process_manager()->
+ DecrementLazyKeepaliveCount(extension);
+ }
}
void LazyBackgroundTaskQueue::Observe(
@@ -109,38 +122,36 @@ void LazyBackgroundTaskQueue::Observe(
// If an on-demand background page finished loading, dispatch queued up
// events for it.
ExtensionHost* host = content::Details<ExtensionHost>(details).ptr();
- if (host->profile()->IsSameProfile(profile_) &&
- host->extension_host_type() ==
- chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE &&
- host->extension()->has_lazy_background_page()) {
+ if (host->extension_host_type() ==
+ chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) {
CHECK(host->did_stop_loading());
- ProcessPendingTasks(host);
+ ProcessPendingTasks(host, host->profile(), host->extension());
}
break;
}
case chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED: {
- // Clear pending tasks 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 clears the tasks below),
- // but is a good extra precaution.
+ // 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) {
- pending_tasks_.erase(PendingTasksKey(profile, host->extension()->id()));
+ ProcessPendingTasks(NULL, profile, host->extension());
}
break;
}
case chrome::NOTIFICATION_EXTENSION_UNLOADED: {
- // Clear pending tasks for this extension.
+ // Notify consumers that the page failed to load.
Profile* profile = content::Source<Profile>(source).ptr();
UnloadedExtensionInfo* unloaded =
content::Details<UnloadedExtensionInfo>(details).ptr();
- pending_tasks_.erase(PendingTasksKey(
- profile, unloaded->extension->id()));
- if (profile->HasOffTheRecordProfile())
- pending_tasks_.erase(PendingTasksKey(
- profile->GetOffTheRecordProfile(), unloaded->extension->id()));
+ ProcessPendingTasks(NULL, profile, unloaded->extension);
+ if (profile->HasOffTheRecordProfile()) {
+ ProcessPendingTasks(NULL, profile->GetOffTheRecordProfile(),
+ unloaded->extension);
+ }
break;
}
default:

Powered by Google App Engine
This is Rietveld 408576698