This is an automated email from the ASF dual-hosted git repository.
normanbreau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cordova-android.git
The following commit(s) were added to refs/heads/master by this push:
new cb481473 feat: add plugin hooks for WebViewClient.onRenderProcessGone
(#1574)
cb481473 is described below
commit cb481473982783927ca379d715a7b3b3c76f3336
Author: Philip Peitsch <[email protected]>
AuthorDate: Mon Apr 24 12:20:48 2023 +1000
feat: add plugin hooks for WebViewClient.onRenderProcessGone (#1574)
* feat: add plugin hooks for WebViewClient.onRenderProcessGone
* Update framework/src/org/apache/cordova/CordovaPlugin.java
Co-authored-by: Norman Breau <[email protected]>
---------
Co-authored-by: Norman Breau <[email protected]>
---
.../src/org/apache/cordova/CordovaPlugin.java | 17 ++++++++++++++
.../src/org/apache/cordova/PluginManager.java | 27 ++++++++++++++++++++++
.../apache/cordova/engine/SystemWebViewClient.java | 12 ++++++++++
3 files changed, 56 insertions(+)
diff --git a/framework/src/org/apache/cordova/CordovaPlugin.java
b/framework/src/org/apache/cordova/CordovaPlugin.java
index 38e2e4af..1140c4af 100644
--- a/framework/src/org/apache/cordova/CordovaPlugin.java
+++ b/framework/src/org/apache/cordova/CordovaPlugin.java
@@ -31,6 +31,8 @@ import android.content.res.Configuration;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
+import android.webkit.RenderProcessGoneDetail;
+import android.webkit.WebView;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -442,4 +444,19 @@ public class CordovaPlugin {
public CordovaPluginPathHandler getPathHandler() {
return null;
}
+
+ /**
+ * Called when the WebView's render process has exited. Can be used to
collect information regarding the crash for crashlytics or optionally attempt
to gracefully handle/recover the crashed webview by recreating it.
+ *
+ * See <a
href="https://developer.android.com/reference/android/webkit/WebViewClient#onRenderProcessGone(android.webkit.WebView,%20android.webkit.RenderProcessGoneDetail)">WebViewClient#onRenderProcessGone</a>
+ *
+ * Note: A plugin must not attempt to recover a webview that it does not
own/manage.
+ *
+ * @return true if the host application handled the situation that
process has exited,
+ * otherwise, application will crash if render process crashed,
or be killed
+ * if render process was killed by the system.
+ */
+ public boolean onRenderProcessGone(final WebView view,
RenderProcessGoneDetail detail) {
+ return false;
+ }
}
diff --git a/framework/src/org/apache/cordova/PluginManager.java
b/framework/src/org/apache/cordova/PluginManager.java
index 7d9df723..255eacd0 100755
--- a/framework/src/org/apache/cordova/PluginManager.java
+++ b/framework/src/org/apache/cordova/PluginManager.java
@@ -32,6 +32,8 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Debug;
import android.os.Build;
+import android.webkit.RenderProcessGoneDetail;
+import android.webkit.WebView;
/**
* PluginManager is exposed to JavaScript in the Cordova WebView.
@@ -617,4 +619,29 @@ public class PluginManager {
}
return handlers;
}
+
+ /**
+ * Called when the WebView's render process has exited.
+ *
+ * See
https://developer.android.com/reference/android/webkit/WebViewClient#onRenderProcessGone(android.webkit.WebView,%20android.webkit.RenderProcessGoneDetail)
+ *
+ * @return true if the host application handled the situation that
process has exited,
+ * otherwise, application will crash if render process crashed,
or be killed
+ * if render process was killed by the system.
+ */
+ public boolean onRenderProcessGone(final WebView view,
RenderProcessGoneDetail detail) {
+ boolean result = false;
+ synchronized (this.entryMap) {
+ for (PluginEntry entry : this.entryMap.values()) {
+ CordovaPlugin plugin = pluginMap.get(entry.service);
+ if (plugin != null) {
+ if (plugin.onRenderProcessGone(view, detail)) {
+ result = true;
+ }
+ }
+ }
+ }
+
+ return result;
+ }
}
diff --git a/framework/src/org/apache/cordova/engine/SystemWebViewClient.java
b/framework/src/org/apache/cordova/engine/SystemWebViewClient.java
index 05400417..9f057182 100755
--- a/framework/src/org/apache/cordova/engine/SystemWebViewClient.java
+++ b/framework/src/org/apache/cordova/engine/SystemWebViewClient.java
@@ -28,6 +28,7 @@ import android.net.http.SslError;
import android.webkit.ClientCertRequest;
import android.webkit.HttpAuthHandler;
import android.webkit.MimeTypeMap;
+import android.webkit.RenderProcessGoneDetail;
import android.webkit.SslErrorHandler;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
@@ -422,4 +423,15 @@ public class SystemWebViewClient extends WebViewClient {
public WebResourceResponse shouldInterceptRequest(WebView view,
WebResourceRequest request) {
return this.assetLoader.shouldInterceptRequest(request.getUrl());
}
+
+ @Override
+ public boolean onRenderProcessGone(final WebView view,
RenderProcessGoneDetail detail) {
+ // Check if there is some plugin which can handle this event
+ PluginManager pluginManager = this.parentEngine.pluginManager;
+ if (pluginManager != null && pluginManager.onRenderProcessGone(view,
detail)) {
+ return true;
+ }
+
+ return super.onRenderProcessGone(view, detail);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]