Commit 2083075a authored by Scott Chen's avatar Scott Chen Committed by Commit Bot

Extensions: modernize kiosk app handler code.

To allow new WebUI to use the KioskAppsHandler code, this CL converts all
the CallJavascriptUnsafe calls to either fire a WebUI event, or resolve
a specific Javascript promise.

Bug: 764943
Cq-Include-Trybots: master.tryserver.chromium.linux:closure_compilation
Change-Id: I04e0f81220251cfd3eaab3100b256f13b7f34430
Reviewed-on: https://chromium-review.googlesource.com/676092
Commit-Queue: Scott Chen <scottchen@chromium.org>
Reviewed-by: default avatarDemetrios Papadopoulos <dpapad@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#504746}
parent 4433c6f8
...@@ -19,11 +19,18 @@ cr.define('extensions', function() { ...@@ -19,11 +19,18 @@ cr.define('extensions', function() {
*/ */
clearErrorTimer_: null, clearErrorTimer_: null,
/** @private {WebUIListenerTracker} */
listenerTracker_: null,
/** /**
* Initialize the page. * Initialize the page.
*/ */
initialize: function() { initialize: function() {
chrome.send('initializeKioskAppSettings'); this.listenerTracker_ = new WebUIListenerTracker();
cr.sendWithPromise('initializeKioskAppSettings')
.then(KioskAppsOverlay.enableKiosk);
extensions.KioskAppList.decorate($('kiosk-app-list')); extensions.KioskAppList.decorate($('kiosk-app-list'));
var overlay = $('kiosk-apps-page'); var overlay = $('kiosk-apps-page');
...@@ -42,7 +49,14 @@ cr.define('extensions', function() { ...@@ -42,7 +49,14 @@ cr.define('extensions', function() {
* Invoked when the page is shown. * Invoked when the page is shown.
*/ */
didShowPage: function() { didShowPage: function() {
chrome.send('getKioskAppSettings'); this.listenerTracker_.add(
'kiosk-app-settings-changed', KioskAppsOverlay.setSettings);
this.listenerTracker_.add(
'kiosk-app-updated', KioskAppsOverlay.updateApp);
this.listenerTracker_.add('kiosk-app-error', KioskAppsOverlay.showError);
cr.sendWithPromise('getKioskAppSettings')
.then(KioskAppsOverlay.setSettings);
$('kiosk-app-id-edit').focus(); $('kiosk-app-id-edit').focus();
}, },
...@@ -95,6 +109,7 @@ cr.define('extensions', function() { ...@@ -95,6 +109,7 @@ cr.define('extensions', function() {
handleDismiss_: function() { handleDismiss_: function() {
this.handleAddButtonClick_(); this.handleAddButtonClick_();
extensions.ExtensionSettings.showOverlay(null); extensions.ExtensionSettings.showOverlay(null);
this.listenerTracker_.removeAll();
} }
}; };
......
...@@ -22,6 +22,9 @@ ...@@ -22,6 +22,9 @@
}, },
{ {
'target_name': 'extensions', 'target_name': 'extensions',
'dependencies': [
'<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:webui_listener_tracker',
],
'variables': { 'variables': {
'script_args': ['--custom_sources'], 'script_args': ['--custom_sources'],
'source_files': [ 'source_files': [
......
...@@ -48,6 +48,8 @@ ...@@ -48,6 +48,8 @@
</script> </script>
<script src="chrome://resources/js/cr/ui/list_item.js"></script> <script src="chrome://resources/js/cr/ui/list_item.js"></script>
<script src="chrome://resources/js/cr/ui/list.js"></script> <script src="chrome://resources/js/cr/ui/list.js"></script>
<script src="chrome://resources/js/promise_resolver.js"></script>
<script src="chrome://resources/js/webui_listener_tracker.js"></script>
</if> </if>
<script src="chrome://extensions/extensions.js"></script> <script src="chrome://extensions/extensions.js"></script>
......
...@@ -60,8 +60,8 @@ KioskAppSettingsWebUITest.prototype = { ...@@ -60,8 +60,8 @@ KioskAppSettingsWebUITest.prototype = {
'enableKioskAutoLaunch', 'enableKioskAutoLaunch',
'disableKioskAutoLaunch' 'disableKioskAutoLaunch'
]); ]);
this.mockHandler.stubs().getKioskAppSettings(). this.mockHandler.stubs().getKioskAppSettings(ANYTHING).will(
will(callFunction(function() { callFunction(function() {
extensions.KioskAppsOverlay.setSettings(this.settings_); extensions.KioskAppsOverlay.setSettings(this.settings_);
}.bind(this))); }.bind(this)));
this.mockHandler.stubs().addKioskApp(ANYTHING); this.mockHandler.stubs().addKioskApp(ANYTHING);
......
...@@ -111,11 +111,20 @@ KioskAppsHandler::KioskAppsHandler(OwnerSettingsServiceChromeOS* service) ...@@ -111,11 +111,20 @@ KioskAppsHandler::KioskAppsHandler(OwnerSettingsServiceChromeOS* service)
is_kiosk_enabled_(false), is_kiosk_enabled_(false),
is_auto_launch_enabled_(false), is_auto_launch_enabled_(false),
owner_settings_service_(service), owner_settings_service_(service),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {}
KioskAppsHandler::~KioskAppsHandler() {
// TODO(scottchen): This is needed because OnJavascriptDisallowed only called
// with refresh or off-page navigation, otherwise DCHECK triggered when
// exiting. Ask tommycli for more information.
kiosk_app_manager_->RemoveObserver(this);
}
void KioskAppsHandler::OnJavascriptAllowed() {
kiosk_app_manager_->AddObserver(this); kiosk_app_manager_->AddObserver(this);
} }
KioskAppsHandler::~KioskAppsHandler() { void KioskAppsHandler::OnJavascriptDisallowed() {
kiosk_app_manager_->RemoveObserver(this); kiosk_app_manager_->RemoveObserver(this);
} }
...@@ -208,6 +217,7 @@ void KioskAppsHandler::OnKioskExtensionDownloadFailed( ...@@ -208,6 +217,7 @@ void KioskAppsHandler::OnKioskExtensionDownloadFailed(
} }
void KioskAppsHandler::OnGetConsumerKioskAutoLaunchStatus( void KioskAppsHandler::OnGetConsumerKioskAutoLaunchStatus(
const std::string& callback_id,
chromeos::KioskAppManager::ConsumerKioskAutoLaunchStatus status) { chromeos::KioskAppManager::ConsumerKioskAutoLaunchStatus status) {
initialized_ = true; initialized_ = true;
if (KioskAppManager::IsConsumerKioskEnabled()) { if (KioskAppManager::IsConsumerKioskEnabled()) {
...@@ -228,23 +238,24 @@ void KioskAppsHandler::OnGetConsumerKioskAutoLaunchStatus( ...@@ -228,23 +238,24 @@ void KioskAppsHandler::OnGetConsumerKioskAutoLaunchStatus(
is_auto_launch_enabled_ = false; is_auto_launch_enabled_ = false;
} }
if (is_kiosk_enabled_) { base::DictionaryValue kiosk_params;
base::DictionaryValue kiosk_params; kiosk_params.SetBoolean("kioskEnabled", is_kiosk_enabled_);
kiosk_params.SetBoolean("kioskEnabled", is_kiosk_enabled_); kiosk_params.SetBoolean("autoLaunchEnabled", is_auto_launch_enabled_);
kiosk_params.SetBoolean("autoLaunchEnabled", is_auto_launch_enabled_); ResolveJavascriptCallback(base::Value(callback_id), kiosk_params);
web_ui()->CallJavascriptFunctionUnsafe(
"extensions.KioskAppsOverlay.enableKiosk", kiosk_params);
}
} }
void KioskAppsHandler::OnKioskAppsSettingsChanged() { void KioskAppsHandler::OnKioskAppsSettingsChanged() {
SendKioskAppSettings(); FireWebUIListener("kiosk-app-settings-changed", *GetSettingsDictionary());
} }
void KioskAppsHandler::SendKioskAppSettings() { std::unique_ptr<base::DictionaryValue>
if (!initialized_ || !is_kiosk_enabled_) KioskAppsHandler::GetSettingsDictionary() {
return; std::unique_ptr<base::DictionaryValue> settings(new base::DictionaryValue);
if (!initialized_ || !is_kiosk_enabled_) {
return settings;
}
bool enable_bailout_shortcut; bool enable_bailout_shortcut;
if (!CrosSettings::Get()->GetBoolean( if (!CrosSettings::Get()->GetBoolean(
...@@ -253,10 +264,9 @@ void KioskAppsHandler::SendKioskAppSettings() { ...@@ -253,10 +264,9 @@ void KioskAppsHandler::SendKioskAppSettings() {
enable_bailout_shortcut = true; enable_bailout_shortcut = true;
} }
base::DictionaryValue settings; settings->SetBoolean("disableBailout", !enable_bailout_shortcut);
settings.SetBoolean("disableBailout", !enable_bailout_shortcut); settings->SetBoolean("hasAutoLaunchApp",
settings.SetBoolean("hasAutoLaunchApp", !kiosk_app_manager_->GetAutoLaunchApp().empty());
!kiosk_app_manager_->GetAutoLaunchApp().empty());
KioskAppManager::Apps apps; KioskAppManager::Apps apps;
kiosk_app_manager_->GetApps(&apps); kiosk_app_manager_->GetApps(&apps);
...@@ -269,21 +279,29 @@ void KioskAppsHandler::SendKioskAppSettings() { ...@@ -269,21 +279,29 @@ void KioskAppsHandler::SendKioskAppSettings() {
PopulateAppDict(app_data, app_info.get()); PopulateAppDict(app_data, app_info.get());
apps_list->Append(std::move(app_info)); apps_list->Append(std::move(app_info));
} }
settings.SetWithoutPathExpansion("apps", std::move(apps_list)); settings->SetWithoutPathExpansion("apps", std::move(apps_list));
web_ui()->CallJavascriptFunctionUnsafe( return settings;
"extensions.KioskAppsOverlay.setSettings", settings);
} }
void KioskAppsHandler::HandleInitializeKioskAppSettings( void KioskAppsHandler::HandleInitializeKioskAppSettings(
const base::ListValue* args) { const base::ListValue* args) {
CHECK_EQ(1U, args->GetSize());
std::string callback_id;
CHECK(args->GetString(0, &callback_id));
AllowJavascript();
KioskAppManager::Get()->GetConsumerKioskAutoLaunchStatus( KioskAppManager::Get()->GetConsumerKioskAutoLaunchStatus(
base::Bind(&KioskAppsHandler::OnGetConsumerKioskAutoLaunchStatus, base::Bind(&KioskAppsHandler::OnGetConsumerKioskAutoLaunchStatus,
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr(), callback_id));
} }
void KioskAppsHandler::HandleGetKioskAppSettings(const base::ListValue* args) { void KioskAppsHandler::HandleGetKioskAppSettings(const base::ListValue* args) {
SendKioskAppSettings(); CHECK_EQ(1U, args->GetSize());
std::string callback_id;
CHECK(args->GetString(0, &callback_id));
ResolveJavascriptCallback(base::Value(callback_id), *GetSettingsDictionary());
} }
...@@ -359,15 +377,12 @@ void KioskAppsHandler::UpdateApp(const std::string& app_id) { ...@@ -359,15 +377,12 @@ void KioskAppsHandler::UpdateApp(const std::string& app_id) {
base::DictionaryValue app_dict; base::DictionaryValue app_dict;
PopulateAppDict(app_data, &app_dict); PopulateAppDict(app_data, &app_dict);
FireWebUIListener("kiosk-app-updated", app_dict);
web_ui()->CallJavascriptFunctionUnsafe(
"extensions.KioskAppsOverlay.updateApp", app_dict);
} }
void KioskAppsHandler::ShowError(const std::string& app_id) { void KioskAppsHandler::ShowError(const std::string& app_id) {
base::Value app_id_value(app_id); base::Value app_id_value(app_id);
web_ui()->CallJavascriptFunctionUnsafe( FireWebUIListener("kiosk-app-error", app_id_value);
"extensions.KioskAppsOverlay.showError", app_id_value);
kiosk_app_manager_->RemoveApp(app_id, owner_settings_service_); kiosk_app_manager_->RemoveApp(app_id, owner_settings_service_);
} }
......
...@@ -37,6 +37,8 @@ class KioskAppsHandler : public content::WebUIMessageHandler, ...@@ -37,6 +37,8 @@ class KioskAppsHandler : public content::WebUIMessageHandler,
// content::WebUIMessageHandler overrides: // content::WebUIMessageHandler overrides:
void RegisterMessages() override; void RegisterMessages() override;
void OnJavascriptAllowed() override;
void OnJavascriptDisallowed() override;
// KioskAppManagerObserver overrides: // KioskAppManagerObserver overrides:
void OnKioskAppDataChanged(const std::string& app_id) override; void OnKioskAppDataChanged(const std::string& app_id) override;
...@@ -47,8 +49,8 @@ class KioskAppsHandler : public content::WebUIMessageHandler, ...@@ -47,8 +49,8 @@ class KioskAppsHandler : public content::WebUIMessageHandler,
void OnKioskAppsSettingsChanged() override; void OnKioskAppsSettingsChanged() override;
private: private:
// Sends all kiosk apps and settings to webui. // Get all kiosk apps and settings.
void SendKioskAppSettings(); std::unique_ptr<base::DictionaryValue> GetSettingsDictionary();
// JS callbacks. // JS callbacks.
void HandleInitializeKioskAppSettings(const base::ListValue* args); void HandleInitializeKioskAppSettings(const base::ListValue* args);
...@@ -64,6 +66,7 @@ class KioskAppsHandler : public content::WebUIMessageHandler, ...@@ -64,6 +66,7 @@ class KioskAppsHandler : public content::WebUIMessageHandler,
// Callback for KioskAppManager::GetConsumerKioskModeStatus(). // Callback for KioskAppManager::GetConsumerKioskModeStatus().
void OnGetConsumerKioskAutoLaunchStatus( void OnGetConsumerKioskAutoLaunchStatus(
const std::string& callback_id,
chromeos::KioskAppManager::ConsumerKioskAutoLaunchStatus status); chromeos::KioskAppManager::ConsumerKioskAutoLaunchStatus status);
KioskAppManager* kiosk_app_manager_; // not owned. KioskAppManager* kiosk_app_manager_; // not owned.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment