diff options
Diffstat (limited to 'Source/WebCore/inspector/InspectorNodeFinder.cpp')
-rw-r--r-- | Source/WebCore/inspector/InspectorNodeFinder.cpp | 85 |
1 files changed, 41 insertions, 44 deletions
diff --git a/Source/WebCore/inspector/InspectorNodeFinder.cpp b/Source/WebCore/inspector/InspectorNodeFinder.cpp index 34bea3723..59583a902 100644 --- a/Source/WebCore/inspector/InspectorNodeFinder.cpp +++ b/Source/WebCore/inspector/InspectorNodeFinder.cpp @@ -13,7 +13,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * 3. Neither the name of Apple Inc. ("Apple") nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * @@ -33,17 +33,17 @@ #include "InspectorNodeFinder.h" #include "Attr.h" -#include "Attribute.h" #include "Document.h" #include "Element.h" #include "HTMLFrameOwnerElement.h" #include "NodeList.h" #include "NodeTraversal.h" +#include "XPathNSResolver.h" #include "XPathResult.h" namespace WebCore { -static String stripCharacters(String string, const char startCharacter, const char endCharacter, bool& startCharFound, bool& endCharFound) +static String stripCharacters(const String& string, const char startCharacter, const char endCharacter, bool& startCharFound, bool& endCharFound) { startCharFound = string.startsWith(startCharacter); endCharFound = string.endsWith(endCharacter); @@ -53,7 +53,7 @@ static String stripCharacters(String string, const char startCharacter, const ch return string.substring(start, end - start); } -InspectorNodeFinder::InspectorNodeFinder(String whitespaceTrimmedQuery) +InspectorNodeFinder::InspectorNodeFinder(const String& whitespaceTrimmedQuery) : m_whitespaceTrimmedQuery(whitespaceTrimmedQuery) { m_tagNameQuery = stripCharacters(whitespaceTrimmedQuery, '<', '>', m_startTagFound, m_endTagFound); @@ -65,38 +65,33 @@ InspectorNodeFinder::InspectorNodeFinder(String whitespaceTrimmedQuery) void InspectorNodeFinder::performSearch(Node* parentNode) { - searchUsingXPath(parentNode); - searchUsingCSSSelectors(parentNode); + if (!parentNode) + return; + + searchUsingXPath(*parentNode); + searchUsingCSSSelectors(*parentNode); // Keep the DOM tree traversal last. This way iframe content will come after their parents. - searchUsingDOMTreeTraversal(parentNode); + searchUsingDOMTreeTraversal(*parentNode); } -void InspectorNodeFinder::searchUsingDOMTreeTraversal(Node* parentNode) +void InspectorNodeFinder::searchUsingDOMTreeTraversal(Node& parentNode) { // Manual plain text search. - for (auto node = parentNode; node; node = NodeTraversal::next(node, parentNode)) { + for (auto* node = &parentNode; node; node = NodeTraversal::next(*node, &parentNode)) { switch (node->nodeType()) { case Node::TEXT_NODE: case Node::COMMENT_NODE: - case Node::CDATA_SECTION_NODE: { - if (node->nodeValue().findIgnoringCase(m_whitespaceTrimmedQuery) != notFound) + case Node::CDATA_SECTION_NODE: + if (node->nodeValue().containsIgnoringASCIICase(m_whitespaceTrimmedQuery)) m_results.add(node); break; - } - case Node::ELEMENT_NODE: { - if (matchesElement(*toElement(node))) + case Node::ELEMENT_NODE: + if (matchesElement(downcast<Element>(*node))) m_results.add(node); - - // Search inside frame elements. - if (node->isFrameOwnerElement()) { - HTMLFrameOwnerElement* frameOwner = toHTMLFrameOwnerElement(node); - if (Document* document = frameOwner->contentDocument()) - performSearch(document); - } - + if (is<HTMLFrameOwnerElement>(downcast<Element>(*node))) + performSearch(downcast<HTMLFrameOwnerElement>(*node).contentDocument()); break; - } default: break; } @@ -105,16 +100,16 @@ void InspectorNodeFinder::searchUsingDOMTreeTraversal(Node* parentNode) bool InspectorNodeFinder::matchesAttribute(const Attribute& attribute) { - if (attribute.localName().find(m_whitespaceTrimmedQuery) != notFound) + if (attribute.localName().string().containsIgnoringASCIICase(m_whitespaceTrimmedQuery)) return true; - return m_exactAttributeMatch ? attribute.value() == m_attributeQuery : attribute.value().find(m_attributeQuery) != notFound; + return m_exactAttributeMatch ? attribute.value() == m_attributeQuery : attribute.value().string().containsIgnoringASCIICase(m_attributeQuery); } bool InspectorNodeFinder::matchesElement(const Element& element) { String nodeName = element.nodeName(); - if ((!m_startTagFound && !m_endTagFound && (nodeName.findIgnoringCase(m_tagNameQuery) != notFound)) - || (m_startTagFound && m_endTagFound && equalIgnoringCase(nodeName, m_tagNameQuery)) + if ((!m_startTagFound && !m_endTagFound && nodeName.containsIgnoringASCIICase(m_tagNameQuery)) + || (m_startTagFound && m_endTagFound && equalIgnoringASCIICase(nodeName, m_tagNameQuery)) || (m_startTagFound && !m_endTagFound && nodeName.startsWith(m_tagNameQuery, false)) || (!m_startTagFound && m_endTagFound && nodeName.endsWith(m_tagNameQuery, false))) return true; @@ -130,41 +125,43 @@ bool InspectorNodeFinder::matchesElement(const Element& element) return false; } -void InspectorNodeFinder::searchUsingXPath(Node* parentNode) +void InspectorNodeFinder::searchUsingXPath(Node& parentNode) { - ExceptionCode ec = 0; - RefPtr<XPathResult> result = parentNode->document().evaluate(m_whitespaceTrimmedQuery, parentNode, nullptr, XPathResult::ORDERED_NODE_SNAPSHOT_TYPE, nullptr, ec); - if (ec || !result) + auto evaluateResult = parentNode.document().evaluate(m_whitespaceTrimmedQuery, &parentNode, nullptr, XPathResult::ORDERED_NODE_SNAPSHOT_TYPE, nullptr); + if (evaluateResult.hasException()) return; + auto result = evaluateResult.releaseReturnValue(); - unsigned long size = result->snapshotLength(ec); - if (ec) + auto snapshotLengthResult = result->snapshotLength(); + if (snapshotLengthResult.hasException()) return; + unsigned size = snapshotLengthResult.releaseReturnValue(); - for (unsigned long i = 0; i < size; ++i) { - Node* node = result->snapshotItem(i, ec); - if (ec) + for (unsigned i = 0; i < size; ++i) { + auto snapshotItemResult = result->snapshotItem(i); + if (snapshotItemResult.hasException()) return; + Node* node = snapshotItemResult.releaseReturnValue(); - if (node->isAttributeNode()) - node = toAttr(node)->ownerElement(); + if (is<Attr>(*node)) + node = downcast<Attr>(*node).ownerElement(); // XPath can get out of the context node that we pass as the starting point to evaluate, so we need to filter for just the nodes we care about. - if (node == parentNode || node->isDescendantOf(parentNode)) + if (parentNode.contains(node)) m_results.add(node); } } -void InspectorNodeFinder::searchUsingCSSSelectors(Node* parentNode) +void InspectorNodeFinder::searchUsingCSSSelectors(Node& parentNode) { - if (!parentNode->isContainerNode()) + if (!is<ContainerNode>(parentNode)) return; - ExceptionCode ec = 0; - RefPtr<NodeList> nodeList = toContainerNode(parentNode)->querySelectorAll(m_whitespaceTrimmedQuery, ec); - if (ec || !nodeList) + auto queryResult = downcast<ContainerNode>(parentNode).querySelectorAll(m_whitespaceTrimmedQuery); + if (queryResult.hasException()) return; + auto nodeList = queryResult.releaseReturnValue(); unsigned size = nodeList->length(); for (unsigned i = 0; i < size; ++i) m_results.add(nodeList->item(i)); |