diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-10-21 12:04:17 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-10-21 12:04:17 +0200 |
commit | 8e710b16de32fbe282e8c4a42f8728f74b0df98b (patch) | |
tree | 66ae220ec8aa386ac964ebe5a8bdb6c232159b57 /Libraries/LibHTML | |
parent | 4d9740ecef3a013d9b31e662ef64fc43dcb0f7ae (diff) | |
download | serenity-8e710b16de32fbe282e8c4a42f8728f74b0df98b.zip |
LibHTML: Clicking on a fragment link should prefer <a id> over <a name>
It turns out that other engines prefer <a id> over <a name> when
deciding which anchor element to jump to.
This patch aligns LibHTML's behavior with WebKit and Gecko.
Thanks to "/cam 2" for bringing this up. :^)
Diffstat (limited to 'Libraries/LibHTML')
-rw-r--r-- | Libraries/LibHTML/HtmlView.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/Libraries/LibHTML/HtmlView.cpp b/Libraries/LibHTML/HtmlView.cpp index 66eb4462d7..b467290cdf 100644 --- a/Libraries/LibHTML/HtmlView.cpp +++ b/Libraries/LibHTML/HtmlView.cpp @@ -319,17 +319,20 @@ void HtmlView::scroll_to_anchor(const StringView& name) if (!document()) return; - HTMLAnchorElement* element = nullptr; - document()->for_each_in_subtree([&](auto& node) { - if (is<HTMLAnchorElement>(node)) { - auto& anchor_element = to<HTMLAnchorElement>(node); - if (anchor_element.name() == name) { - element = &anchor_element; - return IterationDecision::Break; + const HTMLAnchorElement* element = nullptr; + if (auto* candidate = document()->get_element_by_id(name)) { + if (is<HTMLAnchorElement>(*candidate)) + element = to<HTMLAnchorElement>(candidate); + } + if (!element) { + auto candidates = document()->get_elements_by_name(name); + for (auto* candidate : candidates) { + if (is<HTMLAnchorElement>(*candidate)) { + element = to<HTMLAnchorElement>(candidate); + break; } } - return IterationDecision::Continue; - }); + } if (!element) { dbg() << "HtmlView::scroll_to_anchor(): Anchor not found: '" << name << "'"; |