mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-01 05:39:11 +00:00
LibWeb: Follow spec steps to set the selectionDirection attribute value
This commit is contained in:
parent
e0cd2edccb
commit
d0b97873d4
Notes:
github-actions[bot]
2024-10-04 17:43:25 +00:00
Author: https://github.com/tcl3
Commit: d0b97873d4
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/1625
10 changed files with 68 additions and 4 deletions
|
@ -15,4 +15,5 @@ select event fired: 6 6
|
||||||
text-input selectionStart: 6 selectionEnd: 6 selectionDirection: forward
|
text-input selectionStart: 6 selectionEnd: 6 selectionDirection: forward
|
||||||
select event fired: 6 6
|
select event fired: 6 6
|
||||||
text-input selectionStart: 6 selectionEnd: 6 selectionDirection: backward
|
text-input selectionStart: 6 selectionEnd: 6 selectionDirection: backward
|
||||||
|
select event fired: 6 6
|
||||||
textarea selectionStart: 0 selectionEnd: 9 selectionDirection: none
|
textarea selectionStart: 0 selectionEnd: 9 selectionDirection: none
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
select event fired for input
|
||||||
|
select event fired for textarea
|
|
@ -0,0 +1,25 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<script src="../include.js"></script>
|
||||||
|
<script>
|
||||||
|
asyncTest(done => {
|
||||||
|
const elementNames = [
|
||||||
|
"input",
|
||||||
|
"textarea",
|
||||||
|
];
|
||||||
|
let selectEventFiredCount = 0;
|
||||||
|
for (const elementName of elementNames) {
|
||||||
|
const element = document.createElement(elementName);
|
||||||
|
element.setRangeText("foobar", 0, element.value.length, "start");
|
||||||
|
document.body.appendChild(element);
|
||||||
|
element.onselect = () => {
|
||||||
|
element.remove();
|
||||||
|
println(`select event fired for ${elementName}`);
|
||||||
|
selectEventFiredCount++;
|
||||||
|
if (selectEventFiredCount === elementNames.length) {
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
element.selectionDirection = "backward";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -366,6 +366,22 @@ void FormAssociatedTextControlElement::set_selection_direction(Optional<String>
|
||||||
m_selection_direction = string_to_selection_direction(direction);
|
m_selection_direction = string_to_selection_direction(direction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#dom-textarea/input-selectiondirection
|
||||||
|
WebIDL::ExceptionOr<void> FormAssociatedTextControlElement::set_selection_direction_binding(Optional<String> direction)
|
||||||
|
{
|
||||||
|
// 1. If this element is an input element, and selectionDirection does not apply to this element,
|
||||||
|
// throw an "InvalidStateError" DOMException.
|
||||||
|
auto const& html_element = form_associated_element_to_html_element();
|
||||||
|
if (is<HTMLInputElement>(html_element)) {
|
||||||
|
auto const& input_element = static_cast<HTMLInputElement const&>(html_element);
|
||||||
|
if (!input_element.selection_direction_applies())
|
||||||
|
return WebIDL::InvalidStateError::create(input_element.realm(), "selectionDirection does not apply to element"_fly_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
set_the_selection_range(m_selection_start, m_selection_end, string_to_selection_direction(direction));
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#dom-textarea/input-setrangetext
|
// https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#dom-textarea/input-setrangetext
|
||||||
WebIDL::ExceptionOr<void> FormAssociatedTextControlElement::set_range_text(String const& replacement)
|
WebIDL::ExceptionOr<void> FormAssociatedTextControlElement::set_range_text(String const& replacement)
|
||||||
{
|
{
|
||||||
|
|
|
@ -149,6 +149,7 @@ public:
|
||||||
// https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#dom-textarea/input-selectiondirection
|
// https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#dom-textarea/input-selectiondirection
|
||||||
Optional<String> selection_direction() const;
|
Optional<String> selection_direction() const;
|
||||||
void set_selection_direction(Optional<String> direction);
|
void set_selection_direction(Optional<String> direction);
|
||||||
|
WebIDL::ExceptionOr<void> set_selection_direction_binding(Optional<String> direction);
|
||||||
SelectionDirection selection_direction_state() const { return m_selection_direction; }
|
SelectionDirection selection_direction_state() const { return m_selection_direction; }
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#dom-textarea/input-setrangetext
|
// https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#dom-textarea/input-setrangetext
|
||||||
|
|
|
@ -2359,6 +2359,21 @@ bool HTMLInputElement::selection_or_range_applies() const
|
||||||
return selection_or_range_applies_for_type_state(type_state());
|
return selection_or_range_applies_for_type_state(type_state());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/input.html#do-not-apply
|
||||||
|
bool HTMLInputElement::selection_direction_applies() const
|
||||||
|
{
|
||||||
|
switch (type_state()) {
|
||||||
|
case TypeAttributeState::Text:
|
||||||
|
case TypeAttributeState::Search:
|
||||||
|
case TypeAttributeState::Telephone:
|
||||||
|
case TypeAttributeState::URL:
|
||||||
|
case TypeAttributeState::Password:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool HTMLInputElement::has_selectable_text() const
|
bool HTMLInputElement::has_selectable_text() const
|
||||||
{
|
{
|
||||||
// Potential FIXME: Date, Month, Week, Time and LocalDateAndTime are rendered as a basic text input for now,
|
// Potential FIXME: Date, Month, Week, Time and LocalDateAndTime are rendered as a basic text input for now,
|
||||||
|
|
|
@ -204,10 +204,13 @@ public:
|
||||||
bool step_up_or_down_applies() const;
|
bool step_up_or_down_applies() const;
|
||||||
bool select_applies() const;
|
bool select_applies() const;
|
||||||
bool selection_or_range_applies() const;
|
bool selection_or_range_applies() const;
|
||||||
|
bool selection_direction_applies() const;
|
||||||
bool has_selectable_text() const;
|
bool has_selectable_text() const;
|
||||||
|
|
||||||
static bool selection_or_range_applies_for_type_state(TypeAttributeState);
|
static bool selection_or_range_applies_for_type_state(TypeAttributeState);
|
||||||
|
|
||||||
|
Optional<String> selection_direction_binding() { return selection_direction(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void selection_was_changed(size_t selection_start, size_t selection_end) override;
|
void selection_was_changed(size_t selection_start, size_t selection_end) override;
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ interface HTMLInputElement : HTMLElement {
|
||||||
undefined select();
|
undefined select();
|
||||||
attribute unsigned long? selectionStart;
|
attribute unsigned long? selectionStart;
|
||||||
attribute unsigned long? selectionEnd;
|
attribute unsigned long? selectionEnd;
|
||||||
attribute DOMString? selectionDirection;
|
[ImplementedAs=selection_direction_binding] attribute DOMString? selectionDirection;
|
||||||
undefined setRangeText(DOMString replacement);
|
undefined setRangeText(DOMString replacement);
|
||||||
undefined setRangeText(DOMString replacement, unsigned long start, unsigned long end, optional SelectionMode selectionMode = "preserve");
|
undefined setRangeText(DOMString replacement, unsigned long start, unsigned long end, optional SelectionMode selectionMode = "preserve");
|
||||||
undefined setSelectionRange(unsigned long start, unsigned long end, optional DOMString direction);
|
undefined setSelectionRange(unsigned long start, unsigned long end, optional DOMString direction);
|
||||||
|
|
|
@ -329,9 +329,10 @@ String HTMLTextAreaElement::selection_direction_binding() const
|
||||||
return selection_direction().value();
|
return selection_direction().value();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HTMLTextAreaElement::set_selection_direction_binding(String direction)
|
void HTMLTextAreaElement::set_selection_direction_binding(String const& direction)
|
||||||
{
|
{
|
||||||
set_selection_direction(direction);
|
// NOTE: The selectionDirection setter never returns an error for textarea elements.
|
||||||
|
MUST(static_cast<FormAssociatedTextControlElement&>(*this).set_selection_direction_binding(direction));
|
||||||
}
|
}
|
||||||
|
|
||||||
void HTMLTextAreaElement::create_shadow_tree_if_needed()
|
void HTMLTextAreaElement::create_shadow_tree_if_needed()
|
||||||
|
|
|
@ -118,7 +118,7 @@ public:
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#dom-textarea/input-selectiondirection
|
// https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#dom-textarea/input-selectiondirection
|
||||||
String selection_direction_binding() const;
|
String selection_direction_binding() const;
|
||||||
void set_selection_direction_binding(String direction);
|
void set_selection_direction_binding(String const& direction);
|
||||||
|
|
||||||
void set_dirty_value_flag(Badge<FormAssociatedElement>, bool flag) { m_dirty_value = flag; }
|
void set_dirty_value_flag(Badge<FormAssociatedElement>, bool flag) { m_dirty_value = flag; }
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue