| OLD | NEW |
| 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/child/v8_value_converter_impl.h" | 5 #include "content/child/v8_value_converter_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <cmath> | 10 #include <cmath> |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 CHECK(!val.IsEmpty()); | 354 CHECK(!val.IsEmpty()); |
| 355 | 355 |
| 356 FromV8ValueState::Level state_level(state); | 356 FromV8ValueState::Level state_level(state); |
| 357 if (state->HasReachedMaxRecursionDepth()) | 357 if (state->HasReachedMaxRecursionDepth()) |
| 358 return nullptr; | 358 return nullptr; |
| 359 | 359 |
| 360 if (val->IsNull()) | 360 if (val->IsNull()) |
| 361 return base::Value::CreateNullValue(); | 361 return base::Value::CreateNullValue(); |
| 362 | 362 |
| 363 if (val->IsBoolean()) | 363 if (val->IsBoolean()) |
| 364 return base::MakeUnique<base::FundamentalValue>( | 364 return base::MakeUnique<base::Value>(val->ToBoolean(isolate)->Value()); |
| 365 val->ToBoolean(isolate)->Value()); | |
| 366 | 365 |
| 367 if (val->IsNumber() && strategy_) { | 366 if (val->IsNumber() && strategy_) { |
| 368 std::unique_ptr<base::Value> out; | 367 std::unique_ptr<base::Value> out; |
| 369 if (strategy_->FromV8Number(val.As<v8::Number>(), &out)) | 368 if (strategy_->FromV8Number(val.As<v8::Number>(), &out)) |
| 370 return out; | 369 return out; |
| 371 } | 370 } |
| 372 | 371 |
| 373 if (val->IsInt32()) | 372 if (val->IsInt32()) |
| 374 return base::MakeUnique<base::FundamentalValue>( | 373 return base::MakeUnique<base::Value>(val->ToInt32(isolate)->Value()); |
| 375 val->ToInt32(isolate)->Value()); | |
| 376 | 374 |
| 377 if (val->IsNumber()) { | 375 if (val->IsNumber()) { |
| 378 double val_as_double = val.As<v8::Number>()->Value(); | 376 double val_as_double = val.As<v8::Number>()->Value(); |
| 379 if (!std::isfinite(val_as_double)) | 377 if (!std::isfinite(val_as_double)) |
| 380 return nullptr; | 378 return nullptr; |
| 381 // Normally, this would be an integer, and fall into IsInt32(). But if the | 379 // Normally, this would be an integer, and fall into IsInt32(). But if the |
| 382 // value is -0, it's treated internally as a double. Consumers are allowed | 380 // value is -0, it's treated internally as a double. Consumers are allowed |
| 383 // to ignore this esoterica and treat it as an integer. | 381 // to ignore this esoterica and treat it as an integer. |
| 384 if (convert_negative_zero_to_int_ && val_as_double == 0.0) | 382 if (convert_negative_zero_to_int_ && val_as_double == 0.0) |
| 385 return base::MakeUnique<base::FundamentalValue>(0); | 383 return base::MakeUnique<base::Value>(0); |
| 386 return base::MakeUnique<base::FundamentalValue>(val_as_double); | 384 return base::MakeUnique<base::Value>(val_as_double); |
| 387 } | 385 } |
| 388 | 386 |
| 389 if (val->IsString()) { | 387 if (val->IsString()) { |
| 390 v8::String::Utf8Value utf8(val); | 388 v8::String::Utf8Value utf8(val); |
| 391 return base::MakeUnique<base::StringValue>( | 389 return base::MakeUnique<base::StringValue>( |
| 392 std::string(*utf8, utf8.length())); | 390 std::string(*utf8, utf8.length())); |
| 393 } | 391 } |
| 394 | 392 |
| 395 if (val->IsUndefined()) { | 393 if (val->IsUndefined()) { |
| 396 if (strategy_) { | 394 if (strategy_) { |
| 397 std::unique_ptr<base::Value> out; | 395 std::unique_ptr<base::Value> out; |
| 398 if (strategy_->FromV8Undefined(&out)) | 396 if (strategy_->FromV8Undefined(&out)) |
| 399 return out; | 397 return out; |
| 400 } | 398 } |
| 401 // JSON.stringify ignores undefined. | 399 // JSON.stringify ignores undefined. |
| 402 return nullptr; | 400 return nullptr; |
| 403 } | 401 } |
| 404 | 402 |
| 405 if (val->IsDate()) { | 403 if (val->IsDate()) { |
| 406 if (!date_allowed_) | 404 if (!date_allowed_) |
| 407 // JSON.stringify would convert this to a string, but an object is more | 405 // JSON.stringify would convert this to a string, but an object is more |
| 408 // consistent within this class. | 406 // consistent within this class. |
| 409 return FromV8Object(val->ToObject(isolate), state, isolate); | 407 return FromV8Object(val->ToObject(isolate), state, isolate); |
| 410 v8::Date* date = v8::Date::Cast(*val); | 408 v8::Date* date = v8::Date::Cast(*val); |
| 411 return base::MakeUnique<base::FundamentalValue>(date->ValueOf() / 1000.0); | 409 return base::MakeUnique<base::Value>(date->ValueOf() / 1000.0); |
| 412 } | 410 } |
| 413 | 411 |
| 414 if (val->IsRegExp()) { | 412 if (val->IsRegExp()) { |
| 415 if (!reg_exp_allowed_) | 413 if (!reg_exp_allowed_) |
| 416 // JSON.stringify converts to an object. | 414 // JSON.stringify converts to an object. |
| 417 return FromV8Object(val.As<v8::Object>(), state, isolate); | 415 return FromV8Object(val.As<v8::Object>(), state, isolate); |
| 418 return base::MakeUnique<base::StringValue>(*v8::String::Utf8Value(val)); | 416 return base::MakeUnique<base::StringValue>(*v8::String::Utf8Value(val)); |
| 419 } | 417 } |
| 420 | 418 |
| 421 // v8::Value doesn't have a ToArray() method for some reason. | 419 // v8::Value doesn't have a ToArray() method for some reason. |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 continue; | 616 continue; |
| 619 | 617 |
| 620 result->SetWithoutPathExpansion(std::string(*name_utf8, name_utf8.length()), | 618 result->SetWithoutPathExpansion(std::string(*name_utf8, name_utf8.length()), |
| 621 std::move(child)); | 619 std::move(child)); |
| 622 } | 620 } |
| 623 | 621 |
| 624 return std::move(result); | 622 return std::move(result); |
| 625 } | 623 } |
| 626 | 624 |
| 627 } // namespace content | 625 } // namespace content |
| OLD | NEW |