From 36d22d82aa202bb199967e9512281e9a53db42c9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 21:33:14 +0200 Subject: Adding upstream version 115.7.0esr. Signed-off-by: Daniel Baumann --- toolkit/modules/LayoutUtils.sys.mjs | 59 +++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 toolkit/modules/LayoutUtils.sys.mjs (limited to 'toolkit/modules/LayoutUtils.sys.mjs') diff --git a/toolkit/modules/LayoutUtils.sys.mjs b/toolkit/modules/LayoutUtils.sys.mjs new file mode 100644 index 0000000000..f3f9d0582b --- /dev/null +++ b/toolkit/modules/LayoutUtils.sys.mjs @@ -0,0 +1,59 @@ +/* -*- mode: js; indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* 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/. */ + +export var LayoutUtils = { + /** + * For a given DOM element, returns its position in screen coordinates of CSS units + * (). + */ + getElementBoundingScreenRect(aElement) { + let rect = aElement.getBoundingClientRect(); + let win = aElement.ownerGlobal; + + const { x, y, width, height } = this._rectToClientRect(win, rect); + return win.windowUtils.toScreenRectInCSSUnits(x, y, width, height); + }, + + /** + * Similar to getElementBoundingScreenRect using window and rect, + * returns screen coordinates in screen units. + */ + rectToScreenRect(win, rect) { + const { x, y, width, height } = this._rectToClientRect(win, rect); + return win.ownerGlobal.windowUtils.toScreenRect(x, y, width, height); + }, + + _rectToClientRect(win, rect) { + let x = rect.left; + let y = rect.top; + + // We need to compensate for ancestor iframes in the same process + // that might shift things over. + let parentFrame = win.browsingContext?.embedderElement; + while (parentFrame) { + win = parentFrame.ownerGlobal; + let cstyle = win.getComputedStyle(parentFrame); + + let framerect = parentFrame.getBoundingClientRect(); + x += + framerect.left + + parseFloat(cstyle.borderLeftWidth) + + parseFloat(cstyle.paddingLeft); + y += + framerect.top + + parseFloat(cstyle.borderTopWidth) + + parseFloat(cstyle.paddingTop); + + parentFrame = win.browsingContext?.embedderElement; + } + + return { + x, + y, + width: rect.width, + height: rect.height, + }; + }, +}; -- cgit v1.2.3