15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2005 Frerich Raabe <raabe@kde.org> 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2009 Apple Inc. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 1402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathUtil.h" 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ContainerNode.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeTraversal.h" 32e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "wtf/text/StringBuilder.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace XPath { 3602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isRootDomNode(Node* node) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node && !node->parentNode(); 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String stringValue(Node* node) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (node->nodeType()) { 455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) case Node::ATTRIBUTE_NODE: 465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) case Node::PROCESSING_INSTRUCTION_NODE: 475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) case Node::COMMENT_NODE: 485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) case Node::TEXT_NODE: 495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) case Node::CDATA_SECTION_NODE: 505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return node->nodeValue(); 515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) default: 525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (isRootDomNode(node) || node->isElementNode()) { 535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) StringBuilder result; 545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) result.reserveCapacity(1024); 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) for (Node* n = node->firstChild(); n; n = NodeTraversal::next(*n, node)) { 575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (n->isTextNode()) { 585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) const String& nodeValue = n->nodeValue(); 595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) result.append(nodeValue); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return result.toString(); 645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return String(); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isValidContextNode(Node* node) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (node->nodeType()) { 755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) case Node::ATTRIBUTE_NODE: 765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) case Node::CDATA_SECTION_NODE: 775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) case Node::COMMENT_NODE: 785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) case Node::DOCUMENT_NODE: 795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) case Node::ELEMENT_NODE: 805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) case Node::PROCESSING_INSTRUCTION_NODE: 815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return true; 825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) case Node::DOCUMENT_FRAGMENT_NODE: 835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) case Node::DOCUMENT_TYPE_NODE: 845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return false; 855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) case Node::TEXT_NODE: 865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return !(node->parentNode() && node->parentNode()->isAttributeNode()); 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 94