summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolker Hilsheimer <[email protected]>2023-10-27 15:26:22 +0200
committerVolker Hilsheimer <[email protected]>2023-11-13 18:26:22 +0100
commite2b33c1d1ce24435aaaf853e6261064f4763bde5 (patch)
tree378bb9f411c95ce40a57d347614da42a6be07038
parentb4bc5c1c449ccfd78b0ef2bf2868da22ae63a040 (diff)
Android: make functions static if they don't need the object
This prevents threading issues when calling object functions in a lambda run on the android main thread, when the QJniObject was instantiated on the Qt main thread. As a drive-by, store the id as a 64bit value on the C++ side. jlong is always a 64bit type, even on 32bit Android systems, so we can't use quintptr without truncating data. Change-Id: I96d983eb9b2e99338768d30f7000ec9e75d3fea6 Reviewed-by: Christian Strømme <[email protected]> Reviewed-by: Qt CI Bot <[email protected]> Reviewed-by: Assam Boudjelthia <[email protected]>
-rw-r--r--src/jar/src/org/qtproject/qt/android/view/QtAndroidWebViewController.java20
-rw-r--r--src/plugins/android/qandroidwebview.cpp20
-rw-r--r--src/plugins/android/qandroidwebview_p.h2
3 files changed, 22 insertions, 20 deletions
diff --git a/src/jar/src/org/qtproject/qt/android/view/QtAndroidWebViewController.java b/src/jar/src/org/qtproject/qt/android/view/QtAndroidWebViewController.java
index 369e2a1..567565c 100644
--- a/src/jar/src/org/qtproject/qt/android/view/QtAndroidWebViewController.java
+++ b/src/jar/src/org/qtproject/qt/android/view/QtAndroidWebViewController.java
@@ -59,8 +59,8 @@ 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_onCookieAdded(long id, boolean result, String domain, String name);
- private native void c_onCookieRemoved(long id, boolean result, String domain, String name);
+ private static native void c_onCookieAdded(long id, boolean result, String domain, String name);
+ private static native void c_onCookieRemoved(long id, boolean result, String domain, String name);
// 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.
@@ -627,7 +627,7 @@ public class QtAndroidWebViewController
});
}
- private void setCookieImp(final String url, final String cookieString, ValueCallback<Boolean> callback)
+ private static void setCookieImp(final String url, final String cookieString, ValueCallback<Boolean> callback)
{
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
@@ -639,13 +639,13 @@ public class QtAndroidWebViewController
}
}
- public void setCookie(final String url, final String cookieString)
+ public static void setCookie(final long id, final String url, final String cookieString)
{
setCookieImp(url, cookieString, new ValueCallback<Boolean>() {
@Override
public void onReceiveValue(Boolean value) {
try {
- c_onCookieAdded(m_id, value, url, cookieString.split("=")[0]);
+ c_onCookieAdded(id, value, url, cookieString.split("=")[0]);
} catch (Exception e) {
e.printStackTrace();
}
@@ -653,7 +653,7 @@ public class QtAndroidWebViewController
});
}
- private boolean hasValidCookie(final String url, final String cookieString)
+ private static boolean hasValidCookie(final String url, final String cookieString)
{
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeExpiredCookie();
@@ -677,12 +677,12 @@ public class QtAndroidWebViewController
return cookieFound;
}
- private String getExpireString()
+ private static String getExpireString()
{
return "expires=\"Thu, 1 Jan 1970 00:00:00 GMT\"";
}
- public void removeCookie(final String url, final String cookieString)
+ public static void removeCookie(final long id, final String url, final String cookieString)
{
// We need to work with what we have
// 1. Check if there's cookies for the url
@@ -696,7 +696,7 @@ public class QtAndroidWebViewController
try {
// 3. Verify that the cookie was indeed removed
final boolean removed = (hadCookie && !hasValidCookie(url, cookieString));
- c_onCookieRemoved(m_id, removed, url, cookieString.split("=")[0]);
+ c_onCookieRemoved(id, removed, url, cookieString.split("=")[0]);
} catch (Exception e) {
e.printStackTrace();
}
@@ -705,7 +705,7 @@ public class QtAndroidWebViewController
}
}
- public void removeCookies() {
+ public static void removeCookies() {
try {
CookieManager.getInstance().removeAllCookies(null);
} catch (Exception e) {
diff --git a/src/plugins/android/qandroidwebview.cpp b/src/plugins/android/qandroidwebview.cpp
index dcc64e1..f13e7e7 100644
--- a/src/plugins/android/qandroidwebview.cpp
+++ b/src/plugins/android/qandroidwebview.cpp
@@ -86,12 +86,12 @@ static const char qtAndroidWebViewControllerClass[] = "org/qtproject/qt/android/
// return true;
//}
-typedef QMap<quintptr, QAndroidWebViewPrivate *> WebViews;
+typedef QMap<quint64, QAndroidWebViewPrivate *> WebViews;
Q_GLOBAL_STATIC(WebViews, g_webViews)
QAndroidWebViewPrivate::QAndroidWebViewPrivate(QObject *p)
: QAbstractWebView(p)
- , m_id(reinterpret_cast<quintptr>(this))
+ , m_id(reinterpret_cast<quint64>(this))
, m_callbackId(0)
, m_window(0)
{
@@ -247,8 +247,9 @@ QAbstractWebViewSettings *QAndroidWebViewPrivate::getSettings() const
void QAndroidWebViewPrivate::setCookie(const QString &domain, const QString &name, const QString &value)
{
QNativeInterface::QAndroidApplication::runOnAndroidMainThread([=]() {
- m_viewController.callMethod<void>("setCookie",
- "(Ljava/lang/String;Ljava/lang/String;)V",
+ QJniObject::callStaticMethod<void>(qtAndroidWebViewControllerClass, "setCookie",
+ "(JLjava/lang/String;Ljava/lang/String;)V",
+ reinterpret_cast<quint64>(this),
static_cast<jstring>(QJniObject::fromString(domain).object()),
static_cast<jstring>(QJniObject::fromString(name + "=" + value).object()));
});
@@ -257,8 +258,9 @@ void QAndroidWebViewPrivate::setCookie(const QString &domain, const QString &nam
void QAndroidWebViewPrivate::deleteCookie(const QString &domain, const QString &name)
{
QNativeInterface::QAndroidApplication::runOnAndroidMainThread([=]() {
- m_viewController.callMethod<void>("removeCookie",
- "(Ljava/lang/String;Ljava/lang/String;)V",
+ QJniObject::callStaticMethod<void>(qtAndroidWebViewControllerClass, "removeCookie",
+ "(JLjava/lang/String;Ljava/lang/String;)V",
+ reinterpret_cast<quint64>(this),
static_cast<jstring>(QJniObject::fromString(domain).object()),
static_cast<jstring>(QJniObject::fromString(name.split(u'=').at(0) + u'=').object()));
});
@@ -267,7 +269,7 @@ void QAndroidWebViewPrivate::deleteCookie(const QString &domain, const QString &
void QAndroidWebViewPrivate::deleteAllCookies()
{
QNativeInterface::QAndroidApplication::runOnAndroidMainThread([=]() {
- m_viewController.callMethod<void>("removeCookies");
+ QJniObject::callStaticMethod<void>(qtAndroidWebViewControllerClass, "removeCookies");
});
}
@@ -470,7 +472,7 @@ static void c_onReceivedError(JNIEnv *env,
}
static void c_onCookieAdded(JNIEnv *env,
- jobject thiz,
+ jclass thiz,
jlong id,
jboolean result,
jstring domain,
@@ -489,7 +491,7 @@ static void c_onCookieAdded(JNIEnv *env,
}
static void c_onCookieRemoved(JNIEnv *env,
- jobject thiz,
+ jclass thiz,
jlong id,
jboolean result,
jstring domain,
diff --git a/src/plugins/android/qandroidwebview_p.h b/src/plugins/android/qandroidwebview_p.h
index aa75900..c07832a 100644
--- a/src/plugins/android/qandroidwebview_p.h
+++ b/src/plugins/android/qandroidwebview_p.h
@@ -87,7 +87,7 @@ private Q_SLOTS:
void onApplicationStateChanged(Qt::ApplicationState state);
private:
- quintptr m_id;
+ quint64 m_id;
quint64 m_callbackId;
QWindow *m_window;
QJniObject m_viewController;