Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / chrome / browser / resources / settings / internet_page / network_ip_config.js
blob43ec02990f6b3ed0ee7ee3e896f775ad3e6dc6d8
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 /**
6  * @fileoverview Polymer element for displaying the IP Config properties for
7  * a network state. TODO(stevenjb): Allow editing of static IP configurations
8  * when 'editable' is true.
9  */
10 (function() {
11 'use strict';
13 Polymer({
14   is: 'network-ip-config',
16   properties: {
17     /**
18      * The current state containing the IP Config properties to display and
19      * modify.
20      * @type {?CrOnc.NetworkStateProperties}
21      */
22     networkState: {
23       type: Object,
24       value: null,
25       observer: 'networkStateChanged_'
26     },
28     /**
29      * Whether or not the IP Address can be edited.
30      * TODO(stevenjb): Implement editing.
31      */
32     editable: {
33       type: Boolean,
34       value: false
35     },
37     /**
38      * State of 'Configure IP Addresses Automatically'.
39      */
40     automatic: {
41       type: Boolean,
42       value: false,
43       observer: 'automaticChanged_'
44     },
46     /**
47      * The currently visible IP Config property dictionary. The 'RoutingPrefix'
48      * property is a human-readable mask instead of a prefix length.
49      * @type {?{
50      *   ipv4: !CrOnc.IPConfigUIProperties,
51      *   ipv6: !CrOnc.IPConfigUIProperties
52      * }}
53      */
54     ipConfig: {
55       type: Object,
56       value: null
57     },
59     /**
60      * Array of properties to pass to the property list.
61      * @type {!Array<string>}
62      */
63     ipConfigFields_: {
64       type: Array,
65       value: function() {
66         return [
67           'ipv4.IPAddress',
68           'ipv4.RoutingPrefix',
69           'ipv4.Gateway',
70           'ipv6.IPAddress'
71         ];
72       },
73       readOnly: true
74     },
75   },
77   /**
78    * Saved static IP configuration properties when switching to 'automatic'.
79    * @type {?CrOnc.IPConfigUIProperties}
80    */
81   savedStaticIp_: null,
83   /**
84    * Polymer networkState changed method.
85    */
86   networkStateChanged_: function(newValue, oldValue) {
87     if (!this.networkState || !this.ipConfig)
88       return;
90     if (newValue.GUID != (oldValue && oldValue.GUID))
91       this.savedStaticIp_ = null;
93     // Update the 'automatic' property.
94     var ipConfigType =
95         CrOnc.getActiveValue(this.networkState, 'IPAddressConfigType');
96     this.automatic = (ipConfigType != CrOnc.IPConfigType.STATIC);
98     // Update the 'ipConfig' property.
99     var ipv4 = CrOnc.getIPConfigForType(this.networkState, CrOnc.IPType.IPV4);
100     var ipv6 = CrOnc.getIPConfigForType(this.networkState, CrOnc.IPType.IPV6);
101     this.ipConfig = {
102       ipv4: this.getIPConfigUIProperties_(ipv4),
103       ipv6: this.getIPConfigUIProperties_(ipv6)
104     };
105   },
107   /**
108    * Polymer automatic changed method.
109    */
110   automaticChanged_: function() {
111     if (!this.automatic || !this.ipConfig)
112       return;
113     if (this.automatic || !this.savedStaticIp_) {
114       // Save the static IP configuration when switching to automatic.
115       this.savedStaticIp_ = this.ipConfig.ipv4;
116       var configType =
117           this.automatic ? CrOnc.IPConfigType.DHCP : CrOnc.IPConfigType.STATIC;
118       this.fire('ip-change', {
119         field: 'IPAddressConfigType',
120         value: configType
121       });
122     } else {
123       // Restore the saved static IP configuration.
124       var ipconfig = {
125         Gateway: this.savedStaticIp_.Gateway,
126         IPAddress: this.savedStaticIp_.IPAddress,
127         RoutingPrefix: this.savedStaticIp_.RoutingPrefix,
128         Type: this.savedStaticIp_.Type
129       };
130       this.fire('ip-change', {
131         field: 'StaticIPConfig',
132         value: this.getIPConfigProperties_(ipconfig)
133       });
134     }
135   },
137   /**
138    * @param {?CrOnc.IPConfigProperties} ipconfig The IP Config properties.
139    * @return {!CrOnc.IPConfigUIProperties} A new IPConfigUIProperties object
140    *     with RoutingPrefix expressed as a string mask instead of a prefix
141    *     length. Returns an empty object if |ipconfig| is undefined.
142    * @private
143    */
144   getIPConfigUIProperties_: function(ipconfig) {
145     var result = {};
146     if (!ipconfig)
147       return result;
148     for (let key in ipconfig) {
149       let value = ipconfig[key];
150       if (key == 'RoutingPrefix')
151         result.RoutingPrefix = CrOnc.getRoutingPrefixAsNetmask(value);
152       else
153         result[key] = value;
154     }
155     return result;
156   },
158   /**
159    * @param {!CrOnc.IPConfigUIProperties} ipconfig The IP Config UI properties.
160    * @return {!CrOnc.IPConfigProperties} A new IPConfigProperties object with
161    *     RoutingPrefix expressed as a a prefix length.
162    * @private
163    */
164   getIPConfigProperties_: function(ipconfig) {
165     var result = {};
166     for (let key in ipconfig) {
167       let value = ipconfig[key];
168       if (key == 'RoutingPrefix')
169         result.RoutingPrefix = CrOnc.getRoutingPrefixAsLength(value);
170       else
171         result[key] = value;
172     }
173     return result;
174   },
176   /**
177    * @param {!CrOnc.IPConfigUIProperties} ipConfig The IP Config properties.
178    * @param {boolean} editable The editable property.
179    * @param {boolean} automatic The automatic property.
180    * @return {Object} An object with the edit type for each editable field.
181    * @private
182    */
183   getIPEditFields_: function(ipConfig, editable, automatic) {
184     if (!editable || automatic)
185       return {};
186     return {
187       'ipv4.IPAddress': 'String',
188       'ipv4.RoutingPrefix': 'String',
189       'ipv4.Gateway': 'String'
190     };
191   },
193   /**
194    * Event triggered when the network property list changes.
195    * @param {!{detail: { field: string, value: string}}} event The
196    *     network-property-list change event.
197    * @private
198    */
199   onIPChange_: function(event) {
200     if (!this.ipConfig)
201       return;
202     var field = event.detail.field;
203     var value = event.detail.value;
204     // Note: |field| includes the 'ipv4.' prefix.
205     this.set('ipConfig.' + field, value);
206     this.fire('ip-change', {
207       field: 'StaticIPConfig',
208       value: this.getIPConfigProperties_(this.ipConfig.ipv4)
209     });
210   },
212 })();