From 5edfb015ac0d8193dc1f455e7a04f6c9c0b3b013 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Tue, 17 Nov 2009 15:01:11 +1000 Subject: Test error reporting. --- tests/auto/declarative/sql/data/7a-error.js | 26 ++++++++++++++++++++++++++ tests/auto/declarative/sql/tst_sql.cpp | 3 ++- 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 tests/auto/declarative/sql/data/7a-error.js diff --git a/tests/auto/declarative/sql/data/7a-error.js b/tests/auto/declarative/sql/data/7a-error.js new file mode 100644 index 0000000..0bb39ef --- /dev/null +++ b/tests/auto/declarative/sql/data/7a-error.js @@ -0,0 +1,26 @@ +var db = openDatabase("QmlTestDB", "", "Test database from Qt autotests", 1000000); +var r=0; + +db.transaction( + function(tx) { + tx.executeSql('SELECT * FROM NotExists', [], + function(tx, rs) { + r = "SHOULD NOT SUCCEED"; + }, + function(tx, error) { + if (error.message == "no such table: NotExists Unable to execute statement" // QML + || error.message == "no such table: NotExists") r="passed" // WebKit + else r="WRONG ERROR:"+error.message + } + ); + }, + function(tx, error) { if (r==0) r="TRANSACTION FAILED: "+error.message }, + function(tx, result) { if (r==0) r="SHOULD NOT SUCCEED2" } +); + + +function test() +{ + if (r == 0) r = "transaction_not_finished"; + return r; +} diff --git a/tests/auto/declarative/sql/tst_sql.cpp b/tests/auto/declarative/sql/tst_sql.cpp index 973d7b1..a929aba 100644 --- a/tests/auto/declarative/sql/tst_sql.cpp +++ b/tests/auto/declarative/sql/tst_sql.cpp @@ -144,6 +144,7 @@ void tst_sql::testQml_data() QTest::newRow("iteration-index") << "data/4-iteration-index.js" << "passed" << 1 << true; // Some HTML5 documents say to use rows by index, others by item() function QTest::newRow("iteration-iterator") << "data/5-iteration-iterator.js" << "passed" << 1 << true; // As with previous, WebKit doesn't give an array QTest::newRow("iteration-efficient") << "data/6-iteration-efficient.js" << "passed" << 1 << true; // It's very inefficient to find the total number of results, here is a solution + QTest::newRow("error-a") << "data/7a-error.js" << "passed" << 1 << false; } void tst_sql::validateAgainstWebkit_data() @@ -177,7 +178,7 @@ void tst_sql::validateAgainstWebkit() webpage.mainFrame()->evaluateJavaScript(js); QTest::qWait(200); // WebKit db access is asynchronous QTRY_COMPARE(webpage.mainFrame()->evaluateJavaScript("test()").toString(),result); - QTest::qWait(200); // WebKit crashes if you quit it too fast + QTest::qWait(1000); // WebKit crashes if you quit it too fast QWebSecurityOrigin origin = webpage.mainFrame()->securityOrigin(); QList dbs = origin.databases(); -- cgit v0.12 From 7c400a77dfbc3f45cb7626962b6e055d582f4cba Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Tue, 17 Nov 2009 15:18:38 +1000 Subject: Partial fix for QTBUGT-5845 --- demos/declarative/webbrowser/webbrowser.qml | 15 ++++---- .../graphicsitems/qmlgraphicswebview.cpp | 44 +++++++++++++--------- .../graphicsitems/qmlgraphicswebview_p.h | 1 + 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/demos/declarative/webbrowser/webbrowser.qml b/demos/declarative/webbrowser/webbrowser.qml index 8a01af5..23e0a20 100644 --- a/demos/declarative/webbrowser/webbrowser.qml +++ b/demos/declarative/webbrowser/webbrowser.qml @@ -202,11 +202,11 @@ Item { var sc = zoom/zoomFactor; scaleAnim.to = sc; flickVX.from = flickable.viewportX - flickVX.to = Math.min(Math.max(0,centerX-flickable.width/2),webView.width*sc-flickable.width) - finalX.value = Math.min(Math.max(0,centerX-flickable.width/2),webView.width*sc-flickable.width) + flickVX.to = Math.max(0,Math.min(centerX-flickable.width/2,webView.width*sc-flickable.width)) + finalX.value = flickVX.to flickVY.from = flickable.viewportY - flickVY.to = Math.min(Math.max(0,centerY-flickable.height/2),webView.height*sc-flickable.height) - finalY.value = Math.min(Math.max(0,centerY-flickable.height/2),webView.height*sc-flickable.height) + flickVY.to = Math.max(0,Math.min(centerY-flickable.height/2,webView.height*sc-flickable.height)) + finalY.value = flickVY.to finalZoom.value = zoom quickZoom.start() } @@ -214,11 +214,12 @@ Item { preferredWidth: flickable.width preferredHeight: flickable.height - zoomFactor: flickable.width > 980 ? flickable.width : flickable.width/980 + zoomFactor: flickable.width > 980 ? 1 : flickable.width/980 onUrlChanged: { if (url != null) { webBrowser.urlString = url.toString(); } } - onDoubleClick: { if (!heuristicZoom(clickX,clickY,2.5)) { - var zf = flickable.width > 980 ? flickable.width : flickable.width/980; + onDoubleClick: { + if (!heuristicZoom(clickX,clickY,2.5)) { + var zf = flickable.width > 980 ? 1 : flickable.width/980; doZoom(zf,clickX/zoomFactor*zf,clickY/zoomFactor*zf) } } diff --git a/src/declarative/graphicsitems/qmlgraphicswebview.cpp b/src/declarative/graphicsitems/qmlgraphicswebview.cpp index c8bb504..da6c00d 100644 --- a/src/declarative/graphicsitems/qmlgraphicswebview.cpp +++ b/src/declarative/graphicsitems/qmlgraphicswebview.cpp @@ -252,11 +252,9 @@ void QmlGraphicsWebView::pageUrlChanged() { Q_D(QmlGraphicsWebView); - if (d->preferredwidth) { - page()->setViewportSize(QSize(d->preferredwidth,-1)); - } else { - page()->setViewportSize(QSize(-1,-1)); - } + page()->setViewportSize(QSize( + d->preferredwidth>0 ? d->preferredwidth : width(), + d->preferredheight>0 ? d->preferredheight : height())); expandToWebPage(); if ((d->url.isEmpty() && page()->mainFrame()->url() != QUrl(QLatin1String("about:blank"))) @@ -310,11 +308,11 @@ void QmlGraphicsWebView::setUrl(const QUrl &url) if (isComponentComplete()) { d->url = url; - if (d->preferredwidth) { - page()->setViewportSize(QSize(d->preferredwidth,-1)); - } else { - page()->setViewportSize(QSize(-1,-1)); - } + page()->setViewportSize(QSize( + d->preferredwidth>0 ? d->preferredwidth : width(), + d->preferredheight>0 ? d->preferredheight : height())); + if (d->preferredwidth > 0 && d->preferredheight > 0) + page()->setPreferredContentsSize(QSize(d->preferredwidth,d->preferredheight)); QUrl seturl = url; if (seturl.isEmpty()) seturl = QUrl(QLatin1String("about:blank")); @@ -388,6 +386,11 @@ void QmlGraphicsWebView::focusChanged(bool hasFocus) QmlGraphicsItem::focusChanged(hasFocus); } +void QmlGraphicsWebView::initialLayout() +{ + // nothing useful to do at this point +} + void QmlGraphicsWebView::contentsSizeChanged(const QSize&) { expandToWebPage(); @@ -397,9 +400,10 @@ void QmlGraphicsWebView::expandToWebPage() { Q_D(QmlGraphicsWebView); QSize cs = page()->mainFrame()->contentsSize(); - qreal zoom = zoomFactor(); - if (cs.width() < d->preferredwidth*zoom) - cs.setWidth(d->preferredwidth*zoom); + if (cs.width() < d->preferredwidth) + cs.setWidth(d->preferredwidth); + if (cs.height() < d->preferredheight) + cs.setHeight(d->preferredheight); if (widthValid()) cs.setWidth(width()); if (heightValid()) @@ -828,7 +832,9 @@ void QmlGraphicsWebView::setZoomFactor(qreal factor) return; page()->mainFrame()->setZoomFactor(factor); - page()->setViewportSize(QSize(d->preferredwidth ? d->preferredwidth : -1,-1)); + page()->setViewportSize(QSize( + d->preferredwidth>0 ? d->preferredwidth*factor : width()*factor, + d->preferredheight>0 ? d->preferredheight*factor : height()*factor)); expandToWebPage(); emit zoomFactorChanged(); @@ -952,7 +958,8 @@ void QmlGraphicsWebView::setPage(QWebPage *page) } d->page = page; d->page->setViewportSize(QSize( - d->preferredwidth>0 ? d->preferredwidth : -1, -1)); + d->preferredwidth>0 ? d->preferredwidth : width(), + d->preferredheight>0 ? d->preferredheight : height())); d->page->mainFrame()->setScrollBarPolicy(Qt::Horizontal,Qt::ScrollBarAlwaysOff); d->page->mainFrame()->setScrollBarPolicy(Qt::Vertical,Qt::ScrollBarAlwaysOff); connect(d->page,SIGNAL(repaintRequested(QRect)),this,SLOT(paintPage(QRect))); @@ -960,6 +967,7 @@ void QmlGraphicsWebView::setPage(QWebPage *page) connect(d->page->mainFrame(), SIGNAL(titleChanged(QString)), this, SIGNAL(titleChanged(QString))); connect(d->page->mainFrame(), SIGNAL(iconChanged()), this, SIGNAL(iconChanged())); connect(d->page->mainFrame(), SIGNAL(contentsSizeChanged(QSize)), this, SLOT(contentsSizeChanged(QSize))); + connect(d->page->mainFrame(), SIGNAL(initialLayoutCompleted()), this, SLOT(initialLayout())); connect(d->page,SIGNAL(loadStarted()),this,SLOT(doLoadStarted())); connect(d->page,SIGNAL(loadProgress(int)),this,SLOT(doLoadProgress(int))); @@ -1023,7 +1031,8 @@ void QmlGraphicsWebView::setHtml(const QString &html, const QUrl &baseUrl) { Q_D(QmlGraphicsWebView); page()->setViewportSize(QSize( - d->preferredwidth>0 ? d->preferredwidth : width(), height())); + d->preferredwidth>0 ? d->preferredwidth : width(), + d->preferredheight>0 ? d->preferredheight : height())); if (isComponentComplete()) page()->mainFrame()->setHtml(html, baseUrl); else { @@ -1037,7 +1046,8 @@ void QmlGraphicsWebView::setContent(const QByteArray &data, const QString &mimeT { Q_D(QmlGraphicsWebView); page()->setViewportSize(QSize( - d->preferredwidth>0 ? d->preferredwidth : width(), height())); + d->preferredwidth>0 ? d->preferredwidth : width(), + d->preferredheight>0 ? d->preferredheight : height())); if (isComponentComplete()) page()->mainFrame()->setContent(data,mimeType,qmlContext(this)->resolvedUrl(baseUrl)); diff --git a/src/declarative/graphicsitems/qmlgraphicswebview_p.h b/src/declarative/graphicsitems/qmlgraphicswebview_p.h index 1d55830..e2e4888 100644 --- a/src/declarative/graphicsitems/qmlgraphicswebview_p.h +++ b/src/declarative/graphicsitems/qmlgraphicswebview_p.h @@ -208,6 +208,7 @@ private Q_SLOTS: void windowObjectCleared(); void pageUrlChanged(); void contentsSizeChanged(const QSize&); + void initialLayout(); protected: void drawContents(QPainter *, const QRect &); -- cgit v0.12 From 7eb051d82a5bd35f86b5f692e2da5ea133e6b7b0 Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Wed, 18 Nov 2009 12:41:39 +1000 Subject: Update SQL database support to current HTML5 specification. --- doc/src/declarative/globalobject.qdoc | 30 +-- src/declarative/qml/qmlsqldatabase.cpp | 245 ++++++++++++++++----- tests/auto/declarative/sql/data/1-creation.js | 27 +-- .../declarative/sql/data/2-selection-bindnames.js | 32 +-- tests/auto/declarative/sql/data/2-selection.js | 41 ++-- .../sql/data/3-iteration-item-function.js | 38 ++-- .../auto/declarative/sql/data/4-iteration-index.js | 38 ++-- .../declarative/sql/data/5-iteration-iterator.js | 38 ++-- .../declarative/sql/data/6-iteration-efficient.js | 43 ++-- tests/auto/declarative/sql/data/7a-error.js | 32 ++- tests/auto/declarative/sql/tst_sql.cpp | 19 +- 11 files changed, 317 insertions(+), 266 deletions(-) diff --git a/doc/src/declarative/globalobject.qdoc b/doc/src/declarative/globalobject.qdoc index dc08c28..6d9d1f2 100644 --- a/doc/src/declarative/globalobject.qdoc +++ b/doc/src/declarative/globalobject.qdoc @@ -220,25 +220,13 @@ provide the ability to access local offline storage in an SQL database. These databases are user-specific and QML-specific. They are stored in the \c Databases subdirectory of QmlEngine::offlineStoragePath(), currently as SQLite databases. -The API is based on the HTML5 offline storage SQL draft API. The main difference is that this QML -API is currently synchronous. You should avoid relying on synchronicity to make your scripts more -portable, both to/from HTML5 and to future QML versions. +The API conforms to the Synchronous API of the HTML5 Web Database API, +\link http://www.w3.org/TR/2009/WD-webdatabase-20091029/ W3C Working Draft 29 October 2009\endlink. The API can be used from JavaScript functions in your QML: \quotefile declarative/sql/hello.qml -\section2 DbObject openDatabase(string name, string version, string description, int estimatedsize) - -Opens a database identified by the given \c name and \c version. -If a database with this name and version does not exist, it is created. The \c version should -always be "1.0" until schema upgrade semantics are defined. - -The \c description and \c estimatedsize are provided to allow application tools to give the user -control over the databases created, but are otherwise not used by QML. - -The returned DbObject has a \c transaction() method by which SQL transactions can be done. - When a database is first created, an INI file is also created specifying its characteristics: \table @@ -247,21 +235,9 @@ When a database is first created, an INI file is also created specifying its cha \row \o Version \o The version of the database passed to \c openDatabase() \row \o Description \o The description of the database passed to \c openDatabase() \row \o EstimatedSize \o The estimated size of the database passed to \c openDatabase() -\row \o DbType \o Currently "QSQLITE" +\row \o Driver \o Currently "QSQLITE" \endtable This data can be used by application tools. - -\section2 void DbObject::transaction(function usesql(DbTxObject), function errorcb=0, function successcb=0) - -Executes \c usesql() in a database transaction. The \c DbTxObject object has a \c executeSql() method by which the -code of \c usesql can execute SQL. The optional second and third arguments are an error callback and success -callback respectively (note that the order of these is the opposite to DbTxObject::executeSql()). - -\section2 void DbTxObject::executeSql(string sql, function successcb=0, function errorcb=0) - -Executes \c sql as an SQL block. The optional second and third arguments are a success callback and error -callback respectively (note that the order of these is the opposite to DbObject::transaction()). - */ diff --git a/src/declarative/qml/qmlsqldatabase.cpp b/src/declarative/qml/qmlsqldatabase.cpp index 6e32fb7..123b85f 100644 --- a/src/declarative/qml/qmlsqldatabase.cpp +++ b/src/declarative/qml/qmlsqldatabase.cpp @@ -119,7 +119,7 @@ public: QSqlRecord r = query.record(); QScriptValue row = engine()->newObject(); for (int j=0; jthrowError(desc); \ + errorValue.setProperty(QLatin1String("code"), error); \ + return errorValue; \ +} + + +static QString databaseFile(const QString& connectionName, QScriptEngine *engine) +{ + QString basename = QmlEnginePrivate::get(engine)->offlineStoragePath + + QDir::separator() + QLatin1String("Databases") + QDir::separator(); + basename += connectionName; + return basename; +} + static QScriptValue qmlsqldatabase_item(QScriptContext *context, QScriptEngine *engine) @@ -242,80 +281,142 @@ static QScriptValue qmlsqldatabase_executeSql(QScriptContext *context, QScriptEn { QSqlDatabase db = qscriptvalue_cast(context->thisObject()); QString sql = context->argument(0).toString(); - QScriptValue values = context->argument(1); - QScriptValue cb = context->argument(2); - QScriptValue cberr = context->argument(3); QSqlQuery query(db); bool err = false; + + QScriptValue result; + if (query.prepare(sql)) { - if (values.isObject()) { - for (QScriptValueIterator it(values); it.hasNext();) { - it.next(); - query.bindValue(it.name(),it.value().toVariant()); + if (context->argumentCount() > 1) { + QScriptValue values = context->argument(1); + if (values.isObject()) { + for (QScriptValueIterator it(values); it.hasNext();) { + it.next(); + query.bindValue(it.name(),it.value().toVariant()); + } + } else { + query.bindValue(0,values.toVariant()); } - } else { - query.bindValue(0,values.toVariant()); } if (query.exec()) { - QScriptValue rs = engine->newObject(); + result = engine->newObject(); if (!QmlEnginePrivate::get(engine)->sqlQueryClass) QmlEnginePrivate::get(engine)->sqlQueryClass= new QmlSqlQueryScriptClass(engine); QScriptValue rows = engine->newObject(QmlEnginePrivate::get(engine)->sqlQueryClass); rows.setData(engine->newVariant(qVariantFromValue(query))); rows.setProperty(QLatin1String("item"), engine->newFunction(qmlsqldatabase_item,1), QScriptValue::SkipInEnumeration); - rs.setProperty(QLatin1String("rows"),rows); - rs.setProperty(QLatin1String("rowsAffected"),query.numRowsAffected()); - rs.setProperty(QLatin1String("insertId"),query.lastInsertId().toString()); // XXX only string - cb.call(QScriptValue(), QScriptValueList() << context->thisObject() << rs); + result.setProperty(QLatin1String("rows"),rows); + result.setProperty(QLatin1String("rowsAffected"),query.numRowsAffected()); + result.setProperty(QLatin1String("insertId"),query.lastInsertId().toString()); } else { err = true; } } else { err = true; } - if (err) { - QScriptValue error = engine->newObject(); - error.setProperty(QLatin1String("message"), query.lastError().text()); - cberr.call(QScriptValue(), QScriptValueList() << context->thisObject() << error); + if (err) + THROW_SQL(DATABASE_ERR,query.lastError().text()); + return result; +} + +static QScriptValue qmlsqldatabase_executeSql_readonly(QScriptContext *context, QScriptEngine *engine) +{ + QString sql = context->argument(0).toString(); + if (sql.startsWith(QLatin1String("SELECT"),Qt::CaseInsensitive)) { + qmlsqldatabase_executeSql(context,engine); + } else { + THROW_SQL(SYNTAX_ERR,QmlEngine::tr("Read-only Transaction")) } return engine->undefinedValue(); } -static QScriptValue qmlsqldatabase_transaction(QScriptContext *context, QScriptEngine *engine) +static QScriptValue qmlsqldatabase_change_version(QScriptContext *context, QScriptEngine *engine) { - QSqlDatabase db = qscriptvalue_cast(context->thisObject()); - if (context->argumentCount() < 1) + if (context->argumentCount() < 2) return engine->undefinedValue(); - QScriptValue cb = context->argument(0); - if (!cb.isFunction()) + + QSqlDatabase db = qscriptvalue_cast(context->thisObject()); + QString from_version = context->argument(0).toString(); + QString to_version = context->argument(1).toString(); + QScriptValue callback = context->argument(2); + + QScriptValue instance = engine->newObject(); + instance.setProperty(QLatin1String("executeSql"), engine->newFunction(qmlsqldatabase_executeSql,1)); + QScriptValue tx = engine->newVariant(instance,qVariantFromValue(db)); + + if (from_version!=context->thisObject().property(QLatin1String("version")).toString()) { + THROW_SQL(2,QmlEngine::tr("Version mismatch")); return engine->undefinedValue(); + } + + if (callback.isFunction()) { + db.transaction(); + callback.call(QScriptValue(), QScriptValueList() << tx); + if (engine->hasUncaughtException()) { + db.rollback(); + } else { + if (!db.commit()) { + db.rollback(); + THROW_SQL(0,QmlEngine::tr("SQL transaction failed")); + } else { + context->thisObject().setProperty(QLatin1String("version"), to_version, QScriptValue::ReadOnly); + QSettings ini(databaseFile(db.connectionName(),engine)+QLatin1String(".ini"),QSettings::IniFormat); + ini.setValue(QLatin1String("Version"), to_version); + } + } + } + + return engine->undefinedValue(); +} + +static QScriptValue qmlsqldatabase_transaction(QScriptContext *context, QScriptEngine *engine) +{ + QSqlDatabase db = qscriptvalue_cast(context->thisObject()); + QScriptValue callback = context->argument(0); + if (!callback.isFunction()) + THROW_SQL(UNKNOWN_ERR,QmlEngine::tr("transaction: missing callback")); - // Call synchronously... - XXX could do asynch with threads QScriptValue instance = engine->newObject(); - instance.setProperty(QLatin1String("executeSql"), engine->newFunction(qmlsqldatabase_executeSql,4)); + instance.setProperty(QLatin1String("executeSql"), engine->newFunction(qmlsqldatabase_executeSql,1)); QScriptValue tx = engine->newVariant(instance,qVariantFromValue(db)); db.transaction(); - cb.call(QScriptValue(), QScriptValueList() << tx); + callback.call(QScriptValue(), QScriptValueList() << tx); if (engine->hasUncaughtException()) { db.rollback(); - QScriptValue cb = context->argument(1); - if (cb.isFunction()) - cb.call(); } else { - db.commit(); - QScriptValue cb = context->argument(2); - if (cb.isFunction()) - cb.call(); + if (!db.commit()) + db.rollback(); } return engine->undefinedValue(); } +static QScriptValue qmlsqldatabase_read_transaction(QScriptContext *context, QScriptEngine *engine) +{ + QSqlDatabase db = qscriptvalue_cast(context->thisObject()); + QScriptValue callback = context->argument(0); + if (!callback.isFunction()) + return engine->undefinedValue(); + + QScriptValue instance = engine->newObject(); + instance.setProperty(QLatin1String("executeSql"), engine->newFunction(qmlsqldatabase_executeSql_readonly,1)); + QScriptValue tx = engine->newVariant(instance,qVariantFromValue(db)); + + db.transaction(); + callback.call(QScriptValue(), QScriptValueList() << tx); + if (engine->hasUncaughtException()) { + db.rollback(); + } else { + if (!db.commit()) + db.rollback(); + } + return engine->undefinedValue(); +} /* Currently documented in doc/src/declarastive/globalobject.qdoc */ -static QScriptValue qmlsqldatabase_open(QScriptContext *context, QScriptEngine *engine) +static QScriptValue qmlsqldatabase_open_sync(QScriptContext *context, QScriptEngine *engine) { QSqlDatabase database; @@ -323,43 +424,71 @@ static QScriptValue qmlsqldatabase_open(QScriptContext *context, QScriptEngine * QString dbversion = context->argument(1).toString(); QString dbdescription = context->argument(2).toString(); int dbestimatedsize = context->argument(3).toNumber(); + QScriptValue dbcreationCallback = context->argument(4); QCryptographicHash md5(QCryptographicHash::Md5); md5.addData(dbname.toUtf8()); - md5.addData(dbversion.toUtf8()); QString dbid(QLatin1String(md5.result().toHex())); - // Uses SQLLITE (like HTML5), but any could be used. + QString basename = databaseFile(dbid,engine); + bool created = false; + QString version = dbversion; - if (QSqlDatabase::connectionNames().contains(dbid)) { - database = QSqlDatabase::database(dbid); - } else { - database = QSqlDatabase::addDatabase(QLatin1String("QSQLITE"), dbid); - } - if (!database.isOpen()) { - QString basename = QmlEnginePrivate::get(engine)->offlineStoragePath - + QDir::separator() + QLatin1String("Databases") + QDir::separator(); - QDir().mkpath(basename); - basename += dbid; - database.setDatabaseName(basename+QLatin1String(".sqlite")); + { QSettings ini(basename+QLatin1String(".ini"),QSettings::IniFormat); - ini.setValue(QLatin1String("Name"), dbname); - ini.setValue(QLatin1String("Version"), dbversion); - ini.setValue(QLatin1String("Description"), dbdescription); - ini.setValue(QLatin1String("EstimatedSize"), dbestimatedsize); - ini.setValue(QLatin1String("DbType"), QLatin1String("QSQLITE")); - database.open(); + + if (QSqlDatabase::connectionNames().contains(dbid)) { + database = QSqlDatabase::database(dbid); + } else { + database = QSqlDatabase::addDatabase(QLatin1String("QSQLITE"), dbid); + QDir().mkpath(basename); + if (!QFile::exists(basename+QLatin1String(".sqlite"))) { + created = true; + ini.setValue(QLatin1String("Name"), dbname); + if (dbcreationCallback.isFunction()) + version = QString(); + ini.setValue(QLatin1String("Version"), version); + ini.setValue(QLatin1String("Description"), dbdescription); + ini.setValue(QLatin1String("EstimatedSize"), dbestimatedsize); + ini.setValue(QLatin1String("Driver"), QLatin1String("QSQLITE")); + } else { + if (!dbversion.isEmpty() && ini.value(QLatin1String("Version")) != dbversion) { + // Incompatible + THROW_SQL(VERSION_ERR,QmlEngine::tr("SQL: database version mismatch")); + } + } + database.setDatabaseName(basename+QLatin1String(".sqlite")); + } + if (!database.isOpen()) + database.open(); } QScriptValue instance = engine->newObject(); - instance.setProperty(QLatin1String("transaction"), engine->newFunction(qmlsqldatabase_transaction,3)); - return engine->newVariant(instance,qVariantFromValue(database)); + instance.setProperty(QLatin1String("transaction"), engine->newFunction(qmlsqldatabase_transaction,1)); + instance.setProperty(QLatin1String("readTransaction"), engine->newFunction(qmlsqldatabase_read_transaction,1)); + instance.setProperty(QLatin1String("version"), version, QScriptValue::ReadOnly); + instance.setProperty(QLatin1String("changeVersion"), engine->newFunction(qmlsqldatabase_change_version,3)); + + QScriptValue result = engine->newVariant(instance,qVariantFromValue(database)); + + if (created && dbcreationCallback.isFunction()) { + dbcreationCallback.call(QScriptValue(), QScriptValueList() << result); + } + + return result; } void qt_add_qmlsqldatabase(QScriptEngine *engine) { - QScriptValue openDatabase = engine->newFunction(qmlsqldatabase_open, 4); - engine->globalObject().setProperty(QLatin1String("openDatabase"), openDatabase); + QScriptValue openDatabase = engine->newFunction(qmlsqldatabase_open_sync, 4); + engine->globalObject().setProperty(QLatin1String("openDatabaseSync"), openDatabase); + + QScriptValue sqlExceptionPrototype = engine->newObject(); + for (int i=0; sqlerror[i]; ++i) + sqlExceptionPrototype.setProperty(QLatin1String(sqlerror[i]), + i,QScriptValue::ReadOnly | QScriptValue::Undeletable | QScriptValue::SkipInEnumeration); + + engine->globalObject().setProperty(QLatin1String("SQLException"), sqlExceptionPrototype); } /* diff --git a/tests/auto/declarative/sql/data/1-creation.js b/tests/auto/declarative/sql/data/1-creation.js index 95fa99e..aab9b5d 100644 --- a/tests/auto/declarative/sql/data/1-creation.js +++ b/tests/auto/declarative/sql/data/1-creation.js @@ -1,20 +1,15 @@ -var db = openDatabase("QmlTestDB", "", "Test database from Qt autotests", 1000000); -var r="transaction_not_finished"; +function test() { + var db = openDatabaseSync("QmlTestDB", "", "Test database from Qt autotests", 1000000); + var r="transaction_not_finished"; -// Asynchronous in WebKit, so must wait before calling test() -db.transaction( - function(tx) { - tx.executeSql('CREATE TABLE IF NOT EXISTS Greeting(salutation TEXT, salutee TEXT)', [], - function(tx, rs) { }, function(tx, error) { r="CREATE FAILED: "+error.message }); - tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ], - function(tx, rs) { }, function(tx, error) { r="INSERT FAILED: "+error.message }); - }, - function(tx, error) { r="TRANSACTION FAILED: "+error.message }, - function(tx, result) { if (r=="transaction_not_finished") r="passed" } -); + // Asynchronous in WebKit, so must wait before calling test() + db.transaction( + function(tx) { + tx.executeSql('CREATE TABLE IF NOT EXISTS Greeting(salutation TEXT, salutee TEXT)'); + tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ]); + r = "passed"; + } + ); - -function test() -{ return r; } diff --git a/tests/auto/declarative/sql/data/2-selection-bindnames.js b/tests/auto/declarative/sql/data/2-selection-bindnames.js index c00acc14..21f34db 100644 --- a/tests/auto/declarative/sql/data/2-selection-bindnames.js +++ b/tests/auto/declarative/sql/data/2-selection-bindnames.js @@ -1,24 +1,16 @@ -var db = openDatabase("QmlTestDB", "", "Test database from Qt autotests", 1000000); -var r=0; +function test() { + var db = openDatabaseSync("QmlTestDB", "", "Test database from Qt autotests", 1000000); + var r="transaction_not_finished"; -db.transaction( - function(tx) { - tx.executeSql('SELECT * FROM Greeting WHERE salutation=:p2 AND salutee=:p1', {':p1':'world', ':p2':'hello'}, - function(tx, rs) { - if ( rs.rows.length != 4 ) { - if (r==0) r = "SELECT RETURNED WRONG VALUE "+rs.rows.length+rs.rows.item(0)+rs.rows.item(1) - } - }, - function(tx, error) { if (r==0) r="SELECT FAILED: "+error.message } - ); - }, - function(tx, error) { if (r==0) r="TRANSACTION FAILED: "+error.message }, - function(tx, result) { if (r==0) r="passed" } -); + db.transaction( + function(tx) { + var rs = tx.executeSql('SELECT * FROM Greeting WHERE salutation=:p2 AND salutee=:p1', {':p1':'world', ':p2':'hello'}); + if ( rs.rows.length != 4 ) + r = "SELECT RETURNED WRONG VALUE "+rs.rows.length+rs.rows.item(0)+rs.rows.item(1) + else + r = "passed"; + } + ); - -function test() -{ - if (r == 0) r = "transaction_not_finished"; return r; } diff --git a/tests/auto/declarative/sql/data/2-selection.js b/tests/auto/declarative/sql/data/2-selection.js index 3acf686..f141d2c 100644 --- a/tests/auto/declarative/sql/data/2-selection.js +++ b/tests/auto/declarative/sql/data/2-selection.js @@ -1,30 +1,19 @@ -var db = openDatabase("QmlTestDB", "", "Test database from Qt autotests", 1000000); -var r=0; +function test() { + var db = openDatabaseSync("QmlTestDB", "", "Test database from Qt autotests", 1000000); + var r="transaction_not_finished"; -db.transaction( - function(tx) { - tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ], - function(tx, rs) { }, function(tx, error) { if (r==0) r="INSERT 1 FAILED: "+error.message }); - tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ], - function(tx, rs) { }, function(tx, error) { if (r==0) r="INSERT 2 FAILED: "+error.message }); - tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ], - function(tx, rs) { }, function(tx, error) { if (r==0) r="INSERT 3 FAILED: "+error.message }); - tx.executeSql('SELECT * FROM Greeting', [], - function(tx, rs) { - if ( rs.rows.length != 4 ) { // 1 from test1, 3 from this test. - if (r==0) r = "SELECT RETURNED WRONG VALUE "+rs.rows.length+rs.rows[0]+rs.rows[1] - } - }, - function(tx, error) { if (r==0) r="SELECT FAILED: "+error.message } - ); - }, - function(tx, error) { if (r==0) r="TRANSACTION FAILED: "+error.message }, - function(tx, result) { if (r==0) r="passed" } -); + db.transaction( + function(tx) { + tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ]); + tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ]); + tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ]); + var rs = tx.executeSql('SELECT * FROM Greeting'); + if ( rs.rows.length != 4 ) // 1 from test1, 3 from this test. + r = "SELECT RETURNED WRONG VALUE "+rs.rows.length+rs.rows[0]+rs.rows[1] + else + r = "passed"; + } + ); - -function test() -{ - if (r == 0) r = "transaction_not_finished"; return r; } diff --git a/tests/auto/declarative/sql/data/3-iteration-item-function.js b/tests/auto/declarative/sql/data/3-iteration-item-function.js index bad9b82..57c8a17 100644 --- a/tests/auto/declarative/sql/data/3-iteration-item-function.js +++ b/tests/auto/declarative/sql/data/3-iteration-item-function.js @@ -1,27 +1,19 @@ -var db = openDatabase("QmlTestDB", "", "Test database from Qt autotests", 1000000); -var r=0; +function test() { + var db = openDatabaseSync("QmlTestDB", "", "Test database from Qt autotests", 1000000); + var r="transaction_not_finished"; -db.transaction( - function(tx) { - tx.executeSql('SELECT * FROM Greeting', [], - function(tx, rs) { - var r1="" - for(var i = 0; i < rs.rows.length; i++) { - r1 += rs.rows.item(i).salutation + ", " + rs.rows.item(i).salutee + ";" - } - if (r1 != "hello, world;hello, world;hello, world;hello, world;") - r = "SELECTED DATA WRONG: "+r1; - }, - function(tx, error) { if (r==0) r="SELECT FAILED: "+error.message } - ); - }, - function(tx, error) { if (r==0) r="TRANSACTION FAILED: "+error.message }, - function(tx, result) { if (r==0) r="passed" } -); + db.transaction( + function(tx) { + var rs = tx.executeSql('SELECT * FROM Greeting'); + var r1="" + for(var i = 0; i < rs.rows.length; i++) + r1 += rs.rows.item(i).salutation + ", " + rs.rows.item(i).salutee + ";" + if (r1 != "hello, world;hello, world;hello, world;hello, world;") + r = "SELECTED DATA WRONG: "+r1; + else + r = "passed"; + } + ); - -function test() -{ - if (r == 0) r = "transaction_not_finished"; return r; } diff --git a/tests/auto/declarative/sql/data/4-iteration-index.js b/tests/auto/declarative/sql/data/4-iteration-index.js index 298737d..512cf8d 100644 --- a/tests/auto/declarative/sql/data/4-iteration-index.js +++ b/tests/auto/declarative/sql/data/4-iteration-index.js @@ -1,27 +1,19 @@ -var db = openDatabase("QmlTestDB", "", "Test database from Qt autotests", 1000000); -var r=0; +function test() { + var db = openDatabaseSync("QmlTestDB", "", "Test database from Qt autotests", 1000000); + var r="transaction_not_finished"; -db.transaction( - function(tx) { - tx.executeSql('SELECT * FROM Greeting', [], - function(tx, rs) { - var r1="" - for(var i = 0; i < rs.rows.length; i++) { - r1 += rs.rows[i].salutation + ", " + rs.rows[i].salutee + ";" - } - if (r1 != "hello, world;hello, world;hello, world;hello, world;") - r = "SELECTED DATA WRONG: "+r1; - }, - function(tx, error) { if (r==0) r="SELECT FAILED: "+error.message } - ); - }, - function(tx, error) { if (r==0) r="TRANSACTION FAILED: "+error.message }, - function(tx, result) { if (r==0) r="passed" } -); + db.transaction( + function(tx) { + var rs = tx.executeSql('SELECT * FROM Greeting'); + var r1="" + for(var i = 0; i < rs.rows.length; i++) + r1 += rs.rows[i].salutation + ", " + rs.rows[i].salutee + ";" + if (r1 != "hello, world;hello, world;hello, world;hello, world;") + r = "SELECTED DATA WRONG: "+r1; + else + r = "passed"; + } + ); - -function test() -{ - if (r == 0) r = "transaction_not_finished"; return r; } diff --git a/tests/auto/declarative/sql/data/5-iteration-iterator.js b/tests/auto/declarative/sql/data/5-iteration-iterator.js index 51f0504..ae4fd34 100644 --- a/tests/auto/declarative/sql/data/5-iteration-iterator.js +++ b/tests/auto/declarative/sql/data/5-iteration-iterator.js @@ -1,27 +1,19 @@ -var db = openDatabase("QmlTestDB", "", "Test database from Qt autotests", 1000000); -var r=0; +function test() { + var db = openDatabaseSync("QmlTestDB", "", "Test database from Qt autotests", 1000000); + var r="transaction_not_finished"; -db.transaction( - function(tx) { - tx.executeSql('SELECT * FROM Greeting', [], - function(tx, rs) { - var r1="" - for(var i in rs.rows) { - r1 += rs.rows[i].salutation + ", " + rs.rows[i].salutee + ";" - } - if (r1 != "hello, world;hello, world;hello, world;hello, world;") - r = "SELECTED DATA WRONG: "+r1; - }, - function(tx, error) { if (r==0) r="SELECT FAILED: "+error.message } - ); - }, - function(tx, error) { if (r==0) r="TRANSACTION FAILED: "+error.message }, - function(tx, result) { if (r==0) r="passed" } -); + db.transaction( + function(tx) { + var rs = tx.executeSql('SELECT * FROM Greeting') + var r1="" + for(var i in rs.rows) + r1 += rs.rows[i].salutation + ", " + rs.rows[i].salutee + ";" + if (r1 != "hello, world;hello, world;hello, world;hello, world;") + r = "SELECTED DATA WRONG: "+r1; + else + r = "passed"; + } + ); - -function test() -{ - if (r == 0) r = "transaction_not_finished"; return r; } diff --git a/tests/auto/declarative/sql/data/6-iteration-efficient.js b/tests/auto/declarative/sql/data/6-iteration-efficient.js index 6711fb0..fe0acfc 100644 --- a/tests/auto/declarative/sql/data/6-iteration-efficient.js +++ b/tests/auto/declarative/sql/data/6-iteration-efficient.js @@ -1,32 +1,29 @@ -var db = openDatabase("QmlTestDB", "", "Test database from Qt autotests", 1000000); -var r=0; -var fbefore="FORWARD WRONG" -var fafter="FORWARD WRONG" +function test() { + var db = openDatabaseSync("QmlTestDB", "", "Test database from Qt autotests", 1000000); + var r="transaction_not_finished"; -db.transaction( - function(tx) { - tx.executeSql('SELECT * FROM Greeting', [], - function(tx, rs) { - var r1="" - if (!rs.rows.forwardOnly) fbefore="" - rs.rows.forwardOnly = true; - if (rs.rows.forwardOnly) fafter=""; + db.transaction( + function(tx) { + var rs = tx.executeSql('SELECT * FROM Greeting'); + var r1="" + var fbefiore = rs.rows.forwardOnly; + rs.rows.forwardOnly = true; + var fafter = rs.rows.forwardOnly; + if (fbefore) + r = "forward wrong before"; + else if (!fafter) + r = "forward wrong after"; + else { for(var i=0; rs.rows[i]; ++i) { r1 += rs.rows[i].salutation + ", " + rs.rows[i].salutee + ";" } if (r1 != "hello, world;hello, world;hello, world;hello, world;") r = "SELECTED DATA WRONG: "+r1; - }, - function(tx, error) { if (r==0) r="SELECT FAILED: "+error.message } - ); - }, - function(tx, error) { if (r==0) r="TRANSACTION FAILED: "+error.message }, - function(tx, result) { if (r==0) r=fbefore+"passed"+fafter } -); + else + r = "passed"; + } + } + ); - -function test() -{ - if (r == 0) r = "transaction_not_finished"; return r; } diff --git a/tests/auto/declarative/sql/data/7a-error.js b/tests/auto/declarative/sql/data/7a-error.js index 0bb39ef..65d0c03 100644 --- a/tests/auto/declarative/sql/data/7a-error.js +++ b/tests/auto/declarative/sql/data/7a-error.js @@ -1,26 +1,20 @@ -var db = openDatabase("QmlTestDB", "", "Test database from Qt autotests", 1000000); -var r=0; +function test() { + var db = openDatabaseSync("QmlTestDB", "", "Test database from Qt autotests", 1000000); + var r="transaction_not_finished"; -db.transaction( - function(tx) { - tx.executeSql('SELECT * FROM NotExists', [], - function(tx, rs) { + try { + db.transaction( + function(tx) { + var rs = tx.executeSql('SELECT * FROM NotExists'); r = "SHOULD NOT SUCCEED"; - }, - function(tx, error) { - if (error.message == "no such table: NotExists Unable to execute statement" // QML - || error.message == "no such table: NotExists") r="passed" // WebKit - else r="WRONG ERROR:"+error.message } ); - }, - function(tx, error) { if (r==0) r="TRANSACTION FAILED: "+error.message }, - function(tx, result) { if (r==0) r="SHOULD NOT SUCCEED2" } -); + } catch (err) { + if (err.message == "no such table: NotExists Unable to execute statement") + r = "passed"; + else + r = "WRONG ERROR="+err.message; + } - -function test() -{ - if (r == 0) r = "transaction_not_finished"; return r; } diff --git a/tests/auto/declarative/sql/tst_sql.cpp b/tests/auto/declarative/sql/tst_sql.cpp index a929aba..cbd14ab 100644 --- a/tests/auto/declarative/sql/tst_sql.cpp +++ b/tests/auto/declarative/sql/tst_sql.cpp @@ -149,16 +149,18 @@ void tst_sql::testQml_data() void tst_sql::validateAgainstWebkit_data() { - testQml_data(); + QTest::addColumn("jsfile"); // The input file + QTest::addColumn("result"); // The required output from the js test() function + QTest::addColumn("databases"); // The number of databases that should have been created + QTest::addColumn("qmlextension"); // Things WebKit can't do + QTest::newRow("creation") << "data/1-creation.js" << "passed" << 1 << false; } void tst_sql::validateAgainstWebkit() { // Validates tests against WebKit (HTML5) support. // - // WebKit SQL is asynchronous, so tests are divided into code plus a test() - // function which is executed "later" (via QTRY_). - // + QFETCH(QString, jsfile); QFETCH(QString, result); QFETCH(int, databases); @@ -175,14 +177,15 @@ void tst_sql::validateAgainstWebkit() webpage.settings()->setOfflineStoragePath(dbDir()); webpage.settings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true); - webpage.mainFrame()->evaluateJavaScript(js); - QTest::qWait(200); // WebKit db access is asynchronous - QTRY_COMPARE(webpage.mainFrame()->evaluateJavaScript("test()").toString(),result); - QTest::qWait(1000); // WebKit crashes if you quit it too fast + QEXPECT_FAIL("","WebKit doesn't support openDatabaseSync yet", Continue); + QCOMPARE(webpage.mainFrame()->evaluateJavaScript(js).toString(),result); + /* + QTest::qWait(100); // WebKit crashes if you quit it too fast QWebSecurityOrigin origin = webpage.mainFrame()->securityOrigin(); QList dbs = origin.databases(); QCOMPARE(dbs.count(), databases); + */ } void tst_sql::testQml() -- cgit v0.12 From 6329879b47afad504eab2e629d15404bf7224cfb Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Wed, 18 Nov 2009 12:57:58 +1000 Subject: Don't make assumptions about when SQLITE creates database files. --- src/declarative/qml/qmlsqldatabase.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/declarative/qml/qmlsqldatabase.cpp b/src/declarative/qml/qmlsqldatabase.cpp index 123b85f..9e4c198 100644 --- a/src/declarative/qml/qmlsqldatabase.cpp +++ b/src/declarative/qml/qmlsqldatabase.cpp @@ -440,10 +440,10 @@ static QScriptValue qmlsqldatabase_open_sync(QScriptContext *context, QScriptEng if (QSqlDatabase::connectionNames().contains(dbid)) { database = QSqlDatabase::database(dbid); } else { + created = !QFile::exists(basename+QLatin1String(".sqlite")); database = QSqlDatabase::addDatabase(QLatin1String("QSQLITE"), dbid); QDir().mkpath(basename); - if (!QFile::exists(basename+QLatin1String(".sqlite"))) { - created = true; + if (created) { ini.setValue(QLatin1String("Name"), dbname); if (dbcreationCallback.isFunction()) version = QString(); -- cgit v0.12 From 178d8c9cb87c5578e5175b5a405d470919644c4d Mon Sep 17 00:00:00 2001 From: Warwick Allison Date: Wed, 18 Nov 2009 13:02:52 +1000 Subject: Update examples for new SQL API. --- demos/declarative/samegame/content/samegame.js | 32 +++++++--------------- examples/declarative/sql/hello.qml | 29 ++++++-------------- .../samegame/samegame4/content/samegame.js | 32 +++++++--------------- 3 files changed, 29 insertions(+), 64 deletions(-) diff --git a/demos/declarative/samegame/content/samegame.js b/demos/declarative/samegame/content/samegame.js index 4d5a6be..3598c26 100755 --- a/demos/declarative/samegame/content/samegame.js +++ b/demos/declarative/samegame/content/samegame.js @@ -210,34 +210,22 @@ function saveHighScore(name) { if(scoresURL!="") sendHighScore(name); //OfflineStorage - var db = openDatabase("SameGameScores", "1.0", "Local SameGame High Scores",100); + var db = openDatabaseSync("SameGameScores", "1.0", "Local SameGame High Scores",100); var dataStr = "INSERT INTO Scores VALUES(?, ?, ?, ?)"; var data = [name, gameCanvas.score, maxX+"x"+maxY ,Math.floor(timer/1000)]; db.transaction( function(tx) { - tx.executeSql('CREATE TABLE IF NOT EXISTS Scores(name TEXT, score NUMBER, gridSize TEXT, time NUMBER)',[]); + tx.executeSql('CREATE TABLE IF NOT EXISTS Scores(name TEXT, score NUMBER, gridSize TEXT, time NUMBER)'); tx.executeSql(dataStr, data); - tx.executeSql('SELECT * FROM Scores WHERE gridSize = "12x17" ORDER BY score desc LIMIT 10',[], - function(tx, rs) { - var r = "\nHIGH SCORES for a standard sized grid\n\n" - for(var i = 0; i < rs.rows.length; i++){ - r += (i+1)+". " + rs.rows.item(i).name +' got ' - + rs.rows.item(i).score + ' points in ' - + rs.rows.item(i).time + ' seconds.\n'; - } - dialog.show(r); - }, - function(tx, error) { - print("ERROR:", error.message); - } - ); - }, - function() { - print("ERROR in transaction"); - }, - function() { - //print("Transaction successful"); + var rs = tx.executeSql('SELECT * FROM Scores WHERE gridSize = "12x17" ORDER BY score desc LIMIT 10'); + var r = "\nHIGH SCORES for a standard sized grid\n\n" + for(var i = 0; i < rs.rows.length; i++){ + r += (i+1)+". " + rs.rows.item(i).name +' got ' + + rs.rows.item(i).score + ' points in ' + + rs.rows.item(i).time + ' seconds.\n'; + } + dialog.show(r); } ); } diff --git a/examples/declarative/sql/hello.qml b/examples/declarative/sql/hello.qml index dc3ca35..96e0675 100644 --- a/examples/declarative/sql/hello.qml +++ b/examples/declarative/sql/hello.qml @@ -3,35 +3,24 @@ import Qt 4.6 Text { Script { function findGreetings() { - var db = openDatabase("QmlExampleDB", "1.0", "The Example QML SQL!", 1000000); + var db = openDatabaseSync("QmlExampleDB", "1.0", "The Example QML SQL!", 1000000); db.transaction( function(tx) { // Create the database if it doesn't already exist - tx.executeSql('CREATE TABLE IF NOT EXISTS Greeting(salutation TEXT, salutee TEXT)', []); + tx.executeSql('CREATE TABLE IF NOT EXISTS Greeting(salutation TEXT, salutee TEXT)'); // Add (another) greeting row tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ]); // Show all added greetings - tx.executeSql('SELECT * FROM Greeting', [], - function(tx, rs) { - var r = "" - for(var i = 0; i < rs.rows.length; i++) { - r += rs.rows.item(i).salutation + ", " + rs.rows.item(i).salutee + "\n" - } - text = r - }, - function(tx, error) { - print("ERROR:", error.message) - } - ); - }, - function() { - print("ERROR in transaction"); - }, - function() { - print("Transaction successful"); + var rs = tx.executeSql('SELECT * FROM Greeting'); + + var r = "" + for(var i = 0; i < rs.rows.length; i++) { + r += rs.rows.item(i).salutation + ", " + rs.rows.item(i).salutee + "\n" + } + text = r } ) } diff --git a/examples/declarative/tutorials/samegame/samegame4/content/samegame.js b/examples/declarative/tutorials/samegame/samegame4/content/samegame.js index d5778fe..b833385 100755 --- a/examples/declarative/tutorials/samegame/samegame4/content/samegame.js +++ b/examples/declarative/tutorials/samegame/samegame4/content/samegame.js @@ -211,34 +211,22 @@ function saveHighScore(name) { if(scoresURL!="") sendHighScore(name); //OfflineStorage - var db = openDatabase("SameGameScores", "1.0", "Local SameGame High Scores",100); + var db = openDatabaseSync("SameGameScores", "1.0", "Local SameGame High Scores",100); var dataStr = "INSERT INTO Scores VALUES(?, ?, ?, ?)"; var data = [name, gameCanvas.score, maxX+"x"+maxY ,Math.floor(timer/1000)]; db.transaction( function(tx) { - tx.executeSql('CREATE TABLE IF NOT EXISTS Scores(name TEXT, score NUMBER, gridSize TEXT, time NUMBER)',[]); + tx.executeSql('CREATE TABLE IF NOT EXISTS Scores(name TEXT, score NUMBER, gridSize TEXT, time NUMBER)'); tx.executeSql(dataStr, data); - tx.executeSql('SELECT * FROM Scores WHERE gridSize = "12x17" ORDER BY score desc LIMIT 10',[], - function(tx, rs) { - var r = "\nHIGH SCORES for a standard sized grid\n\n" - for(var i = 0; i < rs.rows.length; i++){ - r += (i+1)+". " + rs.rows.item(i).name +' got ' - + rs.rows.item(i).score + ' points in ' - + rs.rows.item(i).time + ' seconds.\n'; - } - dialog.show(r); - }, - function(tx, error) { - print("ERROR:", error.message); - } - ); - }, - function() { - print("ERROR in transaction"); - }, - function() { - //print("Transaction successful"); + var rs = tx.executeSql('SELECT * FROM Scores WHERE gridSize = "12x17" ORDER BY score desc LIMIT 10'); + var r = "\nHIGH SCORES for a standard sized grid\n\n" + for(var i = 0; i < rs.rows.length; i++){ + r += (i+1)+". " + rs.rows.item(i).name +' got ' + + rs.rows.item(i).score + ' points in ' + + rs.rows.item(i).time + ' seconds.\n'; + } + dialog.show(r); } ); } -- cgit v0.12 From 4ba2513ca6fa42c37c45a573b4643b5e1d97db3b Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Wed, 18 Nov 2009 13:25:03 +1000 Subject: tests --- src/declarative/util/qmllistaccessor.cpp | 172 ++++------ src/declarative/util/qmllistaccessor_p.h | 12 +- .../qmllistaccessor/tst_qmllistaccessor.cpp | 373 ++++++++++++++++++++- 3 files changed, 443 insertions(+), 114 deletions(-) diff --git a/src/declarative/util/qmllistaccessor.cpp b/src/declarative/util/qmllistaccessor.cpp index 910f2a5..4adec81 100644 --- a/src/declarative/util/qmllistaccessor.cpp +++ b/src/declarative/util/qmllistaccessor.cpp @@ -77,8 +77,6 @@ void QmlListAccessor::setList(const QVariant &v, QmlEngine *engine) m_type = VariantList; } else if (d.canConvert(QVariant::Int)) { m_type = Integer; - } else if (d.type() != QVariant::UserType) { - m_type = Instance; } else if ((!enginePrivate && QmlMetaType::isObject(d.userType())) || (enginePrivate && enginePrivate->isObject(d.userType()))) { QObject *data = 0; @@ -89,18 +87,15 @@ void QmlListAccessor::setList(const QVariant &v, QmlEngine *engine) (enginePrivate && enginePrivate->isQmlList(d.userType()))) { m_type = QmlList; } else if (QmlMetaType::isList(d.userType())) { - m_type = QList; + m_type = QListPtr; } else { - m_type = Invalid; - d = QVariant(); + m_type = Instance; } } int QmlListAccessor::count() const { switch(m_type) { - case Invalid: - return 0; case StringList: return qvariant_cast(d).count(); case VariantList: @@ -110,23 +105,25 @@ int QmlListAccessor::count() const QmlPrivate::ListInterface *li = *(QmlPrivate::ListInterface **)d.constData(); return li->count(); } - case QList: - return QmlMetaType::listCount(d); + case QListPtr: + { + QList *li = *(QList **)d.constData(); + return li->count(); + } case Instance: return 1; case Integer: return d.toInt(); + default: + case Invalid: + return 0; } - - return 0; } QVariant QmlListAccessor::at(int idx) const { Q_ASSERT(idx >= 0 && idx < count()); switch(m_type) { - case Invalid: - return QVariant(); case StringList: return QVariant::fromValue(qvariant_cast(d).at(idx)); case VariantList: @@ -138,142 +135,119 @@ QVariant QmlListAccessor::at(int idx) const li->at(idx, ptr); return QVariant::fromValue((QObject*)ptr[0]); } - case QList: - return QmlMetaType::listAt(d, idx); + case QListPtr: + { + QList *li = *(QList **)d.constData(); + void *ptr = li->at(idx); + return QVariant::fromValue((QObject*)ptr); + } case Instance: return d; case Integer: + return QVariant(idx); + default: + case Invalid: return QVariant(); } - - return QVariant(); } -void QmlListAccessor::append(const QVariant &value) +bool QmlListAccessor::append(const QVariant &value) { switch(m_type) { - case Invalid: - break; - case StringList: - { - const QString &str = value.toString(); - qvariant_cast(d).append(str); - break; - } - case VariantList: - { - qvariant_cast(d).append(value); - break; - } case QmlList: { QmlPrivate::ListInterface *li = *(QmlPrivate::ListInterface **)d.constData(); - li->append(const_cast(value.constData())); //XXX - break; + li->append(const_cast(value.constData())); //XXX Typesafety + return true; + } + case QListPtr: + { + QList *li = *(QList **)d.constData(); + li->append(*reinterpret_cast(const_cast(value.constData()))); //XXX Typesafety + return true; } - case QList: - QmlMetaType::append(d, value); - break; + case StringList: + case VariantList: + case Invalid: case Instance: case Integer: - //do nothing - break; + default: + return false; } } -void QmlListAccessor::insert(int index, const QVariant &value) +bool QmlListAccessor::insert(int index, const QVariant &value) { switch(m_type) { - case Invalid: - break; - case StringList: - { - const QString &str = value.toString(); - qvariant_cast(d).insert(index, str); - break; - } - case VariantList: - { - qvariant_cast(d).insert(index, value); - break; - } case QmlList: { QmlPrivate::ListInterface *li = *(QmlPrivate::ListInterface **)d.constData(); - li->insert(index, const_cast(value.constData())); //XXX - break; + li->insert(index, const_cast(value.constData())); //XXX Typesafety + return true; + } + case QListPtr: + { + QList *li = *(QList**)d.constData(); + li->insert(index, *reinterpret_cast(const_cast(value.constData()))); //XXX Typesafety + return true; } - case QList: - //XXX needs implementation - qWarning() << "insert function not yet implemented for QLists"; - break; + case StringList: + case VariantList: + case Invalid: case Instance: - //XXX do nothing? - if (index == 0) - setList(value); - break; case Integer: - break; + default: + return false; } } -void QmlListAccessor::removeAt(int index) +bool QmlListAccessor::removeAt(int index) { switch(m_type) { - case Invalid: - break; - case StringList: - qvariant_cast(d).removeAt(index); - break; - case VariantList: - qvariant_cast(d).removeAt(index); - break; case QmlList: { QmlPrivate::ListInterface *li = *(QmlPrivate::ListInterface **)d.constData(); li->removeAt(index); - break; + return true; } - case QList: - //XXX needs implementation - qWarning() << "removeAt function not yet implemented for QLists"; - break; + case QListPtr: + { + QList *li = *(QList**)d.constData(); + li->removeAt(index); + return true; + } + case StringList: + case VariantList: + case Invalid: case Instance: - //XXX do nothing? - if (index == 0) - setList(QVariant()); - break; case Integer: - break; + default: + return false; } } -void QmlListAccessor::clear() +bool QmlListAccessor::clear() { switch(m_type) { - case Invalid: - break; - case StringList: - qvariant_cast(d).clear(); - break; - case VariantList: - qvariant_cast(d).clear(); - break; case QmlList: { QmlPrivate::ListInterface *li = *(QmlPrivate::ListInterface **)d.constData(); li->clear(); - break; + return true; + } + case QListPtr: + { + QList *li = *(QList**)d.constData(); + li->clear(); + return true; } - case QList: - QmlMetaType::clear(d); - break; + case StringList: + case VariantList: + case Invalid: case Instance: - //XXX what should we do here? - setList(QVariant()); - break; case Integer: - d = 0; + default: + return false; } } diff --git a/src/declarative/util/qmllistaccessor_p.h b/src/declarative/util/qmllistaccessor_p.h index 2697606..3c67e3a 100644 --- a/src/declarative/util/qmllistaccessor_p.h +++ b/src/declarative/util/qmllistaccessor_p.h @@ -55,7 +55,7 @@ class Q_DECLARATIVE_EXPORT QmlListAccessor { public: QmlListAccessor(); - virtual ~QmlListAccessor(); + ~QmlListAccessor(); QVariant list() const; void setList(const QVariant &, QmlEngine * = 0); @@ -65,12 +65,12 @@ public: int count() const; QVariant at(int) const; - virtual void append(const QVariant &); - virtual void insert(int, const QVariant &); - virtual void removeAt(int); - virtual void clear(); + bool append(const QVariant &); + bool insert(int, const QVariant &); + bool removeAt(int); + bool clear(); - enum Type { Invalid, StringList, VariantList, QmlList, QList, Instance, Integer }; + enum Type { Invalid, StringList, VariantList, QmlList, QListPtr, Instance, Integer }; Type type() const { return m_type; } private: diff --git a/tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp b/tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp index 4c8219a..14de1df 100644 --- a/tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp +++ b/tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp @@ -50,29 +50,169 @@ public: tst_QmlListAccessor() {} private slots: + void invalid(); void qmllist(); - //void qlist(); + void qlist(); void qstringlist(); + void qvariantlist(); + void qobject(); + void instance(); + void integer(); }; +void tst_QmlListAccessor::invalid() +{ + QmlListAccessor accessor; + + QCOMPARE(accessor.list(), QVariant()); + QVERIFY(!accessor.isValid()); + QCOMPARE(accessor.type(), QmlListAccessor::Invalid); + + QCOMPARE(accessor.count(), 0); + QCOMPARE(accessor.at(0), QVariant()); + QCOMPARE(accessor.at(4), QVariant()); + QVERIFY(!accessor.append(QVariant(10))); + QVERIFY(!accessor.insert(0, QVariant(10))); + QVERIFY(!accessor.removeAt(0)); + QVERIFY(!accessor.clear()); + + accessor.setList(QVariant()); + + QCOMPARE(accessor.list(), QVariant()); + QVERIFY(!accessor.isValid()); + QCOMPARE(accessor.type(), QmlListAccessor::Invalid); + + QCOMPARE(accessor.count(), 0); + QCOMPARE(accessor.at(0), QVariant()); + QCOMPARE(accessor.at(4), QVariant()); + QVERIFY(!accessor.append(QVariant(10))); + QVERIFY(!accessor.insert(0, QVariant(10))); + QVERIFY(!accessor.removeAt(0)); + QVERIFY(!accessor.clear()); +} + void tst_QmlListAccessor::qmllist() { QmlConcreteList list; - QObject *obj = new QObject; + QObject *obj = new QObject(this); + QObject *obj2 = new QObject(this); + QObject *obj3 = new QObject(this); + list.append(obj); QVERIFY(list.count() == 1); QCOMPARE(list.at(0), obj); QmlListAccessor accessor; accessor.setList(qVariantFromValue((QmlList*)&list)); + QCOMPARE(accessor.list(), qVariantFromValue((QmlList*)&list)); + // type + QCOMPARE(accessor.type(), QmlListAccessor::QmlList); + + // isValid QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 1); - QVariant v = accessor.at(0); - QCOMPARE(qvariant_cast(v), obj); + // count + QCOMPARE(accessor.count(), 1); + + // at + QCOMPARE(qvariant_cast(accessor.at(0)), obj); + + // append + accessor.append(qVariantFromValue(obj2)); + QVERIFY(accessor.isValid()); + QCOMPARE(accessor.count(), 2); + QCOMPARE(qvariant_cast(accessor.at(1)), obj2); + QCOMPARE(list.count(), 2); + QCOMPARE(list.at(0), obj); + QCOMPARE(list.at(1), obj2); + + // insert + accessor.insert(1, qVariantFromValue(obj3)); + QVERIFY(accessor.isValid()); + QCOMPARE(accessor.count(), 3); + QCOMPARE(qvariant_cast(accessor.at(1)), obj3); + QCOMPARE(list.count(), 3); + QCOMPARE(list.at(0), obj); + QCOMPARE(list.at(1), obj3); + QCOMPARE(list.at(2), obj2); + + // removeAt + accessor.removeAt(1); + QVERIFY(accessor.isValid()); + QCOMPARE(accessor.count(), 2); + QCOMPARE(qvariant_cast(accessor.at(1)), obj2); + QCOMPARE(list.count(), 2); + QCOMPARE(list.at(0), obj); + QCOMPARE(list.at(1), obj2); + // clear + accessor.clear(); QVERIFY(accessor.isValid()); + QCOMPARE(accessor.count(), 0); + QCOMPARE(list.count(), 0); +} + +void tst_QmlListAccessor::qlist() +{ + QList list; + QObject *obj = new QObject(this); + QObject *obj2 = new QObject(this); + QObject *obj3 = new QObject(this); + + list.append(obj); + QVERIFY(list.count() == 1); + QCOMPARE(list.at(0), obj); + + QmlListAccessor accessor; + accessor.setList(qVariantFromValue((QList*)&list)); + QCOMPARE(accessor.list(), qVariantFromValue((QList*)&list)); + + // type + QCOMPARE(accessor.type(), QmlListAccessor::QListPtr); + + // isValid + QVERIFY(accessor.isValid()); + + // count + QCOMPARE(accessor.count(), 1); + + // at + QCOMPARE(qvariant_cast(accessor.at(0)), obj); + + // append + accessor.append(qVariantFromValue(obj2)); + QVERIFY(accessor.isValid()); + QCOMPARE(accessor.count(), 2); + QCOMPARE(qvariant_cast(accessor.at(1)), obj2); + QCOMPARE(list.count(), 2); + QCOMPARE(list.at(0), obj); + QCOMPARE(list.at(1), obj2); + + // insert + accessor.insert(1, qVariantFromValue(obj3)); + QVERIFY(accessor.isValid()); + QCOMPARE(accessor.count(), 3); + QCOMPARE(qvariant_cast(accessor.at(1)), obj3); + QCOMPARE(list.count(), 3); + QCOMPARE(list.at(0), obj); + QCOMPARE(list.at(1), obj3); + QCOMPARE(list.at(2), obj2); + + // removeAt + accessor.removeAt(1); + QVERIFY(accessor.isValid()); + QCOMPARE(accessor.count(), 2); + QCOMPARE(qvariant_cast(accessor.at(1)), obj2); + QCOMPARE(list.count(), 2); + QCOMPARE(list.at(0), obj); + QCOMPARE(list.at(1), obj2); + + // clear + accessor.clear(); + QVERIFY(accessor.isValid()); + QCOMPARE(accessor.count(), 0); + QCOMPARE(list.count(), 0); } void tst_QmlListAccessor::qstringlist() @@ -85,16 +225,231 @@ void tst_QmlListAccessor::qstringlist() QmlListAccessor accessor; accessor.setList(list); + // type + QCOMPARE(accessor.type(), QmlListAccessor::StringList); + + // isValid + QVERIFY(accessor.isValid()); + + // count + QVERIFY(accessor.count() == 2); + + // at + QCOMPARE(qvariant_cast(accessor.at(0)), QLatin1String("Item1")); + QCOMPARE(qvariant_cast(accessor.at(1)), QLatin1String("Item2")); + + // append + QVERIFY(!accessor.append(QVariant("Item3"))); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 2); + QCOMPARE(qvariant_cast(accessor.at(0)), QLatin1String("Item1")); + QCOMPARE(qvariant_cast(accessor.at(1)), QLatin1String("Item2")); + + // insert + QVERIFY(!accessor.insert(1, QVariant("MiddleItem"))); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 2); + QCOMPARE(qvariant_cast(accessor.at(0)), QLatin1String("Item1")); + QCOMPARE(qvariant_cast(accessor.at(1)), QLatin1String("Item2")); + + // removeAt + QVERIFY(!accessor.removeAt(1)); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 2); + QCOMPARE(qvariant_cast(accessor.at(0)), QLatin1String("Item1")); + QCOMPARE(qvariant_cast(accessor.at(1)), QLatin1String("Item2")); + + // clear + QVERIFY(!accessor.clear()); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 2); + QCOMPARE(qvariant_cast(accessor.at(0)), QLatin1String("Item1")); + QCOMPARE(qvariant_cast(accessor.at(1)), QLatin1String("Item2")); +} + +void tst_QmlListAccessor::qvariantlist() +{ + QVariantList list; + list.append(QLatin1String("Item1")); + list.append(QLatin1String("Item2")); + QVERIFY(list.count() == 2); + + QmlListAccessor accessor; + accessor.setList(list); + + // type + QCOMPARE(accessor.type(), QmlListAccessor::VariantList); + + // isValid + QVERIFY(accessor.isValid()); + + // count + QVERIFY(accessor.count() == 2); + + // at + QCOMPARE(qvariant_cast(accessor.at(0)), QLatin1String("Item1")); + QCOMPARE(qvariant_cast(accessor.at(1)), QLatin1String("Item2")); + + // append + QVERIFY(!accessor.append(QVariant("Item3"))); QVERIFY(accessor.isValid()); QVERIFY(accessor.count() == 2); + QCOMPARE(qvariant_cast(accessor.at(0)), QLatin1String("Item1")); + QCOMPARE(qvariant_cast(accessor.at(1)), QLatin1String("Item2")); + + // insert + QVERIFY(!accessor.insert(1, QVariant("MiddleItem"))); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 2); + QCOMPARE(qvariant_cast(accessor.at(0)), QLatin1String("Item1")); + QCOMPARE(qvariant_cast(accessor.at(1)), QLatin1String("Item2")); + + // removeAt + QVERIFY(!accessor.removeAt(1)); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 2); + QCOMPARE(qvariant_cast(accessor.at(0)), QLatin1String("Item1")); + QCOMPARE(qvariant_cast(accessor.at(1)), QLatin1String("Item2")); + + // clear + QVERIFY(!accessor.clear()); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 2); + QCOMPARE(qvariant_cast(accessor.at(0)), QLatin1String("Item1")); + QCOMPARE(qvariant_cast(accessor.at(1)), QLatin1String("Item2")); +} + +void tst_QmlListAccessor::qobject() +{ + QObject *obj = new QObject(this); + + QmlListAccessor accessor; + accessor.setList(qVariantFromValue(obj)); - QVariant v = accessor.at(0); - QCOMPARE(qvariant_cast(v), QLatin1String("Item1")); + // type + QCOMPARE(accessor.type(), QmlListAccessor::Instance); - v = accessor.at(1); - QCOMPARE(qvariant_cast(v), QLatin1String("Item2")); + // isValid + QVERIFY(accessor.isValid()); + + // count + QVERIFY(accessor.count() == 1); + + // at + QCOMPARE(accessor.at(0), qVariantFromValue(obj)); + + // append + QVERIFY(!accessor.append(qVariantFromValue((QObject *)0))); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 1); + QCOMPARE(accessor.at(0), qVariantFromValue(obj)); + + // insert + QVERIFY(!accessor.insert(0, qVariantFromValue((QObject *)0))); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 1); + QCOMPARE(accessor.at(0), qVariantFromValue(obj)); + + // removeAt + QVERIFY(!accessor.removeAt(0)); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 1); + QCOMPARE(accessor.at(0), qVariantFromValue(obj)); + + // clear + QVERIFY(!accessor.clear()); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 1); + QCOMPARE(accessor.at(0), qVariantFromValue(obj)); } +void tst_QmlListAccessor::instance() +{ + QRect r; + + QmlListAccessor accessor; + accessor.setList(r); + + // type + QCOMPARE(accessor.type(), QmlListAccessor::Instance); + + // isValid + QVERIFY(accessor.isValid()); + + // count + QVERIFY(accessor.count() == 1); + + // at + QCOMPARE(accessor.at(0), qVariantFromValue(r)); + + // append + QVERIFY(!accessor.append(qVariantFromValue(r))); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 1); + QCOMPARE(accessor.at(0), qVariantFromValue(r)); + + // insert + QVERIFY(!accessor.insert(0, qVariantFromValue(r))); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 1); + QCOMPARE(accessor.at(0), qVariantFromValue(r)); + + // removeAt + QVERIFY(!accessor.removeAt(0)); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 1); + QCOMPARE(accessor.at(0), qVariantFromValue(r)); + + // clear + QVERIFY(!accessor.clear()); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 1); + QCOMPARE(accessor.at(0), qVariantFromValue(r)); +} + +void tst_QmlListAccessor::integer() +{ + int r = 13; + + QmlListAccessor accessor; + accessor.setList(r); + + // type + QCOMPARE(accessor.type(), QmlListAccessor::Integer); + + // isValid + QVERIFY(accessor.isValid()); + + // count + QVERIFY(accessor.count() == 13); + + // at + QCOMPARE(accessor.at(4), qVariantFromValue(4)); + + // append + QVERIFY(!accessor.append(qVariantFromValue(r))); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 13); + QCOMPARE(accessor.at(4), qVariantFromValue(4)); + + // insert + QVERIFY(!accessor.insert(0, qVariantFromValue(r))); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 13); + QCOMPARE(accessor.at(4), qVariantFromValue(4)); + + // removeAt + QVERIFY(!accessor.removeAt(0)); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 13); + QCOMPARE(accessor.at(4), qVariantFromValue(4)); + + // clear + QVERIFY(!accessor.clear()); + QVERIFY(accessor.isValid()); + QVERIFY(accessor.count() == 13); + QCOMPARE(accessor.at(4), qVariantFromValue(4)); +} QTEST_MAIN(tst_QmlListAccessor) -- cgit v0.12 From db56fec07c1a8a0a3a6e006ec2613351241cdf54 Mon Sep 17 00:00:00 2001 From: Justin McPherson Date: Wed, 18 Nov 2009 13:56:45 +1000 Subject: Minor doc fixes for animation elements. Reviewed-by: Martin Jones --- src/declarative/util/qmlanimation.cpp | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/declarative/util/qmlanimation.cpp b/src/declarative/util/qmlanimation.cpp index 780bc82..475978f 100644 --- a/src/declarative/util/qmlanimation.cpp +++ b/src/declarative/util/qmlanimation.cpp @@ -595,7 +595,7 @@ void QmlAbstractAnimation::timelineComplete() /*! \qmlclass PauseAnimation QmlPauseAnimation \inherits Animation - \brief The PauseAnimation provides a pause for an animation. + \brief The PauseAnimation element provides a pause for an animation. When used in a SequentialAnimation, PauseAnimation is a step when nothing happens, for a specified duration. @@ -668,7 +668,7 @@ QAbstractAnimation *QmlPauseAnimation::qtAnimation() /*! \qmlclass ColorAnimation QmlColorAnimation \inherits PropertyAnimation - \brief The ColorAnimation allows you to animate color changes. + \brief The ColorAnimation element allows you to animate color changes. \code ColorAnimation { from: "white"; to: "#c0c0c0"; duration: 100 } @@ -676,7 +676,7 @@ QAbstractAnimation *QmlPauseAnimation::qtAnimation() When used in a transition, ColorAnimation will by default animate all properties of type color that are changing. If a property or properties - are explicity set for the animation, then those will be used instead. + are explicitly set for the animation, then those will be used instead. */ /*! \internal @@ -731,7 +731,7 @@ QML_DEFINE_TYPE(Qt,4,6,ColorAnimation,QmlColorAnimation) /*! \qmlclass ScriptAction QmlScriptAction \inherits Animation - \brief The ScriptAction allows scripts to be run during an animation. + \brief The ScriptAction element allows scripts to be run during an animation. */ /*! @@ -837,7 +837,7 @@ QML_DEFINE_TYPE(Qt,4,6,ScriptAction,QmlScriptAction) /*! \qmlclass PropertyAction QmlPropertyAction \inherits Animation - \brief The PropertyAction allows immediate property changes during animation. + \brief The PropertyAction element allows immediate property changes during animation. Explicitly set \c theimage.smooth=true during a transition: \code @@ -1303,7 +1303,7 @@ QML_DEFINE_TYPE(Qt,4,6,ParentAction,QmlParentAction) /*! \qmlclass NumberAnimation QmlNumberAnimation \inherits PropertyAnimation - \brief The NumberAnimation allows you to animate changes in properties of type qreal. + \brief The NumberAnimation element allows you to animate changes in properties of type qreal. Animate a set of properties over 200ms, from their values in the start state to their values in the end state of the transition: @@ -1381,7 +1381,7 @@ QmlList *QmlAnimationGroup::animations() /*! \qmlclass SequentialAnimation QmlSequentialAnimation \inherits Animation - \brief The SequentialAnimation allows you to run animations sequentially. + \brief The SequentialAnimation element allows you to run animations sequentially. Animations controlled in SequentialAnimation will be run one after the other. @@ -1456,7 +1456,7 @@ QML_DEFINE_TYPE(Qt,4,6,SequentialAnimation,QmlSequentialAnimation) /*! \qmlclass ParallelAnimation QmlParallelAnimation \inherits Animation - \brief The ParallelAnimation allows you to run animations in parallel. + \brief The ParallelAnimation element allows you to run animations in parallel. Animations contained in ParallelAnimation will be run at the same time. @@ -1580,14 +1580,12 @@ void QmlPropertyAnimationPrivate::convertVariant(QVariant &variant, int type) /*! \qmlclass PropertyAnimation QmlPropertyAnimation \inherits Animation - \brief The PropertyAnimation allows you to animate property changes. + \brief The PropertyAnimation element allows you to animate property changes. Animate a size property over 200ms, from its current size to 20-by-20: \code - VariantAnimation { property: "size"; to: "20x20"; duration: 200 } + PropertyAnimation { property: "size"; to: "20x20"; duration: 200 } \endcode - - \a qmlanimation.html */ QmlPropertyAnimation::QmlPropertyAnimation(QObject *parent) -- cgit v0.12