QScriptValue QDeclarativeInclude::worker_include(QScriptContext *ctxt, QScriptEngine *engine) { if (ctxt->argumentCount() == 0) return engine->undefinedValue(); QString urlString = ctxt->argument(0).toString(); QUrl url(ctxt->argument(0).toString()); if (url.isRelative()) { QString contextUrl = QScriptDeclarativeClass::scopeChainValue(ctxt, -3).data().toString(); Q_ASSERT(!contextUrl.isEmpty()); url = QUrl(contextUrl).resolved(url); urlString = url.toString(); } QString localFile = QDeclarativeEnginePrivate::urlToLocalFileOrQrc(url); QScriptValue func = ctxt->argument(1); if (!func.isFunction()) func = QScriptValue(); QScriptValue result; if (!localFile.isEmpty()) { QFile f(localFile); if (f.open(QIODevice::ReadOnly)) { QByteArray data = f.readAll(); QString code = QString::fromUtf8(data); QScriptContext *scriptContext = QScriptDeclarativeClass::pushCleanContext(engine); QScriptValue urlContext = engine->newObject(); urlContext.setData(QScriptValue(engine, urlString)); scriptContext->pushScope(urlContext); QScriptValue scope = QScriptDeclarativeClass::scopeChainValue(ctxt, -4); scriptContext->pushScope(scope); scriptContext->setActivationObject(scope); QDeclarativeScriptParser::extractPragmas(code); engine->evaluate(code, urlString, 1); engine->popContext(); if (engine->hasUncaughtException()) { result = resultValue(engine, Exception); result.setProperty(QLatin1String("exception"), engine->uncaughtException()); engine->clearExceptions(); } else { result = resultValue(engine, Ok); } callback(engine, func, result); } else { result = resultValue(engine, NetworkError); callback(engine, func, result); } } return result; }
QT_BEGIN_NAMESPACE QV8Include::QV8Include(const QUrl &url, QV8Engine *engine, QDeclarativeContextData *context, v8::Handle<v8::Object> qmlglobal, v8::Handle<v8::Function> callback) : m_engine(engine), m_network(0), m_reply(0), m_url(url), m_redirectCount(0), m_context(context) { m_qmlglobal = qPersistentNew<v8::Object>(qmlglobal); if (!callback.IsEmpty()) m_callbackFunction = qPersistentNew<v8::Function>(callback); m_resultObject = qPersistentNew<v8::Object>(resultValue()); m_network = engine->networkAccessManager(); QNetworkRequest request; request.setUrl(url); m_reply = m_network->get(request); QObject::connect(m_reply, SIGNAL(finished()), this, SLOT(finished())); }
QT_BEGIN_NAMESPACE QDeclarativeInclude::QDeclarativeInclude(const QUrl &url, QDeclarativeEngine *engine, QScriptContext *ctxt) : QObject(engine), m_engine(engine), m_network(0), m_reply(0), m_url(url), m_redirectCount(0) { QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine); m_context = ep->contextClass->contextFromValue(QScriptDeclarativeClass::scopeChainValue(ctxt, -3)); m_scope[0] = QScriptDeclarativeClass::scopeChainValue(ctxt, -4); m_scope[1] = QScriptDeclarativeClass::scopeChainValue(ctxt, -5); m_scriptEngine = QDeclarativeEnginePrivate::getScriptEngine(engine); m_network = QDeclarativeScriptEngine::get(m_scriptEngine)->networkAccessManager(); m_result = resultValue(m_scriptEngine); QNetworkRequest request; request.setUrl(url); m_reply = m_network->get(request); QObject::connect(m_reply, SIGNAL(finished()), this, SLOT(finished())); }
void ResultModelItem::updateResult() { m_result = resultValue().toString(); }
/* Documented in qdeclarativeengine.cpp */ QScriptValue QDeclarativeInclude::include(QScriptContext *ctxt, QScriptEngine *engine) { if (ctxt->argumentCount() == 0) return engine->undefinedValue(); QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine); QUrl contextUrl = ep->contextClass->urlFromValue(QScriptDeclarativeClass::scopeChainValue(ctxt, -3)); if (contextUrl.isEmpty()) return ctxt->throwError(QLatin1String("Qt.include(): Can only be called from JavaScript files")); QString urlString = ctxt->argument(0).toString(); QUrl url(urlString); if (url.isRelative()) { url = QUrl(contextUrl).resolved(url); urlString = url.toString(); } QString localFile = QDeclarativeEnginePrivate::urlToLocalFileOrQrc(url); QScriptValue func = ctxt->argument(1); if (!func.isFunction()) func = QScriptValue(); QScriptValue result; if (localFile.isEmpty()) { QDeclarativeInclude *i = new QDeclarativeInclude(url, QDeclarativeEnginePrivate::getEngine(engine), ctxt); if (func.isValid()) i->setCallback(func); result = i->result(); } else { QFile f(localFile); if (f.open(QIODevice::ReadOnly)) { QByteArray data = f.readAll(); QString code = QString::fromUtf8(data); QDeclarativeContextData *context = ep->contextClass->contextFromValue(QScriptDeclarativeClass::scopeChainValue(ctxt, -3)); QScriptContext *scriptContext = QScriptDeclarativeClass::pushCleanContext(engine); scriptContext->pushScope(ep->contextClass->newUrlContext(context, 0, urlString)); scriptContext->pushScope(ep->globalClass->staticGlobalObject()); QScriptValue scope = QScriptDeclarativeClass::scopeChainValue(ctxt, -5); scriptContext->pushScope(scope); scriptContext->setActivationObject(scope); QDeclarativeScriptParser::extractPragmas(code); engine->evaluate(code, urlString, 1); engine->popContext(); if (engine->hasUncaughtException()) { result = resultValue(engine, Exception); result.setProperty(QLatin1String("exception"), engine->uncaughtException()); engine->clearExceptions(); } else { result = resultValue(engine, Ok); } callback(engine, func, result); } else { result = resultValue(engine, NetworkError); callback(engine, func, result); } } return result; }
/* Documented in qv8engine.cpp */ v8::Handle<v8::Value> QV8Include::include(const v8::Arguments &args) { if (args.Length() == 0) return v8::Undefined(); QV8Engine *engine = V8ENGINE(); QDeclarativeContextData *context = engine->callingContext(); if (!context || !context->isJSContext) V8THROW_ERROR("Qt.include(): Can only be called from JavaScript files"); QUrl url(context->resolvedUrl(QUrl(engine->toString(args[0]->ToString())))); v8::Local<v8::Function> callbackFunction; if (args.Length() >= 2 && args[1]->IsFunction()) callbackFunction = v8::Local<v8::Function>::Cast(args[1]); QString localFile = QDeclarativeEnginePrivate::urlToLocalFileOrQrc(url); v8::Local<v8::Object> result; if (localFile.isEmpty()) { QV8Include *i = new QV8Include(url, engine, context, v8::Context::GetCallingQmlGlobal(), callbackFunction); result = v8::Local<v8::Object>::New(i->result()); } else { QFile f(localFile); if (f.open(QIODevice::ReadOnly)) { QByteArray data = f.readAll(); QString code = QString::fromUtf8(data); QDeclarativeScriptParser::extractPragmas(code); QDeclarativeContextData *importContext = new QDeclarativeContextData; importContext->isInternal = true; importContext->isJSContext = true; importContext->url = url; importContext->setParent(context, true); v8::TryCatch try_catch; v8::Local<v8::Script> script = engine->qmlModeCompile(code, url.toString()); if (!try_catch.HasCaught()) { v8::Local<v8::Object> qmlglobal = v8::Context::GetCallingQmlGlobal(); engine->contextWrapper()->addSubContext(qmlglobal, script, importContext); script->Run(qmlglobal); } if (try_catch.HasCaught()) { result = resultValue(Exception); result->Set(v8::String::New("exception"), try_catch.Exception()); } else { result = resultValue(Ok); } } else { result = resultValue(NetworkError); } callback(engine, callbackFunction, result); } if (result.IsEmpty()) return v8::Undefined(); else return result; }