Changeset 26972 in webkit for trunk/JavaScriptCore/bindings


Ignore:
Timestamp:
Oct 24, 2007, 5:32:36 AM (18 years ago)
Author:
lars
Message:

some changes to the way JS values are converted to Qt values in the script bindings. Added support for converting JS arrays into QStringList's.

Location:
trunk/JavaScriptCore/bindings/qt
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/bindings/qt/qt_instance.cpp

    r26168 r26972  
    8080}
    8181
    82 QVariant convertValueToQVariant(ExecState* exec, JSValue* value);
     82QVariant convertValueToQVariant(ExecState* exec, JSValue* value, QVariant::Type hint);
    8383JSValue* convertQVariantToValue(ExecState* exec, const QVariant& variant);
    8484   
     
    114114
    115115    for (int i = 0; i < args.size(); ++i) {
    116         vargs[i+1] = convertValueToQVariant(exec, args[i]);
    117116        QVariant::Type type = (QVariant::Type) QMetaType::type(argTypes.at(i));
    118117        if (!type) {
     
    120119            return jsUndefined();
    121120        }
    122         if (!vargs[i+1].convert(type))
     121        vargs[i+1] = convertValueToQVariant(exec, args[i], type);
     122        if (vargs[i+1].type() == QVariant::Invalid)
    123123            return jsUndefined();
    124124
  • trunk/JavaScriptCore/bindings/qt/qt_runtime.cpp

    r26168 r26972  
    2121#include "qt_runtime.h"
    2222#include "qt_instance.h"
     23#include "object.h"
     24#include "array_instance.h"
    2325
    2426#include "qmetaobject.h"
    2527#include "qobject.h"
     28#include "qstringlist.h"
    2629#include "qdebug.h"
    2730
     
    3033
    3134// Variant value must be released with NPReleaseVariantValue()
    32 QVariant convertValueToQVariant(ExecState* exec, JSValue* value)
     35QVariant convertValueToQVariant(ExecState* exec, JSValue* value, QVariant::Type hint)
    3336{
    3437    // check magic pointer values before dereferencing value
     
    3841    JSLock lock;
    3942    JSType type = value->type();
     43    if (hint == QVariant::Invalid) {
     44        switch(type) {
     45        case NullType:
     46        case UndefinedType:
     47        case UnspecifiedType:
     48        case StringType:
     49        case GetterSetterType:
     50            hint = QVariant::String;
     51            break;
     52        case NumberType:
     53            hint = QVariant::Double;
     54            break;
     55        case BooleanType:
     56            hint = QVariant::Bool;
     57            break;
     58        case ObjectType: {
     59            JSObject *object = value->toObject(exec);
     60            if (object->inherits(&ArrayInstance::info))
     61                hint = QVariant::List;
     62            else
     63                hint = QVariant::String;
     64        }
     65        }
     66    }
    4067
    41     if (type == StringType) {
     68    switch (hint) {
     69    case QVariant::Bool:
     70        return value->toBoolean(exec);
     71    case QVariant::Int:
     72    case QVariant::UInt:
     73    case QVariant::LongLong:
     74    case QVariant::ULongLong:
     75    case QVariant::Double: {
     76        QVariant v(value->toNumber(exec));
     77        v.convert(hint);
     78        return v;
     79    }
     80    case QVariant::Char:
     81        if (type == NumberType || type == BooleanType) {
     82            return QChar((ushort)value->toNumber(exec));
     83        } else {
     84            UString str = value->toString(exec);
     85            return QChar(str.size() ? *(const ushort*)str.rep()->data() : 0);
     86        }
     87   
     88//     case QVariant::Map:
     89//     case QVariant::List:
     90    case QVariant::String: {
    4291        UString ustring = value->toString(exec);
    4392        return QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size());
    44     } else if (type == NumberType) {
    45         return value->toNumber(exec);
    46     } else if (type == BooleanType) {
    47         return value->toBoolean(exec);
    48     } else if (type == UnspecifiedType) {
    49         return QVariant();
    50     } else if (type == NullType) {
    51         return QVariant();
    52     } else if (type == ObjectType) {
    53         return QVariant(); // #####
     93    }
     94    case QVariant::StringList: {
     95        if (type != ObjectType)
     96            return QVariant();
     97        JSObject *object = value->toObject(exec);
     98        if (!object->inherits(&ArrayInstance::info))
     99            return QVariant();
     100        ArrayInstance *array = static_cast<ArrayInstance *>(object);
     101
     102        QStringList result;
     103        int len = array->getLength();
     104        for (int i = 0; i < len; ++i) {
     105            JSValue *val = array->getItem(i);
     106            UString ustring = val->toString(exec);
     107            QString qstring = QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size());
     108           
     109            result.append(qstring);
     110        }
     111        return result;
     112    }       
     113    case QVariant::ByteArray: {
     114        UString ustring = value->toString(exec);
     115        return QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size()).toLatin1();
     116    }
     117    default:
     118        break;
    54119    }
    55120    return QVariant();
     
    102167    QObject* obj = instance->getObject();
    103168   
    104     QVariant val = convertValueToQVariant(exec, aValue);
     169    QVariant val = convertValueToQVariant(exec, aValue, QVariant::Invalid);
    105170    property.write(obj, val);
    106171}
Note: See TracChangeset for help on using the changeset viewer.