diff options
| author | Volker Hilsheimer <[email protected]> | 2023-10-27 15:26:22 +0200 |
|---|---|---|
| committer | Volker Hilsheimer <[email protected]> | 2023-11-13 18:26:22 +0100 |
| commit | e2b33c1d1ce24435aaaf853e6261064f4763bde5 (patch) | |
| tree | 378bb9f411c95ce40a57d347614da42a6be07038 | |
| parent | b4bc5c1c449ccfd78b0ef2bf2868da22ae63a040 (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.java | 20 | ||||
| -rw-r--r-- | src/plugins/android/qandroidwebview.cpp | 20 | ||||
| -rw-r--r-- | src/plugins/android/qandroidwebview_p.h | 2 |
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; |
