1// Copyright (c) 2008, Google Inc. 2// All rights reserved. 3// 4// Redistribution and use in source and binary forms, with or without 5// modification, are permitted provided that the following conditions are 6// met: 7// 8// * Redistributions of source code must retain the above copyright 9// notice, this list of conditions and the following disclaimer. 10// * Redistributions in binary form must reproduce the above 11// copyright notice, this list of conditions and the following disclaimer 12// in the documentation and/or other materials provided with the 13// distribution. 14// * Neither the name of Google Inc. nor the names of its 15// contributors may be used to endorse or promote products derived from 16// this software without specific prior written permission. 17// 18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 30#include "config.h" 31#include "bindings/v8/custom/V8CustomXPathNSResolver.h" 32 33#include "bindings/v8/ScriptController.h" 34#include "bindings/v8/V8Binding.h" 35#include "bindings/v8/V8Utilities.h" 36#include "core/dom/ExecutionContext.h" 37#include "core/inspector/ScriptCallStack.h" 38#include "core/frame/DOMWindow.h" 39#include "core/frame/Frame.h" 40#include "core/page/Page.h" 41#include "core/page/PageConsole.h" 42#include "wtf/text/WTFString.h" 43 44namespace WebCore { 45 46PassRefPtr<V8CustomXPathNSResolver> V8CustomXPathNSResolver::create(v8::Handle<v8::Object> resolver, v8::Isolate* isolate) 47{ 48 return adoptRef(new V8CustomXPathNSResolver(resolver, isolate)); 49} 50 51V8CustomXPathNSResolver::V8CustomXPathNSResolver(v8::Handle<v8::Object> resolver, v8::Isolate* isolate) 52 : m_resolver(resolver) 53 , m_isolate(isolate) 54{ 55} 56 57V8CustomXPathNSResolver::~V8CustomXPathNSResolver() 58{ 59} 60 61AtomicString V8CustomXPathNSResolver::lookupNamespaceURI(const String& prefix) 62{ 63 v8::Handle<v8::Function> lookupNamespaceURIFunc; 64 v8::Handle<v8::String> lookupNamespaceURIName = v8AtomicString(m_isolate, "lookupNamespaceURI"); 65 66 // Check if the resolver has a function property named lookupNamespaceURI. 67 if (m_resolver->Has(lookupNamespaceURIName)) { 68 v8::Handle<v8::Value> lookupNamespaceURI = m_resolver->Get(lookupNamespaceURIName); 69 if (lookupNamespaceURI->IsFunction()) 70 lookupNamespaceURIFunc = v8::Handle<v8::Function>::Cast(lookupNamespaceURI); 71 } 72 73 if (lookupNamespaceURIFunc.IsEmpty() && !m_resolver->IsFunction()) { 74 Frame* frame = activeDOMWindow()->frame(); 75 if (frame && frame->page()) 76 frame->page()->console().addMessage(JSMessageSource, ErrorMessageLevel, "XPathNSResolver does not have a lookupNamespaceURI method."); 77 return nullAtom; 78 } 79 80 // Catch exceptions from calling the namespace resolver. 81 v8::TryCatch tryCatch; 82 tryCatch.SetVerbose(true); // Print exceptions to console. 83 84 const int argc = 1; 85 v8::Handle<v8::Value> argv[argc] = { v8String(m_isolate, prefix) }; 86 v8::Handle<v8::Function> function = lookupNamespaceURIFunc.IsEmpty() ? v8::Handle<v8::Function>::Cast(m_resolver) : lookupNamespaceURIFunc; 87 88 v8::Handle<v8::Value> retval = ScriptController::callFunction(activeExecutionContext(), function, m_resolver, argc, argv, m_isolate); 89 90 // Eat exceptions from namespace resolver and return an empty string. This will most likely cause NamespaceError. 91 if (tryCatch.HasCaught()) 92 return nullAtom; 93 94 V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<WithNullCheck>, returnString, retval, nullAtom); 95 return returnString; 96} 97 98} // namespace WebCore 99