18f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian/* 28f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Copyright (C) 2008, 2009 Google Inc. All rights reserved. 38f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 48f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Redistribution and use in source and binary forms, with or without 58f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * modification, are permitted provided that the following conditions are 68f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * met: 78f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 88f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * * Redistributions of source code must retain the above copyright 98f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * notice, this list of conditions and the following disclaimer. 108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * * Redistributions in binary form must reproduce the above 118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * copyright notice, this list of conditions and the following disclaimer 128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * in the documentation and/or other materials provided with the 138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * distribution. 148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * * Neither the name of Google Inc. nor the names of its 158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * contributors may be used to endorse or promote products derived from 168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * this software without specific prior written permission. 178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian */ 308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#ifndef ScriptValue_h 328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#define ScriptValue_h 338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "PlatformString.h" 358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "ScriptState.h" 368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include <v8.h> 388a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#include <wtf/PassRefPtr.h> 398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#ifndef NDEBUG 418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "V8Proxy.h" // for register and unregister global handles. 428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qiannamespace WebCore { 458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 460617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenclass InspectorValue; 478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockclass SerializedScriptValue; 488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianclass ScriptValue { 508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianpublic: 518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ScriptValue() {} 528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ScriptValue(v8::Handle<v8::Value> value) 548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (value.IsEmpty()) 568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_value = v8::Persistent<v8::Value>::New(value); 598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#ifndef NDEBUG 600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch V8GCController::registerGlobalHandle(SCRIPTVALUE, this, m_value); 618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ScriptValue(const ScriptValue& value) 658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (value.m_value.IsEmpty()) 678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_value = v8::Persistent<v8::Value>::New(value.m_value); 708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#ifndef NDEBUG 710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch V8GCController::registerGlobalHandle(SCRIPTVALUE, this, m_value); 728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ScriptValue& operator=(const ScriptValue& value) 768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (this == &value) 788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return *this; 798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian clear(); 818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (value.m_value.IsEmpty()) 838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return *this; 848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_value = v8::Persistent<v8::Value>::New(value.m_value); 868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#ifndef NDEBUG 870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch V8GCController::registerGlobalHandle(SCRIPTVALUE, this, m_value); 888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return *this; 918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool operator==(const ScriptValue value) const 948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return m_value == value.m_value; 968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian bool isEqual(ScriptState*, const ScriptValue& value) const 995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 1005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return m_value == value.m_value; 1015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang bool isFunction() const 1044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang { 1054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return m_value->IsFunction(); 1064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 1074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool operator!=(const ScriptValue value) const 1098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return !operator==(value); 1118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool isNull() const 1148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return m_value->IsNull(); 1168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool isUndefined() const 1198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return m_value->IsUndefined(); 1218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 122231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 123231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block bool isObject() const 124231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block { 125231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return m_value->IsObject(); 126231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 127231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool hasNoValue() const 1298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return m_value.IsEmpty(); 1318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block PassRefPtr<SerializedScriptValue> serialize(ScriptState*); 1348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block static ScriptValue deserialize(ScriptState*, SerializedScriptValue*); 1358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static ScriptValue undefined() { return ScriptValue(v8::Undefined()); } 137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian void clear() 1398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_value.IsEmpty()) 1418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 1428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#ifndef NDEBUG 1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch V8GCController::unregisterGlobalHandle(this, m_value); 1458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif 1468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_value.Dispose(); 1478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_value.Clear(); 1488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual ~ScriptValue() 1518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 1528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian clear(); 1538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 1548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian v8::Handle<v8::Value> v8Value() const { return m_value; } 156643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool getString(ScriptState*, String& result) const { return getString(result); } 1578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian bool getString(String& result) const; 1588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian String toString(ScriptState*) const; 1598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1600617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen PassRefPtr<InspectorValue> toInspectorValue(ScriptState*) const; 1610617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen 1628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianprivate: 1638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian mutable v8::Persistent<v8::Value> m_value; 1648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}; 1658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} // namespace WebCore 1678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif // ScriptValue_h 169