зеркало из https://github.com/mozilla/gecko-dev.git
Backed out changeset 623c4391875a (bug 1733042) for causing wpt failures at scrollbars.html. CLOSED TREE
This commit is contained in:
Родитель
1a7d472966
Коммит
f669c536bb
|
@ -11,7 +11,6 @@
|
||||||
#include "mozilla/SVGUtils.h"
|
#include "mozilla/SVGUtils.h"
|
||||||
#include "nsIContent.h"
|
#include "nsIContent.h"
|
||||||
#include "nsIContentInlines.h"
|
#include "nsIContentInlines.h"
|
||||||
#include "nsIScrollableFrame.h"
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
|
||||||
namespace mozilla::dom {
|
namespace mozilla::dom {
|
||||||
|
@ -46,14 +45,6 @@ static uint32_t GetNodeDepth(nsINode* aNode) {
|
||||||
return depth;
|
return depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
static nsSize GetContentRectSize(const nsIFrame& aFrame) {
|
|
||||||
if (const nsIScrollableFrame* f = do_QueryFrame(&aFrame)) {
|
|
||||||
// We return the scrollport rect for compat with other UAs, see bug 1733042.
|
|
||||||
return f->GetScrollPortRect().Size();
|
|
||||||
}
|
|
||||||
return aFrame.GetContentRectRelativeToSelf().Size();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns |aTarget|'s size in the form of gfx::Size (in pixels).
|
* Returns |aTarget|'s size in the form of gfx::Size (in pixels).
|
||||||
* If the target is SVG, width and height are determined from bounding box.
|
* If the target is SVG, width and height are determined from bounding box.
|
||||||
|
@ -84,42 +75,47 @@ static gfx::Size CalculateBoxSize(Element* aTarget,
|
||||||
const LayoutDeviceIntSize snappedSize =
|
const LayoutDeviceIntSize snappedSize =
|
||||||
RoundedToInt(CSSSize::FromUnknownSize(size) *
|
RoundedToInt(CSSSize::FromUnknownSize(size) *
|
||||||
frame->PresContext()->CSSToDevPixelScale());
|
frame->PresContext()->CSSToDevPixelScale());
|
||||||
return gfx::Size(snappedSize.ToUnknownSize());
|
size = gfx::Size(snappedSize.ToUnknownSize());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Per the spec, non-replaced inline Elements will always have an empty
|
||||||
|
// content rect. Therefore, we always use the same trivially-empty size
|
||||||
|
// for non-replaced inline elements here, and their IsActive() will
|
||||||
|
// always return false. (So its observation won't be fired.)
|
||||||
|
if (!frame->IsFrameOfType(nsIFrame::eReplaced) &&
|
||||||
|
frame->IsFrameOfType(nsIFrame::eLineParticipant)) {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (aBox) {
|
||||||
|
case ResizeObserverBoxOptions::Border_box:
|
||||||
|
// GetSize() includes the content area, borders, and padding.
|
||||||
|
size = CSSPixel::FromAppUnits(frame->GetSize()).ToUnknownSize();
|
||||||
|
break;
|
||||||
|
case ResizeObserverBoxOptions::Device_pixel_content_box: {
|
||||||
|
// This is a implementation-dependent for subpixel snapping algorithm.
|
||||||
|
// Gecko relys on LayoutDevicePixel to convert (and snap) the app units
|
||||||
|
// into device pixels in painting and gfx code, so here we simply
|
||||||
|
// convert it into dev pixels and round it.
|
||||||
|
//
|
||||||
|
// Note: This size must contain integer values.
|
||||||
|
// https://drafts.csswg.org/resize-observer/#dom-resizeobserverboxoptions-device-pixel-content-box
|
||||||
|
const LayoutDeviceIntSize snappedSize =
|
||||||
|
LayoutDevicePixel::FromAppUnitsRounded(
|
||||||
|
frame->GetContentRectRelativeToSelf().Size(),
|
||||||
|
frame->PresContext()->AppUnitsPerDevPixel());
|
||||||
|
size = gfx::Size(snappedSize.ToUnknownSize());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ResizeObserverBoxOptions::Content_box:
|
||||||
|
default:
|
||||||
|
size =
|
||||||
|
CSSPixel::FromAppUnits(frame->GetContentRectRelativeToSelf().Size())
|
||||||
|
.ToUnknownSize();
|
||||||
}
|
}
|
||||||
return size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Per the spec, non-replaced inline Elements will always have an empty
|
return size;
|
||||||
// content rect. Therefore, we always use the same trivially-empty size
|
|
||||||
// for non-replaced inline elements here, and their IsActive() will
|
|
||||||
// always return false. (So its observation won't be fired.)
|
|
||||||
if (!frame->IsFrameOfType(nsIFrame::eReplaced) &&
|
|
||||||
frame->IsFrameOfType(nsIFrame::eLineParticipant)) {
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (aBox) {
|
|
||||||
case ResizeObserverBoxOptions::Border_box:
|
|
||||||
return CSSPixel::FromAppUnits(frame->GetSize()).ToUnknownSize();
|
|
||||||
case ResizeObserverBoxOptions::Device_pixel_content_box: {
|
|
||||||
// This is a implementation-dependent for subpixel snapping algorithm.
|
|
||||||
// Gecko relies on LayoutDevicePixel to convert (and snap) the app units
|
|
||||||
// into device pixels in painting and gfx code, so here we simply
|
|
||||||
// convert it into dev pixels and round it.
|
|
||||||
//
|
|
||||||
// Note: This size must contain integer values.
|
|
||||||
// https://drafts.csswg.org/resize-observer/#dom-resizeobserverboxoptions-device-pixel-content-box
|
|
||||||
const LayoutDeviceIntSize snappedSize =
|
|
||||||
LayoutDevicePixel::FromAppUnitsRounded(
|
|
||||||
GetContentRectSize(*frame),
|
|
||||||
frame->PresContext()->AppUnitsPerDevPixel());
|
|
||||||
return gfx::Size(snappedSize.ToUnknownSize());
|
|
||||||
}
|
|
||||||
case ResizeObserverBoxOptions::Content_box:
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return CSSPixel::FromAppUnits(GetContentRectSize(*frame)).ToUnknownSize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMPL_CYCLE_COLLECTION_CLASS(ResizeObservation)
|
NS_IMPL_CYCLE_COLLECTION_CLASS(ResizeObservation)
|
||||||
|
|
|
@ -1,56 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<title>ResizeObserver content-box size and scrollbars</title>
|
|
||||||
<script src="/resources/testharness.js"></script>
|
|
||||||
<script src="/resources/testharnessreport.js"></script>
|
|
||||||
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1733042">
|
|
||||||
<style>
|
|
||||||
#outer {
|
|
||||||
position: relative;
|
|
||||||
width: 100px;
|
|
||||||
height: 200px;
|
|
||||||
overflow: auto;
|
|
||||||
background: #818182;
|
|
||||||
}
|
|
||||||
|
|
||||||
#inner {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 10px;
|
|
||||||
height: 10px;
|
|
||||||
background: #0a6fc0;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<div id="outer">
|
|
||||||
<div id="inner"></div>
|
|
||||||
</div>
|
|
||||||
<script>
|
|
||||||
async function animationFrame() {
|
|
||||||
return new Promise(r => requestAnimationFrame(r));
|
|
||||||
}
|
|
||||||
|
|
||||||
// This test is expected to fail with overlay scrollbars.
|
|
||||||
promise_test(async function() {
|
|
||||||
let count = 0;
|
|
||||||
|
|
||||||
const outer = document.getElementById('outer');
|
|
||||||
const inner = document.getElementById('inner');
|
|
||||||
const observer = new ResizeObserver(entries => {
|
|
||||||
count++;
|
|
||||||
});
|
|
||||||
|
|
||||||
observer.observe(outer);
|
|
||||||
|
|
||||||
inner.style.top = '1000px';
|
|
||||||
|
|
||||||
await animationFrame();
|
|
||||||
await animationFrame();
|
|
||||||
|
|
||||||
inner.style.top = 0;
|
|
||||||
|
|
||||||
await animationFrame();
|
|
||||||
await animationFrame();
|
|
||||||
|
|
||||||
assert_equals(count, 2, "ResizeObserver should subtract scrollbar sizes from content-box rect");
|
|
||||||
});
|
|
||||||
</script>
|
|
Загрузка…
Ссылка в новой задаче