Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Unified Diff: Source/bindings/dart/DartScriptWrappable.h

Issue 313183003: [dartium] Use ScriptWrappable when there are multiple Dart wrappers. (Closed) Base URL: svn://svn.chromium.org/blink/branches/dart/1985
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/bindings/dart/DartDOMWrapper.h ('k') | Source/bindings/dart/custom/DartWindowCustom.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
}
}
« no previous file with comments | « Source/bindings/dart/DartDOMWrapper.h ('k') | Source/bindings/dart/custom/DartWindowCustom.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698