示例#1
0
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));
}