[Development] Compatability break in QUrl in Qt 4.8
Thiago Macieira
thiago.macieira at intel.com
Tue Jan 31 13:24:00 CET 2012
On Tuesday, 31 de January de 2012 11.57.01, shane.kearns at accenture.com wrote:
> The documentation note about the dangers of constructing QUrl from QString
> was already there in 4.6 (at the bottom of the page) However,
> QT_NO_URL_CAST_FROM_STRING is not defined by default, so there are no
> compiler errors or warnings when using unsafe construction.
My new qurl.h has:
#ifdef QT_NO_URL_CAST_FROM_STRING
explicit QUrl(const QString &url, ParsingMode mode = TolerantMode);
#else
QUrl(const QString &url, ParsingMode mode = TolerantMode);
QUrl &operator=(const QString &url);
#endif
I think we may want to remove the #ifdef and go with the explicit as the only
option.
> So I am in favour of keeping the 4.7 behaviour in 4.x releases.
Ok.
> int main(int argc, char *argv[])
> {
> QApplication app(argc, argv);
>
> Html5ApplicationViewer viewer;
> viewer.setOrientation(Html5ApplicationViewer::ScreenOrientationAuto);
> viewer.showExpanded();
> viewer.loadFile(QLatin1String("html/index.html")); // <-- relative path
This here is not technically *wrong*. The viewer might have its own treatment
of local file paths for some reason. When loading the file, it might do:
QUrl base("file:");
QUrl resolved = base.resolved(source);
// here, the URL is "file:html/index.html", which is still relative but is
// definitely a local file path
>
> return app.exec();
> }
>
> QString Html5ApplicationViewerPrivate::adjustPath(const QString &path)
> {
> #ifdef Q_OS_UNIX
> #ifdef Q_OS_MAC
> if (!QDir::isAbsolutePath(path))
> return QCoreApplication::applicationDirPath()
> + QLatin1String("/../Resources/") + path;
> #else
> const QString pathInInstallDir = QCoreApplication::applicationDirPath()
> + QLatin1String("/../") + path;
> if (pathInInstallDir.contains(QLatin1String("opt"))
> && pathInInstallDir.contains(QLatin1String("bin"))
> && QFileInfo(pathInInstallDir).exists()) { // <-- condition is
> false on symbian return pathInInstallDir;
> }
> #endif
> #endif
> return path; // <-- path is unmodified
> }
This function is manipulating strings when it should be using QUrl::resolved.
QUrl resourceBase;
#ifdef Q_OS_MAC
resourceBase = QUrl::fromLocalFile(QCoreApplication::applicationDirPath()
+ QLatin1String("/../Resources/"));
#elif defined Q_OS_UNIX
resourceBase = QUrl::fromLocalFile(QCoreApplication::applicationDirPath()
+ QLatin1String("/../share/")
+ QCoreApplication::applicationName());
#endif
return resourceBase.resolved(uri);
Or it's a job for QStandardPaths.
--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel Open Source Technology Center
Intel Sweden AB - Registration Number: 556189-6027
Knarrarnäsgatan 15, 164 40 Kista, Stockholm, Sweden
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 190 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.qt-project.org/pipermail/development/attachments/20120131/9fe06a6b/attachment.sig>
More information about the Development
mailing list