1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/components/sessionstore/test/content-forms.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,131 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +"use strict"; 1.9 + 1.10 +/** 1.11 + * This frame script is only loaded for sessionstore mochitests. It contains 1.12 + * a bunch of utility functions used to test form data collection and 1.13 + * restoration in remote browsers. 1.14 + */ 1.15 + 1.16 +function queryElement(data) { 1.17 + let frame = content; 1.18 + if (data.hasOwnProperty("frame")) { 1.19 + frame = content.frames[data.frame]; 1.20 + } 1.21 + 1.22 + let doc = frame.document; 1.23 + 1.24 + if (data.hasOwnProperty("id")) { 1.25 + return doc.getElementById(data.id); 1.26 + } 1.27 + 1.28 + if (data.hasOwnProperty("selector")) { 1.29 + return doc.querySelector(data.selector); 1.30 + } 1.31 + 1.32 + if (data.hasOwnProperty("xpath")) { 1.33 + let xptype = Ci.nsIDOMXPathResult.FIRST_ORDERED_NODE_TYPE; 1.34 + return doc.evaluate(data.xpath, doc, null, xptype, null).singleNodeValue; 1.35 + } 1.36 + 1.37 + throw new Error("couldn't query element"); 1.38 +} 1.39 + 1.40 +function dispatchUIEvent(input, type) { 1.41 + let event = input.ownerDocument.createEvent("UIEvents"); 1.42 + event.initUIEvent(type, true, true, input.ownerDocument.defaultView, 0); 1.43 + input.dispatchEvent(event); 1.44 +} 1.45 + 1.46 +function defineListener(type, cb) { 1.47 + addMessageListener("ss-test:" + type, function ({data}) { 1.48 + sendAsyncMessage("ss-test:" + type, cb(data)); 1.49 + }); 1.50 +} 1.51 + 1.52 +defineListener("sendKeyEvent", function (data) { 1.53 + let frame = content; 1.54 + if (data.hasOwnProperty("frame")) { 1.55 + frame = content.frames[data.frame]; 1.56 + } 1.57 + 1.58 + let ifreq = frame.QueryInterface(Ci.nsIInterfaceRequestor); 1.59 + let utils = ifreq.getInterface(Ci.nsIDOMWindowUtils); 1.60 + 1.61 + let keyCode = data.key.charCodeAt(0); 1.62 + let charCode = Ci.nsIDOMKeyEvent.DOM_VK_A + keyCode - "a".charCodeAt(0); 1.63 + 1.64 + utils.sendKeyEvent("keydown", keyCode, charCode, null); 1.65 + utils.sendKeyEvent("keypress", keyCode, charCode, null); 1.66 + utils.sendKeyEvent("keyup", keyCode, charCode, null); 1.67 +}); 1.68 + 1.69 +defineListener("getInnerHTML", function (data) { 1.70 + return queryElement(data).innerHTML; 1.71 +}); 1.72 + 1.73 +defineListener("getTextContent", function (data) { 1.74 + return queryElement(data).textContent; 1.75 +}); 1.76 + 1.77 +defineListener("getInputValue", function (data) { 1.78 + return queryElement(data).value; 1.79 +}); 1.80 + 1.81 +defineListener("setInputValue", function (data) { 1.82 + let input = queryElement(data); 1.83 + input.value = data.value; 1.84 + dispatchUIEvent(input, "input"); 1.85 +}); 1.86 + 1.87 +defineListener("getInputChecked", function (data) { 1.88 + return queryElement(data).checked; 1.89 +}); 1.90 + 1.91 +defineListener("setInputChecked", function (data) { 1.92 + let input = queryElement(data); 1.93 + input.checked = data.checked; 1.94 + dispatchUIEvent(input, "change"); 1.95 +}); 1.96 + 1.97 +defineListener("getSelectedIndex", function (data) { 1.98 + return queryElement(data).selectedIndex; 1.99 +}); 1.100 + 1.101 +defineListener("setSelectedIndex", function (data) { 1.102 + let input = queryElement(data); 1.103 + input.selectedIndex = data.index; 1.104 + dispatchUIEvent(input, "change"); 1.105 +}); 1.106 + 1.107 +defineListener("getMultipleSelected", function (data) { 1.108 + let input = queryElement(data); 1.109 + return Array.map(input.options, (opt, idx) => idx) 1.110 + .filter(idx => input.options[idx].selected); 1.111 +}); 1.112 + 1.113 +defineListener("setMultipleSelected", function (data) { 1.114 + let input = queryElement(data); 1.115 + Array.forEach(input.options, (opt, idx) => opt.selected = data.indices.indexOf(idx) > -1); 1.116 + dispatchUIEvent(input, "change"); 1.117 +}); 1.118 + 1.119 +defineListener("getFileNameArray", function (data) { 1.120 + return queryElement(data).mozGetFileNameArray(); 1.121 +}); 1.122 + 1.123 +defineListener("setFileNameArray", function (data) { 1.124 + let input = queryElement(data); 1.125 + input.mozSetFileNameArray(data.names, data.names.length); 1.126 + dispatchUIEvent(input, "input"); 1.127 +}); 1.128 + 1.129 +defineListener("setFormElementValues", function (data) { 1.130 + for (let elem of content.document.forms[0].elements) { 1.131 + elem.value = data.value; 1.132 + dispatchUIEvent(elem, "input"); 1.133 + } 1.134 +});