Commit 0fe2f506 authored by Steven Bennetts's avatar Steven Bennetts Committed by Commit Bot

Add CrosNetworkConfig.ConfigureNetwork and use mojo in network_config.js

This CL:
* Converts network_config.js to use the cros_network_config mojo API.
* Converts network configuration components to use the mojo API.
* Converts all network config elements to use mojo policy behaviors
  and indicators. (Non mojo policy behaviors and indicators are no
  longer in use and will be removed in a follow-up).
* Moves requesting of ManagedProperties and GlobalPolicy to
  network_config.js (instead of being passed by dialog wrappers).
* Wraps the <internet-dialog> instance in internet_page.html with a
  dom-if template to avoid unnecessary mojo calls and avoid reuse edge
  cases.
* Adds mojo bindings to internet_config_dialog.cc
* Eliminates CrPolicyNetworkBehaviorTest which fails now that
  internet_page.html no longer pulls in the behavior. A follow-up will
  remove the behavior entirely.

Bug: 1001598
Change-Id: I93167de671b04b1bb9b8171975b76f89d1c0492a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1803724
Commit-Queue: Steven Bennetts <stevenjb@chromium.org>
Auto-Submit: Steven Bennetts <stevenjb@chromium.org>
Reviewed-by: default avatarKyle Horimoto <khorimoto@chromium.org>
Cr-Commit-Position: refs/heads/master@{#698601}
parent aec1fa66
......@@ -32,7 +32,6 @@
#include "chrome/browser/ui/ash/login_screen_client.h"
#include "chrome/browser/ui/ash/system_tray_client.h"
#include "chrome/browser/ui/autofill/chrome_autofill_client.h"
#include "chrome/browser/ui/webui/chromeos/internet_detail_dialog.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
#include "chromeos/dbus/session_manager/session_manager_client.h"
#include "chromeos/network/network_state.h"
......
......@@ -27,7 +27,7 @@ js_library("internet_config_dialog") {
"//ui/webui/resources/cr_components/chromeos/network:network_config",
"//ui/webui/resources/cr_elements/chromeos/network:cr_onc_types",
"//ui/webui/resources/cr_elements/cr_dialog:cr_dialog",
"//ui/webui/resources/cr_elements/policy:cr_policy_network_behavior",
"//ui/webui/resources/cr_elements/policy:cr_policy_network_behavior_mojo",
"//ui/webui/resources/js:assert",
"//ui/webui/resources/js:i18n_behavior",
]
......
......@@ -49,12 +49,11 @@
</style>
<cr-dialog id="dialog" no-cancel>
<div slot="title">[[getDialogTitle_(managedProperties_)]]</div>
<div slot="title">[[getDialogTitle_(type)]]</div>
<div slot="body">
<network-config id="networkConfig" class="flex"
networking-private="[[networkingPrivate]]"
global-policy="[[globalPolicy_]]"
managed-properties="{{managedProperties_}}"
guid="[[guid_]]" type="{{type_}}"
enable-connect="{{enableConnect_}}"
share-allow-enable="[[shareAllowEnable_]]"
share-default="[[shareDefault_]]"
......
......@@ -23,9 +23,6 @@ Polymer({
value: chrome.networkingPrivate,
},
/** @private {!chrome.networkingPrivate.GlobalPolicy|undefined} */
globalPolicy_: Object,
/** @private */
shareAllowEnable_: {
type: Boolean,
......@@ -48,16 +45,15 @@ Polymer({
*/
guid_: String,
/** @private */
enableConnect_: Boolean,
/**
* The current properties if an existing network is being configured, or
* a minimal subset for a new network. Note: network-config may modify
* this (specifically .name).
* @type {!chrome.networkingPrivate.ManagedProperties}
* The type of network to be configured as a string. May be set initially or
* updated by network-config.
* @private
*/
managedProperties_: Object,
type_: String,
/** @private */
enableConnect_: Boolean,
/**
* Set by network-config when a configuration error occurs.
......@@ -72,31 +68,20 @@ Polymer({
/** @override */
attached: function() {
var dialogArgs = chrome.getVariableValue('dialogArguments');
var type;
if (dialogArgs) {
var args = JSON.parse(dialogArgs);
type = args.type;
assert(type);
this.type_ = args.type;
assert(this.type_);
this.guid_ = args.guid || '';
} else {
// For debugging
var params = new URLSearchParams(document.location.search.substring(1));
type = params.get('type') || 'WiFi';
this.type_ = params.get('type') || 'WiFi';
this.guid_ = params.get('guid') || '';
}
this.managedProperties_ = {
GUID: this.guid_,
Name: {Active: ''},
Type: /** @type {chrome.networkingPrivate.NetworkType} */ (type),
};
this.$.networkConfig.init();
this.networkingPrivate.getGlobalPolicy(policy => {
this.globalPolicy_ = policy;
});
/** @type {!CrDialogElement} */ (this.$.dialog).showModal();
},
......@@ -110,7 +95,7 @@ Polymer({
* @private
*/
getDialogTitle_: function() {
var type = this.i18n('OncType' + this.managedProperties_.Type);
var type = this.i18n('OncType' + this.type_);
return this.i18n('internetJoinType', type);
},
......
......@@ -23,13 +23,12 @@
<cr-dialog id="dialog" close-text="$i18n{close}">
<div slot="title">
[[getDialogTitle_(managedProperties_, showConnect)]]
[[getDialogTitle_(name, type, showConnect)]]
</div>
<div slot="body">
<network-config id="networkConfig" class="flex"
networking-private="[[networkingPrivate]]"
global-policy="[[globalPolicy]]"
managed-properties="{{managedProperties_}}"
guid="[[guid]]" name="{{name}}" type="{{type}}"
enable-connect="{{enableConnect_}}" enable-save="{{enableSave_}}"
share-allow-enable="[[shareAllowEnable_]]"
share-default="[[shareDefault_]]"
......
......@@ -18,9 +18,6 @@ Polymer({
*/
networkingPrivate: Object,
/** @type {!chrome.networkingPrivate.GlobalPolicy|undefined} */
globalPolicy: Object,
/** @private */
shareAllowEnable_: {
type: Boolean,
......@@ -44,13 +41,14 @@ Polymer({
guid: String,
/**
* The type of network to be configured.
* @type {!chrome.networkingPrivate.NetworkType}
* The type of network to be configured as a string. May be set initially or
* updated by network-config.
*/
type: String,
/**
* The name of network (for display while the network details are fetched).
* The name of the network. May be set initially or updated by
* network-config.
*/
name: String,
......@@ -65,14 +63,6 @@ Polymer({
/** @private */
enableSave_: Boolean,
/**
* The current properties if an existing network is being configured, or
* a minimal subset for a new network. Note: network-config may modify
* this (specifically .name).
* @private {!chrome.networkingPrivate.ManagedProperties}
*/
managedProperties_: Object,
/**
* Set by network-config when a configuration error occurs.
* @private
......@@ -89,14 +79,6 @@ Polymer({
dialog.showModal();
}
// Set managedProperties for new configurations and for existing
// configurations until the current properties are loaded.
assert(this.type && this.type != CrOnc.Type.ALL);
this.managedProperties_ = {
GUID: this.guid,
Name: {Active: this.name},
Type: this.type,
};
this.$.networkConfig.init();
},
......@@ -113,7 +95,6 @@ Polymer({
*/
onClose_: function(event) {
this.close();
event.stopPropagation();
},
/**
......@@ -121,18 +102,10 @@ Polymer({
* @private
*/
getDialogTitle_: function() {
// If no properties are available yet, wait until they are set as part of
// open().
if (!this.managedProperties_) {
return '';
}
const name = /** @type {string} */ (
CrOnc.getActiveValue(this.managedProperties_.Name));
if (name && !this.showConnect) {
return this.i18n('internetConfigName', HTMLEscape(name));
if (this.name && !this.showConnect) {
return this.i18n('internetConfigName', HTMLEscape(this.name));
}
const type = this.i18n('OncType' + this.managedProperties_.Type);
const type = this.i18n('OncType' + this.type);
return this.i18n('internetJoinType', type);
},
......
......@@ -126,10 +126,12 @@
</settings-animated-pages>
<internet-config id="configDialog"
networking-private="[[networkingPrivate]]"
global-policy="[[globalPolicy_]]">
</internet-config>
<template is="dom-if" if="[[showInternetConfig_]]" restamp>
<internet-config id="configDialog"
networking-private="[[networkingPrivate]]"
on-close="onInternetConfigClose_">
</internet-config>
</template>
</template>
<script src="internet_page.js"></script>
......
......@@ -111,6 +111,12 @@ Polymer({
}
},
/** @private {boolean} */
showInternetConfig_: {
type: Boolean,
value: false,
},
/** @private {!Map<string, Element>} */
focusConfig_: {
type: Object,
......@@ -273,15 +279,26 @@ Polymer({
assert(
type != chromeos.networkConfig.mojom.NetworkType.kCellular &&
type != chromeos.networkConfig.mojom.NetworkType.kTether);
const configDialog =
/** @type {!InternetConfigElement} */ (this.$.configDialog);
// TODO(stevenjb): Update configDialog to use mojom.NetworkType.
configDialog.type = /** @type{!chrome.networkingPrivate.NetworkType}*/ (
OncMojo.getNetworkTypeString(type));
configDialog.guid = opt_guid || '';
configDialog.name = opt_name || '';
configDialog.showConnect = configAndConnect;
configDialog.open();
if (this.showInternetConfig_) {
return;
}
this.showInternetConfig_ = true;
// Async call to ensure dialog is stamped.
setTimeout(() => {
const configDialog =
/** @type {!InternetConfigElement} */ (this.$$('#configDialog'));
assert(!!configDialog);
configDialog.type = OncMojo.getNetworkTypeString(type);
configDialog.guid = opt_guid || '';
configDialog.name = opt_name || '';
configDialog.showConnect = configAndConnect;
configDialog.open();
});
},
/** @private */
onInternetConfigClose_: function() {
this.showInternetConfig_ = false;
},
/**
......
......@@ -4,6 +4,7 @@
#include "chrome/browser/ui/webui/chromeos/internet_config_dialog.h"
#include "ash/public/cpp/network_config_service.h"
#include "base/json/json_writer.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.h"
......@@ -136,7 +137,7 @@ std::string InternetConfigDialog::GetDialogArgs() const {
// InternetConfigDialogUI
InternetConfigDialogUI::InternetConfigDialogUI(content::WebUI* web_ui)
: ui::WebDialogUI(web_ui) {
: ui::MojoWebDialogUI(web_ui) {
content::WebUIDataSource* source = content::WebUIDataSource::Create(
chrome::kChromeUIInternetConfigDialogHost);
......@@ -153,8 +154,17 @@ InternetConfigDialogUI::InternetConfigDialogUI(content::WebUI* web_ui)
#endif
content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), source);
// Add Mojo bindings to this WebUI so that Mojo calls can occur in JavaScript.
AddHandlerToRegistry(base::BindRepeating(
&InternetConfigDialogUI::BindCrosNetworkConfig, base::Unretained(this)));
}
InternetConfigDialogUI::~InternetConfigDialogUI() {}
void InternetConfigDialogUI::BindCrosNetworkConfig(
chromeos::network_config::mojom::CrosNetworkConfigRequest request) {
ash::GetNetworkConfigService(std::move(request));
}
} // namespace chromeos
......@@ -8,8 +8,8 @@
#include <string>
#include "base/macros.h"
#include "base/strings/string16.h"
#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" // nogncheck
#include "ui/web_dialogs/web_dialog_ui.h"
namespace chromeos {
......@@ -49,12 +49,15 @@ class InternetConfigDialog : public SystemWebDialogDelegate {
// A WebUI to host the network configuration UI in a dialog, used in the
// login screen and when a new network is configured from the system tray.
class InternetConfigDialogUI : public ui::WebDialogUI {
class InternetConfigDialogUI : public ui::MojoWebDialogUI {
public:
explicit InternetConfigDialogUI(content::WebUI* web_ui);
~InternetConfigDialogUI() override;
private:
void BindCrosNetworkConfig(
chromeos::network_config::mojom::CrosNetworkConfigRequest request);
DISALLOW_COPY_AND_ASSIGN(InternetConfigDialogUI);
};
......
......@@ -96,6 +96,7 @@ CrComponentsNetworkConfigTest.prototype = {
'../fake_chrome_event.js',
'../chromeos/networking_private_constants.js',
'../chromeos/fake_networking_private.js',
'../chromeos/fake_network_config_mojom.js',
'../chromeos/cr_onc_strings.js',
'network_config_test.js',
]),
......
......@@ -8,17 +8,34 @@ suite('network-config', function() {
/** @type {NetworkingPrivate} */
var api_;
/** @type {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
let mojoApi_ = null;
suiteSetup(function() {
api_ = new chrome.FakeNetworkingPrivate();
api_ = new chrome.FakeNetworkingPrivate(); // For certificates
mojoApi_ = new FakeNetworkConfig();
network_config.MojoInterfaceProviderImpl.getInstance().remote_ = mojoApi_;
CrOncTest.overrideCrOncStrings();
});
function setNetworkConfig(properties) {
assert(properties.guid);
mojoApi_.setManagedPropertiesForTest(properties);
PolymerTest.clearBody();
networkConfig = document.createElement('network-config');
networkConfig.networkingPrivate = api_;
networkConfig.managedProperties =
CrOncTest.convertToManagedProperties(properties);
networkConfig.guid = properties.guid;
networkConfig.managedProperties = properties;
}
function setNetworkType(type, security) {
PolymerTest.clearBody();
networkConfig = document.createElement('network-config');
networkConfig.networkingPrivate = api_;
networkConfig.type = OncMojo.getNetworkTypeString(type);
if (security !== undefined) {
networkConfig.securityType = security;
}
}
function initNetworkConfig() {
......@@ -36,8 +53,8 @@ suite('network-config', function() {
suite('New WiFi Config', function() {
setup(function() {
api_.resetForTest();
setNetworkConfig({GUID: '', Name: '', Type: 'WiFi'});
mojoApi_.resetForTest();
setNetworkType(chromeos.networkConfig.mojom.NetworkType.kWiFi);
initNetworkConfig();
});
......@@ -55,16 +72,13 @@ suite('network-config', function() {
suite('Existing WiFi Config', function() {
setup(function() {
api_.resetForTest();
var network = {
GUID: 'someguid',
Name: 'somename',
Source: 'Device',
Type: 'WiFi',
WiFi: {SSID: 'somessid', Security: 'None'}
};
api_.addNetworksForTest([network]);
setNetworkConfig({GUID: 'someguid', Name: '', Type: 'WiFi'});
mojoApi_.resetForTest();
const wifi1 = OncMojo.getDefaultManagedProperties(
chromeos.networkConfig.mojom.NetworkType.kWiFi, 'someguid', '');
wifi1.name = OncMojo.createManagedString('somename');
wifi1.source = chromeos.networkConfig.mojom.OncSource.kDevice;
wifi1.wifi.security = chromeos.networkConfig.mojom.SecurityType.kWepPsk;
setNetworkConfig(wifi1);
initNetworkConfig();
});
......@@ -74,10 +88,9 @@ suite('network-config', function() {
test('Default', function() {
return flushAsync().then(() => {
assertEquals('someguid', networkConfig.managedProperties.GUID);
assertEquals('someguid', networkConfig.managedProperties.guid);
assertEquals(
'somename',
CrOnc.getActiveValue(networkConfig.managedProperties.Name));
'somename', networkConfig.managedProperties.name.activeValue);
assertFalse(!!networkConfig.$$('#share'));
assertTrue(!!networkConfig.$$('#ssid'));
assertTrue(!!networkConfig.$$('#security'));
......@@ -88,7 +101,7 @@ suite('network-config', function() {
suite('Share', function() {
setup(function() {
api_.resetForTest();
mojoApi_.resetForTest();
});
teardown(function() {
......@@ -126,8 +139,9 @@ suite('network-config', function() {
test('New Config: Login or guest', function() {
// Insecure networks are always shared so test a secure config.
setNetworkConfig(
{GUID: '', Name: '', Type: 'WiFi', WiFi: {Security: 'WEP-PSK'}});
setNetworkType(
chromeos.networkConfig.mojom.NetworkType.kWiFi,
chromeos.networkConfig.mojom.SecurityType.kWepPsk);
setLoginOrGuest();
initNetworkConfig();
return flushAsync().then(() => {
......@@ -140,8 +154,9 @@ suite('network-config', function() {
test('New Config: Kiosk', function() {
// Insecure networks are always shared so test a secure config.
setNetworkConfig(
{GUID: '', Name: '', Type: 'WiFi', WiFi: {Security: 'WEP-PSK'}});
setNetworkType(
chromeos.networkConfig.mojom.NetworkType.kWiFi,
chromeos.networkConfig.mojom.SecurityType.kWepPsk);
setKiosk();
initNetworkConfig();
return flushAsync().then(() => {
......@@ -153,8 +168,7 @@ suite('network-config', function() {
});
test('New Config: Authenticated, Not secure', function() {
setNetworkConfig(
{GUID: '', Name: '', Type: 'WiFi', WiFi: {Security: 'None'}});
setNetworkType(chromeos.networkConfig.mojom.NetworkType.kWiFi);
setAuthenticated();
initNetworkConfig();
return flushAsync().then(() => {
......@@ -166,8 +180,9 @@ suite('network-config', function() {
});
test('New Config: Authenticated, Secure', function() {
setNetworkConfig(
{GUID: '', Name: '', Type: 'WiFi', WiFi: {Security: 'WEP-PSK'}});
setNetworkType(
chromeos.networkConfig.mojom.NetworkType.kWiFi,
chromeos.networkConfig.mojom.SecurityType.kWepPsk);
setAuthenticated();
initNetworkConfig();
return flushAsync().then(() => {
......@@ -180,15 +195,11 @@ suite('network-config', function() {
// Existing networks hide the shared control in the config UI.
test('Existing Hides Shared', function() {
var network = {
GUID: 'someguid',
Name: 'somename',
Source: 'User',
Type: 'WiFi',
WiFi: {SSID: 'somessid', Security: 'WEP-PSK'}
};
api_.addNetworksForTest([network]);
setNetworkConfig({GUID: 'someguid', Name: '', Type: 'WiFi'});
const wifi1 = OncMojo.getDefaultManagedProperties(
chromeos.networkConfig.mojom.NetworkType.kWiFi, 'someguid', '');
wifi1.source = chromeos.networkConfig.mojom.OncSource.kUser;
wifi1.wifi.security = chromeos.networkConfig.mojom.SecurityType.kWepPsk;
setNetworkConfig(wifi1);
setAuthenticated();
initNetworkConfig();
return flushAsync().then(() => {
......@@ -197,51 +208,37 @@ suite('network-config', function() {
});
test('Ethernet', function() {
var ethernet = {
GUID: 'ethernetguid',
Name: 'Ethernet',
Type: 'Ethernet',
Ethernet: {Authentication: 'None'}
};
api_.addNetworksForTest([ethernet]);
setNetworkConfig({GUID: 'ethernetguid', Name: '', Type: 'Ethernet'});
const eth = OncMojo.getDefaultManagedProperties(
chromeos.networkConfig.mojom.NetworkType.kEthernet, 'ethernetguid',
'');
eth.ethernet.authentication = OncMojo.createManagedString('None');
setNetworkConfig(eth);
initNetworkConfig();
return flushAsync().then(() => {
assertEquals('ethernetguid', networkConfig.guid);
assertEquals('None', networkConfig.security_);
assertEquals(
chromeos.networkConfig.mojom.SecurityType.kNone,
networkConfig.securityType);
let outer = networkConfig.$$('#outer');
assertFalse(!!outer);
});
});
test('Ethernet EAP', function() {
var ethernet = {
GUID: 'ethernetguid',
Name: 'Ethernet',
Type: 'Ethernet',
Ethernet: {Authentication: 'None'}
};
var ethernetEap = {
GUID: 'eapguid',
Name: 'EthernetEap',
Type: 'Ethernet',
Ethernet: {
Authentication: '8021X',
EAP: {Outer: 'PEAP'},
}
};
api_.addNetworksForTest([ethernet, ethernetEap]);
setNetworkConfig({GUID: 'ethernetguid', Name: '', Type: 'Ethernet'});
const eth = OncMojo.getDefaultManagedProperties(
chromeos.networkConfig.mojom.NetworkType.kEthernet, 'eapguid', '');
eth.ethernet.authentication = OncMojo.createManagedString('8021x');
eth.ethernet.eap = {outer: OncMojo.createManagedString('PEAP')};
setNetworkConfig(eth);
initNetworkConfig();
return flushAsync().then(() => {
assertEquals('eapguid', networkConfig.guid);
assertEquals('WPA-EAP', networkConfig.security_);
assertEquals(
chromeos.networkConfig.mojom.SecurityType.kWpaEap,
networkConfig.securityType);
assertEquals(
'PEAP',
CrOnc.getActiveValue(
/** @type {chrome.networkingPrivate.ManagedDOMString|undefined} */
(networkConfig.get(
'Ethernet.EAP.Outer', networkConfig.managedProperties))));
networkConfig.managedProperties.ethernet.eap.outer.activeValue);
let outer = networkConfig.$$('#outer');
assertTrue(!!outer);
assertTrue(!outer.disabled);
......@@ -250,14 +247,11 @@ suite('network-config', function() {
});
test('WiFi EAP TLS', function() {
var network = {
GUID: 'eaptlsguid',
Name: '',
Type: 'WiFi',
WiFi: {Security: 'WPA-EAP', EAP: {Outer: 'EAP-TLS'}}
};
api_.addNetworksForTest([network]);
setNetworkConfig({GUID: 'eaptlsguid', Name: '', Type: 'WiFi'});
const wifi1 = OncMojo.getDefaultManagedProperties(
chromeos.networkConfig.mojom.NetworkType.kWiFi, 'eaptlsguid', '');
wifi1.wifi.security = chromeos.networkConfig.mojom.SecurityType.kWpaEap;
wifi1.wifi.eap = {outer: OncMojo.createManagedString('EAP-TLS')};
setNetworkConfig(wifi1);
setCertificatesForTest();
setAuthenticated();
initNetworkConfig();
......@@ -289,7 +283,5 @@ suite('network-config', function() {
assertTrue(!!caCert);
});
});
});
});
......@@ -279,29 +279,6 @@ TEST_F('CrElementsPolicyPrefIndicatorTest', 'All', function() {
});
GEN('#if defined(OS_CHROMEOS)');
/**
* @constructor
* @extends {CrElementsBrowserTest}
*/
function CrPolicyNetworkBehaviorTest() {}
CrPolicyNetworkBehaviorTest.prototype = {
__proto__: CrElementsBrowserTest.prototype,
/** @override */
browsePreload: 'chrome://settings/internet_page/internet_page.html',
/** @override */
extraLibraries: CrElementsBrowserTest.prototype.extraLibraries.concat([
'cr_policy_strings.js',
'cr_policy_network_behavior_tests.js',
]),
};
TEST_F('CrPolicyNetworkBehaviorTest', 'All', function() {
mocha.run();
});
/**
* @constructor
* @extends {CrElementsBrowserTest}
......
// Copyright 2019 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 Suite of tests for CrPolicyIndicatorBehavior. */
suite('CrPolicyNetworkBehavior', function() {
suiteSetup(function() {
Polymer({
is: 'test-behavior',
behaviors: [CrPolicyNetworkBehavior],
});
});
let testBehavior;
setup(function() {
PolymerTest.clearBody();
testBehavior = document.createElement('test-behavior');
document.body.appendChild(testBehavior);
});
test('pod', function() {
let property = 'foo';
assertFalse(testBehavior.isNetworkPolicyControlled(property));
assertFalse(testBehavior.isControlled(property));
assertFalse(testBehavior.isExtensionControlled(property));
assertFalse(testBehavior.isEditable(property));
assertFalse(testBehavior.isNetworkPolicyEnforced(property));
assertFalse(testBehavior.isNetworkPolicyRecommended(property));
});
test('active', function() {
let property = {'Active': 'foo'};
assertFalse(testBehavior.isNetworkPolicyControlled(property));
assertFalse(testBehavior.isControlled(property));
assertFalse(testBehavior.isExtensionControlled(property));
assertFalse(testBehavior.isEditable(property));
assertFalse(testBehavior.isNetworkPolicyEnforced(property));
assertFalse(testBehavior.isNetworkPolicyRecommended(property));
});
test('user_recommended', function() {
let properties = {
'Source': 'UserPolicy',
'a': {
'Effective': 'UserSetting',
'UserEditable': true,
'UserPolicy': 'bar',
'UserSetting': 'foo',
}
};
assertTrue(testBehavior.isNetworkPolicyControlled(properties.a));
assertTrue(testBehavior.isControlled(properties.a));
assertFalse(testBehavior.isExtensionControlled(properties.a));
assertTrue(testBehavior.isEditable(properties.a));
assertFalse(testBehavior.isNetworkPolicyEnforced(properties.a));
assertTrue(testBehavior.isNetworkPolicyRecommended(properties.a));
});
test('device_recommended', function() {
let properties = {
'Source': 'DevicePolicy',
'a': {
'Effective': 'DeviceSetting',
'DeviceEditable': true,
'DevicePolicy': 'bar',
'DeviceSetting': 'foo',
}
};
assertTrue(testBehavior.isNetworkPolicyControlled(properties.a));
assertTrue(testBehavior.isControlled(properties.a));
assertFalse(testBehavior.isExtensionControlled(properties.a));
assertTrue(testBehavior.isEditable(properties.a));
assertFalse(testBehavior.isNetworkPolicyEnforced(properties.a));
assertTrue(testBehavior.isNetworkPolicyRecommended(properties.a));
});
test('user_enforced', function() {
let properties = {
'Source': 'UserPolicy',
'a': {
'Effective': 'UserPolicy',
'UserEditable': false,
'UserPolicy': 'bar',
}
};
assertTrue(testBehavior.isNetworkPolicyControlled(properties.a));
assertTrue(testBehavior.isControlled(properties.a));
assertFalse(testBehavior.isExtensionControlled(properties.a));
assertFalse(testBehavior.isEditable(properties.a));
assertTrue(testBehavior.isNetworkPolicyEnforced(properties.a));
assertFalse(testBehavior.isNetworkPolicyRecommended(properties.a));
});
test('device_enforced', function() {
let properties = {
'Source': 'DevicePolicy',
'a': {
'Effective': 'DevicePolicy',
'DeviceEditable': false,
'DevicePolicy': 'bar',
}
};
assertTrue(testBehavior.isNetworkPolicyControlled(properties.a));
assertTrue(testBehavior.isControlled(properties.a));
assertFalse(testBehavior.isExtensionControlled(properties.a));
assertFalse(testBehavior.isEditable(properties.a));
assertTrue(testBehavior.isNetworkPolicyEnforced(properties.a));
assertFalse(testBehavior.isNetworkPolicyRecommended(properties.a));
});
test('extension_controlled', function() {
let properties = {
'Source': 'UserPolicy',
'a': {
'Active': 'bar',
'Effective': 'ActiveExtension',
'UserEditable': false,
}
};
assertFalse(testBehavior.isNetworkPolicyControlled(properties.a));
assertTrue(testBehavior.isControlled(properties.a));
assertTrue(testBehavior.isExtensionControlled(properties.a));
assertFalse(testBehavior.isEditable(properties.a));
assertFalse(testBehavior.isNetworkPolicyEnforced(properties.a));
assertFalse(testBehavior.isNetworkPolicyRecommended(properties.a));
});
});
......@@ -941,14 +941,14 @@ mojom::ManagedCertificatePatternPtr GetManagedCertificatePattern(
mojom::ManagedEAPPropertiesPtr GetManagedEAPProperties(const base::Value* dict,
const char* key) {
auto eap = mojom::ManagedEAPProperties::New();
const base::Value* eap_dict = dict->FindKey(key);
if (!eap_dict)
return nullptr;
return eap;
if (!eap_dict->is_dict()) {
NET_LOG(ERROR) << "Expected dictionary, found: " << *eap_dict;
return nullptr;
return eap;
}
auto eap = mojom::ManagedEAPProperties::New();
eap->anonymous_identity =
GetManagedString(eap_dict, ::onc::eap::kAnonymousIdentity);
eap->client_cert_pattern = GetManagedCertificatePattern(
......@@ -979,14 +979,14 @@ mojom::ManagedEAPPropertiesPtr GetManagedEAPProperties(const base::Value* dict,
mojom::ManagedIPSecPropertiesPtr GetManagedIPSecProperties(
const base::Value* dict,
const char* key) {
auto ipsec = mojom::ManagedIPSecProperties::New();
const base::Value* ipsec_dict = dict->FindKey(key);
if (!ipsec_dict)
return nullptr;
return ipsec;
if (!ipsec_dict->is_dict()) {
NET_LOG(ERROR) << "Expected dictionary, found: " << *ipsec_dict;
return nullptr;
return ipsec;
}
auto ipsec = mojom::ManagedIPSecProperties::New();
ipsec->authentication_type =
GetManagedString(ipsec_dict, ::onc::ipsec::kAuthenticationType);
ipsec->client_cert_pattern = GetManagedCertificatePattern(
......@@ -1013,14 +1013,14 @@ mojom::ManagedIPSecPropertiesPtr GetManagedIPSecProperties(
mojom::ManagedL2TPPropertiesPtr GetManagedL2TPProperties(
const base::Value* dict,
const char* key) {
auto l2tp = mojom::ManagedL2TPProperties::New();
const base::Value* l2tp_dict = dict->FindKey(key);
if (!l2tp_dict)
return nullptr;
return l2tp;
if (!l2tp_dict->is_dict()) {
NET_LOG(ERROR) << "Expected dictionary, found: " << *l2tp_dict;
return nullptr;
return l2tp;
}
auto l2tp = mojom::ManagedL2TPProperties::New();
l2tp->lcp_echo_disabled =
GetManagedBoolean(l2tp_dict, ::onc::l2tp::kLcpEchoDisabled);
l2tp->password = GetManagedString(l2tp_dict, ::onc::l2tp::kPassword);
......@@ -1033,14 +1033,14 @@ mojom::ManagedL2TPPropertiesPtr GetManagedL2TPProperties(
mojom::ManagedOpenVPNPropertiesPtr GetManagedOpenVPNProperties(
const base::Value* dict,
const char* key) {
auto openvpn = mojom::ManagedOpenVPNProperties::New();
const base::Value* openvpn_dict = dict->FindKey(key);
if (!openvpn_dict)
return nullptr;
return openvpn;
if (!openvpn_dict->is_dict()) {
NET_LOG(ERROR) << "Expected dictionary, found: " << *openvpn_dict;
return nullptr;
return openvpn;
}
auto openvpn = mojom::ManagedOpenVPNProperties::New();
openvpn->auth = GetManagedString(openvpn_dict, ::onc::openvpn::kAuth);
openvpn->auth_retry =
GetManagedString(openvpn_dict, ::onc::openvpn::kAuthRetry);
......
......@@ -50,6 +50,8 @@ js_library("network_choose_mobile") {
js_library("network_config") {
deps = [
"//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_elements/chromeos/network:cr_onc_types",
"//ui/webui/resources/js:assert",
"//ui/webui/resources/js:i18n_behavior",
......@@ -60,14 +62,15 @@ js_library("network_config") {
js_library("network_config_element_behavior") {
deps = [
"//ui/webui/resources/cr_elements/chromeos/network:cr_onc_types",
"//ui/webui/resources/cr_elements/policy:cr_policy_network_behavior_mojo",
"//ui/webui/resources/js/chromeos:onc_mojo",
]
}
js_library("network_config_input") {
deps = [
":network_config_element_behavior",
"//ui/webui/resources/cr_elements/policy:cr_policy_network_behavior",
"//ui/webui/resources/cr_elements/policy:cr_policy_network_behavior_mojo",
]
externs_list = [ "$externs_path/networking_private.js" ]
extra_sources = [ "$interfaces_path/networking_private_interface.js" ]
......@@ -76,7 +79,7 @@ js_library("network_config_input") {
js_library("network_config_select") {
deps = [
":network_config_element_behavior",
"//ui/webui/resources/cr_elements/policy:cr_policy_network_behavior",
"//ui/webui/resources/cr_elements/policy:cr_policy_network_behavior_mojo",
"//ui/webui/resources/js:assert",
"//ui/webui/resources/js:i18n_behavior",
]
......@@ -87,7 +90,7 @@ js_library("network_config_select") {
js_library("network_config_toggle") {
deps = [
":network_config_element_behavior",
"//ui/webui/resources/cr_elements/policy:cr_policy_network_behavior",
"//ui/webui/resources/cr_elements/policy:cr_policy_network_behavior_mojo",
]
externs_list = [ "$externs_path/networking_private.js" ]
extra_sources = [ "$interfaces_path/networking_private_interface.js" ]
......@@ -113,7 +116,7 @@ js_library("network_nameservers") {
js_library("network_password_input") {
deps = [
":network_config_element_behavior",
"//ui/webui/resources/cr_elements/policy:cr_policy_network_behavior",
"//ui/webui/resources/cr_elements/policy:cr_policy_network_behavior_mojo",
"//ui/webui/resources/js:i18n_behavior",
]
externs_list = [ "$externs_path/networking_private.js" ]
......
......@@ -17,7 +17,7 @@ const NetworkConfigElementBehavior = {
/**
* Network managed property associated with the config element.
* @type {?CrOnc.ManagedProperty}
* @type {?OncMojo.ManagedProperty}
*/
property: {
type: Object,
......@@ -27,7 +27,7 @@ const NetworkConfigElementBehavior = {
/**
* @param {boolean} disabled
* @param {?CrOnc.ManagedProperty} property
* @param {?OncMojo.ManagedProperty} property
* @return {boolean} True if the element should be disabled.
* @private
*/
......
<link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_indicator.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior_mojo.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_indicator_mojo.html">
<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
<link rel="import" href="network_config_element_behavior.html">
<link rel="import" href="network_shared_css.html">
......@@ -20,7 +20,7 @@
width: 100%;
}
cr-policy-network-indicator {
cr-policy-network-indicator-mojo {
--cr-tooltip-icon-margin-start: var(--cr-controlled-by-spacing);
}
</style>
......@@ -31,7 +31,7 @@
disabled="[[getDisabled_(disabled, property)]]"
on-keypress="onKeypress_">
</cr-input>
<cr-policy-network-indicator
<cr-policy-network-indicator-mojo
property="[[property]]" tooltip-position="left">
</cr-policy-network-indicator>
</div>
......
......@@ -8,7 +8,10 @@
Polymer({
is: 'network-config-input',
behaviors: [CrPolicyNetworkBehavior, NetworkConfigElementBehavior],
behaviors: [
CrPolicyNetworkBehaviorMojo,
NetworkConfigElementBehavior,
],
properties: {
label: String,
......
<link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_indicator.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior_mojo.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_indicator_mojo.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_tooltip_icon.html">
<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html">
......@@ -32,7 +32,7 @@
flex-direction: row;
}
cr-policy-network-indicator {
cr-policy-network-indicator-mojo {
--cr-tooltip-icon-margin-start: var(--cr-controlled-by-spacing);
}
</style>
......@@ -46,13 +46,13 @@
<template is="dom-repeat" items="[[items]]">
<option value="[[getItemValue_(item)]]"
disabled="[[!getItemEnabled_(item, deviceCertsOnly)]]">
[[getItemLabel_(item, oncPrefix)]]
[[getItemLabel_(item, key, oncPrefix)]]
</option>
</template>
</select>
<cr-policy-network-indicator
<cr-policy-network-indicator-mojo
property="[[property]]" tooltip-position="left">
</cr-policy-network-indicator>
</cr-policy-network-indicator-mojo>
</div>
</div>
......
......@@ -10,7 +10,7 @@ Polymer({
behaviors: [
I18nBehavior,
CrPolicyNetworkBehavior,
CrPolicyNetworkBehaviorMojo,
NetworkConfigElementBehavior,
],
......@@ -29,19 +29,25 @@ Polymer({
/**
* Array of item values to select from.
* @type {!Array<string>}
* @type {!Array<string|number>}
*/
items: Array,
/** Select item key, used for converting enums to strings */
key: String,
/** Prefix used to look up ONC property names. */
oncPrefix: {
type: String,
value: '',
},
/** Select item value */
/**
* Select item value
* @type {string|number}
*/
value: {
type: String,
type: Object,
notify: true,
},
},
......@@ -67,23 +73,35 @@ Polymer({
},
/**
* @param {string|!chrome.networkingPrivate.Certificate} item
* @param {string} prefix
* @return {string} The text to display for the onc value.
* Returns a localized label for |item|. If |this.key| is set, |item| is
* expected to be an enum and the key is used to convert it to a string.
* @param {string|number|!chrome.networkingPrivate.Certificate} item
* @return {string}
* @private
*/
getItemLabel_: function(item, prefix) {
getItemLabel_: function(item) {
if (this.certList) {
return this.getCertificateName_(
/** @type {chrome.networkingPrivate.Certificate}*/ (item));
}
const key = /** @type {string} */ (item);
const oncKey = 'Onc' + prefix.replace(/\./g, '-') + '_' + key;
if (this.i18nExists(oncKey)) {
return this.i18n(oncKey);
let value;
if (this.key) {
// |item| is an enum, convert the enum to a string.
value = /** @type {string} */ (
OncMojo.getTypeString(this.key, /** @type {number} */ (item)));
} else {
value = /** @type {string} */ (item);
}
// The i18n dictonary is populated with all supported ONC values in the
// format Onc + prefix + value, with '-' replaceing '.' in the prefix.
// See network_element_localized_strings_provider.cc.
const oncValue = 'Onc' + this.oncPrefix.replace(/\./g, '-') + '_' + value;
if (this.i18nExists(oncValue)) {
return this.i18n(oncValue);
}
assertNotReached('ONC Key not found: ' + oncKey);
return key;
// All selectable values should be localized.
assertNotReached('ONC value not found: ' + oncValue);
return value;
},
/**
......
<link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_indicator.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior_mojo.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_indicator_mojo.html">
<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
<link rel="import" href="network_config_element_behavior.html">
<link rel="import" href="network_shared_css.html">
......@@ -10,7 +10,7 @@
<dom-module id="network-config-toggle">
<template>
<style include="network-shared">
cr-policy-network-indicator {
cr-policy-network-indicator-mojo {
--cr-tooltip-icon-margin-start: var(--cr-controlled-by-spacing);
}
</style>
......@@ -23,9 +23,9 @@
disabled="[[getDisabled_(disabled, property)]]"
aria-label$="[[label]]">
</cr-toggle>
<cr-policy-network-indicator
<cr-policy-network-indicator-mojo
property="[[property]]" tooltip-position="left">
</cr-policy-network-indicator>
</cr-policy-network-indicator-mojo>
</div>
</template>
<script src="network_config_toggle.js"></script>
......
......@@ -8,7 +8,10 @@
Polymer({
is: 'network-config-toggle',
behaviors: [CrPolicyNetworkBehavior, NetworkConfigElementBehavior],
behaviors: [
CrPolicyNetworkBehaviorMojo,
NetworkConfigElementBehavior,
],
properties: {
label: String,
......
......@@ -2,8 +2,8 @@
<link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html">
<link rel="import" href="chrome://resources/cr_elements/cr_icons_css.html">
<link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_indicator.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_behavior_mojo.html">
<link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_indicator_mojo.html">
<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
<link rel="import" href="chrome://resources/html/i18n_behavior.html">
<link rel="import" href="network_config_element_behavior.html">
......@@ -22,7 +22,7 @@
flex: 1;
}
cr-policy-network-indicator {
cr-policy-network-indicator-mojo {
--cr-tooltip-icon-margin-start: var(--cr-controlled-by-spacing);
}
</style>
......@@ -44,7 +44,7 @@
</cr-icon-button>
</template>
<template is="dom-if" if="[[showPolicyIndicator_]]" restamp>
<cr-policy-network-indicator
<cr-policy-network-indicator-mojo
property="[[property]]" tooltip-position="left">
</cr-policy-network-indicator>
</template>
......
......@@ -16,7 +16,7 @@ Polymer({
behaviors: [
I18nBehavior,
CrPolicyNetworkBehavior,
CrPolicyNetworkBehaviorMojo,
NetworkConfigElementBehavior,
],
......
......@@ -247,23 +247,17 @@ Polymer({
*/
getProperty_: function(key, propertyDict) {
const property = this.get(key, this.propertyDict);
if (property === undefined || property === null) {
if ((property === undefined || property === null) &&
propertyDict.source !== undefined) {
// If the dictionary is policy controlled, provide an empty property
// object with the network policy source. See https://crbug.com/819837 for
// more info.
const source = propertyDict.source;
if (source == chromeos.networkConfig.mojom.OncSource.kUserPolicy) {
return /** @type{!OncMojo.ManagedProperty} */ ({
activeValue: '',
policySource:
chromeos.networkConfig.mojom.PolicySource.kUserPolicyEnforced,
});
}
if (source == chromeos.networkConfig.mojom.OncSource.kDevicePolicy) {
// object with the network policy source. See https://crbug.com/819837
// for more info.
const policySource =
OncMojo.getEnforcedPolicySourceFromOncSource(propertyDict.source);
if (policySource != chromeos.networkConfig.mojom.PolicySource.kNone) {
return /** @type{!OncMojo.ManagedProperty} */ ({
activeValue: '',
policySource:
chromeos.networkConfig.mojom.PolicySource.kDevicePolicyEnforced,
policySource: policySource,
});
}
// Otherwise just return undefined.
......
......@@ -18,6 +18,7 @@ js_type_check("closure_compile") {
":cr_policy_network_behavior",
":cr_policy_network_behavior_mojo",
":cr_policy_network_indicator",
":cr_policy_network_indicator_mojo",
]
}
}
......
......@@ -430,6 +430,31 @@ class OncMojo {
return value;
}
/**
* Policy indicators expect a per-property PolicySource, but sometimes we need
* to use the per-configuration OncSource (e.g. for unmanaged intrinsic
* properties like Security). This returns the corresponding PolicySource.
* @param {!chromeos.networkConfig.mojom.OncSource} source
* @return {!chromeos.networkConfig.mojom.PolicySource}
*/
static getEnforcedPolicySourceFromOncSource(source) {
const OncSource = chromeos.networkConfig.mojom.OncSource;
const PolicySource = chromeos.networkConfig.mojom.PolicySource;
switch (source) {
case OncSource.kNone:
case OncSource.kDevice:
case OncSource.kUser:
return PolicySource.kNone;
case OncSource.kDevicePolicy:
return PolicySource.kDevicePolicyEnforced;
case OncSource.kUserPolicy:
return PolicySource.kUserPolicyEnforced;
}
assert(source !== undefined, 'OncSource undefined');
assertNotReached('Invalid OncSource: ' + source.toString());
return PolicySource.kNone;
}
/**
* @param {!chromeos.networkConfig.mojom.NetworkType} type
* @return {string}
......
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