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_APPLICATION_LIST_MODEL_H_
      6 #define CHROME_BROWSER_BACKGROUND_APPLICATION_LIST_MODEL_H_
      7 #pragma once
      8 
      9 #include <map>
     10 #include <string>
     11 
     12 #include "base/basictypes.h"
     13 #include "base/observer_list.h"
     14 #include "chrome/common/extensions/extension.h"
     15 #include "content/common/notification_observer.h"
     16 #include "content/common/notification_registrar.h"
     17 
     18 class ExtensionService;
     19 class PrefService;
     20 class Profile;
     21 
     22 // Model for list of Background Applications, that is, Extensions with
     23 // kBackgroundPermission set, associated with a Profile.
     24 class BackgroundApplicationListModel : public NotificationObserver {
     25  public:
     26   // Observer is informed of changes to the model.  Users of the
     27   // BackgroundApplicationListModel should anticipate that associated data,
     28   // e. g. the Icon, may exist and yet not be immediately available.  When the
     29   // data becomes available, OnApplicationDataChanged will be invoked for all
     30   // Observers of the model.
     31   class Observer {
     32    public:
     33     // Invoked when data that the model associates with the extension, such as
     34     // the Icon, has changed.
     35     virtual void OnApplicationDataChanged(const Extension* extension);
     36 
     37     // Invoked when the model detects a previously unknown extension and/or when
     38     // it no longer detects a previously known extension.
     39     virtual void OnApplicationListChanged();
     40 
     41    protected:
     42     virtual ~Observer();
     43   };
     44 
     45   // Create a new model associated with profile.
     46   explicit BackgroundApplicationListModel(Profile* profile);
     47 
     48   ~BackgroundApplicationListModel();
     49 
     50   // Associate observer with this model.
     51   void AddObserver(Observer* observer);
     52 
     53   // Return the icon associated with |extension| or NULL.  NULL indicates either
     54   // that there is no icon associated with the extension, or that a pending
     55   // task to retrieve the icon has not completed.  See the Observer class above.
     56   //
     57   // NOTE: The model manages the SkBitmap result, that is it "owns" the memory,
     58   //       releasing it if the associated background application is unloaded.
     59   // NOTE: All icons are currently sized as Extension::EXTENSION_ICON_BITTY.
     60   const SkBitmap* GetIcon(const Extension* extension);
     61 
     62   // Return the position of |extension| within this list model.
     63   int GetPosition(const Extension* extension) const;
     64 
     65   // Return the extension at the specified |position| in this list model.
     66   const Extension* GetExtension(int position) const;
     67 
     68   // Returns true if the passed extension is a background app.
     69   static bool IsBackgroundApp(const Extension& extension);
     70 
     71   // Dissociate observer from this model.
     72   void RemoveObserver(Observer* observer);
     73 
     74   ExtensionList::const_iterator begin() const {
     75     return extensions_.begin();
     76   }
     77 
     78   ExtensionList::const_iterator end() const {
     79     return extensions_.end();
     80   }
     81 
     82   size_t size() const {
     83     return extensions_.size();
     84   }
     85 
     86  private:
     87   // Contains data associated with a background application that is not
     88   // represented by the Extension class.
     89   class Application;
     90 
     91   // Associates extension id strings with Application objects.
     92   typedef std::map<std::string, Application*> ApplicationMap;
     93 
     94   // Identifies and caches data related to the extension.
     95   void AssociateApplicationData(const Extension* extension);
     96 
     97   // Clears cached data related to |extension|.
     98   void DissociateApplicationData(const Extension* extension);
     99 
    100   // Returns the Application associated with |extension| or NULL.
    101   const Application* FindApplication(const Extension* extension) const;
    102 
    103   // Returns the Application associated with |extension| or NULL.
    104   Application* FindApplication(const Extension* extension);
    105 
    106   // NotificationObserver implementation.
    107   virtual void Observe(NotificationType type,
    108                        const NotificationSource& source,
    109                        const NotificationDetails& details);
    110 
    111   // Notifies observers that some of the data associated with this background
    112   // application, e. g. the Icon, has changed.
    113   void OnApplicationDataChanged(const Extension* extension);
    114 
    115   // Notifies observers that at least one background application has been added
    116   // or removed.
    117   void OnApplicationListChanged();
    118 
    119   // Invoked by Observe for EXTENSION_LOADED notifications.
    120   void OnExtensionLoaded(Extension* extension);
    121 
    122   // Invoked by Observe for EXTENSION_UNLOADED notifications.
    123   void OnExtensionUnloaded(const Extension* extension);
    124 
    125   // Refresh the list of background applications and generate notifications.
    126   void Update();
    127 
    128   ApplicationMap applications_;
    129   ExtensionList extensions_;
    130   ObserverList<Observer> observers_;
    131   Profile* profile_;
    132   NotificationRegistrar registrar_;
    133 
    134   DISALLOW_COPY_AND_ASSIGN(BackgroundApplicationListModel);
    135 };
    136 
    137 #endif  // CHROME_BROWSER_BACKGROUND_APPLICATION_LIST_MODEL_H_
    138