99 lines
2.8 KiB
JavaScript
99 lines
2.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/. */
|
|
|
|
const lazy = {};
|
|
ChromeUtils.defineESModuleGetters(lazy, {
|
|
PromptUtils: "resource://gre/modules/PromptUtils.sys.mjs",
|
|
});
|
|
|
|
import { GeckoViewUtils } from "resource://gre/modules/GeckoViewUtils.sys.mjs";
|
|
|
|
const { debug } = GeckoViewUtils.initLogging("GeckoViewClipboardPermission");
|
|
|
|
export var GeckoViewClipboardPermission = {
|
|
confirmUserPaste(aWindowContext) {
|
|
return new Promise((resolve, reject) => {
|
|
if (!aWindowContext) {
|
|
reject(
|
|
Components.Exception("Null window context.", Cr.NS_ERROR_INVALID_ARG)
|
|
);
|
|
return;
|
|
}
|
|
|
|
const { document } = aWindowContext.browsingContext.topChromeWindow;
|
|
if (!document) {
|
|
reject(
|
|
Components.Exception(
|
|
"Unable to get chrome document.",
|
|
Cr.NS_ERROR_FAILURE
|
|
)
|
|
);
|
|
return;
|
|
}
|
|
|
|
if (this._pendingRequest) {
|
|
reject(
|
|
Components.Exception(
|
|
"There is an ongoing request.",
|
|
Cr.NS_ERROR_FAILURE
|
|
)
|
|
);
|
|
return;
|
|
}
|
|
|
|
this._pendingRequest = { resolve, reject };
|
|
|
|
const mouseXInCSSPixels = {};
|
|
const mouseYInCSSPixels = {};
|
|
const windowUtils = document.ownerGlobal.windowUtils;
|
|
windowUtils.getLastOverWindowPointerLocationInCSSPixels(
|
|
mouseXInCSSPixels,
|
|
mouseYInCSSPixels
|
|
);
|
|
const screenRect = windowUtils.toScreenRect(
|
|
mouseXInCSSPixels.value,
|
|
mouseYInCSSPixels.value,
|
|
0,
|
|
0
|
|
);
|
|
|
|
debug`confirmUserPaste (${screenRect.x}, ${screenRect.y})`;
|
|
|
|
document.addEventListener("pointerdown", this);
|
|
document.ownerGlobal.WindowEventDispatcher.sendRequestForResult({
|
|
type: "GeckoView:ClipboardPermissionRequest",
|
|
screenPoint: {
|
|
x: screenRect.x,
|
|
y: screenRect.y,
|
|
},
|
|
}).then(
|
|
allowOrDeny => {
|
|
const propBag = lazy.PromptUtils.objectToPropBag({ ok: allowOrDeny });
|
|
this._pendingRequest.resolve(propBag);
|
|
this._pendingRequest = null;
|
|
document.removeEventListener("pointerdown", this);
|
|
},
|
|
error => {
|
|
debug`Permission error: ${error}`;
|
|
this._pendingRequest.reject();
|
|
this._pendingRequest = null;
|
|
document.removeEventListener("pointerdown", this);
|
|
}
|
|
);
|
|
});
|
|
},
|
|
|
|
// EventListener interface.
|
|
handleEvent(aEvent) {
|
|
debug`handleEvent: ${aEvent.type}`;
|
|
switch (aEvent.type) {
|
|
case "pointerdown": {
|
|
aEvent.target.ownerGlobal.WindowEventDispatcher.sendRequestForResult({
|
|
type: "GeckoView:DismissClipboardPermissionRequest",
|
|
});
|
|
break;
|
|
}
|
|
}
|
|
},
|
|
};
|