diff options
author | asargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-09 20:30:19 +0000 |
---|---|---|
committer | asargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-09 20:30:19 +0000 |
commit | 2d58238b78d653db0293b107997022b7046c0e83 (patch) | |
tree | 8ed2dfb54214ac12380b2363ec3bdf7a674149ba /content | |
parent | 395f7e2929bacb73128bbe2c5833b1f21a71ca72 (diff) | |
download | chromium_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.h | 8 | ||||
-rw-r--r-- | content/renderer/v8_value_converter_impl.cc | 58 | ||||
-rw-r--r-- | content/renderer/v8_value_converter_impl.h | 10 |
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. |