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