summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/extensions
diff options
context:
space:
mode:
authoraa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-20 21:28:10 +0000
committeraa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-20 21:28:10 +0000
commitb1cf337a2722a4c24802b78258ea96e8e8d00276 (patch)
treec473a077154b97d23c781736aece0b1f847803af /chrome/renderer/extensions
parent25c171129de0c3da8fa5e45be90335f07c06a20a (diff)
downloadchromium_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.cc21
-rw-r--r--chrome/renderer/extensions/event_bindings.cc20
-rw-r--r--chrome/renderer/extensions/event_bindings.h5
-rw-r--r--chrome/renderer/extensions/extension_dispatcher.cc2
-rw-r--r--chrome/renderer/extensions/extension_helper.cc4
-rw-r--r--chrome/renderer/extensions/renderer_extension_bindings.cc63
-rw-r--r--chrome/renderer/extensions/renderer_extension_bindings.h10
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_