Index: Source/bindings/dart/DartHandleProxy.cpp |
diff --git a/Source/bindings/dart/DartHandleProxy.cpp b/Source/bindings/dart/DartHandleProxy.cpp |
index cbe2c15a53e2d6f47dc857c2cc43b8fa0dcdb5fe..78637cf5630c95bd4b1e3e6b09f074107f5931d9 100644 |
--- a/Source/bindings/dart/DartHandleProxy.cpp |
+++ b/Source/bindings/dart/DartHandleProxy.cpp |
@@ -31,6 +31,7 @@ |
#include "bindings/dart/DartHandleProxy.h" |
#include "DartNode.h" |
+#include "bindings/dart/DartJsInterop.h" |
#include "bindings/dart/DartScriptValue.h" |
#include "bindings/dart/V8Converter.h" |
#include "bindings/v8/PageScriptDebugServer.h" |
@@ -1124,11 +1125,10 @@ v8::Handle<v8::Value> DartHandleProxy::createLocalScopeProxy(Dart_Handle localVa |
v8::Handle<v8::Value> DartHandleProxy::evaluate(Dart_Handle target, Dart_Handle expression, Dart_Handle localVariables) |
{ |
+ DartDOMData* domData = DartDOMData::current(); |
+ ASSERT(domData); |
ASSERT(Dart_IsList(localVariables) || Dart_IsNull(localVariables)); |
- intptr_t localVariablesLength = 0; |
- Dart_ListLength(localVariables, &localVariablesLength); |
- Dart_Handle wrapExpressionArgs[2] = { expression, localVariables }; |
Dart_Handle exception = 0; |
bool ret = DartUtilities::dartToBool(DartUtilities::invokeUtilsMethod("isJsExpression", 1, &expression), exception); |
ASSERT(!exception); |
@@ -1142,6 +1142,53 @@ v8::Handle<v8::Value> DartHandleProxy::evaluate(Dart_Handle target, Dart_Handle |
return result; |
} |
+ bool expectsConsoleApi = DartUtilities::dartToBool(DartUtilities::invokeUtilsMethod("expectsConsoleApi", 1, &expression), exception); |
+ ASSERT(!exception); |
+ Dart_Handle commandLineApi; |
+ if (expectsConsoleApi) { |
+ // Vector of local variables and injected console variables. |
+ Vector<Dart_Handle> locals; |
+ if (Dart_IsList(localVariables)) { |
+ DartUtilities::extractListElements(localVariables, exception, locals); |
+ ASSERT(!exception); |
+ } |
+ // Use JsInterop to proxy all properties and functions defined by |
+ // window.console._commandLineAPI |
+ v8::Handle<v8::Value> v8Console = v8::Context::GetCurrent()->Global()->Get(v8::String::NewSymbol("console")); |
+ if (v8Console->IsObject()) { |
+ v8::Handle<v8::Value> commandLineApiValue = v8Console.As<v8::Object>()->Get(v8::String::NewSymbol("_commandLineAPI")); |
+ if (commandLineApiValue->IsObject()) { |
+ v8::Handle<v8::Object> commandLineApi = commandLineApiValue.As<v8::Object>(); |
+ v8::Local<v8::Array> propertyNames = commandLineApi->GetOwnPropertyNames(); |
+ uint32_t length = propertyNames->Length(); |
+ for (uint32_t i = 0; i < length; i++) { |
+ v8::Handle<v8::String> propertyName = propertyNames->Get(i).As<v8::String>(); |
+ ASSERT(!propertyNames.IsEmpty()); |
+ v8::Handle<v8::Value> propertyValue = commandLineApi->Get(propertyName); |
+ |
+ Dart_Handle dartValue; |
+ if (propertyValue->IsFunction()) { |
+ dartValue = JsInterop::toDart(propertyValue); |
+ // We need to wrap the JsFunction object we get back |
+ // from the vanila JsInterop library so that users can |
+ // call it like a normal Dart function instead of |
+ // having to use the apply method. |
+ dartValue = Dart_Invoke(domData->jsLibrary(), Dart_NewStringFromCString("_wrapAsDebuggerVarArgsFunction"), 1, &dartValue); |
+ } else { |
+ dartValue = JsInterop::toDart(propertyValue); |
+ } |
+ locals.append(V8Converter::stringToDart(propertyName)); |
+ locals.append(dartValue); |
+ } |
+ } |
+ } |
+ localVariables = DartUtilities::toList(locals, exception); |
+ ASSERT(!exception); |
+ } else { |
+ commandLineApi = Dart_Null(); |
+ } |
+ |
+ Dart_Handle wrapExpressionArgs[2] = { expression, localVariables }; |
Dart_Handle wrappedExpressionTuple = |
DartUtilities::invokeUtilsMethod("wrapExpressionAsClosure", 2, wrapExpressionArgs); |
ASSERT(Dart_IsList(wrappedExpressionTuple)); |