Chromium Code Reviews| 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..1342f0e71d3cd22417d166d0f8e773815cf1ec03 100644 |
| --- a/LayoutTests/fast/forms/form-request-autocomplete.html |
| +++ b/LayoutTests/fast/forms/form-request-autocomplete.html |
| @@ -6,17 +6,29 @@ |
| jsTestIsAsync = true; |
| var numErrors = 0; |
| -var numErrorsExpected = 4; |
| +var numErrorsExpected = 5; |
| var eventsBubbleToBody = false; |
| var eventsBubbleToDocument = false; |
| var eventsBubbleToWindow = false; |
| +function debugMsg(msg) |
| +{ |
| + debug('DEBUG ' + msg); |
| +} |
| + |
| function runTests() |
| { |
| checkDynamicAttributes(); |
| - checkNonUserGesture(); |
| checkParsedAttributes(); |
| checkEventsBubble(); |
| + checkPromiseRejects(); |
|
yhirano
2014/04/17 10:57:48
Can you serialize the tests using Promises?
Otherw
Dan Beam
2014/04/17 23:02:04
Done. (order doesn't matter now)
|
| + checkNonUserGesture(); |
| + debugMsg('finished running synchronous code'); |
| +} |
| + |
| +function debugStart() |
| +{ |
| + debugMsg(arguments.callee.caller.name + ' running'); |
| } |
| function checkForEnumerableProperties(form) |
| @@ -33,6 +45,8 @@ function checkForEnumerableProperties(form) |
| function checkDynamicAttributes() |
| { |
| + debugStart(); |
| + |
| var form = document.createElement('form'); |
| checkForEnumerableProperties(form); |
| @@ -41,20 +55,10 @@ function checkDynamicAttributes() |
| 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]; |
| if (!form || !form.onautocompleteerror || form.autocomplete != 'off') |
| testFailed('failed to pick up parsed DOM attributes correctly'); |
| @@ -65,6 +69,8 @@ function checkParsedAttributes() |
| function checkEventsBubble() |
| { |
| + debugStart(); |
| + |
| var form = document.createElement('form'); |
| form.autocomplete = 'off'; |
| @@ -92,9 +98,52 @@ function checkEventsBubble() |
| form.requestAutocomplete(); |
| } |
| +function checkPromiseRejects() |
| +{ |
| + debugStart(); |
| + |
| + var form = document.createElement('form'); |
| + form.autocomplete = 'off'; |
| + |
| + var eventDispatched = false; |
| + form.onautocompleteerror = function() { |
| + eventDispatched = true; |
| + }; |
| + |
| + 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')); |
| + promise.catch(function() { |
| + if (eventDispatched) |
| + testPassed('Promises were fullfilled after events were dispatched'); |
| + else |
| + testFailed('events should be dispatched before Promises are resolved'); |
| + }); |
| +} |
| + |
| +function checkNonUserGesture() |
| +{ |
| + debugStart(); |
| + |
| + var form = document.createElement('form'); |
| + checkForEnumerableProperties(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 +158,47 @@ function errorWithReason(reason) |
| }; |
| } |
| +function objectWithReason(reason) |
| +{ |
| + var from = arguments.callee.caller.name; |
| + return function(result) { |
| + debugMsg('handling error from ' + from); |
| + |
| + if (result instanceof Error) |
| + testPassed('Promise received an Error result'); |
| + else |
| + testFailed('expected Promise argument to be an result'); |
| + |
| + if ('reason' in result) |
| + testPassed('Promise result has "reason" key'); |
| + else |
| + testFailed('Promise result has no "reason" key'); |
| + |
| + if (result.reason == reason) |
| + testPassed('got expected reason: ' + reason); |
| + else |
| + testFailed('wrong reason, expected: ' + reason + ', got: ' + result.error); |
| + |
| + 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'); |
| + |
| testPassed('got expected number of error events (' + numErrorsExpected + ')'); |
| finishJSTest(); |
| } |