15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cr.define('options.internet', function() { 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** @const */ var EditableTextField = options.EditableTextField; 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The regular expression that matches an IP address. String to match against 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * should have all whitespace stripped already. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @const 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type {RegExp} 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var singleIp_ = /^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$/; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates a new field specifically for entering IP addresses. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @constructor 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @extends {options.EditableTextField} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function IPAddressField() { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var el = cr.doc.createElement('div'); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPAddressField.decorate(el); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return el; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Decorates an element as a inline-editable list item. Note that this is 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a subclass of IPAddressField. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {!HTMLElement} el The element to decorate. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPAddressField.decorate = function(el) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.__proto__ = IPAddressField.prototype; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) el.decorate(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPAddressField.prototype = { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __proto__: EditableTextField.prototype, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** @override */ 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decorate: function() { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EditableTextField.prototype.decorate.call(this); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Indicates whether or not empty values are allowed. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @type {boolean} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get allowEmpty() { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this.hasAttribute('allow-empty'); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** @override */ 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get currentInputIsValid() { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!this.editField.value && this.allowEmpty) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure it's only got numbers and ".", there are the correct 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // count of them, and they are all within the correct range. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var fieldValue = this.editField.value.replace(/\s/g, ''); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var matches = singleIp_.exec(fieldValue); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var rangeCorrect = true; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (matches != null) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = 1; i < matches.length; ++i) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var value = parseInt(matches[i], 10); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value < 0 || value > 255) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rangeCorrect = false; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this.editField.validity.valid && matches != null && 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rangeCorrect && matches.length == 5; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** @override */ 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get hasBeenEdited() { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this.editField.value != this.model.value; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Overrides superclass to mutate the input during a successful commit. For 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the purposes of entering IP addresses, this just means stripping off 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * whitespace and leading zeros from each of the octets so that they conform 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to the normal format for IP addresses. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @override 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {string} value Input IP address to be mutated. 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @return {string} mutated IP address. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mutateInput: function(value) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var fieldValue = value.replace(/\s/g, ''); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var matches = singleIp_.exec(fieldValue); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var result = []; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we got this far, matches shouldn't be null, but make sure. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (matches != null) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // starting at one because the first match element contains the entire 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // match, and we don't care about that. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = 1; i < matches.length; ++i) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.push(parseInt(matches[i], 10)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result.join('.'); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPAddressField: IPAddressField, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}); 113