QScriptDebuggerValue::QScriptDebuggerValue(const QScriptValue &value) : d_ptr(0) { if (value.isValid()) { d_ptr = new QScriptDebuggerValuePrivate; if (value.isUndefined()) d_ptr->type = UndefinedValue; else if (value.isNull()) d_ptr->type = NullValue; else if (value.isNumber()) { d_ptr->type = NumberValue; d_ptr->numberValue = value.toNumber(); } else if (value.isBoolean()) { d_ptr->type = BooleanValue; d_ptr->booleanValue = value.toBoolean(); } else if (value.isString()) { d_ptr->type = StringValue; d_ptr->stringValue = new QString(value.toString()); } else { Q_ASSERT(value.isObject()); d_ptr->type = ObjectValue; d_ptr->objectId = value.objectId(); } d_ptr->ref.ref(); } }
void ScriptHandler::validateData(DataInformation* data) { if (!data) return; data->setHasBeenValidated(false); //not yet validated if (data->hasChildren()) { //first validate the children for (uint i = 0; i < data->childCount(); ++i) { validateData(data->childAt(i)); } } //check if has a validation function: AdditionalData* additionalData = data->additionalData(); if (additionalData && additionalData->validationFunction().isValid()) { //value exists, we assume it has been checked to be a function #ifdef OKTETA_DEBUG_SCRIPT mDebugger->attachTo(mEngine); mDebugger->action(QScriptEngineDebugger::InterruptAction)->trigger(); kDebug() << "validating element: " << data->name(); #endif // QScriptValue thisObject = mEngine->newQObject(data, // QScriptEngine::QtOwnership, QScriptEngine::ExcludeDeleteLater); // QScriptValue mainStruct = mEngine->newQObject(data->mainStructure(), // QScriptEngine::QtOwnership, QScriptEngine::ExcludeDeleteLater); QScriptValue thisObject = data->toScriptValue(mEngine, &mHandlerInfo); QScriptValue mainStruct = data->mainStructure()->toScriptValue(mEngine, &mHandlerInfo); QScriptValueList args; args << mainStruct; QScriptValue result = additionalData->validationFunction().call(thisObject, args); if (result.isError()) { ScriptUtils::object()->logScriptError(QLatin1String("error occurred while " "validating element ") + data->name(), result); data->setValidationError(QLatin1String("Error occurred in validation: ") + result.toString()); } if (mEngine->hasUncaughtException()) { ScriptUtils::object()->logScriptError( mEngine->uncaughtExceptionBacktrace()); data->setValidationError(QLatin1String("Error occurred in validation: ") + result.toString()); } if (result.isBool() || result.isBoolean()) { data->setValidationSuccessful(result.toBool()); } } }
void ScriptHandler::validateData(DataInformation* data) { Q_CHECK_PTR(data); if (data->hasBeenValidated()) return; //first validate the children for (uint i = 0; i < data->childCount(); ++i) validateData(data->childAt(i)); //check if has a validation function: QScriptValue validationFunc = data->validationFunc(); if (validationFunc.isValid()) { QScriptValue result = callFunction(validationFunc, data, ScriptHandlerInfo::Validating); if (result.isError()) { mTopLevel->logger()->error(data) << "Error occurred while validating element: " << result.toString(); data->setValidationError(QStringLiteral("Error occurred in validation: ") + result.toString()); } else if (mEngine->hasUncaughtException()) { mTopLevel->logger()->error(data) << "Error occurred while validating element:" << result.toString() << "\nBacktrace:" << mEngine->uncaughtExceptionBacktrace(); data->setValidationError(QStringLiteral("Error occurred in validation: ") + result.toString()); mEngine->clearExceptions(); } if (result.isBool() || result.isBoolean()) { data->mValidationSuccessful = result.toBool(); } if (result.isString()) { //error string QString str = result.toString(); if (!str.isEmpty()) data->setValidationError(str); } data->mHasBeenValidated = true; } }
/*! Returns the match score for converting \a actual to be of type \a conversionType. A zero score means "perfect match" whereas a higher score is worse. The conversion table is copied out of the QtScript callQtMethod() function. */ int QDeclarativeObjectMethodScriptClass::matchScore(const QScriptValue &actual, int conversionType, const QByteArray &conversionTypeName) { if (actual.isNumber()) { switch (conversionType) { case QMetaType::Double: return 0; case QMetaType::Float: return 1; case QMetaType::LongLong: case QMetaType::ULongLong: return 2; case QMetaType::Long: case QMetaType::ULong: return 3; case QMetaType::Int: case QMetaType::UInt: return 4; case QMetaType::Short: case QMetaType::UShort: return 5; break; case QMetaType::Char: case QMetaType::UChar: return 6; default: return 10; } } else if (actual.isString()) { switch (conversionType) { case QMetaType::QString: return 0; default: return 10; } } else if (actual.isBoolean()) { switch (conversionType) { case QMetaType::Bool: return 0; default: return 10; } } else if (actual.isDate()) { switch (conversionType) { case QMetaType::QDateTime: return 0; case QMetaType::QDate: return 1; case QMetaType::QTime: return 2; default: return 10; } } else if (actual.isRegExp()) { switch (conversionType) { case QMetaType::QRegExp: return 0; default: return 10; } } else if (actual.isVariant()) { if (conversionType == qMetaTypeId<QVariant>()) return 0; else if (actual.toVariant().userType() == conversionType) return 0; else return 10; } else if (actual.isArray()) { switch (conversionType) { case QMetaType::QStringList: case QMetaType::QVariantList: return 5; default: return 10; } } else if (actual.isQObject()) { switch (conversionType) { case QMetaType::QObjectStar: return 0; default: return 10; } } else if (actual.isNull()) { switch (conversionType) { case QMetaType::VoidStar: case QMetaType::QObjectStar: return 0; default: if (!conversionTypeName.endsWith('*')) return 10; else return 0; } } else { return 10; } }
void tst_QScriptClass::extension() { QScriptEngine eng; { TestClass cls(&eng); cls.setCallableMode(TestClass::NotCallable); QVERIFY(!cls.supportsExtension(QScriptClass::Callable)); QVERIFY(!cls.supportsExtension(QScriptClass::HasInstance)); } // Callable { TestClass cls(&eng); cls.setCallableMode(TestClass::CallableReturnsSum); QVERIFY(cls.supportsExtension(QScriptClass::Callable)); QScriptValue obj = eng.newObject(&cls); obj.setProperty("one", QScriptValue(&eng, 1)); obj.setProperty("two", QScriptValue(&eng, 2)); obj.setProperty("three", QScriptValue(&eng, 3)); { QScriptValueList args; args << QScriptValue(&eng, 4) << QScriptValue(&eng, 5); QScriptValue ret = obj.call(obj, args); QCOMPARE(ret.toNumber(), qsreal(15)); } cls.setCallableMode(TestClass::CallableReturnsArgument); { QScriptValue ret = obj.call(obj, QScriptValueList() << 123); QVERIFY(ret.isNumber()); QCOMPARE(ret.toInt32(), 123); } { QScriptValue ret = obj.call(obj, QScriptValueList() << true); QVERIFY(ret.isBoolean()); QCOMPARE(ret.toBoolean(), true); } { QScriptValue ret = obj.call(obj, QScriptValueList() << QString::fromLatin1("ciao")); QVERIFY(ret.isString()); QCOMPARE(ret.toString(), QString::fromLatin1("ciao")); } { QScriptValue objobj = eng.newObject(); QScriptValue ret = obj.call(obj, QScriptValueList() << objobj); QVERIFY(ret.isObject()); QVERIFY(ret.strictlyEquals(objobj)); } { QScriptValue ret = obj.call(obj, QScriptValueList() << QScriptValue()); QVERIFY(ret.isUndefined()); } cls.setCallableMode(TestClass::CallableReturnsInvalidVariant); { QScriptValue ret = obj.call(obj); QVERIFY(ret.isUndefined()); } } // HasInstance { TestClass cls(&eng); cls.setHasInstance(true); QVERIFY(cls.supportsExtension(QScriptClass::HasInstance)); QScriptValue obj = eng.newObject(&cls); obj.setProperty("foo", QScriptValue(&eng, 123)); QScriptValue plain = eng.newObject(); QVERIFY(!plain.instanceOf(obj)); eng.globalObject().setProperty("HasInstanceTester", obj); eng.globalObject().setProperty("hasInstanceValue", plain); { QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester"); QVERIFY(ret.isBoolean()); QVERIFY(!ret.toBoolean()); } plain.setProperty("foo", QScriptValue(&eng, 456)); QVERIFY(!plain.instanceOf(obj)); { QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester"); QVERIFY(ret.isBoolean()); QVERIFY(!ret.toBoolean()); } plain.setProperty("foo", obj.property("foo")); QVERIFY(plain.instanceOf(obj)); { QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester"); QVERIFY(ret.isBoolean()); QVERIFY(ret.toBoolean()); } } }
void tst_QScriptClass::extension() { QScriptEngine eng; { TestClass cls(&eng); cls.setCallableMode(TestClass::NotCallable); QVERIFY(!cls.supportsExtension(QScriptClass::Callable)); QVERIFY(!cls.supportsExtension(QScriptClass::HasInstance)); QScriptValue obj = eng.newObject(&cls); QVERIFY(!obj.call().isValid()); QCOMPARE((int)cls.lastExtensionType(), -1); QVERIFY(!obj.instanceOf(obj)); QCOMPARE((int)cls.lastExtensionType(), -1); } // Callable { TestClass cls(&eng); cls.setCallableMode(TestClass::CallableReturnsSum); QVERIFY(cls.supportsExtension(QScriptClass::Callable)); QScriptValue obj = eng.newObject(&cls); eng.globalObject().setProperty("obj", obj); obj.setProperty("one", QScriptValue(&eng, 1)); obj.setProperty("two", QScriptValue(&eng, 2)); obj.setProperty("three", QScriptValue(&eng, 3)); // From C++ cls.clearReceivedArgs(); { QScriptValueList args; args << QScriptValue(&eng, 4) << QScriptValue(&eng, 5); QScriptValue ret = obj.call(obj, args); QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); QVERIFY(ret.isNumber()); QCOMPARE(ret.toNumber(), qsreal(15)); } // From JS cls.clearReceivedArgs(); { QScriptValue ret = eng.evaluate("obj(4, 5)"); QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); QVERIFY(ret.isNumber()); QCOMPARE(ret.toNumber(), qsreal(15)); } cls.setCallableMode(TestClass::CallableReturnsArgument); // From C++ cls.clearReceivedArgs(); { QScriptValue ret = obj.call(obj, QScriptValueList() << 123); QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); QVERIFY(ret.isNumber()); QCOMPARE(ret.toInt32(), 123); } cls.clearReceivedArgs(); { QScriptValue ret = obj.call(obj, QScriptValueList() << true); QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); QVERIFY(ret.isBoolean()); QCOMPARE(ret.toBoolean(), true); } { QScriptValue ret = obj.call(obj, QScriptValueList() << QString::fromLatin1("ciao")); QVERIFY(ret.isString()); QCOMPARE(ret.toString(), QString::fromLatin1("ciao")); } { QScriptValue objobj = eng.newObject(); QScriptValue ret = obj.call(obj, QScriptValueList() << objobj); QVERIFY(ret.isObject()); QVERIFY(ret.strictlyEquals(objobj)); } { QScriptValue ret = obj.call(obj, QScriptValueList() << QScriptValue()); QVERIFY(ret.isUndefined()); } // From JS cls.clearReceivedArgs(); { QScriptValue ret = eng.evaluate("obj(123)"); QVERIFY(ret.isNumber()); QCOMPARE(ret.toInt32(), 123); } cls.setCallableMode(TestClass::CallableReturnsInvalidVariant); { QScriptValue ret = obj.call(obj); QVERIFY(ret.isUndefined()); } cls.setCallableMode(TestClass::CallableReturnsThisObject); // From C++ { QScriptValue ret = obj.call(obj); QVERIFY(ret.isObject()); QVERIFY(ret.strictlyEquals(obj)); } // From JS { QScriptValue ret = eng.evaluate("obj()"); QVERIFY(ret.isObject()); QVERIFY(ret.strictlyEquals(eng.globalObject())); } cls.setCallableMode(TestClass::CallableReturnsCallee); // From C++ { QScriptValue ret = obj.call(); QVERIFY(ret.isObject()); QVERIFY(ret.strictlyEquals(obj)); } // From JS { QScriptValue ret = eng.evaluate("obj()"); QVERIFY(ret.isObject()); QVERIFY(ret.strictlyEquals(obj)); } cls.setCallableMode(TestClass::CallableReturnsArgumentsObject); // From C++ { QScriptValue ret = obj.call(obj, QScriptValueList() << 123); QVERIFY(ret.isObject()); QVERIFY(ret.property("length").isNumber()); QCOMPARE(ret.property("length").toInt32(), 1); QVERIFY(ret.property(0).isNumber()); QCOMPARE(ret.property(0).toInt32(), 123); } // From JS { QScriptValue ret = eng.evaluate("obj(123)"); QVERIFY(ret.isObject()); QVERIFY(ret.property("length").isNumber()); QCOMPARE(ret.property("length").toInt32(), 1); QVERIFY(ret.property(0).isNumber()); QCOMPARE(ret.property(0).toInt32(), 123); } // construct() // From C++ cls.clearReceivedArgs(); cls.setCallableMode(TestClass::CallableReturnsGlobalObject); { QScriptValue ret = obj.construct(); QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); QVERIFY(ret.isObject()); QVERIFY(ret.strictlyEquals(eng.globalObject())); } // From JS cls.clearReceivedArgs(); { QScriptValue ret = eng.evaluate("new obj()"); QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); QVERIFY(ret.isObject()); QVERIFY(ret.strictlyEquals(eng.globalObject())); } // From C++ cls.clearReceivedArgs(); cls.setCallableMode(TestClass::CallableInitializesThisObject); { QScriptValue ret = obj.construct(); QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); QVERIFY(ret.isQObject()); QCOMPARE(ret.toQObject(), (QObject*)&eng); } // From JS cls.clearReceivedArgs(); { QScriptValue ret = eng.evaluate("new obj()"); QCOMPARE(cls.lastExtensionType(), QScriptClass::Callable); QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptContext*>()); QVERIFY(ret.isQObject()); QCOMPARE(ret.toQObject(), (QObject*)&eng); } } // HasInstance { TestClass cls(&eng); cls.setHasInstance(true); QVERIFY(cls.supportsExtension(QScriptClass::HasInstance)); QScriptValue obj = eng.newObject(&cls); obj.setProperty("foo", QScriptValue(&eng, 123)); QScriptValue plain = eng.newObject(); QVERIFY(!plain.instanceOf(obj)); eng.globalObject().setProperty("HasInstanceTester", obj); eng.globalObject().setProperty("hasInstanceValue", plain); cls.clearReceivedArgs(); { QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester"); QCOMPARE(cls.lastExtensionType(), QScriptClass::HasInstance); QCOMPARE(cls.lastExtensionArgument().userType(), qMetaTypeId<QScriptValueList>()); QScriptValueList lst = qvariant_cast<QScriptValueList>(cls.lastExtensionArgument()); QCOMPARE(lst.size(), 2); QVERIFY(lst.at(0).strictlyEquals(obj)); QVERIFY(lst.at(1).strictlyEquals(plain)); QVERIFY(ret.isBoolean()); QVERIFY(!ret.toBoolean()); } plain.setProperty("foo", QScriptValue(&eng, 456)); QVERIFY(!plain.instanceOf(obj)); { QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester"); QVERIFY(ret.isBoolean()); QVERIFY(!ret.toBoolean()); } plain.setProperty("foo", obj.property("foo")); QVERIFY(plain.instanceOf(obj)); { QScriptValue ret = eng.evaluate("hasInstanceValue instanceof HasInstanceTester"); QVERIFY(ret.isBoolean()); QVERIFY(ret.toBoolean()); } } }
void tst_QScriptValueGenerated::isBoolean_test(const char*, const QScriptValue& value) { QFETCH(bool, expected); QCOMPARE(value.isBoolean(), expected); QCOMPARE(value.isBoolean(), expected); }