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