Issue #2241 - Part 4.3: Move devtools over to getBounds().

This leaves getAdjustedQuads alone because it lives in its own world and its
result gets sent over IPC. That leaves things in a bit of an intermediate state,
but that should be OK for now.

Backported from Mozilla bug 1186265.
This commit is contained in:
Job Bautista 2023-05-12 11:54:35 +08:00 • committed by roytam1
commit 69e45fd84e
8 changed files with 32 additions and 23 deletions

View file

@ -39,14 +39,14 @@ add_task(function* () {
// Calculate offsets to click in the middle of the first box quad. // Calculate offsets to click in the middle of the first box quad.
let rect = prop.editor.valueSpan.getBoundingClientRect(); let rect = prop.editor.valueSpan.getBoundingClientRect();
let firstQuad = prop.editor.valueSpan.getBoxQuads()[0]; let firstQuadBounds = prop.editor.valueSpan.getBoxQuads()[0].getBounds();
// For a multiline value, the first quad left edge is not aligned with the // For a multiline value, the first quad left edge is not aligned with the
// bounding rect left edge. The offsets expected by focusEditableField are // bounding rect left edge. The offsets expected by focusEditableField are
// relative to the bouding rectangle, so we need to translate the x-offset. // relative to the bouding rectangle, so we need to translate the x-offset.
let x = firstQuad.bounds.left - rect.left + firstQuad.bounds.width / 2; let x = firstQuadBounds.left - rect.left + firstQuadBounds.width / 2;
// The first quad top edge is aligned with the bounding top edge, no // The first quad top edge is aligned with the bounding top edge, no
// translation needed here. // translation needed here.
let y = firstQuad.bounds.height / 2; let y = firstQuadBounds.height / 2;
info("Focusing the css property editable value"); info("Focusing the css property editable value");
let editor = yield focusEditableField(view, prop.editor.valueSpan, x, y); let editor = yield focusEditableField(view, prop.editor.valueSpan, x, y);

View file

@ -283,7 +283,7 @@ AutocompletePopup.prototype = {
return; return;
} }
let {top, height} = quads[0].bounds; let {top, height} = quads[0].getBounds();
let containerHeight = this._tooltip.panel.getBoundingClientRect().height; let containerHeight = this._tooltip.panel.getBoundingClientRect().height;
if (top < 0) { if (top < 0) {
// Element is above container. // Element is above container.

View file

@ -85,9 +85,9 @@ function* runTests(doc) {
ok(arrow, "Tooltip has an arrow"); ok(arrow, "Tooltip has an arrow");
// Get the geometry of the anchor, the tooltip panel & arrow. // Get the geometry of the anchor, the tooltip panel & arrow.
let arrowBounds = arrow.getBoxQuads({relativeTo: doc})[0].bounds; let arrowBounds = arrow.getBoxQuads({relativeTo: doc})[0].getBounds();
let panelBounds = tooltip.panel.getBoxQuads({relativeTo: doc})[0].bounds; let panelBounds = tooltip.panel.getBoxQuads({relativeTo: doc})[0].getBounds();
let anchorBounds = el.getBoxQuads({relativeTo: doc})[0].bounds; let anchorBounds = el.getBoxQuads({relativeTo: doc})[0].getBounds();
let intersects = arrowBounds.left <= anchorBounds.right && let intersects = arrowBounds.left <= anchorBounds.right &&
arrowBounds.right >= anchorBounds.left; arrowBounds.right >= anchorBounds.left;

View file

@ -78,9 +78,9 @@ function* runTests(doc) {
ok(arrow, "Tooltip has an arrow"); ok(arrow, "Tooltip has an arrow");
// Get the geometry of the anchor, the tooltip panel & arrow. // Get the geometry of the anchor, the tooltip panel & arrow.
let arrowBounds = arrow.getBoxQuads({relativeTo: doc})[0].bounds; let arrowBounds = arrow.getBoxQuads({relativeTo: doc})[0].getBounds();
let panelBounds = tooltip.panel.getBoxQuads({relativeTo: doc})[0].bounds; let panelBounds = tooltip.panel.getBoxQuads({relativeTo: doc})[0].getBounds();
let anchorBounds = el.getBoxQuads({relativeTo: doc})[0].bounds; let anchorBounds = el.getBoxQuads({relativeTo: doc})[0].getBounds();
let intersects = arrowBounds.left <= anchorBounds.right && let intersects = arrowBounds.left <= anchorBounds.right &&
arrowBounds.right >= anchorBounds.left; arrowBounds.right >= anchorBounds.left;

View file

@ -114,5 +114,5 @@ let runAutocompletionTest = Task.async(function* (editor) {
*/ */
function getPopupOffset({popup, input}) { function getPopupOffset({popup, input}) {
let popupQuads = popup._panel.getBoxQuads({relativeTo: input}); let popupQuads = popup._panel.getBoxQuads({relativeTo: input});
return popupQuads[0].bounds.left; return popupQuads[0].getBounds().left;
} }

View file

@ -176,9 +176,9 @@ const getRelativeRect = function (node, relativeTo) {
// Width and Height can be taken from the rect. // Width and Height can be taken from the rect.
let {width, height} = node.getBoundingClientRect(); let {width, height} = node.getBoundingClientRect();
let quads = node.getBoxQuads({relativeTo}); let quadBounds = node.getBoxQuads({relativeTo})[0].getBounds();
let top = quads[0].bounds.top; let top = quadBounds.top;
let left = quads[0].bounds.left; let left = quadBounds.left;
// Compute right and bottom coordinates using the rest of the data. // Compute right and bottom coordinates using the rest of the data.
let right = left + width; let right = left + width;

View file

@ -3071,7 +3071,10 @@ function nodeHasSize(node) {
} }
let quads = node.getBoxQuads(); let quads = node.getBoxQuads();
return quads.length && quads.some(quad => quad.bounds.width && quad.bounds.height); return quads.some(quad => {
let bounds = quad.getBounds();
return bounds.width && bounds.height;
});
} }
/** /**

View file

@ -175,6 +175,11 @@ exports.getFrameOffsets = getFrameOffsets;
/** /**
* Get box quads adjusted for iframes and zoom level. * Get box quads adjusted for iframes and zoom level.
* *
* Warning: this function returns things that look like DOMQuad objects but
* aren't (they resemble an old version of the spec). Unlike the return value
* of node.getBoxQuads, they have a .bounds property and not a .getBounds()
* method.
*
* @param {DOMWindow} boundaryWindow * @param {DOMWindow} boundaryWindow
* The window where to stop to iterate. If `null` is given, the top * The window where to stop to iterate. If `null` is given, the top
* window is used. * window is used.
@ -206,6 +211,7 @@ function getAdjustedQuads(boundaryWindow, node, region) {
let adjustedQuads = []; let adjustedQuads = [];
for (let quad of quads) { for (let quad of quads) {
let bounds = quad.getBounds();
adjustedQuads.push({ adjustedQuads.push({
p1: { p1: {
w: quad.p1.w * scale, w: quad.p1.w * scale,
@ -232,14 +238,14 @@ function getAdjustedQuads(boundaryWindow, node, region) {
z: quad.p4.z * scale z: quad.p4.z * scale
}, },
bounds: { bounds: {
bottom: quad.bounds.bottom * scale + yOffset, bottom: bounds.bottom * scale + yOffset,
height: quad.bounds.height * scale, height: bounds.height * scale,
left: quad.bounds.left * scale + xOffset, left: bounds.left * scale + xOffset,
right: quad.bounds.right * scale + xOffset, right: bounds.right * scale + xOffset,
top: quad.bounds.top * scale + yOffset, top: bounds.top * scale + yOffset,
width: quad.bounds.width * scale, width: bounds.width * scale,
x: quad.bounds.x * scale + xOffset, x: bounds.x * scale + xOffset,
y: quad.bounds.y * scale + yOffset y: bounds.y * scale + yOffset
} }
}); });
} }