Commit 6388614c authored by limasdf@gmail.com's avatar limasdf@gmail.com

Remove deprecated extension notifications and

Use ExtensionRegistry instead from file_system, location, management apis.
and Use content:BrowserContext instead of Profile.
and Remove unwanted extensions:: namespace prefix from management api.

TEST=browser_tests --gtest_filter=FileSystemApiTest.*
R=rdevlin.cronin@chromium.org
BUG=354046

Review URL: https://codereview.chromium.org/330383003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@278486 0039d316-1c4b-4281-b951-d872f2087c98
parent 77a40452
...@@ -5,41 +5,42 @@ ...@@ -5,41 +5,42 @@
#include "apps/saved_files_service.h" #include "apps/saved_files_service.h"
#include "base/file_util.h" #include "base/file_util.h"
#include "base/path_service.h" #include "base/path_service.h"
#include "base/scoped_observer.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "chrome/browser/apps/app_browsertest_util.h" #include "chrome/browser/apps/app_browsertest_util.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/extensions/api/file_system/file_system_api.h" #include "chrome/browser/extensions/api/file_system/file_system_api.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_paths.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_service.h"
#include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_registry_observer.h"
namespace content {
class BrowserContext;
}
namespace extensions { namespace extensions {
namespace { namespace {
class AppInstallObserver : public content::NotificationObserver { class AppLoadObserver : public ExtensionRegistryObserver {
public: public:
AppInstallObserver( AppLoadObserver(content::BrowserContext* browser_context,
base::Callback<void(const Extension*)> callback) base::Callback<void(const Extension*)> callback)
: callback_(callback) { : callback_(callback), extension_registry_observer_(this) {
registrar_.Add(this, extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context));
chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED,
content::NotificationService::AllSources());
} }
virtual void Observe(int type, virtual void OnExtensionLoaded(content::BrowserContext* browser_context,
const content::NotificationSource& source, const Extension* extension) OVERRIDE {
const content::NotificationDetails& details) OVERRIDE { callback_.Run(extension);
EXPECT_EQ(chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, type);
callback_.Run(content::Details<const Extension>(details).ptr());
} }
private: private:
content::NotificationRegistrar registrar_;
base::Callback<void(const Extension*)> callback_; base::Callback<void(const Extension*)> callback_;
DISALLOW_COPY_AND_ASSIGN(AppInstallObserver); ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
extension_registry_observer_;
DISALLOW_COPY_AND_ASSIGN(AppLoadObserver);
}; };
void SetLastChooseEntryDirectory(const base::FilePath& choose_entry_directory, void SetLastChooseEntryDirectory(const base::FilePath& choose_entry_directory,
...@@ -197,10 +198,10 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, ...@@ -197,10 +198,10 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
FileSystemChooseEntryFunction:: FileSystemChooseEntryFunction::
SkipPickerAndSelectSuggestedPathForTest(); SkipPickerAndSelectSuggestedPathForTest();
{ {
AppInstallObserver observer( AppLoadObserver observer(profile(),
base::Bind(SetLastChooseEntryDirectory, base::Bind(SetLastChooseEntryDirectory,
test_file.DirName(), test_file.DirName(),
ExtensionPrefs::Get(profile()))); ExtensionPrefs::Get(profile())));
ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_existing")) ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_existing"))
<< message_; << message_;
} }
...@@ -216,11 +217,12 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, ...@@ -216,11 +217,12 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest,
FileSystemChooseEntryFunction:: FileSystemChooseEntryFunction::
SkipPickerAndSelectSuggestedPathForTest(); SkipPickerAndSelectSuggestedPathForTest();
{ {
AppInstallObserver observer(base::Bind( AppLoadObserver observer(
SetLastChooseEntryDirectory, profile(),
test_file.DirName().Append( base::Bind(SetLastChooseEntryDirectory,
base::FilePath::FromUTF8Unsafe("fake_directory_does_not_exist")), test_file.DirName().Append(base::FilePath::FromUTF8Unsafe(
ExtensionPrefs::Get(profile()))); "fake_directory_does_not_exist")),
ExtensionPrefs::Get(profile())));
ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_existing")) ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/open_existing"))
<< message_; << message_;
} }
...@@ -608,11 +610,11 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiRestoreEntry) { ...@@ -608,11 +610,11 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiRestoreEntry) {
ASSERT_FALSE(test_file.empty()); ASSERT_FALSE(test_file.empty());
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file); &test_file);
AppInstallObserver observer( AppLoadObserver observer(profile(),
base::Bind(AddSavedEntry, base::Bind(AddSavedEntry,
test_file, test_file,
false, false,
apps::SavedFilesService::Get(profile()))); apps::SavedFilesService::Get(profile())));
ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/restore_entry")) ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/restore_entry"))
<< message_; << message_;
} }
...@@ -623,11 +625,11 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiRestoreDirectoryEntry) { ...@@ -623,11 +625,11 @@ IN_PROC_BROWSER_TEST_F(FileSystemApiTest, FileSystemApiRestoreDirectoryEntry) {
base::FilePath test_directory = test_file.DirName(); base::FilePath test_directory = test_file.DirName();
FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest( FileSystemChooseEntryFunction::SkipPickerAndAlwaysSelectPathForTest(
&test_file); &test_file);
AppInstallObserver observer( AppLoadObserver observer(profile(),
base::Bind(AddSavedEntry, base::Bind(AddSavedEntry,
test_directory, test_directory,
true, true,
apps::SavedFilesService::Get(profile()))); apps::SavedFilesService::Get(profile())));
ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/restore_directory")) ASSERT_TRUE(RunPlatformAppTest("api_test/file_system/restore_directory"))
<< message_; << message_;
} }
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
#include "chrome/browser/extensions/api/location/location_api.h" #include "chrome/browser/extensions/api/location/location_api.h"
#include "chrome/browser/extensions/api/location/location_manager.h" #include "chrome/browser/extensions/api/location/location_manager.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/extensions/api/location.h" #include "chrome/common/extensions/api/location.h"
#include "extensions/common/error_utils.h" #include "extensions/common/error_utils.h"
...@@ -49,7 +48,7 @@ bool LocationWatchLocationFunction::RunSync() { ...@@ -49,7 +48,7 @@ bool LocationWatchLocationFunction::RunSync() {
} }
// TODO(vadimt): validate and use params->request_info.maximumAge // TODO(vadimt): validate and use params->request_info.maximumAge
LocationManager::Get(GetProfile()) LocationManager::Get(browser_context())
->AddLocationRequest(extension_id(), ->AddLocationRequest(extension_id(),
params->name, params->name,
min_distance_in_meters, min_distance_in_meters,
...@@ -63,7 +62,7 @@ bool LocationClearWatchFunction::RunSync() { ...@@ -63,7 +62,7 @@ bool LocationClearWatchFunction::RunSync() {
ClearWatch::Params::Create(*args_)); ClearWatch::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get()); EXTENSION_FUNCTION_VALIDATE(params.get());
LocationManager::Get(GetProfile()) LocationManager::Get(browser_context())
->RemoveLocationRequest(extension_id(), params->name); ->RemoveLocationRequest(extension_id(), params->name);
return true; return true;
......
...@@ -10,15 +10,12 @@ ...@@ -10,15 +10,12 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/lazy_instance.h" #include "base/lazy_instance.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/extensions/api/location.h" #include "chrome/common/extensions/api/location.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/geolocation_provider.h" #include "content/public/browser/geolocation_provider.h"
#include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_source.h"
#include "content/public/common/geoposition.h" #include "content/public/common/geoposition.h"
#include "extensions/browser/event_router.h" #include "extensions/browser/event_router.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h" #include "extensions/browser/extension_system.h"
#include "extensions/common/extension.h" #include "extensions/common/extension.h"
#include "extensions/common/permissions/permission_set.h" #include "extensions/common/permissions/permission_set.h"
...@@ -248,12 +245,8 @@ void LocationRequest::OnPositionReported(const content::Geoposition& position) { ...@@ -248,12 +245,8 @@ void LocationRequest::OnPositionReported(const content::Geoposition& position) {
} }
LocationManager::LocationManager(content::BrowserContext* context) LocationManager::LocationManager(content::BrowserContext* context)
: profile_(Profile::FromBrowserContext(context)) { : browser_context_(context), extension_registry_observer_(this) {
registrar_.Add(this, extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_));
chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED,
content::Source<Profile>(profile_));
registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED,
content::Source<Profile>(profile_));
} }
void LocationManager::AddLocationRequest( void LocationManager::AddLocationRequest(
...@@ -343,42 +336,30 @@ void LocationManager::SendLocationUpdate( ...@@ -343,42 +336,30 @@ void LocationManager::SendLocationUpdate(
scoped_ptr<Event> event(new Event(event_name, args.Pass())); scoped_ptr<Event> event(new Event(event_name, args.Pass()));
EventRouter::Get(profile_) EventRouter::Get(browser_context_)
->DispatchEventToExtension(extension_id, event.Pass()); ->DispatchEventToExtension(extension_id, event.Pass());
} }
void LocationManager::Observe(int type, void LocationManager::OnExtensionLoaded(
const content::NotificationSource& source, content::BrowserContext* browser_context,
const content::NotificationDetails& details) { const Extension* extension) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); // Grants permission to use geolocation once an extension with "location"
// permission is loaded.
switch (type) { if (extension->permissions_data()->HasAPIPermission(
case chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: { APIPermission::kLocation)) {
// Grants permission to use geolocation once an extension with "location" content::GeolocationProvider::GetInstance()
// permission is loaded. ->UserDidOptIntoLocationServices();
const Extension* extension =
content::Details<const Extension>(details).ptr();
if (extension->permissions_data()->HasAPIPermission(
APIPermission::kLocation)) {
content::GeolocationProvider::GetInstance()->
UserDidOptIntoLocationServices();
}
break;
}
case chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED: {
// Delete all requests from the unloaded extension.
const Extension* extension =
content::Details<const UnloadedExtensionInfo>(details)->extension;
location_requests_.erase(extension->id());
break;
}
default:
NOTREACHED();
break;
} }
} }
void LocationManager::OnExtensionUnloaded(
content::BrowserContext* browser_context,
const Extension* extension,
UnloadedExtensionInfo::Reason reason) {
// Delete all requests from the unloaded extension.
location_requests_.erase(extension->id());
}
static base::LazyInstance<BrowserContextKeyedAPIFactory<LocationManager> > static base::LazyInstance<BrowserContextKeyedAPIFactory<LocationManager> >
g_factory = LAZY_INSTANCE_INITIALIZER; g_factory = LAZY_INSTANCE_INITIALIZER;
...@@ -388,7 +369,7 @@ LocationManager::GetFactoryInstance() { ...@@ -388,7 +369,7 @@ LocationManager::GetFactoryInstance() {
return g_factory.Pointer(); return g_factory.Pointer();
} }
// static // static
LocationManager* LocationManager::Get(content::BrowserContext* context) { LocationManager* LocationManager::Get(content::BrowserContext* context) {
return BrowserContextKeyedAPIFactory<LocationManager>::Get(context); return BrowserContextKeyedAPIFactory<LocationManager>::Get(context);
} }
......
...@@ -5,14 +5,11 @@ ...@@ -5,14 +5,11 @@
#ifndef CHROME_BROWSER_EXTENSIONS_API_LOCATION_LOCATION_MANAGER_H_ #ifndef CHROME_BROWSER_EXTENSIONS_API_LOCATION_LOCATION_MANAGER_H_
#define CHROME_BROWSER_EXTENSIONS_API_LOCATION_LOCATION_MANAGER_H_ #define CHROME_BROWSER_EXTENSIONS_API_LOCATION_LOCATION_MANAGER_H_
#include <map>
#include <string> #include <string>
#include "content/public/browser/notification_observer.h" #include "base/scoped_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "extensions/browser/browser_context_keyed_api_factory.h" #include "extensions/browser/browser_context_keyed_api_factory.h"
#include "extensions/browser/extension_registry_observer.h"
class Profile;
namespace content { namespace content {
class BrowserContext; class BrowserContext;
...@@ -20,6 +17,7 @@ struct Geoposition; ...@@ -20,6 +17,7 @@ struct Geoposition;
} // namespace content } // namespace content
namespace extensions { namespace extensions {
class ExtensionRegistry;
class LocationManager; class LocationManager;
class LocationRequest; class LocationRequest;
...@@ -31,10 +29,10 @@ struct Coordinates; ...@@ -31,10 +29,10 @@ struct Coordinates;
} // namespace location } // namespace location
} // namespace api } // namespace api
// Profile's manager of all location watch requests created by chrome.location // BrowserContext's manager of all location watch requests created by
// API. Lives in the UI thread. // chrome.location API. Lives in the UI thread.
class LocationManager : public BrowserContextKeyedAPI, class LocationManager : public BrowserContextKeyedAPI,
public content::NotificationObserver { public ExtensionRegistryObserver {
public: public:
explicit LocationManager(content::BrowserContext* context); explicit LocationManager(content::BrowserContext* context);
virtual ~LocationManager(); virtual ~LocationManager();
...@@ -55,7 +53,7 @@ class LocationManager : public BrowserContextKeyedAPI, ...@@ -55,7 +53,7 @@ class LocationManager : public BrowserContextKeyedAPI,
// BrowserContextKeyedAPI implementation. // BrowserContextKeyedAPI implementation.
static BrowserContextKeyedAPIFactory<LocationManager>* GetFactoryInstance(); static BrowserContextKeyedAPIFactory<LocationManager>* GetFactoryInstance();
// Convenience method to get the LocationManager for a profile. // Convenience method to get the LocationManager for a context.
static LocationManager* Get(content::BrowserContext* context); static LocationManager* Get(content::BrowserContext* context);
private: private:
...@@ -78,23 +76,25 @@ class LocationManager : public BrowserContextKeyedAPI, ...@@ -78,23 +76,25 @@ class LocationManager : public BrowserContextKeyedAPI,
const std::string& request_name, const std::string& request_name,
const content::Geoposition& position); const content::Geoposition& position);
// NotificationObserver: // ExtensionRegistryObserver implementation.
virtual void Observe(int type, virtual void OnExtensionLoaded(content::BrowserContext* browser_context,
const content::NotificationSource& source, const Extension* extension) OVERRIDE;
const content::NotificationDetails& details) OVERRIDE; virtual void OnExtensionUnloaded(
content::BrowserContext* browser_context,
const Extension* extension,
UnloadedExtensionInfo::Reason reason) OVERRIDE;
// BrowserContextKeyedAPI implementation. // BrowserContextKeyedAPI implementation.
static const char* service_name() { return "LocationManager"; } static const char* service_name() { return "LocationManager"; }
// Profile for this location manager. content::BrowserContext* const browser_context_;
Profile* const profile_;
// A map of our pending location requests, per extension. // A map of our pending location requests, per extension.
// Invariant: None of the LocationRequestLists are empty. // Invariant: None of the LocationRequestLists are empty.
LocationRequestMap location_requests_; LocationRequestMap location_requests_;
// Used for tracking registrations to profile's extensions events. ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
content::NotificationRegistrar registrar_; extension_registry_observer_;
DISALLOW_COPY_AND_ASSIGN(LocationManager); DISALLOW_COPY_AND_ASSIGN(LocationManager);
}; };
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
#include "chrome/browser/extensions/api/management/management_api.h" #include "chrome/browser/extensions/api/management/management_api.h"
#include <map>
#include <string> #include <string>
#include <vector> #include <vector>
...@@ -19,7 +18,6 @@ ...@@ -19,7 +18,6 @@
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/extensions/api/management/management_api_constants.h" #include "chrome/browser/extensions/api/management/management_api_constants.h"
#include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_ui_util.h" #include "chrome/browser/extensions/extension_ui_util.h"
...@@ -38,8 +36,6 @@ ...@@ -38,8 +36,6 @@
#include "chrome/common/extensions/extension_constants.h" #include "chrome/common/extensions/extension_constants.h"
#include "chrome/common/extensions/manifest_handlers/app_launch_info.h" #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
#include "chrome/common/extensions/manifest_url_handler.h" #include "chrome/common/extensions/manifest_url_handler.h"
#include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_source.h"
#include "content/public/browser/utility_process_host.h" #include "content/public/browser/utility_process_host.h"
#include "content/public/browser/utility_process_host_client.h" #include "content/public/browser/utility_process_host_client.h"
#include "extensions/browser/event_router.h" #include "extensions/browser/event_router.h"
...@@ -859,7 +855,7 @@ ManagementGenerateAppForLinkFunction::~ManagementGenerateAppForLinkFunction() { ...@@ -859,7 +855,7 @@ ManagementGenerateAppForLinkFunction::~ManagementGenerateAppForLinkFunction() {
} }
void ManagementGenerateAppForLinkFunction::FinishCreateBookmarkApp( void ManagementGenerateAppForLinkFunction::FinishCreateBookmarkApp(
const extensions::Extension* extension, const Extension* extension,
const WebApplicationInfo& web_app_info) { const WebApplicationInfo& web_app_info) {
if (extension) { if (extension) {
scoped_ptr<management::ExtensionInfo> info = scoped_ptr<management::ExtensionInfo> info =
...@@ -937,73 +933,53 @@ bool ManagementGenerateAppForLinkFunction::RunAsync() { ...@@ -937,73 +933,53 @@ bool ManagementGenerateAppForLinkFunction::RunAsync() {
return true; return true;
} }
ManagementEventRouter::ManagementEventRouter(Profile* profile) ManagementEventRouter::ManagementEventRouter(content::BrowserContext* context)
: profile_(profile) { : browser_context_(context), extension_registry_observer_(this) {
int types[] = {chrome::NOTIFICATION_EXTENSION_INSTALLED_DEPRECATED, extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_));
chrome::NOTIFICATION_EXTENSION_UNINSTALLED_DEPRECATED,
chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED,
chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED};
CHECK(registrar_.IsEmpty());
for (size_t i = 0; i < arraysize(types); i++) {
registrar_.Add(this,
types[i],
content::Source<Profile>(profile_));
}
} }
ManagementEventRouter::~ManagementEventRouter() {} ManagementEventRouter::~ManagementEventRouter() {}
void ManagementEventRouter::Observe( void ManagementEventRouter::OnExtensionLoaded(
int type, content::BrowserContext* browser_context,
const content::NotificationSource& source, const Extension* extension) {
const content::NotificationDetails& details) { BroadcastEvent(extension, management::OnEnabled::kEventName);
const char* event_name = NULL; }
const Extension* extension = NULL;
Profile* profile = content::Source<Profile>(source).ptr(); void ManagementEventRouter::OnExtensionUnloaded(
CHECK(profile); content::BrowserContext* browser_context,
CHECK(profile_->IsSameProfile(profile)); const Extension* extension,
UnloadedExtensionInfo::Reason reason) {
switch (type) { BroadcastEvent(extension, management::OnDisabled::kEventName);
case chrome::NOTIFICATION_EXTENSION_INSTALLED_DEPRECATED: }
event_name = management::OnInstalled::kEventName;
extension =
content::Details<const InstalledExtensionInfo>(details)->extension;
break;
case chrome::NOTIFICATION_EXTENSION_UNINSTALLED_DEPRECATED:
event_name = management::OnUninstalled::kEventName;
extension = content::Details<const Extension>(details).ptr();
break;
case chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED:
event_name = management::OnEnabled::kEventName;
extension = content::Details<const Extension>(details).ptr();
break;
case chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED:
event_name = management::OnDisabled::kEventName;
extension =
content::Details<const UnloadedExtensionInfo>(details)->extension;
break;
default:
NOTREACHED();
return;
}
DCHECK(event_name);
DCHECK(extension);
if (ui_util::ShouldNotBeVisible(extension, profile_)) void ManagementEventRouter::OnExtensionInstalled(
return; // Don't dispatch events for built-in extensions. content::BrowserContext* browser_context,
const Extension* extension) {
BroadcastEvent(extension, management::OnInstalled::kEventName);
}
void ManagementEventRouter::OnExtensionUninstalled(
content::BrowserContext* browser_context,
const Extension* extension) {
BroadcastEvent(extension, management::OnUninstalled::kEventName);
}
void ManagementEventRouter::BroadcastEvent(const Extension* extension,
const char* event_name) {
if (ui_util::ShouldNotBeVisible(extension, browser_context_))
return; // Don't dispatch events for built-in extenions.
scoped_ptr<base::ListValue> args(new base::ListValue()); scoped_ptr<base::ListValue> args(new base::ListValue());
if (event_name == management::OnUninstalled::kEventName) { if (event_name == management::OnUninstalled::kEventName) {
args->Append(new base::StringValue(extension->id())); args->Append(new base::StringValue(extension->id()));
} else { } else {
scoped_ptr<management::ExtensionInfo> info = CreateExtensionInfo( scoped_ptr<management::ExtensionInfo> info =
*extension, ExtensionSystem::Get(profile)); CreateExtensionInfo(*extension, ExtensionSystem::Get(browser_context_));
args->Append(info->ToValue().release()); args->Append(info->ToValue().release());
} }
scoped_ptr<Event> event(new Event(event_name, args.Pass())); EventRouter::Get(browser_context_)
EventRouter::Get(profile)->BroadcastEvent(event.Pass()); ->BroadcastEvent(scoped_ptr<Event>(new Event(event_name, args.Pass())));
} }
ManagementAPI::ManagementAPI(content::BrowserContext* context) ManagementAPI::ManagementAPI(content::BrowserContext* context)
...@@ -1032,8 +1008,7 @@ ManagementAPI::GetFactoryInstance() { ...@@ -1032,8 +1008,7 @@ ManagementAPI::GetFactoryInstance() {
} }
void ManagementAPI::OnListenerAdded(const EventListenerInfo& details) { void ManagementAPI::OnListenerAdded(const EventListenerInfo& details) {
management_event_router_.reset( management_event_router_.reset(new ManagementEventRouter(browser_context_));
new ManagementEventRouter(Profile::FromBrowserContext(browser_context_)));
EventRouter::Get(browser_context_)->UnregisterObserver(this); EventRouter::Get(browser_context_)->UnregisterObserver(this);
} }
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define CHROME_BROWSER_EXTENSIONS_API_MANAGEMENT_MANAGEMENT_API_H_ #define CHROME_BROWSER_EXTENSIONS_API_MANAGEMENT_MANAGEMENT_API_H_
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/scoped_observer.h"
#include "base/task/cancelable_task_tracker.h" #include "base/task/cancelable_task_tracker.h"
#include "chrome/browser/extensions/bookmark_app_helper.h" #include "chrome/browser/extensions/bookmark_app_helper.h"
#include "chrome/browser/extensions/chrome_extension_function.h" #include "chrome/browser/extensions/chrome_extension_function.h"
...@@ -14,15 +15,15 @@ ...@@ -14,15 +15,15 @@
#include "chrome/common/web_application_info.h" #include "chrome/common/web_application_info.h"
#include "components/favicon_base/favicon_types.h" #include "components/favicon_base/favicon_types.h"
#include "components/keyed_service/core/keyed_service.h" #include "components/keyed_service/core/keyed_service.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "extensions/browser/browser_context_keyed_api_factory.h" #include "extensions/browser/browser_context_keyed_api_factory.h"
#include "extensions/browser/event_router.h" #include "extensions/browser/event_router.h"
#include "extensions/browser/extension_registry_observer.h"
class ExtensionService; class ExtensionService;
class ExtensionUninstallDialog; class ExtensionUninstallDialog;
namespace extensions { namespace extensions {
class ExtensionRegistry;
class ManagementFunction : public ChromeSyncExtensionFunction { class ManagementFunction : public ChromeSyncExtensionFunction {
protected: protected:
...@@ -218,7 +219,7 @@ class ManagementGenerateAppForLinkFunction : public AsyncManagementFunction { ...@@ -218,7 +219,7 @@ class ManagementGenerateAppForLinkFunction : public AsyncManagementFunction {
private: private:
void OnFaviconForApp(const favicon_base::FaviconImageResult& image_result); void OnFaviconForApp(const favicon_base::FaviconImageResult& image_result);
void FinishCreateBookmarkApp(const extensions::Extension* extension, void FinishCreateBookmarkApp(const Extension* extension,
const WebApplicationInfo& web_app_info); const WebApplicationInfo& web_app_info);
std::string title_; std::string title_;
...@@ -230,26 +231,37 @@ class ManagementGenerateAppForLinkFunction : public AsyncManagementFunction { ...@@ -230,26 +231,37 @@ class ManagementGenerateAppForLinkFunction : public AsyncManagementFunction {
base::CancelableTaskTracker cancelable_task_tracker_; base::CancelableTaskTracker cancelable_task_tracker_;
}; };
class ManagementEventRouter : public content::NotificationObserver { class ManagementEventRouter : public ExtensionRegistryObserver {
public: public:
explicit ManagementEventRouter(Profile* profile); explicit ManagementEventRouter(content::BrowserContext* context);
virtual ~ManagementEventRouter(); virtual ~ManagementEventRouter();
private: private:
// content::NotificationObserver implementation. // ExtensionRegistryObserver implementation.
virtual void Observe(int type, virtual void OnExtensionLoaded(content::BrowserContext* browser_context,
const content::NotificationSource& source, const Extension* extension) OVERRIDE;
const content::NotificationDetails& details) OVERRIDE; virtual void OnExtensionUnloaded(
content::BrowserContext* browser_context,
const Extension* extension,
UnloadedExtensionInfo::Reason reason) OVERRIDE;
virtual void OnExtensionInstalled(content::BrowserContext* browser_context,
const Extension* extension) OVERRIDE;
virtual void OnExtensionUninstalled(content::BrowserContext* browser_context,
const Extension* extension) OVERRIDE;
// Dispatches management api events to listening extensions.
void BroadcastEvent(const Extension* extension, const char* event_name);
content::NotificationRegistrar registrar_; content::BrowserContext* browser_context_;
Profile* profile_; ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
extension_registry_observer_;
DISALLOW_COPY_AND_ASSIGN(ManagementEventRouter); DISALLOW_COPY_AND_ASSIGN(ManagementEventRouter);
}; };
class ManagementAPI : public BrowserContextKeyedAPI, class ManagementAPI : public BrowserContextKeyedAPI,
public extensions::EventRouter::Observer { public EventRouter::Observer {
public: public:
explicit ManagementAPI(content::BrowserContext* context); explicit ManagementAPI(content::BrowserContext* context);
virtual ~ManagementAPI(); virtual ~ManagementAPI();
...@@ -261,8 +273,7 @@ class ManagementAPI : public BrowserContextKeyedAPI, ...@@ -261,8 +273,7 @@ class ManagementAPI : public BrowserContextKeyedAPI,
static BrowserContextKeyedAPIFactory<ManagementAPI>* GetFactoryInstance(); static BrowserContextKeyedAPIFactory<ManagementAPI>* GetFactoryInstance();
// EventRouter::Observer implementation. // EventRouter::Observer implementation.
virtual void OnListenerAdded(const extensions::EventListenerInfo& details) virtual void OnListenerAdded(const EventListenerInfo& details) OVERRIDE;
OVERRIDE;
private: private:
friend class BrowserContextKeyedAPIFactory<ManagementAPI>; friend class BrowserContextKeyedAPIFactory<ManagementAPI>;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment