Chromium Code Reviews| Index: Source/bindings/dart/DartJsInterop.cpp |
| diff --git a/Source/bindings/dart/DartJsInterop.cpp b/Source/bindings/dart/DartJsInterop.cpp |
| index ba91725a100f51edf6d2faf6e136f438f1d9ab7d..8cd32434c8c7e3baf28eeae0a450a419bc099447 100644 |
| --- a/Source/bindings/dart/DartJsInterop.cpp |
| +++ b/Source/bindings/dart/DartJsInterop.cpp |
| @@ -80,23 +80,27 @@ static void functionInvocationCallback(const v8::FunctionCallbackInfo<v8::Value> |
| DartDOMData* domData = DartDOMData::current(); |
| ASSERT(domData); |
| ASSERT(DartUtilities::isFunction(domData, handle)); |
| - |
| - Vector<Dart_Handle> dartFunctionArgs; |
| ASSERT(args.Length() == 1 || args.Length() == 2); |
| + |
| + v8::Local<v8::Array> argsList = args[args.Length()-1].As<v8::Array>(); |
| + uint32_t argsListLength = argsList->Length(); |
| + Dart_Handle dartFunctionArgs; |
| + uint32_t offset = 0; |
| // If there is 1 argument, we assume it is a v8:Array or arguments, if |
| // there are 2 arguments, the first argument is "this" and the second |
| // argument is an array of arguments. |
| - if (args.Length() > 1) { |
| - dartFunctionArgs.append(JsInterop::toDart(args[0])); |
| + if (args.Length() == 1) { |
| + dartFunctionArgs = Dart_NewList(argsListLength); |
| + } else { |
| + dartFunctionArgs = Dart_NewList(argsListLength + 1); |
| + Dart_ListSetAt(dartFunctionArgs, offset++, JsInterop::toDart(args[0])); |
| } |
| - v8::Local<v8::Array> argsList = args[args.Length()-1].As<v8::Array>(); |
| - uint32_t argsListLength = argsList->Length(); |
| for (uint32_t i = 0; i < argsListLength; i++) { |
| - dartFunctionArgs.append(JsInterop::toDart(argsList->Get(i))); |
| + 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
|
| } |
| - setJsReturnValue(domData, args, Dart_InvokeClosure(handle, dartFunctionArgs.size(), dartFunctionArgs.data())); |
| + setJsReturnValue(domData, args, Dart_InvokeClosure(handle, 1, &dartFunctionArgs)); |
| } |
| static v8::Local<v8::ObjectTemplate> setupInstanceTemplate(v8::Local<v8::FunctionTemplate> proxyTemplate) |
| @@ -221,7 +225,11 @@ v8::Local<v8::Value> JsInterop::fromDart(DartDOMData* domData, Dart_Handle handl |
| DartHandleProxy::writePointerToProxy(functionProxy, handle); |
| // The raw functionProxy doesn't behave enough like a true JS function |
| // so we wrap it in a true JS function. |
| - return domData->jsInteropData()->wrapDartFunction()->Call(functionProxy, 0, 0); |
| + v8::Local<v8::Function> jsFunction = v8::Local<v8::Function>::Cast(domData->jsInteropData()->wrapDartFunction()->Call(functionProxy, 0, 0)); |
| + DartHandleProxy::writePointerToProxy(jsFunction, handle); |
| + v8::Isolate* v8Isolate = v8::Isolate::GetCurrent(); |
| + jsFunction->SetHiddenValue(v8::String::NewFromUtf8(v8Isolate, "dartProxy"), v8::Boolean::New(v8Isolate, true)); |
| + return jsFunction; |
| } |
| v8::Local<v8::Object> proxy; |
| @@ -260,11 +268,7 @@ Dart_Handle JsInterop::toDart(v8::Local<v8::Value> v8Handle) |
| if (handle) |
| return handle; |
| - // Unwrap objects passed from Dart to JS that are being passed back to |
| - // Dart. FIXME: we do not yet handle unwrapping JS functions passed |
| - // from Dart to JS as we have to wrap them with true JS Function objects. |
| - // If this use case is important we can support it at the cost of hanging |
| - // an extra expando off the JS function wrapping the Dart function. |
| + // Unwrap objects passed from Dart to JS that are being passed back to Dart. |
| if (DartHandleProxy::isDartProxy(v8Handle)) { |
| DartScriptValue* scriptValue = DartHandleProxy::readPointerFromProxy(v8Handle); |
| ASSERT(scriptValue->isIsolateAlive()); |