blob: e00f5eb17582d147d5dbe301f8b4b924568cdd26 [file] [log] [blame]
// 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_