SelectorQuery* SelectorQueryCache::add(const AtomicString& selectors, Document* document, ExceptionCode& ec) { HashMap<AtomicString, OwnPtr<SelectorQuery> >::iterator it = m_entries.find(selectors); if (it != m_entries.end()) return it->value.get(); CSSParser parser(document); CSSSelectorList selectorList; parser.parseSelector(selectors, selectorList); if (!selectorList.first() || selectorList.hasInvalidSelector()) { ec = SYNTAX_ERR; return 0; } // throw a NAMESPACE_ERR if the selector includes any namespace prefixes. if (selectorList.selectorsNeedNamespaceResolution()) { ec = NAMESPACE_ERR; return 0; } const int maximumSelectorQueryCacheSize = 256; if (m_entries.size() == maximumSelectorQueryCacheSize) m_entries.remove(m_entries.begin()); OwnPtr<SelectorQuery> selectorQuery = adoptPtr(new SelectorQuery(selectorList)); SelectorQuery* rawSelectorQuery = selectorQuery.get(); m_entries.add(selectors, selectorQuery.release()); return rawSelectorQuery; }
SelectorQuery* SelectorQueryCache::add(const String& selectors, Document& document, ExceptionCode& ec) { auto it = m_entries.find(selectors); if (it != m_entries.end()) return it->value.get(); CSSParser parser(document); CSSSelectorList selectorList; parser.parseSelector(selectors, selectorList); if (!selectorList.first() || selectorList.hasInvalidSelector()) { ec = SYNTAX_ERR; return nullptr; } // Throw a NAMESPACE_ERR if the selector includes any namespace prefixes. if (selectorList.selectorsNeedNamespaceResolution()) { ec = NAMESPACE_ERR; return nullptr; } const int maximumSelectorQueryCacheSize = 256; if (m_entries.size() == maximumSelectorQueryCacheSize) m_entries.remove(m_entries.begin()); return m_entries.add(selectors, std::make_unique<SelectorQuery>(std::move(selectorList))).iterator->value.get(); }