12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/command_line.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/strings/string_util.h"
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/chromium_strings.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/chromeos_switches.h"
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/settings/cros_settings_names.h"
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/crx_file/id_util.h"
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_ui.h"
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/web_ui_data_source.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/extension_urls.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/webui/web_ui_util.h"
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Populates app info dictionary with |app_data|.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PopulateAppDict(const KioskAppManager::App& app_data,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::DictionaryValue* app_dict) {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string icon_url("chrome://theme/IDR_APP_DEFAULT_ICON");
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(xiyuan): Replace data url with a URLDataSource.
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!app_data.icon.isNull())
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    icon_url = webui::GetBitmapDataUrl(*app_data.icon.bitmap());
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The items which are to be written into app_dict are also described in
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // chrome/browser/resources/extensions/chromeos/kiosk_app_list.js in @typedef
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // for AppDict. Please update it whenever you add or remove any keys here.
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  app_dict->SetString("id", app_data.app_id);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_dict->SetString("name", app_data.name);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_dict->SetString("iconURL", icon_url);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_dict->SetBoolean(
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "autoLaunch",
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      KioskAppManager::Get()->GetAutoLaunchApp() == app_data.app_id &&
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      (KioskAppManager::Get()->IsAutoLaunchEnabled() ||
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          KioskAppManager::Get()->IsAutoLaunchRequested()));
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_dict->SetBoolean("isLoading", app_data.is_loading);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Sanitize app id input value and extracts app id out of it.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns false if an app id could not be derived out of the input.
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ExtractsAppIdFromInput(const std::string& input,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            std::string* app_id) {
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (crx_file::id_util::IdIsValid(input)) {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *app_id = input;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL webstore_url = GURL(input);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!webstore_url.is_valid())
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL webstore_base_url =
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL(extension_urls::GetWebstoreItemDetailURLPrefix());
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (webstore_url.scheme() != webstore_base_url.scheme() ||
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      webstore_url.host() != webstore_base_url.host() ||
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !StartsWithASCII(
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          webstore_url.path(), webstore_base_url.path(), true)) {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string path = webstore_url.path();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const size_t last_slash = path.rfind('/');
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (last_slash == std::string::npos)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string candidate_id = path.substr(last_slash + 1);
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!crx_file::id_util::IdIsValid(candidate_id))
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *app_id = candidate_id;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)KioskAppsHandler::KioskAppsHandler()
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : kiosk_app_manager_(KioskAppManager::Get()),
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      initialized_(false),
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      is_kiosk_enabled_(false),
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      is_auto_launch_enabled_(false),
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      weak_ptr_factory_(this) {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kiosk_app_manager_->AddObserver(this);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)KioskAppsHandler::~KioskAppsHandler() {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kiosk_app_manager_->RemoveObserver(this);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppsHandler::RegisterMessages() {
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  web_ui()->RegisterMessageCallback("initializeKioskAppSettings",
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&KioskAppsHandler::HandleInitializeKioskAppSettings,
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 base::Unretained(this)));
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getKioskAppSettings",
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::Bind(&KioskAppsHandler::HandleGetKioskAppSettings,
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback("addKioskApp",
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&KioskAppsHandler::HandleAddKioskApp,
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback("removeKioskApp",
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&KioskAppsHandler::HandleRemoveKioskApp,
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback("enableKioskAutoLaunch",
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&KioskAppsHandler::HandleEnableKioskAutoLaunch,
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback("disableKioskAutoLaunch",
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&KioskAppsHandler::HandleDisableKioskAutoLaunch,
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  web_ui()->RegisterMessageCallback("setDisableBailoutShortcut",
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::Bind(&KioskAppsHandler::HandleSetDisableBailoutShortcut,
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 base::Unretained(this)));
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void KioskAppsHandler::GetLocalizedValues(content::WebUIDataSource* source) {
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  source->AddString(
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "addKioskAppButton",
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSIONS_ADD_KIOSK_APP_BUTTON));
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  source->AddString(
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "kioskOverlayTitle",
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_OPTIONS_KIOSK_OVERLAY_TITLE));
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  source->AddString(
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "addKioskApp",
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_OPTIONS_KIOSK_ADD_APP));
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  source->AddString(
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "kioskAppIdEditHint",
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_OPTIONS_KIOSK_ADD_APP_HINT));
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  source->AddString(
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "enableAutoLaunchButton",
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_OPTIONS_KIOSK_ENABLE_AUTO_LAUNCH));
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  source->AddString(
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "disableAutoLaunchButton",
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_OPTIONS_KIOSK_DISABLE_AUTO_LAUNCH));
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  source->AddString(
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "autoLaunch",
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_OPTIONS_KIOSK_AUTO_LAUNCH));
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  source->AddString(
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "invalidApp",
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_OPTIONS_KIOSK_INVALID_APP));
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  source->AddString(
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "kioskDiableBailoutShortcutLabel",
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      l10n_util::GetStringUTF16(
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          IDS_OPTIONS_KIOSK_DISABLE_BAILOUT_SHORTCUT_LABEL));
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  source->AddString(
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "kioskDisableBailoutShortcutWarningBold",
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      l10n_util::GetStringUTF16(
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          IDS_OPTIONS_KIOSK_DISABLE_BAILOUT_SHORTCUT_WARNING_BOLD));
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 product_os_name =
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_OS_NAME);
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  source->AddString(
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "kioskDisableBailoutShortcutWarning",
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      l10n_util::GetStringFUTF16(
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          IDS_OPTIONS_KIOSK_DISABLE_BAILOUT_SHORTCUT_WARNING_FORMAT,
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          product_os_name));
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  source->AddString(
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "kioskDisableBailoutShortcutConfirm",
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CONFIRM_MESSAGEBOX_YES_BUTTON_LABEL));
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  source->AddString(
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "kioskDisableBailoutShortcutCancel",
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CONFIRM_MESSAGEBOX_NO_BUTTON_LABEL));
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  source->AddString("done", l10n_util::GetStringUTF16(IDS_DONE));
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  source->AddString("add", l10n_util::GetStringUTF16(IDS_ADD));
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppsHandler::OnKioskAppDataChanged(const std::string& app_id) {
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  UpdateApp(app_id);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppsHandler::OnKioskAppDataLoadFailure(const std::string& app_id) {
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ShowError(app_id);
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KioskAppsHandler::OnKioskExtensionLoadedInCache(
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& app_id) {
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  UpdateApp(app_id);
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KioskAppsHandler::OnKioskExtensionDownloadFailed(
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& app_id) {
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ShowError(app_id);
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void KioskAppsHandler::OnGetConsumerKioskAutoLaunchStatus(
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    chromeos::KioskAppManager::ConsumerKioskAutoLaunchStatus status) {
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  initialized_ = true;
2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  is_kiosk_enabled_ = user_manager::UserManager::Get()->IsCurrentUserOwner() ||
2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                      !base::SysInfo::IsRunningOnChromeOS();
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  is_auto_launch_enabled_ =
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      status == KioskAppManager::CONSUMER_KIOSK_AUTO_LAUNCH_ENABLED ||
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      !base::SysInfo::IsRunningOnChromeOS();
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (is_kiosk_enabled_) {
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue kiosk_params;
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    kiosk_params.SetBoolean("kioskEnabled", is_kiosk_enabled_);
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    kiosk_params.SetBoolean("autoLaunchEnabled", is_auto_launch_enabled_);
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    web_ui()->CallJavascriptFunction("extensions.KioskAppsOverlay.enableKiosk",
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     kiosk_params);
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void KioskAppsHandler::OnKioskAppsSettingsChanged() {
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendKioskAppSettings();
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void KioskAppsHandler::SendKioskAppSettings() {
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!initialized_ || !is_kiosk_enabled_)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool enable_bailout_shortcut;
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!CrosSettings::Get()->GetBoolean(
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled,
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          &enable_bailout_shortcut)) {
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    enable_bailout_shortcut = true;
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::DictionaryValue settings;
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  settings.SetBoolean("disableBailout", !enable_bailout_shortcut);
239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  settings.SetBoolean("hasAutoLaunchApp",
240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      !kiosk_app_manager_->GetAutoLaunchApp().empty());
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KioskAppManager::Apps apps;
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kiosk_app_manager_->GetApps(&apps);
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<base::ListValue> apps_list(new base::ListValue);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < apps.size(); ++i) {
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const KioskAppManager::App& app_data = apps[i];
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<base::DictionaryValue> app_info(new base::DictionaryValue);
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PopulateAppDict(app_data, app_info.get());
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    apps_list->Append(app_info.release());
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  settings.SetWithoutPathExpansion("apps", apps_list.release());
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  web_ui()->CallJavascriptFunction("extensions.KioskAppsOverlay.setSettings",
256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                   settings);
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void KioskAppsHandler::HandleInitializeKioskAppSettings(
2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const base::ListValue* args) {
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  KioskAppManager::Get()->GetConsumerKioskAutoLaunchStatus(
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&KioskAppsHandler::OnGetConsumerKioskAutoLaunchStatus,
2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void KioskAppsHandler::HandleGetKioskAppSettings(const base::ListValue* args) {
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SendKioskAppSettings();
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppsHandler::HandleAddKioskApp(const base::ListValue* args) {
2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!initialized_ || !is_kiosk_enabled_)
2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string input;
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(args->GetString(0, &input));
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string app_id;
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ExtractsAppIdFromInput(input, &app_id)) {
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnKioskAppDataLoadFailure(input);
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kiosk_app_manager_->AddApp(app_id);
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppsHandler::HandleRemoveKioskApp(const base::ListValue* args) {
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!initialized_ || !is_kiosk_enabled_)
2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string app_id;
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(args->GetString(0, &app_id));
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kiosk_app_manager_->RemoveApp(app_id);
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppsHandler::HandleEnableKioskAutoLaunch(
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::ListValue* args) {
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!initialized_ || !is_kiosk_enabled_ || !is_auto_launch_enabled_)
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string app_id;
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(args->GetString(0, &app_id));
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kiosk_app_manager_->SetAutoLaunchApp(app_id);
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KioskAppsHandler::HandleDisableKioskAutoLaunch(
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::ListValue* args) {
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!initialized_ || !is_kiosk_enabled_ || !is_auto_launch_enabled_)
3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string app_id;
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(args->GetString(0, &app_id));
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string startup_app_id = kiosk_app_manager_->GetAutoLaunchApp();
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (startup_app_id != app_id)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kiosk_app_manager_->SetAutoLaunchApp("");
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void KioskAppsHandler::HandleSetDisableBailoutShortcut(
324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const base::ListValue* args) {
3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!initialized_ || !is_kiosk_enabled_)
3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool disable_bailout_shortcut;
329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CHECK(args->GetBoolean(0, &disable_bailout_shortcut));
330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CrosSettings::Get()->SetBoolean(
332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      kAccountsPrefDeviceLocalAccountAutoLoginBailoutEnabled,
333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      !disable_bailout_shortcut);
334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KioskAppsHandler::UpdateApp(const std::string& app_id) {
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  KioskAppManager::App app_data;
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!kiosk_app_manager_->GetApp(app_id, &app_data))
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::DictionaryValue app_dict;
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PopulateAppDict(app_data, &app_dict);
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  web_ui()->CallJavascriptFunction("extensions.KioskAppsOverlay.updateApp",
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   app_dict);
346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
348116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KioskAppsHandler::ShowError(const std::string& app_id) {
349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::StringValue app_id_value(app_id);
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  web_ui()->CallJavascriptFunction("extensions.KioskAppsOverlay.showError",
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   app_id_value);
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  kiosk_app_manager_->RemoveApp(app_id);
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
357