summaryrefslogtreecommitdiff
path: root/Source/WebCore/dom/SelectorQuery.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/dom/SelectorQuery.h')
-rw-r--r--Source/WebCore/dom/SelectorQuery.h86
1 files changed, 58 insertions, 28 deletions
diff --git a/Source/WebCore/dom/SelectorQuery.h b/Source/WebCore/dom/SelectorQuery.h
index aab4276dd..5e3cc1f5c 100644
--- a/Source/WebCore/dom/SelectorQuery.h
+++ b/Source/WebCore/dom/SelectorQuery.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011, 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2011, 2013, 2014 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -23,60 +23,89 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef SelectorQuery_h
-#define SelectorQuery_h
+#pragma once
#include "CSSSelectorList.h"
+#include "ExceptionOr.h"
#include "NodeList.h"
#include "SelectorCompiler.h"
#include <wtf/HashMap.h>
#include <wtf/Vector.h>
#include <wtf/text/AtomicStringHash.h>
+#include <wtf/text/CString.h>
namespace WebCore {
-typedef int ExceptionCode;
-
class CSSSelector;
class ContainerNode;
class Document;
class Element;
-class Node;
-class NodeList;
class SelectorDataList {
public:
- void initialize(const CSSSelectorList&);
+ explicit SelectorDataList(const CSSSelectorList&);
bool matches(Element&) const;
- RefPtr<NodeList> queryAll(ContainerNode& rootNode) const;
+ Element* closest(Element&) const;
+ Ref<NodeList> queryAll(ContainerNode& rootNode) const;
Element* queryFirst(ContainerNode& rootNode) const;
private:
struct SelectorData {
- SelectorData(const CSSSelector* selector, bool isFastCheckable) : selector(selector), isFastCheckable(isFastCheckable) { }
- const CSSSelector* selector;
- bool isFastCheckable;
+ SelectorData(const CSSSelector* selector)
+ : selector(selector)
+#if ENABLE(CSS_SELECTOR_JIT) && CSS_SELECTOR_JIT_PROFILING
+ , m_compiledSelectorUseCount(0)
+#endif
+ {
+ }
+ const CSSSelector* selector;
#if ENABLE(CSS_SELECTOR_JIT)
- mutable SelectorCompilationStatus compilationStatus;
mutable JSC::MacroAssemblerCodeRef compiledSelectorCodeRef;
+ mutable SelectorCompilationStatus compilationStatus;
+#if CSS_SELECTOR_JIT_PROFILING
+ ~SelectorData()
+ {
+ if (compiledSelectorCodeRef.code().executableAddress())
+ dataLogF("SelectorData compiled selector %d \"%s\"\n", m_compiledSelectorUseCount, selector->selectorText().utf8().data());
+ }
+ mutable unsigned m_compiledSelectorUseCount;
+ void compiledSelectorUsed() const { m_compiledSelectorUseCount++; }
+#endif
#endif // ENABLE(CSS_SELECTOR_JIT)
};
bool selectorMatches(const SelectorData&, Element&, const ContainerNode& rootNode) const;
+ Element* selectorClosest(const SelectorData&, Element&, const ContainerNode& rootNode) const;
template <typename SelectorQueryTrait> void execute(ContainerNode& rootNode, typename SelectorQueryTrait::OutputType&) const;
template <typename SelectorQueryTrait> void executeFastPathForIdSelector(const ContainerNode& rootNode, const SelectorData&, const CSSSelector* idSelector, typename SelectorQueryTrait::OutputType&) const;
template <typename SelectorQueryTrait> void executeSingleTagNameSelectorData(const ContainerNode& rootNode, const SelectorData&, typename SelectorQueryTrait::OutputType&) const;
template <typename SelectorQueryTrait> void executeSingleClassNameSelectorData(const ContainerNode& rootNode, const SelectorData&, typename SelectorQueryTrait::OutputType&) const;
- template <typename SelectorQueryTrait> void executeSingleSelectorData(const ContainerNode& rootNode, const SelectorData&, typename SelectorQueryTrait::OutputType&) const;
+ template <typename SelectorQueryTrait> void executeSingleSelectorData(const ContainerNode& rootNode, const ContainerNode& searchRootNode, const SelectorData&, typename SelectorQueryTrait::OutputType&) const;
template <typename SelectorQueryTrait> void executeSingleMultiSelectorData(const ContainerNode& rootNode, typename SelectorQueryTrait::OutputType&) const;
#if ENABLE(CSS_SELECTOR_JIT)
- template <typename SelectorQueryTrait> void executeCompiledSimpleSelectorChecker(const ContainerNode& rootNode, SelectorCompiler::SimpleSelectorChecker, typename SelectorQueryTrait::OutputType&) const;
- template <typename SelectorQueryTrait> void executeCompiledSelectorCheckerWithContext(const ContainerNode& rootNode, SelectorCompiler::SelectorCheckerWithCheckingContext, const SelectorCompiler::CheckingContext&, typename SelectorQueryTrait::OutputType&) const;
+ template <typename SelectorQueryTrait> void executeCompiledSimpleSelectorChecker(const ContainerNode& searchRootNode, SelectorCompiler::QuerySelectorSimpleSelectorChecker, typename SelectorQueryTrait::OutputType&, const SelectorData&) const;
+ template <typename SelectorQueryTrait> void executeCompiledSelectorCheckerWithCheckingContext(const ContainerNode& rootNode, const ContainerNode& searchRootNode, SelectorCompiler::QuerySelectorSelectorCheckerWithCheckingContext, typename SelectorQueryTrait::OutputType&, const SelectorData&) const;
+ template <typename SelectorQueryTrait> void executeCompiledSingleMultiSelectorData(const ContainerNode& rootNode, typename SelectorQueryTrait::OutputType&) const;
+ static bool compileSelector(const SelectorData&, const ContainerNode& rootNode);
#endif // ENABLE(CSS_SELECTOR_JIT)
Vector<SelectorData> m_selectors;
+ mutable enum MatchType {
+ CompilableSingle,
+ CompilableSingleWithRootFilter,
+ CompilableMultipleSelectorMatch,
+ CompiledSingle,
+ CompiledSingleWithRootFilter,
+ CompiledMultipleSelectorMatch,
+ SingleSelector,
+ SingleSelectorWithRootFilter,
+ RightMostWithIdMatch,
+ TagNameMatch,
+ ClassNameMatch,
+ MultipleSelectorMatch,
+ } m_matchType;
};
class SelectorQuery {
@@ -84,25 +113,23 @@ class SelectorQuery {
WTF_MAKE_FAST_ALLOCATED;
public:
- explicit SelectorQuery(const CSSSelectorList&);
+ explicit SelectorQuery(CSSSelectorList&&);
bool matches(Element&) const;
- RefPtr<NodeList> queryAll(ContainerNode& rootNode) const;
+ Element* closest(Element&) const;
+ Ref<NodeList> queryAll(ContainerNode& rootNode) const;
Element* queryFirst(ContainerNode& rootNode) const;
private:
- SelectorDataList m_selectors;
CSSSelectorList m_selectorList;
+ SelectorDataList m_selectors;
};
class SelectorQueryCache {
WTF_MAKE_FAST_ALLOCATED;
-
public:
- SelectorQuery* add(const AtomicString&, Document&, ExceptionCode&);
- void invalidate();
-
+ ExceptionOr<SelectorQuery&> add(const String&, Document&);
private:
- HashMap<AtomicString, std::unique_ptr<SelectorQuery>> m_entries;
+ HashMap<String, std::unique_ptr<SelectorQuery>> m_entries;
};
inline bool SelectorQuery::matches(Element& element) const
@@ -110,7 +137,12 @@ inline bool SelectorQuery::matches(Element& element) const
return m_selectors.matches(element);
}
-inline RefPtr<NodeList> SelectorQuery::queryAll(ContainerNode& rootNode) const
+inline Element* SelectorQuery::closest(Element& element) const
+{
+ return m_selectors.closest(element);
+}
+
+inline Ref<NodeList> SelectorQuery::queryAll(ContainerNode& rootNode) const
{
return m_selectors.queryAll(rootNode);
}
@@ -120,6 +152,4 @@ inline Element* SelectorQuery::queryFirst(ContainerNode& rootNode) const
return m_selectors.queryFirst(rootNode);
}
-}
-
-#endif
+} // namespace WebCore