OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 class Node; | 44 class Node; |
45 | 45 |
46 class DOMDataStore { | 46 class DOMDataStore { |
47 WTF_MAKE_NONCOPYABLE(DOMDataStore); | 47 WTF_MAKE_NONCOPYABLE(DOMDataStore); |
48 public: | 48 public: |
49 explicit DOMDataStore(WrapperWorldType); | 49 explicit DOMDataStore(WrapperWorldType); |
50 ~DOMDataStore(); | 50 ~DOMDataStore(); |
51 | 51 |
52 static DOMDataStore* current(v8::Isolate*); | 52 static DOMDataStore* current(v8::Isolate*); |
53 | 53 |
54 template<typename T, typename HolderContainer, typename Wrappable> | 54 template<typename V8T, typename T, typename HolderContainer, typename Wrappa
ble> |
55 static v8::Handle<v8::Object> getWrapperFast(T* object, const HolderContaine
r& container, Wrappable* holder) | 55 static v8::Handle<v8::Object> getWrapperFast(T* object, const HolderContaine
r& container, Wrappable* holder) |
56 { | 56 { |
57 // What we'd really like to check here is whether we're in the | 57 // What we'd really like to check here is whether we're in the |
58 // main world or in an isolated world. The fastest way to do that | 58 // main world or in an isolated world. The fastest way to do that |
59 // is to check that there is no isolated world and the 'object' | 59 // is to check that there is no isolated world and the 'object' |
60 // is an object that can exist in the main world. The second fastest | 60 // is an object that can exist in the main world. The second fastest |
61 // way is to check whether the wrappable's wrapper is the same as | 61 // way is to check whether the wrappable's wrapper is the same as |
62 // the holder. | 62 // the holder. |
63 if ((!DOMWrapperWorld::isolatedWorldsExist() && !canExistInWorker(object
)) || holderContainsWrapper(container, holder)) { | 63 if ((!DOMWrapperWorld::isolatedWorldsExist() && !canExistInWorker(object
)) || holderContainsWrapper(container, holder)) { |
64 if (ScriptWrappable::wrapperCanBeStoredInObject(object)) { | 64 if (ScriptWrappable::wrapperCanBeStoredInObject(object)) { |
65 v8::Handle<v8::Object> result = ScriptWrappable::getUnsafeWrappe
rFromObject(object).handle(); | 65 v8::Handle<v8::Object> result = ScriptWrappable::getUnsafeWrappe
rFromObject(object).handle(); |
66 // Security: always guard against malicious tampering. | 66 // Security: always guard against malicious tampering. |
67 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(result.IsEmpty() || res
ult->GetAlignedPointerFromInternalField(v8DOMWrapperObjectIndex) == static_cast<
void*>(object)); | 67 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(result.IsEmpty() || res
ult->GetAlignedPointerFromInternalField(v8DOMWrapperObjectIndex) == V8T::toInter
nalPointer(object)); |
68 return result; | 68 return result; |
69 } | 69 } |
70 return mainWorldStore()->m_wrapperMap.get(object); | 70 return mainWorldStore()->m_wrapperMap.get(V8T::toInternalPointer(obj
ect)); |
71 } | 71 } |
72 return current(container.GetIsolate())->get(object); | 72 return current(container.GetIsolate())->template get<V8T>(object); |
73 } | 73 } |
74 | 74 |
75 template<typename T> | 75 template<typename V8T, typename T> |
76 static v8::Handle<v8::Object> getWrapper(T* object, v8::Isolate* isolate) | 76 static v8::Handle<v8::Object> getWrapper(T* object, v8::Isolate* isolate) |
77 { | 77 { |
78 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && !canExistInWo
rker(object)) { | 78 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && !canExistInWo
rker(object)) { |
79 if (LIKELY(!DOMWrapperWorld::isolatedWorldsExist())) { | 79 if (LIKELY(!DOMWrapperWorld::isolatedWorldsExist())) { |
80 v8::Handle<v8::Object> result = ScriptWrappable::getUnsafeWrappe
rFromObject(object).handle(); | 80 v8::Handle<v8::Object> result = ScriptWrappable::getUnsafeWrappe
rFromObject(object).handle(); |
81 // Security: always guard against malicious tampering. | 81 // Security: always guard against malicious tampering. |
82 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(result.IsEmpty() || res
ult->GetAlignedPointerFromInternalField(v8DOMWrapperObjectIndex) == static_cast<
void*>(object)); | 82 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(result.IsEmpty() || res
ult->GetAlignedPointerFromInternalField(v8DOMWrapperObjectIndex) == V8T::toInter
nalPointer(object)); |
83 return result; | 83 return result; |
84 } | 84 } |
85 } | 85 } |
86 return current(isolate)->get(object); | 86 return current(isolate)->template get<V8T>(object); |
87 } | 87 } |
88 | 88 |
89 template<typename T> | 89 template<typename V8T, typename T> |
90 static v8::Handle<v8::Object> getWrapperForMainWorld(T* object) | 90 static v8::Handle<v8::Object> getWrapperForMainWorld(T* object) |
91 { | 91 { |
92 if (ScriptWrappable::wrapperCanBeStoredInObject(object)) | 92 if (ScriptWrappable::wrapperCanBeStoredInObject(object)) |
93 return ScriptWrappable::getUnsafeWrapperFromObject(object).handle(); | 93 return ScriptWrappable::getUnsafeWrapperFromObject(object).handle(); |
94 return mainWorldStore()->get(object); | 94 return mainWorldStore()->template get<V8T>(object); |
95 } | 95 } |
96 | 96 |
97 template<typename T> | 97 template<typename V8T, typename T> |
98 static void setWrapper(T* object, v8::Handle<v8::Object> wrapper, v8::Isolat
e* isolate, const WrapperConfiguration& configuration) | 98 static void setWrapper(T* object, v8::Handle<v8::Object> wrapper, v8::Isolat
e* isolate, const WrapperConfiguration& configuration) |
99 { | 99 { |
100 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && !canExistInWo
rker(object)) { | 100 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && !canExistInWo
rker(object)) { |
101 if (LIKELY(!DOMWrapperWorld::isolatedWorldsExist())) { | 101 if (LIKELY(!DOMWrapperWorld::isolatedWorldsExist())) { |
102 ScriptWrappable::setWrapperInObject(object, wrapper, isolate, co
nfiguration); | 102 ScriptWrappable::setWrapperInObject(object, wrapper, isolate, co
nfiguration); |
103 return; | 103 return; |
104 } | 104 } |
105 } | 105 } |
106 return current(isolate)->set(object, wrapper, isolate, configuration); | 106 return current(isolate)->template set<V8T>(object, wrapper, isolate, con
figuration); |
107 } | 107 } |
108 | 108 |
109 template<typename T> | 109 template<typename V8T, typename T> |
110 inline v8::Handle<v8::Object> get(T* object) | 110 inline v8::Handle<v8::Object> get(T* object) |
111 { | 111 { |
112 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && m_type == Mai
nWorld) | 112 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && m_type == Mai
nWorld) |
113 return ScriptWrappable::getUnsafeWrapperFromObject(object).handle(); | 113 return ScriptWrappable::getUnsafeWrapperFromObject(object).handle(); |
114 return m_wrapperMap.get(object); | 114 return m_wrapperMap.get(V8T::toInternalPointer(object)); |
115 } | 115 } |
116 | 116 |
117 void reportMemoryUsage(MemoryObjectInfo*) const; | 117 void reportMemoryUsage(MemoryObjectInfo*) const; |
118 | 118 |
119 private: | 119 private: |
120 template<typename T> | 120 template<typename V8T, typename T> |
121 inline void set(T* object, v8::Handle<v8::Object> wrapper, v8::Isolate* isol
ate, const WrapperConfiguration& configuration) | 121 inline void set(T* object, v8::Handle<v8::Object> wrapper, v8::Isolate* isol
ate, const WrapperConfiguration& configuration) |
122 { | 122 { |
123 ASSERT(!!object); | 123 ASSERT(!!object); |
124 ASSERT(!wrapper.IsEmpty()); | 124 ASSERT(!wrapper.IsEmpty()); |
125 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && m_type == Mai
nWorld) { | 125 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && m_type == Mai
nWorld) { |
126 ScriptWrappable::setWrapperInObject(object, wrapper, isolate, config
uration); | 126 ScriptWrappable::setWrapperInObject(object, wrapper, isolate, config
uration); |
127 return; | 127 return; |
128 } | 128 } |
129 m_wrapperMap.set(object, wrapper, configuration); | 129 m_wrapperMap.set(V8T::toInternalPointer(object), wrapper, configuration)
; |
130 } | 130 } |
131 | 131 |
132 static DOMDataStore* mainWorldStore(); | 132 static DOMDataStore* mainWorldStore(); |
133 | 133 |
134 static bool canExistInWorker(void*) { return true; } | 134 static bool canExistInWorker(void*) { return true; } |
135 static bool canExistInWorker(Node*) { return false; } | 135 static bool canExistInWorker(Node*) { return false; } |
136 | 136 |
137 template<typename HolderContainer> | 137 template<typename HolderContainer> |
138 static bool holderContainsWrapper(const HolderContainer&, void*) | 138 static bool holderContainsWrapper(const HolderContainer&, void*) |
139 { | 139 { |
140 return false; | 140 return false; |
141 } | 141 } |
142 | 142 |
143 template<typename HolderContainer> | 143 template<typename HolderContainer> |
144 static bool holderContainsWrapper(const HolderContainer& container, ScriptWr
appable* wrappable) | 144 static bool holderContainsWrapper(const HolderContainer& container, ScriptWr
appable* wrappable) |
145 { | 145 { |
146 // Verify our assumptions about the main world. | 146 // Verify our assumptions about the main world. |
147 ASSERT(wrappable->unsafePersistent().handle().IsEmpty() || container.Hol
der() != wrappable->unsafePersistent().handle() || current(v8::Isolate::GetCurre
nt())->m_type == MainWorld); | 147 ASSERT(wrappable->unsafePersistent().handle().IsEmpty() || container.Hol
der() != wrappable->unsafePersistent().handle() || current(v8::Isolate::GetCurre
nt())->m_type == MainWorld); |
148 return container.Holder() == wrappable->unsafePersistent().handle(); | 148 return container.Holder() == wrappable->unsafePersistent().handle(); |
149 } | 149 } |
150 | 150 |
151 WrapperWorldType m_type; | 151 WrapperWorldType m_type; |
152 DOMWrapperMap<void> m_wrapperMap; | 152 DOMWrapperMap<void> m_wrapperMap; |
153 }; | 153 }; |
154 | 154 |
155 } // namespace WebCore | 155 } // namespace WebCore |
156 | 156 |
157 #endif // DOMDataStore_h | 157 #endif // DOMDataStore_h |
OLD | NEW |