summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTarja Sundqvist <tarja.sundqvist@qt.io>2024-05-08 08:15:08 +0300
committerTarja Sundqvist <tarja.sundqvist@qt.io>2024-05-08 08:15:08 +0300
commitbbb1891595aba23ff3c6d137aa74442f9e54479b (patch)
treefca0f8d8732a0c5838c60e561353126532ef04d6 /src
parent3d9289d73c5c03ed5b2fe246589d0d81cfdaa22e (diff)
parent0c6d4d574721b70637617884f6afc261e852683b (diff)
Merge remote-tracking branch 'origin/tqtc/lts-5.15.14' into tqtc/lts-5.15-opensourcev5.15.14-lts-lgpl5.15
Diffstat (limited to 'src')
-rw-r--r--src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java18
-rw-r--r--src/plugins/android/qandroidwebview.cpp18
2 files changed, 31 insertions, 5 deletions
diff --git a/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java b/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java
index ebfe8da..366be27 100644
--- a/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java
+++ b/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java
@@ -90,6 +90,7 @@ public class QtAndroidWebViewController
private native void c_onReceivedTitle(long id, String title);
private native void c_onRunJavaScriptResult(long id, long callbackId, String result);
private native void c_onReceivedError(long id, int errorCode, String description, String url);
+ private native void c_processEventsFromQueue();
// We need to block the UI thread in some cases, if it takes to long we should timeout before
// ANR kicks in... Usually the hard limit is set to 10s and if exceed that then we're in trouble.
@@ -257,10 +258,19 @@ public class QtAndroidWebViewController
}
});
- try {
- sem.acquire();
- } catch (Exception e) {
- e.printStackTrace();
+ boolean semAcquired = false;
+ while (!semAcquired) {
+ try {
+ semAcquired = sem.tryAcquire(BLOCKING_TIMEOUT, TimeUnit.MILLISECONDS);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ if (!semAcquired) {
+ // If the waiting time elapsed before a permit was acquired probably we have a
+ // deadlock here. To unlock the thread that block us, we need to process events
+ // from the queue and try again.
+ c_processEventsFromQueue();
+ }
}
}
diff --git a/src/plugins/android/qandroidwebview.cpp b/src/plugins/android/qandroidwebview.cpp
index 91122bd..29e3cf2 100644
--- a/src/plugins/android/qandroidwebview.cpp
+++ b/src/plugins/android/qandroidwebview.cpp
@@ -48,6 +48,9 @@
#include <QtCore/qurl.h>
#include <QtCore/qdebug.h>
+#include <QAbstractEventDispatcher>
+#include <QThread>
+
QT_BEGIN_NAMESPACE
static const char qtAndroidWebViewControllerClass[] = "org/qtproject/qt5/android/view/QtAndroidWebViewController";
@@ -407,6 +410,18 @@ static void c_onReceivedError(JNIEnv *env,
Q_EMIT wc->loadingChanged(loadRequest);
}
+static void c_processEventsFromQueue(JNIEnv *env, jobject thiz)
+{
+ Q_UNUSED(env)
+ Q_UNUSED(thiz)
+ if (QThread::currentThread() == qGuiApp->thread()) {
+ auto eventDispatcher = QThread::currentThread()->eventDispatcher();
+ if (eventDispatcher)
+ eventDispatcher->processEvents(
+ QEventLoop::ExcludeUserInputEvents|QEventLoop::ExcludeSocketNotifiers);
+ }
+}
+
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/)
{
static bool initialized = false;
@@ -438,7 +453,8 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/)
{"c_onReceivedIcon", "(JLandroid/graphics/Bitmap;)V", reinterpret_cast<void *>(c_onReceivedIcon)},
{"c_onReceivedTitle", "(JLjava/lang/String;)V", reinterpret_cast<void *>(c_onReceivedTitle)},
{"c_onRunJavaScriptResult", "(JJLjava/lang/String;)V", reinterpret_cast<void *>(c_onRunJavaScriptResult)},
- {"c_onReceivedError", "(JILjava/lang/String;Ljava/lang/String;)V", reinterpret_cast<void *>(c_onReceivedError)}
+ {"c_onReceivedError", "(JILjava/lang/String;Ljava/lang/String;)V", reinterpret_cast<void *>(c_onReceivedError)},
+ {"c_processEventsFromQueue", "()V", reinterpret_cast<void *>(c_processEventsFromQueue)}
};
const int nMethods = sizeof(methods) / sizeof(methods[0]);