Commit acabe459 authored by Vladimir Levin's avatar Vladimir Levin Committed by Commit Bot

ScrollAnchoring: Limit focus priority to editable elements.

This patch limits the selection of priority candidate to focused
elements with editable style. That is, previously we would consider
any focused element as a priority scroll anchor. Now, this is only
true if the element is editable.

This should be a middle ground that allows most cases in referenced
bug to be fixed (> 30 stars, multiple merged bugs). However, it would
also preserve the layout stability when editing forms with text
input.

R=chrishtr@chromium.org

Fixed: 1102229
Change-Id: I7341f0e513b70f8a4d836cebb68b931f2518534f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2363079
Auto-Submit: vmpstr <vmpstr@chromium.org>
Reviewed-by: default avatarChris Harrelson <chrishtr@chromium.org>
Commit-Queue: Chris Harrelson <chrishtr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#800259}
parent 936d0343
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "third_party/blink/renderer/core/dom/element_traversal.h" #include "third_party/blink/renderer/core/dom/element_traversal.h"
#include "third_party/blink/renderer/core/dom/nth_index_cache.h" #include "third_party/blink/renderer/core/dom/nth_index_cache.h"
#include "third_party/blink/renderer/core/dom/static_node_list.h" #include "third_party/blink/renderer/core/dom/static_node_list.h"
#include "third_party/blink/renderer/core/editing/editing_utilities.h"
#include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h"
#include "third_party/blink/renderer/core/frame/root_frame_viewport.h" #include "third_party/blink/renderer/core/frame/root_frame_viewport.h"
#include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/core/frame/web_feature.h"
...@@ -338,14 +339,20 @@ bool ScrollAnchor::FindAnchorInPriorityCandidates() { ...@@ -338,14 +339,20 @@ bool ScrollAnchor::FindAnchorInPriorityCandidates() {
auto& document = scroller_box->GetDocument(); auto& document = scroller_box->GetDocument();
// Focused area. // Focused area.
LayoutObject* candidate = LayoutObject* candidate = nullptr;
PriorityCandidateFromNode(document.FocusedElement()); ExamineResult result{kSkip};
auto result = ExaminePriorityCandidate(candidate); auto* focused_element = document.FocusedElement();
if (focused_element && HasEditableStyle(*focused_element)) {
candidate = PriorityCandidateFromNode(focused_element);
if (candidate) {
result = ExaminePriorityCandidate(candidate);
if (result.viable) { if (result.viable) {
anchor_object_ = candidate; anchor_object_ = candidate;
corner_ = result.corner; corner_ = result.corner;
return true; return true;
} }
}
}
// Active find-in-page match. // Active find-in-page match.
candidate = candidate =
......
...@@ -1181,7 +1181,7 @@ TEST_F(ScrollAnchorFindInPageTest, FocusPrioritizedOverFindInPage) { ...@@ -1181,7 +1181,7 @@ TEST_F(ScrollAnchorFindInPageTest, FocusPrioritizedOverFindInPage) {
<div class=spacer></div> <div class=spacer></div>
<div class=spacer></div> <div class=spacer></div>
<div class=spacer></div> <div class=spacer></div>
<div id=focus_target tabindex=0></div> <div id=focus_target contenteditable></div>
<div id=growing></div> <div id=growing></div>
<div id=find_target>findme</div> <div id=find_target>findme</div>
<div class=spacer></div> <div class=spacer></div>
...@@ -1239,7 +1239,7 @@ TEST_F(ScrollAnchorFindInPageTest, FocusedUnderStickyIsSkipped) { ...@@ -1239,7 +1239,7 @@ TEST_F(ScrollAnchorFindInPageTest, FocusedUnderStickyIsSkipped) {
<div class=spacer></div> <div class=spacer></div>
<div id=check></div> <div id=check></div>
<div class=sticky> <div class=sticky>
<div id=target tabindex=0></div> <div id=target contenteditable></div>
</div> </div>
<div class=spacer></div> <div class=spacer></div>
<div class=spacer></div> <div class=spacer></div>
......
...@@ -21,7 +21,7 @@ body { height: 4000px } ...@@ -21,7 +21,7 @@ body { height: 4000px }
<div class=spacer></div> <div class=spacer></div>
<div id=growing></div> <div id=growing></div>
<div class=spacer></div> <div class=spacer></div>
<div id=focused tabindex=0></div> <div id=focused contenteditable></div>
<div class=spacer></div> <div class=spacer></div>
<div class=spacer></div> <div class=spacer></div>
......
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