15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_ALARMS_ALARM_MANAGER_H__ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_ALARMS_ALARM_MANAGER_H__ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <queue> 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/callback.h" 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/gtest_prod_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/scoped_observer.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/api/alarms.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/browser_context_keyed_api_factory.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_registry_observer.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Clock; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace base 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content { 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class BrowserContext; 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace content 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionAlarmsSchedulingTest; 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ExtensionRegistry; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Alarm { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Alarm(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Alarm(const std::string& name, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const api::alarms::AlarmCreateInfo& create_info, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta min_granularity, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time now); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Alarm(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<api::alarms::Alarm> js_alarm; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The granularity isn't exposed to the extension's javascript, but we poll at 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // least as often as the shortest alarm's granularity. It's initialized as 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the relative delay requested in creation, even if creation uses an absolute 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time. This will always be at least as large as the min_granularity 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // constructor argument. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta granularity; 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The minimum granularity is the minimum allowed polling rate. This stops 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // alarms from polling too often. 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::TimeDelta minimum_granularity; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Manages the currently pending alarms for every extension in a profile. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There is one manager per virtual Profile. 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class AlarmManager : public BrowserContextKeyedAPI, 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public ExtensionRegistryObserver, 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public base::SupportsWeakPtr<AlarmManager> { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<Alarm> AlarmList; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Delegate { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Delegate() {} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when an alarm fires. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnAlarm(const std::string& extension_id, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Alarm& alarm) = 0; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) explicit AlarmManager(content::BrowserContext* context); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~AlarmManager(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override the default delegate. Callee assumes onwership. Used for testing. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_delegate(Delegate* delegate) { delegate_.reset(delegate); } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef base::Callback<void()> AddAlarmCallback; 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Adds |alarm| for the given extension, and starts the timer. Invokes 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // |callback| when done. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddAlarm(const std::string& extension_id, 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const Alarm& alarm, 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const AddAlarmCallback& callback); 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef base::Callback<void(Alarm*)> GetAlarmCallback; 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Passes the alarm with the given name, or NULL if none exists, to 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // |callback|. 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void GetAlarm(const std::string& extension_id, 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& name, 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const GetAlarmCallback& callback); 893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef base::Callback<void(const AlarmList*)> GetAllAlarmsCallback; 913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Passes the list of pending alarms for the given extension, or 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // NULL if none exist, to |callback|. 933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void GetAllAlarms( 943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& extension_id, const GetAllAlarmsCallback& callback); 953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef base::Callback<void(bool)> RemoveAlarmCallback; 973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Cancels and removes the alarm with the given name. Invokes |callback| when 983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // done. 993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void RemoveAlarm(const std::string& extension_id, 1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& name, 1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const RemoveAlarmCallback& callback); 1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef base::Callback<void()> RemoveAllAlarmsCallback; 1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Cancels and removes all alarms for the given extension. Invokes |callback| 1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // when done. 1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void RemoveAllAlarms( 1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& extension_id, const RemoveAllAlarmsCallback& callback); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Replaces AlarmManager's owned clock with |clock| and takes ownership of it. 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetClockForTesting(base::Clock* clock); 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // BrowserContextKeyedAPI implementation. 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static BrowserContextKeyedAPIFactory<AlarmManager>* GetFactoryInstance(); 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Convenience method to get the AlarmManager for a content::BrowserContext. 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static AlarmManager* Get(content::BrowserContext* browser_context); 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) friend void RunScheduleNextPoll(AlarmManager*); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ExtensionAlarmsSchedulingTest; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, PollScheduling); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReleasedExtensionPollsInfrequently); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, TimerRunning); 1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, MinimumGranularity); 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DifferentMinimumGranularities); 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RepeatingAlarmsScheduledPredictably); 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) friend class BrowserContextKeyedAPIFactory<AlarmManager>; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::string ExtensionId; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<ExtensionId, AlarmList> AlarmMap; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef base::Callback<void(const std::string&)> ReadyAction; 1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef std::queue<ReadyAction> ReadyQueue; 1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef std::map<ExtensionId, ReadyQueue> ReadyMap; 1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterator used to identify a particular alarm within the Map/List pair. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "Not found" is represented by <alarms_.end(), invalid_iterator>. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::pair<AlarmMap::iterator, AlarmList::iterator> AlarmIterator; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Part of AddAlarm that is executed after alarms are loaded. 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void AddAlarmWhenReady(const Alarm& alarm, 1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const AddAlarmCallback& callback, 1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& extension_id); 1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Part of GetAlarm that is executed after alarms are loaded. 1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void GetAlarmWhenReady(const std::string& name, 1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const GetAlarmCallback& callback, 1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& extension_id); 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Part of GetAllAlarms that is executed after alarms are loaded. 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void GetAllAlarmsWhenReady(const GetAllAlarmsCallback& callback, 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& extension_id); 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Part of RemoveAlarm that is executed after alarms are loaded. 1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void RemoveAlarmWhenReady(const std::string& name, 1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const RemoveAlarmCallback& callback, 1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& extension_id); 1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Part of RemoveAllAlarms that is executed after alarms are loaded. 1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void RemoveAllAlarmsWhenReady( 1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const RemoveAllAlarmsCallback& callback, const std::string& extension_id); 1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper to return the iterators within the AlarmMap and AlarmList for the 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // matching alarm, or an iterator to the end of the AlarmMap if none were 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // found. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AlarmIterator GetAlarmIterator(const std::string& extension_id, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper to cancel and remove the alarm at the given iterator. The iterator 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must be valid. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveAlarmIterator(const AlarmIterator& iter); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for when an alarm fires. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnAlarm(AlarmIterator iter); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internal helper to add an alarm and start the timer with the given delay. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddAlarmImpl(const std::string& extension_id, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Alarm& alarm); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Syncs our alarm data for the given extension to/from the state storage. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WriteToStorage(const std::string& extension_id); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReadFromStorage(const std::string& extension_id, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Set the timer to go off at the specified |time|, and set |next_poll_time| 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // appropriately. 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetNextPollTime(const base::Time& time); 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Schedules the next poll of alarms for when the next soonest alarm runs, 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but not more often than the minimum granularity of all alarms. 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ScheduleNextPoll(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Polls the alarms, running any that have elapsed. After running them and 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rescheduling repeating alarms, schedule the next poll. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PollAlarms(); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Executes |action| for given extension, making sure that the extension's 2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // alarm data has been synced from the storage. 2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void RunWhenReady(const std::string& extension_id, const ReadyAction& action); 2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // ExtensionRegistryObserver implementation. 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnExtensionLoaded(content::BrowserContext* browser_context, 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const Extension* extension) OVERRIDE; 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnExtensionUninstalled(content::BrowserContext* browser_context, 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const Extension* extension) OVERRIDE; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // BrowserContextKeyedAPI implementation. 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static const char* service_name() { 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return "AlarmManager"; 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static const bool kServiceHasOwnInstanceInIncognito = true; 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::BrowserContext* const browser_context_; 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Clock> clock_; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Delegate> delegate_; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Listen to extension load notifications. 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) extension_registry_observer_; 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The timer for this alarm manager. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::OneShotTimer<AlarmManager> timer_; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A map of our pending alarms, per extension. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invariant: None of the AlarmLists are empty. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AlarmMap alarms_; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // A map of actions waiting for alarm data to be synced from storage, per 2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // extension. 2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ReadyMap ready_actions_; 2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The previous time that alarms were run. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time last_poll_time_; 2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Next poll's time. 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time next_poll_time_; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AlarmManager); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_API_ALARMS_ALARM_MANAGER_H__ 247