summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorasargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-09 20:30:19 +0000
committerasargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-09 20:30:19 +0000
commit2d58238b78d653db0293b107997022b7046c0e83 (patch)
tree8ed2dfb54214ac12380b2363ec3bdf7a674149ba /content
parent395f7e2929bacb73128bbe2c5833b1f21a71ca72 (diff)
downloadchromium_src-2d58238b78d653db0293b107997022b7046c0e83.zip
chromium_src-2d58238b78d653db0293b107997022b7046c0e83.tar.gz
chromium_src-2d58238b78d653db0293b107997022b7046c0e83.tar.bz2
Allow serialization of ArrayBuffer params in extension/apps API methods
This changes the V8ValueConverter to do ArrayBuffer<->BinaryValue conversions, as well as supporting ArrayBufferView subclasses as request parameters (but not response ones, since that's unnecessary). Also adds an experimental API for testing ArrayBuffers in request/response parameters. (This is re-landing https://chromiumcodereview.appspot.com/10161038, which ran into some test failures fixed by crrev.com/135933) TBR=asargent@chromium.org BUG=122675 TEST=Included browser tests should pass Review URL: https://chromiumcodereview.appspot.com/10377063 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@136114 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r--content/public/renderer/v8_value_converter.h8
-rw-r--r--content/renderer/v8_value_converter_impl.cc58
-rw-r--r--content/renderer/v8_value_converter_impl.h10
3 files changed, 68 insertions, 8 deletions
diff --git a/content/public/renderer/v8_value_converter.h b/content/public/renderer/v8_value_converter.h
index e8fad2a..6e785c1 100644
--- a/content/public/renderer/v8_value_converter.h
+++ b/content/public/renderer/v8_value_converter.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -18,8 +18,10 @@ namespace content {
// values (from base/values.h). Lists and dictionaries are converted
// recursively.
//
-// Only the JSON types (null, boolean, string, number, array, and object) are
-// supported.
+// The JSON types (null, boolean, string, number, array, and object) as well as
+// binary values are supported. For binary values, we convert to WebKit
+// ArrayBuffers, and support converting from an ArrayBuffer or any of the
+// ArrayBufferView subclasses (Uint8Array, etc.).
class CONTENT_EXPORT V8ValueConverter {
public:
static V8ValueConverter* create();
diff --git a/content/renderer/v8_value_converter_impl.cc b/content/renderer/v8_value_converter_impl.cc
index b0762ef..c457377 100644
--- a/content/renderer/v8_value_converter_impl.cc
+++ b/content/renderer/v8_value_converter_impl.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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,8 +9,17 @@
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/values.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebArrayBuffer.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebArrayBufferView.h"
#include "v8/include/v8.h"
+using base::BinaryValue;
+using base::DictionaryValue;
+using base::ListValue;
+using base::StringValue;
+using base::Value;
+
+
namespace content {
V8ValueConverter* V8ValueConverter::create() {
@@ -77,6 +86,9 @@ v8::Handle<v8::Value> V8ValueConverterImpl::ToV8ValueImpl(
case Value::TYPE_DICTIONARY:
return ToV8Object(static_cast<const DictionaryValue*>(value));
+ case Value::TYPE_BINARY:
+ return ToArrayBuffer(static_cast<const BinaryValue*>(value));
+
default:
LOG(ERROR) << "Unexpected value type: " << value->GetType();
return v8::Null();
@@ -127,6 +139,14 @@ v8::Handle<v8::Value> V8ValueConverterImpl::ToV8Object(
return result;
}
+v8::Handle<v8::Value> V8ValueConverterImpl::ToArrayBuffer(
+ const BinaryValue* value) const {
+ WebKit::WebArrayBuffer buffer =
+ WebKit::WebArrayBuffer::create(value->GetSize(), 1);
+ memcpy(buffer.data(), value->GetBuffer(), value->GetSize());
+ return buffer.toV8Value();
+}
+
Value* V8ValueConverterImpl::FromV8ValueImpl(v8::Handle<v8::Value> val) const {
CHECK(!val.IsEmpty());
@@ -164,9 +184,14 @@ Value* V8ValueConverterImpl::FromV8ValueImpl(v8::Handle<v8::Value> val) const {
if (val->IsArray())
return FromV8Array(val.As<v8::Array>());
- if (val->IsObject())
- return FromV8Object(val->ToObject());
-
+ if (val->IsObject()) {
+ BinaryValue* binary_value = FromV8Buffer(val);
+ if (binary_value) {
+ return binary_value;
+ } else {
+ return FromV8Object(val->ToObject());
+ }
+ }
LOG(ERROR) << "Unexpected v8 value type encountered.";
return Value::CreateNullValue();
}
@@ -194,6 +219,31 @@ ListValue* V8ValueConverterImpl::FromV8Array(v8::Handle<v8::Array> val) const {
return result;
}
+base::BinaryValue* V8ValueConverterImpl::FromV8Buffer(
+ v8::Handle<v8::Value> val) const {
+ char* data = NULL;
+ size_t length = 0;
+
+ WebKit::WebArrayBuffer* array_buffer =
+ WebKit::WebArrayBuffer::createFromV8Value(val);
+ if (array_buffer) {
+ data = reinterpret_cast<char*>(array_buffer->data());
+ length = array_buffer->byteLength();
+ } else {
+ WebKit::WebArrayBufferView* view =
+ WebKit::WebArrayBufferView::createFromV8Value(val);
+ if (view) {
+ data = reinterpret_cast<char*>(view->baseAddress()) + view->byteOffset();
+ length = view->byteLength();
+ }
+ }
+
+ if (data)
+ return base::BinaryValue::CreateWithCopiedBuffer(data, length);
+ else
+ return NULL;
+}
+
DictionaryValue* V8ValueConverterImpl::FromV8Object(
v8::Handle<v8::Object> val) const {
DictionaryValue* result = new DictionaryValue();
diff --git a/content/renderer/v8_value_converter_impl.h b/content/renderer/v8_value_converter_impl.h
index ac6e7b7..c43da46 100644
--- a/content/renderer/v8_value_converter_impl.h
+++ b/content/renderer/v8_value_converter_impl.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -10,6 +10,7 @@
#include "content/public/renderer/v8_value_converter.h"
namespace base {
+class BinaryValue;
class DictionaryValue;
class ListValue;
class Value;
@@ -43,9 +44,16 @@ class CONTENT_EXPORT V8ValueConverterImpl : public content::V8ValueConverter {
v8::Handle<v8::Value> ToV8Array(const base::ListValue* list) const;
v8::Handle<v8::Value> ToV8Object(
const base::DictionaryValue* dictionary) const;
+ v8::Handle<v8::Value> ToArrayBuffer(const base::BinaryValue* value) const;
base::Value* FromV8ValueImpl(v8::Handle<v8::Value> value) const;
base::ListValue* FromV8Array(v8::Handle<v8::Array> array) const;
+
+ // This will convert objects of type ArrayBuffer or any of the
+ // ArrayBufferView subclasses. The return value will be NULL if |value| is
+ // not one of these types.
+ base::BinaryValue* FromV8Buffer(v8::Handle<v8::Value> value) const;
+
base::DictionaryValue* FromV8Object(v8::Handle<v8::Object> object) const;
// If true, we will convert undefined JavaScript values to null.