Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 2011 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_BACKGROUND_PAGE_TRACKER_H_
      6 #define CHROME_BROWSER_BACKGROUND_PAGE_TRACKER_H_
      7 #pragma once
      8 
      9 #include <map>
     10 #include <string>
     11 
     12 #include "base/gtest_prod_util.h"
     13 #include "base/memory/singleton.h"
     14 #include "content/common/notification_observer.h"
     15 #include "content/common/notification_registrar.h"
     16 
     17 class PrefService;
     18 
     19 ///////////////////////////////////////////////////////////////////////////////
     20 // BackgroundPageTracker
     21 //
     22 // This class is a singleton class that monitors when new background pages are
     23 // loaded, and sends out a notification.
     24 //
     25 class BackgroundPageTracker : public NotificationObserver {
     26  public:
     27   static void RegisterPrefs(PrefService* prefs);
     28 
     29   // Convenience routine which gets the singleton object.
     30   static BackgroundPageTracker* GetInstance();
     31 
     32   // Returns the number of background apps/extensions currently loaded.
     33   int GetBackgroundPageCount();
     34 
     35   // Returns the number of unacknowledged background pages (for use in badges,
     36   // etc).
     37   int GetUnacknowledgedBackgroundPageCount();
     38 
     39   // Called when the user has acknowledged that new background apps have been
     40   // loaded. Future calls to GetUnacknowledgedBackgroundPageCount() will return
     41   // 0 until another background page is installed.
     42   void AcknowledgeBackgroundPages();
     43 
     44  protected:
     45   // Constructor marked as protected so we can create mock subclasses.
     46   BackgroundPageTracker();
     47   ~BackgroundPageTracker();
     48   friend struct DefaultSingletonTraits<BackgroundPageTracker>;
     49   friend class BackgroundPageTrackerTest;
     50   FRIEND_TEST_ALL_PREFIXES(BackgroundPageTrackerTest, OnBackgroundPageLoaded);
     51   FRIEND_TEST_ALL_PREFIXES(BackgroundPageTrackerTest,
     52                            AcknowledgeBackgroundPages);
     53   FRIEND_TEST_ALL_PREFIXES(BackgroundPageTrackerTest,
     54                            TestTrackerChangedNotifications);
     55 
     56   // Mockable method to get the PrefService where we store information about
     57   // background pages.
     58   virtual PrefService* GetPrefService();
     59 
     60   // Helper routine which checks to see if this object should be enabled or not.
     61   // If false, the BackgroundPageTracker always acts as if there are no
     62   // background pages. Virtual to allow enabling in mocks.
     63   virtual bool IsEnabled();
     64 
     65  private:
     66   // NotificationObserver implementation.
     67   virtual void Observe(NotificationType type,
     68                        const NotificationSource& source,
     69                        const NotificationDetails& details);
     70 
     71   // Invoked once all extensions have been loaded, so we can update our list of
     72   // tracked pages and send out the appropriate notifications. Returns true if
     73   // the extension list was changed.
     74   bool UpdateExtensionList();
     75 
     76   // Called when a background page is loaded (either because a hosted app
     77   // opened a BackgroundContents or a packaged extension was loaded with an
     78   // extension background page). Updates our internal list of unacknowledged
     79   // background pages.
     80   void OnBackgroundPageLoaded(const std::string& parent_application_id);
     81 
     82   // When an extension is unloaded, removes it from the list of background pages
     83   // so we no longer nag the user about it (if it is still unacknowledged) and
     84   // we inform the user if it is ever re-installed/enabled.
     85   void OnExtensionUnloaded(const std::string& parent_application_id);
     86 
     87   // Sends out a notification that the list of background pages has changed.
     88   void SendChangeNotification();
     89 
     90   NotificationRegistrar registrar_;
     91 
     92   DISALLOW_COPY_AND_ASSIGN(BackgroundPageTracker);
     93 };
     94 
     95 #endif  // CHROME_BROWSER_BACKGROUND_PAGE_TRACKER_H_
     96