| 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 682c1f466e6504c106c2e850fab215878971c199..ba969b84251879528b59451abee0b6c51ea48d94 100644
|
| --- a/chrome/browser/extensions/api/runtime/runtime_api.cc
|
| +++ b/chrome/browser/extensions/api/runtime/runtime_api.cc
|
| @@ -28,6 +28,7 @@
|
| #include "content/public/browser/notification_service.h"
|
| #include "content/public/browser/render_process_host.h"
|
| #include "content/public/browser/render_view_host.h"
|
| +#include "extensions/browser/extensions_browser_client.h"
|
| #include "extensions/browser/lazy_background_task_queue.h"
|
| #include "extensions/browser/process_manager.h"
|
| #include "extensions/common/error_utils.h"
|
| @@ -41,6 +42,8 @@
|
| #include "chromeos/dbus/power_manager_client.h"
|
| #endif
|
|
|
| +using content::BrowserContext;
|
| +
|
| namespace GetPlatformInfo = extensions::api::runtime::GetPlatformInfo;
|
|
|
| namespace extensions {
|
| @@ -132,6 +135,93 @@ std::string GetUninstallUrl(ExtensionPrefs* prefs,
|
|
|
| } // namespace
|
|
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +RuntimeAPI::RuntimeAPI(content::BrowserContext* context)
|
| + : browser_context_(context),
|
| + dispatch_chrome_updated_event_(false) {
|
| + registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY,
|
| + content::Source<BrowserContext>(context));
|
| + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
|
| + content::Source<BrowserContext>(context));
|
| + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED,
|
| + content::Source<BrowserContext>(context));
|
| +
|
| + // Check if registered events are up-to-date. We can only do this once
|
| + // per browser context, since it updates internal state when called.
|
| + dispatch_chrome_updated_event_ =
|
| + ExtensionsBrowserClient::Get()->DidVersionUpdate(browser_context_);
|
| +}
|
| +
|
| +RuntimeAPI::~RuntimeAPI() {}
|
| +
|
| +void RuntimeAPI::Observe(int type,
|
| + const content::NotificationSource& source,
|
| + const content::NotificationDetails& details) {
|
| + switch (type) {
|
| + case chrome::NOTIFICATION_EXTENSIONS_READY: {
|
| + OnExtensionsReady();
|
| + break;
|
| + }
|
| + case chrome::NOTIFICATION_EXTENSION_LOADED: {
|
| + const Extension* extension =
|
| + content::Details<const Extension>(details).ptr();
|
| + OnExtensionLoaded(extension);
|
| + break;
|
| + }
|
| + case chrome::NOTIFICATION_EXTENSION_INSTALLED: {
|
| + const Extension* extension =
|
| + content::Details<const InstalledExtensionInfo>(details)->extension;
|
| + OnExtensionInstalled(extension);
|
| + break;
|
| + }
|
| + default:
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| +}
|
| +
|
| +void RuntimeAPI::OnExtensionsReady() {
|
| + // We're done restarting Chrome after an update.
|
| + dispatch_chrome_updated_event_ = false;
|
| +}
|
| +
|
| +void RuntimeAPI::OnExtensionLoaded(const Extension* extension) {
|
| + if (!dispatch_chrome_updated_event_)
|
| + return;
|
| +
|
| + // Dispatch the onInstalled event with reason "chrome_update".
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&RuntimeEventRouter::DispatchOnInstalledEvent,
|
| + browser_context_,
|
| + extension->id(),
|
| + Version(),
|
| + true));
|
| +}
|
| +
|
| +void RuntimeAPI::OnExtensionInstalled(const Extension* extension) {
|
| + // Get the previous version to check if this is an upgrade.
|
| + ExtensionService* service = ExtensionSystem::GetForBrowserContext(
|
| + browser_context_)->extension_service();
|
| + const Extension* old = service->GetExtensionById(extension->id(), true);
|
| + Version old_version;
|
| + if (old)
|
| + old_version = *old->version();
|
| +
|
| + // Dispatch the onInstalled event.
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&RuntimeEventRouter::DispatchOnInstalledEvent,
|
| + browser_context_,
|
| + extension->id(),
|
| + old_version,
|
| + false));
|
| +
|
| +}
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| // static
|
| void RuntimeEventRouter::DispatchOnStartupEvent(
|
| content::BrowserContext* context, const std::string& extension_id) {
|
| @@ -146,6 +236,8 @@ void RuntimeEventRouter::DispatchOnInstalledEvent(
|
| const std::string& extension_id,
|
| const Version& old_version,
|
| bool chrome_updated) {
|
| + if (!ExtensionsBrowserClient::Get()->IsValidContext(context))
|
| + return;
|
| ExtensionSystem* system = ExtensionSystem::GetForBrowserContext(context);
|
| if (!system)
|
| return;
|
|
|