12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/system_info/system_info_api.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/lazy_instance.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/singleton.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/removable_storage_observer.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/storage_info.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/storage_monitor.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/system_display/display_info_provider.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/system_storage/storage_info_provider.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/extensions_browser_client.h" 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/api/system_display.h" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/api/system_storage.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/display_observer.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/screen.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing core_api::system_storage::StorageUnitInfo; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread; 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using storage_monitor::StorageMonitor; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace system_display = core_api::system_display; 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace system_storage = core_api::system_storage; 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsDisplayChangedEvent(const std::string& event_name) { 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return event_name == system_display::OnDisplayChanged::kEventName; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool IsSystemStorageEvent(const std::string& event_name) { 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return (event_name == system_storage::OnAttached::kEventName || 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event_name == system_storage::OnDetached::kEventName); 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Event router for systemInfo API. It is a singleton instance shared by 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// multiple profiles. 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass SystemInfoEventRouter : public gfx::DisplayObserver, 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public storage_monitor::RemovableStorageObserver { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static SystemInfoEventRouter* GetInstance(); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SystemInfoEventRouter(); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~SystemInfoEventRouter(); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Add/remove event listener for the |event_name| event. 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddEventListener(const std::string& event_name); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveEventListener(const std::string& event_name); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // gfx::DisplayObserver: 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE; 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnDisplayMetricsChanged(const gfx::Display& display, 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32_t metrics) OVERRIDE; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // RemovableStorageObserver implementation. 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnRemovableStorageAttached( 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const storage_monitor::StorageInfo& info) OVERRIDE; 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnRemovableStorageDetached( 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const storage_monitor::StorageInfo& info) OVERRIDE; 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called from any thread to dispatch the systemInfo event to all extension 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // processes cross multiple profiles. 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DispatchEvent(const std::string& event_name, 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::ListValue> args); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called to dispatch the systemInfo.display.onDisplayChanged event. 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnDisplayChanged(); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used to record the event names being watched. 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::multiset<std::string> watching_event_set_; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool has_storage_monitor_observer_; 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SystemInfoEventRouter); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static base::LazyInstance<SystemInfoEventRouter>::Leaky 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_system_info_event_router = LAZY_INSTANCE_INITIALIZER; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SystemInfoEventRouter* SystemInfoEventRouter::GetInstance() { 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return g_system_info_event_router.Pointer(); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SystemInfoEventRouter::SystemInfoEventRouter() 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : has_storage_monitor_observer_(false) { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SystemInfoEventRouter::~SystemInfoEventRouter() { 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (has_storage_monitor_observer_) { 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StorageMonitor* storage_monitor = StorageMonitor::GetInstance(); 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (storage_monitor) 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) storage_monitor->RemoveObserver(this); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SystemInfoEventRouter::AddEventListener(const std::string& event_name) { 111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::UI); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) watching_event_set_.insert(event_name); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (watching_event_set_.count(event_name) > 1) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (IsDisplayChangedEvent(event_name)) { 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Screen* screen = DisplayInfoProvider::Get()->GetActiveScreen(); 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (screen) 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci screen->AddObserver(this); 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (IsSystemStorageEvent(event_name)) { 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!has_storage_monitor_observer_) { 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) has_storage_monitor_observer_ = true; 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(StorageMonitor::GetInstance()->IsInitialized()); 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StorageMonitor::GetInstance()->AddObserver(this); 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemInfoEventRouter::RemoveEventListener(const std::string& event_name) { 133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::UI); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::multiset<std::string>::iterator it = 136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) watching_event_set_.find(event_name); 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (it != watching_event_set_.end()) { 138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) watching_event_set_.erase(it); 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (watching_event_set_.count(event_name) > 0) 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (IsDisplayChangedEvent(event_name)) { 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Screen* screen = DisplayInfoProvider::Get()->GetActiveScreen(); 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (screen) 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci screen->RemoveObserver(this); 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (IsSystemStorageEvent(event_name)) { 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& other_event_name = 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (event_name == system_storage::OnDetached::kEventName) 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ? system_storage::OnAttached::kEventName 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : system_storage::OnDetached::kEventName; 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (watching_event_set_.count(other_event_name) == 0) { 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StorageMonitor::GetInstance()->RemoveObserver(this); 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) has_storage_monitor_observer_ = false; 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SystemInfoEventRouter::OnRemovableStorageAttached( 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const storage_monitor::StorageInfo& info) { 1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch StorageUnitInfo unit; 1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch systeminfo::BuildStorageUnitInfo(info, &unit); 1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<base::ListValue> args(new base::ListValue); 1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch args->Append(unit.ToValue().release()); 1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DispatchEvent(system_storage::OnAttached::kEventName, args.Pass()); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SystemInfoEventRouter::OnRemovableStorageDetached( 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const storage_monitor::StorageInfo& info) { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::ListValue> args(new base::ListValue); 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string transient_id = 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StorageMonitor::GetInstance()->GetTransientIdForDeviceId( 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) info.device_id()); 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) args->AppendString(transient_id); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DispatchEvent(system_storage::OnDetached::kEventName, args.Pass()); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SystemInfoEventRouter::OnDisplayAdded(const gfx::Display& new_display) { 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnDisplayChanged(); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SystemInfoEventRouter::OnDisplayRemoved(const gfx::Display& old_display) { 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnDisplayChanged(); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SystemInfoEventRouter::OnDisplayMetricsChanged(const gfx::Display& display, 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32_t metrics) { 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnDisplayChanged(); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SystemInfoEventRouter::OnDisplayChanged() { 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::ListValue> args(new base::ListValue()); 1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DispatchEvent(system_display::OnDisplayChanged::kEventName, args.Pass()); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SystemInfoEventRouter::DispatchEvent(const std::string& event_name, 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::ListValue> args) { 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionsBrowserClient::Get()->BroadcastEventToRenderers(event_name, 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci args.Pass()); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AddEventListener(const std::string& event_name) { 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SystemInfoEventRouter::GetInstance()->AddEventListener(event_name); 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RemoveEventListener(const std::string& event_name) { 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SystemInfoEventRouter::GetInstance()->RemoveEventListener(event_name); 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static base::LazyInstance<BrowserContextKeyedAPIFactory<SystemInfoAPI> > 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_factory = LAZY_INSTANCE_INITIALIZER; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BrowserContextKeyedAPIFactory<SystemInfoAPI>* 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SystemInfoAPI::GetFactoryInstance() { 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return g_factory.Pointer(); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SystemInfoAPI::SystemInfoAPI(content::BrowserContext* context) 225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : browser_context_(context) { 2260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EventRouter* router = EventRouter::Get(browser_context_); 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) router->RegisterObserver(this, system_storage::OnAttached::kEventName); 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) router->RegisterObserver(this, system_storage::OnDetached::kEventName); 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) router->RegisterObserver(this, system_display::OnDisplayChanged::kEventName); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SystemInfoAPI::~SystemInfoAPI() { 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SystemInfoAPI::Shutdown() { 2360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EventRouter::Get(browser_context_)->UnregisterObserver(this); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SystemInfoAPI::OnListenerAdded(const EventListenerInfo& details) { 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (IsSystemStorageEvent(details.event_name)) { 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StorageMonitor::GetInstance()->EnsureInitialized( 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&AddEventListener, details.event_name)); 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AddEventListener(details.event_name); 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SystemInfoAPI::OnListenerRemoved(const EventListenerInfo& details) { 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (IsSystemStorageEvent(details.event_name)) { 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StorageMonitor::GetInstance()->EnsureInitialized( 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&RemoveEventListener, details.event_name)); 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RemoveEventListener(details.event_name); 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 258