15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef DOMWrapperMap_h 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define DOMWrapperMap_h 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/WrapperTypeInfo.h" 35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "platform/ScriptForbiddenScope.h" 36197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "wtf/HashMap.h" 37a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include <v8-util.h> 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <v8.h> 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<class KeyType> 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class DOMWrapperMap { 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) explicit DOMWrapperMap(v8::Isolate* isolate) 4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) : m_isolate(isolate) 47a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch , m_map(isolate) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 51e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) v8::Handle<v8::Object> newLocal(KeyType* key, v8::Isolate* isolate) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 53a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return m_map.Get(key); 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 56e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) bool setReturnValueFrom(v8::ReturnValue<v8::Value> returnValue, KeyType* key) 5793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) { 58a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return m_map.SetReturnValue(key, returnValue); 59e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 60e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 6119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) void setReference(const v8::Persistent<v8::Object>& parent, KeyType* key, v8::Isolate* isolate) 6219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) { 63a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch m_map.SetReference(key, parent); 6419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) } 6519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 66e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) bool containsKey(KeyType* key) 67e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) { 68a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return m_map.Contains(key); 6993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 7093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void set(KeyType* key, v8::Handle<v8::Object> wrapper, const WrapperTypeInfo* wrapperTypeInfo) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(reinterpret_cast<KeyType*>(toScriptWrappableBase(wrapper)) == key); 745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) RELEASE_ASSERT(!containsKey(key)); // See crbug.com/368095 75a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch v8::UniquePersistent<v8::Object> unique(m_isolate, wrapper); 767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci wrapperTypeInfo->configureWrapper(&unique); 77a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch m_map.Set(key, unique.Pass()); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void clear() 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 82a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch m_map.Clear(); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) void removeAndDispose(KeyType* key) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 87323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) ASSERT(containsKey(key)); 88a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch m_map.Remove(key); 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 92a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch class PersistentValueMapTraits { 93a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch public: 94a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // Map traits: 95a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch typedef HashMap<KeyType*, v8::PersistentContainerValue> Impl; 96a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch typedef typename Impl::iterator Iterator; 97a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static size_t Size(const Impl* impl) { return impl->size(); } 98a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static bool Empty(Impl* impl) { return impl->isEmpty(); } 99a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static void Swap(Impl& impl, Impl& other) { impl.swap(other); } 100a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static Iterator Begin(Impl* impl) { return impl->begin(); } 101a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static Iterator End(Impl* impl) { return impl->end(); } 102a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static v8::PersistentContainerValue Value(Iterator& iter) 103a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch { 104a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return iter->value; 105a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 106a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static KeyType* Key(Iterator& iter) { return iter->key; } 107a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static v8::PersistentContainerValue Set( 108a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch Impl* impl, KeyType* key, v8::PersistentContainerValue value) 109a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch { 110a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch v8::PersistentContainerValue oldValue = Get(impl, key); 111c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) impl->set(key, value); 112a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return oldValue; 113a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 114a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static v8::PersistentContainerValue Get(const Impl* impl, KeyType* key) 115a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch { 116a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return impl->get(key); 117a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 118a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 119a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static v8::PersistentContainerValue Remove(Impl* impl, KeyType* key) 120a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch { 121a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return impl->take(key); 122a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 123a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 124a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // Weak traits: 125a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static const v8::PersistentContainerCallbackType kCallbackType = v8::kWeak; 126a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch typedef v8::PersistentValueMap<KeyType*, v8::Object, PersistentValueMapTraits> MapType; 127a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch typedef MapType WeakCallbackDataType; 128a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 129a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static WeakCallbackDataType* WeakCallbackParameter(MapType* map, KeyType* key, v8::Local<v8::Object>& value) 130a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch { 131a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return map; 132a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 133a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 134a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static void DisposeCallbackData(WeakCallbackDataType* callbackData) { } 135a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 136a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static MapType* MapFromWeakCallbackData( 137a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch const v8::WeakCallbackData<v8::Object, WeakCallbackDataType>& data) 138a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch { 139a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return data.GetParameter(); 140a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 141a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 142a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static KeyType* KeyFromWeakCallbackData( 143a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch const v8::WeakCallbackData<v8::Object, WeakCallbackDataType>& data) 144a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch { 1457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return reinterpret_cast<KeyType*>(toScriptWrappableBase(data.GetValue())); 146a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 147a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 148a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch static void Dispose(v8::Isolate* isolate, v8::UniquePersistent<v8::Object> value, KeyType* key) { } 149a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch }; 15093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) v8::Isolate* m_isolate; 152a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch typename PersistentValueMapTraits::MapType m_map; 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 155c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // DOMWrapperMap_h 158