• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_UI_WEBUI_APP_LAUNCHER_HANDLER_H_
6 #define CHROME_BROWSER_UI_WEBUI_APP_LAUNCHER_HANDLER_H_
7 #pragma once
8 
9 #include "base/memory/scoped_ptr.h"
10 #include "chrome/browser/extensions/extension_install_ui.h"
11 #include "chrome/browser/extensions/extension_uninstall_dialog.h"
12 #include "chrome/browser/prefs/pref_change_registrar.h"
13 #include "chrome/common/extensions/extension.h"
14 #include "chrome/common/extensions/extension_constants.h"
15 #include "content/browser/webui/web_ui.h"
16 #include "content/common/notification_observer.h"
17 #include "content/common/notification_registrar.h"
18 
19 class ExtensionPrefs;
20 class ExtensionService;
21 class NotificationRegistrar;
22 class PrefChangeRegistrar;
23 class Profile;
24 
25 namespace gfx {
26 class Rect;
27 }
28 
29 // The handler for Javascript messages related to the "apps" view.
30 class AppLauncherHandler : public WebUIMessageHandler,
31                            public ExtensionUninstallDialog::Delegate,
32                            public ExtensionInstallUI::Delegate,
33                            public NotificationObserver {
34  public:
35   explicit AppLauncherHandler(ExtensionService* extension_service);
36   virtual ~AppLauncherHandler();
37 
38   // Populate a dictionary with the information from an extension.
39   static void CreateAppInfo(const Extension* extension,
40                             ExtensionPrefs* extension_prefs,
41                             DictionaryValue* value);
42 
43   // Callback for pings related to launching apps on the NTP.
44   static bool HandlePing(Profile* profile, const std::string& path);
45 
46   // WebUIMessageHandler implementation.
47   virtual WebUIMessageHandler* Attach(WebUI* web_ui);
48   virtual void RegisterMessages();
49 
50   // NotificationObserver
51   virtual void Observe(NotificationType type,
52                       const NotificationSource& source,
53                       const NotificationDetails& details);
54 
55   // Populate the given dictionary with all installed app info.
56   void FillAppDictionary(DictionaryValue* value);
57 
58   // Populate the given dictionary with the web store promo content.
59   void FillPromoDictionary(DictionaryValue* value);
60 
61   // Callback for the "getApps" message.
62   void HandleGetApps(const ListValue* args);
63 
64   // Callback for the "launchApp" message.
65   void HandleLaunchApp(const ListValue* args);
66 
67   // Callback for the "setLaunchType" message.
68   void HandleSetLaunchType(const ListValue* args);
69 
70   // Callback for the "uninstallApp" message.
71   void HandleUninstallApp(const ListValue* args);
72 
73   // Callback for the "hideAppPromo" message.
74   void HandleHideAppsPromo(const ListValue* args);
75 
76   // Callback for the "createAppShortcut" message.
77   void HandleCreateAppShortcut(const ListValue* args);
78 
79   // Callback for the "reorderApps" message.
80   void HandleReorderApps(const ListValue* args);
81 
82   // Callback for the "setPageIndex" message.
83   void HandleSetPageIndex(const ListValue* args);
84 
85   // Callback for the "promoSeen" message.
86   void HandlePromoSeen(const ListValue* args);
87 
88  private:
89   // Records a web store launch in the appropriate histograms. |promo_active|
90   // specifies if the web store promotion was active.
91   static void RecordWebStoreLaunch(bool promo_active);
92 
93   // Records an app launch in the corresponding |bucket| of the app launch
94   // histogram. |promo_active| specifies if the web store promotion was active.
95   static void RecordAppLaunchByID(bool promo_active,
96                                   extension_misc::AppLaunchBucket bucket);
97 
98   // Records an app launch in the corresponding |bucket| of the app launch
99   // histogram if the |escaped_url| corresponds to an installed app.
100   static void RecordAppLaunchByURL(Profile* profile,
101                                    std::string escaped_url,
102                                    extension_misc::AppLaunchBucket bucket);
103 
104   // Prompts the user to re-enable the app for |extension_id|.
105   void PromptToEnableApp(const std::string& extension_id);
106 
107   // ExtensionUninstallDialog::Delegate:
108   virtual void ExtensionDialogAccepted();
109   virtual void ExtensionDialogCanceled();
110 
111   // ExtensionInstallUI::Delegate:
112   virtual void InstallUIProceed();
113   virtual void InstallUIAbort();
114 
115   // Returns the ExtensionUninstallDialog object for this class, creating it if
116   // needed.
117   ExtensionUninstallDialog* GetExtensionUninstallDialog();
118 
119   // Returns the ExtensionInstallUI object for this class, creating it if
120   // needed.
121   ExtensionInstallUI* GetExtensionInstallUI();
122 
123   // Helper that uninstalls all the default apps.
124   void UninstallDefaultApps();
125 
126   // The apps are represented in the extensions model.
127   scoped_refptr<ExtensionService> extensions_service_;
128 
129   // We monitor changes to the extension system so that we can reload the apps
130   // when necessary.
131   NotificationRegistrar registrar_;
132 
133   // Monitor extension preference changes so that the Web UI can be notified.
134   PrefChangeRegistrar pref_change_registrar_;
135 
136   // Used to show confirmation UI for uninstalling extensions in incognito mode.
137   scoped_ptr<ExtensionUninstallDialog> extension_uninstall_dialog_;
138 
139   // Used to show confirmation UI for enabling extensions in incognito mode.
140   scoped_ptr<ExtensionInstallUI> extension_install_ui_;
141 
142   // The id of the extension we are prompting the user about.
143   std::string extension_id_prompting_;
144 
145   // Whether the promo is currently being shown.
146   bool promo_active_;
147 
148   // When true, we ignore changes to the underlying data rather than immediately
149   // refreshing. This is useful when making many batch updates to avoid flicker.
150   bool ignore_changes_;
151 
152   DISALLOW_COPY_AND_ASSIGN(AppLauncherHandler);
153 };
154 
155 #endif  // CHROME_BROWSER_UI_WEBUI_APP_LAUNCHER_HANDLER_H_
156