1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_EXTENSIONS_API_IDLE_IDLE_MANAGER_H_ 6 #define CHROME_BROWSER_EXTENSIONS_API_IDLE_IDLE_MANAGER_H_ 7 8 #include <map> 9 #include <string> 10 11 #include "base/callback_forward.h" 12 #include "base/gtest_prod_util.h" 13 #include "base/memory/weak_ptr.h" 14 #include "base/scoped_observer.h" 15 #include "base/threading/thread_checker.h" 16 #include "base/timer/timer.h" 17 #include "chrome/browser/idle.h" 18 #include "components/keyed_service/core/keyed_service.h" 19 #include "extensions/browser/event_router.h" 20 #include "extensions/browser/extension_registry_observer.h" 21 22 namespace base { 23 class StringValue; 24 } // namespace base 25 26 class Profile; 27 28 namespace extensions { 29 class ExtensionRegistry; 30 31 typedef base::Callback<void(IdleState)> QueryStateCallback; 32 33 struct IdleMonitor { 34 explicit IdleMonitor(IdleState initial_state); 35 36 IdleState last_state; 37 int listeners; 38 int threshold; 39 }; 40 41 class IdleManager : public ExtensionRegistryObserver, 42 public EventRouter::Observer, 43 public KeyedService { 44 public: 45 class IdleTimeProvider { 46 public: IdleTimeProvider()47 IdleTimeProvider() {} ~IdleTimeProvider()48 virtual ~IdleTimeProvider() {} 49 virtual void CalculateIdleState(int idle_threshold, 50 IdleCallback notify) = 0; 51 virtual void CalculateIdleTime(IdleTimeCallback notify) = 0; 52 virtual bool CheckIdleStateIsLocked() = 0; 53 54 private: 55 DISALLOW_COPY_AND_ASSIGN(IdleTimeProvider); 56 }; 57 58 class EventDelegate { 59 public: EventDelegate()60 EventDelegate() {} ~EventDelegate()61 virtual ~EventDelegate() {} 62 virtual void OnStateChanged(const std::string& extension_id, 63 IdleState new_state) = 0; 64 virtual void RegisterObserver(EventRouter::Observer* observer) = 0; 65 virtual void UnregisterObserver(EventRouter::Observer* observer) = 0; 66 67 private: 68 DISALLOW_COPY_AND_ASSIGN(EventDelegate); 69 }; 70 71 explicit IdleManager(Profile* profile); 72 virtual ~IdleManager(); 73 74 void Init(); 75 76 // KeyedService implementation. 77 virtual void Shutdown() OVERRIDE; 78 79 // ExtensionRegistryObserver implementation. 80 virtual void OnExtensionUnloaded( 81 content::BrowserContext* browser_context, 82 const Extension* extension, 83 UnloadedExtensionInfo::Reason reason) OVERRIDE; 84 85 // EventRouter::Observer implementation. 86 virtual void OnListenerAdded(const EventListenerInfo& details) OVERRIDE; 87 virtual void OnListenerRemoved(const EventListenerInfo& details) OVERRIDE; 88 89 void QueryState(int threshold, QueryStateCallback notify); 90 void SetThreshold(const std::string& extension_id, int threshold); 91 static base::StringValue* CreateIdleValue(IdleState idle_state); 92 93 // Override default event class. Callee assumes ownership. Used for testing. 94 void SetEventDelegateForTest(scoped_ptr<EventDelegate> event_delegate); 95 96 // Override default idle time calculations. Callee assumes ownership. Used 97 // for testing. 98 void SetIdleTimeProviderForTest(scoped_ptr<IdleTimeProvider> idle_provider); 99 100 private: 101 FRIEND_TEST_ALL_PREFIXES(IdleTest, ActiveToIdle); 102 FRIEND_TEST_ALL_PREFIXES(IdleTest, ActiveToLocked); 103 FRIEND_TEST_ALL_PREFIXES(IdleTest, IdleToActive); 104 FRIEND_TEST_ALL_PREFIXES(IdleTest, IdleToLocked); 105 FRIEND_TEST_ALL_PREFIXES(IdleTest, LockedToActive); 106 FRIEND_TEST_ALL_PREFIXES(IdleTest, LockedToIdle); 107 FRIEND_TEST_ALL_PREFIXES(IdleTest, MultipleExtensions); 108 FRIEND_TEST_ALL_PREFIXES(IdleTest, ReAddListener); 109 FRIEND_TEST_ALL_PREFIXES(IdleTest, SetDetectionInterval); 110 FRIEND_TEST_ALL_PREFIXES(IdleTest, SetDetectionIntervalBeforeListener); 111 FRIEND_TEST_ALL_PREFIXES(IdleTest, SetDetectionIntervalMaximum); 112 FRIEND_TEST_ALL_PREFIXES(IdleTest, SetDetectionIntervalMinimum); 113 FRIEND_TEST_ALL_PREFIXES(IdleTest, UnloadCleanup); 114 115 typedef std::map<const std::string, IdleMonitor> MonitorMap; 116 117 IdleMonitor* GetMonitor(const std::string& extension_id); 118 void StartPolling(); 119 void StopPolling(); 120 void UpdateIdleState(); 121 void UpdateIdleStateCallback(int idle_time); 122 123 Profile* profile_; 124 125 IdleState last_state_; 126 MonitorMap monitors_; 127 128 base::RepeatingTimer<IdleManager> poll_timer_; 129 130 scoped_ptr<IdleTimeProvider> idle_time_provider_; 131 scoped_ptr<EventDelegate> event_delegate_; 132 133 base::ThreadChecker thread_checker_; 134 135 // Listen to extension unloaded notification. 136 ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> 137 extension_registry_observer_; 138 139 base::WeakPtrFactory<IdleManager> weak_factory_; 140 141 DISALLOW_COPY_AND_ASSIGN(IdleManager); 142 }; 143 144 } // namespace extensions 145 146 #endif // CHROME_BROWSER_EXTENSIONS_API_IDLE_IDLE_MANAGER_H_ 147