diff options
Diffstat (limited to 'browser/components/sessionstore/test/content-forms.js')
-rw-r--r-- | browser/components/sessionstore/test/content-forms.js | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/browser/components/sessionstore/test/content-forms.js b/browser/components/sessionstore/test/content-forms.js new file mode 100644 index 000000000..da7bc9c08 --- /dev/null +++ b/browser/components/sessionstore/test/content-forms.js @@ -0,0 +1,133 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +var {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components; + +/** + * This frame script is only loaded for sessionstore mochitests. It contains + * a bunch of utility functions used to test form data collection and + * restoration in remote browsers. + */ + +function queryElement(data) { + let frame = content; + if (data.hasOwnProperty("frame")) { + frame = content.frames[data.frame]; + } + + let doc = frame.document; + + if (data.hasOwnProperty("id")) { + return doc.getElementById(data.id); + } + + if (data.hasOwnProperty("selector")) { + return doc.querySelector(data.selector); + } + + if (data.hasOwnProperty("xpath")) { + let xptype = Ci.nsIDOMXPathResult.FIRST_ORDERED_NODE_TYPE; + return doc.evaluate(data.xpath, doc, null, xptype, null).singleNodeValue; + } + + throw new Error("couldn't query element"); +} + +function dispatchUIEvent(input, type) { + let event = input.ownerDocument.createEvent("UIEvents"); + event.initUIEvent(type, true, true, input.ownerGlobal, 0); + input.dispatchEvent(event); +} + +function defineListener(type, cb) { + addMessageListener("ss-test:" + type, function ({data}) { + sendAsyncMessage("ss-test:" + type, cb(data)); + }); +} + +defineListener("sendKeyEvent", function (data) { + let frame = content; + if (data.hasOwnProperty("frame")) { + frame = content.frames[data.frame]; + } + + let ifreq = frame.QueryInterface(Ci.nsIInterfaceRequestor); + let utils = ifreq.getInterface(Ci.nsIDOMWindowUtils); + + let keyCode = data.key.charCodeAt(0); + let charCode = Ci.nsIDOMKeyEvent.DOM_VK_A + keyCode - "a".charCodeAt(0); + + utils.sendKeyEvent("keydown", keyCode, charCode, null); + utils.sendKeyEvent("keypress", keyCode, charCode, null); + utils.sendKeyEvent("keyup", keyCode, charCode, null); +}); + +defineListener("getInnerHTML", function (data) { + return queryElement(data).innerHTML; +}); + +defineListener("getTextContent", function (data) { + return queryElement(data).textContent; +}); + +defineListener("getInputValue", function (data) { + return queryElement(data).value; +}); + +defineListener("setInputValue", function (data) { + let input = queryElement(data); + input.value = data.value; + dispatchUIEvent(input, "input"); +}); + +defineListener("getInputChecked", function (data) { + return queryElement(data).checked; +}); + +defineListener("setInputChecked", function (data) { + let input = queryElement(data); + input.checked = data.checked; + dispatchUIEvent(input, "change"); +}); + +defineListener("getSelectedIndex", function (data) { + return queryElement(data).selectedIndex; +}); + +defineListener("setSelectedIndex", function (data) { + let input = queryElement(data); + input.selectedIndex = data.index; + dispatchUIEvent(input, "change"); +}); + +defineListener("getMultipleSelected", function (data) { + let input = queryElement(data); + return Array.map(input.options, (opt, idx) => idx) + .filter(idx => input.options[idx].selected); +}); + +defineListener("setMultipleSelected", function (data) { + let input = queryElement(data); + Array.forEach(input.options, (opt, idx) => opt.selected = data.indices.indexOf(idx) > -1); + dispatchUIEvent(input, "change"); +}); + +defineListener("getFileNameArray", function (data) { + return queryElement(data).mozGetFileNameArray(); +}); + +defineListener("setFileNameArray", function (data) { + let input = queryElement(data); + input.mozSetFileNameArray(data.names, data.names.length); + dispatchUIEvent(input, "input"); +}); + +defineListener("setFormElementValues", function (data) { + for (let elem of content.document.forms[0].elements) { + elem.value = data.value; + dispatchUIEvent(elem, "input"); + } +}); |