Commit e044af60 authored by Stefan Zager's avatar Stefan Zager Committed by Commit Bot

[IntersectionObserver] Apply overflow clip to document.scrollingElement

If the explicit root element is the document's scrollingElement, we interpret
that to mean we should apply the root scroller's overflow clip (just as we
already do with the implicit root).

Hidden behind a flag for testing, and pending resolution of spec issues and
sending intent's.

BUG=1015183
R=chrishtr@chromium.org

Change-Id: I6b2542dd353ea0be6b67b5922eee75445070f10a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1865257
Commit-Queue: Stefan Zager <szager@chromium.org>
Reviewed-by: default avatarChris Harrelson <chrishtr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#706742}
parent 627ebccb
...@@ -192,6 +192,11 @@ IntersectionGeometry::RootGeometry::RootGeometry(const LayoutObject* root, ...@@ -192,6 +192,11 @@ IntersectionGeometry::RootGeometry::RootGeometry(const LayoutObject* root,
if (!root || !root->GetNode() || !root->GetNode()->isConnected() || if (!root || !root->GetNode() || !root->GetNode()->isConnected() ||
!root->IsBox()) !root->IsBox())
return; return;
if (RuntimeEnabledFeatures::
IntersectionObserverDocumentScrollingElementRootEnabled() &&
root->GetNode() == root->GetDocument().scrollingElement()) {
root = root->GetDocument().GetLayoutView();
}
zoom = root->StyleRef().EffectiveZoom(); zoom = root->StyleRef().EffectiveZoom();
local_root_rect = InitializeRootRect(root, margin); local_root_rect = InitializeRootRect(root, margin);
TransformState transform_state(TransformState::kApplyTransformDirection); TransformState transform_state(TransformState::kApplyTransformDirection);
......
...@@ -825,6 +825,10 @@ ...@@ -825,6 +825,10 @@
origin_trial_feature_name: "InstalledApp", origin_trial_feature_name: "InstalledApp",
status: "experimental", status: "experimental",
}, },
{
name: "IntersectionObserverDocumentScrollingElementRoot",
status: "experimental",
},
{ {
name: "IntersectionObserverV2", name: "IntersectionObserverV2",
status: "stable", status: "stable",
......
<!DOCTYPE html>
<meta name="viewport" content="width=device-width,initial-scale=1">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./resources/intersection-observer-test-utils.js"></script>
<style>
pre, #log {
position: absolute;
top: 0;
left: 200px;
}
iframe {
height: 250px;
width: 150px;
border: 0;
}
</style>
<iframe id="target-iframe" src="resources/iframe-no-root-subframe.html"></iframe>
<script>
var iframe = document.getElementById("target-iframe");
var target;
var root;
var entries = [];
iframe.onload = function() {
runTestCycle(function() {
assert_true(!!iframe, "iframe exists");
root = iframe.contentDocument.scrollingElement;
assert_true(!!root, "Root element exists.");
target = iframe.contentDocument.getElementById("target");
assert_true(!!target, "Target element exists.");
var observer = new IntersectionObserver(function(changes) {
entries = entries.concat(changes)
}, { root: root });
observer.observe(target);
entries = entries.concat(observer.takeRecords());
assert_equals(entries.length, 0, "No initial notifications.");
runTestCycle(step0, "First rAF.");
}, "Observer with explicit root which is the document's scrolling element.");
};
function step0() {
let vw = iframe.contentDocument.documentElement.clientWidth;
let vh = iframe.contentDocument.documentElement.clientHeight;
// The target element is partially clipped by the iframe's root scroller, so
// height of the intersection rect is (250 - 208) == 42.
checkLastEntry(entries, 0, [8, 108, 208, 308, 8, 108, 208, 250, 0, vw, 0, vh, true]);
}
</script>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment