Index: Source/core/css/SelectorChecker.cpp |
diff --git a/Source/core/css/SelectorChecker.cpp b/Source/core/css/SelectorChecker.cpp |
index 45134f9de9d78959dbf1e6d710c414dcf91105de..2d0337e5ea8c69fe85827812b2f1e0a6016217ce 100644 |
--- a/Source/core/css/SelectorChecker.cpp |
+++ b/Source/core/css/SelectorChecker.cpp |
@@ -309,6 +309,15 @@ SelectorChecker::Match SelectorChecker::matchForPseudoShadow(const SelectorCheck |
return matchSelector(context, result); |
} |
+static inline Element* parentOrOpenShadowHostElement(const Element* element) |
hayato
2015/08/20 07:09:59
This might be confusing name because shadow host's
hayato
2015/08/20 07:09:59
const Element&
kochi
2015/08/20 07:32:50
How about parentOrShadowHostElementWithoutExceedin
kochi
2015/08/20 07:32:50
Done.
hayato
2015/08/20 10:16:29
I would prefer parentOrShadowHostButDisallowEscapi
|
+{ |
+ if (element->parentNode() && element->parentNode()->isShadowRoot()) { |
+ if (!toShadowRoot(element->parentNode())->isOpen()) |
+ return nullptr; |
+ } |
+ return element->parentOrShadowHostElement(); |
+} |
+ |
SelectorChecker::Match SelectorChecker::matchForRelation(const SelectorCheckingContext& context, MatchResult& result) const |
{ |
SelectorCheckingContext nextContext = prepareNextContextForRelation(context); |
@@ -423,6 +432,7 @@ SelectorChecker::Match SelectorChecker::matchForRelation(const SelectorCheckingC |
} |
if (context.selector->relationIsAffectedByPseudoContent()) { |
+ // TODO(kochi): closed mode tree should be handled as well for ::content. |
kochi
2015/08/20 06:04:26
Added TODO for fixing this later.
|
for (Element* element = context.element; element; element = element->parentOrShadowHostElement()) { |
if (matchForShadowDistributed(nextContext, *element, result) == SelectorMatches) |
return SelectorMatches; |
@@ -432,7 +442,8 @@ SelectorChecker::Match SelectorChecker::matchForRelation(const SelectorCheckingC |
nextContext.isSubSelector = false; |
nextContext.inRightmostCompound = false; |
- for (nextContext.element = context.element->parentOrShadowHostElement(); nextContext.element; nextContext.element = nextContext.element->parentOrShadowHostElement()) { |
+ |
+ for (nextContext.element = parentOrOpenShadowHostElement(context.element); nextContext.element; nextContext.element = parentOrOpenShadowHostElement(nextContext.element)) { |
Match match = matchSelector(nextContext, result); |
if (match == SelectorMatches || match == SelectorFailsCompletely) |
return match; |