• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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_BACKGROUND_APPLICATION_LIST_MODEL_H_
6 #define CHROME_BROWSER_BACKGROUND_BACKGROUND_APPLICATION_LIST_MODEL_H_
7 
8 #include <map>
9 #include <string>
10 
11 #include "base/basictypes.h"
12 #include "base/observer_list.h"
13 #include "content/public/browser/notification_observer.h"
14 #include "content/public/browser/notification_registrar.h"
15 #include "extensions/common/extension.h"
16 
17 class Profile;
18 
19 namespace gfx {
20 class ImageSkia;
21 }
22 
23 // Model for list of Background Applications associated with a Profile (i.e.
24 // extensions with kBackgroundPermission set, or hosted apps with a
25 // BackgroundContents).
26 class BackgroundApplicationListModel : public content::NotificationObserver {
27  public:
28   // Observer is informed of changes to the model.  Users of the
29   // BackgroundApplicationListModel should anticipate that associated data,
30   // e. g. the Icon, may exist and yet not be immediately available.  When the
31   // data becomes available, OnApplicationDataChanged will be invoked for all
32   // Observers of the model.
33   class Observer {
34    public:
35     // Invoked when data that the model associates with the extension, such as
36     // the Icon, has changed.
37     virtual void OnApplicationDataChanged(
38         const extensions::Extension* extension,
39         Profile* profile);
40 
41     // Invoked when the model detects a previously unknown extension and/or when
42     // it no longer detects a previously known extension.
43     virtual void OnApplicationListChanged(Profile* profile);
44 
45    protected:
46     virtual ~Observer();
47   };
48 
49   // Create a new model associated with profile.
50   explicit BackgroundApplicationListModel(Profile* profile);
51 
52   virtual ~BackgroundApplicationListModel();
53 
54   // Associate observer with this model.
55   void AddObserver(Observer* observer);
56 
57   // Return the icon associated with |extension| or NULL.  NULL indicates either
58   // that there is no icon associated with the extension, or that a pending
59   // task to retrieve the icon has not completed.  See the Observer class above.
60   //
61   // NOTE: The model manages the ImageSkia result, that is it "owns" the memory,
62   //       releasing it if the associated background application is unloaded.
63   // NOTE: All icons are currently sized as
64   //       ExtensionIconSet::EXTENSION_ICON_BITTY.
65   const gfx::ImageSkia* GetIcon(const extensions::Extension* extension);
66 
67   // Return the position of |extension| within this list model.
68   int GetPosition(const extensions::Extension* extension) const;
69 
70   // Return the extension at the specified |position| in this list model.
71   const extensions::Extension* GetExtension(int position) const;
72 
73   // Returns true if the passed extension is a background app.
74   static bool IsBackgroundApp(const extensions::Extension& extension,
75                               Profile* profile);
76 
77   // Dissociate observer from this model.
78   void RemoveObserver(Observer* observer);
79 
begin()80   extensions::ExtensionList::const_iterator begin() const {
81     return extensions_.begin();
82   }
83 
end()84   extensions::ExtensionList::const_iterator end() const {
85     return extensions_.end();
86   }
87 
size()88   size_t size() const {
89     return extensions_.size();
90   }
91 
92  private:
93   // Contains data associated with a background application that is not
94   // represented by the Extension class.
95   class Application;
96 
97   // Associates extension id strings with Application objects.
98   typedef std::map<std::string, Application*> ApplicationMap;
99 
100   // Identifies and caches data related to the extension.
101   void AssociateApplicationData(const extensions::Extension* extension);
102 
103   // Clears cached data related to |extension|.
104   void DissociateApplicationData(const extensions::Extension* extension);
105 
106   // Returns the Application associated with |extension| or NULL.
107   const Application* FindApplication(
108       const extensions::Extension* extension) const;
109 
110   // Returns the Application associated with |extension| or NULL.
111   Application* FindApplication(const extensions::Extension* extension);
112 
113   // content::NotificationObserver implementation.
114   virtual void Observe(int type,
115                        const content::NotificationSource& source,
116                        const content::NotificationDetails& details) OVERRIDE;
117 
118   // Notifies observers that some of the data associated with this background
119   // application, e. g. the Icon, has changed.
120   void SendApplicationDataChangedNotifications(
121       const extensions::Extension* extension);
122 
123   // Notifies observers that at least one background application has been added
124   // or removed.
125   void SendApplicationListChangedNotifications();
126 
127   // Invoked by Observe for NOTIFICATION_EXTENSION_LOADED_DEPRECATED.
128   void OnExtensionLoaded(const extensions::Extension* extension);
129 
130   // Invoked by Observe for NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED.
131   void OnExtensionUnloaded(const extensions::Extension* extension);
132 
133   // Invoked by Observe for NOTIFICATION_EXTENSION_PERMISSIONS_UPDATED.
134   void OnExtensionPermissionsUpdated(
135       const extensions::Extension* extension,
136       extensions::UpdatedExtensionPermissionsInfo::Reason reason,
137       const extensions::PermissionSet* permissions);
138 
139   // Refresh the list of background applications and generate notifications.
140   void Update();
141 
142   // Determines if the given extension has to be considered a "background app"
143   // due to its use of PushMessaging. Normally every extension that expectes
144   // push messages is classified as "background app", however there are some
145   // rare exceptions, so this function implements a whitelist.
146   static bool RequiresBackgroundModeForPushMessaging(
147       const extensions::Extension& extension);
148 
149   ApplicationMap applications_;
150   extensions::ExtensionList extensions_;
151   ObserverList<Observer, true> observers_;
152   Profile* profile_;
153   content::NotificationRegistrar registrar_;
154 
155   DISALLOW_COPY_AND_ASSIGN(BackgroundApplicationListModel);
156 };
157 
158 #endif  // CHROME_BROWSER_BACKGROUND_BACKGROUND_APPLICATION_LIST_MODEL_H_
159