From c92d58980cd8eb6a1b267fe195213fc2354b1773 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Sat, 11 Oct 2014 16:44:48 +0530 Subject: [PATCH] Create an almost-correct form_owner() for convenience --- components/script/dom/htmlformelement.rs | 4 +++ components/script/dom/htmlinputelement.rs | 30 +++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index 639d2296608..d8b0ad76695 100644 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -410,3 +410,7 @@ impl<'a> FormSubmitter<'a> { } } } + +pub trait FormOwner<'a> { + fn form_owner(self) -> Option>; +} diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index b63fee7917b..20d8beb5390 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -8,16 +8,17 @@ use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::HTMLInputElementBinding; use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods; use dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods; -use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast, HTMLInputElementCast, NodeCast}; +use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast, HTMLFormElementCast, HTMLInputElementCast, NodeCast}; use dom::bindings::codegen::InheritTypes::{HTMLInputElementDerived, HTMLFieldSetElementDerived}; use dom::bindings::js::{JS, JSRef, Temporary, OptionalRootable, ResultRootable}; use dom::bindings::utils::{Reflectable, Reflector}; use dom::attr::{AttrHelpers}; use dom::document::{Document, DocumentHelpers}; -use dom::element::{AttributeHandlers, Element, HTMLInputElementTypeId}; +use dom::element::{AttributeHandlers, Element, HTMLInputElementTypeId }; use dom::event::Event; use dom::eventtarget::{EventTarget, NodeTargetTypeId}; use dom::htmlelement::HTMLElement; +use dom::htmlformelement::{FormOwner, HTMLFormElement}; use dom::node::{DisabledStateHelpers, Node, NodeHelpers, ElementNodeTypeId, document_from_node}; use dom::virtualmethods::VirtualMethods; @@ -380,3 +381,28 @@ impl Reflectable for HTMLInputElement { self.htmlelement.reflector() } } + +impl<'a> FormOwner<'a> for JSRef<'a, HTMLInputElement> { + // FIXME: This is wrong (https://github.com/servo/servo/issues/3553) + // but we need html5ever to do it correctly + fn form_owner(self) -> Option> { + // https://html.spec.whatwg.org/multipage/forms.html#reset-the-form-owner + let elem: JSRef = ElementCast::from_ref(self); + let owner = elem.get_string_attribute("owner"); + if !owner.is_empty() { + let doc = document_from_node(self).root(); + let owner = doc.GetElementById(owner).root(); + match owner { + Some(o) => { + let maybe_form: Option> = HTMLFormElementCast::to_ref(*o); + if maybe_form.is_some() { + return maybe_form; + } + }, + _ => () + } + } + let node: JSRef = NodeCast::from_ref(self); + node.ancestors().filter_map(|a| HTMLFormElementCast::to_ref(a)).next().clone() + } +}