зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1685801: Part 10 - Move BrowserUtils.getElementBounding*Rect to a separate module. r=mccr8
They won't be used in most processes. Differential Revision: https://phabricator.services.mozilla.com/D101490
This commit is contained in:
Родитель
86cc746c76
Коммит
d46ecf53ea
|
@ -10,8 +10,8 @@
|
||||||
|
|
||||||
var EXPORTED_SYMBOLS = ["FormValidationChild"];
|
var EXPORTED_SYMBOLS = ["FormValidationChild"];
|
||||||
|
|
||||||
const { BrowserUtils } = ChromeUtils.import(
|
const { LayoutUtils } = ChromeUtils.import(
|
||||||
"resource://gre/modules/BrowserUtils.jsm"
|
"resource://gre/modules/LayoutUtils.jsm"
|
||||||
);
|
);
|
||||||
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||||
|
|
||||||
|
@ -154,7 +154,7 @@ class FormValidationChild extends JSWindowActorChild {
|
||||||
|
|
||||||
panelData.message = this._validationMessage;
|
panelData.message = this._validationMessage;
|
||||||
|
|
||||||
panelData.screenRect = BrowserUtils.getElementBoundingScreenRect(aElement);
|
panelData.screenRect = LayoutUtils.getElementBoundingScreenRect(aElement);
|
||||||
|
|
||||||
// We want to show the popup at the middle of checkbox and radio buttons
|
// We want to show the popup at the middle of checkbox and radio buttons
|
||||||
// and where the content begin for the other elements.
|
// and where the content begin for the other elements.
|
||||||
|
|
|
@ -11,8 +11,8 @@ const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||||
|
|
||||||
ChromeUtils.defineModuleGetter(
|
ChromeUtils.defineModuleGetter(
|
||||||
this,
|
this,
|
||||||
"BrowserUtils",
|
"LayoutUtils",
|
||||||
"resource://gre/modules/BrowserUtils.jsm"
|
"resource://gre/modules/LayoutUtils.jsm"
|
||||||
);
|
);
|
||||||
|
|
||||||
ChromeUtils.defineModuleGetter(
|
ChromeUtils.defineModuleGetter(
|
||||||
|
@ -136,7 +136,7 @@ class AutoCompleteChild extends JSWindowActorChild {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let rect = BrowserUtils.getElementBoundingScreenRect(element);
|
let rect = LayoutUtils.getElementBoundingScreenRect(element);
|
||||||
let window = element.ownerGlobal;
|
let window = element.ownerGlobal;
|
||||||
let dir = window.getComputedStyle(element).direction;
|
let dir = window.getComputedStyle(element).direction;
|
||||||
let results = this.getResultsFromController(input);
|
let results = this.getResultsFromController(input);
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||||
ChromeUtils.defineModuleGetter(
|
ChromeUtils.defineModuleGetter(
|
||||||
this,
|
this,
|
||||||
"BrowserUtils",
|
"LayoutUtils",
|
||||||
"resource://gre/modules/BrowserUtils.jsm"
|
"resource://gre/modules/LayoutUtils.jsm"
|
||||||
);
|
);
|
||||||
|
|
||||||
var EXPORTED_SYMBOLS = ["DateTimePickerChild"];
|
var EXPORTED_SYMBOLS = ["DateTimePickerChild"];
|
||||||
|
@ -78,7 +78,7 @@ class DateTimePickerChild extends JSWindowActorChild {
|
||||||
* relative to the left/top of the content area.
|
* relative to the left/top of the content area.
|
||||||
*/
|
*/
|
||||||
getBoundingContentRect(aElement) {
|
getBoundingContentRect(aElement) {
|
||||||
return BrowserUtils.getElementBoundingScreenRect(aElement);
|
return LayoutUtils.getElementBoundingScreenRect(aElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
getTimePickerPref() {
|
getTimePickerPref() {
|
||||||
|
|
|
@ -12,8 +12,8 @@ const { XPCOMUtils } = ChromeUtils.import(
|
||||||
|
|
||||||
ChromeUtils.defineModuleGetter(
|
ChromeUtils.defineModuleGetter(
|
||||||
this,
|
this,
|
||||||
"BrowserUtils",
|
"LayoutUtils",
|
||||||
"resource://gre/modules/BrowserUtils.jsm"
|
"resource://gre/modules/LayoutUtils.jsm"
|
||||||
);
|
);
|
||||||
ChromeUtils.defineModuleGetter(
|
ChromeUtils.defineModuleGetter(
|
||||||
this,
|
this,
|
||||||
|
@ -173,7 +173,7 @@ SelectContentHelper.prototype = {
|
||||||
},
|
},
|
||||||
|
|
||||||
_getBoundingContentRect() {
|
_getBoundingContentRect() {
|
||||||
return BrowserUtils.getElementBoundingScreenRect(this.element);
|
return LayoutUtils.getElementBoundingScreenRect(this.element);
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildOptionList() {
|
_buildOptionList() {
|
||||||
|
|
|
@ -91,82 +91,6 @@ var BrowserUtils = {
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* For a given DOM element, returns its position in "screen"
|
|
||||||
* coordinates. In a content process, the coordinates returned will
|
|
||||||
* be relative to the left/top of the tab. In the chrome process,
|
|
||||||
* the coordinates are relative to the user's screen.
|
|
||||||
*/
|
|
||||||
getElementBoundingScreenRect(aElement) {
|
|
||||||
return this.getElementBoundingRect(aElement, true);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* For a given DOM element, returns its position as an offset from the topmost
|
|
||||||
* window. In a content process, the coordinates returned will be relative to
|
|
||||||
* the left/top of the topmost content area. If aInScreenCoords is true,
|
|
||||||
* screen coordinates will be returned instead.
|
|
||||||
*/
|
|
||||||
getElementBoundingRect(aElement, aInScreenCoords) {
|
|
||||||
let rect = aElement.getBoundingClientRect();
|
|
||||||
let win = aElement.ownerGlobal;
|
|
||||||
|
|
||||||
let x = rect.left;
|
|
||||||
let y = rect.top;
|
|
||||||
|
|
||||||
// We need to compensate for any iframes that might shift things
|
|
||||||
// over. We also need to compensate for zooming.
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
rect = {
|
|
||||||
left: x,
|
|
||||||
top: y,
|
|
||||||
width: rect.width,
|
|
||||||
height: rect.height,
|
|
||||||
};
|
|
||||||
rect = win.windowUtils.transformRectLayoutToVisual(
|
|
||||||
rect.left,
|
|
||||||
rect.top,
|
|
||||||
rect.width,
|
|
||||||
rect.height
|
|
||||||
);
|
|
||||||
|
|
||||||
if (aInScreenCoords) {
|
|
||||||
rect = {
|
|
||||||
left: rect.left + win.mozInnerScreenX,
|
|
||||||
top: rect.top + win.mozInnerScreenY,
|
|
||||||
width: rect.width,
|
|
||||||
height: rect.height,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
let fullZoom = win.windowUtils.fullZoom;
|
|
||||||
rect = {
|
|
||||||
left: rect.left * fullZoom,
|
|
||||||
top: rect.top * fullZoom,
|
|
||||||
width: rect.width * fullZoom,
|
|
||||||
height: rect.height * fullZoom,
|
|
||||||
};
|
|
||||||
|
|
||||||
return rect;
|
|
||||||
},
|
|
||||||
|
|
||||||
onBeforeLinkTraversal(originalTarget, linkURI, linkNode, isAppTab) {
|
onBeforeLinkTraversal(originalTarget, linkURI, linkNode, isAppTab) {
|
||||||
// Don't modify non-default targets or targets that aren't in top-level app
|
// Don't modify non-default targets or targets that aren't in top-level app
|
||||||
// tab docshells (isAppTab will be false for app tab subframes).
|
// tab docshells (isAppTab will be false for app tab subframes).
|
||||||
|
|
|
@ -0,0 +1,86 @@
|
||||||
|
/* -*- 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. In a content process, the coordinates returned will
|
||||||
|
* be relative to the left/top of the tab. In the chrome process,
|
||||||
|
* the coordinates are relative to the user's screen.
|
||||||
|
*/
|
||||||
|
getElementBoundingScreenRect(aElement) {
|
||||||
|
return this.getElementBoundingRect(aElement, true);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For a given DOM element, returns its position as an offset from the topmost
|
||||||
|
* window. In a content process, the coordinates returned will be relative to
|
||||||
|
* the left/top of the topmost content area. If aInScreenCoords is true,
|
||||||
|
* screen coordinates will be returned instead.
|
||||||
|
*/
|
||||||
|
getElementBoundingRect(aElement, aInScreenCoords) {
|
||||||
|
let rect = aElement.getBoundingClientRect();
|
||||||
|
let win = aElement.ownerGlobal;
|
||||||
|
|
||||||
|
let x = rect.left;
|
||||||
|
let y = rect.top;
|
||||||
|
|
||||||
|
// We need to compensate for any iframes that might shift things
|
||||||
|
// over. We also need to compensate for zooming.
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
rect = {
|
||||||
|
left: x,
|
||||||
|
top: y,
|
||||||
|
width: rect.width,
|
||||||
|
height: rect.height,
|
||||||
|
};
|
||||||
|
rect = win.windowUtils.transformRectLayoutToVisual(
|
||||||
|
rect.left,
|
||||||
|
rect.top,
|
||||||
|
rect.width,
|
||||||
|
rect.height
|
||||||
|
);
|
||||||
|
|
||||||
|
if (aInScreenCoords) {
|
||||||
|
rect = {
|
||||||
|
left: rect.left + win.mozInnerScreenX,
|
||||||
|
top: rect.top + win.mozInnerScreenY,
|
||||||
|
width: rect.width,
|
||||||
|
height: rect.height,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
let fullZoom = win.windowUtils.fullZoom;
|
||||||
|
rect = {
|
||||||
|
left: rect.left * fullZoom,
|
||||||
|
top: rect.top * fullZoom,
|
||||||
|
width: rect.width * fullZoom,
|
||||||
|
height: rect.height * fullZoom,
|
||||||
|
};
|
||||||
|
|
||||||
|
return rect;
|
||||||
|
},
|
||||||
|
};
|
|
@ -192,6 +192,7 @@ EXTRA_JS_MODULES += [
|
||||||
"Integration.jsm",
|
"Integration.jsm",
|
||||||
"JSONFile.jsm",
|
"JSONFile.jsm",
|
||||||
"KeywordUtils.jsm",
|
"KeywordUtils.jsm",
|
||||||
|
"LayoutUtils.jsm",
|
||||||
"Log.jsm",
|
"Log.jsm",
|
||||||
"NewTabUtils.jsm",
|
"NewTabUtils.jsm",
|
||||||
"NLP.jsm",
|
"NLP.jsm",
|
||||||
|
|
Загрузка…
Ссылка в новой задаче