// 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_APPLICATION_LIST_MODEL_H_
#define CHROME_BROWSER_BACKGROUND_APPLICATION_LIST_MODEL_H_
#pragma once
#include <map>
#include <string>
#include "base/basictypes.h"
#include "base/observer_list.h"
#include "chrome/common/extensions/extension.h"
#include "content/common/notification_observer.h"
#include "content/common/notification_registrar.h"
class ExtensionService;
class PrefService;
class Profile;
// Model for list of Background Applications, that is, Extensions with
// kBackgroundPermission set, associated with a Profile.
class BackgroundApplicationListModel : public NotificationObserver {
public:
// Observer is informed of changes to the model. Users of the
// BackgroundApplicationListModel should anticipate that associated data,
// e. g. the Icon, may exist and yet not be immediately available. When the
// data becomes available, OnApplicationDataChanged will be invoked for all
// Observers of the model.
class Observer {
public:
// Invoked when data that the model associates with the extension, such as
// the Icon, has changed.
virtual void OnApplicationDataChanged(const Extension* extension);
// Invoked when the model detects a previously unknown extension and/or when
// it no longer detects a previously known extension.
virtual void OnApplicationListChanged();
protected:
virtual ~Observer();
};
// Create a new model associated with profile.
explicit BackgroundApplicationListModel(Profile* profile);
~BackgroundApplicationListModel();
// Associate observer with this model.
void AddObserver(Observer* observer);
// Return the icon associated with |extension| or NULL. NULL indicates either
// that there is no icon associated with the extension, or that a pending
// task to retrieve the icon has not completed. See the Observer class above.
//
// NOTE: The model manages the SkBitmap result, that is it "owns" the memory,
// releasing it if the associated background application is unloaded.
// NOTE: All icons are currently sized as Extension::EXTENSION_ICON_BITTY.
const SkBitmap* GetIcon(const Extension* extension);
// Return the position of |extension| within this list model.
int GetPosition(const Extension* extension) const;
// Return the extension at the specified |position| in this list model.
const Extension* GetExtension(int position) const;
// Returns true if the passed extension is a background app.
static bool IsBackgroundApp(const Extension& extension);
// Dissociate observer from this model.
void RemoveObserver(Observer* observer);
ExtensionList::const_iterator begin() const {
return extensions_.begin();
}
ExtensionList::const_iterator end() const {
return extensions_.end();
}
size_t size() const {
return extensions_.size();
}
private:
// Contains data associated with a background application that is not
// represented by the Extension class.
class Application;
// Associates extension id strings with Application objects.
typedef std::map<std::string, Application*> ApplicationMap;
// Identifies and caches data related to the extension.
void AssociateApplicationData(const Extension* extension);
// Clears cached data related to |extension|.
void DissociateApplicationData(const Extension* extension);
// Returns the Application associated with |extension| or NULL.
const Application* FindApplication(const Extension* extension) const;
// Returns the Application associated with |extension| or NULL.
Application* FindApplication(const Extension* extension);
// NotificationObserver implementation.
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
// Notifies observers that some of the data associated with this background
// application, e. g. the Icon, has changed.
void OnApplicationDataChanged(const Extension* extension);
// Notifies observers that at least one background application has been added
// or removed.
void OnApplicationListChanged();
// Invoked by Observe for EXTENSION_LOADED notifications.
void OnExtensionLoaded(Extension* extension);
// Invoked by Observe for EXTENSION_UNLOADED notifications.
void OnExtensionUnloaded(const Extension* extension);
// Refresh the list of background applications and generate notifications.
void Update();
ApplicationMap applications_;
ExtensionList extensions_;
ObserverList<Observer> observers_;
Profile* profile_;
NotificationRegistrar registrar_;
DISALLOW_COPY_AND_ASSIGN(BackgroundApplicationListModel);
};
#endif // CHROME_BROWSER_BACKGROUND_APPLICATION_LIST_MODEL_H_