diff options
Diffstat (limited to 'WebCore/bindings/v8/V8Binding.cpp')
-rw-r--r-- | WebCore/bindings/v8/V8Binding.cpp | 69 |
1 files changed, 48 insertions, 21 deletions
diff --git a/WebCore/bindings/v8/V8Binding.cpp b/WebCore/bindings/v8/V8Binding.cpp index 00286e5..4379230 100644 --- a/WebCore/bindings/v8/V8Binding.cpp +++ b/WebCore/bindings/v8/V8Binding.cpp @@ -41,6 +41,7 @@ #include "StringBuffer.h" #include "StringHash.h" #include "Threading.h" +#include "V8Element.h" #include "V8Proxy.h" #include <v8.h> @@ -126,16 +127,6 @@ private: #endif }; - -void* v8DOMWrapperToNative(v8::Handle<v8::Object> object) { - return object->GetPointerFromInternalField(V8Custom::kDOMWrapperObjectIndex); -} - -void* v8DOMWrapperToNative(const v8::AccessorInfo& info) { - return info.Holder()->GetPointerFromInternalField(V8Custom::kDOMWrapperObjectIndex); -} - - String v8ValueToWebCoreString(v8::Handle<v8::Value> value) { if (value->IsString()) @@ -239,6 +230,17 @@ v8::Handle<v8::Value> v8StringOrFalse(const String& str) return str.isNull() ? v8::Handle<v8::Value>(v8::False()) : v8::Handle<v8::Value>(v8String(str)); } +double toWebCoreDate(v8::Handle<v8::Value> object) +{ + return (object->IsDate() || object->IsNumber()) ? object->NumberValue() : std::numeric_limits<double>::quiet_NaN(); +} + +v8::Handle<v8::Value> v8DateOrNull(double value) +{ + if (isfinite(value)) + return v8::Date::New(value); + return v8::Null(); +} template <class S> struct StringTraits { @@ -407,7 +409,11 @@ v8::Local<v8::String> v8ExternalString(const String& string) StringCache& stringCache = getStringCache(); v8::String* cachedV8String = stringCache.get(stringImpl); if (cachedV8String) - return v8::Local<v8::String>::New(v8::Handle<v8::String>(cachedV8String)); + { + v8::Persistent<v8::String> handle(cachedV8String); + if (!handle.IsNearDeath() && !handle.IsEmpty()) + return v8::Local<v8::String>::New(handle); + } v8::Local<v8::String> newString = makeExternalString(string); if (newString.IsEmpty()) @@ -457,21 +463,42 @@ v8::Local<v8::Signature> configureTemplate(v8::Persistent<v8::FunctionTemplate>d return defaultSignature; } -void createCallback(v8::Local<v8::ObjectTemplate> proto, - const char *name, - v8::InvocationCallback callback, - v8::Handle<v8::Signature> signature, - v8::PropertyAttribute attribute) +v8::Persistent<v8::String> getToStringName() +{ + DEFINE_STATIC_LOCAL(v8::Persistent<v8::String>, value, ()); + if (value.IsEmpty()) + value = v8::Persistent<v8::String>::New(v8::String::New("toString")); + return value; +} + +static v8::Handle<v8::Value> constructorToString(const v8::Arguments& args) +{ + // The DOM constructors' toString functions grab the current toString + // for Functions by taking the toString function of itself and then + // calling it with the constructor as its receiver. This means that + // changes to the Function prototype chain or toString function are + // reflected when printing DOM constructors. The only wart is that + // changes to a DOM constructor's toString's toString will cause the + // toString of the DOM constructor itself to change. This is extremely + // obscure and unlikely to be a problem. + v8::Handle<v8::Value> value = args.Callee()->Get(getToStringName()); + if (!value->IsFunction()) + return v8::String::New(""); + return v8::Handle<v8::Function>::Cast(value)->Call(args.This(), 0, 0); +} + +v8::Persistent<v8::FunctionTemplate> getToStringTemplate() { - proto->Set(v8::String::New(name), - v8::FunctionTemplate::New(callback, v8::Handle<v8::Value>(), signature), - attribute); + DEFINE_STATIC_LOCAL(v8::Persistent<v8::FunctionTemplate>, toStringTemplate, ()); + if (toStringTemplate.IsEmpty()) + toStringTemplate = v8::Persistent<v8::FunctionTemplate>::New(v8::FunctionTemplate::New(constructorToString)); + return toStringTemplate; } v8::Handle<v8::Value> getElementStringAttr(const v8::AccessorInfo& info, const QualifiedName& name) { - Element *imp = v8DOMWrapperToNode<Element>(info); + Element* imp = V8Element::toNative(info.Holder()); return v8ExternalString(imp->getAttribute(name)); } @@ -479,7 +506,7 @@ void setElementStringAttr(const v8::AccessorInfo& info, const QualifiedName& name, v8::Local<v8::Value> value) { - Element* imp = v8DOMWrapperToNode<Element>(info); + Element* imp = V8Element::toNative(info.Holder()); AtomicString v = toAtomicWebCoreStringWithNullCheck(value); imp->setAttribute(name, v); } |