<!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>[169478] trunk/Source/WebCore</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/169478">169478</a></dd>
<dt>Author</dt> <dd>benjamin@webkit.org</dd>
<dt>Date</dt> <dd>2014-05-29 17:15:18 -0700 (Thu, 29 May 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>CSS JIT: add support for the pseudo classes :hover and :active
https://bugs.webkit.org/show_bug.cgi?id=133295

Reviewed by Andreas Kling.

This patch adds compilation support for :hover and :active. The code generation of both of them is trivial,
most of the patch is improving the infrastructure and safety.

The document compatibility mode is moved to its own typed enum. This ensure the values are exclusives and
the native type is known (unsigned char here). The values are changes to binary flags to take advantage of
test-and-branch on ARM64 (not used explicitely, it is automatically generated by the MacroAssembler).

The other important refactoring is the code updating the flags on RenderStyle::NonInheritedFlags.
The code was duplicated in some places so it is move into its own function addFlagToElementStyleFromContext().

The generators themself are very simple. First we check the quirks-mode exceptions, that is generally excluded
at compile time because the conditions are almost never met, even in strict mode.
Then we have two cases: style resolution and query selector. Almost everything is just function calls.

* cssjit/SelectorCompiler.cpp:
(WebCore::SelectorCompiler::SelectorFragment::SelectorFragment):
(WebCore::SelectorCompiler::addPseudoClassType):
(WebCore::SelectorCompiler::SelectorCodeGenerator::addFlagToElementStyleFromContext):
(WebCore::SelectorCompiler::fragmentOnlyMatchesLinksInQuirksMode):
(WebCore::SelectorCompiler::getDocument):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateSpecialFailureInQuirksModeForActiveAndHoverIfNeeded):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementMatching):
(WebCore::SelectorCompiler::elementIsActive):
(WebCore::SelectorCompiler::elementIsActiveForStyleResolution):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsActive):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsFirstChild):
(WebCore::SelectorCompiler::elementIsHovered):
(WebCore::SelectorCompiler::elementIsHoveredForStyleResolution):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsHovered):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsLastChild):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsOnlyChild):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsNthChild):
* dom/Document.cpp:
(WebCore::Document::Document):
(WebCore::Document::setCompatibilityMode):
(WebCore::Document::implicitOpen):
(WebCore::Document::cloneDataFromDocument):
* dom/Document.h:
(WebCore::Document::compatibilityModeMemoryOffset):
(WebCore::Document::inQuirksMode):
(WebCore::Document::inLimitedQuirksMode):
(WebCore::Document::inNoQuirksMode):
(WebCore::Document::compatibilityMode): Deleted.
* html/ImageDocument.cpp:
(WebCore::ImageDocument::ImageDocument):
* html/MediaDocument.cpp:
(WebCore::MediaDocument::MediaDocument):
* html/PluginDocument.cpp:
(WebCore::PluginDocument::PluginDocument):
* html/TextDocument.cpp:
(WebCore::TextDocument::TextDocument):
* html/parser/HTMLConstructionSite.cpp:
(WebCore::HTMLConstructionSite::setDefaultCompatibilityMode):
(WebCore::HTMLConstructionSite::setCompatibilityMode):
(WebCore::HTMLConstructionSite::setCompatibilityModeFromDoctype):
(WebCore::HTMLConstructionSite::insertDoctype):
* html/parser/HTMLConstructionSite.h:
* loader/DocumentWriter.cpp:
(WebCore::DocumentWriter::replaceDocument):
* loader/SinkDocument.cpp:
(WebCore::SinkDocument::SinkDocument):
* page/ios/FrameIOS.mm:
(WebCore::Frame::initWithSimpleHTMLDocument):
* rendering/style/RenderStyle.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssjitSelectorCompilercpp">trunk/Source/WebCore/cssjit/SelectorCompiler.cpp</a></li>
<li><a href="#trunkSourceWebCoredomDocumentcpp">trunk/Source/WebCore/dom/Document.cpp</a></li>
<li><a href="#trunkSourceWebCoredomDocumenth">trunk/Source/WebCore/dom/Document.h</a></li>
<li><a href="#trunkSourceWebCorehtmlImageDocumentcpp">trunk/Source/WebCore/html/ImageDocument.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlMediaDocumentcpp">trunk/Source/WebCore/html/MediaDocument.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlPluginDocumentcpp">trunk/Source/WebCore/html/PluginDocument.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlTextDocumentcpp">trunk/Source/WebCore/html/TextDocument.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlparserHTMLConstructionSitecpp">trunk/Source/WebCore/html/parser/HTMLConstructionSite.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlparserHTMLConstructionSiteh">trunk/Source/WebCore/html/parser/HTMLConstructionSite.h</a></li>
<li><a href="#trunkSourceWebCoreloaderDocumentWritercpp">trunk/Source/WebCore/loader/DocumentWriter.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderSinkDocumentcpp">trunk/Source/WebCore/loader/SinkDocument.cpp</a></li>
<li><a href="#trunkSourceWebCorepageiosFrameIOSmm">trunk/Source/WebCore/page/ios/FrameIOS.mm</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleRenderStyleh">trunk/Source/WebCore/rendering/style/RenderStyle.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (169477 => 169478)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-05-30 00:09:40 UTC (rev 169477)
+++ trunk/Source/WebCore/ChangeLog        2014-05-30 00:15:18 UTC (rev 169478)
</span><span class="lines">@@ -1,3 +1,75 @@
</span><ins>+2014-05-29  Benjamin Poulain  &lt;benjamin@webkit.org&gt;
+
+        CSS JIT: add support for the pseudo classes :hover and :active
+        https://bugs.webkit.org/show_bug.cgi?id=133295
+
+        Reviewed by Andreas Kling.
+
+        This patch adds compilation support for :hover and :active. The code generation of both of them is trivial,
+        most of the patch is improving the infrastructure and safety.
+
+        The document compatibility mode is moved to its own typed enum. This ensure the values are exclusives and
+        the native type is known (unsigned char here). The values are changes to binary flags to take advantage of
+        test-and-branch on ARM64 (not used explicitely, it is automatically generated by the MacroAssembler).
+
+        The other important refactoring is the code updating the flags on RenderStyle::NonInheritedFlags.
+        The code was duplicated in some places so it is move into its own function addFlagToElementStyleFromContext().
+
+        The generators themself are very simple. First we check the quirks-mode exceptions, that is generally excluded
+        at compile time because the conditions are almost never met, even in strict mode.
+        Then we have two cases: style resolution and query selector. Almost everything is just function calls.
+
+        * cssjit/SelectorCompiler.cpp:
+        (WebCore::SelectorCompiler::SelectorFragment::SelectorFragment):
+        (WebCore::SelectorCompiler::addPseudoClassType):
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::addFlagToElementStyleFromContext):
+        (WebCore::SelectorCompiler::fragmentOnlyMatchesLinksInQuirksMode):
+        (WebCore::SelectorCompiler::getDocument):
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateSpecialFailureInQuirksModeForActiveAndHoverIfNeeded):
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementMatching):
+        (WebCore::SelectorCompiler::elementIsActive):
+        (WebCore::SelectorCompiler::elementIsActiveForStyleResolution):
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsActive):
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsFirstChild):
+        (WebCore::SelectorCompiler::elementIsHovered):
+        (WebCore::SelectorCompiler::elementIsHoveredForStyleResolution):
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsHovered):
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsLastChild):
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsOnlyChild):
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsNthChild):
+        * dom/Document.cpp:
+        (WebCore::Document::Document):
+        (WebCore::Document::setCompatibilityMode):
+        (WebCore::Document::implicitOpen):
+        (WebCore::Document::cloneDataFromDocument):
+        * dom/Document.h:
+        (WebCore::Document::compatibilityModeMemoryOffset):
+        (WebCore::Document::inQuirksMode):
+        (WebCore::Document::inLimitedQuirksMode):
+        (WebCore::Document::inNoQuirksMode):
+        (WebCore::Document::compatibilityMode): Deleted.
+        * html/ImageDocument.cpp:
+        (WebCore::ImageDocument::ImageDocument):
+        * html/MediaDocument.cpp:
+        (WebCore::MediaDocument::MediaDocument):
+        * html/PluginDocument.cpp:
+        (WebCore::PluginDocument::PluginDocument):
+        * html/TextDocument.cpp:
+        (WebCore::TextDocument::TextDocument):
+        * html/parser/HTMLConstructionSite.cpp:
+        (WebCore::HTMLConstructionSite::setDefaultCompatibilityMode):
+        (WebCore::HTMLConstructionSite::setCompatibilityMode):
+        (WebCore::HTMLConstructionSite::setCompatibilityModeFromDoctype):
+        (WebCore::HTMLConstructionSite::insertDoctype):
+        * html/parser/HTMLConstructionSite.h:
+        * loader/DocumentWriter.cpp:
+        (WebCore::DocumentWriter::replaceDocument):
+        * loader/SinkDocument.cpp:
+        (WebCore::SinkDocument::SinkDocument):
+        * page/ios/FrameIOS.mm:
+        (WebCore::Frame::initWithSimpleHTMLDocument):
+        * rendering/style/RenderStyle.h:
+
</ins><span class="cx"> 2014-05-28  Jon Honeycutt  &lt;jhoneycutt@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Roll r168668 back in.
</span></span></pre></div>
<a id="trunkSourceWebCorecssjitSelectorCompilercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/cssjit/SelectorCompiler.cpp (169477 => 169478)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/cssjit/SelectorCompiler.cpp        2014-05-30 00:09:40 UTC (rev 169477)
+++ trunk/Source/WebCore/cssjit/SelectorCompiler.cpp        2014-05-30 00:15:18 UTC (rev 169478)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> #include &quot;FunctionCall.h&quot;
</span><span class="cx"> #include &quot;HTMLDocument.h&quot;
</span><span class="cx"> #include &quot;HTMLNames.h&quot;
</span><ins>+#include &quot;InspectorInstrumentation.h&quot;
</ins><span class="cx"> #include &quot;NodeRenderStyle.h&quot;
</span><span class="cx"> #include &quot;QualifiedName.h&quot;
</span><span class="cx"> #include &quot;RegisterAllocator.h&quot;
</span><span class="lines">@@ -130,6 +131,7 @@
</span><span class="cx">         , widthFromIndirectAdjacent(0)
</span><span class="cx">         , tagName(nullptr)
</span><span class="cx">         , id(nullptr)
</span><ins>+        , inFunctionalPseudoClass(false)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx">     FragmentRelation relationToLeftFragment;
</span><span class="lines">@@ -153,6 +155,8 @@
</span><span class="cx">     Vector&lt;JSC::FunctionPtr&gt; unoptimizedPseudoClasses;
</span><span class="cx">     Vector&lt;AttributeMatchingInfo&gt; attributes;
</span><span class="cx">     Vector&lt;std::pair&lt;int, int&gt;&gt; nthChildfilters;
</span><ins>+
+    bool inFunctionalPseudoClass;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> struct TagNamePattern {
</span><span class="lines">@@ -207,7 +211,9 @@
</span><span class="cx">     void generateElementDataMatching(Assembler::JumpList&amp; failureCases, const SelectorFragment&amp;);
</span><span class="cx">     void generateElementFunctionCallTest(Assembler::JumpList&amp; failureCases, JSC::FunctionPtr);
</span><span class="cx">     Assembler::JumpList jumpIfNoPreviousAdjacentElement();
</span><ins>+    void generateElementIsActive(Assembler::JumpList&amp; failureCases, const SelectorFragment&amp;);
</ins><span class="cx">     void generateElementIsFirstChild(Assembler::JumpList&amp; failureCases, const SelectorFragment&amp;);
</span><ins>+    void generateElementIsHovered(Assembler::JumpList&amp; failureCases, const SelectorFragment&amp;);
</ins><span class="cx">     Assembler::JumpList jumpIfNoNextAdjacentElement();
</span><span class="cx">     void generateElementIsLastChild(Assembler::JumpList&amp; failureCases, const SelectorFragment&amp;);
</span><span class="cx">     void generateElementIsOnlyChild(Assembler::JumpList&amp; failureCases, const SelectorFragment&amp;);
</span><span class="lines">@@ -227,7 +233,9 @@
</span><span class="cx">     void generateElementIsTarget(Assembler::JumpList&amp; failureCases);
</span><span class="cx"> 
</span><span class="cx">     // Helpers.
</span><ins>+    void addFlagsToElementStyleFromContext(Assembler::RegisterID checkingContext, int64_t);
</ins><span class="cx">     Assembler::Jump jumpIfNotResolvingStyle(Assembler::RegisterID checkingContextRegister);
</span><ins>+    void generateSpecialFailureInQuirksModeForActiveAndHoverIfNeeded(Assembler::JumpList&amp; failureCases, const SelectorFragment&amp;);
</ins><span class="cx">     Assembler::Jump modulo(JSC::MacroAssembler::ResultCondition, Assembler::RegisterID inputDividend, int divisor);
</span><span class="cx">     void moduloIsZero(Assembler::JumpList&amp; failureCases, Assembler::RegisterID inputDividend, int divisor);
</span><span class="cx"> 
</span><span class="lines">@@ -367,7 +375,9 @@
</span><span class="cx">         fragment.pseudoClasses.add(type);
</span><span class="cx">         return FunctionType::SimpleSelectorChecker;
</span><span class="cx"> 
</span><ins>+    case CSSSelector::PseudoClassActive:
</ins><span class="cx">     case CSSSelector::PseudoClassFirstChild:
</span><ins>+    case CSSSelector::PseudoClassHover:
</ins><span class="cx">     case CSSSelector::PseudoClassLastChild:
</span><span class="cx">     case CSSSelector::PseudoClassOnlyChild:
</span><span class="cx">         fragment.pseudoClasses.add(type);
</span><span class="lines">@@ -1208,6 +1218,22 @@
</span><span class="cx">     localFailureCases.linkTo(loopStart, &amp;m_assembler);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+
+void SelectorCodeGenerator::addFlagsToElementStyleFromContext(Assembler::RegisterID checkingContext, int64_t newFlag)
+{
+    LocalRegister childStyle(m_registerAllocator);
+    m_assembler.loadPtr(Assembler::Address(checkingContext, OBJECT_OFFSETOF(CheckingContext, elementStyle)), childStyle);
+
+    // FIXME: We should look into doing something smart in MacroAssembler instead.
+    LocalRegister flags(m_registerAllocator);
+    Assembler::Address flagAddress(childStyle, RenderStyle::noninheritedFlagsMemoryOffset() + RenderStyle::NonInheritedFlags::flagsMemoryOffset());
+    m_assembler.load64(flagAddress, flags);
+    LocalRegister isFirstChildStateFlagImmediate(m_registerAllocator);
+    m_assembler.move(Assembler::TrustedImm64(newFlag), isFirstChildStateFlagImmediate);
+    m_assembler.or64(isFirstChildStateFlagImmediate, flags);
+    m_assembler.store64(flags, flagAddress);
+}
+
</ins><span class="cx"> Assembler::Jump SelectorCodeGenerator::jumpIfNotResolvingStyle(Assembler::RegisterID checkingContext)
</span><span class="cx"> {
</span><span class="cx">     RELEASE_ASSERT(m_selectorContext == SelectorContext::RuleCollector);
</span><span class="lines">@@ -1220,6 +1246,67 @@
</span><span class="cx">     return m_assembler.branch8(Assembler::NotEqual, Assembler::Address(checkingContext, OBJECT_OFFSETOF(CheckingContext, resolvingMode)), Assembler::TrustedImm32(SelectorChecker::ResolvingStyle));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static bool fragmentOnlyMatchesLinksInQuirksMode(const SelectorFragment&amp; fragment)
+{
+    // For quirks mode, follow this: http://quirks.spec.whatwg.org/#the-:active-and-:hover-quirk
+    // In quirks mode, a compound selector 'selector' that matches the following conditions must not match elements that would not also match the ':any-link' selector.
+    //
+    //    selector uses the ':active' or ':hover' pseudo-classes.
+    //    selector does not use a type selector.
+    //    selector does not use an attribute selector.
+    //    selector does not use an ID selector.
+    //    selector does not use a class selector.
+    //    selector does not use a pseudo-class selector other than ':active' and ':hover'.
+    //    selector does not use a pseudo-element selector.
+    //    selector is not part of an argument to a functional pseudo-class or pseudo-element.
+    if (fragment.tagName &amp;&amp; *fragment.tagName != anyQName())
+        return false;
+
+    if (!fragment.attributes.isEmpty())
+        return false;
+
+    if (fragment.id)
+        return false;
+
+    if (!fragment.classNames.isEmpty())
+        return false;
+
+    if (!fragment.unoptimizedPseudoClasses.isEmpty() || !fragment.nthChildfilters.isEmpty())
+        return false;
+
+    for (unsigned pseudoClassType : fragment.pseudoClasses) {
+        if (pseudoClassType != CSSSelector::PseudoClassHover &amp;&amp; pseudoClassType != CSSSelector::PseudoClassActive)
+            return false;
+    }
+
+    if (fragment.inFunctionalPseudoClass)
+        return false;
+
+    return true;
+}
+
+static void getDocument(Assembler&amp; assembler, Assembler::RegisterID element, Assembler::RegisterID output)
+{
+    assembler.loadPtr(Assembler::Address(element, Node::treeScopeMemoryOffset()), output);
+    assembler.loadPtr(Assembler::Address(output, TreeScope::documentScopeMemoryOffset()), output);
+}
+
+void SelectorCodeGenerator::generateSpecialFailureInQuirksModeForActiveAndHoverIfNeeded(Assembler::JumpList&amp; failureCases, const SelectorFragment&amp; fragment)
+{
+    if (fragmentOnlyMatchesLinksInQuirksMode(fragment)) {
+        // If the element is a link, it can always match :hover or :active.
+        Assembler::Jump isLink = m_assembler.branchTest32(Assembler::NonZero, Assembler::Address(elementAddressRegister, Node::nodeFlagsMemoryOffset()), Assembler::TrustedImm32(Node::flagIsLink()));
+
+        // Only quirks mode restrict :hover and :active.
+        static_assert(sizeof(DocumentCompatibilityMode) == 1, &quot;We generate a byte load/test for the compatibility mode.&quot;);
+        LocalRegister documentAddress(m_registerAllocator);
+        getDocument(m_assembler, elementAddressRegister, documentAddress);
+        failureCases.append(m_assembler.branchTest8(Assembler::NonZero, Assembler::Address(documentAddress, Document::compatibilityModeMemoryOffset()), Assembler::TrustedImm32(static_cast&lt;std::underlying_type&lt;DocumentCompatibilityMode&gt;::type&gt;(DocumentCompatibilityMode::QuirksMode))));
+
+        isLink.link(&amp;m_assembler);
+    }
+}
+
</ins><span class="cx"> // The value in inputDividend is destroyed by the modulo operation.
</span><span class="cx"> Assembler::Jump SelectorCodeGenerator::modulo(Assembler::ResultCondition condition, Assembler::RegisterID inputDividend, int divisor)
</span><span class="cx"> {
</span><span class="lines">@@ -1475,6 +1562,10 @@
</span><span class="cx"> 
</span><span class="cx">     generateElementDataMatching(matchingPostTagNameFailureCases, fragment);
</span><span class="cx"> 
</span><ins>+    if (fragment.pseudoClasses.contains(CSSSelector::PseudoClassActive))
+        generateElementIsActive(matchingPostTagNameFailureCases, fragment);
+    if (fragment.pseudoClasses.contains(CSSSelector::PseudoClassHover))
+        generateElementIsHovered(matchingPostTagNameFailureCases, fragment);
</ins><span class="cx">     if (fragment.pseudoClasses.contains(CSSSelector::PseudoClassOnlyChild))
</span><span class="cx">         generateElementIsOnlyChild(matchingPostTagNameFailureCases, fragment);
</span><span class="cx">     if (fragment.pseudoClasses.contains(CSSSelector::PseudoClassFirstChild))
</span><span class="lines">@@ -1813,12 +1904,6 @@
</span><span class="cx">     return assembler.branchTest32(condition, Assembler::Address(documentAddress, Document::documentClassesMemoryOffset()), Assembler::TrustedImm32(Document::isHTMLDocumentClassFlag()));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void getDocument(Assembler&amp; assembler, Assembler::RegisterID element, Assembler::RegisterID output)
-{
-    assembler.loadPtr(Assembler::Address(element, Node::treeScopeMemoryOffset()), output);
-    assembler.loadPtr(Assembler::Address(output, TreeScope::documentScopeMemoryOffset()), output);
-}
-
</del><span class="cx"> void SelectorCodeGenerator::generateElementAttributeValueExactMatching(Assembler::JumpList&amp; failureCases, Assembler::RegisterID currentAttributeAddress, const AtomicString&amp; expectedValue, bool canDefaultToCaseSensitiveValueMatch)
</span><span class="cx"> {
</span><span class="cx">     LocalRegister expectedValueRegister(m_registerAllocator);
</span><span class="lines">@@ -1919,6 +2004,51 @@
</span><span class="cx">     return successCase;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static bool elementIsActive(Element* element)
+{
+    return element-&gt;active() || InspectorInstrumentation::forcePseudoState(element, CSSSelector::PseudoClassActive);
+}
+
+static bool elementIsActiveForStyleResolution(Element* element, const CheckingContext* checkingContext)
+{
+    if (checkingContext-&gt;resolvingMode == SelectorChecker::ResolvingStyle)
+        element-&gt;setChildrenAffectedByActive();
+    return element-&gt;active() || InspectorInstrumentation::forcePseudoState(element, CSSSelector::PseudoClassActive);
+}
+
+void SelectorCodeGenerator::generateElementIsActive(Assembler::JumpList&amp; failureCases, const SelectorFragment&amp; fragment)
+{
+    generateSpecialFailureInQuirksModeForActiveAndHoverIfNeeded(failureCases, fragment);
+    if (m_selectorContext == SelectorContext::QuerySelector) {
+        FunctionCall functionCall(m_assembler, m_registerAllocator, m_stackAllocator, m_functionCalls);
+        functionCall.setFunctionAddress(elementIsActive);
+        functionCall.setOneArgument(elementAddressRegister);
+        failureCases.append(functionCall.callAndBranchOnCondition(Assembler::Zero));
+    } else {
+        if (fragment.relationToRightFragment == FragmentRelation::Rightmost) {
+            LocalRegister checkingContext(m_registerAllocator);
+            Assembler::Jump notResolvingStyle = jumpIfNotResolvingStyle(checkingContext);
+            addFlagsToElementStyleFromContext(checkingContext, RenderStyle::NonInheritedFlags::flagIsaffectedByActive());
+            notResolvingStyle.link(&amp;m_assembler);
+
+            FunctionCall functionCall(m_assembler, m_registerAllocator, m_stackAllocator, m_functionCalls);
+            functionCall.setFunctionAddress(elementIsActive);
+            functionCall.setOneArgument(elementAddressRegister);
+            failureCases.append(functionCall.callAndBranchOnCondition(Assembler::Zero));
+        } else {
+            unsigned offsetToCheckingContext = m_stackAllocator.offsetToStackReference(m_checkingContextStackReference);
+            Assembler::RegisterID checkingContext = m_registerAllocator.allocateRegister();
+            m_assembler.loadPtr(Assembler::Address(Assembler::stackPointerRegister, offsetToCheckingContext), checkingContext);
+            m_registerAllocator.deallocateRegister(checkingContext);
+
+            FunctionCall functionCall(m_assembler, m_registerAllocator, m_stackAllocator, m_functionCalls);
+            functionCall.setFunctionAddress(elementIsActiveForStyleResolution);
+            functionCall.setTwoArguments(elementAddressRegister, checkingContext);
+            failureCases.append(functionCall.callAndBranchOnCondition(Assembler::Zero));
+        }
+    }
+}
+
</ins><span class="cx"> void SelectorCodeGenerator::generateElementIsFirstChild(Assembler::JumpList&amp; failureCases, const SelectorFragment&amp; fragment)
</span><span class="cx"> {
</span><span class="cx">     if (m_selectorContext == SelectorContext::QuerySelector) {
</span><span class="lines">@@ -1956,19 +2086,9 @@
</span><span class="cx">     // Otherwise we need to apply setFirstChildState() on the RenderStyle.
</span><span class="cx">     failureCases.append(m_assembler.branchTest32(Assembler::NonZero, isFirstChildRegister));
</span><span class="cx"> 
</span><del>-    if (fragment.relationToRightFragment == FragmentRelation::Rightmost) {
-        LocalRegister childStyle(m_registerAllocator);
-        m_assembler.loadPtr(Assembler::Address(checkingContext, OBJECT_OFFSETOF(CheckingContext, elementStyle)), childStyle);
-
-        // FIXME: We should look into doing something smart in MacroAssembler instead.
-        LocalRegister flags(m_registerAllocator);
-        Assembler::Address flagAddress(childStyle, RenderStyle::noninheritedFlagsMemoryOffset() + RenderStyle::NonInheritedFlags::flagsMemoryOffset());
-        m_assembler.load64(flagAddress, flags);
-        LocalRegister isFirstChildStateFlagImmediate(m_registerAllocator);
-        m_assembler.move(Assembler::TrustedImm64(RenderStyle::NonInheritedFlags::setFirstChildStateFlags()), isFirstChildStateFlagImmediate);
-        m_assembler.or64(isFirstChildStateFlagImmediate, flags);
-        m_assembler.store64(flags, flagAddress);
-    } else {
</del><ins>+    if (fragment.relationToRightFragment == FragmentRelation::Rightmost)
+        addFlagsToElementStyleFromContext(checkingContext, RenderStyle::NonInheritedFlags::setFirstChildStateFlags());
+    else {
</ins><span class="cx">         FunctionCall functionCall(m_assembler, m_registerAllocator, m_stackAllocator, m_functionCalls);
</span><span class="cx">         functionCall.setFunctionAddress(setFirstChildState);
</span><span class="cx">         Assembler::RegisterID elementAddress = elementAddressRegister;
</span><span class="lines">@@ -1980,6 +2100,51 @@
</span><span class="cx">     failureCases.append(m_assembler.branchTest32(Assembler::NonZero, isFirstChildRegister));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static bool elementIsHovered(Element* element)
+{
+    return element-&gt;hovered() || InspectorInstrumentation::forcePseudoState(element, CSSSelector::PseudoClassHover);
+}
+
+static bool elementIsHoveredForStyleResolution(Element* element, const CheckingContext* checkingContext)
+{
+    if (checkingContext-&gt;resolvingMode == SelectorChecker::ResolvingStyle)
+        element-&gt;setChildrenAffectedByHover();
+    return element-&gt;hovered() || InspectorInstrumentation::forcePseudoState(element, CSSSelector::PseudoClassHover);
+}
+
+void SelectorCodeGenerator::generateElementIsHovered(Assembler::JumpList&amp; failureCases, const SelectorFragment&amp; fragment)
+{
+    generateSpecialFailureInQuirksModeForActiveAndHoverIfNeeded(failureCases, fragment);
+    if (m_selectorContext == SelectorContext::QuerySelector) {
+        FunctionCall functionCall(m_assembler, m_registerAllocator, m_stackAllocator, m_functionCalls);
+        functionCall.setFunctionAddress(elementIsHovered);
+        functionCall.setOneArgument(elementAddressRegister);
+        failureCases.append(functionCall.callAndBranchOnCondition(Assembler::Zero));
+    } else {
+        if (fragment.relationToRightFragment == FragmentRelation::Rightmost) {
+            LocalRegister checkingContext(m_registerAllocator);
+            Assembler::Jump notResolvingStyle = jumpIfNotResolvingStyle(checkingContext);
+            addFlagsToElementStyleFromContext(checkingContext, RenderStyle::NonInheritedFlags::flagIsaffectedByHover());
+            notResolvingStyle.link(&amp;m_assembler);
+
+            FunctionCall functionCall(m_assembler, m_registerAllocator, m_stackAllocator, m_functionCalls);
+            functionCall.setFunctionAddress(elementIsHovered);
+            functionCall.setOneArgument(elementAddressRegister);
+            failureCases.append(functionCall.callAndBranchOnCondition(Assembler::Zero));
+        } else {
+            unsigned offsetToCheckingContext = m_stackAllocator.offsetToStackReference(m_checkingContextStackReference);
+            Assembler::RegisterID checkingContext = m_registerAllocator.allocateRegister();
+            m_assembler.loadPtr(Assembler::Address(Assembler::stackPointerRegister, offsetToCheckingContext), checkingContext);
+            m_registerAllocator.deallocateRegister(checkingContext);
+
+            FunctionCall functionCall(m_assembler, m_registerAllocator, m_stackAllocator, m_functionCalls);
+            functionCall.setFunctionAddress(elementIsHoveredForStyleResolution);
+            functionCall.setTwoArguments(elementAddressRegister, checkingContext);
+            failureCases.append(functionCall.callAndBranchOnCondition(Assembler::Zero));
+        }
+    }
+}
+
</ins><span class="cx"> Assembler::JumpList SelectorCodeGenerator::jumpIfNoNextAdjacentElement()
</span><span class="cx"> {
</span><span class="cx">     Assembler::JumpList successCase;
</span><span class="lines">@@ -2038,19 +2203,9 @@
</span><span class="cx">     // Otherwise we need to apply setLastChildState() on the RenderStyle.
</span><span class="cx">     failureCases.append(m_assembler.branchTest32(Assembler::NonZero, isLastChildRegister));
</span><span class="cx"> 
</span><del>-    if (fragment.relationToRightFragment == FragmentRelation::Rightmost) {
-        LocalRegister childStyle(m_registerAllocator);
-        m_assembler.loadPtr(Assembler::Address(checkingContext, OBJECT_OFFSETOF(CheckingContext, elementStyle)), childStyle);
-
-        // FIXME: We should look into doing something smart in MacroAssembler instead.
-        LocalRegister flags(m_registerAllocator);
-        Assembler::Address flagAddress(childStyle, RenderStyle::noninheritedFlagsMemoryOffset() + RenderStyle::NonInheritedFlags::flagsMemoryOffset());
-        m_assembler.load64(flagAddress, flags);
-        LocalRegister isLastChildStateFlagImmediate(m_registerAllocator);
-        m_assembler.move(Assembler::TrustedImm64(RenderStyle::NonInheritedFlags::setLastChildStateFlags()), isLastChildStateFlagImmediate);
-        m_assembler.or64(isLastChildStateFlagImmediate, flags);
-        m_assembler.store64(flags, flagAddress);
-    } else {
</del><ins>+    if (fragment.relationToRightFragment == FragmentRelation::Rightmost)
+        addFlagsToElementStyleFromContext(checkingContext, RenderStyle::NonInheritedFlags::setLastChildStateFlags());
+    else {
</ins><span class="cx">         FunctionCall functionCall(m_assembler, m_registerAllocator, m_stackAllocator, m_functionCalls);
</span><span class="cx">         functionCall.setFunctionAddress(setLastChildState);
</span><span class="cx">         Assembler::RegisterID elementAddress = elementAddressRegister;
</span><span class="lines">@@ -2123,19 +2278,9 @@
</span><span class="cx">     // Otherwise we need to apply setLastChildState() on the RenderStyle.
</span><span class="cx">     failureCases.append(m_assembler.branchTest32(Assembler::NonZero, isOnlyChildRegister));
</span><span class="cx"> 
</span><del>-    if (fragment.relationToRightFragment == FragmentRelation::Rightmost) {
-        LocalRegister childStyle(m_registerAllocator);
-        m_assembler.loadPtr(Assembler::Address(checkingContext, OBJECT_OFFSETOF(CheckingContext, elementStyle)), childStyle);
-
-        // FIXME: We should look into doing something smart in MacroAssembler instead.
-        LocalRegister flags(m_registerAllocator);
-        Assembler::Address flagAddress(childStyle, RenderStyle::noninheritedFlagsMemoryOffset() + RenderStyle::NonInheritedFlags::flagsMemoryOffset());
-        m_assembler.load64(flagAddress, flags);
-        LocalRegister isLastChildStateFlagImmediate(m_registerAllocator);
-        m_assembler.move(Assembler::TrustedImm64(RenderStyle::NonInheritedFlags::setFirstChildStateFlags() | RenderStyle::NonInheritedFlags::setLastChildStateFlags()), isLastChildStateFlagImmediate);
-        m_assembler.or64(isLastChildStateFlagImmediate, flags);
-        m_assembler.store64(flags, flagAddress);
-    } else {
</del><ins>+    if (fragment.relationToRightFragment == FragmentRelation::Rightmost)
+        addFlagsToElementStyleFromContext(checkingContext, RenderStyle::NonInheritedFlags::setFirstChildStateFlags() | RenderStyle::NonInheritedFlags::setLastChildStateFlags());
+    else {
</ins><span class="cx">         FunctionCall functionCall(m_assembler, m_registerAllocator, m_stackAllocator, m_functionCalls);
</span><span class="cx">         functionCall.setFunctionAddress(setOnlyChildState);
</span><span class="cx">         Assembler::RegisterID elementAddress = elementAddressRegister;
</span><span class="lines">@@ -2304,17 +2449,8 @@
</span><span class="cx">         functionCall.call();
</span><span class="cx"> 
</span><span class="cx">         if (fragment.relationToRightFragment == FragmentRelation::Rightmost) {
</span><del>-            LocalRegister childStyle(m_registerAllocator);
-            m_assembler.loadPtr(Assembler::Address(checkingContext, OBJECT_OFFSETOF(CheckingContext, elementStyle)), childStyle);
</del><ins>+            addFlagsToElementStyleFromContext(checkingContext, RenderStyle::NonInheritedFlags::flagIsUnique());
</ins><span class="cx"> 
</span><del>-            LocalRegister flags(m_registerAllocator);
-            Assembler::Address flagAddress(childStyle, RenderStyle::noninheritedFlagsMemoryOffset() + RenderStyle::NonInheritedFlags::flagsMemoryOffset());
-            m_assembler.load64(flagAddress, flags);
-            LocalRegister isUniqueFlagImmediate(m_registerAllocator);
-            m_assembler.move(Assembler::TrustedImm64(RenderStyle::NonInheritedFlags::flagIsUnique()), isUniqueFlagImmediate);
-            m_assembler.or64(isUniqueFlagImmediate, flags);
-            m_assembler.store64(flags, flagAddress);
-
</del><span class="cx">             Assembler::RegisterID elementAddress = elementAddressRegister;
</span><span class="cx">             FunctionCall functionCall(m_assembler, m_registerAllocator, m_stackAllocator, m_functionCalls);
</span><span class="cx">             functionCall.setFunctionAddress(setElementChildIndex);
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.cpp (169477 => 169478)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.cpp        2014-05-30 00:09:40 UTC (rev 169477)
+++ trunk/Source/WebCore/dom/Document.cpp        2014-05-30 00:15:18 UTC (rev 169478)
</span><span class="lines">@@ -419,7 +419,7 @@
</span><span class="cx">     , m_printing(false)
</span><span class="cx">     , m_paginatedForScreen(false)
</span><span class="cx">     , m_ignoreAutofocus(false)
</span><del>-    , m_compatibilityMode(NoQuirksMode)
</del><ins>+    , m_compatibilityMode(DocumentCompatibilityMode::NoQuirksMode)
</ins><span class="cx">     , m_compatibilityModeLocked(false)
</span><span class="cx">     , m_textColor(Color::black)
</span><span class="cx">     , m_domTreeVersion(++s_globalTreeVersion)
</span><span class="lines">@@ -766,7 +766,7 @@
</span><span class="cx">     return *m_mediaQueryMatcher;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Document::setCompatibilityMode(CompatibilityMode mode)
</del><ins>+void Document::setCompatibilityMode(DocumentCompatibilityMode mode)
</ins><span class="cx"> {
</span><span class="cx">     if (m_compatibilityModeLocked || mode == m_compatibilityMode)
</span><span class="cx">         return;
</span><span class="lines">@@ -2261,7 +2261,7 @@
</span><span class="cx"> 
</span><span class="cx">     removeChildren();
</span><span class="cx"> 
</span><del>-    setCompatibilityMode(NoQuirksMode);
</del><ins>+    setCompatibilityMode(DocumentCompatibilityMode::NoQuirksMode);
</ins><span class="cx"> 
</span><span class="cx">     m_parser = createParser();
</span><span class="cx">     setParsing(true);
</span><span class="lines">@@ -3129,7 +3129,7 @@
</span><span class="cx">     m_baseURLOverride = other.baseURLOverride();
</span><span class="cx">     m_documentURI = other.documentURI();
</span><span class="cx"> 
</span><del>-    setCompatibilityMode(other.compatibilityMode());
</del><ins>+    setCompatibilityMode(other.m_compatibilityMode);
</ins><span class="cx">     setSecurityOrigin(other.securityOrigin());
</span><span class="cx">     setDecoder(other.decoder());
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.h (169477 => 169478)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.h        2014-05-30 00:09:40 UTC (rev 169477)
+++ trunk/Source/WebCore/dom/Document.h        2014-05-30 00:15:18 UTC (rev 169478)
</span><span class="lines">@@ -248,6 +248,12 @@
</span><span class="cx"> 
</span><span class="cx"> typedef unsigned char DocumentClassFlags;
</span><span class="cx"> 
</span><ins>+enum class DocumentCompatibilityMode : unsigned char {
+    NoQuirksMode = 1,
+    QuirksMode = 1 &lt;&lt; 1,
+    LimitedQuirksMode = 1 &lt;&lt; 2
+};
+
</ins><span class="cx"> class Document : public ContainerNode, public TreeScope, public ScriptExecutionContext {
</span><span class="cx"> public:
</span><span class="cx">     static PassRefPtr&lt;Document&gt; create(Frame* frame, const URL&amp; url)
</span><span class="lines">@@ -686,17 +692,15 @@
</span><span class="cx">     
</span><span class="cx">     bool paginated() const { return printing() || paginatedForScreen(); }
</span><span class="cx"> 
</span><del>-    enum CompatibilityMode { QuirksMode, LimitedQuirksMode, NoQuirksMode };
-
-    void setCompatibilityMode(CompatibilityMode m);
</del><ins>+    void setCompatibilityMode(DocumentCompatibilityMode);
</ins><span class="cx">     void lockCompatibilityMode() { m_compatibilityModeLocked = true; }
</span><del>-    CompatibilityMode compatibilityMode() const { return m_compatibilityMode; }
</del><ins>+    static ptrdiff_t compatibilityModeMemoryOffset() { return OBJECT_OFFSETOF(Document, m_compatibilityMode); }
</ins><span class="cx"> 
</span><span class="cx">     String compatMode() const;
</span><span class="cx"> 
</span><del>-    bool inQuirksMode() const { return m_compatibilityMode == QuirksMode; }
-    bool inLimitedQuirksMode() const { return m_compatibilityMode == LimitedQuirksMode; }
-    bool inNoQuirksMode() const { return m_compatibilityMode == NoQuirksMode; }
</del><ins>+    bool inQuirksMode() const { return m_compatibilityMode == DocumentCompatibilityMode::QuirksMode; }
+    bool inLimitedQuirksMode() const { return m_compatibilityMode == DocumentCompatibilityMode::LimitedQuirksMode; }
+    bool inNoQuirksMode() const { return m_compatibilityMode == DocumentCompatibilityMode::NoQuirksMode; }
</ins><span class="cx"> 
</span><span class="cx">     enum ReadyState {
</span><span class="cx">         Loading,
</span><span class="lines">@@ -1412,7 +1416,7 @@
</span><span class="cx"> 
</span><span class="cx">     bool m_ignoreAutofocus;
</span><span class="cx"> 
</span><del>-    CompatibilityMode m_compatibilityMode;
</del><ins>+    DocumentCompatibilityMode m_compatibilityMode;
</ins><span class="cx">     bool m_compatibilityModeLocked; // This is cheaper than making setCompatibilityMode virtual.
</span><span class="cx"> 
</span><span class="cx">     Color m_textColor;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlImageDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/ImageDocument.cpp (169477 => 169478)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/ImageDocument.cpp        2014-05-30 00:09:40 UTC (rev 169477)
+++ trunk/Source/WebCore/html/ImageDocument.cpp        2014-05-30 00:15:18 UTC (rev 169478)
</span><span class="lines">@@ -198,7 +198,7 @@
</span><span class="cx"> #endif
</span><span class="cx">     , m_shouldShrinkImage(frame.settings().shrinksStandaloneImagesToFit() &amp;&amp; frame.isMainFrame())
</span><span class="cx"> {
</span><del>-    setCompatibilityMode(QuirksMode);
</del><ins>+    setCompatibilityMode(DocumentCompatibilityMode::QuirksMode);
</ins><span class="cx">     lockCompatibilityMode();
</span><span class="cx"> }
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlMediaDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/MediaDocument.cpp (169477 => 169478)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/MediaDocument.cpp        2014-05-30 00:09:40 UTC (rev 169477)
+++ trunk/Source/WebCore/html/MediaDocument.cpp        2014-05-30 00:15:18 UTC (rev 169478)
</span><span class="lines">@@ -129,7 +129,7 @@
</span><span class="cx">     : HTMLDocument(frame, url, MediaDocumentClass)
</span><span class="cx">     , m_replaceMediaElementTimer(this, &amp;MediaDocument::replaceMediaElementTimerFired)
</span><span class="cx"> {
</span><del>-    setCompatibilityMode(QuirksMode);
</del><ins>+    setCompatibilityMode(DocumentCompatibilityMode::QuirksMode);
</ins><span class="cx">     lockCompatibilityMode();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlPluginDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/PluginDocument.cpp (169477 => 169478)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/PluginDocument.cpp        2014-05-30 00:09:40 UTC (rev 169477)
+++ trunk/Source/WebCore/html/PluginDocument.cpp        2014-05-30 00:15:18 UTC (rev 169478)
</span><span class="lines">@@ -144,7 +144,7 @@
</span><span class="cx">     : HTMLDocument(frame, url, PluginDocumentClass)
</span><span class="cx">     , m_shouldLoadPluginManually(true)
</span><span class="cx"> {
</span><del>-    setCompatibilityMode(QuirksMode);
</del><ins>+    setCompatibilityMode(DocumentCompatibilityMode::QuirksMode);
</ins><span class="cx">     lockCompatibilityMode();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlTextDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/TextDocument.cpp (169477 => 169478)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/TextDocument.cpp        2014-05-30 00:09:40 UTC (rev 169477)
+++ trunk/Source/WebCore/html/TextDocument.cpp        2014-05-30 00:15:18 UTC (rev 169478)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> TextDocument::TextDocument(Frame* frame, const URL&amp; url)
</span><span class="cx">     : HTMLDocument(frame, url, TextDocumentClass)
</span><span class="cx"> {
</span><del>-    setCompatibilityMode(QuirksMode);
</del><ins>+    setCompatibilityMode(DocumentCompatibilityMode::QuirksMode);
</ins><span class="cx">     lockCompatibilityMode();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlparserHTMLConstructionSitecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/parser/HTMLConstructionSite.cpp (169477 => 169478)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/parser/HTMLConstructionSite.cpp        2014-05-30 00:09:40 UTC (rev 169477)
+++ trunk/Source/WebCore/html/parser/HTMLConstructionSite.cpp        2014-05-30 00:15:18 UTC (rev 169478)
</span><span class="lines">@@ -293,12 +293,12 @@
</span><span class="cx">         return;
</span><span class="cx">     if (m_document-&gt;isSrcdocDocument())
</span><span class="cx">         return;
</span><del>-    setCompatibilityMode(Document::QuirksMode);
</del><ins>+    setCompatibilityMode(DocumentCompatibilityMode::QuirksMode);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void HTMLConstructionSite::setCompatibilityMode(Document::CompatibilityMode mode)
</del><ins>+void HTMLConstructionSite::setCompatibilityMode(DocumentCompatibilityMode mode)
</ins><span class="cx"> {
</span><del>-    m_inQuirksMode = (mode == Document::QuirksMode);
</del><ins>+    m_inQuirksMode = (mode == DocumentCompatibilityMode::QuirksMode);
</ins><span class="cx">     m_document-&gt;setCompatibilityMode(mode);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -373,7 +373,7 @@
</span><span class="cx">         || equalIgnoringCase(systemId, &quot;http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd&quot;)
</span><span class="cx">         || (systemId.isEmpty() &amp;&amp; publicId.startsWith(&quot;-//W3C//DTD HTML 4.01 Frameset//&quot;, false))
</span><span class="cx">         || (systemId.isEmpty() &amp;&amp; publicId.startsWith(&quot;-//W3C//DTD HTML 4.01 Transitional//&quot;, false))) {
</span><del>-        setCompatibilityMode(Document::QuirksMode);
</del><ins>+        setCompatibilityMode(DocumentCompatibilityMode::QuirksMode);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -382,12 +382,12 @@
</span><span class="cx">         || publicId.startsWith(&quot;-//W3C//DTD XHTML 1.0 Transitional//&quot;, false)
</span><span class="cx">         || (!systemId.isEmpty() &amp;&amp; publicId.startsWith(&quot;-//W3C//DTD HTML 4.01 Frameset//&quot;, false))
</span><span class="cx">         || (!systemId.isEmpty() &amp;&amp; publicId.startsWith(&quot;-//W3C//DTD HTML 4.01 Transitional//&quot;, false))) {
</span><del>-        setCompatibilityMode(Document::LimitedQuirksMode);
</del><ins>+        setCompatibilityMode(DocumentCompatibilityMode::LimitedQuirksMode);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Otherwise we are No Quirks Mode.
</span><del>-    setCompatibilityMode(Document::NoQuirksMode);
</del><ins>+    setCompatibilityMode(DocumentCompatibilityMode::NoQuirksMode);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void HTMLConstructionSite::finishedParsing()
</span><span class="lines">@@ -414,7 +414,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (token-&gt;forceQuirks())
</span><del>-        setCompatibilityMode(Document::QuirksMode);
</del><ins>+        setCompatibilityMode(DocumentCompatibilityMode::QuirksMode);
</ins><span class="cx">     else {
</span><span class="cx">         setCompatibilityModeFromDoctype(token-&gt;name(), publicId, systemId);
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlparserHTMLConstructionSiteh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/parser/HTMLConstructionSite.h (169477 => 169478)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/parser/HTMLConstructionSite.h        2014-05-30 00:09:40 UTC (rev 169477)
+++ trunk/Source/WebCore/html/parser/HTMLConstructionSite.h        2014-05-30 00:15:18 UTC (rev 169478)
</span><span class="lines">@@ -187,7 +187,7 @@
</span><span class="cx">     // tokens produce only one DOM mutation.
</span><span class="cx">     typedef Vector&lt;HTMLConstructionSiteTask, 1&gt; TaskQueue;
</span><span class="cx"> 
</span><del>-    void setCompatibilityMode(Document::CompatibilityMode);
</del><ins>+    void setCompatibilityMode(DocumentCompatibilityMode);
</ins><span class="cx">     void setCompatibilityModeFromDoctype(const String&amp; name, const String&amp; publicId, const String&amp; systemId);
</span><span class="cx"> 
</span><span class="cx">     void attachLater(ContainerNode* parent, PassRefPtr&lt;Node&gt; child, bool selfClosing = false);
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderDocumentWritercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/DocumentWriter.cpp (169477 => 169478)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/DocumentWriter.cpp        2014-05-30 00:09:40 UTC (rev 169477)
+++ trunk/Source/WebCore/loader/DocumentWriter.cpp        2014-05-30 00:15:18 UTC (rev 169478)
</span><span class="lines">@@ -77,7 +77,7 @@
</span><span class="cx">     if (!source.isNull()) {
</span><span class="cx">         if (!m_hasReceivedSomeData) {
</span><span class="cx">             m_hasReceivedSomeData = true;
</span><del>-            m_frame-&gt;document()-&gt;setCompatibilityMode(Document::NoQuirksMode);
</del><ins>+            m_frame-&gt;document()-&gt;setCompatibilityMode(DocumentCompatibilityMode::NoQuirksMode);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // FIXME: This should call DocumentParser::appendBytes instead of append
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderSinkDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/SinkDocument.cpp (169477 => 169478)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/SinkDocument.cpp        2014-05-30 00:09:40 UTC (rev 169477)
+++ trunk/Source/WebCore/loader/SinkDocument.cpp        2014-05-30 00:15:18 UTC (rev 169478)
</span><span class="lines">@@ -52,7 +52,7 @@
</span><span class="cx"> SinkDocument::SinkDocument(Frame* frame, const URL&amp; url)
</span><span class="cx">     : HTMLDocument(frame, url)
</span><span class="cx"> {
</span><del>-    setCompatibilityMode(QuirksMode);
</del><ins>+    setCompatibilityMode(DocumentCompatibilityMode::QuirksMode);
</ins><span class="cx">     lockCompatibilityMode();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepageiosFrameIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/ios/FrameIOS.mm (169477 => 169478)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/ios/FrameIOS.mm        2014-05-30 00:09:40 UTC (rev 169477)
+++ trunk/Source/WebCore/page/ios/FrameIOS.mm        2014-05-30 00:15:18 UTC (rev 169478)
</span><span class="lines">@@ -84,7 +84,7 @@
</span><span class="cx">     m_loader.initForSynthesizedDocument(url);
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;HTMLDocument&gt; document = HTMLDocument::createSynthesizedDocument(this, url);
</span><del>-    document-&gt;setCompatibilityMode(Document::LimitedQuirksMode);
</del><ins>+    document-&gt;setCompatibilityMode(DocumentCompatibilityMode::LimitedQuirksMode);
</ins><span class="cx">     document-&gt;createDOMWindow();
</span><span class="cx">     setDocument(document);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleRenderStyleh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/RenderStyle.h (169477 => 169478)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/RenderStyle.h        2014-05-30 00:09:40 UTC (rev 169477)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.h        2014-05-30 00:15:18 UTC (rev 169478)
</span><span class="lines">@@ -283,6 +283,8 @@
</span><span class="cx"> 
</span><span class="cx">         static ptrdiff_t flagsMemoryOffset() { return OBJECT_OFFSETOF(NonInheritedFlags, m_flags); }
</span><span class="cx">         static uint64_t flagIsUnique() { return oneBitMask &lt;&lt; isUniqueOffset; }
</span><ins>+        static uint64_t flagIsaffectedByActive() { return oneBitMask &lt;&lt; affectedByActiveOffset; }
+        static uint64_t flagIsaffectedByHover() { return oneBitMask &lt;&lt; affectedByHoverOffset; }
</ins><span class="cx">         static uint64_t setFirstChildStateFlags() { return flagFirstChildState() | flagIsUnique(); }
</span><span class="cx">         static uint64_t setLastChildStateFlags() { return flagLastChildState() | flagIsUnique(); }
</span><span class="cx">     private:
</span></span></pre>
</div>
</div>

</body>
</html>