diff options
author | Simon Hausmann <simon.hausmann@qt.io> | 2018-07-18 12:22:47 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2018-07-18 16:30:36 +0000 |
commit | 1c2242e610b44eb305f66803dff978186c063f91 (patch) | |
tree | 652559fe503ec9b195e260f524c5d34488f94dfc /src/qml/qml/qqmlxmlhttprequest.cpp | |
parent | 7661a4197ca7967db0913f888295bb332519fbcc (diff) |
Add support for onload/onloadend/onerror callbacks in XHR
Those functions are supposed to be called after readystatechanged, with
onloadend coming last.
Task-number: QTBUG-67337
Change-Id: I946cd3c7edbe762c1b66345ec8649562d2246d34
Reviewed-by: Michael Brasser <michael.brasser@live.com>
Diffstat (limited to 'src/qml/qml/qqmlxmlhttprequest.cpp')
-rw-r--r-- | src/qml/qml/qqmlxmlhttprequest.cpp | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/src/qml/qml/qqmlxmlhttprequest.cpp b/src/qml/qml/qqmlxmlhttprequest.cpp index 51e5be4b5b..c739a91fd5 100644 --- a/src/qml/qml/qqmlxmlhttprequest.cpp +++ b/src/qml/qml/qqmlxmlhttprequest.cpp @@ -1072,7 +1072,8 @@ private: QQmlContextDataRef m_qmlContext; bool m_wasConstructedWithQmlContext = true; - static void dispatchCallbackNow(Object *thisObj); + void dispatchCallbackNow(Object *thisObj); + static void dispatchCallbackNow(Object *thisObj, bool done, bool error); void dispatchCallbackSafely(); int m_status; @@ -1553,22 +1554,37 @@ const QByteArray &QQmlXMLHttpRequest::rawResponseBody() const void QQmlXMLHttpRequest::dispatchCallbackNow(Object *thisObj) { + dispatchCallbackNow(thisObj, m_state == Done, m_errorFlag); +} + +void QQmlXMLHttpRequest::dispatchCallbackNow(Object *thisObj, bool done, bool error) +{ Q_ASSERT(thisObj); - QV4::Scope scope(thisObj->engine()); - ScopedString s(scope, scope.engine->newString(QStringLiteral("onreadystatechange"))); - ScopedFunctionObject callback(scope, thisObj->get(s)); - if (!callback) { - // not an error, but no onreadystatechange function to call. - return; - } + const auto dispatch = [thisObj](const QString &eventName) { + QV4::Scope scope(thisObj->engine()); + ScopedString s(scope, scope.engine->newString(eventName)); + ScopedFunctionObject callback(scope, thisObj->get(s)); + // not an error, but no event handler to call. + if (!callback) + return; + + QV4::JSCallData jsCallData(scope); + callback->call(jsCallData); - QV4::JSCallData jsCallData(scope); - callback->call(jsCallData); + if (scope.engine->hasException) { + QQmlError error = scope.engine->catchExceptionAsQmlError(); + QQmlEnginePrivate::warning(QQmlEnginePrivate::get(scope.engine->qmlEngine()), error); + } + }; - if (scope.engine->hasException) { - QQmlError error = scope.engine->catchExceptionAsQmlError(); - QQmlEnginePrivate::warning(QQmlEnginePrivate::get(scope.engine->qmlEngine()), error); + dispatch(QStringLiteral("onreadystatechange")); + if (done) { + if (error) + dispatch(QStringLiteral("onerror")); + else + dispatch(QStringLiteral("onload")); + dispatch(QStringLiteral("onloadend")); } } |