From 6cef89c6442d06934c3545919e6b8283b3d8d1a4 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Wed, 23 Jun 2010 07:51:21 +0200 Subject: When a drag is finished with on Mac, then it should delete itself On other platforms then when a drag is finished then it cleans up by calling setMimeData(0) and deleteLater() on the drag object, this didn't happen before on the Mac which meant it did not delete the QDrag objects until the parent of them was deleted thus taking up memory. Task-number: QTBUG-11613 Reviewed-by: Prasanth --- src/gui/kernel/qcocoaview_mac.mm | 2 ++ src/gui/kernel/qdnd_mac.mm | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm index eec9699..5c90e2e 100644 --- a/src/gui/kernel/qcocoaview_mac.mm +++ b/src/gui/kernel/qcocoaview_mac.mm @@ -1587,6 +1587,8 @@ Qt::DropAction QDragManager::drag(QDrag *o) } } } + o->setMimeData(0); + o->deleteLater(); return performedAction; } diff --git a/src/gui/kernel/qdnd_mac.mm b/src/gui/kernel/qdnd_mac.mm index 189d535..844f5e3 100644 --- a/src/gui/kernel/qdnd_mac.mm +++ b/src/gui/kernel/qdnd_mac.mm @@ -675,6 +675,8 @@ Qt::DropAction QDragManager::drag(QDrag *o) } if (atleastOne){ DisposeDrag(dragRef); + o->setMimeData(0); + o->deleteLater(); return action; } } @@ -682,6 +684,8 @@ Qt::DropAction QDragManager::drag(QDrag *o) DragActions ret = kDragActionNothing; GetDragDropAction(dragRef, &ret); DisposeDrag(dragRef); //cleanup + o->setMimeData(0); + o->deleteLater(); return qt_mac_dnd_map_mac_default_action(ret); } DisposeDrag(dragRef); //cleanup -- cgit v0.12 From 4221d629e2cf37ee8c5ba7cb595b05ab8c82f113 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Wed, 23 Jun 2010 09:56:42 +0200 Subject: Removed support for static linking of QtWebKit. Static linking of WebKit is not going to be supported anymore in Qt 4.7, so this commit makes sure it's mentioned in the documentation and that configure disables WebKit if static linking of Qt is requested. Reviewed-by: Andy Shaw --- configure | 6 ++++++ doc/src/platforms/compiler-notes.qdoc | 4 +++- tools/configure/configureapp.cpp | 5 +++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/configure b/configure index f61ac6c..5d97405 100755 --- a/configure +++ b/configure @@ -6937,6 +6937,12 @@ if [ "$CFG_GUI" = "no" ]; then canBuildWebKit="no" fi +if [ "$CFG_SHARED" = "no" ]; then + echo + echo "WARNING: Using static linking will disable the WebKit module." + echo + canBuildWebKit="no" +fi CFG_CONCURRENT="yes" if [ "$canBuildQtConcurrent" = "no" ]; then diff --git a/doc/src/platforms/compiler-notes.qdoc b/doc/src/platforms/compiler-notes.qdoc index c365d88..7eb92e0 100644 --- a/doc/src/platforms/compiler-notes.qdoc +++ b/doc/src/platforms/compiler-notes.qdoc @@ -52,7 +52,7 @@ \table \header \o Compiler \o{5,1} Features - \header \o \o Concurrent \o XmlPatterns \o WebKit \o CLucene \o Phonon + \header \o \o Concurrent \o XmlPatterns \o WebKit(*) \o CLucene \o Phonon \row \o g++ 3.3 \o \o \bold{X} \o \o \bold{X} \o \bold{X} \row \o g++ 3.4 and up \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X} \row @@ -67,6 +67,8 @@ \row \o MSVC 2005 and up \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X} \o \bold{X} \endtable + * WebKit is only supported as a dynamically built library. Static linkage is not supported. + \target GCC \section1 GCC diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index 2e2d8ba..c66eb53 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -2125,6 +2125,11 @@ bool Configure::checkAvailability(const QString &part) available = true; } else if (part == "WEBKIT") { available = (dictionary.value("QMAKESPEC") == "win32-msvc2005") || (dictionary.value("QMAKESPEC") == "win32-msvc2008") || (dictionary.value("QMAKESPEC") == "win32-msvc2010") || (dictionary.value("QMAKESPEC") == "win32-g++"); + if( dictionary[ "SHARED" ] == "no" ) { + cout << endl << "WARNING: Using static linking will disable the WebKit module." << endl + << endl; + available = false; + } } else if (part == "AUDIO_BACKEND") { available = true; if (dictionary.contains("XQMAKESPEC") && dictionary["XQMAKESPEC"].startsWith("symbian")) { -- cgit v0.12 From 87ee2e1c4497c67626db09a631577debea362fba Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Wed, 23 Jun 2010 10:10:43 +0200 Subject: Improve text performance with QtWebKit in Qt 4.7 Implemented the straight string-to-glyph conversion in the core text font engine, that bypasses the shaping. This is used by the fast text code path in QtWebKit. Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/gui/text/qfontengine_mac.mm | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/gui/text/qfontengine_mac.mm b/src/gui/text/qfontengine_mac.mm index 7ceed61..deaad57 100644 --- a/src/gui/text/qfontengine_mac.mm +++ b/src/gui/text/qfontengine_mac.mm @@ -348,7 +348,29 @@ bool QCoreTextFontEngineMulti::stringToCMap(const QChar *str, int len, QGlyphLay bool QCoreTextFontEngineMulti::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, QTextEngine::ShaperFlags flags) const { - return stringToCMap(str, len, glyphs, nglyphs, flags, 0, 0); + *nglyphs = len; + QVarLengthArray cgGlyphs(len); + CTFontGetGlyphsForCharacters(ctfont, (const UniChar*)str, cgGlyphs.data(), len); + + for (int i = 0; i < len; ++i) + glyphs->glyphs[i] = cgGlyphs[i]; + + if (flags & QTextEngine::GlyphIndicesOnly) + return true; + + QVarLengthArray advances(len); + CTFontGetAdvancesForGlyphs(ctfont, kCTFontHorizontalOrientation, cgGlyphs.data(), advances.data(), len); + + for (int i = 0; i < len; ++i) { + glyphs->advances_x[i] = QFixed::fromReal(advances[i].width); + glyphs->advances_y[i] = QFixed::fromReal(advances[i].height); + if (fontDef.styleStrategy & QFont::ForceIntegerMetrics) { + glyphs->advances_x[i] = glyphs->advances_x[i].round(); + glyphs->advances_y[i] = glyphs->advances_y[i].round(); + } + } + + return true; } void QCoreTextFontEngineMulti::recalcAdvances(int , QGlyphLayout *, QTextEngine::ShaperFlags) const -- cgit v0.12 From f665e020846463feda0d6907d9a9084919ae8641 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 10 Jun 2010 20:17:42 +0200 Subject: fix prompt() stdin safety check Reviewed-by: joerg --- qmake/project.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qmake/project.cpp b/qmake/project.cpp index 9cf6a6f..5c8066b 100644 --- a/qmake/project.cpp +++ b/qmake/project.cpp @@ -2191,7 +2191,7 @@ QMakeProject::doProjectExpand(QString func, QList args_list, if(args.count() != 1) { fprintf(stderr, "%s:%d prompt(question) requires one argument.\n", parser.file.toLatin1().constData(), parser.line_no); - } else if(projectFile() == "-") { + } else if(pfile == "-") { fprintf(stderr, "%s:%d prompt(question) cannot be used when '-o -' is used.\n", parser.file.toLatin1().constData(), parser.line_no); } else { -- cgit v0.12 From e4965d686936c8d9b357ec1f7d0fdbc3be8cffca Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 10 Jun 2010 20:21:27 +0200 Subject: remove unused function --- qmake/project.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/qmake/project.h b/qmake/project.h index fd8ced1..f2edfce 100644 --- a/qmake/project.h +++ b/qmake/project.h @@ -127,7 +127,6 @@ public: QStringList userTestFunctions() { return testFunctions.keys(); } QString projectFile(); - QString configFile(); inline QMakeProperty *properties() { return prop; } bool doProjectTest(QString str, QMap &place); @@ -174,9 +173,6 @@ inline QString QMakeProject::projectFile() return pfile; } -inline QString QMakeProject::configFile() -{ return cfile; } - inline QStringList &QMakeProject::values(const QString &v) { return values(v, vars); } -- cgit v0.12 From ada73373877b71d6cceaf82fc9237c139eb53915 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 10 Jun 2010 20:22:38 +0200 Subject: remove support for QMAKE_POST_INCLUDE_FILES google has no mention of it except for a single orphaned instance in our own source code => trash. Reviewed-by: joerg --- qmake/project.cpp | 10 ---------- qmake/project.h | 2 +- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/qmake/project.cpp b/qmake/project.cpp index 5c8066b..60babeb 100644 --- a/qmake/project.cpp +++ b/qmake/project.cpp @@ -1406,16 +1406,6 @@ QMakeProject::read(uchar cmd) return false; } - if(cmd & ReadPostFiles) { // parse post files - const QStringList l = vars["QMAKE_POST_INCLUDE_FILES"]; - for(QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) { - if(read((*it), vars)) { - if(vars["QMAKE_INTERNAL_INCLUDED_FILES"].indexOf((*it)) == -1) - vars["QMAKE_INTERNAL_INCLUDED_FILES"].append((*it)); - } - } - } - if(cmd & ReadCmdLine) { parser.file = "(internal)"; parser.from_file = false; diff --git a/qmake/project.h b/qmake/project.h index f2edfce..1d9ec04 100644 --- a/qmake/project.h +++ b/qmake/project.h @@ -118,7 +118,7 @@ public: ~QMakeProject(); enum { ReadCache=0x01, ReadConf=0x02, ReadCmdLine=0x04, ReadProFile=0x08, - ReadPostFiles=0x10, ReadFeatures=0x20, ReadConfigs=0x40, ReadAll=0xFF }; + ReadFeatures=0x20, ReadConfigs=0x40, ReadAll=0xFF }; inline bool parse(const QString &text) { return parse(text, vars); } bool read(const QString &project, uchar cmd=ReadAll); bool read(uchar cmd=ReadAll); -- cgit v0.12 From 4325512a4459003c25db981e185412c81410754a Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 22 Jun 2010 11:47:10 +0200 Subject: add some comments --- qmake/project.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qmake/project.cpp b/qmake/project.cpp index 60babeb..76cca00 100644 --- a/qmake/project.cpp +++ b/qmake/project.cpp @@ -1730,9 +1730,9 @@ QMakeProject::doProjectInclude(QString file, uchar flags, QMap Date: Tue, 22 Jun 2010 12:54:23 +0200 Subject: don't remove the path from the name of included files it is not done for the top-level file, either. this is minimally behavior-incompatible, but anyone relying on the old behavior (and thus not using $$basename()) should be shot anyway. :) Reviewed-by: joerg --- qmake/project.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/qmake/project.cpp b/qmake/project.cpp index 76cca00..cb02923 100644 --- a/qmake/project.cpp +++ b/qmake/project.cpp @@ -1710,7 +1710,6 @@ QMakeProject::doProjectInclude(QString file, uchar flags, QMap Date: Wed, 23 Jun 2010 12:00:59 +0300 Subject: Fix "missing store_build" errors Create a dummy store_build target in projects that do not deploy anything when building for symbian-abld. Task-number: QTBUG-11656 Reviewed-by: Janne Koskinen --- mkspecs/features/sis_targets.prf | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mkspecs/features/sis_targets.prf b/mkspecs/features/sis_targets.prf index 37b758b..4207e0b 100644 --- a/mkspecs/features/sis_targets.prf +++ b/mkspecs/features/sis_targets.prf @@ -170,6 +170,12 @@ equals(GENERATE_SIS_TARGETS, true) { sis_target.commands = sis_target.target = sis QMAKE_EXTRA_TARGETS += sis_target + + symbian-abld { + # Create dummy store_build target to avoid errors from .mk callbacks during build + store_build_target.target = store_build + QMAKE_EXTRA_TARGETS += store_build_target + } } QMAKE_DISTCLEAN += $${sis_destdir}$${TARGET}.sis -- cgit v0.12 From b26765f9f40a0320113cf10cbde88f7864d736ab Mon Sep 17 00:00:00 2001 From: Prasanth Ullattil Date: Wed, 23 Jun 2010 10:27:37 +0200 Subject: Newly created folders in QFileDialog are disabled on Cocoa. For a newly created folder in the current path, we were returning NO for the "shouldShowFilename" callback. This patch moves the check for directories to the begining. Task-number: QTBUG-11532 Reviewed-by: Carlos Duclos --- src/gui/dialogs/qfiledialog_mac.mm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/gui/dialogs/qfiledialog_mac.mm b/src/gui/dialogs/qfiledialog_mac.mm index b07b1ea..f1afaa9 100644 --- a/src/gui/dialogs/qfiledialog_mac.mm +++ b/src/gui/dialogs/qfiledialog_mac.mm @@ -284,6 +284,15 @@ QT_USE_NAMESPACE if ([filename length] == 0) return NO; + // Always accept directories regardless of their names (unless it is a bundle): + BOOL isDir; + if ([[NSFileManager defaultManager] fileExistsAtPath:filename isDirectory:&isDir] && isDir) { + if ([mSavePanel treatsFilePackagesAsDirectories] == NO) { + if ([[NSWorkspace sharedWorkspace] isFilePackageAtPath:filename] == NO) + return YES; + } + } + QString qtFileName = QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString)(filename); QFileInfo info(qtFileName.normalized(QT_PREPEND_NAMESPACE(QString::NormalizationForm_C))); QString path = info.absolutePath(); @@ -295,15 +304,6 @@ QT_USE_NAMESPACE if (!mQDirFilterEntryList->contains(info.fileName())) return NO; - // Always accept directories regardless of their names (unless it is a bundle): - BOOL isDir; - if ([[NSFileManager defaultManager] fileExistsAtPath:filename isDirectory:&isDir] && isDir) { - if ([mSavePanel treatsFilePackagesAsDirectories] == NO) { - if ([[NSWorkspace sharedWorkspace] isFilePackageAtPath:filename] == NO) - return YES; - } - } - // No filter means accept everything if (mSelectedNameFilter->isEmpty()) return YES; -- cgit v0.12 From b483c61023f8a71aa51bca8cfcffb5264dc71ad6 Mon Sep 17 00:00:00 2001 From: kh1 Date: Wed, 23 Jun 2010 12:22:32 +0200 Subject: There where still references to the old Assistant. Task-number: QTBUG-11651 --- demos/qtdemo/qtdemo.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/qtdemo/qtdemo.pro b/demos/qtdemo/qtdemo.pro index 4d4177e..61ea376 100644 --- a/demos/qtdemo/qtdemo.pro +++ b/demos/qtdemo/qtdemo.pro @@ -1,4 +1,4 @@ -CONFIG += assistant help x11inc +CONFIG += help x11inc TARGET = qtdemo DEMO_DESTDIR = $$QT_BUILD_TREE isEmpty(DEMO_DESTDIR):DEMO_DESTDIR=../.. -- cgit v0.12 From e2c8d6063660852365582a88965f37e2c33b8607 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 23 Jun 2010 15:03:35 +0200 Subject: Provide Qml plugins with UID3s on Symbian ...otherwise we cannot Symbian sign them. Reviewed-by: Miikka Heikkinen --- src/imports/folderlistmodel/folderlistmodel.pro | 1 + src/imports/gestures/gestures.pro | 1 + src/imports/particles/particles.pro | 1 + 3 files changed, 3 insertions(+) diff --git a/src/imports/folderlistmodel/folderlistmodel.pro b/src/imports/folderlistmodel/folderlistmodel.pro index dced319..49a6baa 100644 --- a/src/imports/folderlistmodel/folderlistmodel.pro +++ b/src/imports/folderlistmodel/folderlistmodel.pro @@ -14,6 +14,7 @@ qmldir.files += $$PWD/qmldir qmldir.path += $$[QT_INSTALL_IMPORTS]/$$TARGETPATH symbian:{ + TARGET.UID3 = 0x20021320 include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) importFiles.sources = qmlfolderlistmodelplugin.dll qmldir diff --git a/src/imports/gestures/gestures.pro b/src/imports/gestures/gestures.pro index d6dc758..265bbca 100644 --- a/src/imports/gestures/gestures.pro +++ b/src/imports/gestures/gestures.pro @@ -14,6 +14,7 @@ qmldir.files += $$PWD/qmldir qmldir.path += $$[QT_INSTALL_IMPORTS]/$$TARGETPATH symbian:{ + TARGET.UID3 = 0x2002131F include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) importFiles.sources = qmlgesturesplugin.dll qmldir diff --git a/src/imports/particles/particles.pro b/src/imports/particles/particles.pro index 95ec633..91c1b9f 100644 --- a/src/imports/particles/particles.pro +++ b/src/imports/particles/particles.pro @@ -18,6 +18,7 @@ qmldir.files += $$PWD/qmldir qmldir.path += $$[QT_INSTALL_IMPORTS]/$$TARGETPATH symbian:{ + TARGET.UID3 = 0x2002131E include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) importFiles.sources = qmlparticlesplugin.dll qmldir -- cgit v0.12 From 9d285e0b9f49fd5bdf3976e99b8ec168f9d7add6 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 23 Jun 2010 15:04:07 +0200 Subject: Provide the Webkit Qml plugin with a UID3 on Symbian ...otherwise we cannot Symbian sign it. Reviewed-by: Miikka Heikkinen --- src/3rdparty/webkit/WebKit/qt/declarative/declarative.pro | 1 + 1 file changed, 1 insertion(+) diff --git a/src/3rdparty/webkit/WebKit/qt/declarative/declarative.pro b/src/3rdparty/webkit/WebKit/qt/declarative/declarative.pro index 122d90a..1371e57 100644 --- a/src/3rdparty/webkit/WebKit/qt/declarative/declarative.pro +++ b/src/3rdparty/webkit/WebKit/qt/declarative/declarative.pro @@ -64,6 +64,7 @@ qmldir.files += $$PWD/qmldir qmldir.path += $$[QT_INSTALL_IMPORTS]/$$TARGETPATH symbian:{ + TARGET.UID3 = 0x20021321 load(data_caging_paths) include($$QT_SOURCE_TREE/demos/symbianpkgrules.pri) -- cgit v0.12 From cbbaa029501d8833773d599b630aa44ded5d6c78 Mon Sep 17 00:00:00 2001 From: kh1 Date: Wed, 23 Jun 2010 16:19:37 +0200 Subject: Set the item data thru the model, so we actually emit dataChanged. Task-number: QTBUG-10629 Reviewed-by: kh --- tools/assistant/tools/assistant/bookmarkdialog.cpp | 3 +-- tools/assistant/tools/assistant/bookmarkmodel.cpp | 8 ++++++++ tools/assistant/tools/assistant/bookmarkmodel.h | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tools/assistant/tools/assistant/bookmarkdialog.cpp b/tools/assistant/tools/assistant/bookmarkdialog.cpp index 8b195c1..d9e9a53 100644 --- a/tools/assistant/tools/assistant/bookmarkdialog.cpp +++ b/tools/assistant/tools/assistant/bookmarkdialog.cpp @@ -160,8 +160,7 @@ void BookmarkDialog::accepted() QModelIndex index = ui.treeView->currentIndex(); if (index.isValid()) { index = bookmarkModel->addItem(bookmarkTreeModel->mapToSource(index)); - if (BookmarkItem *item = bookmarkModel->itemFromIndex(index)) - item->setData(DataVector() << m_title << m_url << false); + bookmarkModel->setData(index, DataVector() << m_title << m_url << false); } else rejected(); diff --git a/tools/assistant/tools/assistant/bookmarkmodel.cpp b/tools/assistant/tools/assistant/bookmarkmodel.cpp index e446ff0..4c30b42 100644 --- a/tools/assistant/tools/assistant/bookmarkmodel.cpp +++ b/tools/assistant/tools/assistant/bookmarkmodel.cpp @@ -261,6 +261,14 @@ BookmarkModel::data(const QModelIndex &index, int role) const return QVariant(); } +void BookmarkModel::setData(const QModelIndex &index, const DataVector &data) +{ + if (BookmarkItem *item = itemFromIndex(index)) { + item->setData(data); + emit dataChanged(index, index); + } +} + bool BookmarkModel::setData(const QModelIndex &index, const QVariant &value, int role) { diff --git a/tools/assistant/tools/assistant/bookmarkmodel.h b/tools/assistant/tools/assistant/bookmarkmodel.h index 6469258..f74baea 100644 --- a/tools/assistant/tools/assistant/bookmarkmodel.h +++ b/tools/assistant/tools/assistant/bookmarkmodel.h @@ -79,6 +79,7 @@ public: Qt::ItemFlags flags(const QModelIndex &index) const; QVariant data(const QModelIndex &index, int role) const; + void setData(const QModelIndex &index, const QVector &data); bool setData(const QModelIndex &index, const QVariant &value, int role); QVariant headerData(int section, Qt::Orientation orientation, int role) const; -- cgit v0.12 From 8cd7b92b890e392f830b626283c647e7e0118a23 Mon Sep 17 00:00:00 2001 From: kh1 Date: Wed, 23 Jun 2010 16:28:53 +0200 Subject: We need to swallow the event, otherwise it might pop up several times. Reviewed-by: kh --- tools/assistant/tools/assistant/bookmarkmanager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/assistant/tools/assistant/bookmarkmanager.cpp b/tools/assistant/tools/assistant/bookmarkmanager.cpp index 4bc7027..23632b1 100644 --- a/tools/assistant/tools/assistant/bookmarkmanager.cpp +++ b/tools/assistant/tools/assistant/bookmarkmanager.cpp @@ -240,6 +240,7 @@ bool BookmarkManager::eventFilter(QObject *object, QEvent *event) case Qt::Key_Delete: { removeItem(bookmarkTreeView->currentIndex()); + return true; } break; case Qt::Key_Up: { // needs event filter on widget -- cgit v0.12 From 52b3d6263bb58ca82a8f00d42af801f5ed521f6b Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Thu, 24 Jun 2010 11:45:59 +1000 Subject: Update lupdate to recognize concatenated text in QML files. Also fixes a potential crash with non-string-literal nodes. Task-number: QTBUG-11580 --- tools/linguist/lupdate/qdeclarative.cpp | 72 +++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 16 deletions(-) diff --git a/tools/linguist/lupdate/qdeclarative.cpp b/tools/linguist/lupdate/qdeclarative.cpp index 1b35c14..3eef2d7 100644 --- a/tools/linguist/lupdate/qdeclarative.cpp +++ b/tools/linguist/lupdate/qdeclarative.cpp @@ -87,17 +87,25 @@ protected: virtual void endVisit(AST::CallExpression *node) { + m_bSource.clear(); if (AST::IdentifierExpression *idExpr = AST::cast(node->base)) { if (idExpr->name->asString() == QLatin1String("qsTr") || idExpr->name->asString() == QLatin1String("QT_TR_NOOP")) { - if (node->arguments && AST::cast(node->arguments->expression)) { - AST::StringLiteral *literal = AST::cast(node->arguments->expression); - const QString source = literal->value->asString(); + if (!node->arguments) + return; + AST::BinaryExpression *binary = AST::cast(node->arguments->expression); + if (binary) { + if (!createString(binary)) + m_bSource.clear(); + } + AST::StringLiteral *literal = AST::cast(node->arguments->expression); + if (literal || !m_bSource.isEmpty()) { + const QString source = literal ? literal->value->asString() : m_bSource; QString comment; bool plural = false; AST::ArgumentList *commentNode = node->arguments->next; - if (commentNode) { + if (commentNode && AST::cast(commentNode->expression)) { literal = AST::cast(commentNode->expression); comment = literal->value->asString(); @@ -122,18 +130,25 @@ protected: QString comment; bool plural = false; AST::ArgumentList *sourceNode = node->arguments->next; - if (sourceNode) { - literal = AST::cast(sourceNode->expression); - source = literal->value->asString(); - AST::ArgumentList *commentNode = sourceNode->next; - if (commentNode) { - literal = AST::cast(commentNode->expression); - comment = literal->value->asString(); - - AST::ArgumentList *nNode = commentNode->next; - if (nNode) - plural = true; - } + if (!sourceNode) + return; + literal = AST::cast(sourceNode->expression); + AST::BinaryExpression *binary = AST::cast(sourceNode->expression); + if (binary) { + if (!createString(binary)) + m_bSource.clear(); + } + if (!literal && m_bSource.isEmpty()) + return; + source = literal ? literal->value->asString() : m_bSource; + AST::ArgumentList *commentNode = sourceNode->next; + if (commentNode && AST::cast(commentNode->expression)) { + literal = AST::cast(commentNode->expression); + comment = literal->value->asString(); + + AST::ArgumentList *nNode = commentNode->next; + if (nNode) + plural = true; } TranslatorMessage msg(context, source, @@ -148,9 +163,34 @@ protected: } private: + bool createString(AST::BinaryExpression *b) { + if (!b or b->op != 0) + return false; + AST::BinaryExpression *l = AST::cast(b->left); + AST::BinaryExpression *r = AST::cast(b->right); + AST::StringLiteral *ls = AST::cast(b->left); + AST::StringLiteral *rs = AST::cast(b->right); + if ((!l && !ls) || (!r && !rs)) + return false; + if (l) { + if (!createString(l)) + return false; + } else + m_bSource.prepend(ls->value->asString()); + + if (r) { + if (!createString(r)) + return false; + } else + m_bSource.append(rs->value->asString()); + + return true; + } + Translator *m_translator; QString m_fileName; QString m_component; + QString m_bSource; }; QString createErrorString(const QString &filename, const QString &code, Parser &parser) -- cgit v0.12 From 5d64484bf0b37427133c163ad9b160e767dc1bcd Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Thu, 24 Jun 2010 13:43:25 +1000 Subject: Script benchmarking. --- tests/benchmarks/declarative/script/data/block.qml | 6 +-- tests/benchmarks/declarative/script/data/global.js | 45 +++++++++++++++++ .../declarative/script/data/global_prop.qml | 54 +++++++++++++++++++++ tests/benchmarks/declarative/script/tst_script.cpp | 56 +++++++++++++++++++++- 4 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 tests/benchmarks/declarative/script/data/global.js create mode 100644 tests/benchmarks/declarative/script/data/global_prop.qml diff --git a/tests/benchmarks/declarative/script/data/block.qml b/tests/benchmarks/declarative/script/data/block.qml index 4e5006e..f7b2ab3 100644 --- a/tests/benchmarks/declarative/script/data/block.qml +++ b/tests/benchmarks/declarative/script/data/block.qml @@ -47,7 +47,7 @@ Rectangle { function doSomethingDirect() { theObject.prop1 = 0; - for (var i = 0; i < 60; ++i) + for (var i = 0; i < 1000; ++i) theObject.prop1 += theObject.prop2; theObject.prop3 = theObject.prop1; @@ -57,7 +57,7 @@ Rectangle { theObject.prop1 = 0; var incrementObj = theObject; - for (var i = 0; i < 60; ++i) + for (var i = 0; i < 1000; ++i) incrementObj.prop1 += incrementObj.prop2; incrementObj.prop3 = incrementObj.prop1; @@ -67,7 +67,7 @@ Rectangle { theObject.prop1 = 0; var increment = theObject.prop2; - for (var i = 0; i < 60; ++i) + for (var i = 0; i < 1000; ++i) theObject.prop1 += increment; theObject.prop3 = theObject.prop1; diff --git a/tests/benchmarks/declarative/script/data/global.js b/tests/benchmarks/declarative/script/data/global.js new file mode 100644 index 0000000..02472d2 --- /dev/null +++ b/tests/benchmarks/declarative/script/data/global.js @@ -0,0 +1,45 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +function doSomething() { + for (var i = 0; i < 10000; ++i) + Math.sin(90); +} diff --git a/tests/benchmarks/declarative/script/data/global_prop.qml b/tests/benchmarks/declarative/script/data/global_prop.qml new file mode 100644 index 0000000..908cecf --- /dev/null +++ b/tests/benchmarks/declarative/script/data/global_prop.qml @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import Qt 4.7 +import "global.js" as Program + +Rectangle { + width: 200; height: 200 + + signal triggered + onTriggered: Program.doSomething(); + + function doSomething() { + Program.doSomething(); + } +} diff --git a/tests/benchmarks/declarative/script/tst_script.cpp b/tests/benchmarks/declarative/script/tst_script.cpp index 99f294c..16052fa 100644 --- a/tests/benchmarks/declarative/script/tst_script.cpp +++ b/tests/benchmarks/declarative/script/tst_script.cpp @@ -92,7 +92,10 @@ private slots: void block_data(); void block(); -private: + + void global_property_js(); + void global_property_qml(); + void global_property_qml_js(); }; inline QUrl TEST_FILE(const QString &filename) @@ -625,6 +628,57 @@ void tst_script::block() delete rect; } +#define GLOBALPROPERTY_PROGRAM \ + "(function() { " \ + " for (var ii = 0; ii < 10000; ++ii) { " \ + " Math.sin(90); " \ + " } " \ + "})" + +void tst_script::global_property_js() +{ + QScriptEngine engine; + + QScriptValue prog = engine.evaluate(GLOBALPROPERTY_PROGRAM); + prog.call(); + + QBENCHMARK { + prog.call(); + } +} + +void tst_script::global_property_qml() +{ + QDeclarativeEngine qmlengine; + + QScriptEngine *engine = QDeclarativeEnginePrivate::getScriptEngine(&qmlengine); + QScriptValue prog = engine->evaluate(GLOBALPROPERTY_PROGRAM); + prog.call(); + + QBENCHMARK { + prog.call(); + } +} + +void tst_script::global_property_qml_js() +{ + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, TEST_FILE("global_prop.qml")); + QDeclarativeRectangle *rect = qobject_cast(component.create()); + QVERIFY(rect != 0); + + int index = rect->metaObject()->indexOfMethod("triggered()"); + QVERIFY(index != -1); + QMetaMethod method = rect->metaObject()->method(index); + + QBENCHMARK { + method.invoke(rect, Qt::DirectConnection); + } + + delete rect; +} + + QTEST_MAIN(tst_script) #include "tst_script.moc" -- cgit v0.12