#include "config.h"
#include "core/html/HTMLContentElement.h"
-#include "HTMLNames.h"
+#include "core/HTMLNames.h"
#include "core/css/SelectorChecker.h"
#include "core/css/SiblingTraversalStrategies.h"
#include "core/css/parser/BisonCSSParser.h"
#include "core/dom/QualifiedName.h"
#include "core/dom/shadow/ElementShadow.h"
#include "core/dom/shadow/ShadowRoot.h"
+#include "platform/RuntimeEnabledFeatures.h"
-namespace WebCore {
+namespace blink {
using namespace HTMLNames;
-PassRefPtr<HTMLContentElement> HTMLContentElement::create(Document& document)
-{
- return adoptRef(new HTMLContentElement(document));
-}
-
-HTMLContentElement::HTMLContentElement(Document& document)
+inline HTMLContentElement::HTMLContentElement(Document& document)
: InsertionPoint(contentTag, document)
, m_shouldParseSelect(false)
, m_isValidSelector(true)
ScriptWrappable::init(this);
}
+DEFINE_NODE_FACTORY(HTMLContentElement)
+
HTMLContentElement::~HTMLContentElement()
{
}
}
}
+static inline bool includesDisallowedPseudoClass(const CSSSelector& selector)
+{
+ return selector.match() == CSSSelector::PseudoClass && selector.pseudoType() != CSSSelector::PseudoNot;
+}
+
bool HTMLContentElement::validateSelect() const
{
ASSERT(!m_shouldParseSelect);
if (!m_selectorList.isValid())
return false;
+ bool allowAnyPseudoClasses = RuntimeEnabledFeatures::pseudoClassesInMatchingCriteriaInAuthorShadowTreesEnabled() || (containingShadowRoot() && containingShadowRoot()->type() == ShadowRoot::UserAgentShadowRoot);
+
for (const CSSSelector* selector = m_selectorList.first(); selector; selector = m_selectorList.next(*selector)) {
if (!selector->isCompound())
return false;
+ if (allowAnyPseudoClasses)
+ continue;
+ for (const CSSSelector* subSelector = selector; subSelector; subSelector = subSelector->tagHistory()) {
+ if (includesDisallowedPseudoClass(*subSelector))
+ return false;
+ }
}
-
return true;
}
-static inline bool checkOneSelector(const CSSSelector& selector, const Vector<Node*, 32>& siblings, int nth)
+static inline bool checkOneSelector(const CSSSelector& selector, const WillBeHeapVector<RawPtrWillBeMember<Node>, 32>& siblings, int nth)
{
Element* element = toElement(siblings[nth]);
SelectorChecker selectorChecker(element->document(), SelectorChecker::CollectingCSSRules);
return selectorChecker.match(context, strategy) == SelectorChecker::SelectorMatches;
}
-bool HTMLContentElement::matchSelector(const Vector<Node*, 32>& siblings, int nth) const
+bool HTMLContentElement::matchSelector(const WillBeHeapVector<RawPtrWillBeMember<Node>, 32>& siblings, int nth) const
{
for (const CSSSelector* selector = selectorList().first(); selector; selector = CSSSelectorList::next(*selector)) {
if (checkOneSelector(*selector, siblings, nth))