Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 "use strict";
7 /**
8 * This frame script is only loaded for sessionstore mochitests. It contains
9 * a bunch of utility functions used to test form data collection and
10 * restoration in remote browsers.
11 */
13 function queryElement(data) {
14 let frame = content;
15 if (data.hasOwnProperty("frame")) {
16 frame = content.frames[data.frame];
17 }
19 let doc = frame.document;
21 if (data.hasOwnProperty("id")) {
22 return doc.getElementById(data.id);
23 }
25 if (data.hasOwnProperty("selector")) {
26 return doc.querySelector(data.selector);
27 }
29 if (data.hasOwnProperty("xpath")) {
30 let xptype = Ci.nsIDOMXPathResult.FIRST_ORDERED_NODE_TYPE;
31 return doc.evaluate(data.xpath, doc, null, xptype, null).singleNodeValue;
32 }
34 throw new Error("couldn't query element");
35 }
37 function dispatchUIEvent(input, type) {
38 let event = input.ownerDocument.createEvent("UIEvents");
39 event.initUIEvent(type, true, true, input.ownerDocument.defaultView, 0);
40 input.dispatchEvent(event);
41 }
43 function defineListener(type, cb) {
44 addMessageListener("ss-test:" + type, function ({data}) {
45 sendAsyncMessage("ss-test:" + type, cb(data));
46 });
47 }
49 defineListener("sendKeyEvent", function (data) {
50 let frame = content;
51 if (data.hasOwnProperty("frame")) {
52 frame = content.frames[data.frame];
53 }
55 let ifreq = frame.QueryInterface(Ci.nsIInterfaceRequestor);
56 let utils = ifreq.getInterface(Ci.nsIDOMWindowUtils);
58 let keyCode = data.key.charCodeAt(0);
59 let charCode = Ci.nsIDOMKeyEvent.DOM_VK_A + keyCode - "a".charCodeAt(0);
61 utils.sendKeyEvent("keydown", keyCode, charCode, null);
62 utils.sendKeyEvent("keypress", keyCode, charCode, null);
63 utils.sendKeyEvent("keyup", keyCode, charCode, null);
64 });
66 defineListener("getInnerHTML", function (data) {
67 return queryElement(data).innerHTML;
68 });
70 defineListener("getTextContent", function (data) {
71 return queryElement(data).textContent;
72 });
74 defineListener("getInputValue", function (data) {
75 return queryElement(data).value;
76 });
78 defineListener("setInputValue", function (data) {
79 let input = queryElement(data);
80 input.value = data.value;
81 dispatchUIEvent(input, "input");
82 });
84 defineListener("getInputChecked", function (data) {
85 return queryElement(data).checked;
86 });
88 defineListener("setInputChecked", function (data) {
89 let input = queryElement(data);
90 input.checked = data.checked;
91 dispatchUIEvent(input, "change");
92 });
94 defineListener("getSelectedIndex", function (data) {
95 return queryElement(data).selectedIndex;
96 });
98 defineListener("setSelectedIndex", function (data) {
99 let input = queryElement(data);
100 input.selectedIndex = data.index;
101 dispatchUIEvent(input, "change");
102 });
104 defineListener("getMultipleSelected", function (data) {
105 let input = queryElement(data);
106 return Array.map(input.options, (opt, idx) => idx)
107 .filter(idx => input.options[idx].selected);
108 });
110 defineListener("setMultipleSelected", function (data) {
111 let input = queryElement(data);
112 Array.forEach(input.options, (opt, idx) => opt.selected = data.indices.indexOf(idx) > -1);
113 dispatchUIEvent(input, "change");
114 });
116 defineListener("getFileNameArray", function (data) {
117 return queryElement(data).mozGetFileNameArray();
118 });
120 defineListener("setFileNameArray", function (data) {
121 let input = queryElement(data);
122 input.mozSetFileNameArray(data.names, data.names.length);
123 dispatchUIEvent(input, "input");
124 });
126 defineListener("setFormElementValues", function (data) {
127 for (let elem of content.document.forms[0].elements) {
128 elem.value = data.value;
129 dispatchUIEvent(elem, "input");
130 }
131 });