Title: [167574] trunk/Source/WebCore
Revision
167574
Author
[email protected]
Date
2014-04-20 14:28:51 -0700 (Sun, 20 Apr 2014)

Log Message

Compile the pseudo class :target
https://bugs.webkit.org/show_bug.cgi?id=131904

Reviewed by Andreas Kling.

The pseudo class :target is trivial, it just compare the current element with
Document::cssTarget().

* cssjit/SelectorCompiler.cpp:
(WebCore::SelectorCompiler::addPseudoType):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementMatching):
(WebCore::SelectorCompiler::getDocument):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementAttributeValueExactMatching):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsTarget):
* dom/Document.h:
(WebCore::Document::cssTargetMemoryOffset):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (167573 => 167574)


--- trunk/Source/WebCore/ChangeLog	2014-04-20 20:54:17 UTC (rev 167573)
+++ trunk/Source/WebCore/ChangeLog	2014-04-20 21:28:51 UTC (rev 167574)
@@ -1,5 +1,24 @@
 2014-04-20  Benjamin Poulain  <[email protected]>
 
+        Compile the pseudo class :target
+        https://bugs.webkit.org/show_bug.cgi?id=131904
+
+        Reviewed by Andreas Kling.
+
+        The pseudo class :target is trivial, it just compare the current element with
+        Document::cssTarget().
+
+        * cssjit/SelectorCompiler.cpp:
+        (WebCore::SelectorCompiler::addPseudoType):
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementMatching):
+        (WebCore::SelectorCompiler::getDocument):
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementAttributeValueExactMatching):
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsTarget):
+        * dom/Document.h:
+        (WebCore::Document::cssTargetMemoryOffset):
+
+2014-04-20  Benjamin Poulain  <[email protected]>
+
         Rename the CSSSelector PseudoType to PseudoClassType
         https://bugs.webkit.org/show_bug.cgi?id=131907
 

Modified: trunk/Source/WebCore/cssjit/SelectorCompiler.cpp (167573 => 167574)


--- trunk/Source/WebCore/cssjit/SelectorCompiler.cpp	2014-04-20 20:54:17 UTC (rev 167573)
+++ trunk/Source/WebCore/cssjit/SelectorCompiler.cpp	2014-04-20 21:28:51 UTC (rev 167574)
@@ -190,6 +190,7 @@
     void generateElementHasClasses(Assembler::JumpList& failureCases, const LocalRegister& elementDataAddress, const Vector<const AtomicStringImpl*>& classNames);
     void generateElementIsLink(Assembler::JumpList& failureCases);
     void generateElementIsNthChild(Assembler::JumpList& failureCases, const SelectorFragment&);
+    void generateElementIsTarget(Assembler::JumpList& failureCases);
 
     // Helpers.
     Assembler::Jump jumpIfNotResolvingStyle(Assembler::RegisterID checkingContextRegister);
@@ -318,6 +319,7 @@
         return FunctionType::SimpleSelectorChecker;
 
     case CSSSelector::PseudoClassLink:
+    case CSSSelector::PseudoClassTarget:
         fragment.pseudoClasses.add(type);
         return FunctionType::SimpleSelectorChecker;
 
@@ -1166,6 +1168,9 @@
     if (fragment.pseudoClasses.contains(CSSSelector::PseudoClassLink))
         generateElementIsLink(failureCases);
 
+    if (fragment.pseudoClasses.contains(CSSSelector::PseudoTarget))
+        generateElementIsTarget(failureCases);
+
     if (fragment.tagName)
         generateElementHasTagName(failureCases, *(fragment.tagName));
 
@@ -1512,6 +1517,12 @@
     return assembler.branchTest32(condition, Assembler::Address(documentAddress, Document::documentClassesMemoryOffset()), Assembler::TrustedImm32(Document::isHTMLDocumentClassFlag()));
 }
 
+static void getDocument(Assembler& 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::generateElementAttributeValueExactMatching(Assembler::JumpList& failureCases, Assembler::RegisterID currentAttributeAddress, const AtomicString& expectedValue, bool canDefaultToCaseSensitiveValueMatch)
 {
     LocalRegister expectedValueRegister(m_registerAllocator);
@@ -1528,12 +1539,9 @@
         failureCases.append(testIsHTMLFlagOnNode(Assembler::Zero, m_assembler, elementAddressRegister));
 
         {
-            LocalRegister scratchRegister(m_registerAllocator);
-            // scratchRegister = pointer to treeScope.
-            m_assembler.loadPtr(Assembler::Address(elementAddressRegister, Node::treeScopeMemoryOffset()), scratchRegister);
-            // scratchRegister = pointer to document.
-            m_assembler.loadPtr(Assembler::Address(scratchRegister, TreeScope::documentScopeMemoryOffset()), scratchRegister);
-            failureCases.append(testIsHTMLClassOnDocument(Assembler::Zero, m_assembler, scratchRegister));
+            LocalRegister document(m_registerAllocator);
+            getDocument(m_assembler, elementAddressRegister, document);
+            failureCases.append(testIsHTMLClassOnDocument(Assembler::Zero, m_assembler, document));
         }
 
         LocalRegister valueStringImpl(m_registerAllocator);
@@ -2035,6 +2043,13 @@
     }
 }
 
+void SelectorCodeGenerator::generateElementIsTarget(Assembler::JumpList& failureCases)
+{
+    LocalRegister document(m_registerAllocator);
+    getDocument(m_assembler, elementAddressRegister, document);
+    failureCases.append(m_assembler.branchPtr(Assembler::NotEqual, Assembler::Address(document, Document::cssTargetMemoryOffset()), elementAddressRegister));
+}
+
 }; // namespace SelectorCompiler.
 }; // namespace WebCore.
 

Modified: trunk/Source/WebCore/dom/Document.h (167573 => 167574)


--- trunk/Source/WebCore/dom/Document.h	2014-04-20 20:54:17 UTC (rev 167573)
+++ trunk/Source/WebCore/dom/Document.h	2014-04-20 21:28:51 UTC (rev 167574)
@@ -755,7 +755,8 @@
     // Updates for :target (CSS3 selector).
     void setCSSTarget(Element*);
     Element* cssTarget() const { return m_cssTarget; }
-    
+    static ptrdiff_t cssTargetMemoryOffset() { return OBJECT_OFFSETOF(Document, m_cssTarget); }
+
     void scheduleForcedStyleRecalc();
     void scheduleStyleRecalc();
     void unscheduleStyleRecalc();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to