Bug 1322938 - Basic implementation of HTMLDialogElement. r=smaug, masayuki

MozReview-Commit-ID: AU92mq2QZIc
This commit is contained in:
Tim Nguyen 2016-12-23 16:01:50 +01:00
parent fb00ea2d92
commit d7db347638
12 changed files with 182 additions and 4 deletions

View File

@ -421,7 +421,7 @@
//////////////////////////////////////////////////////////////////////////
// HTML:dialog
todo(isAccessible("dialog"), "dialog element is not accessible");
ok(isAccessible("dialog"), "dialog element is not accessible");
//////////////////////////////////////////////////////////////////////////
// HTML:div

View File

@ -0,0 +1,65 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/HTMLDialogElement.h"
#include "mozilla/dom/HTMLDialogElementBinding.h"
NS_IMPL_NS_NEW_HTML_ELEMENT(Dialog)
namespace mozilla {
namespace dom {
HTMLDialogElement::~HTMLDialogElement()
{
}
NS_IMPL_ELEMENT_CLONE(HTMLDialogElement)
void
HTMLDialogElement::Close(const mozilla::dom::Optional<nsAString>& aReturnValue)
{
if (!Open()) {
return;
}
if (aReturnValue.WasPassed()) {
SetReturnValue(aReturnValue.Value());
}
ErrorResult ignored;
SetOpen(false, ignored);
ignored.SuppressException();
}
void
HTMLDialogElement::Show()
{
if (Open()) {
return;
}
ErrorResult ignored;
SetOpen(true, ignored);
ignored.SuppressException();
}
void
HTMLDialogElement::ShowModal(ErrorResult& aError)
{
if (!IsInComposedDoc() || Open()) {
aError.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return;
}
SetOpen(true, aError);
aError.SuppressException();
}
JSObject*
HTMLDialogElement::WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
{
return HTMLDialogElementBinding::Wrap(aCx, this, aGivenProto);
}
} // namespace dom
} // namespace mozilla

View File

@ -0,0 +1,58 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef HTMLDialogElement_h
#define HTMLDialogElement_h
#include "mozilla/Attributes.h"
#include "nsGenericHTMLElement.h"
#include "nsGkAtoms.h"
namespace mozilla {
namespace dom {
class HTMLDialogElement final : public nsGenericHTMLElement
{
public:
explicit HTMLDialogElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo) : nsGenericHTMLElement(aNodeInfo)
{
}
NS_IMPL_FROMCONTENT_HTML_WITH_TAG(HTMLDialogElement, dialog)
virtual nsresult Clone(mozilla::dom::NodeInfo* aNodeInfo, nsINode** aResult) const override;
bool Open() const { return GetBoolAttr(nsGkAtoms::open); }
void SetOpen(bool aOpen, ErrorResult& aError)
{
SetHTMLBoolAttr(nsGkAtoms::open, aOpen, aError);
}
void GetReturnValue(nsAString& aReturnValue)
{
aReturnValue = mReturnValue;
}
void SetReturnValue(const nsAString& aReturnValue)
{
mReturnValue = aReturnValue;
}
void Close(const mozilla::dom::Optional<nsAString>& aReturnValue);
void Show();
void ShowModal(ErrorResult& aError);
nsString mReturnValue;
protected:
virtual ~HTMLDialogElement();
JSObject* WrapNode(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
};
} // namespace dom
} // namespace mozilla
#endif

View File

