diff options
author | hongbo.min@intel.com <hongbo.min@intel.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-08 09:28:53 +0000 |
---|---|---|
committer | hongbo.min@intel.com <hongbo.min@intel.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-08 09:28:53 +0000 |
commit | bddca151d88995d3156c75f3aaa52f47d0883776 (patch) | |
tree | ae590b9ee6844537235fcd3f07335dde337acbec | |
parent | f432619ba663ee4d8b276864234287a1e7e48d97 (diff) | |
download | chromium_src-bddca151d88995d3156c75f3aaa52f47d0883776.zip chromium_src-bddca151d88995d3156c75f3aaa52f47d0883776.tar.gz chromium_src-bddca151d88995d3156c75f3aaa52f47d0883776.tar.bz2 |
[SystemInfo API] Use Profile-scoped object for systemInfo extension API
This fix is to implement a ProfileKeyedAPI for systemInfo API to remove
the dependency of systemInfo event router from the extension core code.
TBR=sky@chromium.org
BUG=None
Review URL: https://chromiumcodereview.appspot.com/12327006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@186924 0039d316-1c4b-4281-b951-d872f2087c98
14 files changed, 171 insertions, 126 deletions
diff --git a/chrome/browser/extensions/api/system_info/OWNERS b/chrome/browser/extensions/api/system_info/OWNERS new file mode 100644 index 0000000..20685fc --- /dev/null +++ b/chrome/browser/extensions/api/system_info/OWNERS @@ -0,0 +1 @@ +hongbo.min@intel.com diff --git a/chrome/browser/extensions/system_info_event_router.cc b/chrome/browser/extensions/api/system_info/system_info_api.cc index e91f7a1..f1c2b1b 100644 --- a/chrome/browser/extensions/system_info_event_router.cc +++ b/chrome/browser/extensions/api/system_info/system_info_api.cc @@ -1,19 +1,26 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/extensions/system_info_event_router.h" +#include "chrome/browser/extensions/api/system_info/system_info_api.h" + +#include <set> #include "base/bind.h" +#include "base/files/file_path.h" +#include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" +#include "base/memory/singleton.h" #include "base/string_util.h" +#include "base/values.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/extensions/event_router_forwarder.h" -#include "chrome/browser/extensions/event_names.h" #include "chrome/browser/extensions/api/system_info_cpu/cpu_info_provider.h" #include "chrome/browser/extensions/api/system_info_storage/storage_info_provider.h" +#include "chrome/browser/extensions/event_names.h" +#include "chrome/browser/extensions/event_router_forwarder.h" #include "chrome/common/extensions/api/experimental_system_info_cpu.h" #include "chrome/common/extensions/api/experimental_system_info_storage.h" +#include "ui/gfx/display_observer.h" #if defined(USE_ASH) #include "ash/screen_ash.h" @@ -50,7 +57,71 @@ static bool IsCpuEvent(const std::string& event_name) { return StartsWithASCII(event_name, kCpuEventPrefix, true); } -} // namespace +// Event router for systemInfo API. It is a singleton instance shared by +// multiple profiles. +// TODO(hongbo): It should derive from SystemMonitor::DevicesChangedObserver. +// Since the system_monitor will be refactored along with media_gallery, once +// http://crbug.com/145400 is fixed, we need to update SystemInfoEventRouter +// accordingly. +class SystemInfoEventRouter + : public gfx::DisplayObserver, public StorageInfoObserver { + public: + static SystemInfoEventRouter* GetInstance(); + + // Add/remove event listener for the |event_name| event from |profile|. + void AddEventListener(const std::string& event_name); + void RemoveEventListener(const std::string& event_name); + + // Return true if the |event_name| is an event from systemInfo namespace. + static bool IsSystemInfoEvent(const std::string& event_name); + + // StorageInfoObserver implementation: + virtual void OnStorageFreeSpaceChanged(const std::string& id, + double new_value, + double old_value) OVERRIDE; + + // TODO(hongbo): The following methods should be likely overriden from + // SystemMonitor::DevicesChangedObserver once the http://crbug.com/145400 + // is fixed. + void OnRemovableStorageAttached(const std::string& id, + const string16& name, + const base::FilePath::StringType& location); + void OnRemovableStorageDetached(const std::string& id); + + // gfx::DisplayObserver implementation. + virtual void OnDisplayBoundsChanged(const gfx::Display& display) OVERRIDE; + virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE; + virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE; + + private: + friend struct DefaultSingletonTraits<SystemInfoEventRouter>; + friend class base::RefCountedThreadSafe<SystemInfoEventRouter>; + + SystemInfoEventRouter(); + virtual ~SystemInfoEventRouter(); + + // Called from any thread to dispatch the systemInfo event to all extension + // processes cross multiple profiles. + void DispatchEvent(const std::string& event_name, + scoped_ptr<base::ListValue> args); + + // The callbacks of querying storage info to start and stop watching the + // storages. Called from UI thread. + void StartWatchingStorages(const StorageInfo& info, bool success); + void StopWatchingStorages(const StorageInfo& info, bool success); + + // The callback for CPU sampling cycle. Called from FILE thread. + void OnNextCpuSampling( + scoped_ptr<api::experimental_system_info_cpu::CpuUpdateInfo> info); + + // Called to dispatch the systemInfo.display.onDisplayChanged event. + void OnDisplayChanged(); + + // Used to record the event names being watched. + std::multiset<std::string> watching_event_set_; + + DISALLOW_COPY_AND_ASSIGN(SystemInfoEventRouter); +}; // static SystemInfoEventRouter* SystemInfoEventRouter::GetInstance() { @@ -206,4 +277,36 @@ void SystemInfoEventRouter::OnNextCpuSampling(scoped_ptr<CpuUpdateInfo> info) { DispatchEvent(event_names::kOnCpuUpdated, args.Pass()); } +} // namespace + +static base::LazyInstance<ProfileKeyedAPIFactory<SystemInfoAPI> > + g_factory = LAZY_INSTANCE_INITIALIZER; + +// static +ProfileKeyedAPIFactory<SystemInfoAPI>* SystemInfoAPI::GetFactoryInstance() { + return &g_factory.Get(); +} + +SystemInfoAPI::SystemInfoAPI(Profile* profile) : profile_(profile) { + ExtensionSystem::Get(profile_)->event_router()->RegisterObserver( + this, event_names::kOnCpuUpdated); + ExtensionSystem::Get(profile_)->event_router()->RegisterObserver( + this, event_names::kOnStorageAvailableCapacityChanged); +} + +SystemInfoAPI::~SystemInfoAPI() { +} + +void SystemInfoAPI::Shutdown() { + ExtensionSystem::Get(profile_)->event_router()->UnregisterObserver(this); +} + +void SystemInfoAPI::OnListenerAdded(const EventListenerInfo& details) { + SystemInfoEventRouter::GetInstance()->AddEventListener(details.event_name); +} + +void SystemInfoAPI::OnListenerRemoved(const EventListenerInfo& details) { + SystemInfoEventRouter::GetInstance()->RemoveEventListener(details.event_name); +} + } // namespace extensions diff --git a/chrome/browser/extensions/api/system_info/system_info_api.h b/chrome/browser/extensions/api/system_info/system_info_api.h new file mode 100644 index 0000000..eb96a4a --- /dev/null +++ b/chrome/browser/extensions/api/system_info/system_info_api.h @@ -0,0 +1,47 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INFO_SYSTEM_INFO_API_H_ +#define CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INFO_SYSTEM_INFO_API_H_ + +#include "chrome/browser/extensions/api/profile_keyed_api_factory.h" +#include "chrome/browser/extensions/event_router.h" + +namespace extensions { + +// A Profile-scoped object which is registered as an observer of EventRouter +// to observe the systemInfo event listener arrival/removal. +class SystemInfoAPI : public ProfileKeyedAPI, + public EventRouter::Observer { + public: + // ProfileKeyedAPI implementation. + static ProfileKeyedAPIFactory<SystemInfoAPI>* GetFactoryInstance(); + + explicit SystemInfoAPI(Profile* profile); + virtual ~SystemInfoAPI(); + + // ProfileKeyedService implementation. + virtual void Shutdown() OVERRIDE; + + // EventRouter::Observer implementation. + virtual void OnListenerAdded(const EventListenerInfo& details) OVERRIDE; + virtual void OnListenerRemoved(const EventListenerInfo& details) OVERRIDE; + + private: + friend class ProfileKeyedAPIFactory<SystemInfoAPI>; + + // ProfileKeyedAPI implementation. + static const char* service_name() { + return "SystemInfoAPI"; + } + static const bool kServiceIsNULLWhileTesting = true; + + Profile* profile_; + + DISALLOW_COPY_AND_ASSIGN(SystemInfoAPI); +}; + +} // namespace extensions + +#endif // CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INFO_SYSTEM_INFO_API_H_ diff --git a/chrome/browser/extensions/system_info_provider.h b/chrome/browser/extensions/api/system_info/system_info_provider.h index fd650eb..849075d 100644 --- a/chrome/browser/extensions/system_info_provider.h +++ b/chrome/browser/extensions/api/system_info/system_info_provider.h @@ -1,8 +1,8 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_EXTENSIONS_SYSTEM_INFO_PROVIDER_H_ -#define CHROME_BROWSER_EXTENSIONS_SYSTEM_INFO_PROVIDER_H_ +#ifndef CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INFO_SYSTEM_INFO_PROVIDER_H_ +#define CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INFO_SYSTEM_INFO_PROVIDER_H_ #include <queue> @@ -10,7 +10,6 @@ #include "base/callback.h" #include "base/lazy_instance.h" #include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" #include "base/threading/sequenced_worker_pool.h" #include "content/public/browser/browser_thread.h" @@ -147,4 +146,4 @@ typename base::LazyInstance<scoped_refptr<SystemInfoProvider<T> > > } // namespace extensions -#endif // CHROME_BROWSER_EXTENSIONS_SYSTEM_INFO_PROVIDER_H_ +#endif // CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INFO_SYSTEM_INFO_PROVIDER_H_ diff --git a/chrome/browser/extensions/api/system_info_cpu/cpu_info_provider.cc b/chrome/browser/extensions/api/system_info_cpu/cpu_info_provider.cc index f2eaa1d..677a9bf 100644 --- a/chrome/browser/extensions/api/system_info_cpu/cpu_info_provider.cc +++ b/chrome/browser/extensions/api/system_info_cpu/cpu_info_provider.cc @@ -49,8 +49,7 @@ void CpuInfoProvider::StartSampling(const SamplingCallback& callback) { BrowserThread::PostTask( BrowserThread::FILE, FROM_HERE, - base::Bind(&CpuInfoProvider::StartSamplingOnFileThread, - base::Unretained(this), callback)); + base::Bind(&CpuInfoProvider::StartSamplingOnFileThread, this, callback)); } void CpuInfoProvider::StopSampling() { @@ -58,8 +57,7 @@ void CpuInfoProvider::StopSampling() { BrowserThread::PostTask( BrowserThread::FILE, FROM_HERE, - base::Bind(&CpuInfoProvider::StopSamplingOnFileThread, - base::Unretained(this))); + base::Bind(&CpuInfoProvider::StopSamplingOnFileThread, this)); } // static diff --git a/chrome/browser/extensions/api/system_info_cpu/cpu_info_provider.h b/chrome/browser/extensions/api/system_info_cpu/cpu_info_provider.h index ae6d4a1..2291b02 100644 --- a/chrome/browser/extensions/api/system_info_cpu/cpu_info_provider.h +++ b/chrome/browser/extensions/api/system_info_cpu/cpu_info_provider.h @@ -4,11 +4,10 @@ #ifndef CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INFO_CPU_CPU_INFO_PROVIDER_H_ #define CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INFO_CPU_CPU_INFO_PROVIDER_H_ -#include "chrome/browser/extensions/system_info_provider.h" - #include <vector> #include "base/timer.h" +#include "chrome/browser/extensions/api/system_info/system_info_provider.h" #include "chrome/common/extensions/api/experimental_system_info_cpu.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" diff --git a/chrome/browser/extensions/api/system_info_display/display_info_provider.h b/chrome/browser/extensions/api/system_info_display/display_info_provider.h index d99cf60..b934da8 100644 --- a/chrome/browser/extensions/api/system_info_display/display_info_provider.h +++ b/chrome/browser/extensions/api/system_info_display/display_info_provider.h @@ -5,7 +5,7 @@ #ifndef CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INFO_DISPLAY_DISPLAY_INFO_PROVIDER_H_ #define CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INFO_DISPLAY_DISPLAY_INFO_PROVIDER_H_ -#include "chrome/browser/extensions/system_info_provider.h" +#include "chrome/browser/extensions/api/system_info/system_info_provider.h" #include "chrome/common/extensions/api/system_info_display.h" namespace extensions { diff --git a/chrome/browser/extensions/api/system_info_memory/memory_info_provider.h b/chrome/browser/extensions/api/system_info_memory/memory_info_provider.h index f52154b..45f33d5 100644 --- a/chrome/browser/extensions/api/system_info_memory/memory_info_provider.h +++ b/chrome/browser/extensions/api/system_info_memory/memory_info_provider.h @@ -5,7 +5,7 @@ #ifndef CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INFO_MEMORY_MEMORY_INFO_PROVIDER_H_ #define CHROME_BROWSER_EXTENSIONS_API_SYSTEM_INFO_MEMORY_MEMORY_INFO_PROVIDER_H_ -#include "chrome/browser/extensions/system_info_provider.h" +#include "chrome/browser/extensions/api/system_info/system_info_provider.h" #include "chrome/common/extensions/api/experimental_system_info_memory.h" namespace extensions { diff --git a/chrome/browser/extensions/api/system_info_storage/storage_info_provider.h b/chrome/browser/extensions/api/system_info_storage/storage_info_provider.h index 8a8c33e..3447aab 100644 --- a/chrome/browser/extensions/api/system_info_storage/storage_info_provider.h +++ b/chrome/browser/extensions/api/system_info_storage/storage_info_provider.h @@ -9,8 +9,8 @@ #include "base/memory/ref_counted.h" #include "base/observer_list_threadsafe.h" #include "base/timer.h" +#include "chrome/browser/extensions/api/system_info/system_info_provider.h" #include "chrome/browser/extensions/api/system_info_storage/storage_info_observer.h" -#include "chrome/browser/extensions/system_info_provider.h" #include "chrome/common/extensions/api/experimental_system_info_storage.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" diff --git a/chrome/browser/extensions/api/system_info_storage/system_info_storage_apitest.cc b/chrome/browser/extensions/api/system_info_storage/system_info_storage_apitest.cc index 4732a47..408c806 100644 --- a/chrome/browser/extensions/api/system_info_storage/system_info_storage_apitest.cc +++ b/chrome/browser/extensions/api/system_info_storage/system_info_storage_apitest.cc @@ -7,7 +7,6 @@ #include "chrome/browser/extensions/api/system_info_storage/storage_info_provider.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_test_message_listener.h" -#include "chrome/browser/extensions/system_info_event_router.h" #include "chrome/common/chrome_switches.h" #include "chrome/test/base/ui_test_utils.h" diff --git a/chrome/browser/extensions/event_router.cc b/chrome/browser/extensions/event_router.cc index c24342b..ab6a160 100644 --- a/chrome/browser/extensions/event_router.cc +++ b/chrome/browser/extensions/event_router.cc @@ -24,7 +24,6 @@ #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/lazy_background_task_queue.h" #include "chrome/browser/extensions/process_map.h" -#include "chrome/browser/extensions/system_info_event_router.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/common/chrome_notification_types.h" @@ -237,9 +236,6 @@ void EventRouter::OnListenerAdded(const EventListener* listener) { if (observer != observers_.end()) observer->second->OnListenerAdded(details); - if (SystemInfoEventRouter::IsSystemInfoEvent(event_name)) - SystemInfoEventRouter::GetInstance()->AddEventListener(event_name); - const Extension* extension = extensions::ExtensionSystem::Get(profile_)-> extension_service()->GetExtensionById(listener->extension_id, ExtensionService::INCLUDE_ENABLED); @@ -266,9 +262,6 @@ void EventRouter::OnListenerRemoved(const EventListener* listener) { base::Bind(&NotifyEventListenerRemovedOnIOThread, profile_, listener->extension_id, event_name)); - if (SystemInfoEventRouter::IsSystemInfoEvent(event_name)) - SystemInfoEventRouter::GetInstance()->RemoveEventListener(event_name); - const Extension* extension = extensions::ExtensionSystem::Get(profile_)-> extension_service()->GetExtensionById(listener->extension_id, ExtensionService::INCLUDE_ENABLED); diff --git a/chrome/browser/extensions/system_info_event_router.h b/chrome/browser/extensions/system_info_event_router.h deleted file mode 100644 index d1efd32..0000000 --- a/chrome/browser/extensions/system_info_event_router.h +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_EXTENSIONS_SYSTEM_INFO_EVENT_ROUTER_H_ -#define CHROME_BROWSER_EXTENSIONS_SYSTEM_INFO_EVENT_ROUTER_H_ - -#include <set> - -#include "base/files/file_path.h" -#include "base/memory/singleton.h" -#include "base/values.h" -#include "chrome/browser/extensions/api/system_info_storage/storage_info_provider.h" -#include "ui/gfx/display_observer.h" - -namespace extensions { - -namespace api { - -namespace experimental_system_info_cpu { - -struct CpuUpdateInfo; - -} // namespace experimental_system_info_cpu - -} // namespace api - -// Event router for systemInfo API. It is a singleton instance shared by -// multiple profiles. -// TODO(hongbo): It should derive from SystemMonitor::DevicesChangedObserver. -// Since the system_monitor will be refactored along with media_galleries, once -// http://crbug.com/145400 is fixed, we need to update SystemInfoEventRouter -// accordingly. -class SystemInfoEventRouter - : public gfx::DisplayObserver, - public StorageInfoObserver { - public: - static SystemInfoEventRouter* GetInstance(); - - // Add/remove event listener for the |event_name| event from |profile|. - void AddEventListener(const std::string& event_name); - void RemoveEventListener(const std::string& event_name); - - // Return true if the |event_name| is an event from systemInfo namespace. - static bool IsSystemInfoEvent(const std::string& event_name); - - // StorageInfoObserver implementation: - virtual void OnStorageFreeSpaceChanged(const std::string& id, - double new_value, - double old_value) OVERRIDE; - - // TODO(hongbo): The following methods should be likely overriden from - // SystemMonitor::DevicesChangedObserver once the http://crbug.com/145400 - // is fixed. - void OnRemovableStorageAttached(const std::string& id, - const string16& name, - const base::FilePath::StringType& location); - void OnRemovableStorageDetached(const std::string& id); - - // gfx::DisplayObserver implementation. - virtual void OnDisplayBoundsChanged(const gfx::Display& display) OVERRIDE; - virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE; - virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE; - - private: - friend struct DefaultSingletonTraits<SystemInfoEventRouter>; - - SystemInfoEventRouter(); - virtual ~SystemInfoEventRouter(); - - // Called from any thread to dispatch the systemInfo event to all extension - // processes cross multiple profiles. - void DispatchEvent(const std::string& event_name, - scoped_ptr<base::ListValue> args); - - // The callbacks of querying storage info to start and stop watching the - // storages. Called from UI thread. - void StartWatchingStorages(const StorageInfo& info, bool success); - void StopWatchingStorages(const StorageInfo& info, bool success); - - // The callback for CPU sampling cycle. Called from FILE thread. - void OnNextCpuSampling( - scoped_ptr<api::experimental_system_info_cpu::CpuUpdateInfo> info); - - // Called to dispatch the systemInfo.display.onDisplayChanged event. - void OnDisplayChanged(); - - // Used to record the event names being watched. - std::multiset<std::string> watching_event_set_; - - DISALLOW_COPY_AND_ASSIGN(SystemInfoEventRouter); -}; - -} // namespace extensions - -#endif // CHROME_BROWSER_EXTENSIONS_SYSTEM_INFO_EVENT_ROUTER_H_ diff --git a/chrome/browser/profiles/profile_dependency_manager.cc b/chrome/browser/profiles/profile_dependency_manager.cc index 3c06ae9..ddf47e1 100644 --- a/chrome/browser/profiles/profile_dependency_manager.cc +++ b/chrome/browser/profiles/profile_dependency_manager.cc @@ -41,6 +41,7 @@ #include "chrome/browser/extensions/api/processes/processes_api.h" #include "chrome/browser/extensions/api/push_messaging/push_messaging_api.h" #include "chrome/browser/extensions/api/session_restore/session_restore_api.h" +#include "chrome/browser/extensions/api/system_info/system_info_api.h" #include "chrome/browser/extensions/api/tab_capture/tab_capture_registry_factory.h" #include "chrome/browser/extensions/api/tabs/tabs_windows_api.h" #include "chrome/browser/extensions/api/themes/theme_api.h" @@ -305,6 +306,7 @@ void ProfileDependencyManager::AssertFactoriesBuilt() { #if defined(ENABLE_INPUT_SPEECH) extensions::SpeechInputAPI::GetFactoryInstance(); #endif + extensions::SystemInfoAPI::GetFactoryInstance(); extensions::SuggestedLinksRegistryFactory::GetInstance(); extensions::TabCaptureRegistryFactory::GetInstance(); extensions::TabsWindowsAPI::GetFactoryInstance(); diff --git a/chrome/chrome_browser_extensions.gypi b/chrome/chrome_browser_extensions.gypi index ae7ff19..0244822 100644 --- a/chrome/chrome_browser_extensions.gypi +++ b/chrome/chrome_browser_extensions.gypi @@ -695,11 +695,11 @@ 'browser/extensions/state_store.h', 'browser/extensions/suggest_permission_util.h', 'browser/extensions/suggest_permission_util.cc', + 'browser/extensions/api/system_info/system_info_api.cc', + 'browser/extensions/api/system_info/system_info_api.h', + 'browser/extensions/api/system_info/system_info_provider.h', 'browser/extensions/api/system_private/system_private_api.cc', 'browser/extensions/api/system_private/system_private_api.h', - 'browser/extensions/system_info_provider.h', - 'browser/extensions/system_info_event_router.cc', - 'browser/extensions/system_info_event_router.h', 'browser/extensions/tab_helper.cc', 'browser/extensions/tab_helper.h', 'browser/extensions/theme_installed_infobar_delegate.cc', |