| Index: LayoutTests/fast/forms/form-request-autocomplete.html
|
| diff --git a/LayoutTests/fast/forms/form-request-autocomplete.html b/LayoutTests/fast/forms/form-request-autocomplete.html
|
| index 7c3b99a9b245e3a96c71765cf3a804f081602114..9039dfbdf44fb8a9e4f6786103b2a5ef62b5b595 100644
|
| --- a/LayoutTests/fast/forms/form-request-autocomplete.html
|
| +++ b/LayoutTests/fast/forms/form-request-autocomplete.html
|
| @@ -6,65 +6,71 @@
|
| jsTestIsAsync = true;
|
|
|
| var numErrors = 0;
|
| -var numErrorsExpected = 4;
|
| +var numErrorsExpected = 5;
|
| var eventsBubbleToBody = false;
|
| var eventsBubbleToDocument = false;
|
| var eventsBubbleToWindow = false;
|
| +var eventReason = '';
|
| +var promiseFired = false;
|
| +
|
| +function debugMsg(msg)
|
| +{
|
| + debug('DEBUG ' + msg);
|
| +}
|
|
|
| function runTests()
|
| {
|
| checkDynamicAttributes();
|
| - checkNonUserGesture();
|
| checkParsedAttributes();
|
| checkEventsBubble();
|
| + checkPromiseRejects();
|
| + checkNonUserGesture();
|
| + debugMsg('finished runs tests, waiting for results');
|
| +}
|
| +
|
| +function debugStart()
|
| +{
|
| + debugMsg(arguments.callee.caller.name + ' running');
|
| }
|
|
|
| function checkForEnumerableProperties(form)
|
| {
|
| - var enumerable = {};
|
| - for (var field in form)
|
| - enumerable[field] = true;
|
| - if (!enumerable.onautocomplete)
|
| + if (!('onautocomplete' in form))
|
| testFailed('failed to enumerate HTMLFormElement.onautocomplete');
|
| - if (!enumerable.onautocompleteerror)
|
| +
|
| + if (!('onautocompleteerror' in form))
|
| testFailed('failed to enumerate HTMLFormElement.onautocompleteerror');
|
| +
|
| testPassed('found enumerable properties on HTMLFormElement');
|
| }
|
|
|
| function checkDynamicAttributes()
|
| {
|
| + debugStart();
|
| +
|
| var form = document.createElement('form');
|
| checkForEnumerableProperties(form);
|
| -
|
| - form.autocomplete = 'off';
|
| form.addEventListener('autocompleteerror', errorWithReason('disabled'));
|
| + form.autocomplete = 'off';
|
| form.requestAutocomplete();
|
| }
|
|
|
| -function checkNonUserGesture()
|
| -{
|
| - var form = document.createElement('form');
|
| - checkForEnumerableProperties(form);
|
| - form.onautocompleteerror = errorWithReason('disabled');
|
| -
|
| - setTimeout(function()
|
| - {
|
| - form.requestAutocomplete();
|
| - }, 0);
|
| -}
|
| -
|
| function checkParsedAttributes()
|
| {
|
| + debugStart();
|
| +
|
| var form = document.forms[0];
|
| + checkForEnumerableProperties(form);
|
| if (!form || !form.onautocompleteerror || form.autocomplete != 'off')
|
| testFailed('failed to pick up parsed DOM attributes correctly');
|
| - checkForEnumerableProperties(form);
|
|
|
| form.requestAutocomplete();
|
| }
|
|
|
| function checkEventsBubble()
|
| {
|
| + debugStart();
|
| +
|
| var form = document.createElement('form');
|
| form.autocomplete = 'off';
|
|
|
| @@ -92,9 +98,44 @@ function checkEventsBubble()
|
| form.requestAutocomplete();
|
| }
|
|
|
| +function checkPromiseRejects()
|
| +{
|
| + debugStart();
|
| +
|
| + var form = document.createElement('form');
|
| + form.autocomplete = 'off';
|
| +
|
| + form.onautocompleteerror = function(e) {
|
| + eventReason = e.reason;
|
| + };
|
| +
|
| + var promise = form.requestAutocomplete();
|
| + if (promise instanceof Promise)
|
| + testPassed('requestAutocomplete() returns a Promise');
|
| + else
|
| + testFailed('expected requestAutocomplete() to return a Promise');
|
| +
|
| + promise.catch(objectWithReason('disabled'));
|
| +}
|
| +
|
| +function checkNonUserGesture()
|
| +{
|
| + debugStart();
|
| +
|
| + var form = document.createElement('form');
|
| + form.onautocompleteerror = errorWithReason('disabled');
|
| +
|
| + setTimeout(function() {
|
| + form.requestAutocomplete();
|
| + });
|
| +}
|
| +
|
| function errorWithReason(reason)
|
| {
|
| + var from = arguments.callee.caller.name;
|
| return function(event) {
|
| + debugMsg('handling error from ' + from);
|
| +
|
| if (event instanceof AutocompleteErrorEvent)
|
| testPassed('event is an AutocompleteErrorEvent');
|
| else
|
| @@ -109,20 +150,52 @@ function errorWithReason(reason)
|
| };
|
| }
|
|
|
| +function objectWithReason(reason)
|
| +{
|
| + return function(result) {
|
| + if (promiseFired) {
|
| + testFailed('Promise.catch() fired too many times');
|
| + return;
|
| + }
|
| + promiseFired = true;
|
| +
|
| + if (!eventReason)
|
| + testFailed('events should dispatch before Promises are resolved');
|
| +
|
| + if (!(result instanceof Error))
|
| + testFailed('expected Promise argument to be an result');
|
| +
|
| + if (!('reason' in result))
|
| + testFailed('Promise result has no "reason" key');
|
| +
|
| + if (result.reason != eventReason)
|
| + testFailed('wrong reason, expected: ' + promiseResult.expectedReason + ', got: ' + promiseResult.actualReason);
|
| +
|
| + onError();
|
| + };
|
| +}
|
| +
|
| function onError()
|
| {
|
| numErrors += 1;
|
| - if (numErrors > numErrorsExpected) {
|
| - testFailed('too many error events');
|
| - } else if (numErrors == numErrorsExpected) {
|
| + 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');
|
| +
|
| + if (promiseFired)
|
| + testPassed('Promise.catch() fired');
|
| + else
|
| + testFailed('Promise.catch() never fired');
|
| +
|
| testPassed('got expected number of error events (' + numErrorsExpected + ')');
|
| finishJSTest();
|
| }
|
|
|