| Index: Source/bindings/dart/DartJsInterop.cpp
|
| diff --git a/Source/bindings/dart/DartJsInterop.cpp b/Source/bindings/dart/DartJsInterop.cpp
|
| index c5f76d18385d553683fdf052cc0672a095a71090..df1b167c19f48e78c935c1fdbf8839156b01ec05 100644
|
| --- a/Source/bindings/dart/DartJsInterop.cpp
|
| +++ b/Source/bindings/dart/DartJsInterop.cpp
|
| @@ -231,6 +231,8 @@ v8::Local<v8::Value> JsInterop::fromDart(DartDOMData* domData, Dart_Handle handl
|
| ASSERT(Dart_IsInstance(handle));
|
| proxy = dartObjectTemplate()->InstanceTemplate()->NewInstance();
|
| DartHandleProxy::writePointerToProxy(proxy, handle);
|
| + proxy->SetHiddenValue(v8::String::NewSymbol("dartProxy"), v8::Boolean::New(true));
|
| +
|
| return proxy;
|
| }
|
|
|
| @@ -265,7 +267,7 @@ Dart_Handle JsInterop::toDart(v8::Local<v8::Value> v8Handle)
|
| // 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.
|
| - if (dartObjectTemplate()->HasInstance(v8Handle)) {
|
| + if (DartHandleProxy::isDartProxy(v8Handle)) {
|
| DartScriptValue* scriptValue = DartHandleProxy::readPointerFromProxy(v8Handle);
|
| ASSERT(scriptValue->isIsolateAlive());
|
| return scriptValue->value();
|
| @@ -338,6 +340,23 @@ void argsListToV8(DartDOMData* domData, Dart_Handle args, Vector<v8::Local<v8::V
|
| }
|
| }
|
|
|
| +void argsListToV8DebuggerOnly(DartDOMData* domData, Dart_Handle args, Vector<v8::Local<v8::Value> >* v8Args, Dart_Handle& exception)
|
| +{
|
| + if (Dart_IsNull(args))
|
| + return;
|
| +
|
| + if (!Dart_IsList(args)) {
|
| + exception = Dart_NewStringFromCString("args not type list");
|
| + return;
|
| + }
|
| +
|
| + intptr_t argsLength = 0;
|
| + Dart_ListLength(args, &argsLength);
|
| + for (intptr_t i = 0; i < argsLength; i++) {
|
| + v8Args->append(DartHandleProxy::create(Dart_ListGetAt(args, i)));
|
| + }
|
| +}
|
| +
|
| static void jsObjectConstructorCallback(Dart_NativeArguments args)
|
| {
|
| Dart_Handle exception = 0;
|
| @@ -693,6 +712,46 @@ fail:
|
| ASSERT_NOT_REACHED();
|
| }
|
|
|
| +static void applyDebuggerOnlyCallback(Dart_NativeArguments args)
|
| +{
|
| + Dart_Handle exception = 0;
|
| + {
|
| + JsInteropScopes scopes(args);
|
| + DartDOMData* domData = static_cast<DartDOMData*>(Dart_GetNativeIsolateData(args));
|
| + JsFunction* receiver = DartDOMWrapper::receiver<JsFunction>(args);
|
| +
|
| + Vector<v8::Local<v8::Value> > v8Args;
|
| + argsListToV8DebuggerOnly(domData, Dart_GetNativeArgument(args, 1), &v8Args, exception);
|
| + if (exception)
|
| + goto fail;
|
| +
|
| + v8::Local<v8::Value> thisArg;
|
| + Dart_Handle thisArgDart = Dart_GetNativeArgument(args, 2);
|
| + if (Dart_IsNull(thisArgDart)) {
|
| + // Use the global v8 object if no Dart thisArg was passed in.
|
| + thisArg = DartUtilities::currentV8Context()->Global();
|
| + } else {
|
| + thisArg = JsInterop::fromDart(domData, thisArgDart, exception);
|
| + if (exception)
|
| + goto fail;
|
| + if (!thisArg->IsObject()) {
|
| + exception = Dart_NewStringFromCString("thisArg is not an object");
|
| + goto fail;
|
| + }
|
| + }
|
| +
|
| + v8::Local<v8::Value> ret = V8ScriptRunner::callFunction(receiver->localV8Function(), DartUtilities::scriptExecutionContext(), thisArg.As<v8::Object>(), v8Args.size(), v8Args.data());
|
| + if (scopes.handleJsException(&exception))
|
| + goto fail;
|
| + scopes.setReturnValue(ret);
|
| + return;
|
| + }
|
| +
|
| +fail:
|
| + Dart_ThrowException(exception);
|
| + ASSERT_NOT_REACHED();
|
| +}
|
| +
|
| static void toStringCallback(Dart_NativeArguments args)
|
| {
|
| Dart_Handle exception = 0;
|
| @@ -899,6 +958,9 @@ Dart_NativeFunction JsInterop::resolver(Dart_Handle nameHandle, int argumentCoun
|
| if (argumentCount == 3 && name == "JsFunction_apply")
|
| return JsInteropInternal::applyCallback;
|
|
|
| + if (argumentCount == 3 && name == "JsFunction_applyDebuggerOnly")
|
| + return JsInteropInternal::applyDebuggerOnlyCallback;
|
| +
|
| if (argumentCount == 1 && name == "JsObject_fromBrowserObject")
|
| return JsInteropInternal::fromBrowserObjectCallback;
|
|
|
|
|