1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 12:17:44 +00:00

LibWeb: Allow focusing individual (focusable) elements with Tab key

You can now cycle through focusable elements (currently only hyperlinks
are focusable) with the Tab key.

The focus outline is rendered in a new FocusOutline paint phase.
This commit is contained in:
Andreas Kling 2020-08-14 19:40:37 +02:00
parent 5939af14d4
commit 01022eb5d6
11 changed files with 92 additions and 2 deletions

View file

@ -508,4 +508,18 @@ bool Document::is_editable() const
return m_editable;
}
void Document::set_focused_element(Element* element)
{
if (m_focused_element == element)
return;
if (element)
m_focused_element = element->make_weak_ptr();
else
m_focused_element = nullptr;
if (m_layout_root)
m_layout_root->set_needs_display();
}
}

View file

@ -161,6 +161,11 @@ public:
void set_editable(bool editable) { m_editable = editable; }
virtual bool is_editable() const final;
Element* focused_element() { return m_focused_element; }
const Element* focused_element() const { return m_focused_element; }
void set_focused_element(Element*);
private:
virtual RefPtr<LayoutNode> create_layout_node(const CSS::StyleProperties* parent_style) override;
@ -191,6 +196,8 @@ private:
QuirksMode m_quirks_mode { QuirksMode::No };
bool m_editable { false };
WeakPtr<Element> m_focused_element;
};
}

View file

@ -295,4 +295,9 @@ String Element::inner_html() const
return builder.to_string();
}
bool Element::is_focused() const
{
return document().focused_element() == this;
}
}

View file

@ -87,6 +87,9 @@ public:
String inner_html() const;
void set_inner_html(StringView);
bool is_focused() const;
virtual bool is_focusable() const { return false; }
protected:
RefPtr<LayoutNode> create_layout_node(const CSS::StyleProperties* parent_style) override;