<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[175432] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/175432">175432</a></dd>
<dt>Author</dt> <dd>benjamin@webkit.org</dd>
<dt>Date</dt> <dd>2014-10-31 16:10:04 -0700 (Fri, 31 Oct 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Pseudo classes with an escaped parenthesis generate invalid rules
https://bugs.webkit.org/show_bug.cgi?id=138266

Patch by Benjamin Poulain &lt;bpoulain@apple.com&gt; on 2014-10-31
Reviewed by Antti Koivisto.

Source/WebCore:

Since the functional pseudo classes are part of the list of PseudoClassAndCompatibilityElement,
they could be created by the rule
     pseudo:
         ':' IDENT
if the parenthesis is escaped. For example, with &quot;:not\\(&quot;, the IDENT would be
&quot;not(&quot;, CSSParserSelector::parsePseudoClassAndCompatibilityElementSelector would
find a pseudo class type of PseudoClassNot, and the action would create an invalid
CSSSelector for a :not() without nested selector.

This patch fixes the issue by detecting the function case in
CSSParserSelector::parsePseudoClassAndCompatibilityElementSelector().

An other solution would be to split PseudoClassAndCompatibilityElement into simple pseudo class
and functional pseudo classes. We may do that some day but at the moment it is a lot of work with
a little benefit.

Tests: fast/css/crash-on-incomplete-webkit-any.html
       fast/css/pseudo-escaped-parenthesis.html
       fast/selectors/invalid-functional-pseudo-class.html

* css/CSSParserValues.cpp:
(WebCore::CSSParserSelector::parsePseudoClassAndCompatibilityElementSelector):

LayoutTests:

* fast/selectors/invalid-functional-pseudo-class-expected.txt: Added.
* fast/selectors/invalid-functional-pseudo-class.html: Added.
New test for all the functional pseudo classes.

* fast/css/crash-on-incomplete-webkit-any-expected.txt: Added.
* fast/css/crash-on-incomplete-webkit-any.html: Added.
* fast/css/pseudo-escaped-parenthesis-expected.txt: Added.
* fast/css/pseudo-escaped-parenthesis.html: Added.
Those tests come from blink. Rune solved the same problem a year ago on blink
in https://chromiumcodereview.appspot.com/23710067
The patch is quite different because blink uses an ancient code base, but the tests
can still be useful so I included them here.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssCSSParserValuescpp">trunk/Source/WebCore/css/CSSParserValues.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastcsscrashonincompletewebkitanyexpectedtxt">trunk/LayoutTests/fast/css/crash-on-incomplete-webkit-any-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastcsscrashonincompletewebkitanyhtml">trunk/LayoutTests/fast/css/crash-on-incomplete-webkit-any.html</a></li>
<li><a href="#trunkLayoutTestsfastcsspseudoescapedparenthesisexpectedtxt">trunk/LayoutTests/fast/css/pseudo-escaped-parenthesis-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastcsspseudoescapedparenthesishtml">trunk/LayoutTests/fast/css/pseudo-escaped-parenthesis.html</a></li>
<li><a href="#trunkLayoutTestsfastselectorsinvalidfunctionalpseudoclassexpectedtxt">trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastselectorsinvalidfunctionalpseudoclasshtml">trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (175431 => 175432)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-10-31 23:09:14 UTC (rev 175431)
+++ trunk/LayoutTests/ChangeLog        2014-10-31 23:10:04 UTC (rev 175432)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2014-10-31  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
+
+        Pseudo classes with an escaped parenthesis generate invalid rules
+        https://bugs.webkit.org/show_bug.cgi?id=138266
+
+        Reviewed by Antti Koivisto.
+
+        * fast/selectors/invalid-functional-pseudo-class-expected.txt: Added.
+        * fast/selectors/invalid-functional-pseudo-class.html: Added.
+        New test for all the functional pseudo classes.
+
+        * fast/css/crash-on-incomplete-webkit-any-expected.txt: Added.
+        * fast/css/crash-on-incomplete-webkit-any.html: Added.
+        * fast/css/pseudo-escaped-parenthesis-expected.txt: Added.
+        * fast/css/pseudo-escaped-parenthesis.html: Added.
+        Those tests come from blink. Rune solved the same problem a year ago on blink
+        in https://chromiumcodereview.appspot.com/23710067
+        The patch is quite different because blink uses an ancient code base, but the tests
+        can still be useful so I included them here.
+
</ins><span class="cx"> 2014-10-31  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove webkit prefix from CSS columns.
</span></span></pre></div>
<a id="trunkLayoutTestsfastcsscrashonincompletewebkitanyexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css/crash-on-incomplete-webkit-any-expected.txt (0 => 175432)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/crash-on-incomplete-webkit-any-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/css/crash-on-incomplete-webkit-any-expected.txt        2014-10-31 23:10:04 UTC (rev 175432)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+PASS if not crashed.
</ins></span></pre></div>
<a id="trunkLayoutTestsfastcsscrashonincompletewebkitanyhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css/crash-on-incomplete-webkit-any.html (0 => 175432)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/crash-on-incomplete-webkit-any.html                                (rev 0)
+++ trunk/LayoutTests/fast/css/crash-on-incomplete-webkit-any.html        2014-10-31 23:10:04 UTC (rev 175432)
</span><span class="lines">@@ -0,0 +1,14 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;title&gt;:-webkit-any\( should not crash&lt;/title&gt;
+    &lt;script&gt;
+        if (window.testRunner)
+            testRunner.dumpAsText();
+    &lt;/script&gt;
+    &lt;style&gt;:-webkit-any\( {}&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;p&gt;PASS if not crashed.&lt;/p&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastcsspseudoescapedparenthesisexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css/pseudo-escaped-parenthesis-expected.txt (0 => 175432)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/pseudo-escaped-parenthesis-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/css/pseudo-escaped-parenthesis-expected.txt        2014-10-31 23:10:04 UTC (rev 175432)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+
+PASS All stylesheets present 
+PASS Drop &quot;:-webkit-any\( {}&quot; 
+PASS Drop &quot;:nth-child\( {}&quot; 
+PASS Drop &quot;:nth-of-type\( {}&quot; 
+PASS Drop &quot;:nth-last-child\( {}&quot; 
+PASS Drop &quot;:nth-last-of-type\( {}&quot; 
+PASS Drop &quot;:lang\( {}&quot; 
+PASS Drop &quot;:not\( {}&quot; 
+PASS Drop &quot;:cue\( {}&quot; 
+PASS Drop &quot;:part\( {}&quot; 
+PASS Drop &quot;:host\( {}&quot; 
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastcsspseudoescapedparenthesishtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css/pseudo-escaped-parenthesis.html (0 => 175432)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css/pseudo-escaped-parenthesis.html                                (rev 0)
+++ trunk/LayoutTests/fast/css/pseudo-escaped-parenthesis.html        2014-10-31 23:10:04 UTC (rev 175432)
</span><span class="lines">@@ -0,0 +1,34 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;title&gt;Pseudo classes with escaped start parenthesis&lt;/title&gt;
+    &lt;script src=&quot;../../resources/testharness.js&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;../../resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+    &lt;style&gt;:-webkit-any\( {}&lt;/style&gt;
+    &lt;style&gt;:nth-child\( {}&lt;/style&gt;
+    &lt;style&gt;:nth-of-type\( {}&lt;/style&gt;
+    &lt;style&gt;:nth-last-child\( {}&lt;/style&gt;
+    &lt;style&gt;:nth-last-of-type\( {}&lt;/style&gt;
+    &lt;style&gt;:lang\( {}&lt;/style&gt;
+    &lt;style&gt;:not\( {}&lt;/style&gt;
+    &lt;style&gt;:cue\( {}&lt;/style&gt;
+    &lt;style&gt;:part\( {}&lt;/style&gt;
+    &lt;style&gt;:host\( {}&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;p id=&quot;log&quot;&gt;&lt;/p&gt;
+    &lt;script&gt;
+        var sheets = document.styleSheets;
+
+        test(function(){
+            assert_equals(sheets.length, 10, &quot;StyleSheets.length&quot;);
+        }, &quot;All stylesheets present&quot;)
+
+        for (var i=0; i&lt;sheets.length; i++) {
+            test(function(){
+                assert_equals(sheets[i].cssRules.length, 0, &quot;cssRules.length&quot;);
+            }, &quot;Drop \&quot;&quot; + sheets[i].ownerNode.firstChild.data + &quot;\&quot;&quot;);
+        }
+    &lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastselectorsinvalidfunctionalpseudoclassexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class-expected.txt (0 => 175432)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class-expected.txt        2014-10-31 23:10:04 UTC (rev 175432)
</span><span class="lines">@@ -0,0 +1,441 @@
</span><ins>+Verify the never generates a valid selector for an invalid functional pseudo class.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS document.querySelectorAll(&quot;:-webkit-any\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:-webkit-any\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:-webkit-any\\\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:-webkit-any\\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.querySelectorAll(&quot;:lang\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:lang\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:lang\\\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:lang\\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.querySelectorAll(&quot;:not\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:not\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:not\\\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:not\\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.querySelectorAll(&quot;:nth-child\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:nth-child\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:nth-child\\\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-child\\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.querySelectorAll(&quot;:nth-last-child\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:nth-last-child\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:nth-last-child\\\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-child\\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.querySelectorAll(&quot;:nth-last-of-type\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-last-of-type\\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.querySelectorAll(&quot;:nth-of-type\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:nth-of-type\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:nth-of-type\\\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:nth-of-type\\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.querySelectorAll(&quot;:matches\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:matches\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\\&quot;).length threw exception SyntaxError: Unexpected EOF.
+PASS document.querySelectorAll(&quot;:matches\\\\&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\\\(&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\\\ .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\\\( .foo&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\\\()&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\\\ .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.querySelectorAll(&quot;:matches\\\\( .foo)&quot;).length threw exception Error: SyntaxError: DOM Exception 12.
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS document.styleSheets[1].cssRules.length is 0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastselectorsinvalidfunctionalpseudoclasshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class.html (0 => 175432)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class.html                                (rev 0)
+++ trunk/LayoutTests/fast/selectors/invalid-functional-pseudo-class.html        2014-10-31 23:10:04 UTC (rev 175432)
</span><span class="lines">@@ -0,0 +1,77 @@
</span><ins>+&lt;!doctype html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;style id=&quot;style-target&quot;&gt;&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script&gt;
+description('Verify the never generates a valid selector for an invalid functional pseudo class.');
+
+function invalidRules(functonalPseudoClassName) {
+    return [':' + functonalPseudoClassName + '\\',
+            ':' + functonalPseudoClassName + '\\\\',
+            ':' + functonalPseudoClassName + '\\\\\\',
+            ':' + functonalPseudoClassName + '\\\\\\\\',
+            ':' + functonalPseudoClassName + '\\(',
+            ':' + functonalPseudoClassName + '\\\\(',
+            ':' + functonalPseudoClassName + '\\\\\\(',
+            ':' + functonalPseudoClassName + '\\\\\\\\(',
+            ':' + functonalPseudoClassName + '\\ .foo',
+            ':' + functonalPseudoClassName + '\\\\ .foo',
+            ':' + functonalPseudoClassName + '\\\\\\ .foo',
+            ':' + functonalPseudoClassName + '\\\\\\\\ .foo',
+            ':' + functonalPseudoClassName + '\\( .foo',
+            ':' + functonalPseudoClassName + '\\\\( .foo',
+            ':' + functonalPseudoClassName + '\\\\\\( .foo',
+            ':' + functonalPseudoClassName + '\\\\\\\\( .foo',
+            ':' + functonalPseudoClassName + '\\()',
+            ':' + functonalPseudoClassName + '\\\\()',
+            ':' + functonalPseudoClassName + '\\\\\\()',
+            ':' + functonalPseudoClassName + '\\\\\\\\()',
+            ':' + functonalPseudoClassName + '\\ .foo)',
+            ':' + functonalPseudoClassName + '\\\\ .foo)',
+            ':' + functonalPseudoClassName + '\\\\\\ .foo)',
+            ':' + functonalPseudoClassName + '\\\\\\\\ .foo)',
+            ':' + functonalPseudoClassName + '\\\\( .foo)',
+            ':' + functonalPseudoClassName + '\\\\\\( .foo)',
+            ':' + functonalPseudoClassName + '\\\\\\\\( .foo)'];
+}
+
+function testQuerySelector(functonalPseudoClassName) {
+    for (var testCase of invalidRules(functonalPseudoClassName))
+        shouldThrow('document.querySelectorAll(&quot;' + testCase + '&quot;).length');
+}
+
+function testStyling(functonalPseudoClassName) {
+    var styleElement = document.getElementById(&quot;style-target&quot;);
+
+    for (var testCase of invalidRules(functonalPseudoClassName)) {
+        styleElement.textContent = testCase + &quot; { background-color: red; }&quot;;
+        shouldBe(&quot;document.styleSheets[1].cssRules.length&quot;, &quot;0&quot;);
+    }
+    styleElement.textContent = &quot;&quot;;
+}
+
+function test(functonalPseudoClassName) {
+    testQuerySelector(functonalPseudoClassName);
+    testStyling(functonalPseudoClassName);
+}
+
+var functionalPseudoClasses = [
+    &quot;-webkit-any&quot;,
+    &quot;lang&quot;,
+    &quot;not&quot;,
+    &quot;nth-child&quot;,
+    &quot;nth-last-child&quot;,
+    &quot;nth-last-of-type&quot;,
+    &quot;nth-of-type&quot;,
+    &quot;matches&quot;,
+];
+
+for (var functionalPseudoClass of functionalPseudoClasses)
+    test(functionalPseudoClass);
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (175431 => 175432)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-10-31 23:09:14 UTC (rev 175431)
+++ trunk/Source/WebCore/ChangeLog        2014-10-31 23:10:04 UTC (rev 175432)
</span><span class="lines">@@ -1,3 +1,33 @@
</span><ins>+2014-10-31  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
+
+        Pseudo classes with an escaped parenthesis generate invalid rules
+        https://bugs.webkit.org/show_bug.cgi?id=138266
+
+        Reviewed by Antti Koivisto.
+
+        Since the functional pseudo classes are part of the list of PseudoClassAndCompatibilityElement,
+        they could be created by the rule
+             pseudo:
+                 ':' IDENT
+        if the parenthesis is escaped. For example, with &quot;:not\\(&quot;, the IDENT would be
+        &quot;not(&quot;, CSSParserSelector::parsePseudoClassAndCompatibilityElementSelector would
+        find a pseudo class type of PseudoClassNot, and the action would create an invalid
+        CSSSelector for a :not() without nested selector.
+
+        This patch fixes the issue by detecting the function case in
+        CSSParserSelector::parsePseudoClassAndCompatibilityElementSelector().
+
+        An other solution would be to split PseudoClassAndCompatibilityElement into simple pseudo class
+        and functional pseudo classes. We may do that some day but at the moment it is a lot of work with
+        a little benefit.
+
+        Tests: fast/css/crash-on-incomplete-webkit-any.html
+               fast/css/pseudo-escaped-parenthesis.html
+               fast/selectors/invalid-functional-pseudo-class.html
+
+        * css/CSSParserValues.cpp:
+        (WebCore::CSSParserSelector::parsePseudoClassAndCompatibilityElementSelector):
+
</ins><span class="cx"> 2014-10-31  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Make CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement() faster
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSParserValuescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSParserValues.cpp (175431 => 175432)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSParserValues.cpp        2014-10-31 23:09:14 UTC (rev 175431)
+++ trunk/Source/WebCore/css/CSSParserValues.cpp        2014-10-31 23:10:04 UTC (rev 175432)
</span><span class="lines">@@ -208,6 +208,9 @@
</span><span class="cx"> 
</span><span class="cx"> CSSParserSelector* CSSParserSelector::parsePseudoClassAndCompatibilityElementSelector(CSSParserString&amp; pseudoTypeString)
</span><span class="cx"> {
</span><ins>+    if (pseudoTypeString.length() &amp;&amp; pseudoTypeString[pseudoTypeString.length() - 1] == '(')
+        return nullptr;
+
</ins><span class="cx">     PseudoClassOrCompatibilityPseudoElement pseudoType = parsePseudoClassAndCompatibilityElementString(pseudoTypeString);
</span><span class="cx">     if (pseudoType.pseudoClass != CSSSelector::PseudoClassUnknown) {
</span><span class="cx">         auto selector = std::make_unique&lt;CSSParserSelector&gt;();
</span></span></pre>
</div>
</div>

</body>
</html>