From 0539022aedbfc69b7166c6e143a2d5407f8648a2 Mon Sep 17 00:00:00 2001 From: clstl Date: Sat, 13 Aug 2016 16:17:03 +0300 Subject: [PATCH] Implements HTMLDialogElement#close --- components/script/dom/htmldialogelement.rs | 27 ++++++++++++++++++- .../dom/webidls/HTMLDialogElement.webidl | 2 +- .../the-dialog-element/dialog-close.html | 7 +++-- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/components/script/dom/htmldialogelement.rs b/components/script/dom/htmldialogelement.rs index 621eefcd8a4f1..1afd7f0d76f1c 100644 --- a/components/script/dom/htmldialogelement.rs +++ b/components/script/dom/htmldialogelement.rs @@ -5,11 +5,14 @@ use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::HTMLDialogElementBinding; use dom::bindings::codegen::Bindings::HTMLDialogElementBinding::HTMLDialogElementMethods; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::bindings::str::DOMString; use dom::document::Document; +use dom::element::Element; +use dom::eventtarget::EventTarget; use dom::htmlelement::HTMLElement; -use dom::node::Node; +use dom::node::{Node, window_from_node}; use string_cache::Atom; #[dom_struct] @@ -56,4 +59,26 @@ impl HTMLDialogElementMethods for HTMLDialogElement { fn SetReturnValue(&self, return_value: DOMString) { *self.return_value.borrow_mut() = return_value; } + + // https://html.spec.whatwg.org/multipage/#dom-dialog-close + fn Close(&self, return_value: Option) { + let element = self.upcast::(); + let target = self.upcast::(); + let win = window_from_node(self); + + // Step 1 & 2 + if element.remove_attribute(&ns!(), &atom!("open")).is_none() { + return; + } + + // Step 3 + if let Some(new_value) = return_value { + *self.return_value.borrow_mut() = new_value; + } + + // TODO: Step 4 implement pending dialog stack removal + + // Step 5 + win.dom_manipulation_task_source().queue_simple_event(target, atom!("close"), win.r()); + } } diff --git a/components/script/dom/webidls/HTMLDialogElement.webidl b/components/script/dom/webidls/HTMLDialogElement.webidl index 78a14e1e2a085..0ac76a0465ef7 100644 --- a/components/script/dom/webidls/HTMLDialogElement.webidl +++ b/components/script/dom/webidls/HTMLDialogElement.webidl @@ -8,5 +8,5 @@ interface HTMLDialogElement : HTMLElement { attribute DOMString returnValue; //void show(optional (MouseEvent or Element) anchor); //void showModal(optional (MouseEvent or Element) anchor); - //void close(optional DOMString returnValue); + void close(optional DOMString returnValue); }; diff --git a/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-close.html b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-close.html index a3d07f053dc24..9029612b2418d 100644 --- a/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-close.html +++ b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-close.html @@ -36,10 +36,9 @@ was_queued = false; test(function(){ - assert_throws("INVALID_STATE_ERR", function() { - d1.close(); - }); - }, "close() on a that doesn't have an open attribute throws an InvalidStateError exception"); + d1.close("closedialog"); + assert_equals(d1.returnValue, ""); + }, "close() on a that doesn't have an open attribute aborts the steps"); test(function(){ assert_true(d2.open);