@ -55,6 +55,7 @@ EXPORTS.mozilla.dom += [
'HTMLDataElement.h',
'HTMLDataListElement.h',
'HTMLDetailsElement.h',
'HTMLDialogElement.h',
'HTMLDivElement.h',
'HTMLFieldSetElement.h',
'HTMLFontElement.h',
@ -133,6 +134,7 @@ UNIFIED_SOURCES += [
'HTMLDataElement.cpp',
'HTMLDataListElement.cpp',
'HTMLDetailsElement.cpp',
'HTMLDialogElement.cpp',
'HTMLDivElement.cpp',
'HTMLElement.cpp',
'HTMLFieldSetElement.cpp',

View File

@ -1658,6 +1658,7 @@ NS_DECLARE_NS_NEW_HTML_ELEMENT(Mod)
NS_DECLARE_NS_NEW_HTML_ELEMENT(Data)
NS_DECLARE_NS_NEW_HTML_ELEMENT(DataList)
NS_DECLARE_NS_NEW_HTML_ELEMENT(Details)
NS_DECLARE_NS_NEW_HTML_ELEMENT(Dialog)
NS_DECLARE_NS_NEW_HTML_ELEMENT(Div)
NS_DECLARE_NS_NEW_HTML_ELEMENT(FieldSet)
NS_DECLARE_NS_NEW_HTML_ELEMENT(Font)

View File

@ -446,6 +446,8 @@ var interfaceNamesInGlobalScope =
"HTMLDataListElement",
// IMPORTANT: Do not change this list without review from a DOM peer!
"HTMLDetailsElement",
// IMPORTANT: Do not change this list without review from a DOM peer!
"HTMLDialogElement",
// IMPORTANT: Do not change this list without review from a DOM peer!
"HTMLDirectoryElement",
// IMPORTANT: Do not change this list without review from a DOM peer!

View File

@ -0,0 +1,22 @@
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*
* The origin of this IDL file is
* https://html.spec.whatwg.org/multipage/forms.html#the-dialog-element
*
* © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and
* Opera Software ASA. You are granted a license to use, reproduce
* and create derivative works of this document.
*/
interface HTMLDialogElement : HTMLElement {
[SetterThrows] attribute boolean open;
attribute DOMString returnValue;
void show();
[Throws] void showModal();
void close(optional DOMString returnValue);
};

View File

@ -189,6 +189,7 @@ WEBIDL_FILES = [
'HTMLDataElement.webidl',
'HTMLDataListElement.webidl',
'HTMLDetailsElement.webidl',
'HTMLDialogElement.webidl',
'HTMLDirectoryElement.webidl',
'HTMLDivElement.webidl',
'HTMLDListElement.webidl',

View File

@ -517,9 +517,9 @@ HTMLEditUtils::SupportsAlignAttr(nsIDOMNode* aNode)
#define GROUP_FORMCONTROL (1 << 6)
// address, applet, article, aside, blockquote, button, center, del, details,
// dir, div, dl, fieldset, figure, footer, form, h1, h2, h3, h4, h5, h6, header,
// hgroup, hr, iframe, ins, main, map, menu, nav, noframes, noscript, object,
// ol, p, pre, table, section, summary, ul
// dialog, dir, div, dl, fieldset, figure, footer, form, h1, h2, h3, h4, h5,
// h6, header, hgroup, hr, iframe, ins, main, map, menu, nav, noframes,
// noscript, object, ol, p, pre, table, section, summary, ul
#define GROUP_BLOCK (1 << 7)
// frame, frameset
@ -638,6 +638,7 @@ static const ElementInfo kElements[eHTMLTag_userdefined] = {
ELEM(del, true, true, GROUP_PHRASE | GROUP_BLOCK, GROUP_FLOW_ELEMENT),
ELEM(details, true, true, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
ELEM(dfn, true, true, GROUP_PHRASE, GROUP_INLINE_ELEMENT),
ELEM(dialog, true, true, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
ELEM(dir, true, false, GROUP_BLOCK, GROUP_LI),
ELEM(div, true, true, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
ELEM(dl, true, false, GROUP_BLOCK, GROUP_DL_CONTENT),

View File

@ -798,6 +798,27 @@ details > summary:first-of-type > *|* {
list-style-position: initial;
}
/* <dialog> element styles */
dialog {
position: absolute;
offset-inline-start: 0;
offset-inline-end: 0;
color: black;
margin: auto;
border-width: initial;
border-style: solid;
border-color: initial;
border-image: initial;
padding: 1em;
background: white;
width: -moz-fit-content;
}
dialog:not([open]) {
display: none;
}
/* emulation of non-standard HTML <marquee> tag */
marquee {
inline-size: -moz-available;

View File

@ -151,6 +151,10 @@ const nsHTMLElement gHTMLElements[] = {
/*tag*/ eHTMLTag_dfn,
/*parent,leaf*/ kPhrase, false
},
{
/*tag*/ eHTMLTag_dialog,
/*parent,leaf*/ kBlock, false
},
{
/*tag*/ eHTMLTag_dir,
/*parent,leaf*/ kList, false

View File

@ -73,6 +73,7 @@ HTML_HTMLELEMENT_TAG(dd)
HTML_TAG(del, Mod, Mod)
HTML_TAG(details, Details, Details)
HTML_HTMLELEMENT_TAG(dfn)
HTML_TAG(dialog, Dialog, Dialog)
HTML_TAG(dir, Shared, Directory)
HTML_TAG(div, Div, Div)
HTML_TAG(dl, SharedList, DList)