From 160d542d643ecdd3fe546f2df251c762d724562f Mon Sep 17 00:00:00 2001 From: WcaleNieWolny Date: Sat, 2 Nov 2024 14:27:59 +0100 Subject: [PATCH 01/11] feat: proxy android --- README.md | 1 + .../InAppBrowserPlugin.java | 38 ++- .../forgr/capacitor_inappbrowser/Options.java | 10 + .../capacitor_inappbrowser/WebViewDialog.java | 237 +++++++++++++++++- src/definitions.ts | 6 + 5 files changed, 286 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index e4c08709..07fbecc2 100644 --- a/README.md +++ b/README.md @@ -506,6 +506,7 @@ Reload the current web page. | **`showArrow`** | boolean | showArrow: if true an arrow would be shown instead of cross for closing the window | false | 1.2.5 | | **`ignoreUntrustedSSLError`** | boolean | ignoreUntrustedSSLError: if true, the webview will ignore untrusted SSL errors allowing the user to view the website. | false | 6.1.0 | | **`preShowScript`** | String | preShowScript: if isPresentAfterPageLoad is true and this variable is set the plugin will inject a script before showing the browser. This script will be run in an async context. The plugin will wait for the script to finish (max 10 seconds) | | 6.6.0 | +| **`proxyRequests`** | String | proxyRequests is a regex expression. Please see [this pr](TODO) for more info. (Android only) | | 6.9.0 | | **`buttonNearDone`** | { ios: { iconType: 'sf-symbol' \| 'asset'; icon: String; }; android: { iconType: 'asset'; icon: String; width?: number; height?: number; }; } | buttonNearDone allows for a creation of a custom button. Please see [buttonNearDone.md](/buttonNearDone.md) for more info. | | 6.7.0 | diff --git a/android/src/main/java/ee/forgr/capacitor_inappbrowser/InAppBrowserPlugin.java b/android/src/main/java/ee/forgr/capacitor_inappbrowser/InAppBrowserPlugin.java index 7a0b6ab4..bc7ee453 100644 --- a/android/src/main/java/ee/forgr/capacitor_inappbrowser/InAppBrowserPlugin.java +++ b/android/src/main/java/ee/forgr/capacitor_inappbrowser/InAppBrowserPlugin.java @@ -28,6 +28,9 @@ import com.getcapacitor.annotation.PermissionCallback; import java.util.ArrayList; import java.util.Iterator; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; + import org.json.JSONException; import org.json.JSONObject; @@ -426,6 +429,15 @@ public void openWebView(PluginCall call) { Boolean.TRUE.equals(call.getBoolean("ignoreUntrustedSSLError", false)) ); + String proxyRequestsStr = call.getString("proxyRequests"); + if (proxyRequestsStr != null) { + try { + options.setProxyRequestsPattern(Pattern.compile(proxyRequestsStr)); + } catch (PatternSyntaxException e) { + Log.e("WebViewDialog", String.format("Pattern '%s' is not a valid pattern", proxyRequestsStr)); + } + } + try { Options.ButtonNearDone buttonNearDone = Options.ButtonNearDone.generateFromPluginCall( @@ -552,10 +564,11 @@ public void run() { getContext(), android.R.style.Theme_NoTitleBar, options, - InAppBrowserPlugin.this + InAppBrowserPlugin.this, + getBridge().getWebView() ); - webViewDialog.presentWebView(); webViewDialog.activity = InAppBrowserPlugin.this.getActivity(); + webViewDialog.presentWebView(); } } ); @@ -573,6 +586,7 @@ public void postMessage(PluginCall call) { call.reject("No event data provided"); return; } + Log.d("InAppBrowserPlugin", "Event data: " + eventData.toString()); this.getActivity() .runOnUiThread( @@ -624,6 +638,26 @@ public void run() { call.resolve(); } + @PluginMethod + public void lsuakdchgbbaHandleProxiedRequest(PluginCall call) { + if (webViewDialog != null) { + Boolean ok = call.getBoolean("ok", false); + String id = call.getString("id"); + if (id == null) { + Log.e("InAppBrowserProxy", "CRITICAL ERROR, proxy id = null"); + return; + } + if (Boolean.FALSE.equals(ok)) { + String result = call.getString("result", ""); + webViewDialog.handleProxyResultError(result, id); + } else { + JSONObject object = call.getObject("result"); + webViewDialog.handleProxyResultOk(object, id); + } + } + call.resolve(); + } + @PluginMethod public void close(PluginCall call) { this.getActivity() diff --git a/android/src/main/java/ee/forgr/capacitor_inappbrowser/Options.java b/android/src/main/java/ee/forgr/capacitor_inappbrowser/Options.java index c7a21e85..179d3a54 100644 --- a/android/src/main/java/ee/forgr/capacitor_inappbrowser/Options.java +++ b/android/src/main/java/ee/forgr/capacitor_inappbrowser/Options.java @@ -7,6 +7,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.Objects; +import java.util.regex.Pattern; public class Options { @@ -129,6 +130,15 @@ public int getWidth() { private boolean ShowArrow; private boolean ignoreUntrustedSSLError; private String preShowScript; + private Pattern proxyRequestsPattern = null; + + public Pattern getProxyRequestsPattern() { + return proxyRequestsPattern; + } + + public void setProxyRequestsPattern(Pattern proxyRequestsPattern) { + this.proxyRequestsPattern = proxyRequestsPattern; + } public PluginCall getPluginCall() { return pluginCall; diff --git a/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java b/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java index 564d0995..7bb7486d 100644 --- a/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java +++ b/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java @@ -15,11 +15,11 @@ import android.graphics.drawable.PictureDrawable; import android.net.Uri; import android.net.http.SslError; +import android.os.Build; import android.text.TextUtils; +import android.util.Base64; import android.util.Log; -import android.view.KeyEvent; import android.view.View; -import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.view.WindowManager; import android.webkit.HttpAuthHandler; @@ -30,39 +30,70 @@ import android.webkit.WebChromeClient; import android.webkit.WebResourceError; import android.webkit.WebResourceRequest; +import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ImageButton; import android.widget.TextView; import android.widget.Toast; import android.widget.Toolbar; -import androidx.annotation.Nullable; + +import androidx.annotation.RequiresApi; + import com.caverock.androidsvg.SVG; import com.caverock.androidsvg.SVGParseException; import com.getcapacitor.JSObject; + +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.net.CookiePolicy; import java.net.URI; import java.net.URISyntaxException; +import java.net.URL; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.json.JSONException; import org.json.JSONObject; public class WebViewDialog extends Dialog { + private class ProxiedRequest { + private WebResourceResponse response; + private Semaphore semaphore; + + public WebResourceResponse getResponse() { + return response; + } + + public ProxiedRequest() { + this.semaphore = new Semaphore(0); + this.response = null; + } + } + private WebView _webView; private Toolbar _toolbar; private Options _options; private Context _context; public Activity activity; private boolean isInitialized = false; + private WebView capacitorWebView; + private HashMap proxiedRequestsHashmap; Semaphore preShowSemaphore = null; String preshowError = null; @@ -85,13 +116,16 @@ public WebViewDialog( Context context, int theme, Options options, - PermissionHandler permissionHandler + PermissionHandler permissionHandler, + WebView capacitorWebView ) { super(context, theme); this._options = options; this._context = context; this.permissionHandler = permissionHandler; this.isInitialized = false; + this.capacitorWebView = capacitorWebView; + this.proxiedRequestsHashmap = new HashMap<>(); } public class JavaScriptInterface { @@ -570,6 +604,74 @@ public void onClick(View view) { } } + public void handleProxyResultError(String result, String id) { + Log.i("InAppBrowserProxy", String.format("handleProxyResultError: %s, ok: %s id: %s", result, false, id)); + ProxiedRequest proxiedRequest = proxiedRequestsHashmap.get(id); + if (proxiedRequest == null) { + Log.e("InAppBrowserProxy", "proxiedRequest is null"); + return; + } + proxiedRequestsHashmap.remove(id); + } + + public void handleProxyResultOk(JSONObject result, String id) { + Log.i("InAppBrowserProxy", String.format("handleProxyResultOk: %s, ok: %s, id: %s", result, true, id)); + ProxiedRequest proxiedRequest = proxiedRequestsHashmap.get(id); + if (proxiedRequest == null) { + Log.e("InAppBrowserProxy", "proxiedRequest is null"); + return; + } + proxiedRequestsHashmap.remove(id); + + if (result == null) { + proxiedRequest.semaphore.release(); + return; + } + + Map responseHeaders = new HashMap<>(); + String body; + int code; + + try { + body = result.getString("body"); + code = result.getInt("code"); + JSONObject headers = result.getJSONObject("headers"); + for (Iterator it = headers.keys(); it.hasNext(); ) { + String headerName = it.next(); + String header = headers.getString(headerName); + responseHeaders.put(headerName, header); + } + + } catch (JSONException e) { + Log.e("InAppBrowserProxy", "Cannot parse OK result", e); + return; + } + + String contentType = responseHeaders.get("Content-Type"); + if (contentType == null) { + contentType = responseHeaders.get("content-type"); + } + if (contentType == null) { + Log.e("InAppBrowserProxy", "'Content-Type' header is required"); + return; + } + + if (!((100 <= code && code <= 299) || (400 <= code && code <= 599) )) { + Log.e("InAppBrowserProxy", String.format("Status code %s outside of the allowed range", code)); + return; + } + + WebResourceResponse webResourceResponse = new WebResourceResponse( + contentType, + "utf-8", + new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8)) + ); + + webResourceResponse.setStatusCodeAndReasonPhrase(code, getReasonPhrase(code)); + proxiedRequest.response = webResourceResponse; + proxiedRequest.semaphore.release(); + } + private void setWebViewClient() { _webView.setWebViewClient( new WebViewClient() { @@ -578,6 +680,10 @@ public boolean shouldOverrideUrlLoading( WebView view, WebResourceRequest request ) { + +// HashMap map = new HashMap<>(); +// map.put("x-requested-with", null); +// view.loadUrl(request.getUrl().toString(), map); Context context = view.getContext(); String url = request.getUrl().toString(); @@ -602,6 +708,78 @@ public boolean shouldOverrideUrlLoading( return false; } + private String randomRequestId() { + return UUID.randomUUID().toString(); + } + + private String toBase64(String raw) { + String s = Base64.encodeToString(raw.getBytes(), Base64.NO_WRAP); + if (s.endsWith("=")) { + s = s.substring(0, s.length() - 2); + } + return s; + } +// +// void handleRedirect(String currentUrl, Response response) { +// String loc = response.header("Location"); +// _webView.evaluateJavascript(""); +// } +// + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + @Override + public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { + Pattern pattern = _options.getProxyRequestsPattern(); + if (pattern == null) { + return null; + } + Matcher matcher = pattern.matcher(request.getUrl().toString()); + if (!matcher.find()) { + return null; + } + + // Requests matches the regex + if (Objects.equals(request.getMethod(), "POST")) { + // Log.e("HTTP", String.format("returned null (ok) %s", request.getUrl().toString())); + return null; + } + + Log.i("InAppBrowserProxy", String.format("Proxying request: %s", request.getUrl().toString())); + + // We need to call a JS function + String requestId = randomRequestId(); + ProxiedRequest proxiedRequest = new ProxiedRequest(); + proxiedRequestsHashmap.put(requestId, proxiedRequest); + + // lsuakdchgbbaHandleProxiedRequest + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + StringBuilder headers = new StringBuilder(); + Map requestHeaders = request.getRequestHeaders(); + for (Map.Entry header : requestHeaders.entrySet()) { + headers.append(String.format("h[atob('%s')]=atob('%s');", toBase64(header.getKey()), toBase64(header.getValue()))); + } + String s = String.format("try {function getHeaders() {const h = {}; %s return h}; window.InAppBrowserProxyRequest(new Request(atob('%s'), {headers: getHeaders(), method: '%s'})).then(async (res) => Capacitor.Plugins.InAppBrowser.lsuakdchgbbaHandleProxiedRequest({ok: true, result: (!!res ? {headers: Object.fromEntries(res.headers.entries()), code: res.status, body: (await res.text())} : null), id: '%s'})).catch((e) => Capacitor.Plugins.InAppBrowser.lsuakdchgbbaHandleProxiedRequest({ok: false, result: e.toString(), id: '%s'}))} catch (e) {Capacitor.Plugins.InAppBrowser.lsuakdchgbbaHandleProxiedRequest({ok: false, result: e.toString(), id: '%s'})}", headers, toBase64(request.getUrl().toString()), request.getMethod(), requestId, requestId, requestId); + // Log.i("HTTP", s); + capacitorWebView.evaluateJavascript(s, null); + } + }); + + // 10 seconds wait max + try { + if (proxiedRequest.semaphore.tryAcquire(1, 10, TimeUnit.SECONDS)) { + return proxiedRequest.response; + } else { + Log.e("InAppBrowserProxy", "Semaphore timed out"); + proxiedRequestsHashmap.remove(requestId); // prevent mem leak + } + } catch (InterruptedException e) { + Log.e("InAppBrowserProxy", "Semaphore wait error", e); + } + return null; + } + + @Override public void onReceivedHttpAuthRequest( WebView view, @@ -817,4 +995,55 @@ public void onBackPressed() { super.onBackPressed(); } } + + public static String getReasonPhrase(int statusCode) { + switch(statusCode) { + case (200): return "OK"; + case (201): return "Created"; + case (202): return "Accepted"; + case (203): return "Non Authoritative Information"; + case (204): return "No Content"; + case (205): return "Reset Content"; + case (206): return "Partial Content"; + case (207): return "Partial Update OK"; + case (300): return "Mutliple Choices"; + case (301): return "Moved Permanently"; + case (302): return "Moved Temporarily"; + case (303): return "See Other"; + case (304): return "Not Modified"; + case (305): return "Use Proxy"; + case (307): return "Temporary Redirect"; + case (400): return "Bad Request"; + case (401): return "Unauthorized"; + case (402): return "Payment Required"; + case (403): return "Forbidden"; + case (404): return "Not Found"; + case (405): return "Method Not Allowed"; + case (406): return "Not Acceptable"; + case (407): return "Proxy Authentication Required"; + case (408): return "Request Timeout"; + case (409): return "Conflict"; + case (410): return "Gone"; + case (411): return "Length Required"; + case (412): return "Precondition Failed"; + case (413): return "Request Entity Too Large"; + case (414): return "Request-URI Too Long"; + case (415): return "Unsupported Media Type"; + case (416): return "Requested Range Not Satisfiable"; + case (417): return "Expectation Failed"; + case (418): return "Reauthentication Required"; + case (419): return "Proxy Reauthentication Required"; + case (422): return "Unprocessable Entity"; + case (423): return "Locked"; + case (424): return "Failed Dependency"; + case (500): return "Server Error"; + case (501): return "Not Implemented"; + case (502): return "Bad Gateway"; + case (503): return "Service Unavailable"; + case (504): return "Gateway Timeout"; + case (505): return "HTTP Version Not Supported"; + case (507): return "Insufficient Storage"; + default: return ""; + } + } } diff --git a/src/definitions.ts b/src/definitions.ts index 615766ac..2553ee91 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -235,6 +235,12 @@ export interface OpenWebViewOptions { */ preShowScript?: String; /** + * proxyRequests is a regex expression. Please see [this pr](TODO) for more info. (Android only) + * + * @since 6.9.0 + */ + proxyRequests?: String + /** * buttonNearDone allows for a creation of a custom button. Please see [buttonNearDone.md](/buttonNearDone.md) for more info. * * @since 6.7.0 From a884ac15704bbe9123ef66e9ea94afde0d0c6137 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 2 Nov 2024 13:28:28 +0000 Subject: [PATCH 02/11] chore(release): 6.9.0 --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a616925c..41b70320 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [6.9.0](https://github.com/Cap-go/capacitor-inappbrowser/compare/6.8.21...6.9.0) (2024-11-02) + + +### Features + +* proxy android ([160d542](https://github.com/Cap-go/capacitor-inappbrowser/commit/160d542d643ecdd3fe546f2df251c762d724562f)) + ### [6.8.21](https://github.com/Cap-go/capacitor-inappbrowser/compare/6.8.20...6.8.21) (2024-10-31) diff --git a/package.json b/package.json index 394661a1..05aa8ab7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@capgo/inappbrowser", - "version": "6.8.21", + "version": "6.9.0", "description": "Capacitor plugin in app browser", "main": "dist/plugin.cjs.js", "module": "dist/esm/index.js", From ed14ff4cd81d81001248aa2cdf6c89ac8158a861 Mon Sep 17 00:00:00 2001 From: WcaleNieWolny Date: Sat, 2 Nov 2024 15:06:23 +0100 Subject: [PATCH 03/11] fix: fix semaphore timeout on proxy error --- .../main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java | 1 + 1 file changed, 1 insertion(+) diff --git a/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java b/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java index 7bb7486d..b4cdc22c 100644 --- a/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java +++ b/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java @@ -612,6 +612,7 @@ public void handleProxyResultError(String result, String id) { return; } proxiedRequestsHashmap.remove(id); + proxiedRequest.semaphore.release(); } public void handleProxyResultOk(JSONObject result, String id) { From 6fa25a95d876c135e46e3b761e2da689c6a1348b Mon Sep 17 00:00:00 2001 From: WcaleNieWolny Date: Sat, 2 Nov 2024 15:07:28 +0100 Subject: [PATCH 04/11] docs: docs for android proxy --- README.md | 2 +- src/definitions.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 07fbecc2..59cdff32 100644 --- a/README.md +++ b/README.md @@ -506,7 +506,7 @@ Reload the current web page. | **`showArrow`** | boolean | showArrow: if true an arrow would be shown instead of cross for closing the window | false | 1.2.5 | | **`ignoreUntrustedSSLError`** | boolean | ignoreUntrustedSSLError: if true, the webview will ignore untrusted SSL errors allowing the user to view the website. | false | 6.1.0 | | **`preShowScript`** | String | preShowScript: if isPresentAfterPageLoad is true and this variable is set the plugin will inject a script before showing the browser. This script will be run in an async context. The plugin will wait for the script to finish (max 10 seconds) | | 6.6.0 | -| **`proxyRequests`** | String | proxyRequests is a regex expression. Please see [this pr](TODO) for more info. (Android only) | | 6.9.0 | +| **`proxyRequests`** | String | proxyRequests is a regex expression. Please see [this pr](https://github.com/Cap-go/capacitor-inappbrowser/pull/222) for more info. (Android only) | | 6.9.0 | | **`buttonNearDone`** | { ios: { iconType: 'sf-symbol' \| 'asset'; icon: String; }; android: { iconType: 'asset'; icon: String; width?: number; height?: number; }; } | buttonNearDone allows for a creation of a custom button. Please see [buttonNearDone.md](/buttonNearDone.md) for more info. | | 6.7.0 | diff --git a/src/definitions.ts b/src/definitions.ts index 2553ee91..cba4b13e 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -235,7 +235,7 @@ export interface OpenWebViewOptions { */ preShowScript?: String; /** - * proxyRequests is a regex expression. Please see [this pr](TODO) for more info. (Android only) + * proxyRequests is a regex expression. Please see [this pr](https://github.com/Cap-go/capacitor-inappbrowser/pull/222) for more info. (Android only) * * @since 6.9.0 */ From 3adc3b73d8cddb75338254539a3245398c2a2fac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 2 Nov 2024 14:07:59 +0000 Subject: [PATCH 05/11] chore(release): 6.9.1 --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41b70320..66ef43dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [6.9.1](https://github.com/Cap-go/capacitor-inappbrowser/compare/6.9.0...6.9.1) (2024-11-02) + + +### Bug Fixes + +* fix semaphore timeout on proxy error ([ed14ff4](https://github.com/Cap-go/capacitor-inappbrowser/commit/ed14ff4cd81d81001248aa2cdf6c89ac8158a861)) + ## [6.9.0](https://github.com/Cap-go/capacitor-inappbrowser/compare/6.8.21...6.9.0) (2024-11-02) diff --git a/package.json b/package.json index 05aa8ab7..910bbd1b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@capgo/inappbrowser", - "version": "6.9.0", + "version": "6.9.1", "description": "Capacitor plugin in app browser", "main": "dist/plugin.cjs.js", "module": "dist/esm/index.js", From 6160212e50707491ac986e04094c6dae03122c08 Mon Sep 17 00:00:00 2001 From: WcaleNieWolny Date: Sat, 2 Nov 2024 15:11:37 +0100 Subject: [PATCH 06/11] chore: lint --- .../InAppBrowserPlugin.java | 6 +- .../capacitor_inappbrowser/WebViewDialog.java | 306 +++++++++++------- src/definitions.ts | 4 +- 3 files changed, 201 insertions(+), 115 deletions(-) diff --git a/android/src/main/java/ee/forgr/capacitor_inappbrowser/InAppBrowserPlugin.java b/android/src/main/java/ee/forgr/capacitor_inappbrowser/InAppBrowserPlugin.java index bc7ee453..9aa5ac97 100644 --- a/android/src/main/java/ee/forgr/capacitor_inappbrowser/InAppBrowserPlugin.java +++ b/android/src/main/java/ee/forgr/capacitor_inappbrowser/InAppBrowserPlugin.java @@ -30,7 +30,6 @@ import java.util.Iterator; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; - import org.json.JSONException; import org.json.JSONObject; @@ -434,7 +433,10 @@ public void openWebView(PluginCall call) { try { options.setProxyRequestsPattern(Pattern.compile(proxyRequestsStr)); } catch (PatternSyntaxException e) { - Log.e("WebViewDialog", String.format("Pattern '%s' is not a valid pattern", proxyRequestsStr)); + Log.e( + "WebViewDialog", + String.format("Pattern '%s' is not a valid pattern", proxyRequestsStr) + ); } } diff --git a/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java b/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java index b4cdc22c..3b565bb2 100644 --- a/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java +++ b/android/src/main/java/ee/forgr/capacitor_inappbrowser/WebViewDialog.java @@ -37,13 +37,10 @@ import android.widget.TextView; import android.widget.Toast; import android.widget.Toolbar; - import androidx.annotation.RequiresApi; - import com.caverock.androidsvg.SVG; import com.caverock.androidsvg.SVGParseException; import com.getcapacitor.JSObject; - import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; @@ -66,13 +63,13 @@ import java.util.function.Consumer; import java.util.regex.Matcher; import java.util.regex.Pattern; - import org.json.JSONException; import org.json.JSONObject; public class WebViewDialog extends Dialog { private class ProxiedRequest { + private WebResourceResponse response; private Semaphore semaphore; @@ -605,7 +602,15 @@ public void onClick(View view) { } public void handleProxyResultError(String result, String id) { - Log.i("InAppBrowserProxy", String.format("handleProxyResultError: %s, ok: %s id: %s", result, false, id)); + Log.i( + "InAppBrowserProxy", + String.format( + "handleProxyResultError: %s, ok: %s id: %s", + result, + false, + id + ) + ); ProxiedRequest proxiedRequest = proxiedRequestsHashmap.get(id); if (proxiedRequest == null) { Log.e("InAppBrowserProxy", "proxiedRequest is null"); @@ -616,7 +621,10 @@ public void handleProxyResultError(String result, String id) { } public void handleProxyResultOk(JSONObject result, String id) { - Log.i("InAppBrowserProxy", String.format("handleProxyResultOk: %s, ok: %s, id: %s", result, true, id)); + Log.i( + "InAppBrowserProxy", + String.format("handleProxyResultOk: %s, ok: %s, id: %s", result, true, id) + ); ProxiedRequest proxiedRequest = proxiedRequestsHashmap.get(id); if (proxiedRequest == null) { Log.e("InAppBrowserProxy", "proxiedRequest is null"); @@ -637,12 +645,11 @@ public void handleProxyResultOk(JSONObject result, String id) { body = result.getString("body"); code = result.getInt("code"); JSONObject headers = result.getJSONObject("headers"); - for (Iterator it = headers.keys(); it.hasNext(); ) { + for (Iterator it = headers.keys(); it.hasNext();) { String headerName = it.next(); String header = headers.getString(headerName); responseHeaders.put(headerName, header); } - } catch (JSONException e) { Log.e("InAppBrowserProxy", "Cannot parse OK result", e); return; @@ -657,18 +664,24 @@ public void handleProxyResultOk(JSONObject result, String id) { return; } - if (!((100 <= code && code <= 299) || (400 <= code && code <= 599) )) { - Log.e("InAppBrowserProxy", String.format("Status code %s outside of the allowed range", code)); + if (!((100 <= code && code <= 299) || (400 <= code && code <= 599))) { + Log.e( + "InAppBrowserProxy", + String.format("Status code %s outside of the allowed range", code) + ); return; } WebResourceResponse webResourceResponse = new WebResourceResponse( - contentType, - "utf-8", - new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8)) + contentType, + "utf-8", + new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8)) ); - webResourceResponse.setStatusCodeAndReasonPhrase(code, getReasonPhrase(code)); + webResourceResponse.setStatusCodeAndReasonPhrase( + code, + getReasonPhrase(code) + ); proxiedRequest.response = webResourceResponse; proxiedRequest.semaphore.release(); } @@ -681,10 +694,9 @@ public boolean shouldOverrideUrlLoading( WebView view, WebResourceRequest request ) { - -// HashMap map = new HashMap<>(); -// map.put("x-requested-with", null); -// view.loadUrl(request.getUrl().toString(), map); + // HashMap map = new HashMap<>(); + // map.put("x-requested-with", null); + // view.loadUrl(request.getUrl().toString(), map); Context context = view.getContext(); String url = request.getUrl().toString(); @@ -720,66 +732,92 @@ private String toBase64(String raw) { } return s; } -// -// void handleRedirect(String currentUrl, Response response) { -// String loc = response.header("Location"); -// _webView.evaluateJavascript(""); -// } -// - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) - @Override - public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { - Pattern pattern = _options.getProxyRequestsPattern(); - if (pattern == null) { - return null; - } - Matcher matcher = pattern.matcher(request.getUrl().toString()); - if (!matcher.find()) { - return null; - } - // Requests matches the regex - if (Objects.equals(request.getMethod(), "POST")) { - // Log.e("HTTP", String.format("returned null (ok) %s", request.getUrl().toString())); - return null; - } + // + // void handleRedirect(String currentUrl, Response response) { + // String loc = response.header("Location"); + // _webView.evaluateJavascript(""); + // } + // + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + @Override + public WebResourceResponse shouldInterceptRequest( + WebView view, + WebResourceRequest request + ) { + Pattern pattern = _options.getProxyRequestsPattern(); + if (pattern == null) { + return null; + } + Matcher matcher = pattern.matcher(request.getUrl().toString()); + if (!matcher.find()) { + return null; + } - Log.i("InAppBrowserProxy", String.format("Proxying request: %s", request.getUrl().toString())); + // Requests matches the regex + if (Objects.equals(request.getMethod(), "POST")) { + // Log.e("HTTP", String.format("returned null (ok) %s", request.getUrl().toString())); + return null; + } + + Log.i( + "InAppBrowserProxy", + String.format("Proxying request: %s", request.getUrl().toString()) + ); - // We need to call a JS function - String requestId = randomRequestId(); - ProxiedRequest proxiedRequest = new ProxiedRequest(); - proxiedRequestsHashmap.put(requestId, proxiedRequest); + // We need to call a JS function + String requestId = randomRequestId(); + ProxiedRequest proxiedRequest = new ProxiedRequest(); + proxiedRequestsHashmap.put(requestId, proxiedRequest); - // lsuakdchgbbaHandleProxiedRequest - activity.runOnUiThread(new Runnable() { + // lsuakdchgbbaHandleProxiedRequest + activity.runOnUiThread( + new Runnable() { @Override public void run() { StringBuilder headers = new StringBuilder(); - Map requestHeaders = request.getRequestHeaders(); - for (Map.Entry header : requestHeaders.entrySet()) { - headers.append(String.format("h[atob('%s')]=atob('%s');", toBase64(header.getKey()), toBase64(header.getValue()))); + Map requestHeaders = + request.getRequestHeaders(); + for (Map.Entry< + String, + String + > header : requestHeaders.entrySet()) { + headers.append( + String.format( + "h[atob('%s')]=atob('%s');", + toBase64(header.getKey()), + toBase64(header.getValue()) + ) + ); } - String s = String.format("try {function getHeaders() {const h = {}; %s return h}; window.InAppBrowserProxyRequest(new Request(atob('%s'), {headers: getHeaders(), method: '%s'})).then(async (res) => Capacitor.Plugins.InAppBrowser.lsuakdchgbbaHandleProxiedRequest({ok: true, result: (!!res ? {headers: Object.fromEntries(res.headers.entries()), code: res.status, body: (await res.text())} : null), id: '%s'})).catch((e) => Capacitor.Plugins.InAppBrowser.lsuakdchgbbaHandleProxiedRequest({ok: false, result: e.toString(), id: '%s'}))} catch (e) {Capacitor.Plugins.InAppBrowser.lsuakdchgbbaHandleProxiedRequest({ok: false, result: e.toString(), id: '%s'})}", headers, toBase64(request.getUrl().toString()), request.getMethod(), requestId, requestId, requestId); + String s = String.format( + "try {function getHeaders() {const h = {}; %s return h}; window.InAppBrowserProxyRequest(new Request(atob('%s'), {headers: getHeaders(), method: '%s'})).then(async (res) => Capacitor.Plugins.InAppBrowser.lsuakdchgbbaHandleProxiedRequest({ok: true, result: (!!res ? {headers: Object.fromEntries(res.headers.entries()), code: res.status, body: (await res.text())} : null), id: '%s'})).catch((e) => Capacitor.Plugins.InAppBrowser.lsuakdchgbbaHandleProxiedRequest({ok: false, result: e.toString(), id: '%s'}))} catch (e) {Capacitor.Plugins.InAppBrowser.lsuakdchgbbaHandleProxiedRequest({ok: false, result: e.toString(), id: '%s'})}", + headers, + toBase64(request.getUrl().toString()), + request.getMethod(), + requestId, + requestId, + requestId + ); // Log.i("HTTP", s); capacitorWebView.evaluateJavascript(s, null); } - }); + } + ); - // 10 seconds wait max - try { - if (proxiedRequest.semaphore.tryAcquire(1, 10, TimeUnit.SECONDS)) { - return proxiedRequest.response; - } else { - Log.e("InAppBrowserProxy", "Semaphore timed out"); - proxiedRequestsHashmap.remove(requestId); // prevent mem leak - } - } catch (InterruptedException e) { - Log.e("InAppBrowserProxy", "Semaphore wait error", e); + // 10 seconds wait max + try { + if (proxiedRequest.semaphore.tryAcquire(1, 10, TimeUnit.SECONDS)) { + return proxiedRequest.response; + } else { + Log.e("InAppBrowserProxy", "Semaphore timed out"); + proxiedRequestsHashmap.remove(requestId); // prevent mem leak } - return null; + } catch (InterruptedException e) { + Log.e("InAppBrowserProxy", "Semaphore wait error", e); } - + return null; + } @Override public void onReceivedHttpAuthRequest( @@ -998,53 +1036,99 @@ public void onBackPressed() { } public static String getReasonPhrase(int statusCode) { - switch(statusCode) { - case (200): return "OK"; - case (201): return "Created"; - case (202): return "Accepted"; - case (203): return "Non Authoritative Information"; - case (204): return "No Content"; - case (205): return "Reset Content"; - case (206): return "Partial Content"; - case (207): return "Partial Update OK"; - case (300): return "Mutliple Choices"; - case (301): return "Moved Permanently"; - case (302): return "Moved Temporarily"; - case (303): return "See Other"; - case (304): return "Not Modified"; - case (305): return "Use Proxy"; - case (307): return "Temporary Redirect"; - case (400): return "Bad Request"; - case (401): return "Unauthorized"; - case (402): return "Payment Required"; - case (403): return "Forbidden"; - case (404): return "Not Found"; - case (405): return "Method Not Allowed"; - case (406): return "Not Acceptable"; - case (407): return "Proxy Authentication Required"; - case (408): return "Request Timeout"; - case (409): return "Conflict"; - case (410): return "Gone"; - case (411): return "Length Required"; - case (412): return "Precondition Failed"; - case (413): return "Request Entity Too Large"; - case (414): return "Request-URI Too Long"; - case (415): return "Unsupported Media Type"; - case (416): return "Requested Range Not Satisfiable"; - case (417): return "Expectation Failed"; - case (418): return "Reauthentication Required"; - case (419): return "Proxy Reauthentication Required"; - case (422): return "Unprocessable Entity"; - case (423): return "Locked"; - case (424): return "Failed Dependency"; - case (500): return "Server Error"; - case (501): return "Not Implemented"; - case (502): return "Bad Gateway"; - case (503): return "Service Unavailable"; - case (504): return "Gateway Timeout"; - case (505): return "HTTP Version Not Supported"; - case (507): return "Insufficient Storage"; - default: return ""; + switch (statusCode) { + case (200): + return "OK"; + case (201): + return "Created"; + case (202): + return "Accepted"; + case (203): + return "Non Authoritative Information"; + case (204): + return "No Content"; + case (205): + return "Reset Content"; + case (206): + return "Partial Content"; + case (207): + return "Partial Update OK"; + case (300): + return "Mutliple Choices"; + case (301): + return "Moved Permanently"; + case (302): + return "Moved Temporarily"; + case (303): + return "See Other"; + case (304): + return "Not Modified"; + case (305): + return "Use Proxy"; + case (307): + return "Temporary Redirect"; + case (400): + return "Bad Request"; + case (401): + return "Unauthorized"; + case (402): + return "Payment Required"; + case (403): + return "Forbidden"; + case (404): + return "Not Found"; + case (405): + return "Method Not Allowed"; + case (406): + return "Not Acceptable"; + case (407): + return "Proxy Authentication Required"; + case (408): + return "Request Timeout"; + case (409): + return "Conflict"; + case (410): + return "Gone"; + case (411): + return "Length Required"; + case (412): + return "Precondition Failed"; + case (413): + return "Request Entity Too Large"; + case (414): + return "Request-URI Too Long"; + case (415): + return "Unsupported Media Type"; + case (416): + return "Requested Range Not Satisfiable"; + case (417): + return "Expectation Failed"; + case (418): + return "Reauthentication Required"; + case (419): + return "Proxy Reauthentication Required"; + case (422): + return "Unprocessable Entity"; + case (423): + return "Locked"; + case (424): + return "Failed Dependency"; + case (500): + return "Server Error"; + case (501): + return "Not Implemented"; + case (502): + return "Bad Gateway"; + case (503): + return "Service Unavailable"; + case (504): + return "Gateway Timeout"; + case (505): + return "HTTP Version Not Supported"; + case (507): + return "Insufficient Storage"; + default: + return ""; } } } diff --git a/src/definitions.ts b/src/definitions.ts index cba4b13e..2b5c13f3 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -239,8 +239,8 @@ export interface OpenWebViewOptions { * * @since 6.9.0 */ - proxyRequests?: String - /** + proxyRequests?: String; + /** * buttonNearDone allows for a creation of a custom button. Please see [buttonNearDone.md](/buttonNearDone.md) for more info. * * @since 6.7.0 From 5bdc5df1c02f9190fd72cd9b80bf6cc1cb9df545 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 2 Nov 2024 14:12:04 +0000 Subject: [PATCH 07/11] chore(release): 6.9.2 --- CHANGELOG.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66ef43dc..b56ec394 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [6.9.2](https://github.com/Cap-go/capacitor-inappbrowser/compare/6.9.1...6.9.2) (2024-11-02) + ### [6.9.1](https://github.com/Cap-go/capacitor-inappbrowser/compare/6.9.0...6.9.1) (2024-11-02) diff --git a/package.json b/package.json index 910bbd1b..557efec8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@capgo/inappbrowser", - "version": "6.9.1", + "version": "6.9.2", "description": "Capacitor plugin in app browser", "main": "dist/plugin.cjs.js", "module": "dist/esm/index.js", From 13beceb9ca8e1d7614d355bbf45f0d4e52952e86 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 01:39:37 +0000 Subject: [PATCH 08/11] chore(deps): update dependency rollup to v4.24.3 --- pnpm-lock.yaml | 152 ++++++++++++++++++++++++------------------------- 1 file changed, 76 insertions(+), 76 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 97d76854..3e941393 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,7 +61,7 @@ importers: version: 6.0.1 rollup: specifier: ^4.21.1 - version: 4.24.2 + version: 4.24.3 swiftlint: specifier: ^1.0.2 version: 1.0.2 @@ -256,93 +256,93 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@rollup/rollup-android-arm-eabi@4.24.2': - resolution: {integrity: sha512-ufoveNTKDg9t/b7nqI3lwbCG/9IJMhADBNjjz/Jn6LxIZxD7T5L8l2uO/wD99945F1Oo8FvgbbZJRguyk/BdzA==} + '@rollup/rollup-android-arm-eabi@4.24.3': + resolution: {integrity: sha512-ufb2CH2KfBWPJok95frEZZ82LtDl0A6QKTa8MoM+cWwDZvVGl5/jNb79pIhRvAalUu+7LD91VYR0nwRD799HkQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.24.2': - resolution: {integrity: sha512-iZoYCiJz3Uek4NI0J06/ZxUgwAfNzqltK0MptPDO4OR0a88R4h0DSELMsflS6ibMCJ4PnLvq8f7O1d7WexUvIA==} + '@rollup/rollup-android-arm64@4.24.3': + resolution: {integrity: sha512-iAHpft/eQk9vkWIV5t22V77d90CRofgR2006UiCjHcHJFVI1E0oBkQIAbz+pLtthFw3hWEmVB4ilxGyBf48i2Q==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.24.2': - resolution: {integrity: sha512-/UhrIxobHYCBfhi5paTkUDQ0w+jckjRZDZ1kcBL132WeHZQ6+S5v9jQPVGLVrLbNUebdIRpIt00lQ+4Z7ys4Rg==} + '@rollup/rollup-darwin-arm64@4.24.3': + resolution: {integrity: sha512-QPW2YmkWLlvqmOa2OwrfqLJqkHm7kJCIMq9kOz40Zo9Ipi40kf9ONG5Sz76zszrmIZZ4hgRIkez69YnTHgEz1w==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.24.2': - resolution: {integrity: sha512-1F/jrfhxJtWILusgx63WeTvGTwE4vmsT9+e/z7cZLKU8sBMddwqw3UV5ERfOV+H1FuRK3YREZ46J4Gy0aP3qDA==} + '@rollup/rollup-darwin-x64@4.24.3': + resolution: {integrity: sha512-KO0pN5x3+uZm1ZXeIfDqwcvnQ9UEGN8JX5ufhmgH5Lz4ujjZMAnxQygZAVGemFWn+ZZC0FQopruV4lqmGMshow==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.24.2': - resolution: {integrity: sha512-1YWOpFcGuC6iGAS4EI+o3BV2/6S0H+m9kFOIlyFtp4xIX5rjSnL3AwbTBxROX0c8yWtiWM7ZI6mEPTI7VkSpZw==} + '@rollup/rollup-freebsd-arm64@4.24.3': + resolution: {integrity: sha512-CsC+ZdIiZCZbBI+aRlWpYJMSWvVssPuWqrDy/zi9YfnatKKSLFCe6fjna1grHuo/nVaHG+kiglpRhyBQYRTK4A==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.24.2': - resolution: {integrity: sha512-3qAqTewYrCdnOD9Gl9yvPoAoFAVmPJsBvleabvx4bnu1Kt6DrB2OALeRVag7BdWGWLhP1yooeMLEi6r2nYSOjg==} + '@rollup/rollup-freebsd-x64@4.24.3': + resolution: {integrity: sha512-F0nqiLThcfKvRQhZEzMIXOQG4EeX61im61VYL1jo4eBxv4aZRmpin6crnBJQ/nWnCsjH5F6J3W6Stdm0mBNqBg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.24.2': - resolution: {integrity: sha512-ArdGtPHjLqWkqQuoVQ6a5UC5ebdX8INPuJuJNWRe0RGa/YNhVvxeWmCTFQ7LdmNCSUzVZzxAvUznKaYx645Rig==} + '@rollup/rollup-linux-arm-gnueabihf@4.24.3': + resolution: {integrity: sha512-KRSFHyE/RdxQ1CSeOIBVIAxStFC/hnBgVcaiCkQaVC+EYDtTe4X7z5tBkFyRoBgUGtB6Xg6t9t2kulnX6wJc6A==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.24.2': - resolution: {integrity: sha512-B6UHHeNnnih8xH6wRKB0mOcJGvjZTww1FV59HqJoTJ5da9LCG6R4SEBt6uPqzlawv1LoEXSS0d4fBlHNWl6iYw==} + '@rollup/rollup-linux-arm-musleabihf@4.24.3': + resolution: {integrity: sha512-h6Q8MT+e05zP5BxEKz0vi0DhthLdrNEnspdLzkoFqGwnmOzakEHSlXfVyA4HJ322QtFy7biUAVFPvIDEDQa6rw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.24.2': - resolution: {integrity: sha512-kr3gqzczJjSAncwOS6i7fpb4dlqcvLidqrX5hpGBIM1wtt0QEVtf4wFaAwVv8QygFU8iWUMYEoJZWuWxyua4GQ==} + '@rollup/rollup-linux-arm64-gnu@4.24.3': + resolution: {integrity: sha512-fKElSyXhXIJ9pqiYRqisfirIo2Z5pTTve5K438URf08fsypXrEkVmShkSfM8GJ1aUyvjakT+fn2W7Czlpd/0FQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.24.2': - resolution: {integrity: sha512-TDdHLKCWgPuq9vQcmyLrhg/bgbOvIQ8rtWQK7MRxJ9nvaxKx38NvY7/Lo6cYuEnNHqf6rMqnivOIPIQt6H2AoA==} + '@rollup/rollup-linux-arm64-musl@4.24.3': + resolution: {integrity: sha512-YlddZSUk8G0px9/+V9PVilVDC6ydMz7WquxozToozSnfFK6wa6ne1ATUjUvjin09jp34p84milxlY5ikueoenw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.24.2': - resolution: {integrity: sha512-xv9vS648T3X4AxFFZGWeB5Dou8ilsv4VVqJ0+loOIgDO20zIhYfDLkk5xoQiej2RiSQkld9ijF/fhLeonrz2mw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.24.3': + resolution: {integrity: sha512-yNaWw+GAO8JjVx3s3cMeG5Esz1cKVzz8PkTJSfYzE5u7A+NvGmbVFEHP+BikTIyYWuz0+DX9kaA3pH9Sqxp69g==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.24.2': - resolution: {integrity: sha512-tbtXwnofRoTt223WUZYiUnbxhGAOVul/3StZ947U4A5NNjnQJV5irKMm76G0LGItWs6y+SCjUn/Q0WaMLkEskg==} + '@rollup/rollup-linux-riscv64-gnu@4.24.3': + resolution: {integrity: sha512-lWKNQfsbpv14ZCtM/HkjCTm4oWTKTfxPmr7iPfp3AHSqyoTz5AgLemYkWLwOBWc+XxBbrU9SCokZP0WlBZM9lA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.24.2': - resolution: {integrity: sha512-gc97UebApwdsSNT3q79glOSPdfwgwj5ELuiyuiMY3pEWMxeVqLGKfpDFoum4ujivzxn6veUPzkGuSYoh5deQ2Q==} + '@rollup/rollup-linux-s390x-gnu@4.24.3': + resolution: {integrity: sha512-HoojGXTC2CgCcq0Woc/dn12wQUlkNyfH0I1ABK4Ni9YXyFQa86Fkt2Q0nqgLfbhkyfQ6003i3qQk9pLh/SpAYw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.24.2': - resolution: {integrity: sha512-jOG/0nXb3z+EM6SioY8RofqqmZ+9NKYvJ6QQaa9Mvd3RQxlH68/jcB/lpyVt4lCiqr04IyaC34NzhUqcXbB5FQ==} + '@rollup/rollup-linux-x64-gnu@4.24.3': + resolution: {integrity: sha512-mnEOh4iE4USSccBOtcrjF5nj+5/zm6NcNhbSEfR3Ot0pxBwvEn5QVUXcuOwwPkapDtGZ6pT02xLoPaNv06w7KQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.24.2': - resolution: {integrity: sha512-XAo7cJec80NWx9LlZFEJQxqKOMz/lX3geWs2iNT5CHIERLFfd90f3RYLLjiCBm1IMaQ4VOX/lTC9lWfzzQm14Q==} + '@rollup/rollup-linux-x64-musl@4.24.3': + resolution: {integrity: sha512-rMTzawBPimBQkG9NKpNHvquIUTQPzrnPxPbCY1Xt+mFkW7pshvyIS5kYgcf74goxXOQk0CP3EoOC1zcEezKXhw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.24.2': - resolution: {integrity: sha512-A+JAs4+EhsTjnPQvo9XY/DC0ztaws3vfqzrMNMKlwQXuniBKOIIvAAI8M0fBYiTCxQnElYu7mLk7JrhlQ+HeOw==} + '@rollup/rollup-win32-arm64-msvc@4.24.3': + resolution: {integrity: sha512-2lg1CE305xNvnH3SyiKwPVsTVLCg4TmNCF1z7PSHX2uZY2VbUpdkgAllVoISD7JO7zu+YynpWNSKAtOrX3AiuA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.24.2': - resolution: {integrity: sha512-ZhcrakbqA1SCiJRMKSU64AZcYzlZ/9M5LaYil9QWxx9vLnkQ9Vnkve17Qn4SjlipqIIBFKjBES6Zxhnvh0EAEw==} + '@rollup/rollup-win32-ia32-msvc@4.24.3': + resolution: {integrity: sha512-9SjYp1sPyxJsPWuhOCX6F4jUMXGbVVd5obVpoVEi8ClZqo52ViZewA6eFz85y8ezuOA+uJMP5A5zo6Oz4S5rVQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.24.2': - resolution: {integrity: sha512-2mLH46K1u3r6uwc95hU+OR9q/ggYMpnS7pSp83Ece1HUQgF9Nh/QwTK5rcgbFnV9j+08yBrU5sA/P0RK2MSBNA==} + '@rollup/rollup-win32-x64-msvc@4.24.3': + resolution: {integrity: sha512-HGZgRFFYrMrP3TJlq58nR1xy8zHKId25vhmm5S9jETEfDf6xybPxsavFTJaufe2zgOGYJBskGlj49CwtEuFhWQ==} cpu: [x64] os: [win32] @@ -1423,8 +1423,8 @@ packages: engines: {node: 20 || >=22} hasBin: true - rollup@4.24.2: - resolution: {integrity: sha512-do/DFGq5g6rdDhdpPq5qb2ecoczeK6y+2UAjdJ5trjQJj5f1AiVdLRWRc9A9/fFukfvJRgM0UXzxBIYMovm5ww==} + rollup@4.24.3: + resolution: {integrity: sha512-HBW896xR5HGmoksbi3JBDtmVzWiPAYqp7wip50hjQ67JbDz61nyoMPdqu1DvVW9asYb2M65Z20ZHsyJCMqMyDg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1980,58 +1980,58 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/rollup-android-arm-eabi@4.24.2': + '@rollup/rollup-android-arm-eabi@4.24.3': optional: true - '@rollup/rollup-android-arm64@4.24.2': + '@rollup/rollup-android-arm64@4.24.3': optional: true - '@rollup/rollup-darwin-arm64@4.24.2': + '@rollup/rollup-darwin-arm64@4.24.3': optional: true - '@rollup/rollup-darwin-x64@4.24.2': + '@rollup/rollup-darwin-x64@4.24.3': optional: true - '@rollup/rollup-freebsd-arm64@4.24.2': + '@rollup/rollup-freebsd-arm64@4.24.3': optional: true - '@rollup/rollup-freebsd-x64@4.24.2': + '@rollup/rollup-freebsd-x64@4.24.3': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.24.2': + '@rollup/rollup-linux-arm-gnueabihf@4.24.3': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.24.2': + '@rollup/rollup-linux-arm-musleabihf@4.24.3': optional: true - '@rollup/rollup-linux-arm64-gnu@4.24.2': + '@rollup/rollup-linux-arm64-gnu@4.24.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.24.2': + '@rollup/rollup-linux-arm64-musl@4.24.3': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.24.2': + '@rollup/rollup-linux-powerpc64le-gnu@4.24.3': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.24.2': + '@rollup/rollup-linux-riscv64-gnu@4.24.3': optional: true - '@rollup/rollup-linux-s390x-gnu@4.24.2': + '@rollup/rollup-linux-s390x-gnu@4.24.3': optional: true - '@rollup/rollup-linux-x64-gnu@4.24.2': + '@rollup/rollup-linux-x64-gnu@4.24.3': optional: true - '@rollup/rollup-linux-x64-musl@4.24.2': + '@rollup/rollup-linux-x64-musl@4.24.3': optional: true - '@rollup/rollup-win32-arm64-msvc@4.24.2': + '@rollup/rollup-win32-arm64-msvc@4.24.3': optional: true - '@rollup/rollup-win32-ia32-msvc@4.24.2': + '@rollup/rollup-win32-ia32-msvc@4.24.3': optional: true - '@rollup/rollup-win32-x64-msvc@4.24.2': + '@rollup/rollup-win32-x64-msvc@4.24.3': optional: true '@rtsao/scc@1.1.0': {} @@ -3267,28 +3267,28 @@ snapshots: glob: 11.0.0 package-json-from-dist: 1.0.0 - rollup@4.24.2: + rollup@4.24.3: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.24.2 - '@rollup/rollup-android-arm64': 4.24.2 - '@rollup/rollup-darwin-arm64': 4.24.2 - '@rollup/rollup-darwin-x64': 4.24.2 - '@rollup/rollup-freebsd-arm64': 4.24.2 - '@rollup/rollup-freebsd-x64': 4.24.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.24.2 - '@rollup/rollup-linux-arm-musleabihf': 4.24.2 - '@rollup/rollup-linux-arm64-gnu': 4.24.2 - '@rollup/rollup-linux-arm64-musl': 4.24.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.24.2 - '@rollup/rollup-linux-riscv64-gnu': 4.24.2 - '@rollup/rollup-linux-s390x-gnu': 4.24.2 - '@rollup/rollup-linux-x64-gnu': 4.24.2 - '@rollup/rollup-linux-x64-musl': 4.24.2 - '@rollup/rollup-win32-arm64-msvc': 4.24.2 - '@rollup/rollup-win32-ia32-msvc': 4.24.2 - '@rollup/rollup-win32-x64-msvc': 4.24.2 + '@rollup/rollup-android-arm-eabi': 4.24.3 + '@rollup/rollup-android-arm64': 4.24.3 + '@rollup/rollup-darwin-arm64': 4.24.3 + '@rollup/rollup-darwin-x64': 4.24.3 + '@rollup/rollup-freebsd-arm64': 4.24.3 + '@rollup/rollup-freebsd-x64': 4.24.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.24.3 + '@rollup/rollup-linux-arm-musleabihf': 4.24.3 + '@rollup/rollup-linux-arm64-gnu': 4.24.3 + '@rollup/rollup-linux-arm64-musl': 4.24.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.24.3 + '@rollup/rollup-linux-riscv64-gnu': 4.24.3 + '@rollup/rollup-linux-s390x-gnu': 4.24.3 + '@rollup/rollup-linux-x64-gnu': 4.24.3 + '@rollup/rollup-linux-x64-musl': 4.24.3 + '@rollup/rollup-win32-arm64-msvc': 4.24.3 + '@rollup/rollup-win32-ia32-msvc': 4.24.3 + '@rollup/rollup-win32-x64-msvc': 4.24.3 fsevents: 2.3.3 run-parallel@1.2.0: From 0c7f64db5b43345116669c661c42b4857ab7c12c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 4 Nov 2024 04:34:30 +0000 Subject: [PATCH 09/11] chore(release): 6.9.3 --- CHANGELOG.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b56ec394..948da337 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [6.9.3](https://github.com/Cap-go/capacitor-inappbrowser/compare/6.9.2...6.9.3) (2024-11-04) + ### [6.9.2](https://github.com/Cap-go/capacitor-inappbrowser/compare/6.9.1...6.9.2) (2024-11-02) ### [6.9.1](https://github.com/Cap-go/capacitor-inappbrowser/compare/6.9.0...6.9.1) (2024-11-02) diff --git a/package.json b/package.json index 557efec8..6acfe6bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@capgo/inappbrowser", - "version": "6.9.2", + "version": "6.9.3", "description": "Capacitor plugin in app browser", "main": "dist/plugin.cjs.js", "module": "dist/esm/index.js", From c42388e74df0bc50c7ca2eb73fc9a67d3bd498b0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 04:35:43 +0000 Subject: [PATCH 10/11] chore(deps): update pnpm to v9.12.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6acfe6bc..dcda7c00 100644 --- a/package.json +++ b/package.json @@ -79,5 +79,5 @@ "src": "android" } }, - "packageManager": "pnpm@9.12.2+sha512.22721b3a11f81661ae1ec68ce1a7b879425a1ca5b991c975b074ac220b187ce56c708fe5db69f4c962c989452eee76c82877f4ee80f474cebd61ee13461b6228" + "packageManager": "pnpm@9.12.3+sha512.cce0f9de9c5a7c95bef944169cc5dfe8741abfb145078c0d508b868056848a87c81e626246cb60967cbd7fd29a6c062ef73ff840d96b3c86c40ac92cf4a813ee" } From 13e3686cb97769e388de397836b359dffb39349a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 4 Nov 2024 07:10:43 +0000 Subject: [PATCH 11/11] chore(release): 6.9.4 --- CHANGELOG.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 948da337..05caac12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [6.9.4](https://github.com/Cap-go/capacitor-inappbrowser/compare/6.9.3...6.9.4) (2024-11-04) + ### [6.9.3](https://github.com/Cap-go/capacitor-inappbrowser/compare/6.9.2...6.9.3) (2024-11-04) ### [6.9.2](https://github.com/Cap-go/capacitor-inappbrowser/compare/6.9.1...6.9.2) (2024-11-02) diff --git a/package.json b/package.json index dcda7c00..8bfbb53c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@capgo/inappbrowser", - "version": "6.9.3", + "version": "6.9.4", "description": "Capacitor plugin in app browser", "main": "dist/plugin.cjs.js", "module": "dist/esm/index.js",