diff options
Diffstat (limited to 'testing/mochitest/tests/SimpleTest/AsyncUtilsContent.js')
-rw-r--r-- | testing/mochitest/tests/SimpleTest/AsyncUtilsContent.js | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/testing/mochitest/tests/SimpleTest/AsyncUtilsContent.js b/testing/mochitest/tests/SimpleTest/AsyncUtilsContent.js new file mode 100644 index 000000000..0f1cc0608 --- /dev/null +++ b/testing/mochitest/tests/SimpleTest/AsyncUtilsContent.js @@ -0,0 +1,98 @@ +/* + * This code is used for handling synthesizeMouse in a content process. + * Generally it just delegates to EventUtils.js. + */ + +// Set up a dummy environment so that EventUtils works. We need to be careful to +// pass a window object into each EventUtils method we call rather than having +// it rely on the |window| global. +var EventUtils = {}; +EventUtils.window = {}; +EventUtils.parent = EventUtils.window; +EventUtils._EU_Ci = Components.interfaces; +EventUtils._EU_Cc = Components.classes; +// EventUtils' `sendChar` function relies on the navigator to synthetize events. +EventUtils.navigator = content.document.defaultView.navigator; +EventUtils.KeyboardEvent = content.document.defaultView.KeyboardEvent; + +Services.scriptloader.loadSubScript("chrome://mochikit/content/tests/SimpleTest/EventUtils.js", EventUtils); + +addMessageListener("Test:SynthesizeMouse", (message) => { + let data = message.data; + let target = data.target; + if (typeof target == "string") { + target = content.document.querySelector(target); + } + else if (typeof data.targetFn == "string") { + let runnablestr = ` + (() => { + return (${data.targetFn}); + })();` + target = eval(runnablestr)(); + } + else { + target = message.objects.object; + } + + let left = data.x; + let top = data.y; + if (target) { + if (target.ownerDocument !== content.document) { + // Account for nodes found in iframes. + let cur = target; + do { + let frame = cur.ownerDocument.defaultView.frameElement; + let rect = frame.getBoundingClientRect(); + + left += rect.left; + top += rect.top; + + cur = frame; + } while (cur && cur.ownerDocument !== content.document); + + // node must be in this document tree. + if (!cur) { + sendAsyncMessage("Test:SynthesizeMouseDone", + { error: "target must be in the main document tree" }); + return; + } + } + + let rect = target.getBoundingClientRect(); + left += rect.left; + top += rect.top; + + if (data.event.centered) { + left += rect.width / 2; + top += rect.height / 2; + } + } + + let result; + if (data.event && data.event.wheel) { + EventUtils.synthesizeWheelAtPoint(left, top, data.event, content); + } else { + result = EventUtils.synthesizeMouseAtPoint(left, top, data.event, content); + } + sendAsyncMessage("Test:SynthesizeMouseDone", { defaultPrevented: result }); +}); + +addMessageListener("Test:SendChar", message => { + let result = EventUtils.sendChar(message.data.char, content); + sendAsyncMessage("Test:SendCharDone", { result, seq: message.data.seq }); +}); + +addMessageListener("Test:SynthesizeKey", message => { + EventUtils.synthesizeKey(message.data.key, message.data.event || {}, content); + sendAsyncMessage("Test:SynthesizeKeyDone", { seq: message.data.seq }); +}); + +addMessageListener("Test:SynthesizeComposition", message => { + let result = EventUtils.synthesizeComposition(message.data.event, content); + sendAsyncMessage("Test:SynthesizeCompositionDone", { result, seq: message.data.seq }); +}); + +addMessageListener("Test:SynthesizeCompositionChange", message => { + EventUtils.synthesizeCompositionChange(message.data.event, content); + sendAsyncMessage("Test:SynthesizeCompositionChangeDone", { seq: message.data.seq }); +}); |