07d22df6f6bad534a3df09bbe14f4fd221208428
[WebKit-https.git] / Source / WebCore / bindings / js / JSCustomXPathNSResolver.cpp
1 /*
2  * Copyright (C) 2007, 2013 Alexey Proskuryakov (ap@nypop.com)
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "JSCustomXPathNSResolver.h"
28
29 #include "Document.h"
30 #include "ExceptionCode.h"
31 #include "Frame.h"
32 #include "JSDOMWindowCustom.h"
33 #include "JSMainThreadExecState.h"
34 #include "Page.h"
35 #include "PageConsoleClient.h"
36 #include "SecurityOrigin.h"
37 #include <profiler/Profile.h>
38 #include <runtime/JSLock.h>
39 #include <wtf/Ref.h>
40
41 namespace WebCore {
42
43 using namespace JSC;
44
45 RefPtr<JSCustomXPathNSResolver> JSCustomXPathNSResolver::create(ExecState* exec, JSValue value)
46 {
47     if (value.isUndefinedOrNull())
48         return nullptr;
49
50     JSObject* resolverObject = value.getObject();
51     if (!resolverObject) {
52         setDOMException(exec, TYPE_MISMATCH_ERR);
53         return nullptr;
54     }
55
56     return adoptRef(*new JSCustomXPathNSResolver(exec, resolverObject, asJSDOMWindow(exec->vmEntryGlobalObject())));
57 }
58
59 JSCustomXPathNSResolver::JSCustomXPathNSResolver(ExecState* exec, JSObject* customResolver, JSDOMWindow* globalObject)
60     : m_customResolver(exec->vm(), customResolver)
61     , m_globalObject(exec->vm(), globalObject)
62 {
63 }
64
65 JSCustomXPathNSResolver::~JSCustomXPathNSResolver()
66 {
67 }
68
69 String JSCustomXPathNSResolver::lookupNamespaceURI(const String& prefix)
70 {
71     ASSERT(m_customResolver);
72
73     JSLockHolder lock(JSDOMWindowBase::commonVM());
74
75     ExecState* exec = m_globalObject->globalExec();
76         
77     JSValue function = m_customResolver->get(exec, Identifier::fromString(exec, "lookupNamespaceURI"));
78     CallData callData;
79     CallType callType = getCallData(function, callData);
80     if (callType == CallTypeNone) {
81         callType = m_customResolver->methodTable()->getCallData(m_customResolver.get(), callData);
82         if (callType == CallTypeNone) {
83             // FIXME: <http://webkit.org/b/114312> JSCustomXPathNSResolver::lookupNamespaceURI Console Message should include Line, Column, and SourceURL
84             if (PageConsoleClient* console = m_globalObject->impl().console())
85                 console->addMessage(MessageSource::JS, MessageLevel::Error, ASCIILiteral("XPathNSResolver does not have a lookupNamespaceURI method."));
86             return String();
87         }
88         function = m_customResolver.get();
89     }
90
91     Ref<JSCustomXPathNSResolver> selfProtector(*this);
92
93     MarkedArgumentBuffer args;
94     args.append(jsStringWithCache(exec, prefix));
95
96     JSValue exception;
97     JSValue retval = JSMainThreadExecState::call(exec, function, callType, callData, m_customResolver.get(), args, &exception);
98
99     String result;
100     if (exception)
101         reportException(exec, exception);
102     else {
103         if (!retval.isUndefinedOrNull())
104             result = retval.toString(exec)->value(exec);
105     }
106
107     return result;
108 }
109
110 } // namespace WebCore