blob: 7c3b99a9b245e3a96c71765cf3a804f081602114 (
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test.js"></script>
<script>
jsTestIsAsync = true;
var numErrors = 0;
var numErrorsExpected = 4;
var eventsBubbleToBody = false;
var eventsBubbleToDocument = false;
var eventsBubbleToWindow = false;
function runTests()
{
checkDynamicAttributes();
checkNonUserGesture();
checkParsedAttributes();
checkEventsBubble();
}
function checkForEnumerableProperties(form)
{
var enumerable = {};
for (var field in form)
enumerable[field] = true;
if (!enumerable.onautocomplete)
testFailed('failed to enumerate HTMLFormElement.onautocomplete');
if (!enumerable.onautocompleteerror)
testFailed('failed to enumerate HTMLFormElement.onautocompleteerror');
testPassed('found enumerable properties on HTMLFormElement');
}
function checkDynamicAttributes()
{
var form = document.createElement('form');
checkForEnumerableProperties(form);
form.autocomplete = 'off';
form.addEventListener('autocompleteerror', errorWithReason('disabled'));
form.requestAutocomplete();
}
function checkNonUserGesture()
{
var form = document.createElement('form');
checkForEnumerableProperties(form);
form.onautocompleteerror = errorWithReason('disabled');
setTimeout(function()
{
form.requestAutocomplete();
}, 0);
}
function checkParsedAttributes()
{
var form = document.forms[0];
if (!form || !form.onautocompleteerror || form.autocomplete != 'off')
testFailed('failed to pick up parsed DOM attributes correctly');
checkForEnumerableProperties(form);
form.requestAutocomplete();
}
function checkEventsBubble()
{
var form = document.createElement('form');
form.autocomplete = 'off';
document.body.onautocompleteerror = function(event) {
eventsBubbleToBody = true;
if (event.target == form) {
event.stopPropagation();
setTimeout(onError);
}
};
document.onautocompleteerror = function(event) {
eventsBubbleToDocument = true;
if (event.target == form)
testFailed("event should've been cancelled");
};
window.onautocompleteerror = function(event) {
eventsBubbleToWindow = true;
if (event.target == form)
testFailed("event should've been cancelled");
};
document.body.appendChild(form);
form.requestAutocomplete();
}
function errorWithReason(reason)
{
return function(event) {
if (event instanceof AutocompleteErrorEvent)
testPassed('event is an AutocompleteErrorEvent');
else
testFailed('expected an AutocompleteErrorEvent');
if (event.reason == reason)
testPassed('got expected reason: ' + reason);
else
testFailed('wrong reason, expected: ' + reason + ', got: ' + event.reason);
onError();
};
}
function onError()
{
numErrors += 1;
if (numErrors > numErrorsExpected) {
testFailed('too many error events');
} else if (numErrors == numErrorsExpected) {
if (!eventsBubbleToBody)
testFailed('no events bubbled to body');
if (!eventsBubbleToDocument)
testFailed('no events bubbled to document');
if (!eventsBubbleToWindow)
testFailed('no events bubbled to window');
if (eventsBubbleToBody && eventsBubbleToDocument && eventsBubbleToWindow)
testPassed('events bubbled as expected');
testPassed('got expected number of error events (' + numErrorsExpected + ')');
finishJSTest();
}
}
window.addEventListener('load', runTests, true);
</script>
</head>
<body>
<p> <a href="https://code.google.com/p/chromium/issues/detail?id=159537">HTMLFormElement#requestAutocomplete and associated events</a> </p>
<p> For this test to pass, you should see all PASSED below. </p>
<form autocomplete="off" onautocompleteerror="onError();"></form>
<p id="console"></p>
</body>
</html>
|