diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs
index e024fb6a00a..748ed682f2c 100644
--- a/components/script/dom/htmlanchorelement.rs
+++ b/components/script/dom/htmlanchorelement.rs
@@ -541,7 +541,7 @@ impl Activatable for HTMLAnchorElement {
// hyperlink"
// https://html.spec.whatwg.org/multipage/#the-a-element
// "The activation behaviour of a elements *that create hyperlinks*"
- self.upcast::().has_attribute(&local_name!("href"))
+ self.as_element().has_attribute(&local_name!("href"))
}
//TODO:https://html.spec.whatwg.org/multipage/#the-a-element
@@ -553,16 +553,12 @@ impl Activatable for HTMLAnchorElement {
//https://html.spec.whatwg.org/multipage/#the-a-element:activation-behaviour
fn activation_behavior(&self, event: &Event, target: &EventTarget) {
- //Step 1. If the node document is not fully active, abort.
- let doc = document_from_node(self);
- if !doc.is_fully_active() {
- return;
- }
- //TODO: Step 2. Check if browsing context is specified and act accordingly.
- //Step 3. Handle
.
- let element = self.upcast::();
+ let element = self.as_element();
let mouse_event = event.downcast::().unwrap();
let mut ismap_suffix = None;
+
+ // Step 1: If the target of the click event is an img element with an ismap attribute
+ // specified, then server-side image map processing must be performed.
if let Some(element) = target.downcast::() {
if target.is::() && element.has_attribute(&local_name!("ismap")) {
let target_node = element.upcast::();
@@ -575,15 +571,14 @@ impl Activatable for HTMLAnchorElement {
}
}
- // Step 4.
- //TODO: Download the link is `download` attribute is set.
-
// https://w3c.github.io/webappsec-referrer-policy/#referrer-policy-delivery
let referrer_policy = match self.RelList().Contains("noreferrer".into()) {
true => Some(ReferrerPolicy::NoReferrer),
false => None,
};
+ // Step 2.
+ //TODO: Download the link is `download` attribute is set.
follow_hyperlink(element, ismap_suffix, referrer_policy);
}
@@ -604,7 +599,10 @@ pub fn follow_hyperlink(
hyperlink_suffix: Option,
referrer_policy: Option,
) {
- // Step 1: TODO: If subject cannot navigate, then return.
+ // Step 1: If subject cannot navigate, then return.
+ if subject.cannot_navigate() {
+ return;
+ }
// Step 2, done in Step 7.
let document = document_from_node(subject);
@@ -631,13 +629,15 @@ pub fn follow_hyperlink(
Some(name) => source.choose_browsing_context(name.Value(), noopener),
None => (Some(window.window_proxy()), false),
};
+
+ // Step 8.
let chosen = match maybe_chosen {
Some(proxy) => proxy,
None => return,
};
+
if let Some(target_document) = chosen.document() {
let target_window = target_document.window();
-
// Step 9, dis-owning target's opener, if necessary
// will have been done as part of Step 7 above
// in choose_browsing_context/create_auxiliary_browsing_context.
diff --git a/components/script/dom/htmlareaelement.rs b/components/script/dom/htmlareaelement.rs
index 32a5e8ef89a..a1cf35a7eeb 100644
--- a/components/script/dom/htmlareaelement.rs
+++ b/components/script/dom/htmlareaelement.rs
@@ -16,7 +16,7 @@ use crate::dom::event::Event;
use crate::dom::eventtarget::EventTarget;
use crate::dom::htmlanchorelement::follow_hyperlink;
use crate::dom::htmlelement::HTMLElement;
-use crate::dom::node::{document_from_node, Node};
+use crate::dom::node::Node;
use crate::dom::virtualmethods::VirtualMethods;
use dom_struct::dom_struct;
use euclid::Point2D;
@@ -332,18 +332,10 @@ impl Activatable for HTMLAreaElement {
}
fn activation_behavior(&self, _event: &Event, _target: &EventTarget) {
- // Step 1
- let doc = document_from_node(self);
- if !doc.is_fully_active() {
- return;
- }
- // Step 2
- // TODO : We should be choosing a browsing context and navigating to it.
- // Step 3
let referrer_policy = match self.RelList().Contains("noreferrer".into()) {
true => Some(ReferrerPolicy::NoReferrer),
false => None,
};
- follow_hyperlink(self.upcast::(), None, referrer_policy);
+ follow_hyperlink(self.as_element(), None, referrer_policy);
}
}