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
};
});
|