#include "core/dom/ElementTraversal.h"
#include "core/dom/NodeTraversal.h"
#include "core/dom/shadow/ContentDistribution.h"
-#include "core/html/shadow/HTMLContentElement.h"
-#include "core/html/shadow/HTMLShadowElement.h"
+#include "core/html/HTMLContentElement.h"
+#include "core/html/HTMLShadowElement.h"
namespace WebCore {
if (m_distributed[i])
continue;
- if (insertionPoint->hasTagName(HTMLNames::contentTag) && !toHTMLContentElement(insertionPoint)->canSelectNode(m_nodes, i))
+ if (isHTMLContentElement(*insertionPoint) && !toHTMLContentElement(insertionPoint)->canSelectNode(m_nodes, i))
continue;
Node* node = m_nodes[i];
}
}
-PassOwnPtr<ElementShadow> ElementShadow::create()
+PassOwnPtrWillBeRawPtr<ElementShadow> ElementShadow::create()
{
- return adoptPtr(new ElementShadow());
+ return adoptPtrWillBeNoop(new ElementShadow());
}
ElementShadow::ElementShadow()
: m_needsDistributionRecalc(false)
- , m_applyAuthorStyles(false)
, m_needsSelectFeatureSet(false)
{
}
ElementShadow::~ElementShadow()
{
+#if !ENABLE(OILPAN)
removeDetachedShadowRoots();
+#endif
}
ShadowRoot& ElementShadow::addShadowRoot(Element& shadowHost, ShadowRoot::ShadowRootType type)
{
RefPtr<ShadowRoot> shadowRoot = ShadowRoot::create(shadowHost.document(), type);
+ if (type == ShadowRoot::AuthorShadowRoot && (!youngestShadowRoot() || youngestShadowRoot()->type() == ShadowRoot::UserAgentShadowRoot))
+ shadowHost.willAddFirstAuthorShadowRoot();
+
for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot())
root->lazyReattachIfAttached();
ChildNodeInsertionNotifier(shadowHost).notify(*shadowRoot);
setNeedsDistributionRecalc();
- // addShadowRoot() affects apply-author-styles. However, we know that the youngest shadow root has not had any children yet.
- // The youngest shadow root's apply-author-styles is default (false). So we can just set m_applyAuthorStyles false.
- m_applyAuthorStyles = false;
-
- shadowHost.didAddShadowRoot(*shadowRoot);
InspectorInstrumentation::didPushShadowRoot(&shadowHost, shadowRoot.get());
ASSERT(m_shadowRoots.head());
return *m_shadowRoots.head();
}
+#if !ENABLE(OILPAN)
void ElementShadow::removeDetachedShadowRoots()
{
// Dont protect this ref count.
oldRoot->setPrev(0);
oldRoot->setNext(0);
}
-
}
+#endif
void ElementShadow::attach(const Node::AttachContext& context)
{
root->detach(childrenContext);
}
-void ElementShadow::removeAllEventListeners()
-{
- for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot()) {
- for (Node* node = root; node; node = NodeTraversal::next(*node))
- node->removeAllEventListeners();
- }
-}
-
void ElementShadow::setNeedsDistributionRecalc()
{
if (m_needsDistributionRecalc)
clearDistribution();
}
-bool ElementShadow::didAffectApplyAuthorStyles()
-{
- bool applyAuthorStyles = resolveApplyAuthorStyles();
-
- if (m_applyAuthorStyles == applyAuthorStyles)
- return false;
-
- m_applyAuthorStyles = applyAuthorStyles;
- return true;
-}
-
-bool ElementShadow::containsActiveStyles() const
-{
- for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot()) {
- if (root->hasScopedHTMLStyleChild())
- return true;
- if (!root->containsShadowElements())
- return false;
- }
- return false;
-}
-
-bool ElementShadow::hasSameStyles(ElementShadow *other) const
+bool ElementShadow::hasSameStyles(const ElementShadow* other) const
{
ShadowRoot* root = youngestShadowRoot();
ShadowRoot* otherRoot = other->youngestShadowRoot();
return true;
}
-bool ElementShadow::resolveApplyAuthorStyles() const
-{
- for (const ShadowRoot* shadowRoot = youngestShadowRoot(); shadowRoot; shadowRoot = shadowRoot->olderShadowRoot()) {
- if (shadowRoot->applyAuthorStyles())
- return true;
- if (!shadowRoot->containsShadowElements())
- break;
- }
- return false;
-}
-
const InsertionPoint* ElementShadow::finalDestinationInsertionPointFor(const Node* key) const
{
+ ASSERT(key && !key->document().childNeedsDistributionRecalc());
NodeToDestinationInsertionPoints::const_iterator it = m_nodeToInsertionPoints.find(key);
return it == m_nodeToInsertionPoints.end() ? 0: it->value.last().get();
}
const DestinationInsertionPoints* ElementShadow::destinationInsertionPointsFor(const Node* key) const
{
+ ASSERT(key && !key->document().childNeedsDistributionRecalc());
NodeToDestinationInsertionPoints::const_iterator it = m_nodeToInsertionPoints.find(key);
return it == m_nodeToInsertionPoints.end() ? 0: &it->value;
}
InsertionPoint* point = insertionPoints[i].get();
if (!point->isActive())
continue;
- if (point->hasTagName(HTMLNames::shadowTag)) {
+ if (isHTMLShadowElement(*point)) {
ASSERT(!shadowInsertionPoint);
shadowInsertionPoint = toHTMLShadowElement(point);
shadowInsertionPoints.append(shadowInsertionPoint);
for (Element* element = ElementTraversal::firstWithin(root); element; element = ElementTraversal::next(*element, &root)) {
if (ElementShadow* shadow = element->shadow())
m_selectFeatures.add(shadow->ensureSelectFeatureSet());
- if (!element->hasTagName(HTMLNames::contentTag))
+ if (!isHTMLContentElement(*element))
continue;
- const CSSSelectorList& list = toHTMLContentElement(element)->selectorList();
+ const CSSSelectorList& list = toHTMLContentElement(*element).selectorList();
for (const CSSSelector* selector = list.first(); selector; selector = CSSSelectorList::next(*selector)) {
for (const CSSSelector* component = selector; component; component = component->tagHistory())
m_selectFeatures.collectFeaturesFromSelector(*component);
m_nodeToInsertionPoints.clear();
for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot())
- root->setShadowInsertionPointOfYoungerShadowRoot(0);
+ root->setShadowInsertionPointOfYoungerShadowRoot(nullptr);
+}
+
+void ElementShadow::trace(Visitor* visitor)
+{
+ // Shadow roots are linked with previous and next pointers which are traced.
+ // It is therefore enough to trace one of the shadow roots here and the
+ // rest will be traced from there.
+ visitor->trace(m_shadowRoots.head());
}
} // namespace