Index: chrome/browser/extensions/api/runtime/runtime_api.cc |
diff --git a/chrome/browser/extensions/api/runtime/runtime_api.cc b/chrome/browser/extensions/api/runtime/runtime_api.cc |
index 47b8f571b5716a4b63e9fa22d4a19dcfd32af1ba..39d30a9b02163c44d5f4678163e64defd80afc54 100644 |
--- a/chrome/browser/extensions/api/runtime/runtime_api.cc |
+++ b/chrome/browser/extensions/api/runtime/runtime_api.cc |
@@ -4,24 +4,66 @@ |
#include "chrome/browser/extensions/api/runtime/runtime_api.h" |
+#include "chrome/browser/browser_process.h" |
#include "chrome/browser/extensions/event_router.h" |
#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/lazy_background_task_queue.h" |
#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/profiles/profile_manager.h" |
#include "chrome/common/extensions/extension.h" |
#include "googleurl/src/gurl.h" |
+namespace extensions { |
+ |
namespace { |
+const char kOnStartupEvent[] = "runtime.onStartup"; |
const char kOnInstalledEvent[] = "runtime.onInstalled"; |
const char kNoBackgroundPageError[] = "You do not have a background page."; |
const char kPageLoadError[] = "Background page failed to load."; |
+static void DispatchOnStartupEventImpl( |
+ Profile* profile, |
+ const std::string& extension_id, |
+ bool first_call, |
+ ExtensionHost* unused) { |
+ if (g_browser_process->IsShuttingDown() || |
+ !g_browser_process->profile_manager()->IsValidProfile(profile)) |
+ return; |
+ ExtensionSystem* system = ExtensionSystem::Get(profile); |
+ if (!system) |
+ return; |
+ |
+ // If this is a persistent background page, we want to wait for it to load |
+ // (it might not be ready, since this is startup). But only enqueue once. |
+ // If it fails to load the first time, don't bother trying again. |
+ const Extension* extension = |
+ system->extension_service()->extensions()->GetByID(extension_id); |
+ if (extension && extension->has_persistent_background_page() && first_call && |
+ system->lazy_background_task_queue()-> |
+ ShouldEnqueueTask(profile, extension)) { |
+ system->lazy_background_task_queue()->AddPendingTask( |
+ profile, extension_id, |
+ base::Bind(&DispatchOnStartupEventImpl, |
+ profile, extension_id, false)); |
+ return; |
+ } |
+ |
+ scoped_ptr<ListValue> event_args(new ListValue()); |
+ system->event_router()->DispatchEventToExtension( |
+ extension_id, kOnStartupEvent, event_args.Pass(), NULL, GURL()); |
} |
-namespace extensions { |
+} // namespace |
+ |
+// static |
+void RuntimeEventRouter::DispatchOnStartupEvent( |
+ Profile* profile, const std::string& extension_id) { |
+ DispatchOnStartupEventImpl(profile, extension_id, true, NULL); |
+} |
// static |
void RuntimeEventRouter::DispatchOnInstalledEvent( |