Chromium Code Reviews| Index: Source/bindings/v8/SerializedScriptValue.cpp |
| diff --git a/Source/bindings/v8/SerializedScriptValue.cpp b/Source/bindings/v8/SerializedScriptValue.cpp |
| index ffc9855c63085c8c082cac375aeb3541ef540d08..651b53738e6b804b782aa2aac7408b3e21a617d6 100644 |
| --- a/Source/bindings/v8/SerializedScriptValue.cpp |
| +++ b/Source/bindings/v8/SerializedScriptValue.cpp |
| @@ -2331,12 +2331,21 @@ SerializedScriptValue::SerializedScriptValue() |
| { |
| } |
| -inline void neuterBinding(ArrayBuffer* object) |
| +static void neuterArrayBufferInAllWorlds(ArrayBuffer* object) |
| { |
| v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| - Vector<DOMDataStore*>& allStores = V8PerIsolateData::from(isolate)->allStores(); |
| - for (size_t i = 0; i < allStores.size(); i++) { |
| - v8::Handle<v8::Object> wrapper = allStores[i]->get<V8ArrayBuffer>(object, isolate); |
|
haraken
2014/02/27 05:00:51
This CL keeps the current behavior, but I don't fu
dcarney
2014/02/27 07:20:51
the arraybuffer might only exist in one world, but
|
| + if (isMainThread()) { |
| + Vector<RefPtr<DOMWrapperWorld> > worlds; |
| + DOMWrapperWorld::allWorldsInMainThread(worlds); |
| + for (size_t i = 0; i < worlds.size(); i++) { |
| + v8::Handle<v8::Object> wrapper = worlds[i]->domDataStore().get<V8ArrayBuffer>(object, isolate); |
| + if (!wrapper.IsEmpty()) { |
| + ASSERT(wrapper->IsArrayBuffer()); |
| + v8::Handle<v8::ArrayBuffer>::Cast(wrapper)->Neuter(); |
| + } |
| + } |
| + } else { |
| + v8::Handle<v8::Object> wrapper = DOMWrapperWorld::current(isolate)->domDataStore().get<V8ArrayBuffer>(object, isolate); |
| if (!wrapper.IsEmpty()) { |
| ASSERT(wrapper->IsArrayBuffer()); |
| v8::Handle<v8::ArrayBuffer>::Cast(wrapper)->Neuter(); |
| @@ -2369,7 +2378,7 @@ PassOwnPtr<SerializedScriptValue::ArrayBufferContentsArray> SerializedScriptValu |
| return nullptr; |
| } |
| - neuterBinding(arrayBuffers[i].get()); |
| + neuterArrayBufferInAllWorlds(arrayBuffers[i].get()); |
| } |
| return contents.release(); |
| } |