forked from mirrors/gecko-dev
In OOP iframes, we don't have desktop zoom value specifically in each iframe documents, instead we have a transform matrix, nsIWidget::WidgetToTopLevelWidgetTransform(), on each the __top__ level OOP iframe document that the matrix includes the desktop zoom scale value along with translations by ancestor scroll containers, ancestor CSS transforms, etc. Note that if the document is not in OOP iframes, i.e. it's in the top level content subtree, the transform, nsIWidget::WidgetToTopLevelWidgetTransform() doesn't include the destktop zoom value, so for documents in the top level content document subtree, ViewportUtils::DocumentRelativeLayoutToVisual applies the desktop zoom value via PresShell::GetResolution(). Differential Revision: https://phabricator.services.mozilla.com/D102219
49 lines
1.3 KiB
JavaScript
49 lines
1.3 KiB
JavaScript
/* -*- 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/. */
|
|
|
|
"use strict";
|
|
|
|
var EXPORTED_SYMBOLS = ["LayoutUtils"];
|
|
|
|
var LayoutUtils = {
|
|
/**
|
|
* For a given DOM element, returns its position in "screen"
|
|
* coordinates.
|
|
*/
|
|
getElementBoundingScreenRect(aElement) {
|
|
let rect = aElement.getBoundingClientRect();
|
|
let win = aElement.ownerGlobal;
|
|
|
|
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.frameElement;
|
|
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.frameElement;
|
|
}
|
|
|
|
return aElement.ownerGlobal.windowUtils.toScreenRect(
|
|
x,
|
|
y,
|
|
rect.width,
|
|
rect.height
|
|
);
|
|
},
|
|
};
|