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

Side by Side Diff: Source/bindings/dart/DartJsInterop.cpp

Issue 231743006: Run Dart closures invoked from JS in the correct Zone Base URL: svn://svn.chromium.org/blink/branches/dart/1847
Patch Set: DO NOT SUBMIT: Non-working fix for round-trip functions Created 6 years, 8 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 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 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 } 73 }
74 } 74 }
75 75
76 static void functionInvocationCallback(const v8::FunctionCallbackInfo<v8::Value> & args) 76 static void functionInvocationCallback(const v8::FunctionCallbackInfo<v8::Value> & args)
77 { 77 {
78 DartScopes scopes(args.Holder()); 78 DartScopes scopes(args.Holder());
79 Dart_Handle handle = scopes.handle; 79 Dart_Handle handle = scopes.handle;
80 DartDOMData* domData = DartDOMData::current(); 80 DartDOMData* domData = DartDOMData::current();
81 ASSERT(domData); 81 ASSERT(domData);
82 ASSERT(DartUtilities::isFunction(domData, handle)); 82 ASSERT(DartUtilities::isFunction(domData, handle));
83 ASSERT(args.Length() == 1 || args.Length() == 2);
83 84
84 Vector<Dart_Handle> dartFunctionArgs; 85 v8::Local<v8::Array> argsList = args[args.Length()-1].As<v8::Array>();
85 ASSERT(args.Length() == 1 || args.Length() == 2); 86 uint32_t argsListLength = argsList->Length();
87 Dart_Handle dartFunctionArgs;
88 uint32_t offset = 0;
86 // If there is 1 argument, we assume it is a v8:Array or arguments, if 89 // If there is 1 argument, we assume it is a v8:Array or arguments, if
87 // there are 2 arguments, the first argument is "this" and the second 90 // there are 2 arguments, the first argument is "this" and the second
88 // argument is an array of arguments. 91 // argument is an array of arguments.
89 if (args.Length() > 1) { 92 if (args.Length() == 1) {
90 dartFunctionArgs.append(JsInterop::toDart(args[0])); 93 dartFunctionArgs = Dart_NewList(argsListLength);
94 } else {
95 dartFunctionArgs = Dart_NewList(argsListLength + 1);
96 Dart_ListSetAt(dartFunctionArgs, offset++, JsInterop::toDart(args[0]));
91 } 97 }
92 98
93 v8::Local<v8::Array> argsList = args[args.Length()-1].As<v8::Array>();
94 uint32_t argsListLength = argsList->Length();
95 for (uint32_t i = 0; i < argsListLength; i++) { 99 for (uint32_t i = 0; i < argsListLength; i++) {
96 dartFunctionArgs.append(JsInterop::toDart(argsList->Get(i))); 100 Dart_ListSetAt(dartFunctionArgs, i + offset, JsInterop::toDart(argsList- >Get(i)));
Jacob 2014/04/16 22:27:55 nit: keep the style consistent and replace i + off
97 } 101 }
98 102
99 setJsReturnValue(domData, args, Dart_InvokeClosure(handle, dartFunctionArgs. size(), dartFunctionArgs.data())); 103 setJsReturnValue(domData, args, Dart_InvokeClosure(handle, 1, &dartFunctionA rgs));
100 } 104 }
101 105
102 static v8::Local<v8::ObjectTemplate> setupInstanceTemplate(v8::Local<v8::Functio nTemplate> proxyTemplate) 106 static v8::Local<v8::ObjectTemplate> setupInstanceTemplate(v8::Local<v8::Functio nTemplate> proxyTemplate)
103 { 107 {
104 v8::Local<v8::ObjectTemplate> instanceTemplate = proxyTemplate->InstanceTemp late(); 108 v8::Local<v8::ObjectTemplate> instanceTemplate = proxyTemplate->InstanceTemp late();
105 instanceTemplate->SetInternalFieldCount(1); 109 instanceTemplate->SetInternalFieldCount(1);
106 return instanceTemplate; 110 return instanceTemplate;
107 } 111 }
108 112
109 static v8::Local<v8::FunctionTemplate> dartFunctionTemplate() 113 static v8::Local<v8::FunctionTemplate> dartFunctionTemplate()
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 if (!value.IsEmpty() || exception) 213 if (!value.IsEmpty() || exception)
210 return value; 214 return value;
211 215
212 if (DartDOMWrapper::subtypeOf(handle, JsObject::dartClassId)) { 216 if (DartDOMWrapper::subtypeOf(handle, JsObject::dartClassId)) {
213 JsObject* object = DartDOMWrapper::unwrapDartWrapper<JsObject>(domData, handle, exception); 217 JsObject* object = DartDOMWrapper::unwrapDartWrapper<JsObject>(domData, handle, exception);
214 if (exception) 218 if (exception)
215 return v8::Local<v8::Value>(); 219 return v8::Local<v8::Value>();
216 return object->localV8Object(); 220 return object->localV8Object();
217 } 221 }
218 222
219 if (DartUtilities::isFunction(domData, handle)) { 223 if (DartUtilities::isFunction(domData, handle)) {
Jacob 2014/04/16 22:27:55 add a TODO to remove this isFunction check and swi
220 v8::Local<v8::Object> functionProxy = dartFunctionTemplate()->InstanceTe mplate()->NewInstance(); 224 v8::Local<v8::Object> functionProxy = dartFunctionTemplate()->InstanceTe mplate()->NewInstance();
221 DartHandleProxy::writePointerToProxy(functionProxy, handle); 225 DartHandleProxy::writePointerToProxy(functionProxy, handle);
222 // The raw functionProxy doesn't behave enough like a true JS function 226 // The raw functionProxy doesn't behave enough like a true JS function
223 // so we wrap it in a true JS function. 227 // so we wrap it in a true JS function.
224 return domData->jsInteropData()->wrapDartFunction()->Call(functionProxy, 0, 0); 228 v8::Local<v8::Function> jsFunction = v8::Local<v8::Function>::Cast(domDa ta->jsInteropData()->wrapDartFunction()->Call(functionProxy, 0, 0));
229 DartHandleProxy::writePointerToProxy(jsFunction, handle);
230 v8::Isolate* v8Isolate = v8::Isolate::GetCurrent();
231 jsFunction->SetHiddenValue(v8::String::NewFromUtf8(v8Isolate, "dartProxy "), v8::Boolean::New(v8Isolate, true));
232 return jsFunction;
225 } 233 }
226 234
227 v8::Local<v8::Object> proxy; 235 v8::Local<v8::Object> proxy;
228 ASSERT(Dart_IsInstance(handle)); 236 ASSERT(Dart_IsInstance(handle));
229 proxy = dartObjectTemplate()->InstanceTemplate()->NewInstance(); 237 proxy = dartObjectTemplate()->InstanceTemplate()->NewInstance();
230 DartHandleProxy::writePointerToProxy(proxy, handle); 238 DartHandleProxy::writePointerToProxy(proxy, handle);
231 v8::Isolate* v8Isolate = v8::Isolate::GetCurrent(); 239 v8::Isolate* v8Isolate = v8::Isolate::GetCurrent();
232 proxy->SetHiddenValue(v8::String::NewFromUtf8(v8Isolate, "dartProxy"), v8::B oolean::New(v8Isolate, true)); 240 proxy->SetHiddenValue(v8::String::NewFromUtf8(v8Isolate, "dartProxy"), v8::B oolean::New(v8Isolate, true));
233 241
234 return proxy; 242 return proxy;
(...skipping 18 matching lines...) Expand all
253 return handle; 261 return handle;
254 262
255 ASSERT(v8Handle->IsObject()); 263 ASSERT(v8Handle->IsObject());
256 v8::Handle<v8::Object> object = v8Handle.As<v8::Object>(); 264 v8::Handle<v8::Object> object = v8Handle.As<v8::Object>();
257 Dart_Handle exception = 0; 265 Dart_Handle exception = 0;
258 handle = V8Converter::toDartIfBrowserNative(object, object->CreationContext( )->GetIsolate(), exception); 266 handle = V8Converter::toDartIfBrowserNative(object, object->CreationContext( )->GetIsolate(), exception);
259 ASSERT(!exception); 267 ASSERT(!exception);
260 if (handle) 268 if (handle)
261 return handle; 269 return handle;
262 270
263 // Unwrap objects passed from Dart to JS that are being passed back to 271 // Unwrap objects passed from Dart to JS that are being passed back to Dart.
264 // Dart. FIXME: we do not yet handle unwrapping JS functions passed
265 // from Dart to JS as we have to wrap them with true JS Function objects.
266 // If this use case is important we can support it at the cost of hanging
267 // an extra expando off the JS function wrapping the Dart function.
268 if (DartHandleProxy::isDartProxy(v8Handle)) { 272 if (DartHandleProxy::isDartProxy(v8Handle)) {
269 DartScriptValue* scriptValue = DartHandleProxy::readPointerFromProxy(v8H andle); 273 DartScriptValue* scriptValue = DartHandleProxy::readPointerFromProxy(v8H andle);
270 ASSERT(scriptValue->isIsolateAlive()); 274 ASSERT(scriptValue->isIsolateAlive());
271 return scriptValue->value(); 275 return scriptValue->value();
272 } 276 }
273 277
274 return JsObject::toDart(object); 278 return JsObject::toDart(object);
275 } 279 }
276 280
277 Dart_Handle JsObject::toDart(v8::Local<v8::Object> object) 281 Dart_Handle JsObject::toDart(v8::Local<v8::Object> object)
(...skipping 770 matching lines...) Expand 10 before | Expand all | Expand 10 after
1048 if (argumentCount == 1 && name == "JsArray_length") 1052 if (argumentCount == 1 && name == "JsArray_length")
1049 return JsInteropInternal::jsArrayLengthCallback; 1053 return JsInteropInternal::jsArrayLengthCallback;
1050 1054
1051 if (argumentCount == 1 && name == "JsObject_fromBrowserObject") 1055 if (argumentCount == 1 && name == "JsObject_fromBrowserObject")
1052 return JsInteropInternal::fromBrowserObjectCallback; 1056 return JsInteropInternal::fromBrowserObjectCallback;
1053 1057
1054 return 0; 1058 return 0;
1055 } 1059 }
1056 1060
1057 } 1061 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698