summaryrefslogtreecommitdiff
path: root/Libraries/LibHTML
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-10-21 12:04:17 +0200
committerAndreas Kling <awesomekling@gmail.com>2019-10-21 12:04:17 +0200
commit8e710b16de32fbe282e8c4a42f8728f74b0df98b (patch)
tree66ae220ec8aa386ac964ebe5a8bdb6c232159b57 /Libraries/LibHTML
parent4d9740ecef3a013d9b31e662ef64fc43dcb0f7ae (diff)
downloadserenity-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.cpp21
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 << "'";