diff options
Diffstat (limited to 'Source/WebCore/bindings/v8/V8Binding.h')
-rw-r--r-- | Source/WebCore/bindings/v8/V8Binding.h | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/Source/WebCore/bindings/v8/V8Binding.h b/Source/WebCore/bindings/v8/V8Binding.h new file mode 100644 index 0000000..b2d5daa --- /dev/null +++ b/Source/WebCore/bindings/v8/V8Binding.h @@ -0,0 +1,305 @@ +/* +* Copyright (C) 2009 Google Inc. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are +* met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * 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. +* * Neither the name of Google Inc. nor the names of its +* contributors may be used to endorse or promote products derived from +* this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef V8Binding_h +#define V8Binding_h + +#include "BindingSecurity.h" +#include "MathExtras.h" +#include "PlatformString.h" +#include "V8DOMWrapper.h" +#include <wtf/text/AtomicString.h> + +#include <v8.h> + +namespace WebCore { + + class EventListener; + class EventTarget; + + // FIXME: Remove V8Binding. + class V8Binding { + }; + typedef BindingSecurity<V8Binding> V8BindingSecurity; + + enum ExternalMode { + Externalize, + DoNotExternalize + }; + + template <typename StringType> + StringType v8StringToWebCoreString(v8::Handle<v8::String> v8String, ExternalMode external); + + // Convert v8 types to a WTF::String. If the V8 string is not already + // an external string then it is transformed into an external string at this + // point to avoid repeated conversions. + inline String v8StringToWebCoreString(v8::Handle<v8::String> v8String) + { + return v8StringToWebCoreString<String>(v8String, Externalize); + } + String v8NonStringValueToWebCoreString(v8::Handle<v8::Value>); + String v8ValueToWebCoreString(v8::Handle<v8::Value> value); + + // Convert v8 types to a WTF::AtomicString. + inline AtomicString v8StringToAtomicWebCoreString(v8::Handle<v8::String> v8String) + { + return v8StringToWebCoreString<AtomicString>(v8String, Externalize); + } + AtomicString v8NonStringValueToAtomicWebCoreString(v8::Handle<v8::Value>); + AtomicString v8ValueToAtomicWebCoreString(v8::Handle<v8::Value> value); + + // Note: RefPtr is a must as we cache by StringImpl* equality, not identity + // hence lastStringImpl might be not a key of the cache (in sense of identity) + // and hence it's not refed on addition. + extern RefPtr<StringImpl> lastStringImpl; + extern v8::Persistent<v8::String> lastV8String; + v8::Local<v8::String> v8ExternalStringSlow(StringImpl* stringImpl); + + // Return a V8 external string that shares the underlying buffer with the given + // WebCore string. The reference counting mechanism is used to keep the + // underlying buffer alive while the string is still live in the V8 engine. + inline v8::Local<v8::String> v8ExternalString(const String& string) + { + StringImpl* stringImpl = string.impl(); + if (!stringImpl) + return v8::String::Empty(); + + if (lastStringImpl.get() == stringImpl) { + ASSERT(!lastV8String.IsNearDeath()); + ASSERT(!lastV8String.IsEmpty()); + return v8::Local<v8::String>::New(lastV8String); + } + + return v8ExternalStringSlow(stringImpl); + } + + // Convert a string to a V8 string. + inline v8::Handle<v8::String> v8String(const String& string) + { + return v8ExternalString(string); + } + + // Enables caching v8 wrappers created for WTF::StringImpl. Currently this cache requires + // all the calls (both to convert WTF::String to v8::String and to GC the handle) + // to be performed on the main thread. + void enableStringImplCache(); + + // Convert a value to a 32-bit integer. The conversion fails if the + // value cannot be converted to an integer or converts to nan or to an infinity. + int toInt32(v8::Handle<v8::Value> value, bool& ok); + + // Convert a value to a 32-bit integer assuming the conversion cannot fail. + inline int toInt32(v8::Handle<v8::Value> value) + { + bool ok; + return toInt32(value, ok); + } + + // Convert a value to a 32-bit unsigned integer. The conversion fails if the + // value cannot be converted to an unsigned integer or converts to nan or to an infinity. + uint32_t toUInt32(v8::Handle<v8::Value> value, bool& ok); + + // Convert a value to a 32-bit unsigned integer assuming the conversion cannot fail. + inline uint32_t toUInt32(v8::Handle<v8::Value> value) + { + bool ok; + return toUInt32(value, ok); + } + + inline float toFloat(v8::Local<v8::Value> value) + { + return static_cast<float>(value->NumberValue()); + } + + inline long long toInt64(v8::Local<v8::Value> value) + { + return static_cast<long long>(value->IntegerValue()); + } + + // FIXME: Drop this in favor of the type specific v8ValueToWebCoreString when we rework the code generation. + inline String toWebCoreString(v8::Handle<v8::Value> object) + { + return v8ValueToWebCoreString(object); + } + + String toWebCoreString(const v8::Arguments&, int index); + + // The string returned by this function is still owned by the argument + // and will be deallocated when the argument is deallocated. + inline const uint16_t* fromWebCoreString(const String& str) + { + return reinterpret_cast<const uint16_t*>(str.characters()); + } + + bool isUndefinedOrNull(v8::Handle<v8::Value> value); + + v8::Handle<v8::Boolean> v8Boolean(bool value); + + String toWebCoreStringWithNullCheck(v8::Handle<v8::Value> value); + + AtomicString toAtomicWebCoreStringWithNullCheck(v8::Handle<v8::Value> value); + + String toWebCoreStringWithNullOrUndefinedCheck(v8::Handle<v8::Value> value); + + v8::Handle<v8::String> v8UndetectableString(const String& str); + + v8::Handle<v8::Value> v8StringOrNull(const String& str); + + v8::Handle<v8::Value> v8StringOrUndefined(const String& str); + + v8::Handle<v8::Value> v8StringOrFalse(const String& str); + + double toWebCoreDate(v8::Handle<v8::Value> object); + + v8::Handle<v8::Value> v8DateOrNull(double value); + + v8::Persistent<v8::FunctionTemplate> createRawTemplate(); + + struct BatchedAttribute; + struct BatchedCallback; + + v8::Local<v8::Signature> configureTemplate(v8::Persistent<v8::FunctionTemplate>, + const char* interfaceName, + v8::Persistent<v8::FunctionTemplate> parentClass, + int fieldCount, + const BatchedAttribute*, + size_t attributeCount, + const BatchedCallback*, + size_t callbackCount); + + v8::Handle<v8::Value> getElementStringAttr(const v8::AccessorInfo&, + const QualifiedName&); + void setElementStringAttr(const v8::AccessorInfo&, + const QualifiedName&, + v8::Local<v8::Value>); + + + v8::Persistent<v8::String> getToStringName(); + v8::Persistent<v8::FunctionTemplate> getToStringTemplate(); + + String int32ToWebCoreString(int value); + + class V8ParameterBase { + public: + operator String() { return toString<String>(); } + operator AtomicString() { return toString<AtomicString>(); } + + protected: + V8ParameterBase(v8::Local<v8::Value> object) : m_v8Object(object), m_mode(Externalize), m_string() { } + + bool prepareBase() + { + if (LIKELY(m_v8Object->IsString())) + return true; + + if (LIKELY(m_v8Object->IsInt32())) { + setString(int32ToWebCoreString(m_v8Object->Int32Value())); + return true; + } + + m_mode = DoNotExternalize; + v8::TryCatch block; + m_v8Object = m_v8Object->ToString(); + // Handle the case where an exception is thrown as part of invoking toString on the object. + if (block.HasCaught()) { + block.ReThrow(); + return false; + } + + return true; + } + + v8::Local<v8::Value> object() { return m_v8Object; } + + void setString(String string) + { + m_string = string; + m_v8Object.Clear(); // To signal that String is ready. + } + + private: + v8::Local<v8::Value> m_v8Object; + ExternalMode m_mode; + String m_string; + + template <class StringType> + StringType toString() + { + if (LIKELY(!m_v8Object.IsEmpty())) + return v8StringToWebCoreString<StringType>(m_v8Object.As<v8::String>(), m_mode); + + return StringType(m_string); + } + }; + + // V8Parameter is an adapter class that converts V8 values to Strings + // or AtomicStrings as appropriate, using multiple typecast operators. + enum V8ParameterMode { + DefaultMode, + WithNullCheck, + WithUndefinedOrNullCheck + }; + template <V8ParameterMode MODE = DefaultMode> + class V8Parameter: public V8ParameterBase { + public: + V8Parameter(v8::Local<v8::Value> object) : V8ParameterBase(object) { } + V8Parameter(v8::Local<v8::Value> object, bool) : V8ParameterBase(object) { prepare(); } + + bool prepare(); + }; + + template<> inline bool V8Parameter<DefaultMode>::prepare() + { + return V8ParameterBase::prepareBase(); + } + + template<> inline bool V8Parameter<WithNullCheck>::prepare() + { + if (object()->IsNull()) { + setString(String()); + return true; + } + + return V8ParameterBase::prepareBase(); + } + + template<> inline bool V8Parameter<WithUndefinedOrNullCheck>::prepare() + { + if (object()->IsNull() || object()->IsUndefined()) { + setString(String()); + return true; + } + + return V8ParameterBase::prepareBase(); + } + +} // namespace WebCore + +#endif // V8Binding_h |