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();