diff options
author | Konstantin Tokarev <annulen@yandex.ru> | 2016-08-25 19:20:41 +0300 |
---|---|---|
committer | Konstantin Tokarev <annulen@yandex.ru> | 2017-02-02 12:30:55 +0000 |
commit | 6882a04fb36642862b11efe514251d32070c3d65 (patch) | |
tree | b7959826000b061fd5ccc7512035c7478742f7b0 /Source/JavaScriptCore/bindings/ScriptValue.cpp | |
parent | ab6df191029eeeb0b0f16f127d553265659f739e (diff) | |
download | qtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz |
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f
Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/JavaScriptCore/bindings/ScriptValue.cpp')
-rw-r--r-- | Source/JavaScriptCore/bindings/ScriptValue.cpp | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/Source/JavaScriptCore/bindings/ScriptValue.cpp b/Source/JavaScriptCore/bindings/ScriptValue.cpp new file mode 100644 index 000000000..3e560dcc3 --- /dev/null +++ b/Source/JavaScriptCore/bindings/ScriptValue.cpp @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2006, 2007, 2008, 2013 Apple Inc. All rights reserved. + * Copyright (c) 2011 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Apple Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "ScriptValue.h" + +#include "APICast.h" +#include "InspectorValues.h" +#include "JSLock.h" +#include "StructureInlines.h" + +using namespace JSC; +using namespace Inspector; + +namespace Deprecated { + +ScriptValue::~ScriptValue() +{ +} + +bool ScriptValue::getString(ExecState* scriptState, String& result) const +{ + if (!m_value) + return false; + JSLockHolder lock(scriptState); + if (!m_value.get().getString(scriptState, result)) + return false; + return true; +} + +String ScriptValue::toString(ExecState* scriptState) const +{ + String result = m_value.get().toString(scriptState)->value(scriptState); + // Handle the case where an exception is thrown as part of invoking toString on the object. + if (scriptState->hadException()) + scriptState->clearException(); + return result; +} + +bool ScriptValue::isEqual(ExecState* scriptState, const ScriptValue& anotherValue) const +{ + if (hasNoValue()) + return anotherValue.hasNoValue(); + return JSValueIsEqual(toRef(scriptState), toRef(scriptState, jsValue()), toRef(scriptState, anotherValue.jsValue()), nullptr); +} + +bool ScriptValue::isNull() const +{ + if (!m_value) + return false; + return m_value.get().isNull(); +} + +bool ScriptValue::isUndefined() const +{ + if (!m_value) + return false; + return m_value.get().isUndefined(); +} + +bool ScriptValue::isObject() const +{ + if (!m_value) + return false; + return m_value.get().isObject(); +} + +bool ScriptValue::isFunction() const +{ + CallData callData; + return getCallData(m_value.get(), callData) != CallTypeNone; +} + +static RefPtr<InspectorValue> jsToInspectorValue(ExecState* scriptState, JSValue value, int maxDepth) +{ + if (!value) { + ASSERT_NOT_REACHED(); + return nullptr; + } + + if (!maxDepth) + return nullptr; + + maxDepth--; + + if (value.isNull() || value.isUndefined()) + return InspectorValue::null(); + if (value.isBoolean()) + return InspectorBasicValue::create(value.asBoolean()); + if (value.isNumber() && value.isDouble()) + return InspectorBasicValue::create(value.asNumber()); + if (value.isNumber() && value.isMachineInt()) + return InspectorBasicValue::create(static_cast<int>(value.asMachineInt())); + if (value.isString()) + return InspectorString::create(value.getString(scriptState)); + + if (value.isObject()) { + if (isJSArray(value)) { + Ref<InspectorArray> inspectorArray = InspectorArray::create(); + JSArray* array = asArray(value); + unsigned length = array->length(); + for (unsigned i = 0; i < length; i++) { + JSValue element = array->getIndex(scriptState, i); + RefPtr<InspectorValue> elementValue = jsToInspectorValue(scriptState, element, maxDepth); + if (!elementValue) + return nullptr; + inspectorArray->pushValue(WTFMove(elementValue)); + } + return WTFMove(inspectorArray); + } + Ref<InspectorObject> inspectorObject = InspectorObject::create(); + JSObject* object = value.getObject(); + PropertyNameArray propertyNames(scriptState, PropertyNameMode::Strings); + object->methodTable()->getOwnPropertyNames(object, scriptState, propertyNames, EnumerationMode()); + for (size_t i = 0; i < propertyNames.size(); i++) { + const Identifier& name = propertyNames[i]; + JSValue propertyValue = object->get(scriptState, name); + RefPtr<InspectorValue> inspectorValue = jsToInspectorValue(scriptState, propertyValue, maxDepth); + if (!inspectorValue) + return nullptr; + inspectorObject->setValue(name.string(), WTFMove(inspectorValue)); + } + return WTFMove(inspectorObject); + } + + ASSERT_NOT_REACHED(); + return nullptr; +} + +RefPtr<InspectorValue> ScriptValue::toInspectorValue(ExecState* scriptState) const +{ + JSLockHolder holder(scriptState); + return jsToInspectorValue(scriptState, m_value.get(), InspectorValue::maxDepth); +} + +} // namespace Deprecated |