| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <title>action_test.html</title> | |
| <link rel="stylesheet" href="/filez/_main/third_party/js/qunit/qunit.css"> | |
| <script src="/filez/_main/third_party/js/qunit/qunit.js"></script> | |
| <script src="/filez/_main/third_party/js/qunit/qunit_test_runner.js"></script> | |
| <script src="test_bootstrap.js"></script> | |
| <script type="text/javascript"> | |
| goog.require('bot.action'); | |
| goog.require('bot.locators'); | |
| goog.require('goog.Promise'); | |
| goog.require('goog.Uri'); | |
| goog.require('goog.dom'); | |
| goog.require('goog.dom.forms'); | |
| goog.require('goog.events'); | |
| goog.require('goog.events.EventType'); | |
| </script> | |
| <script type="text/javascript"> | |
| var submitted = goog.nullFunction; | |
| var counts; | |
| var listeningTo; | |
| var CONTENT_EDITABLE_HTML = 'This is a contentEditable area\n <div id="child-content-editable">child content editable\n </div>\n '; | |
| QUnit.testStart(function() { | |
| counts = {}; | |
| listeningTo = []; | |
| }); | |
| QUnit.testDone(function() { | |
| while (listeningTo.length) { | |
| goog.events.removeAll(listeningTo.shift()); | |
| } | |
| submitted = goog.nullFunction; | |
| // Restore contentEditable area after tests that clear it | |
| var contentEditable = goog.dom.getElement('content-editable'); | |
| if (contentEditable) { | |
| contentEditable.innerHTML = CONTENT_EDITABLE_HTML; | |
| } | |
| }); | |
| function expectAndCancelEvent(eventType, expectedTarget, assert) { | |
| counts[eventType] = 0; | |
| listeningTo.push(expectedTarget); | |
| goog.events.listen(expectedTarget, eventType, | |
| function(e) { | |
| assert.strictEqual(e.target, expectedTarget, | |
| 'Not the expected ' + eventType + ' event target'); | |
| e.stopPropagation(); | |
| e.preventDefault(); | |
| counts[eventType] += 1; | |
| }); | |
| } | |
| function expectEvent(eventType, expectedTarget, assert) { | |
| counts[eventType] = 0; | |
| listeningTo.push(expectedTarget); | |
| goog.events.listen(expectedTarget, eventType, | |
| function(e) { | |
| assert.strictEqual(e.target, expectedTarget, | |
| 'Not the expected ' + eventType + ' event target'); | |
| counts[eventType] += 1; | |
| }); | |
| } | |
| function expectBlurEvent(expectedTarget, assert) { | |
| expectEvent(goog.events.EventType.BLUR, expectedTarget, assert); | |
| } | |
| function expectChangeEvent(expectedTarget, assert) { | |
| expectEvent(goog.events.EventType.CHANGE, expectedTarget, assert); | |
| } | |
| function expectSubmitEvent(expectedTarget, assert) { | |
| expectEvent(goog.events.EventType.SUBMIT, expectedTarget, assert); | |
| } | |
| function assertEventFired(assert, eventType, opt_count) { | |
| var count = opt_count || 1; | |
| assert.strictEqual(counts[eventType], count, | |
| eventType + ' event not fired expected # of times!'); | |
| } | |
| function assertBlurFired(assert) { | |
| assertEventFired(assert, goog.events.EventType.BLUR); | |
| } | |
| function assertChangeFired(assert) { | |
| assertEventFired(assert, goog.events.EventType.CHANGE); | |
| } | |
| function assertSubmitFired(assert) { | |
| assertEventFired(assert, goog.events.EventType.SUBMIT); | |
| } | |
| function doNotExpectEvent(eventType, expectedTarget, assert) { | |
| listeningTo.push(expectedTarget); | |
| goog.events.listen(expectedTarget, eventType, function() { | |
| assert.ok(false, 'Was not expecting a ' + eventType + ' event to be fired'); | |
| }); | |
| } | |
| function doNotExpectChangeEvent(expectedTarget, assert) { | |
| doNotExpectEvent(goog.events.EventType.CHANGE, expectedTarget, assert); | |
| } | |
| function doNotExpectSubmitEvent(expectedTarget, assert) { | |
| doNotExpectEvent(goog.events.EventType.SUBMIT, expectedTarget, assert); | |
| } | |
| QUnit.test('clearing a non textual element throws', function(assert) { | |
| assert.throws(function() { bot.action.clear(document.body); }); | |
| }); | |
| function forEachClearableElement(fn) { | |
| var ids = ['textField', 'textArea', 'passwordField']; | |
| for (var i = 0; i < ids.length; i++) { | |
| fn(goog.dom.$(ids[i])); | |
| } | |
| } | |
| QUnit.test('clearing an empty element should no op', function(assert) { | |
| forEachClearableElement(function(e) { | |
| e.value = ''; | |
| e.disabled = false; | |
| e.readOnly = false; | |
| doNotExpectChangeEvent(e, assert); | |
| bot.action.clear(e); | |
| assert.strictEqual(e.value, ''); | |
| }); | |
| }); | |
| QUnit.test('clearing a non empty element', function(assert) { | |
| forEachClearableElement(function(e) { | |
| e.value = 'foobar'; | |
| e.disabled = false; | |
| e.readOnly = false; | |
| expectBlurEvent(e, assert); | |
| expectChangeEvent(e, assert); | |
| bot.action.clear(e); | |
| if (goog.userAgent.IE) { | |
| assertBlurFired(assert); | |
| } | |
| assertChangeFired(assert); | |
| assert.strictEqual(e.value, ''); | |
| }); | |
| }); | |
| QUnit.test('clearing a disabled element throws', function(assert) { | |
| forEachClearableElement(function(e) { | |
| e.value = 'foobar'; | |
| e.disabled = true; | |
| e.readOnly = false; | |
| doNotExpectChangeEvent(e, assert); | |
| assert.throws(function() { bot.action.clear(e); }); | |
| assert.strictEqual(e.value, 'foobar'); | |
| e.value = ''; | |
| doNotExpectChangeEvent(e, assert); | |
| assert.throws(function() { bot.action.clear(e); }); | |
| }); | |
| }); | |
| QUnit.test('clearing a read only element throws', function(assert) { | |
| forEachClearableElement(function(e) { | |
| e.value = 'foobar'; | |
| e.disabled = false; | |
| e.readOnly = true; | |
| doNotExpectChangeEvent(e, assert); | |
| assert.throws(function() { bot.action.clear(e); }); | |
| assert.strictEqual(e.value, 'foobar'); | |
| e.value = ''; | |
| doNotExpectChangeEvent(e, assert); | |
| assert.throws(function() { bot.action.clear(e); }); | |
| }); | |
| }); | |
| QUnit.test('clearing a content editable area', function(assert) { | |
| var e = goog.dom.getElement('content-editable'); | |
| bot.action.clear(e); | |
| assert.strictEqual(bot.dom.getVisibleText(e), ''); | |
| }); | |
| QUnit.test('clearing a child content editable area', function(assert) { | |
| var e = goog.dom.getElement('child-content-editable'); | |
| bot.action.clear(e); | |
| assert.strictEqual(bot.dom.getVisibleText(e), ''); | |
| }); | |
| QUnit.test('clearing a not content editable area', function(assert) { | |
| var e = goog.dom.getElement('not-content-editable'); | |
| assert.throws(function() { bot.action.clear(e); }); | |
| }); | |
| QUnit.test('clearing a child not content editable area', function(assert) { | |
| var e = goog.dom.getElement('child-not-content-editable'); | |
| assert.throws(function() { bot.action.clear(e); }); | |
| }); | |
| QUnit.test('clearing a file input should be no op', function(assert) { | |
| var e = goog.dom.getElement('fileField'); | |
| doNotExpectChangeEvent(e, assert); | |
| bot.action.clear(e); | |
| assert.strictEqual(e.value, ''); | |
| }); | |
| QUnit.test('clearing number input with invalid data', function(assert) { | |
| var e = goog.dom.getElement('numberField'); | |
| bot.action.type(e, "e"); | |
| bot.action.clear(e); | |
| bot.action.type(e, "3"); | |
| assert.strictEqual(goog.dom.forms.getValue(e), "3"); | |
| }); | |
| QUnit.test('clearing a iframe content editable area', function(assert) { | |
| var iframe = goog.dom.getElement('iframe'); | |
| var iframeDoc = goog.dom.getFrameContentDocument(iframe); | |
| var e = bot.locators.findElement({ id: 'content-editable' }, iframeDoc); | |
| bot.action.clear(e); | |
| assert.strictEqual(bot.dom.getVisibleText(e), ''); | |
| }); | |
| QUnit.test('submitting a non form element should result in an error', function(assert) { | |
| assert.throws(function() { bot.action.submit(document.body); }); | |
| }); | |
| QUnit.test('should not submit if submit event is cancelled', function(assert) { | |
| var form = goog.dom.$('form_one'); | |
| expectAndCancelEvent(goog.events.EventType.SUBMIT, form, assert); | |
| var wasSubmitted = false; | |
| goog.global.submitted = function() { | |
| wasSubmitted = true; | |
| }; | |
| bot.action.submit(form); | |
| assertSubmitFired(assert); | |
| assert.notOk(wasSubmitted); | |
| }); | |
| QUnit.test('should submit if submit event is not cancelled', function(assert) { | |
| var form = goog.dom.$('form_one'); | |
| expectSubmitEvent(form, assert); | |
| var done = assert.async(); | |
| goog.global.submitted = function() { | |
| assertSubmitFired(assert); | |
| done(); | |
| }; | |
| bot.action.submit(form); | |
| }); | |
| QUnit.test('should be able to submit from any element that is a child of the form', function(assert) { | |
| var form = goog.dom.$('form_one'); | |
| expectSubmitEvent(form, assert); | |
| var done = assert.async(); | |
| goog.global.submitted = function() { | |
| assertSubmitFired(assert); | |
| done(); | |
| }; | |
| bot.action.submit(goog.dom.$('typer')); | |
| }); | |
| QUnit.test('should be able to submit from a form with an element named submit', function(assert) { | |
| var form = goog.dom.getElement('form_two'); | |
| var submitButton = goog.dom.getElement('submit'); | |
| expectSubmitEvent(form, assert); | |
| var done = assert.async(); | |
| goog.global.submitted = function() { | |
| assertSubmitFired(assert); | |
| assert.strictEqual(submitButton.id, 'submit'); | |
| assert.strictEqual(submitButton.name, 'submit'); | |
| done(); | |
| }; | |
| bot.action.submit(goog.dom.getElement('typer2')); | |
| }); | |
| </script> | |
| </head> | |
| <body> | |
| <div id="qunit"></div> | |
| <div id="qunit-fixture"></div> | |
| <form id="form_one" action="javascript:submitted()"> | |
| <label for="typer">Type here: </label><input type="text" id="typer"/> | |
| <input type="submit" id="submit-button" value="Submit!"/> | |
| </form> | |
| <form id="form_two" action="javascript:submitted()"> | |
| <label for="typer2">Type here: </label><input type="text" id="typer2"/> | |
| <input type="submit" id="submit" name="submit" value="Submit!"/> | |
| </form> | |
| <form action="javascript:void(0)"> | |
| <div> | |
| <label for="textField">Text field</label> | |
| <input type="text" id="textField"/> | |
| </div> | |
| <div> | |
| <label for="textArea">Text area</label> | |
| <textarea id="textArea"></textarea> | |
| </div> | |
| <label for="passwordField">Password field</label> | |
| <input type="password" id="passwordField"> | |
| </div> | |
| </div> | |
| <label for="fileField">File field</label> | |
| <input type="file" id="fileField"> | |
| </div> | |
| <div> | |
| <label for="numberField">Number field</label> | |
| <input type="number" id="numberField"> | |
| </div> | |
| </form> | |
| <div id="log"> | |
| </div> | |
| <div id="content-editable" contentEditable="true">This is a contentEditable area | |
| <div id="child-content-editable">child content editable | |
| </div> | |
| </div> | |
| <div id="not-content-editable" contentEditable="false">This is not a contentEditable area | |
| <div id="child-not-content-editable">child not content editable | |
| </div> | |
| </div> | |
| <iframe id="iframe" src="testdata/trusted_types_iframe.html"> | |
| </iframe> | |
| </body> | |
| </html> |