📄 tst_qwebframe.cpp
字号:
m_qtFunctionInvoked = 48; return *this; } Q_INVOKABLE const QObject& myInvokableReturningConstRef() const { const_cast<MyQObject*>(this)->m_qtFunctionInvoked = 49; return *this; } Q_INVOKABLE void myInvokableWithPointArg(const QPoint &arg) { const_cast<MyQObject*>(this)->m_qtFunctionInvoked = 50; m_actuals << qVariantFromValue(arg); } Q_INVOKABLE void myInvokableWithPointArg(const QPointF &arg) { const_cast<MyQObject*>(this)->m_qtFunctionInvoked = 51; m_actuals << qVariantFromValue(arg); } Q_INVOKABLE void myInvokableWithBoolArg(bool arg) { m_qtFunctionInvoked = 52; m_actuals << arg; } void emitMySignal() { emit mySignal(); } void emitMySignalWithIntArg(int arg) { emit mySignalWithIntArg(arg); } void emitMySignal2(bool arg) { emit mySignal2(arg); } void emitMySignal2() { emit mySignal2(); } void emitMySignalWithDateTimeArg(QDateTime dt) { emit mySignalWithDateTimeArg(dt); } void emitMySignalWithRegexArg(QRegExp r) { emit mySignalWithRegexArg(r); }public Q_SLOTS: void mySlot() { m_qtFunctionInvoked = 20; } void mySlotWithIntArg(int arg) { m_qtFunctionInvoked = 21; m_actuals << arg; } void mySlotWithDoubleArg(double arg) { m_qtFunctionInvoked = 22; m_actuals << arg; } void mySlotWithStringArg(const QString &arg) { m_qtFunctionInvoked = 23; m_actuals << arg; } void myOverloadedSlot() { m_qtFunctionInvoked = 24; } void myOverloadedSlot(QObject* arg) { m_qtFunctionInvoked = 41; m_actuals << qVariantFromValue(arg); } void myOverloadedSlot(bool arg) { m_qtFunctionInvoked = 25; m_actuals << arg; } void myOverloadedSlot(const QStringList &arg) { m_qtFunctionInvoked = 42; m_actuals << arg; } void myOverloadedSlot(double arg) { m_qtFunctionInvoked = 26; m_actuals << arg; } void myOverloadedSlot(float arg) { m_qtFunctionInvoked = 27; m_actuals << arg; } void myOverloadedSlot(int arg) { m_qtFunctionInvoked = 28; m_actuals << arg; } void myOverloadedSlot(const QString &arg) { m_qtFunctionInvoked = 29; m_actuals << arg; } void myOverloadedSlot(const QColor &arg) { m_qtFunctionInvoked = 30; m_actuals << arg; } void myOverloadedSlot(const QBrush &arg) { m_qtFunctionInvoked = 31; m_actuals << arg; } void myOverloadedSlot(const QDateTime &arg) { m_qtFunctionInvoked = 32; m_actuals << arg; } void myOverloadedSlot(const QDate &arg) { m_qtFunctionInvoked = 33; m_actuals << arg; } void myOverloadedSlot(const QRegExp &arg) { m_qtFunctionInvoked = 34; m_actuals << arg; } void myOverloadedSlot(const QVariant &arg) { m_qtFunctionInvoked = 35; m_actuals << arg; } void qscript_call(int arg) { m_qtFunctionInvoked = 40; m_actuals << arg; }protected Q_SLOTS: void myProtectedSlot() { m_qtFunctionInvoked = 36; }private Q_SLOTS: void myPrivateSlot() { }Q_SIGNALS: void mySignal(); void mySignalWithIntArg(int arg); void mySignalWithDoubleArg(double arg); void mySignal2(bool arg = false); void mySignalWithDateTimeArg(QDateTime dt); void mySignalWithRegexArg(QRegExp r);private: int m_intValue; QVariant m_variantValue; QVariantList m_variantListValue; QString m_stringValue; QStringList m_stringListValue; QByteArray m_byteArrayValue; QBrush m_brushValue; double m_hiddenValue; int m_writeOnlyValue; int m_readOnlyValue; QKeySequence m_shortcut; CustomType m_customType; int m_qtFunctionInvoked; QVariantList m_actuals;};class MyOtherQObject : public MyQObject{public: MyOtherQObject(QObject* parent = 0) : MyQObject(parent) { }};class MyEnumTestQObject : public QObject{ Q_OBJECT Q_PROPERTY(QString p1 READ p1) Q_PROPERTY(QString p2 READ p2) Q_PROPERTY(QString p3 READ p3 SCRIPTABLE false) Q_PROPERTY(QString p4 READ p4) Q_PROPERTY(QString p5 READ p5 SCRIPTABLE false) Q_PROPERTY(QString p6 READ p6)public: MyEnumTestQObject(QObject* parent = 0) : QObject(parent) { } QString p1() const { return QLatin1String("p1"); } QString p2() const { return QLatin1String("p2"); } QString p3() const { return QLatin1String("p3"); } QString p4() const { return QLatin1String("p4"); } QString p5() const { return QLatin1String("p5"); } QString p6() const { return QLatin1String("p5"); }public Q_SLOTS: void mySlot() { } void myOtherSlot() { }Q_SIGNALS: void mySignal();};class tst_QWebFrame : public QObject{ Q_OBJECTpublic: tst_QWebFrame(); virtual ~tst_QWebFrame(); bool eventFilter(QObject* watched, QEvent* event);public slots: void init(); void cleanup();private slots: void getSetStaticProperty(); void getSetDynamicProperty(); void getSetChildren(); void callQtInvokable(); void connectAndDisconnect(); void classEnums(); void classConstructor(); void overrideInvokable(); void transferInvokable(); void findChild(); void findChildren(); void overloadedSlots(); void enumerate_data(); void enumerate(); void objectDeleted(); void typeConversion(); void symmetricUrl(); void progressSignal(); void domCycles(); void setHtml(); void setHtmlWithResource(); void ipv6HostEncoding(); void metaData(); void popupFocus(); void hitTestContent(); void jsByteArray(); void ownership();private: QString evalJS(const QString&s) { // Convert an undefined return variant to the string "undefined" QVariant ret = evalJSV(s); if (ret.userType() == QMetaType::Void) return "undefined"; else return ret.toString(); } QVariant evalJSV(const QString &s) { return m_page->mainFrame()->evaluateJavaScript(s); } QString evalJS(const QString&s, QString& type) { return evalJSV(s, type).toString(); } QVariant evalJSV(const QString &s, QString& type) { // As a special measure, if we get an exception we set the type to 'error' // (in ecma, an Error object has typeof object, but qtscript has a convenience function) // Similarly, an array is an object, but we'd prefer to have a type of 'array' // Also, consider a QMetaType::Void QVariant to be undefined QString escaped = s; escaped.replace('\'', "\\'"); // Don't preescape your single quotes! evalJS("var retvalue;\ var typevalue; \ try {\ retvalue = eval('" + escaped + "'); \ typevalue = typeof retvalue; \ if (retvalue instanceof Array) \ typevalue = 'array'; \ } \ catch(e) {\ retvalue = e.name + ': ' + e.message;\ typevalue = 'error';\ }"); QVariant ret = evalJSV("retvalue"); if (ret.userType() != QMetaType::Void) type = evalJS("typevalue"); else { ret = QString("undefined"); type = sUndefined; } evalJS("delete retvalue; delete typevalue"); return ret; } QObject* firstChildByClassName(QObject* parent, const char* className) { const QObjectList & children = parent->children(); foreach (QObject* child, children) { if (!strcmp(child->metaObject()->className(), className)) { return child; } } return 0; } const QString sTrue; const QString sFalse; const QString sUndefined; const QString sArray; const QString sFunction; const QString sError; const QString sString; const QString sObject; const QString sNumber;private: QWebView* m_view; QWebPage* m_page; MyQObject* m_myObject; QWebView* m_popupTestView; int m_popupTestPaintCount;};tst_QWebFrame::tst_QWebFrame() : sTrue("true"), sFalse("false"), sUndefined("undefined"), sArray("array"), sFunction("function"), sError("error"), sString("string"), sObject("object"), sNumber("number"), m_popupTestView(0), m_popupTestPaintCount(0){}tst_QWebFrame::~tst_QWebFrame(){}bool tst_QWebFrame::eventFilter(QObject* watched, QEvent* event){ // used on the popupFocus test if (watched == m_popupTestView) { if (event->type() == QEvent::Paint) m_popupTestPaintCount++; } return QObject::eventFilter(watched, event);}void tst_QWebFrame::init(){ m_view = new QWebView(); m_page = m_view->page(); m_myObject = new MyQObject(); m_page->mainFrame()->addToJavaScriptWindowObject("myObject", m_myObject);}void tst_QWebFrame::cleanup(){ delete m_view; delete m_myObject;}void tst_QWebFrame::getSetStaticProperty(){ QCOMPARE(evalJS("typeof myObject.noSuchProperty"), sUndefined);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -