Chromium Code Reviews| 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; |