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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/common/render_messages_internal.h ('k') | 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 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/renderer/render_view.h" 5 #include "chrome/renderer/render_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 *type = ViewHostMsg_AccessibilityNotification_Params:: 459 *type = ViewHostMsg_AccessibilityNotification_Params::
460 NOTIFICATION_TYPE_SELECTED_TEXT_CHANGED; 460 NOTIFICATION_TYPE_SELECTED_TEXT_CHANGED;
461 break; 461 break;
462 default: 462 default:
463 // TODO(ctguil): Support additional webkit notifications. 463 // TODO(ctguil): Support additional webkit notifications.
464 return false; 464 return false;
465 } 465 }
466 return true; 466 return true;
467 } 467 }
468 468
469 // Conversion for the incoming value. The map isn't perfect; v8 has Uint32,
470 // and int64 which don't fit as Value::TYPE_INTEGER, so we let them fall into
471 // being TYPE_REALs. Dates are converted to a string (which can then be parsed
472 // into a base::Time), as are regexps. Arrays are converted into lists,
473 // recursively. We don't deal with binary objects or functions - they become
474 // null values.
475 static Value* ConvertV8Value(const v8::Handle<v8::Value>& v8value) {
476 if (v8value->IsBoolean()) {
477 return Value::CreateBooleanValue(v8value->BooleanValue());
478 } else if (v8value->IsInt32()) {
479 return Value::CreateIntegerValue(v8value->Int32Value());
480 } else if (v8value->IsNumber()) {
481 return Value::CreateRealValue(v8value->NumberValue());
482 } else if (v8value->IsString()) {
483 return Value::CreateStringValue(*v8::String::Utf8Value(v8value));
484 } else if (v8value->IsDate()) {
485 v8::Date* date = v8::Date::Cast(*v8value);
486 return Value::CreateRealValue(date->NumberValue() / 1000.0);
487 } else if (v8value->IsRegExp()) {
488 return Value::CreateStringValue(
489 *v8::String::Utf8Value(v8value->ToString()));
490 } else if (v8value->IsArray()) {
491 v8::Array* array = v8::Array::Cast(*v8value);
492 uint32_t length = array->Length();
493 scoped_ptr<ListValue> list(new ListValue);
494 for (uint32_t i = 0 ; i < length ; ++i) {
495 list->Set(i, ConvertV8Value(array->Get(i)));
496 }
497 return list.release();
498 }
499 return Value::CreateNullValue();
500 }
501
469 /////////////////////////////////////////////////////////////////////////////// 502 ///////////////////////////////////////////////////////////////////////////////
470 503
471 int32 RenderView::next_page_id_ = 1; 504 int32 RenderView::next_page_id_ = 1;
472 505
473 struct RenderView::PendingFileChooser { 506 struct RenderView::PendingFileChooser {
474 PendingFileChooser(const ViewHostMsg_RunFileChooser_Params& p, 507 PendingFileChooser(const ViewHostMsg_RunFileChooser_Params& p,
475 WebFileChooserCompletion* c) 508 WebFileChooserCompletion* c)
476 : params(p), 509 : params(p),
477 completion(c) { 510 completion(c) {
478 } 511 }
(...skipping 4036 matching lines...) Expand 10 before | Expand all | Expand 10 after
4515 4548
4516 void RenderView::EvaluateScript(const string16& frame_xpath, 4549 void RenderView::EvaluateScript(const string16& frame_xpath,
4517 const string16& script, 4550 const string16& script,
4518 int id, 4551 int id,
4519 bool notify_result) { 4552 bool notify_result) {
4520 v8::Handle<v8::Value> result; 4553 v8::Handle<v8::Value> result;
4521 WebFrame* web_frame = GetChildFrame(UTF16ToWideHack(frame_xpath)); 4554 WebFrame* web_frame = GetChildFrame(UTF16ToWideHack(frame_xpath));
4522 if (web_frame) 4555 if (web_frame)
4523 result = web_frame->executeScriptAndReturnValue(WebScriptSource(script)); 4556 result = web_frame->executeScriptAndReturnValue(WebScriptSource(script));
4524 if (notify_result) { 4557 if (notify_result) {
4525 bool bool_result = !result.IsEmpty() && result->IsBoolean() ? 4558 ListValue list;
4526 result->BooleanValue() : false; 4559 if (web_frame) {
4527 Send(new ViewHostMsg_ScriptEvalResponse(routing_id_, id, bool_result)); 4560 v8::HandleScope handle_scope;
4561 v8::Local<v8::Context> context = web_frame->mainWorldScriptContext();
4562 v8::Context::Scope context_scope(context);
4563 list.Set(0, ConvertV8Value(result));
4564 } else {
4565 list.Set(0, Value::CreateNullValue());
4566 }
4567 Send(new ViewHostMsg_ScriptEvalResponse(routing_id_, id, list));
4528 } 4568 }
4529 } 4569 }
4530 4570
4531 void RenderView::InsertCSS(const std::wstring& frame_xpath, 4571 void RenderView::InsertCSS(const std::wstring& frame_xpath,
4532 const std::string& css, 4572 const std::string& css,
4533 const std::string& id) { 4573 const std::string& id) {
4534 WebFrame* web_frame = GetChildFrame(frame_xpath); 4574 WebFrame* web_frame = GetChildFrame(frame_xpath);
4535 if (!web_frame) 4575 if (!web_frame)
4536 return; 4576 return;
4537 4577
(...skipping 1137 matching lines...) Expand 10 before | Expand all | Expand 10 after
5675 external_popup_menu_.reset(); 5715 external_popup_menu_.reset();
5676 } 5716 }
5677 #endif 5717 #endif
5678 5718
5679 void RenderView::AddErrorToRootConsole(const string16& message) { 5719 void RenderView::AddErrorToRootConsole(const string16& message) {
5680 if (webview() && webview()->mainFrame()) { 5720 if (webview() && webview()->mainFrame()) {
5681 webview()->mainFrame()->addMessageToConsole( 5721 webview()->mainFrame()->addMessageToConsole(
5682 WebConsoleMessage(WebConsoleMessage::LevelError, message)); 5722 WebConsoleMessage(WebConsoleMessage::LevelError, message));
5683 } 5723 }
5684 } 5724 }
OLDNEW
« 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