Commit 5c2dad54 authored by Steven Bennetts's avatar Steven Bennetts Committed by Commit Bot

Update network_ui in preparation for Polymer3

This CL:
* Converts network_ui.html/js to a Polymer element
* Introduces a browser proxy for chrome.send / cr.sendWithPromise calls
* Replaces chrome.send + listeners with cr.sendWithPromise
* Replaces cr tabpanels with cr-tabs + iron-pages.

Bug: 921726
Change-Id: Ib140fc17de7b000205709dfee619b848c56448a7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2265503Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Reviewed-by: default avatarKyle Horimoto <khorimoto@chromium.org>
Commit-Queue: Steven Bennetts <stevenjb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#782594}
parent 3e90d072
......@@ -332,6 +332,9 @@
<include name="IDR_IDENTITY_INTERNALS_JS" file="resources\identity_internals\identity_internals.js" type="BINDATA" />
</if>
<if expr="chromeos">
<include name="IDR_NETWORK_UI_PAGE_HTML" file="resources\chromeos\network_ui\network.html" type="BINDATA" />
<include name="IDR_NETWORK_UI_BROWSER_PROXY_HTML" file="resources\chromeos\network_ui\network_ui_browser_proxy.html" type="BINDATA" />
<include name="IDR_NETWORK_UI_BROWSER_PROXY_JS" file="resources\chromeos\network_ui\network_ui_browser_proxy.js" type="BINDATA" />
<include name="IDR_NETWORK_UI_HTML" file="resources\chromeos\network_ui\network_ui.html" type="BINDATA" />
<include name="IDR_NETWORK_UI_JS" file="resources\chromeos\network_ui\network_ui.js" type="BINDATA" />
<include name="IDR_NETWORK_STATE_UI_HTML" file="resources\chromeos\network_ui\network_state_ui.html" type="BINDATA" />
......
......@@ -9,26 +9,29 @@ js_type_check("closure_compile") {
":network_logs_ui",
":network_state_ui",
":network_ui",
":network_ui_browser_proxy",
]
}
js_library("network_ui") {
deps = [
":network_state_ui",
":network_ui_browser_proxy",
"//ui/webui/resources/cr_components/chromeos/network:onc_mojo",
"//ui/webui/resources/js:i18n_behavior",
"//ui/webui/resources/js:load_time_data",
"//ui/webui/resources/js:util",
"//ui/webui/resources/js/cr:ui",
"//ui/webui/resources/js/cr/ui:tabs",
]
}
js_library("network_logs_ui") {
deps = [ "//ui/webui/resources/js:i18n_behavior" ]
deps = [
":network_ui_browser_proxy",
"//ui/webui/resources/js:i18n_behavior",
]
}
js_library("network_state_ui") {
deps = [
":network_ui_browser_proxy",
"//chromeos/services/network_config/public/mojom:mojom_js_library_for_compile",
"//ui/webui/resources/cr_components/chromeos/network:mojo_interface_provider",
"//ui/webui/resources/cr_components/chromeos/network:network_icon",
......@@ -38,3 +41,7 @@ js_library("network_state_ui") {
externs_list = chrome_extension_public_externs +
[ "$externs_path/networking_private.js" ]
}
js_library("network_ui_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr" ]
}
<!doctype html>
<html dir="$i18n{textdirection}" lang="$i18n{language}">
<head>
<meta charset="utf-8">
<title>$i18n{titleText}</title>
<link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
<link rel="import" href="network_ui.html">
<script src="chrome://resources/js/cr.js"></script>
<script src="chrome://resources/js/load_time_data.js"></script>
<script src="strings.js"></script>
</head>
<body>
<network-ui></network-ui>
</body>
</html>
......@@ -6,6 +6,7 @@
<link rel="import" href="chrome://resources/cr_elements/cr_radio_group/cr_radio_group.html">
<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html">
<link rel="import" href="chrome://resources/html/i18n_behavior.html">
<link rel="import" href="network_ui_browser_proxy.html">
<dom-module id="network-logs-ui">
<template>
......
......@@ -70,6 +70,9 @@ Polymer({
observers: ['onShillDebuggingChanged_(shillDebugging_)'],
/** @type {!network_ui.NetworkUIBrowserProxy} */
browserProxy_: network_ui.NetworkUIBrowserProxyImpl.getInstance(),
/** @override */
attached() {},
......@@ -83,7 +86,7 @@ Polymer({
const shillDebugging = this.shillDebugging_;
if (!shillDebugging || shillDebugging == 'unknown')
return;
cr.sendWithPromise('setShillDebugging', shillDebugging).then((response) => {
this.browserProxy_.setShillDebugging(shillDebugging).then((response) => {
/*const result =*/ response.shift();
const isError = response.shift();
if (isError) {
......@@ -103,7 +106,7 @@ Polymer({
};
this.$.storeResult.innerText = this.i18n('networkLogsStatus');
this.$.storeResult.classList.toggle('error', false);
cr.sendWithPromise('storeLogs', options).then((response) => {
this.browserProxy_.storeLogs(options).then((response) => {
const result = response.shift();
const isError = response.shift();
this.$.storeResult.innerText = result;
......
<link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="chrome://resources/cr_components/chromeos/network/mojo_interface_provider.html">
<link rel="import" href="chrome://resources/cr_components/chromeos/network/network_icon.html">
<link rel="import" href="chrome://resources/cr_components/chromeos/network/network_listener_behavior.html">
<link rel="import" href="chrome://resources/cr_components/chromeos/network/onc_mojo.html">
<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html">
<link rel="import" href="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.html">
<link rel="import" href="chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom.html">
<link rel="import" href="network_ui_browser_proxy.html">
<dom-module id="network-state-ui">
<template>
......@@ -57,7 +58,7 @@
<div>
<cr-button class="action-button" id="refresh"
on-click="requestNetworks">
on-click="requestNetworks_">
$i18n{networkRefreshText}
</cr-button>
</div>
......@@ -67,7 +68,7 @@
<div>$i18n{clickToExpandText}</div>
<div>
<span>$i18n{propertyFormatText}</span>
<select id="get-property-format" on-change="requestNetworks">
<select id="get-property-format" on-change="requestNetworks_">
<option value="normal">$i18n{normalFormatOption}</option>
<option value="managed">$i18n{managedFormatOption}</option>
<option value="state">$i18n{stateFormatOption}</option>
......
<!doctype html>
<html dir="$i18n{textdirection}" lang="$i18n{language}">
<head>
<meta charset="utf-8">
<title>$i18n{titleText}</title>
<link rel="stylesheet" href="chrome://resources/css/tabs.css">
<link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
<link rel="import" href="chrome://resources/cr_components/chromeos/network/network_icon.html">
<link rel="import" href="chrome://resources/cr_components/chromeos/network/network_select.html">
<link rel="import" href="chrome://resources/cr_components/chromeos/network_health/network_health_summary.html">
<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
<link rel="import" href="network_state_ui.html">
<link rel="import" href="network_logs_ui.html">
<script src="chrome://resources/js/cr.js"></script>
<script src="chrome://resources/js/cr/ui.js"></script>
<script src="chrome://resources/js/cr/ui/tabs.js"></script>
<script src="chrome://resources/js/load_time_data.js"></script>
<script src="chrome://resources/js/util.js"></script>
<script src="chrome://network/strings.js"></script>
<style>
tabpanel > div {
margin-bottom: 10px;
}
#global-policy {
white-space: pre-wrap;
}
#select-div {
display: flex;
height: 400px;
width: 500px;
}
#onc-import-result {
margin: 10px 0
}
network-select {
flex: 1;
}
.error {
color: red;
}
</style>
</head>
<link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="chrome://resources/cr_components/chromeos/network/network_select.html">
<link rel="import" href="chrome://resources/cr_components/chromeos/network/onc_mojo.html">
<link rel="import" href="chrome://resources/cr_components/chromeos/network_health/network_health_summary.html">
<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
<link rel="import" href="chrome://resources/cr_elements/cr_tabs/cr_tabs.html">
<link rel="import" href="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.html">
<link rel="import" href="chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-pages/iron-pages.html">
<link rel="import" href="network_ui_browser_proxy.html">
<link rel="import" href="network_state_ui.html">
<link rel="import" href="network_logs_ui.html">
<dom-module id="network-ui">
<template>
<style>
.tabpanel > div {
margin-bottom: 10px;
}
#global-policy {
white-space: pre-wrap;
}
#select-div {
display: flex;
height: 400px;
width: 500px;
}
#onc-import-result {
margin: 10px 0
}
iron-pages {
flex: 1;
position: relative;
}
network-select {
flex: 1;
}
.error {
color: red;
}
</style>
<cr-tabs selected="{{selectedTab_}}" tab-names="[[tabNames_]]">
</cr-tabs>
<iron-pages selected="[[selectedTab_]]">
<div class="tabpanel" id="general">
<h2>$i18n{titleText}</h2>
<div>
<h2>$i18n{globalPolicyLabel}</h2>
<div id="global-policy"></div>
</div>
<body>
<div>
<h2>$i18n{cellularActivationLabel}</h2>
<cr-button class="action-button" id="cellular-activation-button"
on-click="openCellularActivationUi_">
$i18n{cellularActivationButtonText}
</cr-button>
<div id="cellular-error-text" class="error" hidden>
$i18n{noCellularErrorText}
</div>
</div>
<tabbox id="network-ui">
<tabs>
<tab>$i18n{generalTab}</tab>
<tab>$i18n{networkHealthTab}</tab>
<tab>$i18n{networkLogsTab}</tab>
<tab>$i18n{networkStateTab}</tab>
<tab>$i18n{networkSelectTab}</tab>
</tabs>
<tabpanels>
<tabpanel id="general">
<h2>$i18n{titleText}</h2>
<div>
<h2>$i18n{globalPolicyLabel}</h2>
<div id="global-policy"></div>
</div>
<div>
<h2>$i18n{addNewWifiLabel}</h2>
<cr-button class="action-button" id="add-new-wifi-button"
on-click="showAddNewWifi_">
$i18n{addNewWifiButtonText}
</cr-button>
</div>
<div>
<h2>$i18n{cellularActivationLabel}</h2>
<cr-button class="action-button" id="cellular-activation-button">
$i18n{cellularActivationButtonText}
</cr-button>
<div id="cellular-error-text" class="error" hidden>
$i18n{noCellularErrorText}
<div>
<h2>$i18n{importOncButtonText}</h2>
<input type="file" id="import-onc" on-change="onImportOncChange_">
<div id="onc-import-result"></div>
</div>
</div>
<div>
<h2>$i18n{addNewWifiLabel}</h2>
<cr-button class="action-button" id="add-new-wifi-button">
$i18n{addNewWifiButtonText}
</cr-button>
<div class="tabpanel" id="health">
<h2>$i18n{networkHealthLabel}</h2>
<network-health-summary></network-health-summary>
</div>
<div>
<h2>$i18n{importOncButtonText}</h2>
<input type="file" id="import-onc">
<div id="onc-import-result"></div>
<div class="tabpanel" id="logs">
<network-logs-ui></network-logs-ui>
</div>
</tabpanel>
<tabpanel id="health">
<h2>$i18n{networkHealthLabel}</h2>
<network-health-summary></network-health-summary>
</tabpanel>
<tabpanel id="logs">
<network-logs-ui></network-logs-ui>
</tabpanel>
<tabpanel id="state">
<network-state-ui></network-state-ui>
</tabpanel>
<tabpanel id="select">
<div id="select-div">
<network-select></network-select>
<div class="tabpanel" id="state">
<network-state-ui></network-state-ui>
</div>
</tabpanel>
</tabpanels>
</tabbox>
<script src="network_ui.js"></script>
</body>
</html>
<div class="tabpanel" id="select">
<div id="select-div">
<network-select
on-network-item-selected="onNetworkItemSelected_"
on-custom-item-selected="onCustomItemSelected_">
</network-select>
</div>
</div>
</iron-pages>
</template>
<script src="network_ui.js"></script>
</dom-module>
// Copyright 2013 The Chromium Authors. All rights reserved.
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview Builds UI elements shown in chrome://networks debugging page.
* @fileoverview
* Polymer element network debugging UI.
*/
/**
* @typedef {!OncMojo.DeviceStateProperties|!OncMojo.NetworkStateProperties}
*/
OncMojo.StateProperties;
cr.define('network_ui', function() {
'use strict';
Polymer({
is: 'network-ui',
behaviors: [I18nBehavior],
properties: {
/**
* Names of the top level page tabs.
* @type {!Array<String>}
* @private
*/
tabNames_: {
type: Array,
value: function() {
return [
this.i18n('generalTab'),
this.i18n('networkHealthTab'),
this.i18n('networkLogsTab'),
this.i18n('networkStateTab'),
this.i18n('networkSelectTab'),
];
},
},
/**
* Index of the selected top level page tab.
* @private
*/
selectedTab_: {
type: Number,
value: 0,
},
},
/** @type {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
let networkConfig = null;
networkConfig_: null,
/**
* Callback invoked by Chrome after a openCellularActivationUi call.
* @param {boolean} didOpenActivationUi Whether the activation UI was actually
* opened. If this value is false, it means that no cellular network was
* available to be activated.
*/
const openCellularActivationUiResult = function(didOpenActivationUi) {
$('cellular-error-text').hidden = didOpenActivationUi;
};
/** @type {!network_ui.NetworkUIBrowserProxy} */
browserProxy_: network_ui.NetworkUIBrowserProxyImpl.getInstance(),
/**
* Requests that the cellular activation UI be displayed.
*/
const openCellularActivationUi = function() {
chrome.send('openCellularActivationUi');
};
/** @override */
attached() {
this.networkConfig_ =
chromeos.networkConfig.mojom.CrosNetworkConfig.getRemote();
/**
* Requests that the "add Wi-Fi network" UI be displayed.
*/
const showAddNewWifi = function() {
chrome.send('showAddNewWifi');
};
const select = this.$$('network-select');
select.customItems = [
{
customItemName: 'addWiFiListItemName',
polymerIcon: 'cr:add',
customData: 'WiFi'
},
];
this.$$('#import-onc').value = '';
this.requestGlobalPolicy_();
},
/** @private */
openCellularActivationUi_() {
this.browserProxy_.openCellularActivationUi().then((response) => {
const didOpenActivationUi = response.shift();
this.$$('#cellular-error-text').hidden = didOpenActivationUi;
});
},
/** @private */
showAddNewWifi_() {
this.browserProxy_.showAddNewWifi();
},
/**
* Handles the ONC file input change event.
* @param {!Event} event
* @private
*/
const onImportOncChange = function(event) {
onImportOncChange_(event) {
const file = event.target.files[0];
event.stopPropagation();
if (!file)
return;
const reader = new FileReader();
reader.onloadend = function(e) {
reader.onloadend = (e) => {
const content = reader.result;
if (!content) {
if (!content || typeof (content) != 'string') {
console.error('File not read' + file);
return;
}
cr.sendWithPromise('importONC', content).then(importONCResponse);
this.browserProxy_.importONC(content).then((response) => {
this.importONCResponse_(response);
});
};
reader.readAsText(file);
};
},
/**
* Handles the chrome 'importONC' response.
* @param {Array} args
* @private
*/
const importONCResponse = function(args) {
importONCResponse_(args) {
const result = args.shift();
const isError = args.shift();
$('onc-import-result').innerText = result;
if (isError) {
$('onc-import-result').classList.add('error');
} else {
$('onc-import-result').classList.remove('error');
}
$('import-onc').value = '';
};
const resultDiv = this.$$('#onc-import-result');
resultDiv.innerText = result;
resultDiv.classList.toggle('error', isError);
this.$$('#import-onc').value = '';
},
/**
* Requests the global policy dictionary and updates the page.
* @private
*/
const requestGlobalPolicy = function() {
networkConfig.getGlobalPolicy().then(result => {
document.querySelector('#global-policy').textContent =
requestGlobalPolicy_() {
this.networkConfig_.getGlobalPolicy().then(result => {
this.$$('#global-policy').textContent =
JSON.stringify(result.result, null, '\t');
});
};
/** Initialize NetworkUI state. */
const init = function() {
networkConfig = network_config.MojoInterfaceProviderImpl.getInstance()
.getMojoServiceRemote();
};
},
/**
* Handles clicks on network items in the <network-select> element by
* attempting a connection to the selected network or requesting a password
* if the network requires a password.
* @param {!Event<!OncMojo.NetworkStateProperties>} event
* @private
*/
const onNetworkItemSelected = function(event) {
onNetworkItemSelected_(event) {
const networkState = event.detail;
// If the network is already connected, show network details.
if (OncMojo.connectionStateIsConnected(networkState.connectionState)) {
chrome.send('showNetworkDetails', [networkState.guid]);
this.browserProxy_.showNetworkDetails(networkState.guid);
return;
}
// If the network is not connectable, show a configuration dialog.
if (networkState.connectable === false || networkState.errorState) {
chrome.send('showNetworkConfig', [networkState.guid]);
this.browserProxy_.showNetworkConfig(networkState.guid);
return;
}
// Otherwise, connect.
networkConfig.startConnect(networkState.guid).then(response => {
this.networkConfig_.startConnect(networkState.guid).then(response => {
if (response.result ==
chromeos.networkConfig.mojom.StartConnectResult.kSuccess) {
return;
......@@ -124,65 +159,15 @@ cr.define('network_ui', function() {
console.error(
'startConnect error for: ' + networkState.guid + ' Result: ' +
response.result.toString() + ' Message: ' + response.message);
chrome.send('showNetworkConfig', [networkState.guid]);
});
};
const selectTabFromHash = function() {
const selectedTab = window.location.hash.substring(1);
if (!selectedTab)
return;
const tabpanel = document.querySelector('tabpanels > #' + selectedTab);
if (tabpanel) {
tabpanel.selected = true;
}
};
const getShillNetworkPropertiesResult = function(args) {
document.querySelector('network-state-ui')
.getShillNetworkPropertiesResult(args);
};
const getShillDevicePropertiesResult = function(args) {
document.querySelector('network-state-ui')
.getShillDevicePropertiesResult(args);
};
const getShillEthernetEAPResult = function(args) {
document.querySelector('network-state-ui').getShillEthernetEAPResult(args);
};
function onLoad() {
cr.ui.decorate('tabbox', cr.ui.TabBox);
const select = document.querySelector('network-select');
select.customItems = [
{customItemName: 'Add WiFi', polymerIcon: 'cr:add', customData: 'WiFi'},
{customItemName: 'Add VPN', polymerIcon: 'cr:add', customData: 'VPN'}
];
select.addEventListener('network-item-selected', onNetworkItemSelected);
$('cellular-activation-button').onclick = openCellularActivationUi;
$('add-new-wifi-button').onclick = showAddNewWifi;
$('import-onc').value = '';
$('import-onc').addEventListener('change', onImportOncChange);
document.addEventListener('custom-item-selected', function(event) {
chrome.send('addNetwork', [event.detail.customData]);
this.browserProxy_.showNetworkConfig(networkState.guid);
});
},
window.addEventListener('hashchange', function(event) {
selectTabFromHash();
});
selectTabFromHash();
init();
requestGlobalPolicy();
}
return {
getShillNetworkPropertiesResult: getShillNetworkPropertiesResult,
getShillDevicePropertiesResult: getShillDevicePropertiesResult,
getShillEthernetEAPResult: getShillEthernetEAPResult,
openCellularActivationUiResult: openCellularActivationUiResult,
onLoad: onLoad,
};
/**
* @param {!Event<!{detail:{customData: string}}>} event
* @private
*/
onCustomItemSelected_(event) {
this.browserProxy_.addNetwork(event.detail.customData);
},
});
document.addEventListener('DOMContentLoaded', network_ui.onLoad);
<link rel="import" href="chrome://resources/html/cr.html">
<script src="network_ui_browser_proxy.js"></script>
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
cr.define('network_ui', function() {
/** @interface */
/* #export */ class NetworkUIBrowserProxy {
/** @param {string} type */
addNetwork(type) {}
/**
* @param {string} type
* @return {Promise<!Array>}
*/
getShillDeviceProperties(type) {}
/**
* @return {Promise<!Array>}
*/
getShillEthernetEAP() {}
/**
* @param {string} guid
* @return {Promise<!Array>}
*/
getShillNetworkProperties(guid) {}
/**
* @param {string} content
* @return {Promise<!Array>}
*/
importONC(content) {}
/**
* @return {Promise<!Array>}
*/
openCellularActivationUi() {}
/**
* @param {string} debugging
* @return {Promise<!Array>}
*/
setShillDebugging(debugging) {}
showAddNewWifi() {}
/** @param {string} guid */
showNetworkConfig(guid) {}
/** @param {string} guid */
showNetworkDetails(guid) {}
/**
* @param {Object<string>} options
* @return {Promise<!Array>}
*/
storeLogs(options) {}
}
/**
* @implements {network_ui.NetworkUIBrowserProxy}
*/
/* #export */ class NetworkUIBrowserProxyImpl {
/** @override */
addNetwork(type) {
chrome.send('addNetwork', [type]);
}
/** @override */
getShillDeviceProperties(type) {
return cr.sendWithPromise('getShillDeviceProperties', type);
}
/** @override */
getShillEthernetEAP() {
return cr.sendWithPromise('getShillEthernetEAP');
}
/** @override */
getShillNetworkProperties(guid) {
return cr.sendWithPromise('getShillNetworkProperties', guid);
}
/** @override */
importONC(content) {
return cr.sendWithPromise('importONC', content);
}
/** @override */
openCellularActivationUi() {
return cr.sendWithPromise('openCellularActivationUi');
}
/** @override */
setShillDebugging(debugging) {
return cr.sendWithPromise('setShillDebugging', debugging);
}
/** @override */
showAddNewWifi() {
chrome.send('showAddNewWifi');
}
/** @override */
showNetworkConfig(guid) {
chrome.send('showNetworkConfig', [guid]);
}
/** @override */
showNetworkDetails(guid) {
chrome.send('showNetworkDetails', [guid]);
}
/** @override */
storeLogs(options) {
return cr.sendWithPromise('storeLogs', options);
}
}
cr.addSingletonGetter(NetworkUIBrowserProxyImpl);
// #cr_define_end
return {
NetworkUIBrowserProxy: NetworkUIBrowserProxy,
NetworkUIBrowserProxyImpl: NetworkUIBrowserProxyImpl
};
});
......@@ -197,7 +197,7 @@ void NetworkLogsMessageHandler::OnSetShillDebugging(
void NetworkLogsMessageHandler::OnSetShillDebuggingCompleted(
const std::string& callback_id,
bool succeeded) {
Respond(callback_id, "", !succeeded);
Respond(callback_id, /*result=*/"", !succeeded);
}
} // namespace chromeos
......@@ -138,29 +138,35 @@ class NetworkConfigMessageHandler : public content::WebUIMessageHandler {
}
private:
void Respond(const std::string& callback_id, const base::Value& response) {
AllowJavascript();
ResolveJavascriptCallback(base::Value(callback_id), response);
}
void GetShillNetworkProperties(const base::ListValue* arg_list) {
std::string guid;
if (!arg_list->GetString(0, &guid)) {
NOTREACHED();
return;
}
CHECK_EQ(2u, arg_list->GetSize());
std::string callback_id, guid;
CHECK(arg_list->GetString(0, &callback_id));
CHECK(arg_list->GetString(1, &guid));
std::string service_path;
if (!GetServicePathFromGuid(guid, &service_path)) {
ErrorCallback(guid, kGetNetworkProperties, "Error.InvalidNetworkGuid",
nullptr);
ErrorCallback(callback_id, guid, kGetNetworkProperties,
"Error.InvalidNetworkGuid", nullptr);
return;
}
NetworkHandler::Get()->network_configuration_handler()->GetShillProperties(
service_path,
base::BindOnce(
&NetworkConfigMessageHandler::GetShillNetworkPropertiesSuccess,
weak_ptr_factory_.GetWeakPtr()),
weak_ptr_factory_.GetWeakPtr(), callback_id),
base::Bind(&NetworkConfigMessageHandler::ErrorCallback,
weak_ptr_factory_.GetWeakPtr(), guid,
weak_ptr_factory_.GetWeakPtr(), callback_id, guid,
kGetNetworkProperties));
}
void GetShillNetworkPropertiesSuccess(
const std::string& callback_id,
const std::string& service_path,
const base::DictionaryValue& dictionary) {
std::unique_ptr<base::DictionaryValue> dictionary_copy(
......@@ -173,47 +179,46 @@ class NetworkConfigMessageHandler : public content::WebUIMessageHandler {
base::ListValue return_arg_list;
return_arg_list.Append(std::move(dictionary_copy));
AllowJavascript();
CallJavascriptFunction(
base::StringPrintf("network_ui.%sResult", kGetNetworkProperties),
return_arg_list);
Respond(callback_id, return_arg_list);
}
void GetShillDeviceProperties(const base::ListValue* arg_list) {
std::string type;
if (!arg_list->GetString(0, &type)) {
NOTREACHED();
return;
}
CHECK_EQ(2u, arg_list->GetSize());
std::string callback_id, type;
CHECK(arg_list->GetString(0, &callback_id));
CHECK(arg_list->GetString(1, &type));
const DeviceState* device =
NetworkHandler::Get()->network_state_handler()->GetDeviceStateByType(
onc::NetworkTypePatternFromOncType(type));
if (!device) {
ErrorCallback(type, kGetDeviceProperties, "Error.InvalidDeviceType",
nullptr);
ErrorCallback(callback_id, type, kGetDeviceProperties,
"Error.InvalidDeviceType", nullptr);
return;
}
NetworkHandler::Get()->network_device_handler()->GetDeviceProperties(
device->path(),
base::BindOnce(
&NetworkConfigMessageHandler::GetShillDevicePropertiesSuccess,
weak_ptr_factory_.GetWeakPtr()),
weak_ptr_factory_.GetWeakPtr(), callback_id),
base::Bind(&NetworkConfigMessageHandler::ErrorCallback,
weak_ptr_factory_.GetWeakPtr(), type, kGetDeviceProperties));
weak_ptr_factory_.GetWeakPtr(), callback_id, type,
kGetDeviceProperties));
}
void GetShillEthernetEAP(const base::ListValue* arg_list) {
CHECK_EQ(1u, arg_list->GetSize());
std::string callback_id;
CHECK(arg_list->GetString(0, &callback_id));
NetworkStateHandler::NetworkStateList list;
NetworkHandler::Get()->network_state_handler()->GetNetworkListByType(
NetworkTypePattern::Primitive(shill::kTypeEthernetEap),
true /* configured_only */, false /* visible_only */, 1 /* limit */,
&list);
AllowJavascript();
if (list.empty()) {
CallJavascriptFunction(
base::StringPrintf("network_ui.%sResult", kGetEthernetEAP));
Respond(callback_id, base::Value(base::Value::Type::LIST));
return;
}
const NetworkState* eap = list.front();
......@@ -221,21 +226,25 @@ class NetworkConfigMessageHandler : public content::WebUIMessageHandler {
properties.SetStringKey("guid", eap->guid());
properties.SetStringKey("name", eap->name());
properties.SetStringKey("type", eap->type());
CallJavascriptFunction(
base::StringPrintf("network_ui.%sResult", kGetEthernetEAP), properties);
base::Value response(base::Value::Type::LIST);
response.Append(std::move(properties));
Respond(callback_id, response);
}
void OpenCellularActivationUi(const base::ListValue* arg_list) {
CHECK_EQ(1u, arg_list->GetSize());
std::string callback_id;
CHECK(arg_list->GetString(0, &callback_id));
const NetworkState* cellular_network =
NetworkHandler::Get()->network_state_handler()->FirstNetworkByType(
NetworkTypePattern::Cellular());
if (cellular_network)
cellular_setup::OpenCellularSetupDialog(cellular_network->guid());
AllowJavascript();
CallJavascriptFunction(
base::StringPrintf("network_ui.%sResult", kOpenCellularActivationUi),
base::Value(cellular_network != nullptr));
base::Value response(base::Value::Type::LIST);
response.Append(base::Value(cellular_network != nullptr));
Respond(callback_id, response);
}
void ShowNetworkDetails(const base::ListValue* arg_list) {
......@@ -263,6 +272,7 @@ class NetworkConfigMessageHandler : public content::WebUIMessageHandler {
}
void GetShillDevicePropertiesSuccess(
const std::string& callback_id,
const std::string& device_path,
const base::DictionaryValue& dictionary) {
std::unique_ptr<base::DictionaryValue> dictionary_copy(
......@@ -273,14 +283,11 @@ class NetworkConfigMessageHandler : public content::WebUIMessageHandler {
base::ListValue return_arg_list;
return_arg_list.Append(std::move(dictionary_copy));
AllowJavascript();
CallJavascriptFunction(
base::StringPrintf("network_ui.%sResult", kGetDeviceProperties),
return_arg_list);
Respond(callback_id, return_arg_list);
}
void ErrorCallback(const std::string& guid_or_type,
void ErrorCallback(const std::string& callback_id,
const std::string& guid_or_type,
const std::string& function_name,
const std::string& error_name,
std::unique_ptr<base::DictionaryValue> /* error_data */) {
......@@ -293,11 +300,7 @@ class NetworkConfigMessageHandler : public content::WebUIMessageHandler {
dictionary.SetKey(key, base::Value(guid_or_type));
dictionary.SetKey("ShillError", base::Value(error_name));
return_arg_list.Append(std::move(dictionary));
AllowJavascript();
CallJavascriptFunction(
base::StringPrintf("network_ui.%sResult", function_name.c_str()),
return_arg_list);
Respond(callback_id, return_arg_list);
}
void AddNetwork(const base::ListValue* args) {
......@@ -402,6 +405,10 @@ void NetworkUI::GetLocalizedStrings(base::DictionaryValue* localized_strings) {
"importOncButtonText",
l10n_util::GetStringUTF16(IDS_NETWORK_UI_IMPORT_ONC_BUTTON_TEXT));
localized_strings->SetString(
"addWiFiListItemName",
l10n_util::GetStringUTF16(IDS_NETWORK_ADD_WI_FI_LIST_ITEM_NAME));
// Network logs
localized_strings->SetString(
"networkLogsDescription",
......@@ -463,12 +470,17 @@ NetworkUI::NetworkUI(content::WebUI* web_ui)
network_element::AddOncLocalizedStrings(html);
html->UseStringsJs();
html->AddResourcePath("network_ui_browser_proxy.html",
IDR_NETWORK_UI_BROWSER_PROXY_HTML);
html->AddResourcePath("network_ui_browser_proxy.js",
IDR_NETWORK_UI_BROWSER_PROXY_JS);
html->AddResourcePath("network_ui.html", IDR_NETWORK_UI_HTML);
html->AddResourcePath("network_ui.js", IDR_NETWORK_UI_JS);
html->AddResourcePath("network_state_ui.html", IDR_NETWORK_STATE_UI_HTML);
html->AddResourcePath("network_state_ui.js", IDR_NETWORK_STATE_UI_JS);
html->AddResourcePath("network_logs_ui.html", IDR_NETWORK_LOGS_UI_HTML);
html->AddResourcePath("network_logs_ui.js", IDR_NETWORK_LOGS_UI_JS);
html->SetDefaultResource(IDR_NETWORK_UI_HTML);
html->SetDefaultResource(IDR_NETWORK_UI_PAGE_HTML);
content::WebUIDataSource::Add(web_ui->GetWebContents()->GetBrowserContext(),
html);
......
......@@ -95,7 +95,7 @@ Polymer({
return item.showBeforeNetworksList === true;
});
const afterNetworks = this.customItems.filter(function(item) {
return item.showBeforeNetworksList === false;
return item.showBeforeNetworksList !== true;
});
this.listItems_ = beforeNetworks.concat(this.networks, afterNetworks);
this.restoreScroll(this.$.networkList);
......
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