/* * Copyright (C) 2012 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: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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 V8ArrayBufferCustom_h #define V8ArrayBufferCustom_h #include "bindings/v8/V8Binding.h" #include "bindings/v8/V8DOMWrapper.h" #include "bindings/v8/WrapperTypeInfo.h" #include "wtf/ArrayBuffer.h" #include namespace WebCore { class V8ArrayBufferDeallocationObserver: public WTF::ArrayBufferDeallocationObserver { public: virtual void arrayBufferDeallocated(unsigned sizeInBytes) { v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-static_cast(sizeInBytes)); } static V8ArrayBufferDeallocationObserver* instanceTemplate(); protected: virtual void blinkAllocatedMemory(unsigned sizeInBytes) OVERRIDE { v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(static_cast(sizeInBytes)); } }; class V8ArrayBuffer { public: static bool hasInstance(v8::Handle, v8::Isolate*, WrapperWorldType); static bool hasInstanceInAnyWorld(v8::Handle, v8::Isolate*); static ArrayBuffer* toNative(v8::Handle); static void derefObject(void*); static const WrapperTypeInfo wrapperTypeInfo; static const int internalFieldCount = v8DefaultWrapperInternalFieldCount; static void installPerContextEnabledProperties(v8::Handle, ArrayBuffer*, v8::Isolate*) { } static void installPerContextEnabledMethods(v8::Handle, v8::Isolate*) { } static inline void* toInternalPointer(ArrayBuffer* impl) { return impl; } static inline ArrayBuffer* fromInternalPointer(void* impl) { return static_cast(impl); } private: friend v8::Handle wrap(ArrayBuffer*, v8::Handle creationContext, v8::Isolate*); static v8::Handle createWrapper(PassRefPtr, v8::Handle creationContext, v8::Isolate*); }; template<> class WrapperTypeTraits { public: static const WrapperTypeInfo* wrapperTypeInfo() { return &V8ArrayBuffer::wrapperTypeInfo; } }; inline v8::Handle wrap(ArrayBuffer* impl, v8::Handle creationContext, v8::Isolate* isolate) { ASSERT(impl); ASSERT(!DOMDataStore::containsWrapper(impl, isolate)); return V8ArrayBuffer::createWrapper(impl, creationContext, isolate); } inline v8::Handle toV8(ArrayBuffer* impl, v8::Handle creationContext, v8::Isolate* isolate) { if (UNLIKELY(!impl)) return v8::Null(isolate); v8::Handle wrapper = DOMDataStore::getWrapper(impl, isolate); if (!wrapper.IsEmpty()) return wrapper; return wrap(impl, creationContext, isolate); } template inline void v8SetReturnValue(const CallbackInfo& info, ArrayBuffer* impl) { if (UNLIKELY(!impl)) { v8SetReturnValueNull(info); return; } if (DOMDataStore::setReturnValueFromWrapper(info.GetReturnValue(), impl)) return; v8::Handle wrapper = wrap(impl, info.Holder(), info.GetIsolate()); v8SetReturnValue(info, wrapper); } template inline void v8SetReturnValueForMainWorld(const CallbackInfo& info, ArrayBuffer* impl) { ASSERT(worldType(info.GetIsolate()) == MainWorld); if (UNLIKELY(!impl)) { v8SetReturnValueNull(info); return; } if (DOMDataStore::setReturnValueFromWrapperForMainWorld(info.GetReturnValue(), impl)) return; v8::Handle wrapper = wrap(impl, info.Holder(), info.GetIsolate()); v8SetReturnValue(info, wrapper); } template inline void v8SetReturnValueFast(const CallbackInfo& info, ArrayBuffer* impl, Wrappable* wrappable) { if (UNLIKELY(!impl)) { v8SetReturnValueNull(info); return; } if (DOMDataStore::setReturnValueFromWrapperFast(info.GetReturnValue(), impl, info.Holder(), wrappable)) return; v8::Handle wrapper = wrap(impl, info.Holder(), info.GetIsolate()); v8SetReturnValue(info, wrapper); } inline v8::Handle toV8(PassRefPtr< ArrayBuffer > impl, v8::Handle creationContext, v8::Isolate* isolate) { return toV8(impl.get(), creationContext, isolate); } template inline void v8SetReturnValue(const CallbackInfo& info, PassRefPtr< ArrayBuffer > impl) { v8SetReturnValue(info, impl.get()); } template inline void v8SetReturnValueForMainWorld(const CallbackInfo& info, PassRefPtr< ArrayBuffer > impl) { v8SetReturnValueForMainWorld(info, impl.get()); } template inline void v8SetReturnValueFast(const CallbackInfo& info, PassRefPtr< ArrayBuffer > impl, Wrappable* wrappable) { v8SetReturnValueFast(info, impl.get(), wrappable); } } // namespace WebCore #endif // V8ArrayBufferCustom_h