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