/* * 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: * * * 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 V8PerContextData_h #define V8PerContextData_h #include "bindings/v8/CustomElementBinding.h" #include "bindings/v8/ScopedPersistent.h" #include "bindings/v8/V8PersistentValueMap.h" #include "bindings/v8/WrapperTypeInfo.h" #include "gin/public/context_holder.h" #include "gin/public/gin_embedders.h" #include #include "wtf/HashMap.h" #include "wtf/PassOwnPtr.h" #include "wtf/Vector.h" #include "wtf/text/AtomicString.h" #include "wtf/text/AtomicStringHash.h" namespace WebCore { class CustomElementDefinition; class V8DOMActivityLogger; class V8PerContextData; struct V8NPObject; typedef WTF::Vector V8NPObjectVector; typedef WTF::HashMap V8NPObjectMap; enum V8ContextEmbedderDataField { v8ContextDebugIdIndex = static_cast(gin::kDebugIdIndex), v8ContextPerContextDataIndex = static_cast(gin::kPerContextDataStartIndex + gin::kEmbedderBlink), }; class V8PerContextData { public: static PassOwnPtr create(v8::Handle); static V8PerContextData* from(v8::Handle); ~V8PerContextData(); v8::Handle context() { return m_context.newLocal(m_isolate); } // To create JS Wrapper objects, we create a cache of a 'boiler plate' // object, and then simply Clone that object each time we need a new one. // This is faster than going through the full object creation process. v8::Local createWrapperFromCache(const WrapperTypeInfo* type) { v8::Local boilerplate = m_wrapperBoilerplates.Get(type); return !boilerplate.IsEmpty() ? boilerplate->Clone() : createWrapperFromCacheSlowCase(type); } v8::Local constructorForType(const WrapperTypeInfo* type) { v8::Local function = m_constructorMap.Get(type); return (!function.IsEmpty()) ? function : constructorForTypeSlowCase(type); } v8::Local prototypeForType(const WrapperTypeInfo*); V8NPObjectMap* v8NPObjectMap() { return &m_v8NPObjectMap; } void addCustomElementBinding(CustomElementDefinition*, PassOwnPtr); void clearCustomElementBinding(CustomElementDefinition*); CustomElementBinding* customElementBinding(CustomElementDefinition*); V8DOMActivityLogger* activityLogger() const { return m_activityLogger; } void setActivityLogger(V8DOMActivityLogger* activityLogger) { m_activityLogger = activityLogger; } private: V8PerContextData(v8::Handle); v8::Local createWrapperFromCacheSlowCase(const WrapperTypeInfo*); v8::Local constructorForTypeSlowCase(const WrapperTypeInfo*); // For each possible type of wrapper, we keep a boilerplate object. // The boilerplate is used to create additional wrappers of the same type. typedef V8PersistentValueMap WrapperBoilerplateMap; WrapperBoilerplateMap m_wrapperBoilerplates; typedef V8PersistentValueMap ConstructorMap; ConstructorMap m_constructorMap; V8NPObjectMap m_v8NPObjectMap; v8::Isolate* m_isolate; OwnPtr m_contextHolder; ScopedPersistent m_context; ScopedPersistent m_errorPrototype; typedef WTF::HashMap > CustomElementBindingMap; OwnPtr m_customElementBindings; // This is owned by a static hash map in V8DOMActivityLogger. V8DOMActivityLogger* m_activityLogger; }; class V8PerContextDebugData { public: static bool setContextDebugData(v8::Handle, const char* worldName, int debugId); static int contextDebugId(v8::Handle); }; } // namespace WebCore #endif // V8PerContextData_h