diff options
author | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-29 23:14:02 +0000 |
---|---|---|
committer | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-29 23:14:02 +0000 |
commit | 9adb9693e8a90bb63be325dbb5d3391f47f839ba (patch) | |
tree | 555765afd7bc851de6f3a2bf4a35151435d58d77 /chrome/browser/automation | |
parent | 5b5a5c976aead85a87ced0847c068012d3979cae (diff) | |
download | chromium_src-9adb9693e8a90bb63be325dbb5d3391f47f839ba.zip chromium_src-9adb9693e8a90bb63be325dbb5d3391f47f839ba.tar.gz chromium_src-9adb9693e8a90bb63be325dbb5d3391f47f839ba.tar.bz2 |
Part 3 of immutable Extension refactor.
Make ExtensionsService hold const Extension pointers only. This ensures that
extensions can't be modified after they're created, and lets us share them
between threads.
BUG=56558
TEST=no functional change
Review URL: http://codereview.chromium.org/4138006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@64517 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/automation')
9 files changed, 54 insertions, 48 deletions
diff --git a/chrome/browser/automation/automation_extension_tracker.cc b/chrome/browser/automation/automation_extension_tracker.cc index cd816d3..8ab734d 100644 --- a/chrome/browser/automation/automation_extension_tracker.cc +++ b/chrome/browser/automation/automation_extension_tracker.cc @@ -10,7 +10,7 @@ AutomationExtensionTracker::AutomationExtensionTracker( IPC::Message::Sender* automation) - : AutomationResourceTracker<Extension*>(automation) { + : AutomationResourceTracker<const Extension*>(automation) { registrar_.Add(this, NotificationType::EXTENSION_UNLOADED, NotificationService::AllSources()); registrar_.Add(this, NotificationType::EXTENSION_UNLOADED_DISABLED, @@ -20,9 +20,9 @@ AutomationExtensionTracker::AutomationExtensionTracker( AutomationExtensionTracker::~AutomationExtensionTracker() { } -void AutomationExtensionTracker::AddObserver(Extension* resource) {} +void AutomationExtensionTracker::AddObserver(const Extension* resource) {} -void AutomationExtensionTracker::RemoveObserver(Extension* resource) {} +void AutomationExtensionTracker::RemoveObserver(const Extension* resource) {} void AutomationExtensionTracker::Observe(NotificationType type, const NotificationSource& source, @@ -31,7 +31,7 @@ void AutomationExtensionTracker::Observe(NotificationType type, type != NotificationType::EXTENSION_UNLOADED_DISABLED) return; - Extension* extension = Details<Extension>(details).ptr(); + const Extension* extension = Details<const Extension>(details).ptr(); Profile* profile = Source<Profile>(source).ptr(); if (profile) { ExtensionsService* service = profile->GetExtensionsService(); diff --git a/chrome/browser/automation/automation_extension_tracker.h b/chrome/browser/automation/automation_extension_tracker.h index c1b7ed7..05f16b5 100644 --- a/chrome/browser/automation/automation_extension_tracker.h +++ b/chrome/browser/automation/automation_extension_tracker.h @@ -12,7 +12,7 @@ class Extension; // Tracks an Extension. An Extension is removed on uninstall, not on disable. class AutomationExtensionTracker - : public AutomationResourceTracker<Extension*> { + : public AutomationResourceTracker<const Extension*> { public: explicit AutomationExtensionTracker(IPC::Message::Sender* automation); @@ -23,10 +23,10 @@ class AutomationExtensionTracker // extension, is the one who sends the notification about extension // uninstalls. Instead of using this method, one observer is added for all // extensions in the constructor. - virtual void AddObserver(Extension* resource); + virtual void AddObserver(const Extension* resource); // See related comment above as to why this method is empty. - virtual void RemoveObserver(Extension* resource); + virtual void RemoveObserver(const Extension* resource); // Overriding AutomationResourceTracker Observe. AutomationResourceTracker's // Observe expects the NotificationSource to be the object that is closing. diff --git a/chrome/browser/automation/automation_provider.cc b/chrome/browser/automation/automation_provider.cc index db4ad51..60ed6ef 100644 --- a/chrome/browser/automation/automation_provider.cc +++ b/chrome/browser/automation/automation_provider.cc @@ -258,7 +258,7 @@ int AutomationProvider::GetIndexForNavigationController( return parent->GetIndexOfController(controller); } -int AutomationProvider::AddExtension(Extension* extension) { +int AutomationProvider::AddExtension(const Extension* extension) { DCHECK(extension); return extension_tracker_->Add(extension); } @@ -299,12 +299,13 @@ DictionaryValue* AutomationProvider::GetDictionaryFromDownloadItem( return dl_item_value; } -Extension* AutomationProvider::GetExtension(int extension_handle) { +const Extension* AutomationProvider::GetExtension(int extension_handle) { return extension_tracker_->GetResource(extension_handle); } -Extension* AutomationProvider::GetEnabledExtension(int extension_handle) { - Extension* extension = extension_tracker_->GetResource(extension_handle); +const Extension* AutomationProvider::GetEnabledExtension(int extension_handle) { + const Extension* extension = + extension_tracker_->GetResource(extension_handle); ExtensionsService* service = profile_->GetExtensionsService(); if (extension && service && service->GetExtensionById(extension->id(), false)) @@ -312,8 +313,10 @@ Extension* AutomationProvider::GetEnabledExtension(int extension_handle) { return NULL; } -Extension* AutomationProvider::GetDisabledExtension(int extension_handle) { - Extension* extension = extension_tracker_->GetResource(extension_handle); +const Extension* AutomationProvider::GetDisabledExtension( + int extension_handle) { + const Extension* extension = + extension_tracker_->GetResource(extension_handle); ExtensionsService* service = profile_->GetExtensionsService(); if (extension && service && service->GetExtensionById(extension->id(), true) && @@ -799,7 +802,7 @@ void AutomationProvider::GetEnabledExtensions( const ExtensionList* extensions = service->extensions(); DCHECK(extensions); for (size_t i = 0; i < extensions->size(); ++i) { - Extension* extension = (*extensions)[i]; + const Extension* extension = (*extensions)[i]; DCHECK(extension); if (extension->location() == Extension::INTERNAL || extension->location() == Extension::LOAD) { @@ -848,7 +851,7 @@ void AutomationProvider::InstallExtensionAndGetHandle( void AutomationProvider::UninstallExtension(int extension_handle, bool* success) { *success = false; - Extension* extension = GetExtension(extension_handle); + const Extension* extension = GetExtension(extension_handle); ExtensionsService* service = profile_->GetExtensionsService(); if (extension && service) { ExtensionUnloadNotificationObserver observer; @@ -861,7 +864,7 @@ void AutomationProvider::UninstallExtension(int extension_handle, void AutomationProvider::EnableExtension(int extension_handle, IPC::Message* reply_message) { - Extension* extension = GetDisabledExtension(extension_handle); + const Extension* extension = GetDisabledExtension(extension_handle); ExtensionsService* service = profile_->GetExtensionsService(); ExtensionProcessManager* manager = profile_->GetExtensionProcessManager(); // Only enable if this extension is disabled. @@ -882,7 +885,7 @@ void AutomationProvider::EnableExtension(int extension_handle, void AutomationProvider::DisableExtension(int extension_handle, bool* success) { *success = false; - Extension* extension = GetEnabledExtension(extension_handle); + const Extension* extension = GetEnabledExtension(extension_handle); ExtensionsService* service = profile_->GetExtensionsService(); if (extension && service) { ExtensionUnloadNotificationObserver observer; @@ -897,7 +900,7 @@ void AutomationProvider::ExecuteExtensionActionInActiveTabAsync( int extension_handle, int browser_handle, IPC::Message* reply_message) { bool success = false; - Extension* extension = GetEnabledExtension(extension_handle); + const Extension* extension = GetEnabledExtension(extension_handle); ExtensionsService* service = profile_->GetExtensionsService(); ExtensionMessageService* message_service = profile_->GetExtensionMessageService(); @@ -922,7 +925,7 @@ void AutomationProvider::ExecuteExtensionActionInActiveTabAsync( void AutomationProvider::MoveExtensionBrowserAction( int extension_handle, int index, bool* success) { *success = false; - Extension* extension = GetEnabledExtension(extension_handle); + const Extension* extension = GetEnabledExtension(extension_handle); ExtensionsService* service = profile_->GetExtensionsService(); if (extension && service) { ExtensionToolbarModel* toolbar = service->toolbar_model(); @@ -943,7 +946,7 @@ void AutomationProvider::GetExtensionProperty( bool* success, std::string* value) { *success = false; - Extension* extension = GetExtension(extension_handle); + const Extension* extension = GetExtension(extension_handle); ExtensionsService* service = profile_->GetExtensionsService(); if (extension && service) { ExtensionToolbarModel* toolbar = service->toolbar_model(); diff --git a/chrome/browser/automation/automation_provider.h b/chrome/browser/automation/automation_provider.h index 5a29b04..66d084a 100644 --- a/chrome/browser/automation/automation_provider.h +++ b/chrome/browser/automation/automation_provider.h @@ -150,7 +150,7 @@ class AutomationProvider : public base::RefCounted<AutomationProvider>, // Adds the extension passed in to the extension tracker, and returns // the associated handle. If the tracker already contains the extension, // the handle is simply returned. - int AddExtension(Extension* extension); + int AddExtension(const Extension* extension); #if defined(OS_WIN) // Adds the external tab passed in to the tab tracker. @@ -323,15 +323,15 @@ class AutomationProvider : public base::RefCounted<AutomationProvider>, // Returns the extension for the given handle. Returns NULL if there is // no extension for the handle. - Extension* GetExtension(int extension_handle); + const Extension* GetExtension(int extension_handle); // Returns the extension for the given handle, if the handle is valid and // the associated extension is enabled. Returns NULL otherwise. - Extension* GetEnabledExtension(int extension_handle); + const Extension* GetEnabledExtension(int extension_handle); // Returns the extension for the given handle, if the handle is valid and // the associated extension is disabled. Returns NULL otherwise. - Extension* GetDisabledExtension(int extension_handle); + const Extension* GetDisabledExtension(int extension_handle); // Method called by the popup menu tracker when a popup menu is opened. void NotifyPopupMenuOpened(); diff --git a/chrome/browser/automation/automation_provider_observers.cc b/chrome/browser/automation/automation_provider_observers.cc index aeabd00..7cfa96f 100644 --- a/chrome/browser/automation/automation_provider_observers.cc +++ b/chrome/browser/automation/automation_provider_observers.cc @@ -494,7 +494,7 @@ void ExtensionReadyNotificationObserver::Observe( success = true; break; case NotificationType::EXTENSION_LOADED: - extension_ = Details<Extension>(details).ptr(); + extension_ = Details<const Extension>(details).ptr(); if (!DidExtensionHostsStopLoading(manager_)) return; success = true; diff --git a/chrome/browser/automation/automation_provider_observers.h b/chrome/browser/automation/automation_provider_observers.h index de20990..7b76638 100644 --- a/chrome/browser/automation/automation_provider_observers.h +++ b/chrome/browser/automation/automation_provider_observers.h @@ -273,7 +273,7 @@ class ExtensionReadyNotificationObserver : public NotificationObserver { scoped_refptr<AutomationProvider> automation_; int id_; IPC::Message* reply_message_; - Extension* extension_; + const Extension* extension_; DISALLOW_COPY_AND_ASSIGN(ExtensionReadyNotificationObserver); }; diff --git a/chrome/browser/automation/automation_resource_tracker.cc b/chrome/browser/automation/automation_resource_tracker.cc index c233b41..a82265d 100644 --- a/chrome/browser/automation/automation_resource_tracker.cc +++ b/chrome/browser/automation/automation_resource_tracker.cc @@ -15,7 +15,7 @@ AutomationResourceTrackerImpl::AutomationResourceTrackerImpl( AutomationResourceTrackerImpl::~AutomationResourceTrackerImpl() { } -int AutomationResourceTrackerImpl::AddImpl(void* resource) { +int AutomationResourceTrackerImpl::AddImpl(const void* resource) { if (ContainsResourceImpl(resource)) return resource_to_handle_[resource]; @@ -30,7 +30,7 @@ int AutomationResourceTrackerImpl::AddImpl(void* resource) { return handle; } -void AutomationResourceTrackerImpl::RemoveImpl(void* resource) { +void AutomationResourceTrackerImpl::RemoveImpl(const void* resource) { if (!ContainsResourceImpl(resource)) return; @@ -48,7 +48,7 @@ int AutomationResourceTrackerImpl::GenerateHandle() { return ++handle; } -bool AutomationResourceTrackerImpl::ContainsResourceImpl(void* resource) { +bool AutomationResourceTrackerImpl::ContainsResourceImpl(const void* resource) { return resource_to_handle_.find(resource) != resource_to_handle_.end(); } @@ -56,7 +56,7 @@ bool AutomationResourceTrackerImpl::ContainsHandleImpl(int handle) { return handle_to_resource_.find(handle) != handle_to_resource_.end(); } -void* AutomationResourceTrackerImpl::GetResourceImpl(int handle) { +const void* AutomationResourceTrackerImpl::GetResourceImpl(int handle) { HandleToResourceMap::const_iterator iter = handle_to_resource_.find(handle); if (iter == handle_to_resource_.end()) return NULL; @@ -64,7 +64,7 @@ void* AutomationResourceTrackerImpl::GetResourceImpl(int handle) { return iter->second; } -int AutomationResourceTrackerImpl::GetHandleImpl(void* resource) { +int AutomationResourceTrackerImpl::GetHandleImpl(const void* resource) { ResourceToHandleMap::const_iterator iter = resource_to_handle_.find(resource); if (iter == resource_to_handle_.end()) @@ -73,7 +73,8 @@ int AutomationResourceTrackerImpl::GetHandleImpl(void* resource) { return iter->second; } -void AutomationResourceTrackerImpl::HandleCloseNotification(void* resource) { +void AutomationResourceTrackerImpl::HandleCloseNotification( + const void* resource) { if (!ContainsResourceImpl(resource)) return; diff --git a/chrome/browser/automation/automation_resource_tracker.h b/chrome/browser/automation/automation_resource_tracker.h index 671f72b..2d6b0cd 100644 --- a/chrome/browser/automation/automation_resource_tracker.h +++ b/chrome/browser/automation/automation_resource_tracker.h @@ -38,21 +38,21 @@ class AutomationResourceTrackerImpl { // These need to be implemented in AutomationResourceTracker, // since it needs to call the subclass's type-specific notification // registration functions. - virtual void AddObserverTypeProxy(void* resource) = 0; - virtual void RemoveObserverTypeProxy(void* resource) = 0; + virtual void AddObserverTypeProxy(const void* resource) = 0; + virtual void RemoveObserverTypeProxy(const void* resource) = 0; - int AddImpl(void* resource); - void RemoveImpl(void* resource); + int AddImpl(const void* resource); + void RemoveImpl(const void* resource); int GenerateHandle(); - bool ContainsResourceImpl(void* resource); + bool ContainsResourceImpl(const void* resource); bool ContainsHandleImpl(int handle); - void* GetResourceImpl(int handle); - int GetHandleImpl(void* resource); - void HandleCloseNotification(void* resource); + const void* GetResourceImpl(int handle); + int GetHandleImpl(const void* resource); + void HandleCloseNotification(const void* resource); protected: - typedef std::map<void*, int> ResourceToHandleMap; - typedef std::map<int, void*> HandleToResourceMap; + typedef std::map<const void*, int> ResourceToHandleMap; + typedef std::map<int, const void*> HandleToResourceMap; ResourceToHandleMap resource_to_handle_; HandleToResourceMap handle_to_resource_; @@ -109,8 +109,9 @@ class AutomationResourceTracker : public NotificationObserver, // Returns the resource pointer associated with a given handle, or NULL // if that handle is not present in the mapping. + // The casts here allow this to compile with both T = Foo and T = const Foo. T GetResource(int handle) { - return static_cast<T>(GetResourceImpl(handle)); + return static_cast<T>(const_cast<void*>(GetResourceImpl(handle))); } // Returns the handle associated with a given resource pointer, or 0 if @@ -144,11 +145,12 @@ class AutomationResourceTracker : public NotificationObserver, private: // These proxy calls from the base Impl class to the template's subclss. - virtual void AddObserverTypeProxy(void* resource) { - AddObserver(static_cast<T>(resource)); + // The casts here allow this to compile with both T = Foo and T = const Foo. + virtual void AddObserverTypeProxy(const void* resource) { + AddObserver(static_cast<T>(const_cast<void*>(resource))); } - virtual void RemoveObserverTypeProxy(void* resource) { - RemoveObserver(static_cast<T>(resource)); + virtual void RemoveObserverTypeProxy(const void* resource) { + RemoveObserver(static_cast<T>(const_cast<void*>(resource))); } DISALLOW_COPY_AND_ASSIGN(AutomationResourceTracker); diff --git a/chrome/browser/automation/testing_automation_provider.cc b/chrome/browser/automation/testing_automation_provider.cc index 8f648d0..ec10dfa 100644 --- a/chrome/browser/automation/testing_automation_provider.cc +++ b/chrome/browser/automation/testing_automation_provider.cc @@ -3672,7 +3672,7 @@ void TestingAutomationProvider::GetThemeInfo( DictionaryValue* args, IPC::Message* reply_message) { scoped_ptr<DictionaryValue> return_value(new DictionaryValue); - Extension* theme = browser->profile()->GetTheme(); + const Extension* theme = browser->profile()->GetTheme(); if (theme) { return_value->SetString("name", theme->name()); return_value->Set("images", theme->GetThemeImages()->DeepCopy()); |