Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/api/system_info/system_info_api.h" | 5 #include "chrome/browser/extensions/api/system_info/system_info_api.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 61 virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE; | 61 virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE; |
| 62 virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE; | 62 virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE; |
| 63 | 63 |
| 64 // RemovableStorageObserver implementation. | 64 // RemovableStorageObserver implementation. |
| 65 virtual void OnRemovableStorageAttached(const StorageInfo& info) OVERRIDE; | 65 virtual void OnRemovableStorageAttached(const StorageInfo& info) OVERRIDE; |
| 66 virtual void OnRemovableStorageDetached(const StorageInfo& info) OVERRIDE; | 66 virtual void OnRemovableStorageDetached(const StorageInfo& info) OVERRIDE; |
| 67 | 67 |
| 68 // Called from any thread to dispatch the systemInfo event to all extension | 68 // Called from any thread to dispatch the systemInfo event to all extension |
| 69 // processes cross multiple profiles. | 69 // processes cross multiple profiles. |
| 70 void DispatchEvent(const std::string& event_name, | 70 void DispatchEvent(const std::string& event_name, |
| 71 scoped_ptr<base::ListValue> args); | 71 scoped_ptr<base::ListValue> args); |
| 72 | 72 |
| 73 // Called to dispatch the systemInfo.display.onDisplayChanged event. | 73 // Called to dispatch the systemInfo.display.onDisplayChanged event. |
| 74 void OnDisplayChanged(); | 74 void OnDisplayChanged(); |
| 75 | 75 |
| 76 // Used to record the event names being watched. | 76 // Used to record the event names being watched. |
| 77 std::multiset<std::string> watching_event_set_; | 77 std::multiset<std::string> watching_event_set_; |
| 78 | 78 |
| 79 DISALLOW_COPY_AND_ASSIGN(SystemInfoEventRouter); | 79 DISALLOW_COPY_AND_ASSIGN(SystemInfoEventRouter); |
| 80 }; | 80 }; |
| 81 | 81 |
| 82 static base::LazyInstance<SystemInfoEventRouter>::Leaky | 82 static base::LazyInstance<SystemInfoEventRouter>::Leaky |
| 83 g_system_info_event_router = LAZY_INSTANCE_INITIALIZER; | 83 g_system_info_event_router = LAZY_INSTANCE_INITIALIZER; |
| 84 | 84 |
| 85 // static | 85 // static |
| 86 SystemInfoEventRouter* SystemInfoEventRouter::GetInstance() { | 86 SystemInfoEventRouter* SystemInfoEventRouter::GetInstance() { |
| 87 return g_system_info_event_router.Pointer(); | 87 return g_system_info_event_router.Pointer(); |
| 88 } | 88 } |
| 89 | 89 |
| 90 SystemInfoEventRouter::SystemInfoEventRouter() { | 90 SystemInfoEventRouter::SystemInfoEventRouter() { |
| 91 StorageMonitor::GetInstance()->AddObserver(this); | 91 StorageMonitor::GetInstance()->AddObserver(this); |
| 92 StorageMonitor::GetInstance()->EnsureInitialized(base::Closure()); | |
| 93 } | 92 } |
| 94 | 93 |
| 95 SystemInfoEventRouter::~SystemInfoEventRouter() { | 94 SystemInfoEventRouter::~SystemInfoEventRouter() { |
| 96 if (StorageMonitor* storage_monitor = StorageMonitor::GetInstance()) | 95 if (StorageMonitor* storage_monitor = StorageMonitor::GetInstance()) |
| 97 storage_monitor->RemoveObserver(this); | 96 storage_monitor->RemoveObserver(this); |
| 98 } | 97 } |
| 99 | 98 |
| 100 void SystemInfoEventRouter::AddEventListener(const std::string& event_name) { | 99 void SystemInfoEventRouter::AddEventListener(const std::string& event_name) { |
| 101 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 100 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 102 | 101 |
| 103 watching_event_set_.insert(event_name); | 102 watching_event_set_.insert(event_name); |
| 104 if (watching_event_set_.count(event_name) > 1) | 103 if (watching_event_set_.count(event_name) > 1) |
| 105 return; | 104 return; |
| 106 | 105 |
| 107 // For systemInfo.display event. | 106 // For systemInfo.display event. |
| 108 if (IsDisplayChangedEvent(event_name)) { | 107 if (IsDisplayChangedEvent(event_name)) { |
| 109 #if defined(USE_ASH) | 108 #if defined(USE_ASH) |
| 110 ash::Shell::GetScreen()->AddObserver(this); | 109 ash::Shell::GetScreen()->AddObserver(this); |
| 111 #endif | 110 #endif |
| 112 } | 111 } |
| 113 } | 112 } |
| 114 | 113 |
| 115 void SystemInfoEventRouter::RemoveEventListener( | 114 void SystemInfoEventRouter::RemoveEventListener(const std::string& event_name) { |
| 116 const std::string& event_name) { | |
| 117 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 115 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 118 | 116 |
| 119 std::multiset<std::string>::iterator it = | 117 std::multiset<std::string>::iterator it = |
| 120 watching_event_set_.find(event_name); | 118 watching_event_set_.find(event_name); |
| 121 if (it != watching_event_set_.end()) | 119 if (it != watching_event_set_.end()) |
| 122 watching_event_set_.erase(it); | 120 watching_event_set_.erase(it); |
| 123 | 121 |
| 124 if (watching_event_set_.count(event_name) > 0) | 122 if (watching_event_set_.count(event_name) > 0) |
| 125 return; | 123 return; |
| 126 | 124 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 void SystemInfoEventRouter::OnDisplayChanged() { | 163 void SystemInfoEventRouter::OnDisplayChanged() { |
| 166 scoped_ptr<base::ListValue> args(new base::ListValue()); | 164 scoped_ptr<base::ListValue> args(new base::ListValue()); |
| 167 DispatchEvent(system_display::OnDisplayChanged::kEventName, args.Pass()); | 165 DispatchEvent(system_display::OnDisplayChanged::kEventName, args.Pass()); |
| 168 } | 166 } |
| 169 | 167 |
| 170 void SystemInfoEventRouter::DispatchEvent(const std::string& event_name, | 168 void SystemInfoEventRouter::DispatchEvent(const std::string& event_name, |
| 171 scoped_ptr<base::ListValue> args) { | 169 scoped_ptr<base::ListValue> args) { |
| 172 g_browser_process->extension_event_router_forwarder()-> | 170 g_browser_process->extension_event_router_forwarder()-> |
| 173 BroadcastEventToRenderers(event_name, args.Pass(), GURL()); | 171 BroadcastEventToRenderers(event_name, args.Pass(), GURL()); |
| 174 } | 172 } |
| 175 | 173 |
|
Haojian Wu
2014/01/16 06:53:27
Some performance concerns: everytime we add an sys
Lei Zhang
2014/01/16 23:24:11
See patch set 2.
| |
| 174 void AddEventListener(const std::string& event_name) { | |
| 175 DCHECK(StorageMonitor::GetInstance()->IsInitialized()); | |
| 176 SystemInfoEventRouter::GetInstance()->AddEventListener(event_name); | |
| 177 } | |
| 178 | |
| 179 void RemoveEventListener(const std::string& event_name) { | |
| 180 DCHECK(StorageMonitor::GetInstance()->IsInitialized()); | |
| 181 SystemInfoEventRouter::GetInstance()->RemoveEventListener(event_name); | |
| 182 } | |
| 183 | |
| 176 } // namespace | 184 } // namespace |
| 177 | 185 |
| 178 static base::LazyInstance<ProfileKeyedAPIFactory<SystemInfoAPI> > | 186 static base::LazyInstance<ProfileKeyedAPIFactory<SystemInfoAPI> > |
| 179 g_factory = LAZY_INSTANCE_INITIALIZER; | 187 g_factory = LAZY_INSTANCE_INITIALIZER; |
| 180 | 188 |
| 181 // static | 189 // static |
| 182 ProfileKeyedAPIFactory<SystemInfoAPI>* SystemInfoAPI::GetFactoryInstance() { | 190 ProfileKeyedAPIFactory<SystemInfoAPI>* SystemInfoAPI::GetFactoryInstance() { |
| 183 return &g_factory.Get(); | 191 return &g_factory.Get(); |
| 184 } | 192 } |
| 185 | 193 |
| 186 SystemInfoAPI::SystemInfoAPI(Profile* profile) : profile_(profile) { | 194 SystemInfoAPI::SystemInfoAPI(Profile* profile) : profile_(profile) { |
| 187 ExtensionSystem::Get(profile_)->event_router()->RegisterObserver( | 195 ExtensionSystem::Get(profile_)->event_router()->RegisterObserver( |
| 188 this, system_storage::OnAttached::kEventName); | 196 this, system_storage::OnAttached::kEventName); |
| 189 ExtensionSystem::Get(profile_)->event_router()->RegisterObserver( | 197 ExtensionSystem::Get(profile_)->event_router()->RegisterObserver( |
| 190 this, system_storage::OnDetached::kEventName); | 198 this, system_storage::OnDetached::kEventName); |
| 191 ExtensionSystem::Get(profile_)->event_router()->RegisterObserver( | 199 ExtensionSystem::Get(profile_)->event_router()->RegisterObserver( |
| 192 this, system_display::OnDisplayChanged::kEventName); | 200 this, system_display::OnDisplayChanged::kEventName); |
| 193 } | 201 } |
| 194 | 202 |
| 195 SystemInfoAPI::~SystemInfoAPI() { | 203 SystemInfoAPI::~SystemInfoAPI() { |
| 196 } | 204 } |
| 197 | 205 |
| 198 void SystemInfoAPI::Shutdown() { | 206 void SystemInfoAPI::Shutdown() { |
| 199 ExtensionSystem::Get(profile_)->event_router()->UnregisterObserver(this); | 207 ExtensionSystem::Get(profile_)->event_router()->UnregisterObserver(this); |
| 200 } | 208 } |
| 201 | 209 |
| 202 void SystemInfoAPI::OnListenerAdded(const EventListenerInfo& details) { | 210 void SystemInfoAPI::OnListenerAdded(const EventListenerInfo& details) { |
| 203 SystemInfoEventRouter::GetInstance()->AddEventListener(details.event_name); | 211 StorageMonitor::GetInstance()->EnsureInitialized( |
| 212 base::Bind(&AddEventListener, details.event_name)); | |
| 204 } | 213 } |
| 205 | 214 |
| 206 void SystemInfoAPI::OnListenerRemoved(const EventListenerInfo& details) { | 215 void SystemInfoAPI::OnListenerRemoved(const EventListenerInfo& details) { |
| 207 SystemInfoEventRouter::GetInstance()->RemoveEventListener(details.event_name); | 216 StorageMonitor::GetInstance()->EnsureInitialized( |
| 217 base::Bind(&RemoveEventListener, details.event_name)); | |
| 208 } | 218 } |
| 209 | 219 |
| 210 } // namespace extensions | 220 } // namespace extensions |
| OLD | NEW |