summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/io/qurl.cpp146
-rw-r--r--src/corelib/io/qurl.h1
-rw-r--r--src/declarative/declarative.pro2
-rw-r--r--src/declarative/qml/qmlcompositetypemanager.cpp24
-rw-r--r--src/declarative/qml/qmlcompositetypemanager_p.h4
-rw-r--r--src/declarative/qml/qmlengine.cpp4
-rw-r--r--src/xmlpatterns/type/qprimitives_p.h2
7 files changed, 149 insertions, 34 deletions
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index 6ac6468..db072aa 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -350,8 +350,8 @@ public:
};
int stateFlags;
- QByteArray encodedNormalized;
- const QByteArray & normalized();
+ mutable QByteArray encodedNormalized;
+ const QByteArray & normalized() const;
mutable QUrlErrorInfo errorInfo;
QString createErrorString();
@@ -3850,6 +3850,9 @@ QByteArray QUrlPrivate::toEncoded(QUrl::FormattingOptions options) const
if (!QURL_HASFLAG(stateFlags, Parsed)) parse();
else ensureEncodedParts();
+ if (options==0x100) // private - see qHash(QUrl)
+ return normalized();
+
QByteArray url;
if (!(options & QUrl::RemoveScheme) && !scheme.isEmpty()) {
@@ -3920,12 +3923,13 @@ QByteArray QUrlPrivate::toEncoded(QUrl::FormattingOptions options) const
#define qToLower(ch) (((ch|32) >= 'a' && (ch|32) <= 'z') ? (ch|32) : ch)
-const QByteArray &QUrlPrivate::normalized()
+const QByteArray &QUrlPrivate::normalized() const
{
if (QURL_HASFLAG(stateFlags, QUrlPrivate::Normalized))
return encodedNormalized;
- QURL_SETFLAG(stateFlags, QUrlPrivate::Normalized);
+ QUrlPrivate *that = const_cast<QUrlPrivate *>(this);
+ QURL_SETFLAG(that->stateFlags, QUrlPrivate::Normalized);
QUrlPrivate tmp = *this;
tmp.scheme = tmp.scheme.toLower();
@@ -4074,7 +4078,7 @@ QString QUrlPrivate::createErrorString()
\sa setUrl(), setEncodedUrl(), fromEncoded(), TolerantMode
*/
-QUrl::QUrl(const QString &url) : d(new QUrlPrivate)
+QUrl::QUrl(const QString &url) : d(0)
{
if (!url.isEmpty())
setUrl(url);
@@ -4087,18 +4091,20 @@ QUrl::QUrl(const QString &url) : d(new QUrlPrivate)
\sa setUrl()
*/
-QUrl::QUrl(const QString &url, ParsingMode parsingMode) : d(new QUrlPrivate)
+QUrl::QUrl(const QString &url, ParsingMode parsingMode) : d(0)
{
if (!url.isEmpty())
setUrl(url, parsingMode);
- else
+ else {
+ d = new QUrlPrivate;
d->parsingMode = parsingMode;
+ }
}
/*!
Constructs an empty QUrl object.
*/
-QUrl::QUrl() : d(new QUrlPrivate)
+QUrl::QUrl() : d(0)
{
}
@@ -4107,7 +4113,8 @@ QUrl::QUrl() : d(new QUrlPrivate)
*/
QUrl::QUrl(const QUrl &other) : d(other.d)
{
- d->ref.ref();
+ if (d)
+ d->ref.ref();
}
/*!
@@ -4115,7 +4122,7 @@ QUrl::QUrl(const QUrl &other) : d(other.d)
*/
QUrl::~QUrl()
{
- if (!d->ref.deref())
+ if (d && !d->ref.deref())
delete d;
}
@@ -4130,6 +4137,8 @@ QUrl::~QUrl()
*/
bool QUrl::isValid() const
{
+ if (!d) return false;
+
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Validated)) d->validate();
@@ -4141,6 +4150,8 @@ bool QUrl::isValid() const
*/
bool QUrl::isEmpty() const
{
+ if (!d) return true;
+
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed))
return d->encodedOriginal.isEmpty();
else
@@ -4161,8 +4172,9 @@ bool QUrl::isEmpty() const
*/
void QUrl::clear()
{
- detach();
- d->clear();
+ if (d && !d->ref.deref())
+ delete d;
+ d = 0;
}
/*!
@@ -4261,8 +4273,9 @@ static inline char toHex(quint8 c)
*/
void QUrl::setEncodedUrl(const QByteArray &encodedUrl, ParsingMode parsingMode)
{
- clear();
QByteArray tmp = encodedUrl;
+ if (!d) d = new QUrlPrivate;
+ else d->clear();
if ((d->parsingMode = parsingMode) == TolerantMode) {
// Replace stray % with %25
QByteArray copy = tmp;
@@ -4336,6 +4349,7 @@ void QUrl::setEncodedUrl(const QByteArray &encodedUrl, ParsingMode parsingMode)
*/
void QUrl::setScheme(const QString &scheme)
{
+ if (!d) d = new QUrlPrivate;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized);
@@ -4351,6 +4365,7 @@ void QUrl::setScheme(const QString &scheme)
*/
QString QUrl::scheme() const
{
+ if (!d) return QString();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
return d->scheme;
@@ -4374,6 +4389,8 @@ QString QUrl::scheme() const
*/
void QUrl::setAuthority(const QString &authority)
{
+ if (!d) d = new QUrlPrivate;
+
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized);
@@ -4389,6 +4406,8 @@ void QUrl::setAuthority(const QString &authority)
*/
QString QUrl::authority() const
{
+ if (!d) return QString();
+
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
return d->authority();
@@ -4409,6 +4428,8 @@ QString QUrl::authority() const
*/
void QUrl::setUserInfo(const QString &userInfo)
{
+ if (!d) d = new QUrlPrivate;
+
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized);
@@ -4422,6 +4443,8 @@ void QUrl::setUserInfo(const QString &userInfo)
*/
QString QUrl::userInfo() const
{
+ if (!d) return QString();
+
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
return d->userInfo();
@@ -4436,6 +4459,8 @@ QString QUrl::userInfo() const
*/
void QUrl::setUserName(const QString &userName)
{
+ if (!d) d = new QUrlPrivate;
+
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized);
@@ -4452,6 +4477,8 @@ void QUrl::setUserName(const QString &userName)
*/
QString QUrl::userName() const
{
+ if (!d) return QString();
+
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
d->userInfo(); // causes the unencoded form to be set
@@ -4473,6 +4500,7 @@ QString QUrl::userName() const
*/
void QUrl::setEncodedUserName(const QByteArray &userName)
{
+ if (!d) d = new QUrlPrivate;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized);
@@ -4493,6 +4521,7 @@ void QUrl::setEncodedUserName(const QByteArray &userName)
*/
QByteArray QUrl::encodedUserName() const
{
+ if (!d) return QByteArray();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
d->ensureEncodedParts();
@@ -4508,6 +4537,7 @@ QByteArray QUrl::encodedUserName() const
*/
void QUrl::setPassword(const QString &password)
{
+ if (!d) d = new QUrlPrivate;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized);
@@ -4524,6 +4554,7 @@ void QUrl::setPassword(const QString &password)
*/
QString QUrl::password() const
{
+ if (!d) return QString();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
d->userInfo(); // causes the unencoded form to be set
@@ -4545,6 +4576,7 @@ QString QUrl::password() const
*/
void QUrl::setEncodedPassword(const QByteArray &password)
{
+ if (!d) d = new QUrlPrivate;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized);
@@ -4565,6 +4597,7 @@ void QUrl::setEncodedPassword(const QByteArray &password)
*/
QByteArray QUrl::encodedPassword() const
{
+ if (!d) return QByteArray();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
d->ensureEncodedParts();
@@ -4579,6 +4612,7 @@ QByteArray QUrl::encodedPassword() const
*/
void QUrl::setHost(const QString &host)
{
+ if (!d) d = new QUrlPrivate;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized | QUrlPrivate::HostCanonicalized);
@@ -4592,6 +4626,7 @@ void QUrl::setHost(const QString &host)
*/
QString QUrl::host() const
{
+ if (!d) return QString();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
if (d->host.isEmpty() || d->host.at(0) != QLatin1Char('['))
@@ -4645,6 +4680,7 @@ QByteArray QUrl::encodedHost() const
*/
void QUrl::setPort(int port)
{
+ if (!d) d = new QUrlPrivate;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized);
@@ -4662,6 +4698,7 @@ void QUrl::setPort(int port)
*/
int QUrl::port() const
{
+ if (!d) return -1;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Validated)) d->validate();
return d->port;
@@ -4680,6 +4717,7 @@ int QUrl::port() const
*/
int QUrl::port(int defaultPort) const
{
+ if (!d) return defaultPort;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
return d->port == -1 ? defaultPort : d->port;
}
@@ -4699,6 +4737,7 @@ int QUrl::port(int defaultPort) const
*/
void QUrl::setPath(const QString &path)
{
+ if (!d) d = new QUrlPrivate;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized);
@@ -4714,6 +4753,7 @@ void QUrl::setPath(const QString &path)
*/
QString QUrl::path() const
{
+ if (!d) return QString();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
if (d->path.isNull()) {
@@ -4745,6 +4785,7 @@ QString QUrl::path() const
*/
void QUrl::setEncodedPath(const QByteArray &path)
{
+ if (!d) d = new QUrlPrivate;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized);
@@ -4765,6 +4806,7 @@ void QUrl::setEncodedPath(const QByteArray &path)
*/
QByteArray QUrl::encodedPath() const
{
+ if (!d) return QByteArray();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
d->ensureEncodedParts();
@@ -4780,6 +4822,7 @@ QByteArray QUrl::encodedPath() const
*/
bool QUrl::hasQuery() const
{
+ if (!d) return false;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
return d->hasQuery;
@@ -4809,6 +4852,7 @@ bool QUrl::hasQuery() const
*/
void QUrl::setQueryDelimiters(char valueDelimiter, char pairDelimiter)
{
+ if (!d) d = new QUrlPrivate;
detach();
d->valueDelimiter = valueDelimiter;
@@ -4821,6 +4865,7 @@ void QUrl::setQueryDelimiters(char valueDelimiter, char pairDelimiter)
*/
char QUrl::queryPairDelimiter() const
{
+ if (!d) return '&';
return d->pairDelimiter;
}
@@ -4830,6 +4875,7 @@ char QUrl::queryPairDelimiter() const
*/
char QUrl::queryValueDelimiter() const
{
+ if (!d) return '=';
return d->valueDelimiter;
}
@@ -4852,6 +4898,7 @@ char QUrl::queryValueDelimiter() const
*/
void QUrl::setEncodedQuery(const QByteArray &query)
{
+ if (!d) d = new QUrlPrivate;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized);
@@ -4871,6 +4918,7 @@ void QUrl::setEncodedQuery(const QByteArray &query)
*/
void QUrl::setQueryItems(const QList<QPair<QString, QString> > &query)
{
+ if (!d) d = new QUrlPrivate;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
@@ -4910,6 +4958,7 @@ void QUrl::setQueryItems(const QList<QPair<QString, QString> > &query)
*/
void QUrl::setEncodedQueryItems(const QList<QPair<QByteArray, QByteArray> > &query)
{
+ if (!d) d = new QUrlPrivate;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
@@ -4939,6 +4988,7 @@ void QUrl::setEncodedQueryItems(const QList<QPair<QByteArray, QByteArray> > &que
*/
void QUrl::addQueryItem(const QString &key, const QString &value)
{
+ if (!d) d = new QUrlPrivate;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
@@ -4973,6 +5023,7 @@ void QUrl::addQueryItem(const QString &key, const QString &value)
*/
void QUrl::addEncodedQueryItem(const QByteArray &key, const QByteArray &value)
{
+ if (!d) d = new QUrlPrivate;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
@@ -4993,6 +5044,7 @@ void QUrl::addEncodedQueryItem(const QByteArray &key, const QByteArray &value)
*/
QList<QPair<QString, QString> > QUrl::queryItems() const
{
+ if (!d) return QList<QPair<QString, QString> >();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
QList<QPair<QString, QString> > itemMap;
@@ -5025,6 +5077,7 @@ QList<QPair<QString, QString> > QUrl::queryItems() const
*/
QList<QPair<QByteArray, QByteArray> > QUrl::encodedQueryItems() const
{
+ if (!d) return QList<QPair<QByteArray, QByteArray> >();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
QList<QPair<QByteArray, QByteArray> > itemMap;
@@ -5053,6 +5106,7 @@ QList<QPair<QByteArray, QByteArray> > QUrl::encodedQueryItems() const
*/
bool QUrl::hasQueryItem(const QString &key) const
{
+ if (!d) return false;
return hasEncodedQueryItem(toPercentEncoding(key, queryExcludeChars));
}
@@ -5071,6 +5125,7 @@ bool QUrl::hasQueryItem(const QString &key) const
*/
bool QUrl::hasEncodedQueryItem(const QByteArray &key) const
{
+ if (!d) return false;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
int pos = 0;
@@ -5093,6 +5148,7 @@ bool QUrl::hasEncodedQueryItem(const QByteArray &key) const
*/
QString QUrl::queryItemValue(const QString &key) const
{
+ if (!d) return QString();
QByteArray tmp = encodedQueryItemValue(toPercentEncoding(key, queryExcludeChars));
return fromPercentEncodingMutable(&tmp);
}
@@ -5112,6 +5168,7 @@ QString QUrl::queryItemValue(const QString &key) const
*/
QByteArray QUrl::encodedQueryItemValue(const QByteArray &key) const
{
+ if (!d) return QByteArray();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
int pos = 0;
@@ -5135,6 +5192,7 @@ QByteArray QUrl::encodedQueryItemValue(const QByteArray &key) const
*/
QStringList QUrl::allQueryItemValues(const QString &key) const
{
+ if (!d) return QStringList();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
QByteArray encodedKey = toPercentEncoding(key, queryExcludeChars);
@@ -5172,6 +5230,7 @@ QStringList QUrl::allQueryItemValues(const QString &key) const
*/
QList<QByteArray> QUrl::allEncodedQueryItemValues(const QByteArray &key) const
{
+ if (!d) return QList<QByteArray>();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
QList<QByteArray> values;
@@ -5199,6 +5258,7 @@ QList<QByteArray> QUrl::allEncodedQueryItemValues(const QByteArray &key) const
*/
void QUrl::removeQueryItem(const QString &key)
{
+ if (!d) return;
removeEncodedQueryItem(toPercentEncoding(key, queryExcludeChars));
}
@@ -5217,6 +5277,7 @@ void QUrl::removeQueryItem(const QString &key)
*/
void QUrl::removeEncodedQueryItem(const QByteArray &key)
{
+ if (!d) return;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
@@ -5243,6 +5304,7 @@ void QUrl::removeEncodedQueryItem(const QByteArray &key)
*/
void QUrl::removeAllQueryItems(const QString &key)
{
+ if (!d) return;
removeAllEncodedQueryItems(toPercentEncoding(key, queryExcludeChars));
}
@@ -5261,6 +5323,7 @@ void QUrl::removeAllQueryItems(const QString &key)
*/
void QUrl::removeAllEncodedQueryItems(const QByteArray &key)
{
+ if (!d) return;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
@@ -5284,6 +5347,7 @@ void QUrl::removeAllEncodedQueryItems(const QByteArray &key)
*/
QByteArray QUrl::encodedQuery() const
{
+ if (!d) return QByteArray();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
return d->query;
@@ -5308,6 +5372,7 @@ QByteArray QUrl::encodedQuery() const
*/
void QUrl::setFragment(const QString &fragment)
{
+ if (!d) d = new QUrlPrivate;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized);
@@ -5324,6 +5389,7 @@ void QUrl::setFragment(const QString &fragment)
*/
QString QUrl::fragment() const
{
+ if (!d) return QString();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
if (d->fragment.isNull() && !d->encodedFragment.isNull()) {
@@ -5354,6 +5420,7 @@ QString QUrl::fragment() const
*/
void QUrl::setEncodedFragment(const QByteArray &fragment)
{
+ if (!d) d = new QUrlPrivate;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
detach();
QURL_UNSETFLAG(d->stateFlags, QUrlPrivate::Validated | QUrlPrivate::Normalized);
@@ -5375,6 +5442,7 @@ void QUrl::setEncodedFragment(const QByteArray &fragment)
*/
QByteArray QUrl::encodedFragment() const
{
+ if (!d) return QByteArray();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
d->ensureEncodedParts();
@@ -5390,6 +5458,7 @@ QByteArray QUrl::encodedFragment() const
*/
bool QUrl::hasFragment() const
{
+ if (!d) return false;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
return d->hasFragment;
@@ -5416,6 +5485,8 @@ bool QUrl::hasFragment() const
*/
QUrl QUrl::resolved(const QUrl &relative) const
{
+ if (!d) return relative;
+ if (!relative.d) return *this;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
if (!QURL_HASFLAG(relative.d->stateFlags, QUrlPrivate::Parsed))
@@ -5432,6 +5503,7 @@ QUrl QUrl::resolved(const QUrl &relative) const
if (!relative.authority().isEmpty()) {
t = relative;
} else {
+ t.d = new QUrlPrivate;
if (relative.d->encodedPath.isEmpty()) {
t.d->encodedPath = d->encodedPath;
t.setEncodedQuery(relative.d->hasQuery ? relative.d->query : d->query);
@@ -5462,6 +5534,7 @@ QUrl QUrl::resolved(const QUrl &relative) const
*/
bool QUrl::isRelative() const
{
+ if (!d) return true;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
return d->scheme.isEmpty();
@@ -5476,6 +5549,7 @@ bool QUrl::isRelative() const
*/
QString QUrl::toString(FormattingOptions options) const
{
+ if (!d) return QString();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
QString url;
@@ -5527,6 +5601,7 @@ QString QUrl::toString(FormattingOptions options) const
*/
QByteArray QUrl::toEncoded(FormattingOptions options) const
{
+ if (!d) return QByteArray();
return d->toEncoded(options);
}
@@ -5777,7 +5852,9 @@ void QUrl::setIdnWhitelist(const QStringList &list)
*/
bool QUrl::operator <(const QUrl &url) const
{
+ if (!d) return url.d ? QByteArray() < url.d->normalized() : false;
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
+ if (!url.d) return d->normalized() < QByteArray();
if (!QURL_HASFLAG(url.d->stateFlags, QUrlPrivate::Parsed)) url.d->parse();
return d->normalized() < url.d->normalized();
}
@@ -5788,6 +5865,8 @@ bool QUrl::operator <(const QUrl &url) const
*/
bool QUrl::operator ==(const QUrl &url) const
{
+ if (!d) return url.isEmpty();
+ if (!url.d) return isEmpty();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
if (!QURL_HASFLAG(url.d->stateFlags, QUrlPrivate::Parsed)) url.d->parse();
return d->normalized() == url.d->normalized();
@@ -5807,7 +5886,17 @@ bool QUrl::operator !=(const QUrl &url) const
*/
QUrl &QUrl::operator =(const QUrl &url)
{
- qAtomicAssign(d, url.d);
+ if (!d) {
+ if (url.d) {
+ url.d->ref.ref();
+ d = url.d;
+ }
+ } else {
+ if (url.d)
+ qAtomicAssign(d, url.d);
+ else
+ clear();
+ }
return *this;
}
@@ -5816,8 +5905,13 @@ QUrl &QUrl::operator =(const QUrl &url)
*/
QUrl &QUrl::operator =(const QString &url)
{
- QUrl tmp(url);
- qAtomicAssign(d, tmp.d);
+ if (url.isEmpty()) {
+ clear();
+ } else {
+ QUrl tmp(url);
+ if (!d) d = new QUrlPrivate;
+ qAtomicAssign(d, tmp.d);
+ }
return *this;
}
@@ -5826,14 +5920,19 @@ QUrl &QUrl::operator =(const QString &url)
Forces a detach.
*/
void QUrl::detach()
-{ qAtomicDetach(d); }
+{
+ if (!d)
+ d = new QUrlPrivate;
+ else
+ qAtomicDetach(d);
+}
/*!
\internal
*/
bool QUrl::isDetached() const
{
- return d->ref == 1;
+ return !d || d->ref == 1;
}
@@ -5875,6 +5974,7 @@ QUrl QUrl::fromLocalFile(const QString &localFile)
*/
QString QUrl::toLocalFile() const
{
+ if (!d) return QString();
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
QString tmp;
@@ -5903,9 +6003,15 @@ QString QUrl::toLocalFile() const
*/
bool QUrl::isParentOf(const QUrl &childUrl) const
{
+ QString childPath = childUrl.path();
+
+ if (!d)
+ return ((childUrl.scheme().isEmpty())
+ && (childUrl.authority().isEmpty())
+ && childPath.length() > 0 && childPath.at(0) == QLatin1Char('/'));
+
if (!QURL_HASFLAG(d->stateFlags, QUrlPrivate::Parsed)) d->parse();
- QString childPath = childUrl.path();
QString ourPath = path();
return ((childUrl.scheme().isEmpty() || d->scheme == childUrl.scheme())
@@ -6145,6 +6251,8 @@ QDebug operator<<(QDebug d, const QUrl &url)
*/
QString QUrl::errorString() const
{
+ if (!d)
+ return QLatin1String(QT_TRANSLATE_NOOP(QUrl, "Invalid URL \"\": ")); // XXX not a good message, but the one an empty URL produces
return d->createErrorString();
}
diff --git a/src/corelib/io/qurl.h b/src/corelib/io/qurl.h
index f76d345..1189667 100644
--- a/src/corelib/io/qurl.h
+++ b/src/corelib/io/qurl.h
@@ -75,6 +75,7 @@ public:
RemovePath = 0x20,
RemoveQuery = 0x40,
RemoveFragment = 0x80,
+ // 0x100: private: normalized
StripTrailingSlash = 0x10000
};
diff --git a/src/declarative/declarative.pro b/src/declarative/declarative.pro
index 9cb45f6..86a0370 100644
--- a/src/declarative/declarative.pro
+++ b/src/declarative/declarative.pro
@@ -3,7 +3,7 @@ QPRO_PWD = $$PWD
QT = core gui xml script network
contains(QT_CONFIG, svg): QT += svg
contains(QT_CONFIG, opengl): QT += opengl
-DEFINES += QT_BUILD_DECLARATIVE_LIB
+DEFINES += QT_BUILD_DECLARATIVE_LIB QT_NO_URL_CAST_FROM_STRING
win32-msvc*|win32-icc:QMAKE_LFLAGS += /BASE:0x66000000
solaris-cc*:QMAKE_CXXFLAGS_RELEASE -= -O2
diff --git a/src/declarative/qml/qmlcompositetypemanager.cpp b/src/declarative/qml/qmlcompositetypemanager.cpp
index 1613051..22f2df3 100644
--- a/src/declarative/qml/qmlcompositetypemanager.cpp
+++ b/src/declarative/qml/qmlcompositetypemanager.cpp
@@ -55,6 +55,12 @@
QT_BEGIN_NAMESPACE
+inline uint qHash(const QUrl &uri)
+{
+ return qHash(uri.toEncoded(QUrl::FormattingOption(0x100)));
+}
+
+
QmlCompositeTypeData::QmlCompositeTypeData()
: status(Invalid), errorType(NoError), component(0), compiledComponent(0)
{
@@ -165,14 +171,14 @@ QmlCompositeTypeManager::~QmlCompositeTypeManager()
QmlCompositeTypeData *QmlCompositeTypeManager::get(const QUrl &url)
{
- QmlCompositeTypeData *unit = components.value(url.toString());
+ QmlCompositeTypeData *unit = components.value(url);
if (!unit) {
unit = new QmlCompositeTypeData;
unit->status = QmlCompositeTypeData::Waiting;
unit->progress = 0.0;
unit->imports.setBaseUrl(url);
- components.insert(url.toString(), unit);
+ components.insert(url, unit);
loadSource(unit);
}
@@ -216,7 +222,7 @@ void QmlCompositeTypeManager::replyFinished()
{
QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
- QmlCompositeTypeData *unit = components.value(reply->url().toString());
+ QmlCompositeTypeData *unit = components.value(reply->url());
Q_ASSERT(unit);
if (reply->error() != QNetworkReply::NoError) {
@@ -246,7 +252,7 @@ void QmlCompositeTypeManager::resourceReplyFinished()
{
QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
- QmlCompositeTypeResource *resource = resources.value(reply->url().toString());
+ QmlCompositeTypeResource *resource = resources.value(reply->url());
Q_ASSERT(resource);
if (reply->error() != QNetworkReply::NoError) {
@@ -337,7 +343,7 @@ void QmlCompositeTypeManager::requestProgress(qint64 received, qint64 total)
return;
QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
- QmlCompositeTypeData *unit = components.value(reply->url().toString());
+ QmlCompositeTypeData *unit = components.value(reply->url());
Q_ASSERT(unit);
unit->progress = qreal(received)/total;
@@ -523,13 +529,13 @@ int QmlCompositeTypeManager::resolveTypes(QmlCompositeTypeData *unit)
continue;
}
- QmlCompositeTypeData *urlUnit = components.value(url.toString());
+ QmlCompositeTypeData *urlUnit = components.value(url);
if (!urlUnit) {
urlUnit = new QmlCompositeTypeData;
urlUnit->status = QmlCompositeTypeData::Waiting;
urlUnit->imports.setBaseUrl(url);
- components.insert(url.toString(), urlUnit);
+ components.insert(url, urlUnit);
loadSource(urlUnit);
}
@@ -591,13 +597,13 @@ void QmlCompositeTypeManager::compile(QmlCompositeTypeData *unit)
for (int ii = 0; ii < resourceList.count(); ++ii) {
QUrl url = unit->imports.baseUrl().resolved(resourceList.at(ii));
- QmlCompositeTypeResource *resource = resources.value(url.toString());
+ QmlCompositeTypeResource *resource = resources.value(url);
if (!resource) {
resource = new QmlCompositeTypeResource;
resource->status = QmlCompositeTypeResource::Waiting;
resource->url = url.toString();
- resources.insert(resource->url, resource);
+ resources.insert(url, resource);
loadResource(resource);
}
diff --git a/src/declarative/qml/qmlcompositetypemanager_p.h b/src/declarative/qml/qmlcompositetypemanager_p.h
index 0169bff..89e2353 100644
--- a/src/declarative/qml/qmlcompositetypemanager_p.h
+++ b/src/declarative/qml/qmlcompositetypemanager_p.h
@@ -105,9 +105,9 @@ private:
int resolveTypes(QmlCompositeTypeData *);
QmlEngine *engine;
- typedef QHash<QString, QmlCompositeTypeData *> Components;
+ typedef QHash<QUrl, QmlCompositeTypeData *> Components;
Components components;
- typedef QHash<QString, QmlCompositeTypeResource *> Resources;
+ typedef QHash<QUrl, QmlCompositeTypeResource *> Resources;
Resources resources;
};
diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp
index aca3f76..8d78cc7 100644
--- a/src/declarative/qml/qmlengine.cpp
+++ b/src/declarative/qml/qmlengine.cpp
@@ -667,7 +667,7 @@ QScriptValue QmlEnginePrivate::createComponent(QScriptContext *ctxt,
QString arg = ctxt->argument(0).toString();
if (arg.isEmpty())
return engine->nullValue();
- QUrl url = QUrl(context->resolvedUrl(arg));
+ QUrl url = QUrl(context->resolvedUrl(QUrl(arg)));
QmlComponent *c = new QmlComponent(activeEngine, url, activeEngine);
c->setCreationContext(context);
return activeEnginePriv->objectClass->newQObject(c, qMetaTypeId<QmlComponent*>());
@@ -1135,7 +1135,7 @@ struct QmlEnginePrivate::ImportedNamespace {
if (mapvmaj<vmaj || vmin >= mapversions.mid(dot+1).toInt()) {
QStringRef mapfile = space2<0 ? QStringRef() : line.midRef(space2+1,line.length()-space2-1);
if (url_return)
- *url_return = url.resolved(mapfile.toString());
+ *url_return = url.resolved(QUrl(mapfile.toString()));
return true;
}
}
diff --git a/src/xmlpatterns/type/qprimitives_p.h b/src/xmlpatterns/type/qprimitives_p.h
index 01c04a1..4be89d9 100644
--- a/src/xmlpatterns/type/qprimitives_p.h
+++ b/src/xmlpatterns/type/qprimitives_p.h
@@ -88,7 +88,7 @@ namespace QPatternist
*/
inline uint qHash(const QUrl &uri)
{
- return qHash(uri.toString());
+ return qHash(uri.toEncoded(QUrl::FormattingOption(0x100)));
}
/**