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

Unified Diff: chrome/renderer/render_view.cc

Issue 4924001: JavaScript to Value bridge. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix documentation. Created 10 years 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 | « chrome/common/render_messages_internal.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/renderer/render_view.cc
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 4282a04ca3d5a3d2b836345805558a746a26a51f..4e0b22ae9e57b14742b8af47cf864a3c9bbc1372 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -466,6 +466,39 @@ static bool WebAccessibilityNotificationToViewHostMsg(
return true;
}
+// Conversion for the incoming value. The map isn't perfect; v8 has Uint32,
+// and int64 which don't fit as Value::TYPE_INTEGER, so we let them fall into
+// being TYPE_REALs. Dates are converted to a string (which can then be parsed
+// into a base::Time), as are regexps. Arrays are converted into lists,
+// recursively. We don't deal with binary objects or functions - they become
+// null values.
+static Value* ConvertV8Value(const v8::Handle<v8::Value>& v8value) {
+ if (v8value->IsBoolean()) {
+ return Value::CreateBooleanValue(v8value->BooleanValue());
+ } else if (v8value->IsInt32()) {
+ return Value::CreateIntegerValue(v8value->Int32Value());
+ } else if (v8value->IsNumber()) {
+ return Value::CreateRealValue(v8value->NumberValue());
+ } else if (v8value->IsString()) {
+ return Value::CreateStringValue(*v8::String::Utf8Value(v8value));
+ } else if (v8value->IsDate()) {
+ v8::Date* date = v8::Date::Cast(*v8value);
+ return Value::CreateRealValue(date->NumberValue() / 1000.0);
+ } else if (v8value->IsRegExp()) {
+ return Value::CreateStringValue(
+ *v8::String::Utf8Value(v8value->ToString()));
+ } else if (v8value->IsArray()) {
+ v8::Array* array = v8::Array::Cast(*v8value);
+ uint32_t length = array->Length();
+ scoped_ptr<ListValue> list(new ListValue);
+ for (uint32_t i = 0 ; i < length ; ++i) {
+ list->Set(i, ConvertV8Value(array->Get(i)));
+ }
+ return list.release();
+ }
+ return Value::CreateNullValue();
+}
+
///////////////////////////////////////////////////////////////////////////////
int32 RenderView::next_page_id_ = 1;
@@ -4522,9 +4555,16 @@ void RenderView::EvaluateScript(const string16& frame_xpath,
if (web_frame)
result = web_frame->executeScriptAndReturnValue(WebScriptSource(script));
if (notify_result) {
- bool bool_result = !result.IsEmpty() && result->IsBoolean() ?
- result->BooleanValue() : false;
- Send(new ViewHostMsg_ScriptEvalResponse(routing_id_, id, bool_result));
+ ListValue list;
+ if (web_frame) {
+ v8::HandleScope handle_scope;
+ v8::Local<v8::Context> context = web_frame->mainWorldScriptContext();
+ v8::Context::Scope context_scope(context);
+ list.Set(0, ConvertV8Value(result));
+ } else {
+ list.Set(0, Value::CreateNullValue());
+ }
+ Send(new ViewHostMsg_ScriptEvalResponse(routing_id_, id, list));
}
}
« no previous file with comments | « chrome/common/render_messages_internal.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698