From 8f72e70a9fd78eec56623b3a62e68f16b7b27e28 Mon Sep 17 00:00:00 2001 From: Feng Qian <> Date: Fri, 10 Apr 2009 18:11:29 -0700 Subject: AI 145796: Land the WebKit merge @r42026. Automated import of CL 145796 --- WebCore/bridge/qt/qt_instance.cpp | 21 ++++++++++++++++++--- WebCore/bridge/qt/qt_instance.h | 10 ++++++---- WebCore/bridge/qt/qt_runtime.cpp | 39 +++++++++++++++++++++++++++------------ 3 files changed, 51 insertions(+), 19 deletions(-) (limited to 'WebCore/bridge/qt') diff --git a/WebCore/bridge/qt/qt_instance.cpp b/WebCore/bridge/qt/qt_instance.cpp index 0848463..d2a9cc6 100644 --- a/WebCore/bridge/qt/qt_instance.cpp +++ b/WebCore/bridge/qt/qt_instance.cpp @@ -98,12 +98,13 @@ void QtRuntimeObjectImp::removeFromCache() } // QtInstance -QtInstance::QtInstance(QObject* o, PassRefPtr rootObject) +QtInstance::QtInstance(QObject* o, PassRefPtr rootObject, QScriptEngine::ValueOwnership ownership) : Instance(rootObject) , m_class(0) , m_object(o) , m_hashkey(o) , m_defaultMethod(0) + , m_ownership(ownership) { } @@ -121,9 +122,23 @@ QtInstance::~QtInstance() delete f; } m_fields.clear(); + + if (m_object) { + switch (m_ownership) { + case QScriptEngine::QtOwnership: + break; + case QScriptEngine::AutoOwnership: + if (m_object->parent()) + break; + // fall through! + case QScriptEngine::ScriptOwnership: + delete m_object; + break; + } + } } -PassRefPtr QtInstance::getQtInstance(QObject* o, PassRefPtr rootObject) +PassRefPtr QtInstance::getQtInstance(QObject* o, PassRefPtr rootObject, QScriptEngine::ValueOwnership ownership) { JSLock lock(false); @@ -132,7 +147,7 @@ PassRefPtr QtInstance::getQtInstance(QObject* o, PassRefPtr ret = QtInstance::create(o, rootObject); + RefPtr ret = QtInstance::create(o, rootObject, ownership); cachedInstances.insert(o, ret.get()); return ret.release(); diff --git a/WebCore/bridge/qt/qt_instance.h b/WebCore/bridge/qt/qt_instance.h index 4cfaff8..526adb4 100644 --- a/WebCore/bridge/qt/qt_instance.h +++ b/WebCore/bridge/qt/qt_instance.h @@ -20,6 +20,7 @@ #ifndef BINDINGS_QT_INSTANCE_H_ #define BINDINGS_QT_INSTANCE_H_ +#include #include "runtime.h" #include "runtime_root.h" #include @@ -59,7 +60,7 @@ public: QObject* getObject() const { return m_object; } - static PassRefPtr getQtInstance(QObject*, PassRefPtr); + static PassRefPtr getQtInstance(QObject*, PassRefPtr, QScriptEngine::ValueOwnership ownership); virtual bool getOwnPropertySlot(JSObject*, ExecState*, const Identifier&, PropertySlot&); virtual void put(JSObject*, ExecState*, const Identifier&, JSValuePtr, PutPropertySlot&); @@ -67,14 +68,14 @@ public: static QtInstance* getInstance(JSObject*); private: - static PassRefPtr create(QObject *instance, PassRefPtr rootObject) + static PassRefPtr create(QObject *instance, PassRefPtr rootObject, QScriptEngine::ValueOwnership ownership) { - return adoptRef(new QtInstance(instance, rootObject)); + return adoptRef(new QtInstance(instance, rootObject, ownership)); } friend class QtClass; friend class QtField; - QtInstance(QObject*, PassRefPtr); // Factory produced only.. + QtInstance(QObject*, PassRefPtr, QScriptEngine::ValueOwnership ownership); // Factory produced only.. mutable QtClass* m_class; QPointer m_object; QObject* m_hashkey; @@ -82,6 +83,7 @@ private: mutable QHash m_fields; mutable QSet m_children; mutable QtRuntimeMetaMethod* m_defaultMethod; + QScriptEngine::ValueOwnership m_ownership; }; } // namespace Bindings diff --git a/WebCore/bridge/qt/qt_runtime.cpp b/WebCore/bridge/qt/qt_runtime.cpp index 282de42..31b343e 100644 --- a/WebCore/bridge/qt/qt_runtime.cpp +++ b/WebCore/bridge/qt/qt_runtime.cpp @@ -24,7 +24,9 @@ #include "DateMath.h" #include "DatePrototype.h" #include "FunctionPrototype.h" +#include "Interpreter.h" #include "JSArray.h" +#include "JSByteArray.h" #include "JSDOMBinding.h" #include "JSGlobalObject.h" #include "JSLock.h" @@ -95,7 +97,8 @@ typedef enum { QObj, Object, Null, - RTArray + RTArray, + JSByteArray } JSRealType; #if defined(QTWK_RUNTIME_CONVERSION_DEBUG) || defined(QTWK_RUNTIME_MATCH_DEBUG) @@ -120,6 +123,8 @@ static JSRealType valueRealType(ExecState* exec, JSValuePtr val) return Boolean; else if (val.isNull()) return Null; + else if (isJSByteArray(&exec->globalData(), val)) + return JSByteArray; else if (val.isObject()) { JSObject *object = val.toObject(exec); if (object->inherits(&RuntimeArray::s_info)) // RuntimeArray 'inherits' from Array, but not in C++ @@ -190,6 +195,9 @@ QVariant convertValueToQVariant(ExecState* exec, JSValuePtr value, QMetaType::Ty case QObj: hint = QMetaType::QObjectStar; break; + case JSByteArray: + hint = QMetaType::QByteArray; + break; case Array: case RTArray: hint = QMetaType::QVariantList; @@ -425,12 +433,18 @@ QVariant convertValueToQVariant(ExecState* exec, JSValuePtr value, QMetaType::Ty } case QMetaType::QByteArray: { - UString ustring = value.toString(exec); - ret = QVariant(QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size()).toLatin1()); - if (type == String) - dist = 5; - else - dist = 10; + if (type == JSByteArray) { + WTF::ByteArray* arr = asByteArray(value)->storage(); + ret = QVariant(QByteArray(reinterpret_cast(arr->data()), arr->length())); + dist = 0; + } else { + UString ustring = value.toString(exec); + ret = QVariant(QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size()).toLatin1()); + if (type == String) + dist = 5; + else + dist = 10; + } break; } @@ -822,14 +836,15 @@ JSValuePtr convertQVariantToValue(ExecState* exec, PassRefPtr root, } if (type == QMetaType::QByteArray) { - QByteArray ba = variant.value(); - UString ustring(ba.constData()); - return jsString(exec, ustring); + QByteArray qtByteArray = variant.value(); + WTF::RefPtr wtfByteArray = WTF::ByteArray::create(qtByteArray.length()); + qMemCopy(wtfByteArray->data(), qtByteArray.constData(), qtByteArray.length()); + return new (exec) JSC::JSByteArray(exec, JSC::JSByteArray::createStructure(jsNull()), wtfByteArray.get()); } if (type == QMetaType::QObjectStar || type == QMetaType::QWidgetStar) { QObject* obj = variant.value(); - return QtInstance::getQtInstance(obj, root)->createRuntimeObject(exec); + return QtInstance::getQtInstance(obj, root, QScriptEngine::QtOwnership)->createRuntimeObject(exec); } if (type == QMetaType::QVariantMap) { @@ -1678,7 +1693,7 @@ void QtConnectionObject::execute(void **argv) if (m_funcObject->inherits(&JSFunction::info)) { JSFunction* fimp = static_cast(m_funcObject.get()); - JSObject* qt_sender = QtInstance::getQtInstance(sender(), ro)->createRuntimeObject(exec); + JSObject* qt_sender = QtInstance::getQtInstance(sender(), ro, QScriptEngine::QtOwnership)->createRuntimeObject(exec); JSObject* wrapper = new (exec) JSObject(JSObject::createStructure(jsNull())); PutPropertySlot slot; wrapper->put(exec, Identifier(exec, "__qt_sender__"), qt_sender, slot); -- cgit v1.1