Pin Chrome's shortcut to the Win10 Start menu on install and OS upgrade.
[chromium-blink-merge.git] / chrome / browser / resources / settings / internet_page / network_ip_config.js
blobffae0b1d345702dcd13d7c818839d7f11a2c3bfd
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 Polymer({
11   is: 'network-ip-config',
13   properties: {
14     /**
15      * The current state containing the IP Config properties to display and
16      * modify.
17      * @type {?CrOnc.NetworkStateProperties}
18      */
19     networkState: {
20       type: Object,
21       value: null,
22       observer: 'networkStateChanged_'
23     },
25     /**
26      * Whether or not the IP Address can be edited.
27      * TODO(stevenjb): Implement editing.
28      */
29     editable: {
30       type: Boolean,
31       value: false
32     },
34     /**
35      * State of 'Configure IP Addresses Automatically'.
36      */
37     automatic: {
38       type: Boolean,
39       value: false,
40       observer: 'automaticChanged_'
41     },
43     /**
44      * The currently visible IP Config property dictionary. The 'RoutingPrefix'
45      * property is a human-readable mask instead of a prefix length.
46      * @type {{
47      *   ipv4: !CrOnc.IPConfigUIProperties,
48      *   ipv6: !CrOnc.IPConfigUIProperties
49      * }}
50      */
51     ipConfig: {
52       type: Object,
53       value: function() { return {ipv4: {}, ipv6: {}}; }
54     },
56     /**
57      * Array of properties to pass to the property list.
58      * @type {!Array<string>}
59      */
60     ipConfigFields_: {
61       type: Array,
62       value: function() {
63         return [
64           'ipv4.IPAddress',
65           'ipv4.RoutingPrefix',
66           'ipv4.Gateway',
67           'ipv6.IPAddress'
68         ];
69       },
70       readOnly: true
71     },
72   },
74   /**
75    * Saved static IP configuration properties when switching to 'automatic'.
76    * @type {?CrOnc.IPConfigUIProperties}
77    */
78   savedStaticIp_: null,
80   /**
81    * Polymer networkState changed method.
82    */
83   networkStateChanged_: function(newValue, oldValue) {
84     if (this.networkState === undefined || this.ipConfig === undefined)
85       return;
87     if (newValue.GUID != (oldValue && oldValue.GUID))
88       this.savedStaticIp_ = null;
90     // Update the 'automatic' property.
91     var ipConfigType =
92         CrOnc.getActiveValue(this.networkState, 'IPAddressConfigType');
93     this.automatic = (ipConfigType != CrOnc.IPConfigType.STATIC);
95     // Update the 'ipConfig' property.
96     var ipv4 = CrOnc.getIPConfigForType(this.networkState, CrOnc.IPType.IPV4);
97     var ipv6 = CrOnc.getIPConfigForType(this.networkState, CrOnc.IPType.IPV6);
98     this.ipConfig = {
99       ipv4: this.getIPConfigUIProperties_(ipv4),
100       ipv6: this.getIPConfigUIProperties_(ipv6)
101     };
102   },
104   /**
105    * Polymer automatic changed method.
106    */
107   automaticChanged_: function() {
108     if (this.automatic === undefined || this.ipConfig === undefined)
109       return;
110     if (this.automatic || !this.savedStaticIp_) {
111       // Save the static IP configuration when switching to automatic.
112       this.savedStaticIp_ = this.ipConfig.ipv4;
113       this.fire('ip-change', {
114         field: 'IPAddressConfigType',
115         value: this.automatic ? 'DHCP' : 'Static'
116       });
117     } else {
118       // Restore the saved static IP configuration.
119       var ipconfig = {
120         Gateway: this.savedStaticIp_.Gateway,
121         IPAddress: this.savedStaticIp_.IPAddress,
122         RoutingPrefix: this.savedStaticIp_.RoutingPrefix,
123         Type: this.savedStaticIp_.Type
124       };
125       this.fire('ip-change', {
126         field: 'StaticIPConfig',
127         value: this.getIPConfigProperties_(ipconfig)
128       });
129     }
130   },
132   /**
133    * @param {?CrOnc.IPConfigProperties} ipconfig The IP Config properties.
134    * @return {!CrOnc.IPConfigUIProperties} A new IPConfigUIProperties object
135    *     with RoutingPrefix expressed as a string mask instead of a prefix
136    *     length. Returns an empty object if |ipconfig| is undefined.
137    * @private
138    */
139   getIPConfigUIProperties_: function(ipconfig) {
140     var result = {};
141     if (!ipconfig)
142       return result;
143     for (var key in ipconfig) {
144       var value = ipconfig[key];
145       if (key == 'RoutingPrefix')
146         result.RoutingPrefix = CrOnc.getRoutingPrefixAsNetmask(value);
147       else
148         result[key] = value;
149     }
150     return result;
151   },
153   /**
154    * @param {!CrOnc.IPConfigUIProperties} ipconfig The IP Config UI properties.
155    * @return {!CrOnc.IPConfigProperties} A new IPConfigProperties object with
156    *     RoutingPrefix expressed as a a prefix length.
157    * @private
158    */
159   getIPConfigProperties_: function(ipconfig) {
160     var result = {};
161     for (var key in ipconfig) {
162       var value = ipconfig[key];
163       if (key == 'RoutingPrefix')
164         result.RoutingPrefix = CrOnc.getRoutingPrefixAsLength(value);
165       else
166         result[key] = value;
167     }
168     return result;
169   },
171   /**
172    * @param {!CrOnc.IPConfigUIProperties} ipConfig The IP Config properties.
173    * @param {boolean} editable The editable property.
174    * @param {boolean} automatic The automatic property.
175    * @return {Object} An object with the edit type for each editable field.
176    * @private
177    */
178   getIPEditFields_: function(ipConfig, editable, automatic) {
179     if (!editable || automatic)
180       return {};
181     return {
182       'ipv4.IPAddress': 'String',
183       'ipv4.RoutingPrefix': 'String',
184       'ipv4.Gateway': 'String'
185     };
186   },
188   /**
189    * Event triggered when the network property list changes.
190    * @param {!{detail: { field: string, value: string}}} event The
191    *     network-property-list change event.
192    * @private
193    */
194   onIPChange_: function(event) {
195     var field = event.detail.field;
196     var value = event.detail.value;
197     // Note: |field| includes the 'ipv4.' prefix.
198     this.set('ipConfig.' + field, value);
199     this.fire('ip-change', {
200       field: 'StaticIPConfig',
201       value: this.getIPConfigProperties_(this.ipConfig.ipv4)
202     });
203   },