Commit 63277f56 authored by tasak@google.com's avatar tasak@google.com

Rename ^ and ^^ combinator to /shadow-all/ and /shadow-deep/.

c.f. shadow-styling spec:
/shadow-all/: http://dev.w3.org/csswg/shadow-styling/#shadow-all-combinator
/shadow-deep/: http://dev.w3.org/csswg/shadow-styling/#shadow-deep-combinator

BUG=348891
TEST=Replaced all ^ and ^^ with /shadow-all/ and /shadow-deep/ and rebaselined.

Review URL: https://codereview.chromium.org/183803016

git-svn-id: svn://svn.chromium.org/blink/trunk@168454 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 0df5a88d
......@@ -60,11 +60,11 @@ cleanUp();
sandbox.appendChild(
createDOM('div', {},
createDOM('style', {},
document.createTextNode('div ^^ span { border: 1px solid green; }')),
document.createTextNode('div /shadow-deep/ span { border: 1px solid green; }')),
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode('div ^^ span { border: 1px solid red; }')),
document.createTextNode('div /shadow-deep/ span { border: 1px solid red; }')),
createDOM('div', {'id': 'host2'},
createShadowRoot(
createDOM('style', {},
......@@ -82,7 +82,7 @@ cleanUp();
sandbox.appendChild(
createDOM('div', {},
createDOM('style', {},
document.createTextNode('div ^^ p:empty { border: 1px solid green; }')),
document.createTextNode('div /shadow-deep/ p:empty { border: 1px solid green; }')),
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('div', {},
......
Test for ::content with ^^ and :host.
Test for ::content with /shadow-deep/ and :host.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
......
......@@ -9,7 +9,7 @@
<pre id="console"></pre>
</body>
<script>
description("Test for ::content with ^^ and :host.");
description("Test for ::content with /shadow-deep/ and :host.");
var sandbox = document.getElementById('sandbox');
......@@ -23,7 +23,7 @@ sandbox.appendChild(
createShadowRoot(
createDOM('style', {},
document.createTextNode(
':host(#host1) ^^ #content1::content > .content { color: green; }')),
':host(#host1) /shadow-deep/ #content1::content > .content { color: green; }')),
createDOM('div', {},
createDOM('div', {'id': 'host2'},
createShadowRoot(
......@@ -42,7 +42,7 @@ sandbox.appendChild(
createShadowRoot(
createDOM('style', {},
document.createTextNode(
'#host2 ^^ #content2::content > #parentOfContent1 > #content1::content > .content { color: green; }')),
'#host2 /shadow-deep/ #content2::content > #parentOfContent1 > #content1::content > .content { color: green; }')),
createDOM('div', {},
createDOM('div', {'id': 'host2'},
createShadowRoot(
......@@ -61,8 +61,8 @@ sandbox.appendChild(
createShadowRoot(
createDOM('style', {},
document.createTextNode(
':host ^^ #content2::content > #parentOfShadow1 > #shadow1::content > .content { color: green; }' +
':host ^^ #content2::content > #shadow1::content > #content1::content > .content { color: red; }')),
':host /shadow-deep/ #content2::content > #parentOfShadow1 > #shadow1::content > .content { color: green; }' +
':host /shadow-deep/ #content2::content > #shadow1::content > #content1::content > .content { color: red; }')),
createDOM('content', {'id': 'content1'})),
createShadowRoot(
createDOM('div', {},
......@@ -84,7 +84,7 @@ sandbox.appendChild(
createShadowRoot(
createDOM('style', {},
document.createTextNode(
':host ^^ :host > #content2::content > #shadow1::content > #content1::content > .content { color: red; }')),
':host /shadow-deep/ :host > #content2::content > #shadow1::content > #content1::content > .content { color: red; }')),
createDOM('content', {'id': 'content1'})),
createShadowRoot(
createDOM('div', {},
......@@ -106,7 +106,7 @@ sandbox.appendChild(
createShadowRoot(
createDOM('style', {},
document.createTextNode(
':host ^^ #content2::content > #parentOfContent1 > #content1::content > .content { color: green; }')),
':host /shadow-deep/ #content2::content > #parentOfContent1 > #content1::content > .content { color: green; }')),
createDOM('div', {},
createDOM('div', {'id': 'host2'},
createShadowRoot(
......
Test for ::content with ^ and :host.
Test for ::content with /shadow-all/ and :host.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
......
......@@ -9,7 +9,7 @@
<pre id="console"></pre>
</body>
<script>
description("Test for ::content with ^ and :host.");
description("Test for ::content with /shadow-all/ and :host.");
var sandbox = document.getElementById('sandbox');
......@@ -23,7 +23,7 @@ sandbox.appendChild(
createShadowRoot(
createDOM('style', {},
document.createTextNode(
':host(#host1) ^ #content1::content > .content { color: green; }')),
':host(#host1) /shadow-all/ #content1::content > .content { color: green; }')),
createDOM('div', {},
createDOM('div', {'id': 'host2'},
createShadowRoot(
......@@ -42,7 +42,7 @@ sandbox.appendChild(
createShadowRoot(
createDOM('style', {},
document.createTextNode(
'#host2 ^ #content2::content > #parentOfContent1 > #content1::content > .content { color: green; }')),
'#host2 /shadow-all/ #content2::content > #parentOfContent1 > #content1::content > .content { color: green; }')),
createDOM('div', {},
createDOM('div', {'id': 'host2'},
createShadowRoot(
......@@ -61,7 +61,7 @@ sandbox.appendChild(
createShadowRoot(
createDOM('style', {},
document.createTextNode(
':host ^ #content2::content > #shadow1::content > #content1::content > .content { color: red; }')),
':host /shadow-all/ #content2::content > #shadow1::content > #content1::content > .content { color: red; }')),
createDOM('content', {'id': 'content1'})),
createShadowRoot(
createDOM('div', {},
......@@ -82,7 +82,7 @@ sandbox.appendChild(
createShadowRoot(
createDOM('style', {},
document.createTextNode(
':host ^ #content2::content > #parentOfContent1 > #content1::content > .content { color: red; }')),
':host /shadow-all/ #content2::content > #parentOfContent1 > #content1::content > .content { color: red; }')),
createDOM('div', {},
createDOM('div', {'id': 'host2'},
createShadowRoot(
......
......@@ -38,10 +38,10 @@ sandbox.appendChild(
document.body.offsetLeft;
var style = document.createElement('style');
style.innerHTML = 'div ^ .foo { background: green; }'
+ 'div ^ #target2 { background: green; }'
+ 'div ^^ .bar { background: blue; }'
+ 'div ^^ #target4 { background: blue; }';
style.innerHTML = 'div /shadow-all/ .foo { background: green; }'
+ 'div /shadow-all/ #target2 { background: green; }'
+ 'div /shadow-deep/ .bar { background: blue; }'
+ 'div /shadow-deep/ #target4 { background: blue; }';
document.body.appendChild(style);
backgroundColorShouldBe('host/target1', 'rgb(0, 128, 0)');
......
......@@ -12,7 +12,7 @@
width: 50px;
}
* ^^ #div1 {
* /shadow-deep/ #div1 {
position: fixed;
overflow: scroll;
width: 80px;
......@@ -20,7 +20,7 @@
background-color: red;
}
* ^^ #div1::-webkit-scrollbar {
* /shadow-deep/ #div1::-webkit-scrollbar {
width: 20px;
}
</style>
......
......@@ -7,7 +7,7 @@
* Following <ul> crosses shadow boundary and doesn't match it.
* https://bugs.webkit.org/show_bug.cgi?id=92192
*/
* ^^ ul {
* /shadow-deep/ ul {
-webkit-margin-before: 0px;
-webkit-margin-after: 0px;
}
......
......@@ -5,7 +5,7 @@
<script src="resources/shadow-dom.js"></script>
<script src="resources/event-dispatching.js"></script>
<style>
sandbox ^^ div {
sandbox /shadow-deep/ div {
padding-top: 20px;
width: 40px;
}
......
......@@ -3,7 +3,7 @@
<head>
<script src="resources/shadow-dom.js"></script>
<style>
* ^^ div {
* /shadow-deep/ div {
margin: 10px 10px 10px 10px;
border: solid black;
}
......
......@@ -3,7 +3,7 @@
<head>
<script src="resources/shadow-dom.js"></script>
<style>
* ^^ div {
* /shadow-deep/ div {
margin: 10px 10px 10px 10px;
border: solid black;
}
......
Test for ^^ combinator, http://crbug.com/309504.
Test for /shadow-deep/ combinator, http://crbug.com/309504.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
......
Test for ^ combinator, http://crbug.com/309504.
Test for /shadow-all/ combinator, http://crbug.com/309504.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
......
......@@ -35,14 +35,14 @@ function cleanUp()
document.getElementById('sandbox').innerHTML = '';
}
description('Test for ^ combinator, http://crbug.com/309504.');
description('Test for /shadow-all/ combinator, http://crbug.com/309504.');
var sandbox = document.getElementById('sandbox');
sandbox.appendChild(
createDOM('div', {},
createDOM('style', {},
document.createTextNode('div ^ span { border: 1px solid green; }')),
document.createTextNode('div /shadow-all/ span { border: 1px solid green; }')),
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('span', {'id': 'target'},
......@@ -56,7 +56,7 @@ cleanUp();
sandbox.appendChild(
createDOM('div', {},
createDOM('style', {},
document.createTextNode('div ^ span { border: 1px solid green; }')),
document.createTextNode('div /shadow-all/ span { border: 1px solid green; }')),
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
......@@ -71,7 +71,7 @@ cleanUp();
sandbox.appendChild(
createDOM('div', {},
createDOM('style', {},
document.createTextNode('div ^ span { border: 1px solid green; }')),
document.createTextNode('div /shadow-all/ span { border: 1px solid green; }')),
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
......@@ -87,7 +87,7 @@ cleanUp();
sandbox.appendChild(
createDOM('div', {},
createDOM('style', {},
document.createTextNode('div#sandbox > div > div ^ span { border: 1px solid green; }')),
document.createTextNode('div#sandbox > div > div /shadow-all/ span { border: 1px solid green; }')),
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('span', {'id': 'target'},
......@@ -100,7 +100,7 @@ cleanUp();
sandbox.appendChild(
createDOM('div', {},
createDOM('style', {},
document.createTextNode('div ^ span { border: 1px solid green; }')),
document.createTextNode('div /shadow-all/ span { border: 1px solid green; }')),
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
......@@ -116,7 +116,7 @@ cleanUp();
sandbox.appendChild(
createDOM('div', {},
createDOM('style', {},
document.createTextNode('div ^ span { border: 1px solid green; }')),
document.createTextNode('div /shadow-all/ span { border: 1px solid green; }')),
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
......@@ -124,7 +124,7 @@ sandbox.appendChild(
createDOM('span', {'id': 'target'},
document.createTextNode('red border because of specificity.'))))));
// Since :host's specificity is the same as *, div ^^ span wins.
// Since :host's specificity is the same as *, div /shadow-all/ span wins.
borderColorShouldBe('host/target', 'rgb(0, 128, 0)');
cleanUp();
......@@ -133,7 +133,7 @@ sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode(':host ^ span { border: 1px solid green; }')),
document.createTextNode(':host /shadow-all/ span { border: 1px solid green; }')),
createDOM('span', {},
document.createTextNode('some text'))),
createShadowRoot(
......@@ -145,12 +145,12 @@ borderColorShouldBe('host//target', 'rgb(0, 128, 0)');
cleanUp();
// div ^ span's div cannot match a shadow host whose shadow tree contains the style.
// div /shadow-all/ span's div cannot match a shadow host whose shadow tree contains the style.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode('div ^ span { border: 1px solid green; }')),
document.createTextNode('div /shadow-all/ span { border: 1px solid green; }')),
createDOM('span', {},
document.createTextNode('some text'))),
createShadowRoot(
......@@ -163,12 +163,12 @@ borderColorShouldBe('host//target', 'rgb(0, 0, 0)');
cleanUp();
// div ^ span can match [div -- sr -- span] in its sibling shadow tree.
// div /shadow-all/ span can match [div -- sr -- span] in its sibling shadow tree.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode('div ^ span { border: 1px solid green; }')),
document.createTextNode('div /shadow-all/ span { border: 1px solid green; }')),
createDOM('span', {},
document.createTextNode('some text'))),
createShadowRoot(
......@@ -182,12 +182,12 @@ borderColorShouldBe('host//host2/target', 'rgb(0, 128, 0)');
cleanUp();
// :host div ^ div should match.
// :host div /shadow-all/ div should match.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode(':host div ^ div { border: 1px solid green; }')),
document.createTextNode(':host div /shadow-all/ div { border: 1px solid green; }')),
createDOM('div', {'id': 'host2'},
createShadowRoot(
createDOM('div', {'id': 'target'},
......@@ -202,7 +202,7 @@ sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode('div:host ^ span { border: 1px solid green; }')),
document.createTextNode('div:host /shadow-all/ span { border: 1px solid green; }')),
createDOM('span', {'id': 'target'},
document.createTextNode('no border, because div:host matches nothing.')))));
......@@ -210,13 +210,13 @@ borderColorShouldBe('host/target', 'rgb(0, 0, 0)');
cleanUp();
// div (=shadow host) div ^ div should not match.
// div (=shadow host) div /shadow-all/ div should not match.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode('div > div ^ div { border: 1px solid green; }')),
document.createTextNode('div > div /shadow-all/ div { border: 1px solid green; }')),
createDOM('div', {'id': 'host2'},
createShadowRoot(
createDOM('div', {'id': 'target'},
......@@ -226,13 +226,13 @@ borderColorShouldBe('host/host2/target', 'rgb(0, 0, 0)');
cleanUp();
// div + div ^ div should match.
// div + div /shadow-all/ div should match.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode('div + div ^ div { border: 1px solid green; }')),
document.createTextNode('div + div /shadow-all/ div { border: 1px solid green; }')),
createDOM('div', {},
document.createTextNode('sibling')),
createDOM('div', {'id': 'host2'},
......@@ -244,13 +244,13 @@ borderColorShouldBe('host/host2/target', 'rgb(0, 128, 0)');
cleanUp();
// :host + div ^ div should not match.
// :host + div /shadow-all/ div should not match.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode(':host + div ^ div { border: 1px solid green; }')),
document.createTextNode(':host + div /shadow-all/ div { border: 1px solid green; }')),
createDOM('div', {'id': 'siblingShadow'},
createShadowRoot(
createDOM('div', {},
......@@ -264,12 +264,12 @@ borderColorShouldBe('host/host2/target', 'rgb(0, 0, 0)');
cleanUp();
// div ^ span in an insert shadow tree cannot match any element in active shadow tree.
// div /shadow-all/ span in an insert shadow tree cannot match any element in active shadow tree.
sandbox.appendChild(
createDOM('div', {'id': 'host'},
createShadowRoot(
createDOM('style', {},
document.createTextNode('div ^ span { border: 1px solid red; }')),
document.createTextNode('div /shadow-all/ span { border: 1px solid red; }')),
createDOM('span', {},
document.createTextNode('some text'))),
createShadowRoot(
......
......@@ -1045,15 +1045,17 @@ combinator:
'+' maybe_space { $$ = CSSSelector::DirectAdjacent; }
| '~' maybe_space { $$ = CSSSelector::IndirectAdjacent; }
| '>' maybe_space { $$ = CSSSelector::Child; }
| '^' maybe_space {
// FIXME: implement named combinator and replace the following /shadow/, /shadow-all/ and
// /shadow-deep/ with named combinator's implementation.
| '/' IDENT '/' maybe_space {
if (!RuntimeEnabledFeatures::shadowDOMEnabled())
YYERROR;
$$ = CSSSelector::ChildTree;
}
| '^' '^' maybe_space {
if (!RuntimeEnabledFeatures::shadowDOMEnabled())
if ($2.equalIgnoringCase("shadow-all"))
$$ = CSSSelector::ShadowAll;
else if ($2.equalIgnoringCase("shadow-deep"))
$$ = CSSSelector::ShadowDeep;
else
YYERROR;
$$ = CSSSelector::DescendantTree;
}
;
......
......@@ -760,10 +760,10 @@ String CSSSelector::selectorText(const String& rightSide) const
if (cs->relationIsAffectedByPseudoContent() && tagHistory->pseudoType() != CSSSelector::PseudoContent)
return tagHistory->selectorText("::-webkit-distributed(> " + str.toString() + rightSide + ")");
return tagHistory->selectorText(" > " + str.toString() + rightSide);
case CSSSelector::ChildTree:
return tagHistory->selectorText(" ^ " + str.toString() + rightSide);
case CSSSelector::DescendantTree:
return tagHistory->selectorText(" ^^ " + str.toString() + rightSide);
case CSSSelector::ShadowAll:
return tagHistory->selectorText(" /shadow-all/ " + str.toString() + rightSide);
case CSSSelector::ShadowDeep:
return tagHistory->selectorText(" /shadow-deep/ " + str.toString() + rightSide);
case CSSSelector::DirectAdjacent:
return tagHistory->selectorText(" + " + str.toString() + rightSide);
case CSSSelector::IndirectAdjacent:
......
......@@ -129,9 +129,10 @@ namespace WebCore {
IndirectAdjacent, // ~ combinator
SubSelector, // "No space" combinator
ShadowPseudo, // Special case of shadow DOM pseudo elements
// FIXME: rename ChildTree and DescendantTree when the spec for this is written down.
ChildTree, // ^ operator for shadow DOM
DescendantTree // ^^ operator for shadow DOM
// FIXME: implement named combinator and replace the following /shadow/, /shadow-all/ and
// /shadow-deep/ with named combinator's implementation.
ShadowAll,
ShadowDeep
};
enum PseudoType {
......
......@@ -186,7 +186,7 @@ class SelectorHasCombinatorCrossingTreeBoundary {
public:
bool operator()(const CSSSelector& selector)
{
return selector.relation() == CSSSelector::ChildTree || selector.relation() == CSSSelector::DescendantTree;
return selector.relation() == CSSSelector::ShadowAll || selector.relation() == CSSSelector::ShadowDeep;
}
};
......
......@@ -116,7 +116,7 @@ static bool supportsClassDescendantInvalidation(const CSSSelector& selector)
} else if (!isSkippableComponentForInvalidation(*component)) {
return false;
}
// FIXME: We can probably support ChildTree and DescendantTree.
// FIXME: We can probably support ShadowAll and ShadowDeep.
switch (component->relation()) {
case CSSSelector::Descendant:
case CSSSelector::Child:
......
......@@ -290,7 +290,7 @@ SelectorChecker::Match SelectorChecker::matchForRelation(const SelectorCheckingC
return SelectorFailsAllSiblings;
case CSSSelector::ShadowPseudo:
case CSSSelector::ChildTree:
case CSSSelector::ShadowAll:
{
// If we're in the same tree-scope as the scoping element, then following a shadow descendant combinator would escape that and thus the scope.
if (context.scope && context.scope->treeScope() == context.element->treeScope() && (context.behaviorAtBoundary & BoundaryBehaviorMask) != StaysWithinTreeScope)
......@@ -305,7 +305,7 @@ SelectorChecker::Match SelectorChecker::matchForRelation(const SelectorCheckingC
return this->match(nextContext, siblingTraversalStrategy, result);
}
case CSSSelector::DescendantTree:
case CSSSelector::ShadowDeep:
{
nextContext.isSubSelector = false;
nextContext.elementStyle = 0;
......
......@@ -157,8 +157,8 @@ void SelectorFilter::collectIdentifierHashes(const CSSSelector& selector, unsign
return;
}
// Fall through.
case CSSSelector::ChildTree:
case CSSSelector::DescendantTree:
case CSSSelector::ShadowAll:
case CSSSelector::ShadowDeep:
skipOverSubselectors = false;
collectDescendantSelectorIdentifierHashes(*current, hash);
break;
......
......@@ -58,7 +58,7 @@ static bool determineSelectorScopes(const CSSSelectorList& selectorList, HashSet
CSSSelector::Relation relation = current->relation();
// FIXME: it would be better to use setNeedsStyleRecalc for all shadow hosts matching
// scopeSelector. Currently requests full style recalc.
if (relation == CSSSelector::DescendantTree || relation == CSSSelector::ChildTree)
if (relation == CSSSelector::ShadowDeep || relation == CSSSelector::ShadowAll)
return false;
if (relation != CSSSelector::Descendant && relation != CSSSelector::Child && relation != CSSSelector::SubSelector)
break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment