forked from mozilla-b2g/gaia
-
Notifications
You must be signed in to change notification settings - Fork 0
/
authentication_dialog.js
135 lines (105 loc) · 3.98 KB
/
authentication_dialog.js
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
'use strict';
var AuthenticationDialog = {
_confirmed: {},
// Get all elements when inited.
getAllElements: function ad_getAllElements() {
var toCamelCase = function toCamelCase(str) {
return str.replace(/\-(.)/g, function replacer(str, p1) {
return p1.toUpperCase();
});
};
var elementIDs = [
'http-authentication-dialog', 'http-authentication-username',
'http-authentication-password', 'http-authentication-message',
'http-authentication-ok', 'http-authentication-cancel'];
// Loop and add element with camel style name to Modal Dialog attribute.
elementIDs.forEach(function createElementRef(name) {
this[toCamelCase(name)] = document.getElementById(name);
}, this);
},
currentEvents: {},
init: function ad_init(bindToWindow) {
// Get all elements initially.
this.getAllElements();
var elements = this.elements;
this.boundToWindow = bindToWindow || false;
this.httpAuthenticationOk.addEventListener('click', this);
this.httpAuthenticationCancel.addEventListener('click', this);
},
// Default event handler
handleEvent: function ad_handleEvent(evt, origin) {
switch (evt.type) {
case 'mozbrowserusernameandpasswordrequired':
evt.preventDefault();
this.currentEvents[origin] = evt;
// Show authentication dialog only if
// the frame is currently displayed.
this.show(origin);
break;
case 'click':
if (evt.currentTarget === this.httpAuthenticationCancel) {
this.cancelHandler();
} else {
this.confirmHandler();
}
break;
}
},
// Show dialog and set message
show: function ad_show(origin) {
this.currentOrigin = origin;
var evt = this.currentEvents[origin];
var message = evt.detail.message;
this.httpAuthenticationDialog.classList.remove('hidden');
var _ = navigator.mozL10n.get;
// XXX: We don't have a better way to detect login failed.
if (this._confirmed[origin]) {
message = _('the-username-or-password-is-incorrect');
this.httpAuthenticationMessage.classList.add('error');
} else {
var l10nArgs = { host: evt.detail.host };
message = _('http-authentication-message', l10nArgs);
this.httpAuthenticationMessage.classList.remove('error');
}
this.httpAuthenticationMessage.textContent = message;
this.httpAuthenticationUsername.value = '';
this.httpAuthenticationPassword.value = '';
this.httpAuthenticationUsername.focus();
},
hide: function ad_hide() {
var evt = this.currentEvents[this.currentOrigin];
if (!evt)
return;
this.httpAuthenticationDialog.classList.add('hidden');
this.currentOrigin = null;
},
// When user clicks OK button on authentication dialog
confirmHandler: function ad_confirmHandler() {
var evt = this.currentEvents[this.currentOrigin];
evt.detail.authenticate(this.httpAuthenticationUsername.value,
this.httpAuthenticationPassword.value);
this.httpAuthenticationDialog.classList.add('hidden');
// To remember we had ever logged in.
this._confirmed[this.currentOrigin] = true;
delete this.currentEvents[this.currentOrigin];
},
// When user clicks cancel button on authentication dialog or
// when the user try to escape the dialog with the escape key
cancelHandler: function ad_cancelHandler() {
var evt = this.currentEvents[this.currentOrigin];
evt.detail.cancel();
if (this._confirmed[this.currentOrigin])
delete this._confirmed[this.currentOrigin];
delete this.currentEvents[this.currentOrigin];
this.httpAuthenticationDialog.classList.add('hidden');
},
originHasEvent: function(origin) {
return origin in this.currentEvents;
},
clear: function ad_clear(origin) {
if (this.currentEvents[origin])
delete this.currentEvents[origin];
}
};