summaryrefslogtreecommitdiffstats
path: root/chrome/browser/resources/options/chromeos_accounts_user_name_edit.js
blob: 33b5308928b651f503dd13dfd089493064f43154 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

cr.define('options.accounts', function() {
  const Event = cr.Event;

  // Email alias only, assuming it's a gmail address.
  //   e.g. 'john'
  //        {name: 'john', email: 'john@gmail.com'}
  const format1String =
      '^\\s*([\\w\\.!#\\$%&\'\\*\\+-\\/=\\?\\^`\\{\\|\\}~]+)\\s*$';
  // Email address only.
  //   e.g. 'john@chromium.org'
  //        {name: 'john', email: 'john@chromium.org'}
  const format2String =
      '^\\s*([\\w\\.!#\\$%&\'\\*\\+-\\/=\\?\\^`\\{\\|\\}~]+)@(\\w+\\..+)\\s*$';
  // Full format.
  //   e.g. '"John Doe" <john@chromium.org>'
  //        {name: 'John doe', email: 'john@chromium.org'}
  const format3String =
      '^\\s*"{0,1}([^"]+)"{0,1}\\s*<([^@]+@\\w+\\..+)>\\s*$';

  /**
   * Creates a new user name edit element.
   * @param {Object=} opt_propertyBag Optional properties.
   * @constructor
   * @extends {HTMLInputElement}
   */
  var UserNameEdit = cr.ui.define('input');

  UserNameEdit.prototype = {
    __proto__: HTMLInputElement.prototype,

    /**
     * Called when an element is decorated as a user name edit.
     */
    decorate: function() {
      this.pattern = format1String + '|' + format2String + '|' +
                     format3String;

      this.onkeypress = cr.bind(this.handleKeyPress_, this);
    },


    /**
     * Parses given str for user info.
     *
     * Note that the email parsing is based on RFC 5322 and does not support
     * IMA (Internationalized Email Address). We take only the following chars
     * as valid for an email alias (aka local-part):
     *   - Letters: a–z, A–Z
     *   - Digits: 0-9
     *   - Characters: ! # $ % & ' * + - / = ? ^ _ ` { | } ~
     *   - Dot: . (Note that we did not cover the cases that dot should not
     *       appear as first or last character and should not appear two or
     *       more times in a row.)
     *
     * @param {string} str A string to parse.
     * @return {Object} User info parsed from the string.
     */
    parse: function(str) {
      const format1 = new RegExp(format1String);
      const format2 = new RegExp(format2String);
      const format3 = new RegExp(format3String);

      var matches = format1.exec(str);
      if (matches) {
        return {
          name: matches[1],
          email: matches[1] + '@gmail.com',
          owner:false
        };
      }

      matches = format2.exec(str);
      if (matches) {
        return {
          name: matches[1],
          email: matches[1] + '@' + matches[2],
          owner:false
        };
      }

      matches = format3.exec(str);
      if (matches) {
        return {
          name: matches[1],
          email: matches[2],
          owner:false
        };
      }

      return null;
    },

    /**
     * Handler for key press event.
     * @private
     * @param {!Event} e The keypress event object.
     */
    handleKeyPress_: function(e) {
      // Enter
      if (e.keyCode == 13) {
        var user = this.parse(this.value);
        if (user) {
          var e = new Event('add');
          e.user = user;
          this.dispatchEvent(e);
        }

        this.select();
      }
    }
  };

  return {
    UserNameEdit: UserNameEdit
  };
});