tenfourfox/browser/components/sessionstore/test/content-forms.js
Cameron Kaiser c9b2922b70 hello FPR
2017-04-19 00:56:45 -07:00

134 lines
3.8 KiB
JavaScript

/* 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.ownerDocument.defaultView, 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");
}
});