mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-25 11:58:55 +00:00

this.browser in toolkit/actors/ControllersParent.jsm is the top level browser, ie the browser holding the root content document. So the conversion that happens in that file converts the coordinates to be relative to the root content document, but they need to be relative to the root of whichever child process we are sending the event to. The best way I found out how to do this was to pass the coords down to the child process still relative to the parent process widget and then in the child process use the child to parent transform matrix to make them relative to the root widget in the child process. I needed a new nsIDOMWindowUtils functions because I don't think there is anything existing to do this. Differential Revision: https://phabricator.services.mozilla.com/D126861
66 lines
2.1 KiB
JavaScript
66 lines
2.1 KiB
JavaScript
/* vim: set ts=2 sw=2 sts=2 et tw=80: */
|
|
/* 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 EXPORTED_SYMBOLS = ["ControllersChild"];
|
|
|
|
class ControllersChild extends JSWindowActorChild {
|
|
receiveMessage(message) {
|
|
switch (message.name) {
|
|
case "ControllerCommands:Do":
|
|
if (this.docShell && this.docShell.isCommandEnabled(message.data)) {
|
|
this.docShell.doCommand(message.data);
|
|
}
|
|
break;
|
|
|
|
case "ControllerCommands:DoWithParams":
|
|
var data = message.data;
|
|
if (this.docShell && this.docShell.isCommandEnabled(data.cmd)) {
|
|
var params = Cu.createCommandParams();
|
|
let substituteXY = false;
|
|
let x = 0;
|
|
let y = 0;
|
|
if (
|
|
data.cmd == "cmd_lookUpDictionary" &&
|
|
"x" in data.params &&
|
|
"y" in data.params &&
|
|
data.params.x.type == "long" &&
|
|
data.params.y.type == "long"
|
|
) {
|
|
substituteXY = true;
|
|
x = parseInt(data.params.x.value);
|
|
y = parseInt(data.params.y.value);
|
|
|
|
let rect = this.contentWindow.windowUtils.convertFromParentProcessWidgetToLocal(
|
|
x,
|
|
y,
|
|
1,
|
|
1
|
|
);
|
|
x = Math.round(rect.x);
|
|
y = Math.round(rect.y);
|
|
}
|
|
|
|
for (var name in data.params) {
|
|
var value = data.params[name];
|
|
if (value.type == "long") {
|
|
if (substituteXY && name === "x") {
|
|
params.setLongValue(name, x);
|
|
} else if (substituteXY && name === "y") {
|
|
params.setLongValue(name, y);
|
|
} else {
|
|
params.setLongValue(name, parseInt(value.value));
|
|
}
|
|
} else {
|
|
throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
|
|
}
|
|
}
|
|
this.docShell.doCommandWithParams(data.cmd, params);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|