15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008, 2009, 2011 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 1702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptValue.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptScope.h" 3551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "bindings/v8/ScriptState.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/V8Binding.h" 371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/JSONValues.h" 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ScriptValue::~ScriptValue() 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)bool ScriptValue::getString(String& result) const 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (hasNoValue()) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 509bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) v8::HandleScope handleScope(m_isolate); 517757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch v8::Handle<v8::Value> string = v8Value(); 527757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (string.IsEmpty() || !string->IsString()) 537757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return false; 54e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) result = toCoreString(string.As<v8::String>()); 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 589bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)String ScriptValue::toString() const 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::TryCatch block; 61521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) v8::Handle<v8::String> string = v8Value()->ToString(); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (block.HasCaught()) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return String(); 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return v8StringToWebCoreString<String>(string, DoNotExternalize); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 679bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)static PassRefPtr<JSONValue> v8ToJSONValue(v8::Handle<v8::Value> value, int maxDepth, v8::Isolate* isolate) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (value.IsEmpty()) { 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!maxDepth) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) maxDepth--; 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (value->IsNull() || value->IsUndefined()) 79591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return JSONValue::null(); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (value->IsBoolean()) 81591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return JSONBasicValue::create(value->BooleanValue()); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (value->IsNumber()) 83591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return JSONBasicValue::create(value->NumberValue()); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (value->IsString()) 85e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) return JSONString::create(toCoreString(value.As<v8::String>())); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (value->IsArray()) { 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(value); 88591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch RefPtr<JSONArray> inspectorArray = JSONArray::create(); 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uint32_t length = array->Length(); 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (uint32_t i = 0; i < length; i++) { 919bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) v8::Local<v8::Value> value = array->Get(v8::Int32::New(i, isolate)); 929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) RefPtr<JSONValue> element = v8ToJSONValue(value, maxDepth, isolate); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!element) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inspectorArray->pushValue(element); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inspectorArray; 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (value->IsObject()) { 100591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch RefPtr<JSONObject> jsonObject = JSONObject::create(); 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(value); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Local<v8::Array> propertyNames = object->GetPropertyNames(); 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uint32_t length = propertyNames->Length(); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (uint32_t i = 0; i < length; i++) { 1059bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) v8::Local<v8::Value> name = propertyNames->Get(v8::Int32::New(i, isolate)); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME(yurys): v8::Object should support GetOwnPropertyNames 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (name->IsString() && !object->HasRealNamedProperty(v8::Handle<v8::String>::Cast(name))) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 1099bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) RefPtr<JSONValue> propertyValue = v8ToJSONValue(object->Get(name), maxDepth, isolate); 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!propertyValue) 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 112e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) V8TRYCATCH_FOR_V8STRINGRESOURCE_RETURN(V8StringResource<WithNullCheck>, nameString, name, 0); 113e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles) jsonObject->setValue(nameString, propertyValue); 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 115591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return jsonObject; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 121591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochPassRefPtr<JSONValue> ScriptValue::toJSONValue(ScriptState* scriptState) const 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 123521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) v8::HandleScope handleScope(scriptState->isolate()); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // v8::Object::GetPropertyNames() expects current context to be not null. 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Context::Scope contextScope(scriptState->context()); 1269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return v8ToJSONValue(v8Value(), JSONValue::maxDepth, scriptState->isolate()); 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 130