diff options
author | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-20 21:28:10 +0000 |
---|---|---|
committer | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-20 21:28:10 +0000 |
commit | b1cf337a2722a4c24802b78258ea96e8e8d00276 (patch) | |
tree | c473a077154b97d23c781736aece0b1f847803af /chrome/renderer/extensions | |
parent | 25c171129de0c3da8fa5e45be90335f07c06a20a (diff) | |
download | chromium_src-b1cf337a2722a4c24802b78258ea96e8e8d00276.zip chromium_src-b1cf337a2722a4c24802b78258ea96e8e8d00276.tar.gz chromium_src-b1cf337a2722a4c24802b78258ea96e8e8d00276.tar.bz2 |
Add V8ValueConverter utility to convert between v8::Value and
base::Value.
BUG=
TEST=
Review URL: http://codereview.chromium.org/6882054
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@82358 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/extensions')
-rw-r--r-- | chrome/renderer/extensions/chrome_app_bindings.cc | 21 | ||||
-rw-r--r-- | chrome/renderer/extensions/event_bindings.cc | 20 | ||||
-rw-r--r-- | chrome/renderer/extensions/event_bindings.h | 5 | ||||
-rw-r--r-- | chrome/renderer/extensions/extension_dispatcher.cc | 2 | ||||
-rw-r--r-- | chrome/renderer/extensions/extension_helper.cc | 4 | ||||
-rw-r--r-- | chrome/renderer/extensions/renderer_extension_bindings.cc | 63 | ||||
-rw-r--r-- | chrome/renderer/extensions/renderer_extension_bindings.h | 10 |
7 files changed, 32 insertions, 93 deletions
diff --git a/chrome/renderer/extensions/chrome_app_bindings.cc b/chrome/renderer/extensions/chrome_app_bindings.cc index aafa672..5c760dd 100644 --- a/chrome/renderer/extensions/chrome_app_bindings.cc +++ b/chrome/renderer/extensions/chrome_app_bindings.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -16,6 +16,7 @@ #include "chrome/renderer/extensions/extension_dispatcher.h" #include "chrome/renderer/extensions/extension_helper.h" #include "content/renderer/render_view.h" +#include "content/renderer/v8_value_converter.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" #include "v8/include/v8.h" @@ -71,14 +72,8 @@ class ChromeAppExtensionWrapper : public v8::Extension { " native function GetDetailsForFrame();" " this.__defineGetter__('isInstalled', GetIsInstalled);" " this.install = Install;" - " this.getDetails = function() {" - " var json = GetDetails();" - " return json == null ? null : JSON.parse(json);" - " };" - " this.getDetailsForFrame = function(frame) {" - " var json = GetDetailsForFrame(frame);" - " return json == null ? null : JSON.parse(json);" - " };" + " this.getDetails = GetDetails;" + " this.getDetailsForFrame = GetDetailsForFrame;" " };" "}") { extension_dispatcher_ = extension_dispatcher; @@ -169,14 +164,12 @@ class ChromeAppExtensionWrapper : public v8::Extension { if (!extension) return v8::Null(); - std::string manifest_json; - const bool kPrettyPrint = false; scoped_ptr<DictionaryValue> manifest_copy( extension->manifest_value()->DeepCopy()); manifest_copy->SetString("id", extension->id()); - base::JSONWriter::Write(manifest_copy.get(), kPrettyPrint, &manifest_json); - - return v8::String::New(manifest_json.c_str(), manifest_json.size()); + V8ValueConverter converter; + return converter.ToV8Value(manifest_copy.get(), + frame->mainWorldScriptContext()); } static ExtensionDispatcher* extension_dispatcher_; diff --git a/chrome/renderer/extensions/event_bindings.cc b/chrome/renderer/extensions/event_bindings.cc index 921a82e..01d0f55 100644 --- a/chrome/renderer/extensions/event_bindings.cc +++ b/chrome/renderer/extensions/event_bindings.cc @@ -4,6 +4,8 @@ #include "chrome/renderer/extensions/event_bindings.h" +#include <vector> + #include "base/basictypes.h" #include "base/lazy_instance.h" #include "base/message_loop.h" @@ -17,6 +19,7 @@ #include "chrome/renderer/extensions/js_only_v8_extensions.h" #include "content/renderer/render_thread.h" #include "content/renderer/render_view.h" +#include "content/renderer/v8_value_converter.h" #include "googleurl/src/gurl.h" #include "grit/renderer_resources.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h" @@ -382,14 +385,17 @@ void EventBindings::HandleContextDestroyed(WebFrame* frame) { // static void EventBindings::CallFunction(const std::string& extension_id, const std::string& function_name, - int argc, v8::Handle<v8::Value>* argv, + const ListValue& arguments, RenderView* render_view, const GURL& event_url) { + v8::HandleScope handle_scope; + // We copy the context list, because calling into javascript may modify it // out from under us. We also guard against deleted contexts by checking if // they have been cleared first. ContextList contexts = GetContexts(); + V8ValueConverter converter; for (ContextList::iterator it = contexts.begin(); it != contexts.end(); ++it) { if (render_view && render_view != (*it)->render_view) @@ -404,8 +410,16 @@ void EventBindings::CallFunction(const std::string& extension_id, if (!HasSufficientPermissions(it->get(), event_url)) continue; - v8::Handle<v8::Value> retval = CallFunctionInContext((*it)->context, - function_name, argc, argv); + v8::Local<v8::Context> context(*((*it)->context)); + std::vector<v8::Handle<v8::Value> > v8_arguments; + for (size_t i = 0; i < arguments.GetSize(); ++i) { + Value* item = NULL; + CHECK(arguments.Get(i, &item)); + v8_arguments.push_back(converter.ToV8Value(item, context)); + } + + v8::Handle<v8::Value> retval = CallFunctionInContext( + context, function_name, v8_arguments.size(), &v8_arguments[0]); // In debug, the js will validate the event parameters and return a // string if a validation error has occured. // TODO(rafaelw): Consider only doing this check if function_name == diff --git a/chrome/renderer/extensions/event_bindings.h b/chrome/renderer/extensions/event_bindings.h index 893e3a6..59d26e6 100644 --- a/chrome/renderer/extensions/event_bindings.h +++ b/chrome/renderer/extensions/event_bindings.h @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -12,6 +12,7 @@ class ExtensionDispatcher; class GURL; +class ListValue; class RenderThreadBase; class RenderView; @@ -45,7 +46,7 @@ class EventBindings { // v8::Undefined(). A DCHECK is setup to break if it is otherwise. static void CallFunction(const std::string& extension_id, const std::string& function_name, - int argc, v8::Handle<v8::Value>* argv, + const ListValue& arguments, RenderView* render_view, const GURL& event_url); }; diff --git a/chrome/renderer/extensions/extension_dispatcher.cc b/chrome/renderer/extensions/extension_dispatcher.cc index 2d789ac..c1f2a6e 100644 --- a/chrome/renderer/extensions/extension_dispatcher.cc +++ b/chrome/renderer/extensions/extension_dispatcher.cc @@ -124,7 +124,7 @@ void ExtensionDispatcher::OnMessageInvoke(const std::string& extension_id, const std::string& function_name, const ListValue& args, const GURL& event_url) { - RendererExtensionBindings::Invoke( + EventBindings::CallFunction( extension_id, function_name, args, NULL, event_url); // Reset the idle handler each time there's any activity like event or message diff --git a/chrome/renderer/extensions/extension_helper.cc b/chrome/renderer/extensions/extension_helper.cc index 691e7cb..bbe638b 100644 --- a/chrome/renderer/extensions/extension_helper.cc +++ b/chrome/renderer/extensions/extension_helper.cc @@ -12,9 +12,9 @@ #include "chrome/common/extensions/extension_messages.h" #include "chrome/common/render_messages.h" #include "chrome/common/url_constants.h" +#include "chrome/renderer/extensions/event_bindings.h" #include "chrome/renderer/extensions/extension_dispatcher.h" #include "chrome/renderer/extensions/extension_process_bindings.h" -#include "chrome/renderer/extensions/renderer_extension_bindings.h" #include "chrome/renderer/extensions/user_script_idle_scheduler.h" #include "chrome/renderer/extensions/user_script_slave.h" #include "content/common/json_value_serializer.h" @@ -182,7 +182,7 @@ void ExtensionHelper::OnExtensionMessageInvoke(const std::string& extension_id, const std::string& function_name, const ListValue& args, const GURL& event_url) { - RendererExtensionBindings::Invoke( + EventBindings::CallFunction( extension_id, function_name, args, render_view(), event_url); } diff --git a/chrome/renderer/extensions/renderer_extension_bindings.cc b/chrome/renderer/extensions/renderer_extension_bindings.cc index d9507b5..3d9784a 100644 --- a/chrome/renderer/extensions/renderer_extension_bindings.cc +++ b/chrome/renderer/extensions/renderer_extension_bindings.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,7 +9,6 @@ #include "base/basictypes.h" #include "base/lazy_instance.h" -#include "base/values.h" #include "chrome/common/extensions/extension_message_bundle.h" #include "chrome/common/extensions/extension_messages.h" #include "chrome/common/url_constants.h" @@ -245,51 +244,6 @@ class ExtensionImpl : public ExtensionBase { } }; -// Convert a ListValue to a vector of V8 values. -static std::vector< v8::Handle<v8::Value> > ListValueToV8( - const ListValue& value) { - std::vector< v8::Handle<v8::Value> > v8_values; - - for (size_t i = 0; i < value.GetSize(); ++i) { - Value* elem = NULL; - value.Get(i, &elem); - switch (elem->GetType()) { - case Value::TYPE_NULL: - v8_values.push_back(v8::Null()); - break; - case Value::TYPE_BOOLEAN: { - bool val; - elem->GetAsBoolean(&val); - v8_values.push_back(v8::Boolean::New(val)); - break; - } - case Value::TYPE_INTEGER: { - int val; - elem->GetAsInteger(&val); - v8_values.push_back(v8::Integer::New(val)); - break; - } - case Value::TYPE_DOUBLE: { - double val; - elem->GetAsDouble(&val); - v8_values.push_back(v8::Number::New(val)); - break; - } - case Value::TYPE_STRING: { - std::string val; - elem->GetAsString(&val); - v8_values.push_back(v8::String::New(val.c_str())); - break; - } - default: - NOTREACHED() << "Unsupported Value type."; - break; - } - } - - return v8_values; -} - } // namespace const char* RendererExtensionBindings::kName = @@ -299,18 +253,3 @@ v8::Extension* RendererExtensionBindings::Get() { static v8::Extension* extension = new ExtensionImpl(); return extension; } - -void RendererExtensionBindings::Invoke(const std::string& extension_id, - const std::string& function_name, - const ListValue& args, - RenderView* renderview, - const GURL& event_url) { - v8::HandleScope handle_scope; - std::vector< v8::Handle<v8::Value> > argv = ListValueToV8(args); - EventBindings::CallFunction(extension_id, - function_name, - argv.size(), - &argv[0], - renderview, - event_url); -} diff --git a/chrome/renderer/extensions/renderer_extension_bindings.h b/chrome/renderer/extensions/renderer_extension_bindings.h index 194b0c8..76a1a9c 100644 --- a/chrome/renderer/extensions/renderer_extension_bindings.h +++ b/chrome/renderer/extensions/renderer_extension_bindings.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -11,7 +11,6 @@ #include <string> class GURL; -class ListValue; class RenderView; // This class adds extension-related javascript bindings to a renderer. It is @@ -23,13 +22,6 @@ class RendererExtensionBindings { // Creates an instance of the extension. static v8::Extension* Get(); - - // Call the given javascript function with the specified arguments. - static void Invoke(const std::string& extension_id, - const std::string& function_name, - const ListValue& args, - RenderView* renderview, - const GURL& event_url); }; #endif // CHROME_RENDERER_EXTENSIONS_RENDERER_EXTENSION_BINDINGS_H_ |