Index: Source/bindings/dart/DartScriptWrappable.h |
diff --git a/Source/bindings/dart/DartScriptWrappable.h b/Source/bindings/dart/DartScriptWrappable.h |
index d48275a94c5fb9936160ab9b0c2633da7ea25269..7280c443745ea2f82ecbabb2fd5988ea2dd50b79 100644 |
--- a/Source/bindings/dart/DartScriptWrappable.h |
+++ b/Source/bindings/dart/DartScriptWrappable.h |
@@ -75,15 +75,33 @@ void ScriptWrappable::setDartWrapper(void* domData, void* wrapper) |
} else if (m_wrapperOrTypeInfo.isDartWrapperInfo()) { |
DartWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartWrapperInfo(); |
if (wrapperInfo->domData == domData) { |
- // Replace the current wrapper (e.g., upgrading a custom element). |
+ // Replace the current wrapper. |
wrapperInfo->wrapper = wrapper; |
} else { |
- // Inflate to a multiwrapper, unimplemented. |
+ // Inflate to a multiwrapper. |
+ DartMultiWrapperInfo* multiWrapperInfo = new DartMultiWrapperInfo; |
+ multiWrapperInfo->v8WrapperOrTypeInfo = wrapperInfo->v8WrapperOrTypeInfo; |
+ multiWrapperInfo->domDatas.append(wrapperInfo->domData); |
+ multiWrapperInfo->wrappers.append(wrapperInfo->wrapper); |
+ multiWrapperInfo->domDatas.append(domData); |
+ multiWrapperInfo->wrappers.append(wrapper); |
+ m_wrapperOrTypeInfo = TaggedPointer(multiWrapperInfo); |
+ delete wrapperInfo; |
} |
} else { |
ASSERT(m_wrapperOrTypeInfo.isDartMultiWrapperInfo()); |
- // Replace or append wrapper, unimplemented. |
- ASSERT_NOT_REACHED(); |
+ DartMultiWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartMultiWrapperInfo(); |
+ size_t len = wrapperInfo->domDatas.size(); |
+ for (size_t i = 0; i < len; i++) { |
+ if (wrapperInfo->domDatas.at(i) == domData) { |
+ // Replace the current wrapper. |
+ wrapperInfo->wrappers[i] = wrapper; |
+ return; |
+ } |
+ } |
+ // Append wrapper for new isolate. |
+ wrapperInfo->domDatas.append(domData); |
+ wrapperInfo->wrappers.append(wrapper); |
} |
} |
@@ -99,9 +117,10 @@ void* ScriptWrappable::getDartWrapper(void* domData) const |
} |
if (m_wrapperOrTypeInfo.isDartMultiWrapperInfo()) { |
DartMultiWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartMultiWrapperInfo(); |
- for (unsigned i = 0; i < wrapperInfo->domDatas.size(); ++i) { |
- if (wrapperInfo->domDatas.at(i) == domData) { |
- return wrapperInfo->wrappers.at(i); |
+ size_t len = wrapperInfo->domDatas.size(); |
+ for (size_t i = 0; i < len; ++i) { |
+ if (wrapperInfo->domDatas[i] == domData) { |
+ return wrapperInfo->wrappers[i]; |
} |
} |
return 0; |
@@ -114,22 +133,38 @@ void ScriptWrappable::clearDartWrapper(void* domData, void* wrapper) |
{ |
if (LIKELY(m_wrapperOrTypeInfo.isDartWrapperInfo())) { |
DartWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartWrapperInfo(); |
- // FIXMEDART: Replace conditional with assert when wrappers for multiple isolates are implemented. |
- if (domData == wrapperInfo->domData) { |
+ ASSERT(domData == wrapperInfo->domData); |
#ifdef DEBUG |
- DartApiScope scope; |
- ASSERT(Dart_IdentityEquals((Dart_Handle)wrapper, (Dart_Handle)wrapperInfo->wrapper)); |
+ DartApiScope scope; |
+ ASSERT(Dart_IdentityEquals((Dart_Handle)wrapper, (Dart_Handle)wrapperInfo->wrapper)); |
#endif |
- m_wrapperOrTypeInfo = wrapperInfo->v8WrapperOrTypeInfo; |
- delete wrapperInfo; |
- } |
+ m_wrapperOrTypeInfo = wrapperInfo->v8WrapperOrTypeInfo; |
+ delete wrapperInfo; |
} else if (m_wrapperOrTypeInfo.isDartMultiWrapperInfo()) { |
- // Remove or deflate, unimplemented. |
+ // Remove. |
+ DartMultiWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartMultiWrapperInfo(); |
+ size_t len = wrapperInfo->domDatas.size(); |
+ for (size_t i = 0; i < len; i++) { |
+ if (wrapperInfo->domDatas[i] == domData) { |
+#ifdef DEBUG |
+ DartApiScope scope; |
+ ASSERT(Dart_IdentityEquals((Dart_Handle)wrapper, (Dart_Handle)wrapperInfo->wrapper)); |
+#endif |
+ wrapperInfo->domDatas.remove(i); |
+ wrapperInfo->wrappers.remove(i); |
+ if (len == 1) { |
+ // All Dart wrappers have been deleted: deflate to just a V8 wrapper or type info. |
+ m_wrapperOrTypeInfo = wrapperInfo->v8WrapperOrTypeInfo; |
+ delete wrapperInfo; |
+ } |
+ return; |
+ } |
+ } |
+ // Could not find wrapper. |
ASSERT_NOT_REACHED(); |
} else { |
- // Already clear. |
- // FIXMEDART: Uncomment assert when wrappers for multiple isolates are implemented. |
- // ASSERT_NOT_REACHED(); |
+ // No Dart wrappers. |
+ ASSERT_NOT_REACHED(); |
} |
} |