Commit 059d75ea authored by Kent Tamura's avatar Kent Tamura Committed by Commit Bot

Call HTMLSelectElement::SetActiveSelection*() only in the listbox mode

active_selection_*_ data members are referred only in listbox mode.
We don't need to update them in the menulist mode.

Bug: 1052232
Change-Id: Ib688c6e9977f42cd1cefdd83388fdc286345b842
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2212108
Auto-Submit: Kent Tamura <tkent@chromium.org>
Reviewed-by: default avatarYoshifumi Inoue <yosin@chromium.org>
Commit-Queue: Kent Tamura <tkent@chromium.org>
Cr-Commit-Position: refs/heads/master@{#771472}
parent dd4da576
......@@ -831,18 +831,6 @@ void HTMLSelectElement::SelectOption(HTMLOptionElement* element,
if (flags & kDeselectOtherOptionsFlag)
should_update_popup |= DeselectItemsWithoutValidation(element);
// We should update active selection after finishing OPTION state change
// because setActiveSelectionAnchorIndex() stores OPTION's selection state.
if (element) {
// setActiveSelectionAnchor is O(N).
if (!active_selection_anchor_ || !IsMultiple() ||
flags & kDeselectOtherOptionsFlag)
SetActiveSelectionAnchor(element);
if (!active_selection_end_ || !IsMultiple() ||
flags & kDeselectOtherOptionsFlag)
SetActiveSelectionEnd(element);
}
select_type_->DidSelectOption(element, flags, should_update_popup);
NotifyFormStateChanged();
......
......@@ -616,6 +616,9 @@ class ListBoxSelectType final : public SelectType {
void Trace(Visitor* visitor) const override;
bool DefaultEventHandler(const Event& event) override;
void DidSelectOption(HTMLOptionElement* element,
HTMLSelectElement::SelectOptionFlags flags,
bool should_update_popup) override;
void OptionRemoved(HTMLOptionElement& option) override;
void DidBlur() override;
void DidSetSuggestedOption(HTMLOptionElement* option) override;
......@@ -912,6 +915,27 @@ bool ListBoxSelectType::DefaultEventHandler(const Event& event) {
return false;
}
void ListBoxSelectType::DidSelectOption(
HTMLOptionElement* element,
HTMLSelectElement::SelectOptionFlags flags,
bool should_update_popup) {
// We should update active selection after finishing OPTION state change
// because SetActiveSelectionAnchor() stores OPTION's selection state.
if (element) {
const bool is_single = !select_->IsMultiple();
const bool deselect_other_options =
flags & HTMLSelectElement::kDeselectOtherOptionsFlag;
// SetActiveSelectionAnchor is O(N).
if (!select_->active_selection_anchor_ || is_single ||
deselect_other_options)
select_->SetActiveSelectionAnchor(element);
if (!select_->active_selection_end_ || is_single || deselect_other_options)
select_->SetActiveSelectionEnd(element);
}
SelectType::DidSelectOption(element, flags, should_update_popup);
}
void ListBoxSelectType::OptionRemoved(HTMLOptionElement& option) {
if (option_to_scroll_to_ == &option)
option_to_scroll_to_.Clear();
......
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