1e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch/*
2e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2013 Google, Inc.
3e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *
4e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Redistribution and use in source and binary forms, with or without
5e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * modification, are permitted provided that the following conditions
6e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * are met:
7e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * 1. Redistributions of source code must retain the above copyright
8e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *    notice, this list of conditions and the following disclaimer.
9e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
10e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
11e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *    documentation and/or other materials provided with the distribution.
12e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch *
13e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch */
25e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
26e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "config.h"
27e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/xml/DocumentXPathEvaluator.h"
28e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
30e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/xml/XPathExpression.h"
31e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/xml/XPathResult.h"
32e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
34e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
35e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochDocumentXPathEvaluator::DocumentXPathEvaluator()
36e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
37e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
38e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)DocumentXPathEvaluator& DocumentXPathEvaluator::from(DocumentSupplementable& document)
40e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    DocumentXPathEvaluator* cache = static_cast<DocumentXPathEvaluator*>(DocumentSupplement::from(document, supplementName()));
42e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (!cache) {
43e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        cache = new DocumentXPathEvaluator();
44f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        DocumentSupplement::provideTo(document, supplementName(), adoptPtrWillBeNoop(cache));
45e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
46d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return *cache;
47e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
48e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
49d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassRefPtrWillBeRawPtr<XPathExpression> DocumentXPathEvaluator::createExpression(DocumentSupplementable& document,
50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const String& expression, PassRefPtrWillBeRawPtr<XPathNSResolver> resolver, ExceptionState& exceptionState)
51e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
52d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    DocumentXPathEvaluator& suplement = from(document);
53d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!suplement.m_xpathEvaluator)
54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        suplement.m_xpathEvaluator = XPathEvaluator::create();
55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return suplement.m_xpathEvaluator->createExpression(expression, resolver, exceptionState);
56e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
57e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassRefPtrWillBeRawPtr<XPathNSResolver> DocumentXPathEvaluator::createNSResolver(DocumentSupplementable& document, Node* nodeResolver)
59e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    DocumentXPathEvaluator& suplement = from(document);
61d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!suplement.m_xpathEvaluator)
62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        suplement.m_xpathEvaluator = XPathEvaluator::create();
63d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return suplement.m_xpathEvaluator->createNSResolver(nodeResolver);
64e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
65e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
66d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassRefPtrWillBeRawPtr<XPathResult> DocumentXPathEvaluator::evaluate(DocumentSupplementable& document, const String& expression,
67d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Node* contextNode, PassRefPtrWillBeRawPtr<XPathNSResolver> resolver, unsigned short type,
6851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    XPathResult* result, ExceptionState& exceptionState)
69e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
70d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    DocumentXPathEvaluator& suplement = from(document);
71d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!suplement.m_xpathEvaluator)
72d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        suplement.m_xpathEvaluator = XPathEvaluator::create();
73d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return suplement.m_xpathEvaluator->evaluate(expression, contextNode, resolver, type, result, exceptionState);
74e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
75e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
76f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid DocumentXPathEvaluator::trace(Visitor* visitor)
77f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
78f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    visitor->trace(m_xpathEvaluator);
79323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    DocumentSupplement::trace(visitor);
80f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
81f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
82c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
83