1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// found in the LICENSE file.
4201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
5201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#ifndef CHROME_BROWSER_BACKGROUND_PAGE_TRACKER_H_
6201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#define CHROME_BROWSER_BACKGROUND_PAGE_TRACKER_H_
7201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#pragma once
8201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
9201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include <map>
10201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include <string>
11201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
12201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/gtest_prod_util.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
16201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
17201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass PrefService;
18201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
19201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch///////////////////////////////////////////////////////////////////////////////
20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// BackgroundPageTracker
21201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch//
22201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// This class is a singleton class that monitors when new background pages are
23201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// loaded, and sends out a notification.
24201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch//
25201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass BackgroundPageTracker : public NotificationObserver {
26201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public:
27201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  static void RegisterPrefs(PrefService* prefs);
28201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
29201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Convenience routine which gets the singleton object.
3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  static BackgroundPageTracker* GetInstance();
31201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
32201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Returns the number of background apps/extensions currently loaded.
33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int GetBackgroundPageCount();
34201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
35201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Returns the number of unacknowledged background pages (for use in badges,
36201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // etc).
37201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int GetUnacknowledgedBackgroundPageCount();
38201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
39201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Called when the user has acknowledged that new background apps have been
40201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // loaded. Future calls to GetUnacknowledgedBackgroundPageCount() will return
41201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // 0 until another background page is installed.
42201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void AcknowledgeBackgroundPages();
43201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
44201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch protected:
45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Constructor marked as protected so we can create mock subclasses.
46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BackgroundPageTracker();
47201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ~BackgroundPageTracker();
48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  friend struct DefaultSingletonTraits<BackgroundPageTracker>;
49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  friend class BackgroundPageTrackerTest;
50201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  FRIEND_TEST_ALL_PREFIXES(BackgroundPageTrackerTest, OnBackgroundPageLoaded);
51201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  FRIEND_TEST_ALL_PREFIXES(BackgroundPageTrackerTest,
52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                           AcknowledgeBackgroundPages);
53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  FRIEND_TEST_ALL_PREFIXES(BackgroundPageTrackerTest,
54201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                           TestTrackerChangedNotifications);
55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Mockable method to get the PrefService where we store information about
57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // background pages.
58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual PrefService* GetPrefService();
59201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
60201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Helper routine which checks to see if this object should be enabled or not.
61201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // If false, the BackgroundPageTracker always acts as if there are no
62201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // background pages. Virtual to allow enabling in mocks.
63201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual bool IsEnabled();
64201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
65201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private:
66201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // NotificationObserver implementation.
67201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void Observe(NotificationType type,
68201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                       const NotificationSource& source,
69201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                       const NotificationDetails& details);
70201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
71201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Invoked once all extensions have been loaded, so we can update our list of
72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // tracked pages and send out the appropriate notifications. Returns true if
73201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // the extension list was changed.
74201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool UpdateExtensionList();
75201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
76201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Called when a background page is loaded (either because a hosted app
77201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // opened a BackgroundContents or a packaged extension was loaded with an
78201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // extension background page). Updates our internal list of unacknowledged
79201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // background pages.
80201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void OnBackgroundPageLoaded(const std::string& parent_application_id);
81201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
82201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // When an extension is unloaded, removes it from the list of background pages
83201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // so we no longer nag the user about it (if it is still unacknowledged) and
84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // we inform the user if it is ever re-installed/enabled.
85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void OnExtensionUnloaded(const std::string& parent_application_id);
86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Sends out a notification that the list of background pages has changed.
88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void SendChangeNotification();
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  NotificationRegistrar registrar_;
91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
92201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(BackgroundPageTracker);
93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch};
94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
95201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#endif  // CHROME_BROWSER_BACKGROUND_PAGE_TRACKER_H_
96