summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibWeb/DOM/Element.cpp26
-rw-r--r--Userland/Libraries/LibWeb/DOM/Element.h4
-rw-r--r--Userland/Libraries/LibWeb/HTML/AttributeNames.h2
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.cpp7
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.h1
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLAreaElement.cpp7
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLAreaElement.h1
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLButtonElement.cpp7
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLButtonElement.h3
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLElement.idl2
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLFrameElement.cpp8
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLFrameElement.h2
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp7
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.h2
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp7
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLInputElement.h3
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLObjectElement.cpp7
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLObjectElement.h3
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLSelectElement.cpp7
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLSelectElement.h3
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.cpp7
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.h3
22 files changed, 119 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/DOM/Element.cpp b/Userland/Libraries/LibWeb/DOM/Element.cpp
index d041b4c841..8c526472b5 100644
--- a/Userland/Libraries/LibWeb/DOM/Element.cpp
+++ b/Userland/Libraries/LibWeb/DOM/Element.cpp
@@ -731,6 +731,32 @@ void Element::serialize_pseudo_elements_as_json(JsonArraySerializer<StringBuilde
}
}
+// https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex
+i32 Element::default_tab_index_value() const
+{
+ // The default value is 0 if the element is an a, area, button, frame, iframe, input, object, select, textarea, or SVG a element, or is a summary element that is a summary for its parent details.
+ // The default value is −1 otherwise.
+ // Note: The varying default value based on element type is a historical artifact.
+ // FIXME: We currently do not have the SVG a element.
+ return -1;
+}
+
+// https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex
+i32 Element::tab_index() const
+{
+ // FIXME: I'm not sure if "to_int" exactly matches the specs "rules for parsing integers"
+ auto maybe_table_index = attribute(HTML::AttributeNames::tabindex).to_int<i32>();
+ if (!maybe_table_index.has_value())
+ return default_tab_index_value();
+ return maybe_table_index.value();
+}
+
+// https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex
+void Element::set_tab_index(i32 tab_index)
+{
+ MUST(set_attribute(HTML::AttributeNames::tabindex, String::number(tab_index)));
+}
+
// https://html.spec.whatwg.org/multipage/semantics-other.html#concept-element-disabled
bool Element::is_actually_disabled() const
{
diff --git a/Userland/Libraries/LibWeb/DOM/Element.h b/Userland/Libraries/LibWeb/DOM/Element.h
index e737105c6a..0924bc78cc 100644
--- a/Userland/Libraries/LibWeb/DOM/Element.h
+++ b/Userland/Libraries/LibWeb/DOM/Element.h
@@ -154,6 +154,9 @@ public:
void clear_pseudo_element_nodes(Badge<Layout::TreeBuilder>);
void serialize_pseudo_elements_as_json(JsonArraySerializer<StringBuilder>& children_array) const;
+ i32 tab_index() const;
+ void set_tab_index(i32 tab_index);
+
bool is_actually_disabled() const;
WebIDL::ExceptionOr<JS::GCPtr<Element>> insert_adjacent_element(String const& where, JS::NonnullGCPtr<Element> element);
@@ -167,6 +170,7 @@ protected:
virtual void initialize(JS::Realm&) override;
virtual void children_changed() override;
+ virtual i32 default_tab_index_value() const;
virtual void visit_edges(Cell::Visitor&) override;
diff --git a/Userland/Libraries/LibWeb/HTML/AttributeNames.h b/Userland/Libraries/LibWeb/HTML/AttributeNames.h
index e30d9ddb79..72949afe8a 100644
--- a/Userland/Libraries/LibWeb/HTML/AttributeNames.h
+++ b/Userland/Libraries/LibWeb/HTML/AttributeNames.h
@@ -24,6 +24,7 @@ namespace AttributeNames {
__ENUMERATE_HTML_ATTRIBUTE(alt) \
__ENUMERATE_HTML_ATTRIBUTE(archive) \
__ENUMERATE_HTML_ATTRIBUTE(async) \
+ __ENUMERATE_HTML_ATTRIBUTE(autofocus) \
__ENUMERATE_HTML_ATTRIBUTE(autoplay) \
__ENUMERATE_HTML_ATTRIBUTE(axis) \
__ENUMERATE_HTML_ATTRIBUTE(background) \
@@ -208,6 +209,7 @@ namespace AttributeNames {
__ENUMERATE_HTML_ATTRIBUTE(step) \
__ENUMERATE_HTML_ATTRIBUTE(style) \
__ENUMERATE_HTML_ATTRIBUTE(summary) \
+ __ENUMERATE_HTML_ATTRIBUTE(tabindex) \
__ENUMERATE_HTML_ATTRIBUTE(target) \
__ENUMERATE_HTML_ATTRIBUTE(text) \
__ENUMERATE_HTML_ATTRIBUTE(title) \
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.cpp
index fb565e8042..28bf54d892 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.cpp
@@ -77,4 +77,11 @@ void HTMLAnchorElement::run_activation_behavior(Web::DOM::Event const&)
follow_the_hyperlink(hyperlink_suffix);
}
+// https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex
+i32 HTMLAnchorElement::default_tab_index_value() const
+{
+ // See the base function for the spec comments.
+ return 0;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.h b/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.h
index 868153ec97..94d944da4e 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.h
@@ -35,6 +35,7 @@ private:
// ^DOM::Element
virtual void parse_attribute(FlyString const& name, String const& value) override;
+ virtual i32 default_tab_index_value() const override;
// ^HTML::HTMLHyperlinkElementUtils
virtual DOM::Document& hyperlink_element_utils_document() override { return document(); }
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.cpp
index c41d3c6ba2..50080b3c2e 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.cpp
@@ -35,4 +35,11 @@ void HTMLAreaElement::set_hyperlink_element_utils_href(String href)
MUST(set_attribute(HTML::AttributeNames::href, move(href)));
}
+// https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex
+i32 HTMLAreaElement::default_tab_index_value() const
+{
+ // See the base function for the spec comments.
+ return 0;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.h b/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.h
index 234ec1eb9e..db277069ff 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.h
@@ -25,6 +25,7 @@ private:
// ^DOM::Element
virtual void parse_attribute(FlyString const& name, String const& value) override;
+ virtual i32 default_tab_index_value() const override;
// ^HTML::HTMLHyperlinkElementUtils
virtual DOM::Document& hyperlink_element_utils_document() override { return document(); }
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.cpp
index 6698264878..78ffb8a8e7 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.cpp
@@ -86,4 +86,11 @@ void HTMLButtonElement::set_type(String const& type)
MUST(set_attribute(HTML::AttributeNames::type, type));
}
+// https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex
+i32 HTMLButtonElement::default_tab_index_value() const
+{
+ // See the base function for the spec comments.
+ return 0;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.h b/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.h
index b1045f18c2..e0f4f6eb9b 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.h
@@ -55,6 +55,9 @@ public:
private:
HTMLButtonElement(DOM::Document&, DOM::QualifiedName);
+
+ // ^DOM::Element
+ virtual i32 default_tab_index_value() const override;
};
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLElement.idl b/Userland/Libraries/LibWeb/HTML/HTMLElement.idl
index 6cb9bbcc85..b7ce750515 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLElement.idl
+++ b/Userland/Libraries/LibWeb/HTML/HTMLElement.idl
@@ -32,4 +32,6 @@ HTMLElement includes HTMLOrSVGElement;
interface mixin HTMLOrSVGElement {
[SameObject] readonly attribute DOMStringMap dataset;
+
+ [CEReactions] attribute long tabIndex;
};
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLFrameElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLFrameElement.cpp
index dd2af51347..75597fed8d 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLFrameElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLFrameElement.cpp
@@ -16,4 +16,12 @@ HTMLFrameElement::HTMLFrameElement(DOM::Document& document, DOM::QualifiedName q
}
HTMLFrameElement::~HTMLFrameElement() = default;
+
+// https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex
+i32 HTMLFrameElement::default_tab_index_value() const
+{
+ // See the base function for the spec comments.
+ return 0;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLFrameElement.h b/Userland/Libraries/LibWeb/HTML/HTMLFrameElement.h
index 5b59d5445c..de3a5cc3a8 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLFrameElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLFrameElement.h
@@ -19,6 +19,8 @@ public:
private:
HTMLFrameElement(DOM::Document&, DOM::QualifiedName);
+ // ^DOM::Element
+ virtual i32 default_tab_index_value() const override;
};
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp
index c3d171b55d..adc687c5e3 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp
@@ -164,4 +164,11 @@ void run_iframe_load_event_steps(HTML::HTMLIFrameElement& element)
// FIXME: 6. Unset childDocument's iframe load in progress flag.
}
+// https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex
+i32 HTMLIFrameElement::default_tab_index_value() const
+{
+ // See the base function for the spec comments.
+ return 0;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.h b/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.h
index dd2aff3736..55a728ae94 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.h
@@ -28,9 +28,11 @@ public:
private:
HTMLIFrameElement(DOM::Document&, DOM::QualifiedName);
+ // ^DOM::Element
virtual void inserted() override;
virtual void removed_from(Node*) override;
virtual void parse_attribute(FlyString const& name, String const& value) override;
+ virtual i32 default_tab_index_value() const override;
// https://html.spec.whatwg.org/multipage/iframe-embed-object.html#process-the-iframe-attributes
void process_the_iframe_attributes(bool initial_insertion = false);
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp
index f71ecea17a..952d6450e9 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp
@@ -555,4 +555,11 @@ void HTMLInputElement::legacy_cancelled_activation_behavior_was_not_called()
m_legacy_pre_activation_behavior_checked_element_in_group = nullptr;
}
+// https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex
+i32 HTMLInputElement::default_tab_index_value() const
+{
+ // See the base function for the spec comments.
+ return 0;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h
index b77c6cbc9e..3b942e0d10 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h
@@ -123,6 +123,9 @@ private:
virtual void legacy_cancelled_activation_behavior() override;
virtual void legacy_cancelled_activation_behavior_was_not_called() override;
+ // ^DOM::Element
+ virtual i32 default_tab_index_value() const override;
+
virtual void visit_edges(Cell::Visitor&) override;
static TypeAttributeState parse_type_attribute(StringView);
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.cpp
index 7eecba0673..d93edc27b2 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.cpp
@@ -316,4 +316,11 @@ void HTMLObjectElement::update_layout_and_child_objects(Representation represent
document().set_needs_layout();
}
+// https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex
+i32 HTMLObjectElement::default_tab_index_value() const
+{
+ // See the base function for the spec comments.
+ return 0;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.h b/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.h
index ad9a0b1fcb..a1ca6fab41 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.h
@@ -62,6 +62,9 @@ private:
virtual void resource_did_load() override;
virtual void resource_did_fail() override;
+ // ^DOM::Element
+ virtual i32 default_tab_index_value() const override;
+
Representation m_representation { Representation::Unknown };
Optional<ImageLoader> m_image_loader;
};
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLSelectElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLSelectElement.cpp
index ad1180bc47..73dc93c6f3 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLSelectElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLSelectElement.cpp
@@ -122,4 +122,11 @@ void HTMLSelectElement::set_selected_index(int index)
selected_option->m_dirty = true;
}
+// https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex
+i32 HTMLSelectElement::default_tab_index_value() const
+{
+ // See the base function for the spec comments.
+ return 0;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLSelectElement.h b/Userland/Libraries/LibWeb/HTML/HTMLSelectElement.h
index 43209d5b7b..cde0d812e7 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLSelectElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLSelectElement.h
@@ -61,6 +61,9 @@ private:
virtual void visit_edges(Cell::Visitor&) override;
+ // ^DOM::Element
+ virtual i32 default_tab_index_value() const override;
+
JS::GCPtr<HTMLOptionsCollection> m_options;
};
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.cpp
index f803bce044..fb31efe7b1 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.cpp
@@ -17,4 +17,11 @@ HTMLTextAreaElement::HTMLTextAreaElement(DOM::Document& document, DOM::Qualified
HTMLTextAreaElement::~HTMLTextAreaElement() = default;
+// https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex
+i32 HTMLTextAreaElement::default_tab_index_value() const
+{
+ // See the base function for the spec comments.
+ return 0;
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.h b/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.h
index 541dbc386e..9bce80306c 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.h
@@ -50,6 +50,9 @@ public:
private:
HTMLTextAreaElement(DOM::Document&, DOM::QualifiedName);
+
+ // ^DOM::Element
+ virtual i32 default_tab_index_value() const override;
};
}