void QV8Include::finished() { m_redirectCount++; if (m_redirectCount < INCLUDE_MAXIMUM_REDIRECT_RECURSION) { QVariant redirect = m_reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if (redirect.isValid()) { m_url = m_url.resolved(redirect.toUrl()); delete m_reply; QNetworkRequest request; request.setUrl(m_url); m_reply = m_network->get(request); QObject::connect(m_reply, SIGNAL(finished()), this, SLOT(finished())); return; } } v8::HandleScope handle_scope; if (m_reply->error() == QNetworkReply::NoError) { QByteArray data = m_reply->readAll(); QString code = QString::fromUtf8(data); QDeclarativeScriptParser::extractPragmas(code); QDeclarativeContextData *importContext = new QDeclarativeContextData; importContext->isInternal = true; importContext->isJSContext = true; importContext->url = m_url; importContext->isPragmaLibraryContext = m_context->isPragmaLibraryContext; importContext->setParent(m_context, true); v8::Context::Scope ctxtscope(m_engine->context()); v8::TryCatch try_catch; v8::Local<v8::Script> script = m_engine->qmlModeCompile(code, m_url.toString()); if (!try_catch.HasCaught()) { m_engine->contextWrapper()->addSubContext(m_qmlglobal, script, importContext); script->Run(m_qmlglobal); } if (try_catch.HasCaught()) { m_resultObject->Set(v8::String::New("status"), v8::Integer::New(Exception)); m_resultObject->Set(v8::String::New("exception"), try_catch.Exception()); } else { m_resultObject->Set(v8::String::New("status"), v8::Integer::New(Ok)); } } else { m_resultObject->Set(v8::String::New("status"), v8::Integer::New(NetworkError)); } callback(m_engine, m_callbackFunction, m_resultObject); disconnect(); deleteLater(); }
// Callee owns the persistent handle v8::Persistent<v8::Function> QQmlJavaScriptExpression::evalFunction(QQmlContextData *ctxt, QObject *scope, const char *code, int codeLength, const QString &filename, quint16 line, v8::Persistent<v8::Object> *qmlscope) { QQmlEngine *engine = ctxt->engine; QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine); v8::HandleScope handle_scope; v8::Context::Scope ctxtscope(ep->v8engine()->context()); v8::TryCatch tc; v8::Local<v8::Object> scopeobject = ep->v8engine()->qmlScope(ctxt, scope); v8::Local<v8::Script> script = ep->v8engine()->qmlModeCompile(code, codeLength, filename, line); if (tc.HasCaught()) { QQmlError error; error.setDescription(QLatin1String("Exception occurred during function compilation")); error.setLine(line); error.setUrl(QUrl::fromLocalFile(filename)); v8::Local<v8::Message> message = tc.Message(); if (!message.IsEmpty()) QQmlExpressionPrivate::exceptionToError(message, error); ep->warning(error); return v8::Persistent<v8::Function>(); } v8::Local<v8::Value> result = script->Run(scopeobject); if (tc.HasCaught()) { QQmlError error; error.setDescription(QLatin1String("Exception occurred during function evaluation")); error.setLine(line); error.setUrl(QUrl::fromLocalFile(filename)); v8::Local<v8::Message> message = tc.Message(); if (!message.IsEmpty()) QQmlExpressionPrivate::exceptionToError(message, error); ep->warning(error); return v8::Persistent<v8::Function>(); } if (qmlscope) *qmlscope = qPersistentNew<v8::Object>(scopeobject); return qPersistentNew<v8::Function>(v8::Local<v8::Function>::Cast(result)); }