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_nameservers.js
blob6eb16657a16893b99c218d40bf934bf64fd96f56
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 network nameserver options.
7  */
8 Polymer({
9   is: 'network-nameservers',
11   properties: {
12     /**
13      * The current state containing the IP Config properties to display and
14      * modify.
15      * @type {?CrOnc.NetworkStateProperties}
16      */
17     networkState: {
18       type: Object,
19       value: null,
20       observer: 'networkStateChanged_'
21     },
23     /**
24      * Whether or not the nameservers can be edited.
25      */
26     editable: {
27       type: Boolean,
28       value: false
29     },
31     /**
32      * Array of nameserver addresses stored as strings.
33      * @type {!Array<string>}
34      */
35     nameservers: {
36       type: Array,
37       value: function() { return []; }
38     },
40     /**
41      * The selected nameserver type.
42      */
43     nameserversType: {
44       type: String,
45       value: 'automatic'
46     },
48     /**
49      * Array of nameserver types.
50      */
51     nameserverTypeNames_: {
52       type: Array,
53       value: ['automatic', 'google', 'custom'],
54       readOnly: true
55     },
56   },
58   /** @const */ GoogleNameservers: ['8.8.4.4', '8.8.8.8'],
60   /**
61    * Saved nameservers when switching to 'automatic'.
62    * @type {!Array<string>}
63    */
64   savedNameservers_: [],
66   /**
67    * Polymer networkState changed method.
68    */
69   networkStateChanged_: function(newValue, oldValue) {
70     if (!this.networkState)
71       return;
73     if (!oldValue || newValue.GUID != oldValue.GUID)
74       this.savedNameservers_ = [];
76     // Update the 'nameservers' property.
77     var nameservers = [];
78     var ipv4 = CrOnc.getIPConfigForType(this.networkState, CrOnc.IPType.IPV4);
79     if (ipv4 && ipv4.NameServers)
80       nameservers = ipv4.NameServers;
82     // Update the 'nameserversType' property.
83     var configType =
84         CrOnc.getActiveValue(this.networkState, 'NameServersConfigType');
85     var type;
86     if (configType == 'Static') {
87       if (nameservers.join(',') == this.GoogleNameservers.join(','))
88         type = 'google';
89       else
90         type = 'custom';
91     } else {
92       type = 'automatic';
93     }
94     this.nameserversType = type;
95     this.$$('#type').selectedIndex = this.getSelectedIndex_(type);
97     this.nameservers = nameservers;
98   },
100   /**
101    * @param {string} nameserversType The nameservers type.
102    * @return {number} The selected index for |nameserversType|.
103    * @private
104    */
105   getSelectedIndex_: function(nameserversType) {
106     var idx = this.nameserverTypeNames_.indexOf(nameserversType);
107     if (idx != -1)
108       return idx;
109     console.error('Unexpected type: ' + nameserversType);
110     return 0;
111   },
113   /**
114    * @param {string} nameserversType The nameservers type.
115    * @return {string} The description for |nameserversType|.
116    * @private
117    */
118   nameserverTypeDesc_: function(nameserversType) {
119     // TODO(stevenjb): Translate.
120     if (nameserversType == 'custom')
121       return 'Custom name servers';
122     if (nameserversType == 'google')
123       return 'Google name servers';
124     return 'Automatic name servers';
125   },
127   /**
128    * @param {boolean} editable The editable state.
129    * @param {string} nameserversType The nameservers type.
130    * @return {boolean} True if the nameservers are editable.
131    * @private
132    */
133   canEdit_: function(editable, nameserversType) {
134     return editable && nameserversType == 'custom';
135   },
137   /**
138    * Event triggered when the selected type changes. Updates nameservers and
139    * sends the change value if necessary.
140    * @param {Event} event The select node change event.
141    * @private
142    */
143   onTypeChange_: function(event) {
144     if (this.nameserversType == 'custom')
145       this.savedNameservers_ = this.nameservers;
146     var type = this.nameserverTypeNames_[event.target.selectedIndex];
147     this.nameserversType = type;
148     if (type == 'custom') {
149       if (this.savedNameservers_.length == 0)
150         return;  // Don't change nameservers until onValueChange_().
151       // Restore the saved nameservers and send them.
152       this.nameservers = this.savedNameservers_;
153     }
154     this.sendNameServers_();
155   },
157   /**
158    * Event triggered when a nameserver value changes.
159    * @private
160    */
161   onValueChange_: function() {
162     if (this.nameserversType != 'custom') {
163       // If a user inputs Google nameservers in the custom nameservers fields,
164       // |nameserversType| will change to 'google' so don't send the values.
165       return;
166     }
167     this.sendNameServers_();
168   },
170   /**
171    * Sends the current nameservers type (for automatic) or value.
172    * @private
173    */
174   sendNameServers_: function() {
175     var type = this.nameserversType;
177     var nameservers;
178     if (type == 'custom') {
179       nameservers = [];
180       for (var i = 0; i < 4; ++i) {
181         var id = 'nameserver' + i;
182         var nameserver = this.$$('#' + id).value;
183         if (nameserver)
184           nameservers.push(nameserver);
185       }
186       this.fire('nameservers-change', {
187         field: 'NameServers',
188         value: nameservers
189       });
190     } else if (type == 'google') {
191       nameservers = this.GoogleNameservers;
192       this.fire('nameservers-change', {
193         field: 'NameServers',
194         value: nameservers
195       });
196     } else {
197       // automatic
198       this.fire('nameservers-change', {
199         field: 'NameServersConfigType',
200         value: 'DHCP'
201       });
202     }
203   },