summaryrefslogtreecommitdiff
path: root/Source/WebCore/html/HTMLSummaryElement.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/html/HTMLSummaryElement.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/html/HTMLSummaryElement.cpp')
-rw-r--r--Source/WebCore/html/HTMLSummaryElement.cpp116
1 files changed, 54 insertions, 62 deletions
diff --git a/Source/WebCore/html/HTMLSummaryElement.cpp b/Source/WebCore/html/HTMLSummaryElement.cpp
index 7c41386e6..9910bd1b4 100644
--- a/Source/WebCore/html/HTMLSummaryElement.cpp
+++ b/Source/WebCore/html/HTMLSummaryElement.cpp
@@ -21,41 +21,37 @@
#include "config.h"
#include "HTMLSummaryElement.h"
-#if ENABLE(DETAILS_ELEMENT)
#include "DetailsMarkerControl.h"
+#include "EventNames.h"
#include "HTMLDetailsElement.h"
-#include "InsertionPoint.h"
+#include "HTMLFormControlElement.h"
+#include "HTMLSlotElement.h"
#include "KeyboardEvent.h"
#include "MouseEvent.h"
-#include "NodeRenderingTraversal.h"
#include "PlatformMouseEvent.h"
#include "RenderBlockFlow.h"
+#include "ShadowRoot.h"
+#include "SlotAssignment.h"
namespace WebCore {
using namespace HTMLNames;
-class SummaryContentElement : public InsertionPoint {
-public:
- static PassRefPtr<SummaryContentElement> create(Document&);
-
+class SummarySlotElement final : public SlotAssignment {
private:
- SummaryContentElement(Document& document)
- : InsertionPoint(webkitShadowContentTag, document)
+ void hostChildElementDidChange(const Element&, ShadowRoot& shadowRoot) override
{
+ didChangeSlot(SlotAssignment::defaultSlotName(), shadowRoot);
}
-};
-PassRefPtr<SummaryContentElement> SummaryContentElement::create(Document& document)
-{
- return adoptRef(new SummaryContentElement(document));
-}
+ const AtomicString& slotNameForHostChild(const Node&) const override { return SlotAssignment::defaultSlotName(); }
+};
-PassRefPtr<HTMLSummaryElement> HTMLSummaryElement::create(const QualifiedName& tagName, Document& document)
+Ref<HTMLSummaryElement> HTMLSummaryElement::create(const QualifiedName& tagName, Document& document)
{
- RefPtr<HTMLSummaryElement> summary = adoptRef(new HTMLSummaryElement(tagName, document));
- summary->ensureUserAgentShadowRoot();
- return summary.release();
+ Ref<HTMLSummaryElement> summary = adoptRef(*new HTMLSummaryElement(tagName, document));
+ summary->addShadowRoot(ShadowRoot::create(document, std::make_unique<SummarySlotElement>()));
+ return summary;
}
HTMLSummaryElement::HTMLSummaryElement(const QualifiedName& tagName, Document& document)
@@ -64,89 +60,87 @@ HTMLSummaryElement::HTMLSummaryElement(const QualifiedName& tagName, Document& d
ASSERT(hasTagName(summaryTag));
}
-RenderPtr<RenderElement> HTMLSummaryElement::createElementRenderer(PassRef<RenderStyle> style)
-{
- return createRenderer<RenderBlockFlow>(*this, std::move(style));
-}
-
-bool HTMLSummaryElement::childShouldCreateRenderer(const Node& child) const
+RenderPtr<RenderElement> HTMLSummaryElement::createElementRenderer(RenderStyle&& style, const RenderTreePosition&)
{
- if (child.isPseudoElement())
- return HTMLElement::childShouldCreateRenderer(child);
-
- return hasShadowRootOrActiveInsertionPointParent(child) && HTMLElement::childShouldCreateRenderer(child);
+ return createRenderer<RenderBlockFlow>(*this, WTFMove(style));
}
void HTMLSummaryElement::didAddUserAgentShadowRoot(ShadowRoot* root)
{
- root->appendChild(DetailsMarkerControl::create(document()), ASSERT_NO_EXCEPTION);
- root->appendChild(SummaryContentElement::create(document()), ASSERT_NO_EXCEPTION);
+ root->appendChild(DetailsMarkerControl::create(document()));
+ root->appendChild(HTMLSlotElement::create(slotTag, document()));
}
HTMLDetailsElement* HTMLSummaryElement::detailsElement() const
{
- Node* mayDetails = NodeRenderingTraversal::parent(this);
- if (!mayDetails || !mayDetails->hasTagName(detailsTag))
- return 0;
- return toHTMLDetailsElement(mayDetails);
+ auto* parent = parentElement();
+ if (parent && is<HTMLDetailsElement>(*parent))
+ return downcast<HTMLDetailsElement>(parent);
+ // Fallback summary element is in the shadow tree.
+ auto* host = shadowHost();
+ if (host && is<HTMLDetailsElement>(*host))
+ return downcast<HTMLDetailsElement>(host);
+ return nullptr;
}
-bool HTMLSummaryElement::isMainSummary() const
+bool HTMLSummaryElement::isActiveSummary() const
{
- if (HTMLDetailsElement* details = detailsElement())
- return details->findMainSummary() == this;
-
- return false;
+ HTMLDetailsElement* details = detailsElement();
+ if (!details)
+ return false;
+ return details->isActiveSummary(*this);
}
static bool isClickableControl(Node* node)
{
- if (!node->isElementNode())
+ ASSERT(node);
+ if (!is<Element>(*node))
return false;
- Element* element = toElement(node);
- if (element->isFormControlElement())
+ Element& element = downcast<Element>(*node);
+ if (is<HTMLFormControlElement>(element))
return true;
- Element* host = element->shadowHost();
- return host && host->isFormControlElement();
+ Element* host = element.shadowHost();
+ return host && is<HTMLFormControlElement>(host);
}
bool HTMLSummaryElement::supportsFocus() const
{
- return isMainSummary();
+ return isActiveSummary();
}
-void HTMLSummaryElement::defaultEventHandler(Event* event)
+void HTMLSummaryElement::defaultEventHandler(Event& event)
{
- if (isMainSummary() && renderer()) {
- if (event->type() == eventNames().DOMActivateEvent && !isClickableControl(event->target()->toNode())) {
+ if (isActiveSummary() && renderer()) {
+ if (event.type() == eventNames().DOMActivateEvent && !isClickableControl(event.target()->toNode())) {
if (HTMLDetailsElement* details = detailsElement())
details->toggleOpen();
- event->setDefaultHandled();
+ event.setDefaultHandled();
return;
}
- if (event->isKeyboardEvent()) {
- if (event->type() == eventNames().keydownEvent && static_cast<KeyboardEvent*>(event)->keyIdentifier() == "U+0020") {
+ if (is<KeyboardEvent>(event)) {
+ KeyboardEvent& keyboardEvent = downcast<KeyboardEvent>(event);
+ if (keyboardEvent.type() == eventNames().keydownEvent && keyboardEvent.keyIdentifier() == "U+0020") {
setActive(true, true);
// No setDefaultHandled() - IE dispatches a keypress in this case.
return;
}
- if (event->type() == eventNames().keypressEvent) {
- switch (static_cast<KeyboardEvent*>(event)->charCode()) {
+ if (keyboardEvent.type() == eventNames().keypressEvent) {
+ switch (keyboardEvent.charCode()) {
case '\r':
- dispatchSimulatedClick(event);
- event->setDefaultHandled();
+ dispatchSimulatedClick(&event);
+ keyboardEvent.setDefaultHandled();
return;
case ' ':
// Prevent scrolling down the page.
- event->setDefaultHandled();
+ keyboardEvent.setDefaultHandled();
return;
}
}
- if (event->type() == eventNames().keyupEvent && static_cast<KeyboardEvent*>(event)->keyIdentifier() == "U+0020") {
+ if (keyboardEvent.type() == eventNames().keyupEvent && keyboardEvent.keyIdentifier() == "U+0020") {
if (active())
- dispatchSimulatedClick(event);
- event->setDefaultHandled();
+ dispatchSimulatedClick(&event);
+ keyboardEvent.setDefaultHandled();
return;
}
}
@@ -157,12 +151,10 @@ void HTMLSummaryElement::defaultEventHandler(Event* event)
bool HTMLSummaryElement::willRespondToMouseClickEvents()
{
- if (isMainSummary() && renderer())
+ if (isActiveSummary() && renderer())
return true;
return HTMLElement::willRespondToMouseClickEvents();
}
}
-
-#endif