diff --git a/third_party/blink/renderer/core/css/scroll_state_query_snapshot.cc b/third_party/blink/renderer/core/css/scroll_state_query_snapshot.cc index bbebca045de4d..10c36dcb48ad1 100644 --- a/third_party/blink/renderer/core/css/scroll_state_query_snapshot.cc +++ b/third_party/blink/renderer/core/css/scroll_state_query_snapshot.cc @@ -8,6 +8,8 @@ #include "third_party/blink/renderer/core/css/style_change_reason.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/element.h" +#include "third_party/blink/renderer/core/html/forms/html_select_element.h" +#include "third_party/blink/renderer/core/html/forms/text_control_element.h" #include "third_party/blink/renderer/core/layout/layout_box_model_object.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/paint/object_paint_properties.h" @@ -50,7 +52,20 @@ bool ScrollStateQuerySnapshot::UpdateSnapshot() { if (layout_object->IsDocumentElement()) { layout_object = layout_object->View(); } - if (PaintLayerScrollableArea* scrollable_area = + // Don't disclose autofill-preview state through scroll-state(scrollable). + // The PaintLayerScrollableArea reflects the previewed value/option even + // though Element::scrollTop()/scrollHeight() mask it. crbug.com/1261689. + bool mask_for_autofill_preview = false; + if (auto* text_control = DynamicTo(container_.Get())) { + mask_for_autofill_preview = !text_control->SuggestedValue().empty(); + } else if (auto* select = + DynamicTo(container_.Get())) { + mask_for_autofill_preview = + !select->UsesMenuList() && select->IsPreviewed(); + } + if (mask_for_autofill_preview) { + // Behave as if the container is not scrollable while previewing. + } else if (PaintLayerScrollableArea* scrollable_area = layout_object->GetScrollableArea()) { ScrollOffset max_offset = scrollable_area->MaximumScrollOffset(); ScrollOffset min_offset = scrollable_area->MinimumScrollOffset();