{
if (cachedTranslationContextIndex == -1) {
// This code must match that in the qsTr() implementation
- QString path = output->url.toString();
+ const QString &path = output->name;
int lastSlash = path.lastIndexOf(QLatin1Char('/'));
QString context = (lastSlash > -1) ? path.mid(lastSlash + 1, path.length()-lastSlash-5) :
QString();
Q_D(QDeclarativeContext);
d->data->url = baseUrl;
+ d->data->urlString = baseUrl.toString();
}
/*!
// Context base url
QUrl url;
+ QString urlString;
// List of imports that apply to this context
QDeclarativeTypeNameCache *imports;
/*!
Sets the base URL to be used for all relative file imports added.
*/
-void QDeclarativeImports::setBaseUrl(const QUrl& url)
+void QDeclarativeImports::setBaseUrl(const QUrl& url, const QString &urlString)
{
d->baseUrl = url;
- d->base = url.toString();
+
+ if (urlString.isEmpty()) {
+ d->base = url.toString();
+ } else {
+ //Q_ASSERT(url.toString() == urlString);
+ d->base = urlString;
+ }
}
/*!
~QDeclarativeImports();
QDeclarativeImports &operator=(const QDeclarativeImports &);
- void setBaseUrl(const QUrl &url);
+ void setBaseUrl(const QUrl &url, const QString &urlString = QString());
QUrl baseUrl() const;
bool resolveType(const QString& type,
};
}
-bool QDeclarativeScript::Parser::parse(const QByteArray &qmldata, const QUrl &url)
+bool QDeclarativeScript::Parser::parse(const QByteArray &qmldata, const QUrl &url,
+ const QString &urlString)
{
clear();
- const QString fileName = url.toString();
- _scriptFile = fileName;
+ if (urlString.isEmpty()) {
+ _scriptFile = url.toString();
+ } else {
+ // Q_ASSERT(urlString == url.toString());
+ _scriptFile = urlString;
+ }
QTextStream stream(qmldata, QIODevice::ReadOnly);
#ifndef QT_NO_TEXTCODEC
#endif
QString *code = _pool.NewString(stream.readAll());
- data = new QDeclarativeScript::ParserJsASTData(fileName);
+ data = new QDeclarativeScript::ParserJsASTData(_scriptFile);
Lexer lexer(&data->engine);
lexer.setCode(*code, /*line = */ 1);
Parser();
~Parser();
- bool parse(const QByteArray &data, const QUrl &url = QUrl());
+ bool parse(const QByteArray &data, const QUrl &url = QUrl(),
+ const QString &urlString = QString());
QList<TypeReference*> referencedTypes() const;
}
/*!
+Returns the finalUrl() as a string.
+*/
+QString QDeclarativeDataBlob::finalUrlString() const
+{
+ Q_ASSERT(isCompleteOrError() || (m_manager && m_manager->m_thread->isThisThread()));
+ if (m_finalUrlString.isEmpty())
+ m_finalUrlString = m_finalUrl.toString();
+
+ return m_finalUrlString;
+}
+
+/*!
Return the errors on this blob.
May only be called from the load thread, or after the blob isCompleteOrError().
void QDeclarativeTypeData::dataReceived(const QByteArray &data)
{
- if (!scriptParser.parse(data, finalUrl())) {
+ if (!scriptParser.parse(data, finalUrl(), finalUrlString())) {
setError(scriptParser.errors());
return;
}
- m_imports.setBaseUrl(finalUrl());
+ m_imports.setBaseUrl(finalUrl(), finalUrlString());
foreach (const QDeclarativeScript::Import &import, scriptParser.imports()) {
if (import.type == QDeclarativeScript::Import::File && import.qualifier.isEmpty()) {
QDeclarativeProfilerService::startRange(QDeclarativeProfilerService::Compiling);
m_compiledData = new QDeclarativeCompiledData(typeLoader()->engine());
- m_compiledData->url = m_imports.baseUrl();
- m_compiledData->name = m_compiledData->url.toString();
+ m_compiledData->url = finalUrl();
+ m_compiledData->name = finalUrlString();
QDeclarativeProfilerService::rangeLocation(QDeclarativeProfilerService::Compiling, QUrl(m_compiledData->name),1,1);
QDeclarativeProfilerService::rangeData(QDeclarativeProfilerService::Compiling, m_compiledData->name);
QDeclarativeScript::Parser::JavaScriptMetaData metadata =
QDeclarativeScript::Parser::extractMetaData(m_source);
- m_imports.setBaseUrl(finalUrl());
+ m_imports.setBaseUrl(finalUrl(), finalUrlString());
m_pragmas = metadata.pragmas;
QDeclarativeEngine *engine = typeLoader()->engine();
m_scriptData = new QDeclarativeScriptData();
m_scriptData->url = finalUrl();
+ m_scriptData->urlString = finalUrlString();
m_scriptData->importCache = new QDeclarativeTypeNameCache();
for (int ii = 0; !isError() && ii < m_scripts.count(); ++ii) {
QUrl url() const;
QUrl finalUrl() const;
+ QString finalUrlString() const;
QList<QDeclarativeError> errors() const;
QUrl m_url;
QUrl m_finalUrl;
+ mutable QString m_finalUrlString;
// List of QDeclarativeDataBlob's that are waiting for me to complete.
QList<QDeclarativeDataBlob *> m_waitingOnMe;
~QDeclarativeScriptData();
QUrl url;
+ QString urlString;
QDeclarativeTypeNameCache *importCache;
QList<QDeclarativeScriptBlob *> scripts;
QDeclarativeScript::Object::ScriptBlock::Pragmas pragmas;
CTXT = new QDeclarativeContextData;
CTXT->isInternal = true;
CTXT->url = COMP->url;
+ CTXT->urlString = COMP->name;
CTXT->imports = COMP->importCache;
CTXT->imports->addref();
CTXT->setParent(parentCtxt);
// If compilation throws an error, a surrounding v8::TryCatch will record it.
v8::Local<v8::Script> program = v8engine->qmlModeCompile(m_programSource.constData(),
- m_programSource.length(), url.toString(),
- 1);
+ m_programSource.length(), urlString, 1);
if (program.IsEmpty())
return;
else
ctxt->isPragmaLibraryContext = parentCtxt->isPragmaLibraryContext;
ctxt->url = script->url;
+ ctxt->urlString = script->urlString;
// For backward compatibility, if there are no imports, we need to use the
// imports from the parent context. See QTBUG-17518.
// XXX We should evaluate all methods in a single big script block to
// improve the call time between dynamic methods defined on the same
// object
- v8methods[index] = QDeclarativeExpressionPrivate::evalFunction(ctxt, object, body, bodyLength,
- ctxt->url.toString(),
+ v8methods[index] = QDeclarativeExpressionPrivate::evalFunction(ctxt, object, body,
+ bodyLength,
+ ctxt->urlString,
data->lineNumber);
}
trace.addDetail("Line", binding->line);
trace.addDetail("Column", binding->column);
- QDeclarativeBindingProfiler prof(context->url.toString(), binding->line, binding->column);
+ QDeclarativeBindingProfiler prof(context->urlString, binding->line, binding->column);
if (binding->updating) {
QString name;
if (ddata) {
ctxtdata = ddata->outerContext;
if (ctxtdata && !ctxtdata->url.isEmpty())
- location = ddata->outerContext->url.toString();
+ location = ddata->outerContext->urlString;
}
QDeclarativeExpression *expression = ctxtdata ?