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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 namespace WebCore { | 42 namespace WebCore { |
43 | 43 |
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 V8T, typename T, typename Wrappable> | 54 template<typename V8T, typename T, typename Wrappable> |
55 static bool setReturnValueFromWrapperFast(v8::ReturnValue<v8::Value> returnV
alue, T* object, v8::Local<v8::Object> holder, Wrappable* wrappable) | 55 static bool setReturnValueFromWrapperFast(v8::ReturnValue<v8::Value> returnV
alue, T* object, v8::Local<v8::Object> holder, Wrappable* wrappable) |
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(holder, wrappable)) { | 63 if ((!DOMWrapperWorld::isolatedWorldsExist() && !canExistInWorker(object
)) || holderContainsWrapper(holder, wrappable)) { |
64 if (ScriptWrappable::wrapperCanBeStoredInObject(object)) | 64 if (ScriptWrappable::wrapperCanBeStoredInObject(object)) |
65 return ScriptWrappable::setReturnValueWithSecurityCheck<V8T>(ret
urnValue, object); | 65 return ScriptWrappable::setReturnValueWithSecurityCheck<V8T>(ret
urnValue, object); |
66 return mainWorldStore()->m_wrapperMap.setReturnValueFrom(returnValue
, V8T::toInternalPointer(object)); | 66 return mainWorldStore().m_wrapperMap.setReturnValueFrom(returnValue,
V8T::toInternalPointer(object)); |
67 } | 67 } |
68 return current(returnValue.GetIsolate())->template setReturnValueFrom<V8
T>(returnValue, object); | 68 return current(returnValue.GetIsolate()).template setReturnValueFrom<V8T
>(returnValue, object); |
69 } | 69 } |
70 | 70 |
71 template<typename V8T, typename T> | 71 template<typename V8T, typename T> |
72 static bool setReturnValueFromWrapper(v8::ReturnValue<v8::Value> returnValue
, T* object) | 72 static bool setReturnValueFromWrapper(v8::ReturnValue<v8::Value> returnValue
, T* object) |
73 { | 73 { |
74 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && !canExistInWo
rker(object)) { | 74 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && !canExistInWo
rker(object)) { |
75 if (LIKELY(!DOMWrapperWorld::isolatedWorldsExist())) | 75 if (LIKELY(!DOMWrapperWorld::isolatedWorldsExist())) |
76 return ScriptWrappable::setReturnValueWithSecurityCheck<V8T>(ret
urnValue, object); | 76 return ScriptWrappable::setReturnValueWithSecurityCheck<V8T>(ret
urnValue, object); |
77 } | 77 } |
78 return current(returnValue.GetIsolate())->template setReturnValueFrom<V8
T>(returnValue, object); | 78 return current(returnValue.GetIsolate()).template setReturnValueFrom<V8T
>(returnValue, object); |
79 } | 79 } |
80 | 80 |
81 template<typename V8T, typename T> | 81 template<typename V8T, typename T> |
82 static bool setReturnValueFromWrapperForMainWorld(v8::ReturnValue<v8::Value>
returnValue, T* object) | 82 static bool setReturnValueFromWrapperForMainWorld(v8::ReturnValue<v8::Value>
returnValue, T* object) |
83 { | 83 { |
84 if (ScriptWrappable::wrapperCanBeStoredInObject(object)) | 84 if (ScriptWrappable::wrapperCanBeStoredInObject(object)) |
85 return ScriptWrappable::setReturnValue(returnValue, object); | 85 return ScriptWrappable::setReturnValue(returnValue, object); |
86 return mainWorldStore()->m_wrapperMap.setReturnValueFrom(returnValue, V8
T::toInternalPointer(object)); | 86 return mainWorldStore().m_wrapperMap.setReturnValueFrom(returnValue, V8T
::toInternalPointer(object)); |
87 } | 87 } |
88 | 88 |
89 template<typename V8T, typename T> | 89 template<typename V8T, typename T> |
90 static v8::Handle<v8::Object> getWrapper(T* object, v8::Isolate* isolate) | 90 static v8::Handle<v8::Object> getWrapper(T* object, v8::Isolate* isolate) |
91 { | 91 { |
92 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && !canExistInWo
rker(object)) { | 92 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && !canExistInWo
rker(object)) { |
93 if (LIKELY(!DOMWrapperWorld::isolatedWorldsExist())) { | 93 if (LIKELY(!DOMWrapperWorld::isolatedWorldsExist())) { |
94 v8::Handle<v8::Object> result = ScriptWrappable::getUnsafeWrappe
rFromObject(object).newLocal(isolate); | 94 v8::Handle<v8::Object> result = ScriptWrappable::getUnsafeWrappe
rFromObject(object).newLocal(isolate); |
95 // Security: always guard against malicious tampering. | 95 // Security: always guard against malicious tampering. |
96 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(result.IsEmpty() || res
ult->GetAlignedPointerFromInternalField(v8DOMWrapperObjectIndex) == V8T::toInter
nalPointer(object)); | 96 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(result.IsEmpty() || res
ult->GetAlignedPointerFromInternalField(v8DOMWrapperObjectIndex) == V8T::toInter
nalPointer(object)); |
97 return result; | 97 return result; |
98 } | 98 } |
99 } | 99 } |
100 return current(isolate)->template get<V8T>(object, isolate); | 100 return current(isolate).template get<V8T>(object, isolate); |
101 } | 101 } |
102 | 102 |
103 template<typename V8T, typename T> | 103 template<typename V8T, typename T> |
104 static void setWrapperReference(const v8::Persistent<v8::Object>& parent, T*
child, v8::Isolate* isolate) | 104 static void setWrapperReference(const v8::Persistent<v8::Object>& parent, T*
child, v8::Isolate* isolate) |
105 { | 105 { |
106 if (ScriptWrappable::wrapperCanBeStoredInObject(child) && !canExistInWor
ker(child)) { | 106 if (ScriptWrappable::wrapperCanBeStoredInObject(child) && !canExistInWor
ker(child)) { |
107 if (LIKELY(!DOMWrapperWorld::isolatedWorldsExist())) { | 107 if (LIKELY(!DOMWrapperWorld::isolatedWorldsExist())) { |
108 UnsafePersistent<v8::Object> unsafePersistent = ScriptWrappable:
:getUnsafeWrapperFromObject(child); | 108 UnsafePersistent<v8::Object> unsafePersistent = ScriptWrappable:
:getUnsafeWrapperFromObject(child); |
109 // Security: always guard against malicious tampering. | 109 // Security: always guard against malicious tampering. |
110 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(unsafePersistent.isEmpt
y() || unsafePersistent.value()->GetAlignedPointerFromInternalField(v8DOMWrapper
ObjectIndex) == V8T::toInternalPointer(child)); | 110 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(unsafePersistent.isEmpt
y() || unsafePersistent.value()->GetAlignedPointerFromInternalField(v8DOMWrapper
ObjectIndex) == V8T::toInternalPointer(child)); |
111 unsafePersistent.setReferenceFrom(parent, isolate); | 111 unsafePersistent.setReferenceFrom(parent, isolate); |
112 } | 112 } |
113 } | 113 } |
114 current(isolate)->template setReference<V8T>(parent, child, isolate); | 114 current(isolate).template setReference<V8T>(parent, child, isolate); |
115 } | 115 } |
116 | 116 |
117 template<typename V8T, typename T> | 117 template<typename V8T, typename T> |
118 static void setWrapper(T* object, v8::Handle<v8::Object> wrapper, v8::Isolat
e* isolate, const WrapperConfiguration& configuration) | 118 static void setWrapper(T* object, v8::Handle<v8::Object> wrapper, v8::Isolat
e* isolate, const WrapperConfiguration& configuration) |
119 { | 119 { |
120 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && !canExistInWo
rker(object)) { | 120 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && !canExistInWo
rker(object)) { |
121 if (LIKELY(!DOMWrapperWorld::isolatedWorldsExist())) { | 121 if (LIKELY(!DOMWrapperWorld::isolatedWorldsExist())) { |
122 ScriptWrappable::setWrapperInObject(object, wrapper, isolate, co
nfiguration); | 122 ScriptWrappable::setWrapperInObject(object, wrapper, isolate, co
nfiguration); |
123 return; | 123 return; |
124 } | 124 } |
125 } | 125 } |
126 return current(isolate)->template set<V8T>(object, wrapper, isolate, con
figuration); | 126 return current(isolate).template set<V8T>(object, wrapper, isolate, conf
iguration); |
127 } | 127 } |
128 | 128 |
129 template<typename V8T, typename T> | 129 template<typename V8T, typename T> |
130 static bool containsWrapper(T* object, v8::Isolate* isolate) | 130 static bool containsWrapper(T* object, v8::Isolate* isolate) |
131 { | 131 { |
132 return current(isolate)->template containsWrapper<V8T>(object); | 132 return current(isolate).template containsWrapper<V8T>(object); |
133 } | 133 } |
134 | 134 |
135 template<typename V8T, typename T> | 135 template<typename V8T, typename T> |
136 inline v8::Handle<v8::Object> get(T* object, v8::Isolate* isolate) | 136 inline v8::Handle<v8::Object> get(T* object, v8::Isolate* isolate) |
137 { | 137 { |
138 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && m_type == Mai
nWorld) | 138 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && m_type == Mai
nWorld) |
139 return ScriptWrappable::getUnsafeWrapperFromObject(object).newLocal(
isolate); | 139 return ScriptWrappable::getUnsafeWrapperFromObject(object).newLocal(
isolate); |
140 return m_wrapperMap.newLocal(V8T::toInternalPointer(object), isolate); | 140 return m_wrapperMap.newLocal(V8T::toInternalPointer(object), isolate); |
141 } | 141 } |
142 | 142 |
(...skipping 29 matching lines...) Expand all Loading... |
172 { | 172 { |
173 ASSERT(!!object); | 173 ASSERT(!!object); |
174 ASSERT(!wrapper.IsEmpty()); | 174 ASSERT(!wrapper.IsEmpty()); |
175 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && m_type == Mai
nWorld) { | 175 if (ScriptWrappable::wrapperCanBeStoredInObject(object) && m_type == Mai
nWorld) { |
176 ScriptWrappable::setWrapperInObject(object, wrapper, isolate, config
uration); | 176 ScriptWrappable::setWrapperInObject(object, wrapper, isolate, config
uration); |
177 return; | 177 return; |
178 } | 178 } |
179 m_wrapperMap.set(V8T::toInternalPointer(object), wrapper, configuration)
; | 179 m_wrapperMap.set(V8T::toInternalPointer(object), wrapper, configuration)
; |
180 } | 180 } |
181 | 181 |
182 static DOMDataStore* mainWorldStore(); | 182 static DOMDataStore& mainWorldStore(); |
183 | 183 |
184 static bool canExistInWorker(void*) { return true; } | 184 static bool canExistInWorker(void*) { return true; } |
185 static bool canExistInWorker(Node*) { return false; } | 185 static bool canExistInWorker(Node*) { return false; } |
186 | 186 |
187 static bool holderContainsWrapper(v8::Local<v8::Object>, void*) | 187 static bool holderContainsWrapper(v8::Local<v8::Object>, void*) |
188 { | 188 { |
189 return false; | 189 return false; |
190 } | 190 } |
191 | 191 |
192 static bool holderContainsWrapper(v8::Local<v8::Object> holder, ScriptWrappa
ble* wrappable) | 192 static bool holderContainsWrapper(v8::Local<v8::Object> holder, ScriptWrappa
ble* wrappable) |
193 { | 193 { |
194 // Verify our assumptions about the main world. | 194 // Verify our assumptions about the main world. |
195 UnsafePersistent<v8::Object> unsafePersistent = wrappable->unsafePersist
ent(); | 195 UnsafePersistent<v8::Object> unsafePersistent = wrappable->unsafePersist
ent(); |
196 ASSERT(unsafePersistent.isEmpty() || !(holder == *unsafePersistent.persi
stent()) || current(v8::Isolate::GetCurrent())->m_type == MainWorld); | 196 ASSERT(unsafePersistent.isEmpty() || !(holder == *unsafePersistent.persi
stent()) || current(v8::Isolate::GetCurrent()).m_type == MainWorld); |
197 return holder == *unsafePersistent.persistent(); | 197 return holder == *unsafePersistent.persistent(); |
198 } | 198 } |
199 | 199 |
200 WrapperWorldType m_type; | 200 WrapperWorldType m_type; |
201 DOMWrapperMap<void> m_wrapperMap; | 201 DOMWrapperMap<void> m_wrapperMap; |
202 }; | 202 }; |
203 | 203 |
204 } // namespace WebCore | 204 } // namespace WebCore |
205 | 205 |
206 #endif // DOMDataStore_h | 206 #endif // DOMDataStore_h |
OLD | NEW |