From 7693b0346889a42c43e60e5c5ec7c921801a6f15 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Tue, 20 Oct 2015 21:14:42 -0500 Subject: [PATCH] Make button elements activatable. Fixes #4837. Fixes #8101. --- components/script/dom/element.rs | 5 ++++ components/script/dom/htmlbuttonelement.rs | 25 ++++++++++------ .../dispatchEvent.click.checkbox.html.ini | 3 +- .../dispatchEvent.click.checkbox.html.ini | 3 +- tests/wpt/metadata/MANIFEST.json | 11 ++++++- .../the-button-element/button-events.html.ini | 2 +- .../event-handler-spec-example.html.ini | 29 ------------------- .../button-activate-frame.html | 3 ++ .../the-button-element/button-activate.html | 17 +++++++++++ 9 files changed, 56 insertions(+), 42 deletions(-) delete mode 100644 tests/wpt/metadata/html/webappapis/scripting/events/event-handler-spec-example.html.ini create mode 100644 tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-activate-frame.html create mode 100644 tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-activate.html diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 6f766ea961c..99a6522e9ab 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -36,6 +36,7 @@ use dom::domtokenlist::DOMTokenList; use dom::event::Event; use dom::htmlanchorelement::HTMLAnchorElement; use dom::htmlbodyelement::{HTMLBodyElement, HTMLBodyElementLayoutHelpers}; +use dom::htmlbuttonelement::HTMLButtonElement; use dom::htmlcollection::HTMLCollection; use dom::htmlfieldsetelement::HTMLFieldSetElement; use dom::htmlfontelement::{HTMLFontElement, HTMLFontElementLayoutHelpers}; @@ -1775,6 +1776,10 @@ impl Element { let element = self.downcast::().unwrap(); Some(element as &Activatable) }, + NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLButtonElement)) => { + let element = self.downcast::().unwrap(); + Some(element as &Activatable) + }, NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) => { let element = self.downcast::().unwrap(); Some(element as &Activatable) diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs index ad60d8fb38c..9b4697c4829 100644 --- a/components/script/dom/htmlbuttonelement.rs +++ b/components/script/dom/htmlbuttonelement.rs @@ -14,7 +14,7 @@ use dom::event::Event; use dom::eventtarget::EventTarget; use dom::htmlelement::HTMLElement; use dom::htmlfieldsetelement::HTMLFieldSetElement; -use dom::htmlformelement::{FormControl, FormSubmitter}; +use dom::htmlformelement::{FormControl, FormSubmitter, ResetFrom}; use dom::htmlformelement::{SubmittedFrom, HTMLFormElement}; use dom::node::{Node, UnbindContext, document_from_node, window_from_node}; use dom::nodelist::NodeList; @@ -189,7 +189,7 @@ impl VirtualMethods for HTMLButtonElement { impl FormControl for HTMLButtonElement {} -impl<'a> Activatable for &'a HTMLButtonElement { +impl Activatable for HTMLButtonElement { fn as_element(&self) -> &Element { self.upcast() } @@ -214,19 +214,26 @@ impl<'a> Activatable for &'a HTMLButtonElement { match ty { //https://html.spec.whatwg.org/multipage/#attr-button-type-submit-state ButtonType::Submit => { - self.form_owner().map(|o| { - o.submit(SubmittedFrom::NotFromFormSubmitMethod, - FormSubmitter::ButtonElement(self.clone())) - }); - }, - _ => () + // TODO: is document owner fully active? + if let Some(owner) = self.form_owner() { + owner.submit(SubmittedFrom::NotFromFormSubmitMethod, + FormSubmitter::ButtonElement(self.clone())); + } + } + ButtonType::Reset => { + // TODO: is document owner fully active? + if let Some(owner) = self.form_owner() { + owner.reset(ResetFrom::NotFromFormResetMethod); + } + } + _ => (), } } // https://html.spec.whatwg.org/multipage/#implicit-submission #[allow(unsafe_code)] fn implicit_submission(&self, ctrlKey: bool, shiftKey: bool, altKey: bool, metaKey: bool) { - let doc = document_from_node(*self); + let doc = document_from_node(self); let node = doc.upcast::(); let owner = self.form_owner(); if owner.is_none() || self.upcast::().click_in_progress() { diff --git a/tests/wpt/metadata/DOMEvents/tests/approved/dispatchEvent.click.checkbox.html.ini b/tests/wpt/metadata/DOMEvents/tests/approved/dispatchEvent.click.checkbox.html.ini index c92e443009f..05518aca247 100644 --- a/tests/wpt/metadata/DOMEvents/tests/approved/dispatchEvent.click.checkbox.html.ini +++ b/tests/wpt/metadata/DOMEvents/tests/approved/dispatchEvent.click.checkbox.html.ini @@ -1,3 +1,4 @@ [dispatchEvent.click.checkbox.html] type: testharness - expected: TIMEOUT + [Test Description: MouseEvent: Default action is performed when a synthetic click event is dispatched on a checkbox element] + expected: FAIL diff --git a/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/dispatchEvent.click.checkbox.html.ini b/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/dispatchEvent.click.checkbox.html.ini index c92e443009f..05518aca247 100644 --- a/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/dispatchEvent.click.checkbox.html.ini +++ b/tests/wpt/metadata/DOMEvents/tests/submissions/Microsoft/converted/dispatchEvent.click.checkbox.html.ini @@ -1,3 +1,4 @@ [dispatchEvent.click.checkbox.html] type: testharness - expected: TIMEOUT + [Test Description: MouseEvent: Default action is performed when a synthetic click event is dispatched on a checkbox element] + expected: FAIL diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 8b59b3dd2f2..5dea15404bd 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -30152,7 +30152,16 @@ }, "local_changes": { "deleted": [], - "items": {}, + "items": { + "testharness": { + "html/semantics/forms/the-button-element/button-activate.html": [ + { + "path": "html/semantics/forms/the-button-element/button-activate.html", + "url": "/html/semantics/forms/the-button-element/button-activate.html" + } + ] + } + }, "reftest_nodes": {} }, "reftest_nodes": { diff --git a/tests/wpt/metadata/html/semantics/forms/the-button-element/button-events.html.ini b/tests/wpt/metadata/html/semantics/forms/the-button-element/button-events.html.ini index 0267bcc8560..989d296a711 100644 --- a/tests/wpt/metadata/html/semantics/forms/the-button-element/button-events.html.ini +++ b/tests/wpt/metadata/html/semantics/forms/the-button-element/button-events.html.ini @@ -1,6 +1,6 @@ [button-events.html] type: testharness - expected: TIMEOUT + expected: CRASH [The submit event must be fired when click a button in submit status] expected: TIMEOUT diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-spec-example.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-spec-example.html.ini deleted file mode 100644 index b5cbb3613a4..00000000000 --- a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-spec-example.html.ini +++ /dev/null @@ -1,29 +0,0 @@ -[event-handler-spec-example.html] - type: testharness - [Event handler listeners should be registered when they are first set to an object value (object "[object Object\]").] - expected: FAIL - - [Event handler listeners should be registered when they are first set to an object value (function "function () {}").] - expected: FAIL - - [Event handler listeners should be registered when they are first set to an object value (object "42").] - expected: FAIL - - [Event handler listeners should be registered when they are first set to an object value (object "").] - expected: FAIL - - [Event handler listeners should be registered when they are first set to an object value (42).] - expected: FAIL - - [Event handler listeners should be registered when they are first set to an object value (null).] - expected: FAIL - - [Event handler listeners should be registered when they are first set to an object value (undefined).] - expected: FAIL - - [Event handler listeners should be registered when they are first set to an object value ("").] - expected: FAIL - - [Event handler listeners should be registered when they are first set to an object value.] - expected: FAIL - diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-activate-frame.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-activate-frame.html new file mode 100644 index 00000000000..37619d79123 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-activate-frame.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-activate.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-activate.html new file mode 100644 index 00000000000..43fe96d3980 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-activate.html @@ -0,0 +1,17 @@ + + + + + + +