Forms: Optimize setRangeText()
Avoid string comparisons by using V8SelectionMode. This CL reduces
Android binary size by 264 Bytes.
This CL has no user-visible behavior changes.
Change-Id: Ia4be39bc9f96ca6fb797b3f7e664251ce0d0ac03
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3755024
Commit-Queue: Yuki Shiino <yukishiino@chromium.org>
Auto-Submit: Kent Tamura <tkent@chromium.org>
Reviewed-by: Yuki Shiino <yukishiino@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1023067}
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.cc b/third_party/blink/renderer/core/html/forms/html_input_element.cc
index 9f7c3ab..7672f2d 100644
--- a/third_party/blink/renderer/core/html/forms/html_input_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_input_element.cc
@@ -38,6 +38,7 @@
#include "third_party/blink/renderer/bindings/core/v8/js_event_handler_for_content_attribute.h"
#include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_focus_options.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_selection_mode.h"
#include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
#include "third_party/blink/renderer/core/css/css_property_names.h"
#include "third_party/blink/renderer/core/css/style_change_reason.h"
@@ -2072,7 +2073,7 @@
void HTMLInputElement::setRangeText(const String& replacement,
unsigned start,
unsigned end,
- const String& selection_mode,
+ const V8SelectionMode& selection_mode,
ExceptionState& exception_state) {
if (!input_type_->SupportsSelectionAPI()) {
exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.h b/third_party/blink/renderer/core/html/forms/html_input_element.h
index 3ac575e..1505b2e 100644
--- a/third_party/blink/renderer/core/html/forms/html_input_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_input_element.h
@@ -318,7 +318,7 @@
void setRangeText(const String& replacement,
unsigned start,
unsigned end,
- const String& selection_mode,
+ const V8SelectionMode& selection_mode,
ExceptionState&) final;
HTMLImageLoader* ImageLoader() const { return image_loader_.Get(); }
diff --git a/third_party/blink/renderer/core/html/forms/text_control_element.cc b/third_party/blink/renderer/core/html/forms/text_control_element.cc
index 6847276..74180ea6 100644
--- a/third_party/blink/renderer/core/html/forms/text_control_element.cc
+++ b/third_party/blink/renderer/core/html/forms/text_control_element.cc
@@ -25,6 +25,7 @@
#include "third_party/blink/renderer/core/html/forms/text_control_element.h"
#include "third_party/blink/public/mojom/input/focus_type.mojom-blink.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_selection_mode.h"
#include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
#include "third_party/blink/renderer/core/css/style_change_reason.h"
#include "third_party/blink/renderer/core/dom/document.h"
@@ -303,14 +304,15 @@
void TextControlElement::setRangeText(const String& replacement,
ExceptionState& exception_state) {
- setRangeText(replacement, selectionStart(), selectionEnd(), "preserve",
+ setRangeText(replacement, selectionStart(), selectionEnd(),
+ V8SelectionMode(V8SelectionMode::Enum::kPreserve),
exception_state);
}
void TextControlElement::setRangeText(const String& replacement,
unsigned start,
unsigned end,
- const String& selection_mode,
+ const V8SelectionMode& selection_mode,
ExceptionState& exception_state) {
if (start > end) {
exception_state.ThrowDOMException(
@@ -340,26 +342,31 @@
SetValue(text.ToString(), TextFieldEventBehavior::kDispatchNoEvent,
TextControlSetValueSelection::kDoNotSet);
- if (selection_mode == "select") {
- new_selection_start = start;
- new_selection_end = start + replacement_length;
- } else if (selection_mode == "start") {
- new_selection_start = new_selection_end = start;
- } else if (selection_mode == "end") {
- new_selection_start = new_selection_end = start + replacement_length;
- } else {
- DCHECK_EQ(selection_mode, "preserve");
- int delta = replacement_length - (end - start);
-
- if (new_selection_start > end)
- new_selection_start += delta;
- else if (new_selection_start > start)
+ switch (selection_mode.AsEnum()) {
+ case V8SelectionMode::Enum::kSelect:
new_selection_start = start;
-
- if (new_selection_end > end)
- new_selection_end += delta;
- else if (new_selection_end > start)
new_selection_end = start + replacement_length;
+ break;
+ case V8SelectionMode::Enum::kStart:
+ new_selection_start = new_selection_end = start;
+ break;
+ case V8SelectionMode::Enum::kEnd:
+ new_selection_start = new_selection_end = start + replacement_length;
+ break;
+ case V8SelectionMode::Enum::kPreserve: {
+ int delta = replacement_length - (end - start);
+
+ if (new_selection_start > end)
+ new_selection_start += delta;
+ else if (new_selection_start > start)
+ new_selection_start = start;
+
+ if (new_selection_end > end)
+ new_selection_end += delta;
+ else if (new_selection_end > start)
+ new_selection_end = start + replacement_length;
+ break;
+ }
}
setSelectionRangeForBinding(new_selection_start, new_selection_end);
diff --git a/third_party/blink/renderer/core/html/forms/text_control_element.h b/third_party/blink/renderer/core/html/forms/text_control_element.h
index 101e703..f96ef1a2 100644
--- a/third_party/blink/renderer/core/html/forms/text_control_element.h
+++ b/third_party/blink/renderer/core/html/forms/text_control_element.h
@@ -36,6 +36,7 @@
namespace blink {
class ExceptionState;
+class V8SelectionMode;
enum TextFieldSelectionDirection {
kSelectionHasNoDirection,
@@ -91,7 +92,7 @@
virtual void setRangeText(const String& replacement,
unsigned start,
unsigned end,
- const String& selection_mode,
+ const V8SelectionMode& selection_mode,
ExceptionState&);
// Web-exposed setSelectionRange() function. This schedule to dispatch
// 'select' event.