Skip to content

Commit

Permalink
[anchor-position] Update layout on anchor attribute changes
Browse files Browse the repository at this point in the history
This patch also adds WPTs for the anchor attribute (without popovers)
to support the HTML PR whatwg/html#9144

Fixed: 1432016
Change-Id: I3e80326268008e6beaf74389bb32c01050406a81
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4434155
Commit-Queue: Joey Arhar <jarhar@chromium.org>
Commit-Queue: Xiaocheng Hu <xiaochengh@chromium.org>
Reviewed-by: Joey Arhar <jarhar@chromium.org>
Code-Coverage: Findit <findit-for-me@appspot.gserviceaccount.com>
Auto-Submit: Xiaocheng Hu <xiaochengh@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1131479}
  • Loading branch information
xiaochengh authored and Chromium LUCI CQ committed Apr 17, 2023
1 parent c2410a7 commit 0d9edb2
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include "third_party/blink/renderer/core/dom/id_target_observer.h"
#include "third_party/blink/renderer/core/html/html_element.h"
#include "third_party/blink/renderer/core/layout/layout_object.h"

namespace blink {

Expand Down Expand Up @@ -60,6 +61,10 @@ void AnchorElementObserver::Notify() {
new_anchor->IncrementImplicitlyAnchoredElementCount();
}
anchor_ = new_anchor;
if (element_->GetLayoutObject()) {
element_->GetLayoutObject()->SetNeedsLayoutAndFullPaintInvalidation(
layout_invalidation_reason::kAnchorPositioning);
}
}
ResetIdTargetObserverIfNeeded();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<!DOCTYPE html>
<link rel="help" href="https://github.com/whatwg/html/pull/9144">
<link rel="author" href="mailto:xiaochengh@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<style>
body {
margin: 0;
}
#anchor {
width: 100px;
height: 100px;
margin-left: 50px;
margin-top: 50px;
background: orange;
}
#target {
position: absolute;
left: anchor(right);
top: anchor(top);
width: 100px;
height: 100px;
background: lime;
}
</style>
<div id="anchor"></div>
<div id="target" anchor="anchor"></div>

<script>
test(() => {
assert_equals(target.offsetLeft, 150);
assert_equals(target.offsetTop, 50);
}, 'The anchor attribute should position the target element next to its implicit anchor');

test(() => {
assert_equals(target.anchorElement, anchor);
}, 'The element.anchorElement IDL should reflect the element pointed to by the anchor attribute');
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<!DOCTYPE html>
<link rel="help" href="https://github.com/whatwg/html/pull/9144">
<link rel="author" href="mailto:xiaochengh@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<style>
body {
margin: 0;
}
.anchor {
width: 100px;
height: 100px;
margin-left: 50px;
margin-top: 50px;
background: orange;
}
.target {
position: absolute;
left: anchor(right, 123px);
top: anchor(top, 456px);
width: 100px;
height: 100px;
background: lime;
}
</style>
<div class="anchor" id="anchor1"></div>
<div class="anchor" id="anchor2"></div>
<div class="target" id="target1" anchor="anchor1"></div>
<div class="target" id="target2" anchor="anchor1"></div>

<script>
test(() => {
document.body.offsetLeft; // Force layout
target1.setAttribute('anchor', 'anchor2');
assert_equals(target1.offsetLeft, 150);
assert_equals(target1.offsetTop, 200);

target1.setAttribute('anchor', 'anchor1');
assert_equals(target1.offsetLeft, 150);
assert_equals(target1.offsetTop, 50);
}, 'Layout should be updated when anchor attribute changes to another element');

test(() => {
document.body.offsetLeft; // Force layout
target2.setAttribute('anchor', 'nonexist-anchor');
assert_equals(target2.offsetLeft, 123);
assert_equals(target2.offsetTop, 456);
}, 'Layout should be updated when anchor attribute changes to a non-existent element');
</script>

0 comments on commit 0d9edb2

Please sign in to comment.