📄 tst_qwebframe.cpp
字号:
QCOMPARE(evalJS("myObject.mySignal.disconnect(otherObject, myHandler)"), sUndefined); evalJS("gotSignal = false"); m_myObject->emitMySignal(); QCOMPARE(evalJS("gotSignal"), sFalse); { QString type; evalJS("myObject.mySignal.disconnect(otherObject, myHandler)", type); QCOMPARE(type, sError); } QCOMPARE(evalJS("myObject.mySignal.connect(otherObject, myHandler)"), sUndefined); evalJS("gotSignal = false"); m_myObject->emitMySignal(); QCOMPARE(evalJS("gotSignal"), sTrue); QCOMPARE(evalJS("signalArgs.length == 0"), sTrue); QCOMPARE(evalJS("slotThisObject"),evalJS("otherObject")); QCOMPARE(evalJS("signalSender"),evalJS("myObject")); QCOMPARE(evalJS("slotThisObject.name"), QLatin1String("foo")); QCOMPARE(evalJS("myObject.mySignal.disconnect(otherObject, myHandler)"), sUndefined); evalJS("yetAnotherObject = { name:'bar', func : function() { } }"); QCOMPARE(evalJS("myObject.mySignal2.connect(yetAnotherObject, myHandler)"), sUndefined); evalJS("gotSignal = false"); m_myObject->emitMySignal2(true); QCOMPARE(evalJS("gotSignal"), sTrue); QCOMPARE(evalJS("signalArgs.length == 1"), sTrue); QCOMPARE(evalJS("slotThisObject == yetAnotherObject"), sTrue); QCOMPARE(evalJS("signalSender == myObject"), sTrue); QCOMPARE(evalJS("slotThisObject.name"), QLatin1String("bar")); QCOMPARE(evalJS("myObject.mySignal2.disconnect(yetAnotherObject, myHandler)"), sUndefined); QCOMPARE(evalJS("myObject.mySignal2.connect(myObject, myHandler)"), sUndefined); evalJS("gotSignal = false"); m_myObject->emitMySignal2(true); QCOMPARE(evalJS("gotSignal"), sTrue); QCOMPARE(evalJS("signalArgs.length == 1"), sTrue); QCOMPARE(evalJS("slotThisObject == myObject"), sTrue); QCOMPARE(evalJS("signalSender == myObject"), sTrue); QCOMPARE(evalJS("myObject.mySignal2.disconnect(myObject, myHandler)"), sUndefined); // connect(obj, string) QCOMPARE(evalJS("myObject.mySignal.connect(yetAnotherObject, 'func')"), sUndefined); QCOMPARE(evalJS("myObject.mySignal.connect(myObject, 'mySlot')"), sUndefined); QCOMPARE(evalJS("myObject.mySignal.disconnect(yetAnotherObject, 'func')"), sUndefined); QCOMPARE(evalJS("myObject.mySignal.disconnect(myObject, 'mySlot')"), sUndefined); // check that emitting signals from script works // no arguments QCOMPARE(evalJS("myObject.mySignal.connect(myObject.mySlot)"), sUndefined); m_myObject->resetQtFunctionInvoked(); QCOMPARE(evalJS("myObject.mySignal()"), sUndefined); QCOMPARE(m_myObject->qtFunctionInvoked(), 20); QCOMPARE(evalJS("myObject.mySignal.disconnect(myObject.mySlot)"), sUndefined); // one argument QCOMPARE(evalJS("myObject.mySignalWithIntArg.connect(myObject.mySlotWithIntArg)"), sUndefined); m_myObject->resetQtFunctionInvoked(); QCOMPARE(evalJS("myObject.mySignalWithIntArg(123)"), sUndefined); QCOMPARE(m_myObject->qtFunctionInvoked(), 21); QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 123); QCOMPARE(evalJS("myObject.mySignalWithIntArg.disconnect(myObject.mySlotWithIntArg)"), sUndefined); QCOMPARE(evalJS("myObject.mySignalWithIntArg.connect(myObject.mySlotWithDoubleArg)"), sUndefined); m_myObject->resetQtFunctionInvoked(); QCOMPARE(evalJS("myObject.mySignalWithIntArg(123)"), sUndefined); QCOMPARE(m_myObject->qtFunctionInvoked(), 22); QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); QCOMPARE(m_myObject->qtFunctionActuals().at(0).toDouble(), 123.0); QCOMPARE(evalJS("myObject.mySignalWithIntArg.disconnect(myObject.mySlotWithDoubleArg)"), sUndefined); QCOMPARE(evalJS("myObject.mySignalWithIntArg.connect(myObject.mySlotWithStringArg)"), sUndefined); m_myObject->resetQtFunctionInvoked(); QCOMPARE(evalJS("myObject.mySignalWithIntArg(123)"), sUndefined); QCOMPARE(m_myObject->qtFunctionInvoked(), 23); QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); QCOMPARE(m_myObject->qtFunctionActuals().at(0).toString(), QLatin1String("123")); QCOMPARE(evalJS("myObject.mySignalWithIntArg.disconnect(myObject.mySlotWithStringArg)"), sUndefined); // connecting to overloaded slot QCOMPARE(evalJS("myObject.mySignalWithIntArg.connect(myObject.myOverloadedSlot)"), sUndefined); m_myObject->resetQtFunctionInvoked(); QCOMPARE(evalJS("myObject.mySignalWithIntArg(123)"), sUndefined); QCOMPARE(m_myObject->qtFunctionInvoked(), 26); // double overload QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 123); QCOMPARE(evalJS("myObject.mySignalWithIntArg.disconnect(myObject.myOverloadedSlot)"), sUndefined); QCOMPARE(evalJS("myObject.mySignalWithIntArg.connect(myObject['myOverloadedSlot(int)'])"), sUndefined); m_myObject->resetQtFunctionInvoked(); QCOMPARE(evalJS("myObject.mySignalWithIntArg(456)"), sUndefined); QCOMPARE(m_myObject->qtFunctionInvoked(), 28); // int overload QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), 456); QCOMPARE(evalJS("myObject.mySignalWithIntArg.disconnect(myObject['myOverloadedSlot(int)'])"), sUndefined); // erroneous input { // ### QtScript adds .connect to all functions, WebKit does only to signals/slots QString type; QString ret = evalJS("(function() { }).connect()", type); QCOMPARE(type, sError); QCOMPARE(ret, QLatin1String("TypeError: Result of expression '(function() { }).connect' [undefined] is not a function.")); } { QString type; QString ret = evalJS("var o = { }; o.connect = Function.prototype.connect; o.connect()", type); QCOMPARE(type, sError); QCOMPARE(ret, QLatin1String("TypeError: Result of expression 'o.connect' [undefined] is not a function.")); } { QString type; QString ret = evalJS("(function() { }).connect(123)", type); QCOMPARE(type, sError); QCOMPARE(ret, QLatin1String("TypeError: Result of expression '(function() { }).connect' [undefined] is not a function.")); } { QString type; QString ret = evalJS("var o = { }; o.connect = Function.prototype.connect; o.connect(123)", type); QCOMPARE(type, sError); QCOMPARE(ret, QLatin1String("TypeError: Result of expression 'o.connect' [undefined] is not a function.")); } { QString type; QString ret = evalJS("myObject.myInvokable.connect(123)", type); QCOMPARE(type, sError); QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.connect: MyQObject::myInvokable() is not a signal")); } { QString type; QString ret = evalJS("myObject.myInvokable.connect(function() { })", type); QCOMPARE(type, sError); QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.connect: MyQObject::myInvokable() is not a signal")); } { QString type; QString ret = evalJS("myObject.mySignal.connect(123)", type); QCOMPARE(type, sError); QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.connect: target is not a function")); } { QString type; QString ret = evalJS("myObject.mySignal.disconnect()", type); QCOMPARE(type, sError); QCOMPARE(ret, QLatin1String("Error: QtMetaMethod.disconnect: no arguments given")); } { QString type; QString ret = evalJS("var o = { }; o.disconnect = myObject.mySignal.disconnect; o.disconnect()", type); QCOMPARE(type, sError); QCOMPARE(ret, QLatin1String("Error: QtMetaMethod.disconnect: no arguments given")); } /* XFAIL - Function.prototype doesn't get connect/disconnect, just signals/slots { QString type; QString ret = evalJS("(function() { }).disconnect(123)", type); QCOMPARE(type, sError); QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.disconnect: this object is not a signal")); } */ { QString type; QString ret = evalJS("var o = { }; o.disconnect = myObject.myInvokable.disconnect; o.disconnect(123)", type); QCOMPARE(type, sError); QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.disconnect: MyQObject::myInvokable() is not a signal")); } { QString type; QString ret = evalJS("myObject.myInvokable.disconnect(123)", type); QCOMPARE(type, sError); QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.disconnect: MyQObject::myInvokable() is not a signal")); } { QString type; QString ret = evalJS("myObject.myInvokable.disconnect(function() { })", type); QCOMPARE(type, sError); QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.disconnect: MyQObject::myInvokable() is not a signal")); } { QString type; QString ret = evalJS("myObject.mySignal.disconnect(123)", type); QCOMPARE(type, sError); QCOMPARE(ret, QLatin1String("TypeError: QtMetaMethod.disconnect: target is not a function")); } { QString type; QString ret = evalJS("myObject.mySignal.disconnect(function() { })", type); QCOMPARE(type, sError); QCOMPARE(ret, QLatin1String("Error: QtMetaMethod.disconnect: failed to disconnect from MyQObject::mySignal()")); } // when the wrapper dies, the connection stays alive QCOMPARE(evalJS("myObject.mySignal.connect(myObject.mySlot)"), sUndefined); m_myObject->resetQtFunctionInvoked(); m_myObject->emitMySignal(); QCOMPARE(m_myObject->qtFunctionInvoked(), 20); evalJS("myObject = null"); evalJS("gc()"); m_myObject->resetQtFunctionInvoked(); m_myObject->emitMySignal(); QCOMPARE(m_myObject->qtFunctionInvoked(), 20);}void tst_QWebFrame::classEnums(){ // We don't do the meta thing currently, unfortunately!!! /* QString myClass = m_engine->newQMetaObject(m_myObject->metaObject(), m_engine->undefinedValue()); m_engine->globalObject().setProperty("MyQObject", myClass); QCOMPARE(static_cast<MyQObject::Policy>(evalJS("MyQObject.FooPolicy").toInt()), MyQObject::FooPolicy); QCOMPARE(static_cast<MyQObject::Policy>(evalJS("MyQObject.BarPolicy").toInt()), MyQObject::BarPolicy); QCOMPARE(static_cast<MyQObject::Policy>(evalJS("MyQObject.BazPolicy").toInt()), MyQObject::BazPolicy); QCOMPARE(static_cast<MyQObject::Strategy>(evalJS("MyQObject.FooStrategy").toInt()), MyQObject::FooStrategy); QCOMPARE(static_cast<MyQObject::Strategy>(evalJS("MyQObject.BarStrategy").toInt()), MyQObject::BarStrategy); QCOMPARE(static_cast<MyQObject::Strategy>(evalJS("MyQObject.BazStrategy").toInt()), MyQObject::BazStrategy); QCOMPARE(MyQObject::Ability(evalJS("MyQObject.NoAbility").toInt()), MyQObject::NoAbility); QCOMPARE(MyQObject::Ability(evalJS("MyQObject.FooAbility").toInt()), MyQObject::FooAbility); QCOMPARE(MyQObject::Ability(evalJS("MyQObject.BarAbility").toInt()), MyQObject::BarAbility); QCOMPARE(MyQObject::Ability(evalJS("MyQObject.BazAbility").toInt()), MyQObject::BazAbility); QCOMPARE(MyQObject::Ability(evalJS("MyQObject.AllAbility").toInt()), MyQObject::AllAbility); // enums from Qt are inherited through prototype QCOMPARE(static_cast<Qt::FocusPolicy>(evalJS("MyQObject.StrongFocus").toInt()), Qt::StrongFocus); QCOMPARE(static_cast<Qt::Key>(evalJS("MyQObject.Key_Left").toInt()), Qt::Key_Left); QCOMPARE(evalJS("MyQObject.className()"), QLatin1String("MyQObject")); qRegisterMetaType<MyQObject::Policy>("Policy"); m_myObject->resetQtFunctionInvoked(); QCOMPARE(evalJS("myObject.myInvokableWithEnumArg(MyQObject.BazPolicy)"), sUndefined); QCOMPARE(m_myObject->qtFunctionInvoked(), 10); QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), int(MyQObject::BazPolicy)); m_myObject->resetQtFunctionInvoked(); QCOMPARE(evalJS("myObject.myInvokableWithQualifiedEnumArg(MyQObject.BazPolicy)"), sUndefined); QCOMPARE(m_myObject->qtFunctionInvoked(), 36); QCOMPARE(m_myObject->qtFunctionActuals().size(), 1); QCOMPARE(m_myObject->qtFunctionActuals().at(0).toInt(), int(MyQObject::BazPolicy)); m_myObject->resetQtFunctionInvoked(); { QVariant ret = evalJS("myObject.myInvokableReturningEnum()"); QCOMPARE(m_myObject->qtFunctionInvoked(), 37); QCOMPARE(m_myObject->qtFunctionActuals().size(), 0); QCOMPARE(ret.isVariant()); } m_myObject->resetQtFunctionInvoked(); { QVariant ret = evalJS("myObject.myInvokableReturningQualifiedEnum()"); QCOMPARE(m_myObject->qtFunctionInvoked(), 38); QCOMPARE(m_myObject->qtFunctionActuals().size(), 0); QCOMPARE(ret.isNumber()); } */}void tst_QWebFrame::classConstructor(){ /* QString myClass = qScriptValueFromQMetaObject<MyQObject>(m_engine); m_engine->globalObject().setProperty("MyQObject", myClass); QString myObj = evalJS("myObj = MyQObject()"); QObject* qobj = myObj.toQObject(); QVERIFY(qobj != 0); QCOMPARE(qobj->metaObject()->className(), "MyQObject"); QCOMPARE(qobj->parent(), (QObject*)0); QString qobjectClass = qScriptValueFromQMetaObject<QObject>(m_engine); m_engine->globalObject().setProperty("QObject", qobjectClass); QString otherObj = evalJS("otherObj = QObject(myObj)"); QObject* qqobj = otherObj.toQObject(); QVERIFY(qqobj != 0); QCOMPARE(qqobj->metaObject()->className(), "QObject"); QCOMPARE(qqobj->parent(), qobj); delete qobj; */}void tst_QWebFrame::overrideInvokable(){ m_myObject->resetQtFunctionInvoked(); QCOMPARE(evalJS("myObject.myInvokable()"), sUndefined); QCOMPARE(m_myObject->qtFunctionInvoked(), 0); /* XFAIL - can't write to functions with RuntimeObject m_myObject->resetQtFunctionInvoked(); evalJS("myObject.myInvokable = function() { window.a = 123; }"); evalJS("myObject.myInvokable()"); QCOMPARE(m_myObject->qtFunctionInvoked(), -1); QCOMPARE(evalJS("window.a").toDouble(), 123.0); evalJS("myObject.myInvokable = function() { window.a = 456; }"); evalJS("myObject.myInvokable()"); QCOMPARE(m_myObject->qtFunctionInvoked(), -1); QCOMPARE(evalJS("window.a").toDouble(), 456.0); */ evalJS("delete myObject.myInvokable"); evalJS("myObject.myInvokable()"); QCOMPARE(m_myObject->qtFunctionInvoked(), 0); /* XFAIL - ditto m_myObject->resetQtFunctionInvoked(); evalJS("myObject.myInvokable = myObject.myInvokableWithIntArg"); evalJS("myObject.myInvokable(123)"); QCOMPARE(m_myObject->qtFunctionInvoked(), 1); */ evalJS("delete myObject.myInvokable"); m_myObject->resetQtFunctionInvoked(); // this form (with the '()') is read-only evalJS("myObje
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -