// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_BACKGROUND_PAGE_TRACKER_H_
#define CHROME_BROWSER_BACKGROUND_PAGE_TRACKER_H_
#pragma once

#include <map>
#include <string>

#include "base/gtest_prod_util.h"
#include "base/memory/singleton.h"
#include "content/common/notification_observer.h"
#include "content/common/notification_registrar.h"

class PrefService;

///////////////////////////////////////////////////////////////////////////////
// BackgroundPageTracker
//
// This class is a singleton class that monitors when new background pages are
// loaded, and sends out a notification.
//
class BackgroundPageTracker : public NotificationObserver {
 public:
  static void RegisterPrefs(PrefService* prefs);

  // Convenience routine which gets the singleton object.
  static BackgroundPageTracker* GetInstance();

  // Returns the number of background apps/extensions currently loaded.
  int GetBackgroundPageCount();

  // Returns the number of unacknowledged background pages (for use in badges,
  // etc).
  int GetUnacknowledgedBackgroundPageCount();

  // Called when the user has acknowledged that new background apps have been
  // loaded. Future calls to GetUnacknowledgedBackgroundPageCount() will return
  // 0 until another background page is installed.
  void AcknowledgeBackgroundPages();

 protected:
  // Constructor marked as protected so we can create mock subclasses.
  BackgroundPageTracker();
  ~BackgroundPageTracker();
  friend struct DefaultSingletonTraits<BackgroundPageTracker>;
  friend class BackgroundPageTrackerTest;
  FRIEND_TEST_ALL_PREFIXES(BackgroundPageTrackerTest, OnBackgroundPageLoaded);
  FRIEND_TEST_ALL_PREFIXES(BackgroundPageTrackerTest,
                           AcknowledgeBackgroundPages);
  FRIEND_TEST_ALL_PREFIXES(BackgroundPageTrackerTest,
                           TestTrackerChangedNotifications);

  // Mockable method to get the PrefService where we store information about
  // background pages.
  virtual PrefService* GetPrefService();

  // Helper routine which checks to see if this object should be enabled or not.
  // If false, the BackgroundPageTracker always acts as if there are no
  // background pages. Virtual to allow enabling in mocks.
  virtual bool IsEnabled();

 private:
  // NotificationObserver implementation.
  virtual void Observe(NotificationType type,
                       const NotificationSource& source,
                       const NotificationDetails& details);

  // Invoked once all extensions have been loaded, so we can update our list of
  // tracked pages and send out the appropriate notifications. Returns true if
  // the extension list was changed.
  bool UpdateExtensionList();

  // Called when a background page is loaded (either because a hosted app
  // opened a BackgroundContents or a packaged extension was loaded with an
  // extension background page). Updates our internal list of unacknowledged
  // background pages.
  void OnBackgroundPageLoaded(const std::string& parent_application_id);

  // When an extension is unloaded, removes it from the list of background pages
  // so we no longer nag the user about it (if it is still unacknowledged) and
  // we inform the user if it is ever re-installed/enabled.
  void OnExtensionUnloaded(const std::string& parent_application_id);

  // Sends out a notification that the list of background pages has changed.
  void SendChangeNotification();

  NotificationRegistrar registrar_;

  DISALLOW_COPY_AND_ASSIGN(BackgroundPageTracker);
};

#endif  // CHROME_BROWSER_BACKGROUND_PAGE_TRACKER_H_
