aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/htmlanchorelement.rs54
-rw-r--r--components/script/dom/htmltableelement.rs26
-rw-r--r--components/script/dom/webidls/HTMLTableElement.webidl2
3 files changed, 60 insertions, 22 deletions
diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs
index 2774b74a60a..b47d799c8ae 100644
--- a/components/script/dom/htmlanchorelement.rs
+++ b/components/script/dom/htmlanchorelement.rs
@@ -24,13 +24,14 @@ use dom::node::{Node, NodeHelpers, NodeTypeId, document_from_node, window_from_n
use dom::virtualmethods::VirtualMethods;
use dom::window::WindowHelpers;
-use num::ToPrimitive;
-use std::default::Default;
-use string_cache::Atom;
use util::str::DOMString;
+use num::ToPrimitive;
+use string_cache::Atom;
use url::UrlParser;
+use std::default::Default;
+
#[dom_struct]
pub struct HTMLAnchorElement {
htmlelement: HTMLElement,
@@ -149,24 +150,41 @@ impl<'a> Activatable for &'a HTMLAnchorElement {
}
}
- //TODO: Step 4. Download the link is `download` attribute is set.
-
- let href = element.get_attribute(&ns!(""), &atom!("href")).unwrap();
- let mut value = href.r().Value();
- if let Some(suffix) = ismap_suffix {
- value.push_str(&suffix);
- }
- debug!("clicked on link to {}", value);
-
- let window = doc.window();
- let base_url = window.get_url();
- let url = UrlParser::new().base_url(&base_url).parse(&value);
- // FIXME: handle URL parse errors more gracefully.
- let url = url.unwrap();
- window.load_url(url);
+ // Step 4.
+ //TODO: Download the link is `download` attribute is set.
+ follow_hyperlink(element, ismap_suffix);
}
//TODO:https://html.spec.whatwg.org/multipage/#the-a-element
fn implicit_submission(&self, _ctrlKey: bool, _shiftKey: bool, _altKey: bool, _metaKey: bool) {
}
}
+
+/// https://html.spec.whatwg.org/multipage/#following-hyperlinks-2
+fn follow_hyperlink(subject: &Element, hyperlink_suffix: Option<DOMString>) {
+ // Step 1: replace.
+ // Step 2: source browsing context.
+ // Step 3: target browsing context.
+
+ // Step 4.
+ let attribute = subject.get_attribute(&ns!(""), &atom!("href")).unwrap();
+ let mut href = attribute.Value();
+
+ // Step 6.
+ // https://www.w3.org/Bugs/Public/show_bug.cgi?id=28925
+ if let Some(suffix) = hyperlink_suffix {
+ href.push_str(&suffix);
+ }
+
+ // Step 4-5.
+ let document = document_from_node(subject);
+ let url = match UrlParser::new().base_url(&document.url()).parse(&href) {
+ Ok(url) => url,
+ Err(_) => return,
+ };
+
+ // Step 7.
+ debug!("following hyperlink to {}", url.serialize());
+ let window = document.window();
+ window.load_url(url);
+}
diff --git a/components/script/dom/htmltableelement.rs b/components/script/dom/htmltableelement.rs
index a8a1cdf1b7b..96db990368b 100644
--- a/components/script/dom/htmltableelement.rs
+++ b/components/script/dom/htmltableelement.rs
@@ -6,14 +6,16 @@ use dom::attr::{Attr, AttrHelpers, AttrValue};
use dom::bindings::codegen::Bindings::HTMLTableElementBinding::HTMLTableElementMethods;
use dom::bindings::codegen::Bindings::HTMLTableElementBinding;
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
-use dom::bindings::codegen::InheritTypes::{HTMLElementCast, HTMLTableCaptionElementCast};
+use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast, HTMLTableCaptionElementCast};
use dom::bindings::codegen::InheritTypes::{HTMLTableElementDerived, NodeCast};
-use dom::bindings::js::Root;
+use dom::bindings::codegen::InheritTypes::HTMLTableSectionElementDerived;
+use dom::bindings::js::{Root, RootedReference};
use dom::document::Document;
use dom::eventtarget::{EventTarget, EventTargetTypeId};
-use dom::element::ElementTypeId;
+use dom::element::{ElementHelpers, ElementTypeId};
use dom::htmlelement::{HTMLElement, HTMLElementTypeId};
use dom::htmltablecaptionelement::HTMLTableCaptionElement;
+use dom::htmltablesectionelement::HTMLTableSectionElement;
use dom::node::{Node, NodeHelpers, NodeTypeId, document_from_node};
use dom::virtualmethods::VirtualMethods;
@@ -110,6 +112,24 @@ impl<'a> HTMLTableElementMethods for &'a HTMLTableElement {
NodeCast::from_ref(caption.r()).remove_self();
}
}
+
+ // https://html.spec.whatwg.org/multipage/#dom-table-createtbody
+ fn CreateTBody(self) -> Root<HTMLTableSectionElement> {
+ let tbody = HTMLTableSectionElement::new("tbody".to_owned(),
+ None,
+ document_from_node(self).r());
+ let node = NodeCast::from_ref(self);
+ let last_tbody =
+ node.rev_children()
+ .filter_map(ElementCast::to_root)
+ .find(|n| n.is_htmltablesectionelement() && n.local_name() == &atom!("tbody"));
+ let reference_element =
+ last_tbody.and_then(|t| NodeCast::from_root(t).GetNextSibling());
+
+ assert!(node.InsertBefore(NodeCast::from_ref(tbody.r()),
+ reference_element.r()).is_ok());
+ tbody
+ }
}
pub trait HTMLTableElementHelpers {
diff --git a/components/script/dom/webidls/HTMLTableElement.webidl b/components/script/dom/webidls/HTMLTableElement.webidl
index 26639442ee4..3a614efce1f 100644
--- a/components/script/dom/webidls/HTMLTableElement.webidl
+++ b/components/script/dom/webidls/HTMLTableElement.webidl
@@ -15,7 +15,7 @@ interface HTMLTableElement : HTMLElement {
//HTMLElement createTFoot();
//void deleteTFoot();
//readonly attribute HTMLCollection tBodies;
- //HTMLElement createTBody();
+ HTMLTableSectionElement createTBody();
//readonly attribute HTMLCollection rows;
//HTMLElement insertRow(optional long index = -1);
//void deleteRow(long index);