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

Side by Side Diff: content/renderer/v8_value_converter_impl.cc

Issue 301883002: Should provide creation context and isolate for WebArrayConverter (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed bad coding style Created 6 years, 6 months 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 | « content/renderer/v8_value_converter_impl.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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/renderer/v8_value_converter_impl.h" 5 #include "content/renderer/v8_value_converter_impl.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 } 146 }
147 147
148 void V8ValueConverterImpl::SetStrategy(Strategy* strategy) { 148 void V8ValueConverterImpl::SetStrategy(Strategy* strategy) {
149 strategy_ = strategy; 149 strategy_ = strategy;
150 } 150 }
151 151
152 v8::Handle<v8::Value> V8ValueConverterImpl::ToV8Value( 152 v8::Handle<v8::Value> V8ValueConverterImpl::ToV8Value(
153 const base::Value* value, v8::Handle<v8::Context> context) const { 153 const base::Value* value, v8::Handle<v8::Context> context) const {
154 v8::Context::Scope context_scope(context); 154 v8::Context::Scope context_scope(context);
155 v8::EscapableHandleScope handle_scope(context->GetIsolate()); 155 v8::EscapableHandleScope handle_scope(context->GetIsolate());
156 return handle_scope.Escape(ToV8ValueImpl(context->GetIsolate(), value)); 156 return handle_scope.Escape(
157 ToV8ValueImpl(context->GetIsolate(), context->Global(), value));
157 } 158 }
158 159
159 base::Value* V8ValueConverterImpl::FromV8Value( 160 base::Value* V8ValueConverterImpl::FromV8Value(
160 v8::Handle<v8::Value> val, 161 v8::Handle<v8::Value> val,
161 v8::Handle<v8::Context> context) const { 162 v8::Handle<v8::Context> context) const {
162 v8::Context::Scope context_scope(context); 163 v8::Context::Scope context_scope(context);
163 v8::HandleScope handle_scope(context->GetIsolate()); 164 v8::HandleScope handle_scope(context->GetIsolate());
164 FromV8ValueState state(avoid_identity_hash_for_testing_); 165 FromV8ValueState state(avoid_identity_hash_for_testing_);
165 return FromV8ValueImpl(&state, val, context->GetIsolate()); 166 return FromV8ValueImpl(&state, val, context->GetIsolate());
166 } 167 }
167 168
168 v8::Local<v8::Value> V8ValueConverterImpl::ToV8ValueImpl( 169 v8::Local<v8::Value> V8ValueConverterImpl::ToV8ValueImpl(
169 v8::Isolate* isolate, 170 v8::Isolate* isolate,
171 v8::Handle<v8::Object> creation_context,
170 const base::Value* value) const { 172 const base::Value* value) const {
171 CHECK(value); 173 CHECK(value);
172 switch (value->GetType()) { 174 switch (value->GetType()) {
173 case base::Value::TYPE_NULL: 175 case base::Value::TYPE_NULL:
174 return v8::Null(isolate); 176 return v8::Null(isolate);
175 177
176 case base::Value::TYPE_BOOLEAN: { 178 case base::Value::TYPE_BOOLEAN: {
177 bool val = false; 179 bool val = false;
178 CHECK(value->GetAsBoolean(&val)); 180 CHECK(value->GetAsBoolean(&val));
179 return v8::Boolean::New(isolate, val); 181 return v8::Boolean::New(isolate, val);
(...skipping 12 matching lines...) Expand all
192 } 194 }
193 195
194 case base::Value::TYPE_STRING: { 196 case base::Value::TYPE_STRING: {
195 std::string val; 197 std::string val;
196 CHECK(value->GetAsString(&val)); 198 CHECK(value->GetAsString(&val));
197 return v8::String::NewFromUtf8( 199 return v8::String::NewFromUtf8(
198 isolate, val.c_str(), v8::String::kNormalString, val.length()); 200 isolate, val.c_str(), v8::String::kNormalString, val.length());
199 } 201 }
200 202
201 case base::Value::TYPE_LIST: 203 case base::Value::TYPE_LIST:
202 return ToV8Array(isolate, static_cast<const base::ListValue*>(value)); 204 return ToV8Array(isolate,
205 creation_context,
206 static_cast<const base::ListValue*>(value));
203 207
204 case base::Value::TYPE_DICTIONARY: 208 case base::Value::TYPE_DICTIONARY:
205 return ToV8Object(isolate, 209 return ToV8Object(isolate,
210 creation_context,
206 static_cast<const base::DictionaryValue*>(value)); 211 static_cast<const base::DictionaryValue*>(value));
207 212
208 case base::Value::TYPE_BINARY: 213 case base::Value::TYPE_BINARY:
209 return ToArrayBuffer(static_cast<const base::BinaryValue*>(value)); 214 return ToArrayBuffer(isolate,
215 creation_context,
216 static_cast<const base::BinaryValue*>(value));
210 217
211 default: 218 default:
212 LOG(ERROR) << "Unexpected value type: " << value->GetType(); 219 LOG(ERROR) << "Unexpected value type: " << value->GetType();
213 return v8::Null(isolate); 220 return v8::Null(isolate);
214 } 221 }
215 } 222 }
216 223
217 v8::Handle<v8::Value> V8ValueConverterImpl::ToV8Array( 224 v8::Handle<v8::Value> V8ValueConverterImpl::ToV8Array(
218 v8::Isolate* isolate, 225 v8::Isolate* isolate,
226 v8::Handle<v8::Object> creation_context,
219 const base::ListValue* val) const { 227 const base::ListValue* val) const {
220 v8::Handle<v8::Array> result(v8::Array::New(isolate, val->GetSize())); 228 v8::Handle<v8::Array> result(v8::Array::New(isolate, val->GetSize()));
221 229
222 for (size_t i = 0; i < val->GetSize(); ++i) { 230 for (size_t i = 0; i < val->GetSize(); ++i) {
223 const base::Value* child = NULL; 231 const base::Value* child = NULL;
224 CHECK(val->Get(i, &child)); 232 CHECK(val->Get(i, &child));
225 233
226 v8::Handle<v8::Value> child_v8 = ToV8ValueImpl(isolate, child); 234 v8::Handle<v8::Value> child_v8 =
235 ToV8ValueImpl(isolate, creation_context, child);
227 CHECK(!child_v8.IsEmpty()); 236 CHECK(!child_v8.IsEmpty());
228 237
229 v8::TryCatch try_catch; 238 v8::TryCatch try_catch;
230 result->Set(static_cast<uint32>(i), child_v8); 239 result->Set(static_cast<uint32>(i), child_v8);
231 if (try_catch.HasCaught()) 240 if (try_catch.HasCaught())
232 LOG(ERROR) << "Setter for index " << i << " threw an exception."; 241 LOG(ERROR) << "Setter for index " << i << " threw an exception.";
233 } 242 }
234 243
235 return result; 244 return result;
236 } 245 }
237 246
238 v8::Handle<v8::Value> V8ValueConverterImpl::ToV8Object( 247 v8::Handle<v8::Value> V8ValueConverterImpl::ToV8Object(
239 v8::Isolate* isolate, 248 v8::Isolate* isolate,
249 v8::Handle<v8::Object> creation_context,
240 const base::DictionaryValue* val) const { 250 const base::DictionaryValue* val) const {
241 v8::Handle<v8::Object> result(v8::Object::New(isolate)); 251 v8::Handle<v8::Object> result(v8::Object::New(isolate));
242 252
243 for (base::DictionaryValue::Iterator iter(*val); 253 for (base::DictionaryValue::Iterator iter(*val);
244 !iter.IsAtEnd(); iter.Advance()) { 254 !iter.IsAtEnd(); iter.Advance()) {
245 const std::string& key = iter.key(); 255 const std::string& key = iter.key();
246 v8::Handle<v8::Value> child_v8 = ToV8ValueImpl(isolate, &iter.value()); 256 v8::Handle<v8::Value> child_v8 =
257 ToV8ValueImpl(isolate, creation_context, &iter.value());
247 CHECK(!child_v8.IsEmpty()); 258 CHECK(!child_v8.IsEmpty());
248 259
249 v8::TryCatch try_catch; 260 v8::TryCatch try_catch;
250 result->Set( 261 result->Set(
251 v8::String::NewFromUtf8( 262 v8::String::NewFromUtf8(
252 isolate, key.c_str(), v8::String::kNormalString, key.length()), 263 isolate, key.c_str(), v8::String::kNormalString, key.length()),
253 child_v8); 264 child_v8);
254 if (try_catch.HasCaught()) { 265 if (try_catch.HasCaught()) {
255 LOG(ERROR) << "Setter for property " << key.c_str() << " threw an " 266 LOG(ERROR) << "Setter for property " << key.c_str() << " threw an "
256 << "exception."; 267 << "exception.";
257 } 268 }
258 } 269 }
259 270
260 return result; 271 return result;
261 } 272 }
262 273
263 v8::Handle<v8::Value> V8ValueConverterImpl::ToArrayBuffer( 274 v8::Handle<v8::Value> V8ValueConverterImpl::ToArrayBuffer(
275 v8::Isolate* isolate,
276 v8::Handle<v8::Object> creation_context,
264 const base::BinaryValue* value) const { 277 const base::BinaryValue* value) const {
265 blink::WebArrayBuffer buffer = 278 blink::WebArrayBuffer buffer =
266 blink::WebArrayBuffer::create(value->GetSize(), 1); 279 blink::WebArrayBuffer::create(value->GetSize(), 1);
267 memcpy(buffer.data(), value->GetBuffer(), value->GetSize()); 280 memcpy(buffer.data(), value->GetBuffer(), value->GetSize());
268 return blink::WebArrayBufferConverter::toV8Value(&buffer); 281 return blink::WebArrayBufferConverter::toV8Value(
282 &buffer, creation_context, isolate);
269 } 283 }
270 284
271 base::Value* V8ValueConverterImpl::FromV8ValueImpl( 285 base::Value* V8ValueConverterImpl::FromV8ValueImpl(
272 FromV8ValueState* state, 286 FromV8ValueState* state,
273 v8::Handle<v8::Value> val, 287 v8::Handle<v8::Value> val,
274 v8::Isolate* isolate) const { 288 v8::Isolate* isolate) const {
275 CHECK(!val.IsEmpty()); 289 CHECK(!val.IsEmpty());
276 290
277 FromV8ValueState::Level state_level(state); 291 FromV8ValueState::Level state_level(state);
278 if (state->HasReachedMaxRecursionDepth()) 292 if (state->HasReachedMaxRecursionDepth())
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 if (strategy_) { 425 if (strategy_) {
412 base::Value* out = NULL; 426 base::Value* out = NULL;
413 if (strategy_->FromV8ArrayBuffer(val, &out, isolate)) 427 if (strategy_->FromV8ArrayBuffer(val, &out, isolate))
414 return out; 428 return out;
415 } 429 }
416 430
417 char* data = NULL; 431 char* data = NULL;
418 size_t length = 0; 432 size_t length = 0;
419 433
420 scoped_ptr<blink::WebArrayBuffer> array_buffer( 434 scoped_ptr<blink::WebArrayBuffer> array_buffer(
421 blink::WebArrayBufferConverter::createFromV8Value(val)); 435 blink::WebArrayBufferConverter::createFromV8Value(val, isolate));
422 scoped_ptr<blink::WebArrayBufferView> view; 436 scoped_ptr<blink::WebArrayBufferView> view;
423 if (array_buffer) { 437 if (array_buffer) {
424 data = reinterpret_cast<char*>(array_buffer->data()); 438 data = reinterpret_cast<char*>(array_buffer->data());
425 length = array_buffer->byteLength(); 439 length = array_buffer->byteLength();
426 } else { 440 } else {
427 view.reset(blink::WebArrayBufferView::createFromV8Value(val)); 441 view.reset(blink::WebArrayBufferView::createFromV8Value(val));
428 if (view) { 442 if (view) {
429 data = reinterpret_cast<char*>(view->baseAddress()) + view->byteOffset(); 443 data = reinterpret_cast<char*>(view->baseAddress()) + view->byteOffset();
430 length = view->byteLength(); 444 length = view->byteLength();
431 } 445 }
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 continue; 548 continue;
535 549
536 result->SetWithoutPathExpansion(std::string(*name_utf8, name_utf8.length()), 550 result->SetWithoutPathExpansion(std::string(*name_utf8, name_utf8.length()),
537 child.release()); 551 child.release());
538 } 552 }
539 553
540 return result.release(); 554 return result.release();
541 } 555 }
542 556
543 } // namespace content 557 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/v8_value_converter_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698