app_launcher_handler.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_WEBUI_NTP_APP_LAUNCHER_HANDLER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_WEBUI_NTP_APP_LAUNCHER_HANDLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/prefs/public/pref_change_registrar.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/prefs/public/pref_observer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/common/cancelable_request.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_install_prompt.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_uninstall_dialog.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_service.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_message_handler.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/string_ordinal.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionService;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefChangeRegistrar;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppNotification;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The handler for Javascript messages related to the "apps" view.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppLauncherHandler : public content::WebUIMessageHandler,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           public ExtensionUninstallDialog::Delegate,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           public ExtensionInstallPrompt::Delegate,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           public content::NotificationObserver,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           public PrefObserver {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit AppLauncherHandler(ExtensionService* extension_service);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AppLauncherHandler();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Populate a dictionary with the information from an extension.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void CreateAppInfo(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const extensions::Extension* extension,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const extensions::AppNotification* notification,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionService* service,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::DictionaryValue* value);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebUIMessageHandler implementation.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterMessages() OVERRIDE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::NotificationObserver
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PrefObserver
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnPreferenceChanged(PrefServiceBase* service,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& pref_name) OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Populate the given dictionary with all installed app info.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FillAppDictionary(base::DictionaryValue* value);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a dictionary value for the given extension. May return NULL, e.g. if
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the given extension is not an app. If non-NULL, the caller assumes
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ownership of the pointer.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* GetAppInfo(const extensions::Extension* extension);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Populate the given dictionary with the web store promo content.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FillPromoDictionary(base::DictionaryValue* value);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "getApps" message.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleGetApps(const base::ListValue* args);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "launchApp" message.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleLaunchApp(const base::ListValue* args);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "setLaunchType" message.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleSetLaunchType(const base::ListValue* args);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "uninstallApp" message.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleUninstallApp(const base::ListValue* args);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "createAppShortcut" message.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleCreateAppShortcut(const base::ListValue* args);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "reorderApps" message.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleReorderApps(const base::ListValue* args);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "setPageIndex" message.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleSetPageIndex(const base::ListValue* args);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "saveAppPageName" message.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleSaveAppPageName(const base::ListValue* args);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "generateAppForLink" message.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleGenerateAppForLink(const base::ListValue* args);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "recordAppLaunchByURL" message. Takes an escaped URL and a
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // launch source (integer), and if the URL represents an app, records the
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // action for UMA.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleRecordAppLaunchByUrl(const base::ListValue* args);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for "closeNotification" message.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleNotificationClose(const base::ListValue* args);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for "setNotificationsDisabled" message.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleSetNotificationsDisabled(const base::ListValue* args);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register app launcher preferences.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterUserPrefs(PrefServiceBase* pref_service);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Records the given type of app launch for UMA.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RecordAppLaunchType(extension_misc::AppLaunchBucket bucket);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct AppInstallInfo {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppInstallInfo();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~AppInstallInfo();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_bookmark_app;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 title;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL app_url;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::StringOrdinal page_ordinal;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset some instance flags we use to track the currently uninstalling app.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CleanupAfterUninstall();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Records a web store launch in the appropriate histograms.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RecordWebStoreLaunch();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Records an app launch in the corresponding |bucket| of the app launch
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // histogram. |promo_active| specifies if the web store promotion was active.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RecordAppLaunchByID(extension_misc::AppLaunchBucket bucket);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Records an app launch in the corresponding |bucket| of the app launch
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // histogram if the |escaped_url| corresponds to an installed app.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RecordAppLaunchByUrl(Profile* profile,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   std::string escaped_url,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   extension_misc::AppLaunchBucket bucket);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prompts the user to re-enable the app for |extension_id|.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PromptToEnableApp(const std::string& extension_id);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExtensionUninstallDialog::Delegate:
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ExtensionUninstallAccepted() OVERRIDE;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ExtensionUninstallCanceled() OVERRIDE;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExtensionInstallPrompt::Delegate:
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InstallUIProceed() OVERRIDE;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InstallUIAbort(bool user_initiated) OVERRIDE;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the ExtensionUninstallDialog object for this class, creating it if
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // needed.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionUninstallDialog* GetExtensionUninstallDialog();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the ExtensionInstallPrompt object for this class, creating it if
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // needed.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionInstallPrompt* GetExtensionInstallPrompt();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Continuation for installing a bookmark app after favicon lookup.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnFaviconForApp(FaviconService::Handle handle,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const history::FaviconImageResult& image_result);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends |highlight_app_id_| to the js.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetAppToBeHighlighted();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The apps are represented in the extensions model, which
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // outlives us since it's owned by our containing profile.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionService* const extension_service_;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We monitor changes to the extension system so that we can reload the apps
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when necessary.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Monitor extension preference changes so that the Web UI can be notified.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefChangeRegistrar pref_change_registrar_;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to show confirmation UI for uninstalling extensions in incognito mode.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionUninstallDialog> extension_uninstall_dialog_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to show confirmation UI for enabling extensions in incognito mode.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionInstallPrompt> extension_install_ui_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The ids of apps to show on the NTP.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> visible_apps_;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The id of the extension we are prompting the user about.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string extension_id_prompting_;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When true, we ignore changes to the underlying data rather than immediately
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // refreshing. This is useful when making many batch updates to avoid flicker.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ignore_changes_;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When true, we have attempted to install a bookmark app, and are still
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // waiting to hear about success or failure from the extensions system.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool attempted_bookmark_app_install_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if we have executed HandleGetApps() at least once.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_loaded_apps_;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The ID of the app to be highlighted on the NTP (i.e. shown on the page
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and pulsed). This is done for new installs. The actual higlighting occurs
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when the app is added to the page (via getAppsCallback or appAdded).
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string highlight_app_id_;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Hold state for favicon requests.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CancelableRequestConsumerTSimple<AppInstallInfo*> favicon_consumer_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AppLauncherHandler);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_WEBUI_NTP_APP_LAUNCHER_HANDLER_H_
215