diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/html/HTMLSummaryElement.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/html/HTMLSummaryElement.cpp')
-rw-r--r-- | Source/WebCore/html/HTMLSummaryElement.cpp | 116 |
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 |