summaryrefslogtreecommitdiffstats
path: root/src/webenginewidgets
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@digia.com>2014-01-20 18:26:37 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-22 19:49:50 +0100
commit6fb392ee9e4c185861e9b0d7010b174364f86673 (patch)
treec2a3cfa98821106f2c45ce8358481873a9a28947 /src/webenginewidgets
parent8a8ae0abc76315d9c4b29379040f24643ad66ebd (diff)
Clear callbacks with an empty value on page destruction
The current implementation offers no way to cancel async requests. This means that normal applications could easily allow callbacks to dereference a destroyed object unless they use a smart pointer within the callback function object. This patch will empty the pending callback list by calling each of them with an empty value. This will at least allow applications to cover the cases where the page is expected to have a shorter or equal lifetime than objects referenced in the callback. Change-Id: Ia9fc556b03f5d83f904a0ff4b05dc9e440ea488c Reviewed-by: Pierre Rossi <pierre.rossi@gmail.com>
Diffstat (limited to 'src/webenginewidgets')
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index 1a3cf5dde..d05a43d0d 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -58,6 +58,15 @@ QWebEnginePagePrivate::QWebEnginePagePrivate()
QWebEnginePagePrivate::~QWebEnginePagePrivate()
{
+ // "Cancel" pending callbacks by calling them with an invalid value.
+ // This guarantees that each callback is called exactly once.
+ Q_FOREACH (QExplicitlySharedDataPointer<VariantCallback> callback, m_variantCallbacks)
+ (*callback)(QVariant());
+ m_variantCallbacks.clear();
+ Q_FOREACH (QExplicitlySharedDataPointer<StringCallback> callback, m_stringCallbacks)
+ (*callback)(QString());
+ m_stringCallbacks.clear();
+
delete history;
}
@@ -148,17 +157,20 @@ void QWebEnginePagePrivate::close()
void QWebEnginePagePrivate::didRunJavaScript(const QVariant& result, quint64 requestId)
{
- (*m_variantCallbacks.take(requestId))(result);
+ if (QExplicitlySharedDataPointer<VariantCallback> callback = m_variantCallbacks.take(requestId))
+ (*callback)(result);
}
void QWebEnginePagePrivate::didFetchDocumentMarkup(const QString& result, quint64 requestId)
{
- (*m_stringCallbacks.take(requestId))(result);
+ if (QExplicitlySharedDataPointer<StringCallback> callback = m_stringCallbacks.take(requestId))
+ (*callback)(result);
}
void QWebEnginePagePrivate::didFetchDocumentInnerText(const QString& result, quint64 requestId)
{
- (*m_stringCallbacks.take(requestId))(result);
+ if (QExplicitlySharedDataPointer<StringCallback> callback = m_stringCallbacks.take(requestId))
+ (*callback)(result);
}
void QWebEnginePagePrivate::updateAction(QWebEnginePage::WebAction action) const