app_launcher_handler.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_change_registrar.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_uninstall_dialog.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_service.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/managed_mode/scoped_extension_elevation.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/cancelable_task_tracker.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_message_handler.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/string_ordinal.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionEnableFlow;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionService;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefChangeRegistrar;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs {
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable;
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The handler for Javascript messages related to the "apps" view.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppLauncherHandler : public content::WebUIMessageHandler,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           public ExtensionUninstallDialog::Delegate,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           public ExtensionEnableFlowDelegate,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           public content::NotificationObserver {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit AppLauncherHandler(ExtensionService* extension_service);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AppLauncherHandler();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Populate a dictionary with the information from an extension.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void CreateAppInfo(
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const extensions::Extension* extension,
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)  // Populate the given dictionary with all installed app info.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FillAppDictionary(base::DictionaryValue* value);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a dictionary value for the given extension. May return NULL, e.g. if
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the given extension is not an app. If non-NULL, the caller assumes
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ownership of the pointer.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* GetAppInfo(const extensions::Extension* extension);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Populate the given dictionary with the web store promo content.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FillPromoDictionary(base::DictionaryValue* value);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "getApps" message.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleGetApps(const base::ListValue* args);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "launchApp" message.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleLaunchApp(const base::ListValue* args);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "setLaunchType" message.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleSetLaunchType(const base::ListValue* args);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "uninstallApp" message.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleUninstallApp(const base::ListValue* args);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "createAppShortcut" message.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleCreateAppShortcut(const base::ListValue* args);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "reorderApps" message.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleReorderApps(const base::ListValue* args);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "setPageIndex" message.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleSetPageIndex(const base::ListValue* args);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "saveAppPageName" message.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleSaveAppPageName(const base::ListValue* args);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "generateAppForLink" message.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleGenerateAppForLink(const base::ListValue* args);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for the "recordAppLaunchByURL" message. Takes an escaped URL and a
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // launch source (integer), and if the URL represents an app, records the
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // action for UMA.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleRecordAppLaunchByUrl(const base::ListValue* args);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Callback for "stopShowingAppLauncherPromo" message.
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void StopShowingAppLauncherPromo(const base::ListValue* args);
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for "closeNotification" message.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleNotificationClose(const base::ListValue* args);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for "setNotificationsDisabled" message.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleSetNotificationsDisabled(const base::ListValue* args);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register app launcher preferences.
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static void RegisterUserPrefs(user_prefs::PrefRegistrySyncable* registry);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Records the given type of app launch for UMA.
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void RecordAppLaunchType(extension_misc::AppLaunchBucket bucket,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  extensions::Manifest::Type app_type);
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 if the |escaped_url| corresponds to an installed app.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RecordAppLaunchByUrl(Profile* profile,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   std::string escaped_url,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   extension_misc::AppLaunchBucket bucket);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Generates a temporary elevation for a managed user which is bound to the
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // life-time of the return value.
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static scoped_ptr<ScopedExtensionElevation> GetScopedElevation(
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& extension_id, ExtensionService* service);
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prompts the user to re-enable the app for |extension_id|.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PromptToEnableApp(const std::string& extension_id);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExtensionUninstallDialog::Delegate:
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ExtensionUninstallAccepted() OVERRIDE;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ExtensionUninstallCanceled() OVERRIDE;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ExtensionEnableFlowDelegate:
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ExtensionEnableFlowFinished() OVERRIDE;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ExtensionEnableFlowAborted(bool user_initiated) OVERRIDE;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the ExtensionUninstallDialog object for this class, creating it if
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // needed.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionUninstallDialog* GetExtensionUninstallDialog();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Continuation for installing a bookmark app after favicon lookup.
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnFaviconForApp(scoped_ptr<AppInstallInfo> install_info,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const history::FaviconImageResult& image_result);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends |highlight_app_id_| to the js.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetAppToBeHighlighted();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnExtensionPreferenceChanged();
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnLocalStatePreferenceChanged();
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The apps are represented in the extensions model, which
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // outlives us since it's owned by our containing profile.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionService* const extension_service_;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We monitor changes to the extension system so that we can reload the apps
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when necessary.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Monitor extension preference changes so that the Web UI can be notified.
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PrefChangeRegistrar extension_pref_change_registrar_;
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Monitor the local state pref to control the app launcher promo.
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PrefChangeRegistrar local_state_pref_change_registrar_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to show confirmation UI for uninstalling extensions in incognito mode.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionUninstallDialog> extension_uninstall_dialog_;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used to show confirmation UI for enabling extensions.
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ExtensionEnableFlow> extension_enable_flow_;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The ids of apps to show on the NTP.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> visible_apps_;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The id of the extension we are prompting the user about (either enable or
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // uninstall).
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string extension_id_prompting_;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When true, we ignore changes to the underlying data rather than immediately
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // refreshing. This is useful when making many batch updates to avoid flicker.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ignore_changes_;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When true, we have attempted to install a bookmark app, and are still
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // waiting to hear about success or failure from the extensions system.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool attempted_bookmark_app_install_;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if we have executed HandleGetApps() at least once.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_loaded_apps_;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The ID of the app to be highlighted on the NTP (i.e. shown on the page
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and pulsed). This is done for new installs. The actual higlighting occurs
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when the app is added to the page (via getAppsCallback or appAdded).
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string highlight_app_id_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used for favicon loading tasks.
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CancelableTaskTracker cancelable_task_tracker_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AppLauncherHandler);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_WEBUI_NTP_APP_LAUNCHER_HANDLER_H_
220