⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qt_runtime.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                        break; // Failed converting a list entry, so fail the array                    }                }                if (objdist != -1) {                    dist = 5;                    ret = QVariant(result);                }            } else if (type == Array) {                JSArray* array = static_cast<JSArray*>(object);                QVariantList result;                int len = array->length();                int objdist = 0;                qConvDebug() << "converting a " << len << " length Array";                for (int i = 0; i < len; ++i) {                    JSValuePtr val = array->get(exec, i);                    result.append(convertValueToQVariant(exec, val, QMetaType::Void, &objdist, visitedObjects));                    if (objdist == -1) {                        qConvDebug() << "Failed converting element at index " << i;                        break; // Failed converting a list entry, so fail the array                    }                }                if (objdist != -1) {                    dist = 5;                    ret = QVariant(result);                }            } else {                // Make a single length array                int objdist;                qConvDebug() << "making a single length variantlist";                QVariant var = convertValueToQVariant(exec, value, QMetaType::Void, &objdist, visitedObjects);                if (objdist != -1) {                    QVariantList result;                    result << var;                    ret = QVariant(result);                    dist = 10;                } else {                    qConvDebug() << "failed making single length varlist";                }            }            break;        case QMetaType::QStringList: {            if (type == RTArray) {                RuntimeArray* rtarray = static_cast<RuntimeArray*>(object);                QStringList result;                int len = rtarray->getLength();                for (int i = 0; i < len; ++i) {                    JSValuePtr val = rtarray->getConcreteArray()->valueAt(exec, i);                    UString ustring = val.toString(exec);                    QString qstring = QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size());                    result.append(qstring);                }                dist = 5;                ret = QVariant(result);            } else if (type == Array) {                JSArray* array = static_cast<JSArray*>(object);                QStringList result;                int len = array->length();                for (int i = 0; i < len; ++i) {                    JSValuePtr val = array->get(exec, i);                    UString ustring = val.toString(exec);                    QString qstring = QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size());                    result.append(qstring);                }                dist = 5;                ret = QVariant(result);            } else {                // Make a single length array                UString ustring = value.toString(exec);                QString qstring = QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size());                QStringList result;                result.append(qstring);                ret = QVariant(result);                dist = 10;            }            break;        }        case QMetaType::QByteArray: {            if (type == JSByteArray) {                WTF::ByteArray* arr = asByteArray(value)->storage();                ret = QVariant(QByteArray(reinterpret_cast<const char*>(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;        }        case QMetaType::QDateTime:        case QMetaType::QDate:        case QMetaType::QTime:            if (type == Date) {                DateInstance* date = static_cast<DateInstance*>(object);                GregorianDateTime gdt;                date->getUTCTime(gdt);                if (hint == QMetaType::QDateTime) {                    ret = QDateTime(QDate(gdt.year + 1900, gdt.month + 1, gdt.monthDay), QTime(gdt.hour, gdt.minute, gdt.second), Qt::UTC);                    dist = 0;                } else if (hint == QMetaType::QDate) {                    ret = QDate(gdt.year + 1900, gdt.month + 1, gdt.monthDay);                    dist = 1;                } else {                    ret = QTime(gdt.hour + 1900, gdt.minute, gdt.second);                    dist = 2;                }            } else if (type == Number) {                double b = value.toNumber(exec);                GregorianDateTime gdt;                msToGregorianDateTime(b, true, gdt);                if (hint == QMetaType::QDateTime) {                    ret = QDateTime(QDate(gdt.year + 1900, gdt.month + 1, gdt.monthDay), QTime(gdt.hour, gdt.minute, gdt.second), Qt::UTC);                    dist = 6;                } else if (hint == QMetaType::QDate) {                    ret = QDate(gdt.year + 1900, gdt.month + 1, gdt.monthDay);                    dist = 8;                } else {                    ret = QTime(gdt.hour, gdt.minute, gdt.second);                    dist = 10;                }            } else if (type == String) {                UString ustring = value.toString(exec);                QString qstring = QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size());                if (hint == QMetaType::QDateTime) {                    QDateTime dt = QDateTime::fromString(qstring, Qt::ISODate);                    if (!dt.isValid())                        dt = QDateTime::fromString(qstring, Qt::TextDate);                    if (!dt.isValid())                        dt = QDateTime::fromString(qstring, Qt::SystemLocaleDate);                    if (!dt.isValid())                        dt = QDateTime::fromString(qstring, Qt::LocaleDate);                    if (dt.isValid()) {                        ret = dt;                        dist = 2;                    }                } else if (hint == QMetaType::QDate) {                    QDate dt = QDate::fromString(qstring, Qt::ISODate);                    if (!dt.isValid())                        dt = QDate::fromString(qstring, Qt::TextDate);                    if (!dt.isValid())                        dt = QDate::fromString(qstring, Qt::SystemLocaleDate);                    if (!dt.isValid())                        dt = QDate::fromString(qstring, Qt::LocaleDate);                    if (dt.isValid()) {                        ret = dt;                        dist = 3;                    }                } else {                    QTime dt = QTime::fromString(qstring, Qt::ISODate);                    if (!dt.isValid())                        dt = QTime::fromString(qstring, Qt::TextDate);                    if (!dt.isValid())                        dt = QTime::fromString(qstring, Qt::SystemLocaleDate);                    if (!dt.isValid())                        dt = QTime::fromString(qstring, Qt::LocaleDate);                    if (dt.isValid()) {                        ret = dt;                        dist = 3;                    }                }            }            break;        case QMetaType::QRegExp:            if (type == RegExp) {/*                RegExpObject *re = static_cast<RegExpObject*>(object);*/                // Attempt to convert.. a bit risky                UString ustring = value.toString(exec);                QString qstring = QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size());                // this is of the form '/xxxxxx/i'                int firstSlash = qstring.indexOf(QLatin1Char('/'));                int lastSlash = qstring.lastIndexOf(QLatin1Char('/'));                if (firstSlash >=0 && lastSlash > firstSlash) {                    QRegExp realRe;                    realRe.setPattern(qstring.mid(firstSlash + 1, lastSlash - firstSlash - 1));                    if (qstring.mid(lastSlash + 1).contains(QLatin1Char('i')))                        realRe.setCaseSensitivity(Qt::CaseInsensitive);                    ret = qVariantFromValue(realRe);                    dist = 0;                } else {                    qConvDebug() << "couldn't parse a JS regexp";                }            } else if (type == String) {                UString ustring = value.toString(exec);                QString qstring = QString::fromUtf16((const ushort*)ustring.rep()->data(),ustring.size());                QRegExp re(qstring);                if (re.isValid()) {                    ret = qVariantFromValue(re);                    dist = 10;                }            }            break;        case QMetaType::QObjectStar:            if (type == QObj) {                QtInstance* qtinst = QtInstance::getInstance(object);                if (qtinst) {                    if (qtinst->getObject()) {                        qConvDebug() << "found instance, with object:" << (void*) qtinst->getObject();                        ret = qVariantFromValue(qtinst->getObject());                        qConvDebug() << ret;                        dist = 0;                    } else {                        qConvDebug() << "can't convert deleted qobject";                    }                } else {                    qConvDebug() << "wasn't a qtinstance";                }            } else if (type == Null) {                QObject* nullobj = 0;                ret = qVariantFromValue(nullobj);                dist = 0;            } else {                qConvDebug() << "previous type was not an object:" << type;            }            break;        case QMetaType::VoidStar:            if (type == QObj) {                QtInstance* qtinst = QtInstance::getInstance(object);                if (qtinst) {                    if (qtinst->getObject()) {                        qConvDebug() << "found instance, with object:" << (void*) qtinst->getObject();                        ret = qVariantFromValue((void *)qtinst->getObject());                        qConvDebug() << ret;                        dist = 0;                    } else {                        qConvDebug() << "can't convert deleted qobject";                    }                } else {                    qConvDebug() << "wasn't a qtinstance";                }            } else if (type == Null) {                ret = qVariantFromValue((void*)0);                dist = 0;            } else if (type == Number) {                // I don't think that converting a double to a pointer is a wise                // move.  Except maybe 0.                qConvDebug() << "got number for void * - not converting, seems unsafe:" << value.toNumber(exec);            } else {                qConvDebug() << "void* - unhandled type" << type;            }            break;        default:            // Non const type ids            if (hint == (QMetaType::Type) qMetaTypeId<QObjectList>())            {                if (type == RTArray) {                    RuntimeArray* rtarray = static_cast<RuntimeArray*>(object);                    QObjectList result;                    int len = rtarray->getLength();                    for (int i = 0; i < len; ++i) {                        JSValuePtr val = rtarray->getConcreteArray()->valueAt(exec, i);                        int itemdist = -1;                        QVariant item = convertValueToQVariant(exec, val, QMetaType::QObjectStar, &itemdist, visitedObjects);                        if (itemdist >= 0)                            result.append(item.value<QObject*>());                        else                            break;                    }                    // If we didn't fail conversion                    if (result.count() == len) {                        dist = 5;                        ret = QVariant::fromValue(result);                    }                } else if (type == Array) {                    JSObject* object = value.toObject(exec);                    JSArray* array = static_cast<JSArray *>(object);                    QObjectList result;                    int len = array->length();                    for (int i = 0; i < len; ++i) {                        JSValuePtr val = array->get(exec, i);                        int itemdist = -1;                        QVariant item = convertValueToQVariant(exec, val, QMetaType::QObjectStar, &itemdist, visitedObjects);                        if (itemdist >= 0)                            result.append(item.value<QObject*>());                        else                            break;                    }                    // If we didn't fail conversion                    if (result.count() == len) {                        dist = 5;                        ret = QVariant::fromValue(result);                    }                } else {                    // Make a single length array                    QObjectList result;                    int itemdist = -1;                    QVariant item = convertValueToQVariant(exec, value, QMetaType::QObjectStar, &itemdist, visitedObjects);                    if (itemdist >= 0) {                        result.append(item.value<QObject*>());                        dist = 10;                        ret = QVariant::fromValue(result);                    }                }                break;            } else if (hint == (QMetaType::Type) qMetaTypeId<QList<int> >()) {                if (type == RTArray) {                    RuntimeArray* rtarray = static_cast<RuntimeArray*>(object);                    QList<int> result;                    int len = rtarray->getLength();                    for (int i = 0; i < len; ++i) {                        JSValuePtr val = rtarray->getConcreteArray()->valueAt(exec, i);                        int itemdist = -1;                        QVariant item = convertValueToQVariant(exec, val, QMetaType::Int, &itemdist, visitedObjects);                        if (itemdist >= 0)                            result.append(item.value<int>());                        else                            break;                    }                    // If we didn't fail conversion                    if (result.count() == len) {                        dist = 5;                        ret = QVariant::fromValue(result);                    }                } else if (type == Array) {                    JSArray* array = static_cast<JSArray *>(object);                    QList<int> result;                    int len = array->length();                    for (int i = 0; i < len; ++i) {                        JSValuePtr val = array->get(exec, i);                        int itemdist = -1;                        QVariant item = convertValueToQVariant(exec, val, QMetaType::Int, &itemdist, visitedObjects);                        if (itemdist >= 0)                            result.append(item.value<int>());                        else                            break;                    }                    // If we didn't fail conversion

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -