aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/element.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/element.rs')
-rw-r--r--components/script/dom/element.rs81
1 files changed, 80 insertions, 1 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index 25d9f0d45b8..677f9acda0e 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -47,7 +47,9 @@ use dom::htmlimageelement::{HTMLImageElement, LayoutHTMLImageElementHelpers};
use dom::htmlinputelement::{HTMLInputElement, LayoutHTMLInputElementHelpers};
use dom::htmllabelelement::HTMLLabelElement;
use dom::htmllegendelement::HTMLLegendElement;
+use dom::htmlobjectelement::HTMLObjectElement;
use dom::htmloptgroupelement::HTMLOptGroupElement;
+use dom::htmlselectelement::HTMLSelectElement;
use dom::htmltablecellelement::{HTMLTableCellElement, HTMLTableCellElementLayoutHelpers};
use dom::htmltableelement::{HTMLTableElement, HTMLTableElementLayoutHelpers};
use dom::htmltablerowelement::{HTMLTableRowElement, HTMLTableRowElementLayoutHelpers};
@@ -60,6 +62,7 @@ use dom::node::{NodeDamage, SEQUENTIALLY_FOCUSABLE, UnbindContext};
use dom::node::{document_from_node, window_from_node};
use dom::nodelist::NodeList;
use dom::text::Text;
+use dom::validation::Validatable;
use dom::virtualmethods::{VirtualMethods, vtable_for};
use html5ever::serialize;
use html5ever::serialize::SerializeOpts;
@@ -1075,7 +1078,7 @@ impl Element {
}
let url = self.get_string_attribute(local_name);
let doc = document_from_node(self);
- let base = doc.url();
+ let base = doc.base_url();
// https://html.spec.whatwg.org/multipage/#reflect
// XXXManishearth this doesn't handle `javascript:` urls properly
match base.join(&url) {
@@ -1165,6 +1168,35 @@ impl Element {
let node = self.upcast::<Node>();
node.owner_doc().element_attr_will_change(self);
}
+
+ // https://dom.spec.whatwg.org/#insert-adjacent
+ pub fn insert_adjacent(&self, where_: DOMString, node: &Node)
+ -> Fallible<Option<Root<Node>>> {
+ let self_node = self.upcast::<Node>();
+ match &*where_ {
+ "beforebegin" => {
+ if let Some(parent) = self_node.GetParentNode() {
+ Node::pre_insert(node, &parent, Some(self_node)).map(Some)
+ } else {
+ Ok(None)
+ }
+ }
+ "afterbegin" => {
+ Node::pre_insert(node, &self_node, self_node.GetFirstChild().r()).map(Some)
+ }
+ "beforeend" => {
+ Node::pre_insert(node, &self_node, None).map(Some)
+ }
+ "afterend" => {
+ if let Some(parent) = self_node.GetParentNode() {
+ Node::pre_insert(node, &parent, self_node.GetNextSibling().r()).map(Some)
+ } else {
+ Ok(None)
+ }
+ }
+ _ => Err(Error::Syntax)
+ }
+ }
}
impl ElementMethods for Element {
@@ -1617,6 +1649,23 @@ impl ElementMethods for Element {
}
}
}
+
+ // https://dom.spec.whatwg.org/#dom-element-insertadjacentelement
+ fn InsertAdjacentElement(&self, where_: DOMString, element: &Element)
+ -> Fallible<Option<Root<Element>>> {
+ let inserted_node = try!(self.insert_adjacent(where_, element.upcast()));
+ Ok(inserted_node.map(|node| Root::downcast(node).unwrap()))
+ }
+
+ // https://dom.spec.whatwg.org/#dom-element-insertadjacenttext
+ fn InsertAdjacentText(&self, where_: DOMString, data: DOMString)
+ -> ErrorResult {
+ // Step 1.
+ let text = Text::new(data, &document_from_node(self));
+
+ // Step 2.
+ self.insert_adjacent(where_, text.upcast()).map(|_| ())
+ }
}
pub fn fragment_affecting_attributes() -> [Atom; 3] {
@@ -1913,6 +1962,36 @@ impl Element {
})
}
+ // https://html.spec.whatwg.org/multipage/#category-submit
+ pub fn as_maybe_validatable(&self) -> Option<&Validatable> {
+ let element = match self.upcast::<Node>().type_id() {
+ NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) => {
+ let element = self.downcast::<HTMLInputElement>().unwrap();
+ Some(element as &Validatable)
+ },
+ NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLButtonElement)) => {
+ let element = self.downcast::<HTMLButtonElement>().unwrap();
+ Some(element as &Validatable)
+ },
+ NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLObjectElement)) => {
+ let element = self.downcast::<HTMLObjectElement>().unwrap();
+ Some(element as &Validatable)
+ },
+ NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLSelectElement)) => {
+ let element = self.downcast::<HTMLSelectElement>().unwrap();
+ Some(element as &Validatable)
+ },
+ NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement)) => {
+ let element = self.downcast::<HTMLTextAreaElement>().unwrap();
+ Some(element as &Validatable)
+ },
+ _ => {
+ None
+ }
+ };
+ element
+ }
+
pub fn click_in_progress(&self) -> bool {
self.upcast::<Node>().get_flag(CLICK_IN_PROGRESS)
}