alarm_manager.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/scoped_observer.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/api/alarms.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/browser_context_keyed_api_factory.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_registry_observer.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Clock; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace base 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content { 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class BrowserContext; 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace content 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionAlarmsSchedulingTest; 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ExtensionRegistry; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Alarm { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Alarm(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Alarm(const std::string& name, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const api::alarms::AlarmCreateInfo& create_info, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta min_granularity, 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time now); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Alarm(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<api::alarms::Alarm> js_alarm; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The granularity isn't exposed to the extension's javascript, but we poll at 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // least as often as the shortest alarm's granularity. It's initialized as 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the relative delay requested in creation, even if creation uses an absolute 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // time. This will always be at least as large as the min_granularity 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // constructor argument. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta granularity; 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The minimum granularity is the minimum allowed polling rate. This stops 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // alarms from polling too often. 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::TimeDelta minimum_granularity; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Manages the currently pending alarms for every extension in a profile. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There is one manager per virtual Profile. 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class AlarmManager : public BrowserContextKeyedAPI, 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public ExtensionRegistryObserver, 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public base::SupportsWeakPtr<AlarmManager> { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<Alarm> AlarmList; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Delegate { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Delegate() {} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when an alarm fires. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnAlarm(const std::string& extension_id, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Alarm& alarm) = 0; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) explicit AlarmManager(content::BrowserContext* context); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~AlarmManager(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override the default delegate. Callee assumes onwership. Used for testing. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_delegate(Delegate* delegate) { delegate_.reset(delegate); } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef base::Callback<void()> AddAlarmCallback; 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Adds |alarm| for the given extension, and starts the timer. Invokes 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // |callback| when done. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddAlarm(const std::string& extension_id, 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const Alarm& alarm, 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const AddAlarmCallback& callback); 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef base::Callback<void(Alarm*)> GetAlarmCallback; 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Passes the alarm with the given name, or NULL if none exists, to 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // |callback|. 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void GetAlarm(const std::string& extension_id, 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& name, 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const GetAlarmCallback& callback); 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef base::Callback<void(const AlarmList*)> GetAllAlarmsCallback; 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Passes the list of pending alarms for the given extension, or 913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // NULL if none exist, to |callback|. 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void GetAllAlarms( 933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& extension_id, const GetAllAlarmsCallback& callback); 943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef base::Callback<void(bool)> RemoveAlarmCallback; 963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Cancels and removes the alarm with the given name. Invokes |callback| when 973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // done. 983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void RemoveAlarm(const std::string& extension_id, 993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& name, 1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const RemoveAlarmCallback& callback); 1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef base::Callback<void()> RemoveAllAlarmsCallback; 1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Cancels and removes all alarms for the given extension. Invokes |callback| 1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // when done. 1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void RemoveAllAlarms( 1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& extension_id, const RemoveAllAlarmsCallback& callback); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Replaces AlarmManager's owned clock with |clock| and takes ownership of it. 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetClockForTesting(base::Clock* clock); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // BrowserContextKeyedAPI implementation. 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static BrowserContextKeyedAPIFactory<AlarmManager>* GetFactoryInstance(); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Convenience method to get the AlarmManager for a content::BrowserContext. 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static AlarmManager* Get(content::BrowserContext* browser_context); 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) friend void RunScheduleNextPoll(AlarmManager*); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ExtensionAlarmsSchedulingTest; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, PollScheduling); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReleasedExtensionPollsInfrequently); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, TimerRunning); 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, MinimumGranularity); 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DifferentMinimumGranularities); 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RepeatingAlarmsScheduledPredictably); 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) friend class BrowserContextKeyedAPIFactory<AlarmManager>; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::string ExtensionId; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<ExtensionId, AlarmList> AlarmMap; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef base::Callback<void(const std::string&)> ReadyAction; 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef std::queue<ReadyAction> ReadyQueue; 1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef std::map<ExtensionId, ReadyQueue> ReadyMap; 1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Iterator used to identify a particular alarm within the Map/List pair. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "Not found" is represented by <alarms_.end(), invalid_iterator>. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::pair<AlarmMap::iterator, AlarmList::iterator> AlarmIterator; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Part of AddAlarm that is executed after alarms are loaded. 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void AddAlarmWhenReady(const Alarm& alarm, 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const AddAlarmCallback& callback, 1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& extension_id); 1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Part of GetAlarm that is executed after alarms are loaded. 1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void GetAlarmWhenReady(const std::string& name, 1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const GetAlarmCallback& callback, 1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& extension_id); 1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Part of GetAllAlarms that is executed after alarms are loaded. 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void GetAllAlarmsWhenReady(const GetAllAlarmsCallback& callback, 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& extension_id); 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Part of RemoveAlarm that is executed after alarms are loaded. 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void RemoveAlarmWhenReady(const std::string& name, 1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const RemoveAlarmCallback& callback, 1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& extension_id); 1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Part of RemoveAllAlarms that is executed after alarms are loaded. 1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void RemoveAllAlarmsWhenReady( 1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const RemoveAllAlarmsCallback& callback, const std::string& extension_id); 1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper to return the iterators within the AlarmMap and AlarmList for the 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // matching alarm, or an iterator to the end of the AlarmMap if none were 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // found. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AlarmIterator GetAlarmIterator(const std::string& extension_id, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& name); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper to cancel and remove the alarm at the given iterator. The iterator 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must be valid. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveAlarmIterator(const AlarmIterator& iter); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for when an alarm fires. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnAlarm(AlarmIterator iter); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internal helper to add an alarm and start the timer with the given delay. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddAlarmImpl(const std::string& extension_id, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Alarm& alarm); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Syncs our alarm data for the given extension to/from the state storage. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WriteToStorage(const std::string& extension_id); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReadFromStorage(const std::string& extension_id, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Set the timer to go off at the specified |time|, and set |next_poll_time| 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // appropriately. 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetNextPollTime(const base::Time& time); 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Schedules the next poll of alarms for when the next soonest alarm runs, 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but not more often than the minimum granularity of all alarms. 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ScheduleNextPoll(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Polls the alarms, running any that have elapsed. After running them and 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rescheduling repeating alarms, schedule the next poll. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PollAlarms(); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Executes |action| for given extension, making sure that the extension's 2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // alarm data has been synced from the storage. 2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void RunWhenReady(const std::string& extension_id, const ReadyAction& action); 2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // ExtensionRegistryObserver implementation. 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnExtensionLoaded(content::BrowserContext* browser_context, 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const Extension* extension) OVERRIDE; 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnExtensionUninstalled(content::BrowserContext* browser_context, 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const Extension* extension) OVERRIDE; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // BrowserContextKeyedAPI implementation. 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static const char* service_name() { 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return "AlarmManager"; 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static const bool kServiceHasOwnInstanceInIncognito = true; 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::BrowserContext* const browser_context_; 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Clock> clock_; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Delegate> delegate_; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Listen to extension load notifications. 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) extension_registry_observer_; 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The timer for this alarm manager. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::OneShotTimer<AlarmManager> timer_; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A map of our pending alarms, per extension. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invariant: None of the AlarmLists are empty. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AlarmMap alarms_; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // A map of actions waiting for alarm data to be synced from storage, per 2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // extension. 2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ReadyMap ready_actions_; 2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The previous time that alarms were run. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time last_poll_time_; 2363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Next poll's time. 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time next_poll_time_; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AlarmManager); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_API_ALARMS_ALARM_MANAGER_H__ 246