From 40a355a42d4a9444dc753c04c6608dade2f06a23 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 03:13:27 +0200 Subject: Adding upstream version 125.0.1. Signed-off-by: Daniel Baumann --- .../actions/test-open-popup-browser-action.js | 2 +- .../actions/test-open-popup-page-action.js | 2 +- .../web_extensions/borderify-mv3/borderify.js | 1 + .../borderify-mv3/icons/border-48.png | Bin 0 -> 225 bytes .../web_extensions/borderify-mv3/icons/icon.svg | 1 + .../web_extensions/borderify-mv3/manifest.json | 26 ++++ .../assets/web_extensions/borderify/manifest.json | 3 +- .../clickToRequestPermission.html | 11 ++ .../optional-permission-request/manifest.json | 14 ++ .../request-permission.js | 10 ++ .../redirect-to-android-resource/background.js | 2 +- .../web_extensions/test-support/test-support.js | 2 +- .../web_extensions/update-postpone-1/background.js | 2 +- .../src/androidTest/assets/www/clickToReplace.html | 10 ++ .../assets/www/context_menu_blob_buffered.html | 2 +- .../assets/www/context_menu_blob_full.html | 2 +- .../src/androidTest/assets/www/forms.html | 2 +- .../assets/www/pull-to-refresh-subframe.html | 2 +- .../src/androidTest/assets/www/push/sw.js | 2 +- .../src/androidTest/assets/www/scroll.html | 2 +- .../src/androidTest/assets/www/touch-action.html | 2 +- .../src/androidTest/assets/www/touch.html | 2 +- .../src/androidTest/assets/www/touchstart.html | 2 +- .../org/mozilla/geckoview/test/AutocompleteTest.kt | 2 +- .../org/mozilla/geckoview/test/BaseSessionTest.kt | 1 + .../mozilla/geckoview/test/GeckoAppShellTest.kt | 1 + .../geckoview/test/GeckoSessionTestRuleTest.kt | 1 + .../org/mozilla/geckoview/test/GeolocationTest.kt | 3 +- .../mozilla/geckoview/test/HistoryDelegateTest.kt | 5 + .../java/org/mozilla/geckoview/test/LocaleTest.kt | 12 ++ .../geckoview/test/NavigationDelegateTest.kt | 163 ++++++++++++++------ .../org/mozilla/geckoview/test/OpenWindowTest.kt | 8 +- .../org/mozilla/geckoview/test/PdfCreationTest.kt | 12 ++ .../geckoview/test/PermissionDelegateTest.kt | 54 +++---- .../mozilla/geckoview/test/ProgressDelegateTest.kt | 22 ++- .../mozilla/geckoview/test/RuntimeSettingsTest.kt | 3 +- .../org/mozilla/geckoview/test/ScreenshotTest.kt | 5 + .../geckoview/test/SelectionActionDelegateTest.kt | 18 +-- .../geckoview/test/TestContentProvider.java | 19 ++- .../geckoview/test/TextInputDelegateTest.kt | 42 +++++- .../geckoview/test/TrackingPermissionService.java | 3 +- .../org/mozilla/geckoview/test/VideoCaptureTest.kt | 58 +++++++ .../org/mozilla/geckoview/test/WebExtensionTest.kt | 168 ++++++++++++++++++++- .../mozilla/geckoview/test/WebNotificationTest.kt | 15 +- .../java/org/mozilla/geckoview/test/WebPushTest.kt | 3 +- .../geckoview/test/rule/GeckoSessionTestRule.java | 3 +- 46 files changed, 589 insertions(+), 136 deletions(-) create mode 100644 mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/borderify.js create mode 100644 mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/icons/border-48.png create mode 100644 mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/icons/icon.svg create mode 100644 mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/manifest.json create mode 100644 mobile/android/geckoview/src/androidTest/assets/web_extensions/optional-permission-request/clickToRequestPermission.html create mode 100644 mobile/android/geckoview/src/androidTest/assets/web_extensions/optional-permission-request/manifest.json create mode 100644 mobile/android/geckoview/src/androidTest/assets/web_extensions/optional-permission-request/request-permission.js create mode 100644 mobile/android/geckoview/src/androidTest/assets/www/clickToReplace.html create mode 100644 mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/VideoCaptureTest.kt (limited to 'mobile/android/geckoview/src/androidTest') diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/actions/test-open-popup-browser-action.js b/mobile/android/geckoview/src/androidTest/assets/web_extensions/actions/test-open-popup-browser-action.js index cde31235ac..421859dfa2 100644 --- a/mobile/android/geckoview/src/androidTest/assets/web_extensions/actions/test-open-popup-browser-action.js +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/actions/test-open-popup-browser-action.js @@ -1,7 +1,7 @@ window.addEventListener("DOMContentLoaded", init); function init() { - document.body.addEventListener("click", event => { + document.body.addEventListener("click", () => { browser.browserAction.openPopup(); }); } diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/actions/test-open-popup-page-action.js b/mobile/android/geckoview/src/androidTest/assets/web_extensions/actions/test-open-popup-page-action.js index f16d96333f..6e38fc7858 100644 --- a/mobile/android/geckoview/src/androidTest/assets/web_extensions/actions/test-open-popup-page-action.js +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/actions/test-open-popup-page-action.js @@ -1,7 +1,7 @@ window.addEventListener("DOMContentLoaded", init); function init() { - document.body.addEventListener("click", event => { + document.body.addEventListener("click", () => { browser.pageAction.openPopup(); }); } diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/borderify.js b/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/borderify.js new file mode 100644 index 0000000000..9c3728b381 --- /dev/null +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/borderify.js @@ -0,0 +1 @@ +document.body.style.border = "5px solid red"; diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/icons/border-48.png b/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/icons/border-48.png new file mode 100644 index 0000000000..90687de26d Binary files /dev/null and b/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/icons/border-48.png differ diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/icons/icon.svg b/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/icons/icon.svg new file mode 100644 index 0000000000..dd1fae7d15 --- /dev/null +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/icons/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/manifest.json b/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/manifest.json new file mode 100644 index 0000000000..f1dbe5fe71 --- /dev/null +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify-mv3/manifest.json @@ -0,0 +1,26 @@ +{ + "manifest_version": 3, + "name": "Borderify", + "version": "1.0", + "description": "Adds a red border to all webpages matching example.com.", + "browser_specific_settings": { + "gecko": { + "id": "borderify@tests.mozilla.org" + } + }, + "icons": { + "48": "icons/border-48.png" + }, + "content_scripts": [ + { + "matches": ["*://*.example.com/*"], + "js": ["borderify.js"] + } + ], + "options_ui": { + "page": "dummy.html" + }, + "granted_host_permissions": true, + "optional_permissions": ["clipboardRead", "*://opt-host-perm.example.com/*"], + "host_permissions": ["*://host-perm.example.com/*"] +} diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify/manifest.json b/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify/manifest.json index 4e3daf6708..4ea4eb093e 100644 --- a/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify/manifest.json +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/borderify/manifest.json @@ -19,5 +19,6 @@ ], "options_ui": { "page": "dummy.html" - } + }, + "optional_permissions": ["clipboardRead", "*://developer.mozilla.org/*"] } diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/optional-permission-request/clickToRequestPermission.html b/mobile/android/geckoview/src/androidTest/assets/web_extensions/optional-permission-request/clickToRequestPermission.html new file mode 100644 index 0000000000..e6ddcb8c8d --- /dev/null +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/optional-permission-request/clickToRequestPermission.html @@ -0,0 +1,11 @@ + + + + Hello, world! + + + + +

Hello, world!

+ + diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/optional-permission-request/manifest.json b/mobile/android/geckoview/src/androidTest/assets/web_extensions/optional-permission-request/manifest.json new file mode 100644 index 0000000000..0644eb637f --- /dev/null +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/optional-permission-request/manifest.json @@ -0,0 +1,14 @@ +{ + "manifest_version": 3, + "name": "optional-permission-request", + "browser_specific_settings": { + "gecko": { + "id": "optional-permission-request@example.com" + } + }, + "version": "1.0", + "description": "Request optional extension permissions.", + "permissions": ["nativeMessaging", "geckoViewAddons"], + "granted_host_permissions": true, + "optional_permissions": ["geolocation", "*://example.com/*", "activeTab"] +} diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/optional-permission-request/request-permission.js b/mobile/android/geckoview/src/androidTest/assets/web_extensions/optional-permission-request/request-permission.js new file mode 100644 index 0000000000..bae3ceea6f --- /dev/null +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/optional-permission-request/request-permission.js @@ -0,0 +1,10 @@ +window.onload = () => { + document.body.addEventListener("click", async () => { + const perms = { + permissions: ["activeTab"], + origins: ["*://example.com/*"], + }; + const response = await browser.permissions.request(perms); + browser.runtime.sendNativeMessage("browser", `${response}`); + }); +}; diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/redirect-to-android-resource/background.js b/mobile/android/geckoview/src/androidTest/assets/web_extensions/redirect-to-android-resource/background.js index fdf088a505..e77d482e14 100644 --- a/mobile/android/geckoview/src/androidTest/assets/web_extensions/redirect-to-android-resource/background.js +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/redirect-to-android-resource/background.js @@ -2,7 +2,7 @@ function setupRedirect(fromUrl, redirectUrl) { browser.webRequest.onBeforeRequest.addListener( - details => { + () => { console.log(`Extension redirects from ${fromUrl} to ${redirectUrl}`); return { redirectUrl }; }, diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/test-support.js b/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/test-support.js index 18e047ca1a..f47f42d12e 100644 --- a/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/test-support.js +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/test-support.js @@ -30,7 +30,7 @@ function connectNativePort() { } }); - function sendResponse(id, response, exception) { + function sendResponse(id, response) { Promise.resolve(response).then( value => sendSyncResponse(id, value), reason => sendSyncResponse(id, null, reason) diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/update-postpone-1/background.js b/mobile/android/geckoview/src/androidTest/assets/web_extensions/update-postpone-1/background.js index a301506ca7..8266ad8258 100644 --- a/mobile/android/geckoview/src/androidTest/assets/web_extensions/update-postpone-1/background.js +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/update-postpone-1/background.js @@ -1,3 +1,3 @@ -browser.runtime.onUpdateAvailable.addListener(details => { +browser.runtime.onUpdateAvailable.addListener(() => { // Do nothing, this is just here to prevent auto update. }); diff --git a/mobile/android/geckoview/src/androidTest/assets/www/clickToReplace.html b/mobile/android/geckoview/src/androidTest/assets/www/clickToReplace.html new file mode 100644 index 0000000000..6d583586f1 --- /dev/null +++ b/mobile/android/geckoview/src/androidTest/assets/www/clickToReplace.html @@ -0,0 +1,10 @@ + + + + Hello, world! + + + +

Hello, world!

+ + diff --git a/mobile/android/geckoview/src/androidTest/assets/www/context_menu_blob_buffered.html b/mobile/android/geckoview/src/androidTest/assets/www/context_menu_blob_buffered.html index 9849747a41..950e48129e 100644 --- a/mobile/android/geckoview/src/androidTest/assets/www/context_menu_blob_buffered.html +++ b/mobile/android/geckoview/src/androidTest/assets/www/context_menu_blob_buffered.html @@ -8,7 +8,7 @@ diff --git a/mobile/android/geckoview/src/androidTest/assets/www/touch-action.html b/mobile/android/geckoview/src/androidTest/assets/www/touch-action.html index 62266b6ef7..bf315cfb7e 100644 --- a/mobile/android/geckoview/src/androidTest/assets/www/touch-action.html +++ b/mobile/android/geckoview/src/androidTest/assets/www/touch-action.html @@ -41,7 +41,7 @@ } div.style.touchAction = searchParams.get("touch-action"); if (searchParams.has("event")) { - div.addEventListener("touchstart", e => {}); + div.addEventListener("touchstart", () => {}); } diff --git a/mobile/android/geckoview/src/androidTest/assets/www/touch.html b/mobile/android/geckoview/src/androidTest/assets/www/touch.html index ba3bc098a9..6852a0f4fe 100644 --- a/mobile/android/geckoview/src/androidTest/assets/www/touch.html +++ b/mobile/android/geckoview/src/androidTest/assets/www/touch.html @@ -50,7 +50,7 @@ e.preventDefault(); }); - document.getElementById("three").addEventListener("touchstart", e => { + document.getElementById("three").addEventListener("touchstart", () => { console.log("not preventing default"); }); diff --git a/mobile/android/geckoview/src/androidTest/assets/www/touchstart.html b/mobile/android/geckoview/src/androidTest/assets/www/touchstart.html index 9ee1f461a7..42d1787ef1 100644 --- a/mobile/android/geckoview/src/androidTest/assets/www/touchstart.html +++ b/mobile/android/geckoview/src/androidTest/assets/www/touchstart.html @@ -31,7 +31,7 @@
diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AutocompleteTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AutocompleteTest.kt index fbfe2fe46d..dddba77768 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AutocompleteTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AutocompleteTest.kt @@ -2407,7 +2407,7 @@ class AutocompleteTest : BaseSessionTest() { "Hint should match", option.hint, equalTo(LoginSaveOption.Hint.GENERATED)) - */ + */ assertThat( "Password should not be empty", diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/BaseSessionTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/BaseSessionTest.kt index 655db7248f..d57cd8f157 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/BaseSessionTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/BaseSessionTest.kt @@ -36,6 +36,7 @@ open class BaseSessionTest( const val RESUBMIT_CONFIRM = "/assets/www/resubmit.html" const val BEFORE_UNLOAD = "/assets/www/beforeunload.html" const val CLICK_TO_RELOAD_HTML_PATH = "/assets/www/clickToReload.html" + const val CLICK_TO_REPLACE_HTML_PATH = "/assets/www/clickToReplace.html" const val CLIPBOARD_READ_HTML_PATH = "/assets/www/clipboard_read.html" const val CONTENT_CRASH_URL = "about:crashcontent" const val DND_HTML_PATH = "/assets/www/dnd.html" diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoAppShellTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoAppShellTest.kt index c05820012d..75204a2f5d 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoAppShellTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoAppShellTest.kt @@ -86,6 +86,7 @@ class GeckoAppShellTest : BaseSessionTest() { // This is waiting and holding the test harness open while Android Lifecycle events complete mainSession.waitUntilCalled(object : GeckoSession.ContentDelegate, GeckoSession.NavigationDelegate { @GeckoSessionTestRule.AssertCalled(count = 2) + @Suppress("OVERRIDE_DEPRECATION") override fun onLocationChange( session: GeckoSession, url: String?, diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoSessionTestRuleTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoSessionTestRuleTest.kt index d6380bf5bf..2ec305f913 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoSessionTestRuleTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoSessionTestRuleTest.kt @@ -1115,6 +1115,7 @@ class GeckoSessionTestRuleTest : BaseSessionTest(noErrorCollector = true) { @NullDelegate(NavigationDelegate::class) fun delegateDuringNextWait_throwOnNullDelegate() { mainSession.delegateDuringNextWait(object : NavigationDelegate { + @Suppress("OVERRIDE_DEPRECATION") override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { } }) diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeolocationTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeolocationTest.kt index 1bb568123c..4deac5fb66 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeolocationTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeolocationTest.kt @@ -72,8 +72,7 @@ class GeolocationTest : BaseSessionTest() { override fun onContentPermissionRequest( session: GeckoSession, perm: GeckoSession.PermissionDelegate.ContentPermission, - ): - GeckoResult { + ): GeckoResult { return GeckoResult.fromValue(GeckoSession.PermissionDelegate.ContentPermission.VALUE_ALLOW) } override fun onAndroidPermissionsRequest( diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/HistoryDelegateTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/HistoryDelegateTest.kt index 370594a93f..2d2f4bb4af 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/HistoryDelegateTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/HistoryDelegateTest.kt @@ -250,6 +250,11 @@ class HistoryDelegateTest : BaseSessionTest() { } @Test fun onHistoryStateChangeSavingState() { + // TODO: Bug 1884334 + val geckoPrefs = sessionRule.getPrefs( + "fission.disableSessionHistoryInParent", + ) + assumeThat(geckoPrefs[0] as Boolean, equalTo(true)) // TODO: Bug 1837551 assumeThat(sessionRule.env.isFission, equalTo(false)) diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/LocaleTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/LocaleTest.kt index 69deac1c89..608681d7d9 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/LocaleTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/LocaleTest.kt @@ -40,4 +40,16 @@ class LocaleTest : BaseSessionTest() { equalTo(listOf("en-GB", "en-US", "en-FR")), ) } + + @Test + fun acceptLangaugeFormat() { + // No way to override default language settings from unit test. + // So we only test this on current settings. + + val intlAcceptLanauge = "intl.accept_languages" + val prefValue = (sessionRule.getPrefs(intlAcceptLanauge)[0] as String).split(",") + for (value in prefValue) { + assertThat("Accept-Lanauge format should be language or language-region", value.filter { it == '-' }.count(), lessThanOrEqualTo(1)) + } + } } diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/NavigationDelegateTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/NavigationDelegateTest.kt index aab32cd01d..839ac4b468 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/NavigationDelegateTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/NavigationDelegateTest.kt @@ -67,8 +67,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat( "URI should be " + testLoader.getUri(), request.uri, @@ -123,6 +122,7 @@ class NavigationDelegateTest : BaseSessionTest() { if (errorPageUrl != null) { sessionRule.waitUntilCalled(object : ContentDelegate, NavigationDelegate { @AssertCalled(count = 1, order = [1]) + @Suppress("OVERRIDE_DEPRECATION") override fun onLocationChange( session: GeckoSession, url: String?, @@ -492,8 +492,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat("The URLs must match", request.uri, equalTo(forEachCall(uri, httpsUri))) return null } @@ -552,8 +551,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat("The URLs must match", request.uri, equalTo(forEachCall(uri, httpsUri))) return null } @@ -593,6 +591,7 @@ class NavigationDelegateTest : BaseSessionTest() { sessionRule.waitUntilCalled(object : ContentDelegate, NavigationDelegate { @AssertCalled(count = 1, order = [1]) + @Suppress("OVERRIDE_DEPRECATION") override fun onLocationChange( session: GeckoSession, url: String?, @@ -611,8 +610,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat("The URLs must match", request.uri, equalTo(forEachCall(uri, httpsUri))) return null } @@ -646,6 +644,7 @@ class NavigationDelegateTest : BaseSessionTest() { // No good way to wait for loading about:blank error page. Use onLocaitonChange etc. sessionRule.waitUntilCalled(object : ContentDelegate, NavigationDelegate { + @Suppress("OVERRIDE_DEPRECATION") override fun onLocationChange( session: GeckoSession, url: String?, @@ -665,8 +664,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { // We set http scheme only in case it's not iFrame assertThat("The URLs must match", request.uri, equalTo(uri)) return null @@ -717,8 +715,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat( "URI should be HTTP then redirected to HTTPS", request.uri, @@ -774,8 +771,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onSubframeLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat("URI should not be null", request.uri, notNullValue()) assertThat("URI should match", request.uri, endsWith(iframeUri)) return null @@ -862,8 +858,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat("Session should not be null", session, notNullValue()) assertThat("URI should not be null", request.uri, notNullValue()) assertThat( @@ -913,8 +908,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat("Session should not be null", session, notNullValue()) assertThat("App requested this load", request.isDirectNavigation, equalTo(true)) assertThat("URI should not be null", request.uri, notNullValue()) @@ -927,8 +921,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onSubframeLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat("Session should not be null", session, notNullValue()) assertThat("App did not request this load", request.isDirectNavigation, equalTo(false)) assertThat("URI should not be null", request.uri, notNullValue()) @@ -960,8 +953,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat("Session should not be null", session, notNullValue()) assertThat("URI should not be null", request.uri, notNullValue()) assertThat( @@ -1023,8 +1015,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat("URL should match", request.uri, equalTo(forEachCall(uri, redirectUri))) assertThat( "From app should be correct", @@ -1447,8 +1438,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat("Session should not be null", session, notNullValue()) assertThat("URI should not be null", request.uri, notNullValue()) assertThat("URI should match", request.uri, endsWith(HELLO_HTML_PATH)) @@ -1478,10 +1468,12 @@ class NavigationDelegateTest : BaseSessionTest() { session: GeckoSession, url: String?, perms: MutableList, + hasUserGesture: Boolean, ) { assertThat("Session should not be null", session, notNullValue()) assertThat("URL should not be null", url, notNullValue()) assertThat("URL should match", url, endsWith(HELLO_HTML_PATH)) + assertThat("Should not have user gesture", hasUserGesture, equalTo(false)) } @AssertCalled(count = 1, order = [2]) @@ -1514,8 +1506,10 @@ class NavigationDelegateTest : BaseSessionTest() { session: GeckoSession, url: String?, perms: MutableList, + hasUserGesture: Boolean, ) { assertThat("URL should match the provided data URL", url, equalTo(dataUrl)) + assertThat("Should not have user gesture", hasUserGesture, equalTo(false)) } @AssertCalled(count = 1) @@ -1542,6 +1536,7 @@ class NavigationDelegateTest : BaseSessionTest() { // Test that if we unset the navigation delegate during a load, the load still proceeds. var onLocationCount = 0 mainSession.navigationDelegate = object : NavigationDelegate { + @Suppress("OVERRIDE_DEPRECATION") override fun onLocationChange( session: GeckoSession, url: String?, @@ -1587,12 +1582,14 @@ class NavigationDelegateTest : BaseSessionTest() { session: GeckoSession, url: String?, perms: MutableList, + hasUserGesture: Boolean, ) { assertThat( "URL should be a data URL", url, equalTo(createDataUri(dataString, mimeType)), ) + assertThat("Should not have user gesture", hasUserGesture, equalTo(false)) } @AssertCalled(count = 1) @@ -1612,8 +1609,10 @@ class NavigationDelegateTest : BaseSessionTest() { session: GeckoSession, url: String?, perms: MutableList, + hasUserGesture: Boolean, ) { assertThat("URL should be a data URL", url, startsWith("data:")) + assertThat("Should not have user gesture", hasUserGesture, equalTo(false)) } @AssertCalled(count = 1) @@ -1641,8 +1640,10 @@ class NavigationDelegateTest : BaseSessionTest() { session: GeckoSession, url: String?, perms: MutableList, + hasUserGesture: Boolean, ) { assertThat("URL should match", url, equalTo(createDataUri(bytes, "text/html"))) + assertThat("Should not have user gesture", hasUserGesture, equalTo(false)) } @AssertCalled(count = 1) @@ -1683,8 +1684,10 @@ class NavigationDelegateTest : BaseSessionTest() { session: GeckoSession, url: String?, perms: MutableList, + hasUserGesture: Boolean, ) { assertThat("URL should match", url, equalTo(createDataUri(bytes, mimeType))) + assertThat("Should not have user gesture", hasUserGesture, equalTo(false)) } @AssertCalled(count = 1) @@ -1714,8 +1717,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat("URI should match", request.uri, endsWith(HELLO_HTML_PATH)) assertThat( "Trigger URL should be null", @@ -1740,8 +1742,10 @@ class NavigationDelegateTest : BaseSessionTest() { session: GeckoSession, url: String?, perms: MutableList, + hasUserGesture: Boolean, ) { assertThat("URL should match", url, endsWith(HELLO_HTML_PATH)) + assertThat("Should not have user gesture", hasUserGesture, equalTo(false)) } @AssertCalled(count = 1, order = [2]) @@ -1774,8 +1778,10 @@ class NavigationDelegateTest : BaseSessionTest() { session: GeckoSession, url: String?, perms: MutableList, + hasUserGesture: Boolean, ) { assertThat("URL should match", url, endsWith(HELLO2_HTML_PATH)) + assertThat("Should not have user gesture", hasUserGesture, equalTo(false)) } }) @@ -1787,8 +1793,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat( "Load should not be direct", request.isDirectNavigation, @@ -1802,8 +1807,10 @@ class NavigationDelegateTest : BaseSessionTest() { session: GeckoSession, url: String?, perms: MutableList, + hasUserGesture: Boolean, ) { assertThat("URL should match", url, endsWith(HELLO_HTML_PATH)) + assertThat("Should not have user gesture", hasUserGesture, equalTo(false)) } @AssertCalled(count = 1, order = [2]) @@ -1830,8 +1837,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat( "Load should not be direct", request.isDirectNavigation, @@ -1845,8 +1851,10 @@ class NavigationDelegateTest : BaseSessionTest() { session: GeckoSession, url: String?, perms: MutableList, + hasUserGesture: Boolean, ) { assertThat("URL should match", url, endsWith(HELLO2_HTML_PATH)) + assertThat("Should not have user gesture", hasUserGesture, equalTo(false)) } @AssertCalled(count = 1, order = [2]) @@ -1872,8 +1880,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { if (request.uri.endsWith(HELLO_HTML_PATH)) { return GeckoResult.deny() } else { @@ -1913,8 +1920,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat("URI should be correct", request.uri, endsWith(NEW_SESSION_CHILD_HTML_PATH)) assertThat( "Trigger URL should match", @@ -1969,8 +1975,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat("URI should be correct", request.uri, endsWith(NEW_SESSION_CHILD_HTML_PATH)) assertThat( "Trigger URL should be null", @@ -2080,8 +2085,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { // Pretend we handled the target="_blank" link click. if (request.uri.endsWith(NEW_SESSION_CHILD_HTML_PATH)) { return GeckoResult.deny() @@ -2102,8 +2106,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat( "URI must match", request.uri, @@ -2151,8 +2154,7 @@ class NavigationDelegateTest : BaseSessionTest() { mainSession.waitUntilCalled(object : NavigationDelegate { @AssertCalled(count = 1, order = [1]) - override fun onLoadRequest(session: GeckoSession, request: LoadRequest): - GeckoResult? { + override fun onLoadRequest(session: GeckoSession, request: LoadRequest): GeckoResult? { assertThat( "URL should be correct", request.uri, @@ -2172,8 +2174,7 @@ class NavigationDelegateTest : BaseSessionTest() { } @AssertCalled(count = 1, order = [2]) - override fun onNewSession(session: GeckoSession, uri: String): - GeckoResult? { + override fun onNewSession(session: GeckoSession, uri: String): GeckoResult? { assertThat("URL should be correct", uri, endsWith("form_blank.html?")) return null } @@ -2621,6 +2622,7 @@ class NavigationDelegateTest : BaseSessionTest() { session: GeckoSession, url: String?, perms: MutableList, + hasUserGesture: Boolean, ) { currentUrl = url } @@ -2702,8 +2704,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { assertThat( "Load should not be direct", request.isDirectNavigation, @@ -2717,8 +2718,10 @@ class NavigationDelegateTest : BaseSessionTest() { session: GeckoSession, url: String?, perms: MutableList, + hasUserGesture: Boolean, ) { assertThat("URI should match", url, endsWith("#test1")) + assertThat("Should not have user gesture", hasUserGesture, equalTo(false)) } }) @@ -2729,8 +2732,7 @@ class NavigationDelegateTest : BaseSessionTest() { override fun onLoadRequest( session: GeckoSession, request: LoadRequest, - ): - GeckoResult? { + ): GeckoResult? { return null } @@ -2739,13 +2741,20 @@ class NavigationDelegateTest : BaseSessionTest() { session: GeckoSession, url: String?, perms: MutableList, + hasUserGesture: Boolean, ) { assertThat("URI should match", url, endsWith("#test2")) + assertThat("Should not have user gesture", hasUserGesture, equalTo(false)) } }) } @Test fun purgeHistory() { + // TODO: Bug 1884334 + val geckoPrefs = sessionRule.getPrefs( + "fission.disableSessionHistoryInParent", + ) + assumeThat(geckoPrefs[0] as Boolean, equalTo(true)) // TODO: Bug 1837551 assumeThat(sessionRule.env.isFission, equalTo(false)) @@ -2830,6 +2839,54 @@ class NavigationDelegateTest : BaseSessionTest() { }) } + @WithDisplay(width = 100, height = 100) + @Test + fun locationReplaceOnUserGesture() { + mainSession.loadUri("$TEST_ENDPOINT$CLICK_TO_REPLACE_HTML_PATH") + mainSession.waitForPageStop() + + mainSession.synthesizeTap(50, 50) + + sessionRule.waitUntilCalled(object : NavigationDelegate { + @AssertCalled(count = 1) + override fun onLocationChange( + session: GeckoSession, + url: String?, + perms: MutableList, + hasUserGesture: Boolean, + ) { + assertThat("Should have a user gesture", hasUserGesture, equalTo(true)) + assertThat( + "Location should be replaced to replacedUrl", + url, + equalTo("replacedUrl"), + ) + } + }) + } + + @WithDisplay(width = 100, height = 100) + @Test + fun locationNotReplaceOnNoUserGesture() { + mainSession.loadUri("$TEST_ENDPOINT$HELLO_HTML_PATH") + sessionRule.waitForPageStop() + + sessionRule.forCallbacksDuringWait(object : NavigationDelegate { + @AssertCalled(count = 1, order = [2]) + override fun onLocationChange( + session: GeckoSession, + url: String?, + perms: MutableList, + hasUserGesture: Boolean, + ) { + assertThat("Session should not be null", session, notNullValue()) + assertThat("URL should not be null", url, notNullValue()) + assertThat("URL should match", url, endsWith(HELLO_HTML_PATH)) + assertThat("Should not have user gesture", hasUserGesture, equalTo(false)) + } + }) + } + @Test fun loadAfterLoad() { mainSession.delegateDuringNextWait(object : NavigationDelegate { @AssertCalled(count = 2) @@ -3078,6 +3135,11 @@ class NavigationDelegateTest : BaseSessionTest() { } @Test fun goBackFromHistory() { + // TODO: Bug 1884334 + val geckoPrefs = sessionRule.getPrefs( + "fission.disableSessionHistoryInParent", + ) + assumeThat(geckoPrefs[0] as Boolean, equalTo(true)) // TODO: Bug 1837551 assumeThat(sessionRule.env.isFission, equalTo(false)) @@ -3119,6 +3181,7 @@ class NavigationDelegateTest : BaseSessionTest() { var lastTitle: String? = "" sessionRule.delegateDuringNextWait(object : NavigationDelegate, ContentDelegate { @AssertCalled(count = 1) + @Suppress("OVERRIDE_DEPRECATION") override fun onLocationChange( session: GeckoSession, url: String?, diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/OpenWindowTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/OpenWindowTest.kt index 335535bbb4..b7aed020b4 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/OpenWindowTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/OpenWindowTest.kt @@ -64,7 +64,7 @@ class OpenWindowTest : BaseSessionTest() { @NullDelegate(ServiceWorkerDelegate::class) fun openWindowNullDelegate() { sessionRule.delegateUntilTestEnd(object : ContentDelegate, NavigationDelegate { - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { // we should not open the target url assertThat("URL should notmatch", url, not(createTestUrl(OPEN_WINDOW_TARGET_PATH))) } @@ -76,7 +76,7 @@ class OpenWindowTest : BaseSessionTest() { @Test fun openWindowNullResult() { sessionRule.delegateUntilTestEnd(object : ContentDelegate, NavigationDelegate { - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { // we should not open the target url assertThat("URL should notmatch", url, not(createTestUrl(OPEN_WINDOW_TARGET_PATH))) } @@ -103,7 +103,7 @@ class OpenWindowTest : BaseSessionTest() { openPageClickNotification() sessionRule.waitUntilCalled(object : ContentDelegate, NavigationDelegate { @AssertCalled(count = 1, order = [1]) - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { assertThat("Should be on the main session", session, equalTo(mainSession)) assertThat("URL should match", url, equalTo(createTestUrl(OPEN_WINDOW_TARGET_PATH))) } @@ -130,7 +130,7 @@ class OpenWindowTest : BaseSessionTest() { openPageClickNotification() sessionRule.waitUntilCalled(object : ContentDelegate, NavigationDelegate { @AssertCalled(count = 1, order = [1]) - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { assertThat("Should be on the target session", session, equalTo(targetSession)) assertThat("URL should match", url, equalTo(createTestUrl(OPEN_WINDOW_TARGET_PATH))) } diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/PdfCreationTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/PdfCreationTest.kt index 627c076fc4..de9f282484 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/PdfCreationTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/PdfCreationTest.kt @@ -177,4 +177,16 @@ class PdfCreationTest : BaseSessionTest() { } } } + + @NullDelegate(Autofill.Delegate::class) + @Test + fun dontTryToOpenNullContent() { + // Bug 1881927. + assumeThat(sessionRule.env.isIsolatedProcess, equalTo(false)) + activityRule.scenario.onActivity { + TestContentProvider.setNullTestData("application/pdf") + mainSession.loadUri("content://org.mozilla.geckoview.test.provider/pdf") + mainSession.waitForPageStop() + } + } } diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/PermissionDelegateTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/PermissionDelegateTest.kt index 9ab2d2515f..6b39d410eb 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/PermissionDelegateTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/PermissionDelegateTest.kt @@ -214,8 +214,7 @@ class PermissionDelegateTest : BaseSessionTest() { override fun onContentPermissionRequest( session: GeckoSession, perm: ContentPermission, - ): - GeckoResult { + ): GeckoResult { assertThat("URI should match", perm.uri, endsWith(url)) assertThat( "Type should match", @@ -275,7 +274,7 @@ class PermissionDelegateTest : BaseSessionTest() { mainSession.delegateDuringNextWait(object : NavigationDelegate { @AssertCalled(count = 1) - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { var permFound2 = false for (perm in perms) { if (perm.permission == PermissionDelegate.PERMISSION_GEOLOCATION && @@ -302,8 +301,7 @@ class PermissionDelegateTest : BaseSessionTest() { override fun onContentPermissionRequest( session: GeckoSession, perm: ContentPermission, - ): - GeckoResult { + ): GeckoResult { return GeckoResult.fromValue(ContentPermission.VALUE_DENY) } @@ -342,7 +340,7 @@ class PermissionDelegateTest : BaseSessionTest() { mainSession.delegateDuringNextWait(object : NavigationDelegate { @AssertCalled(count = 1) - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { var permFound2 = false for (perm in perms) { if (perm.permission == PermissionDelegate.PERMISSION_GEOLOCATION && @@ -462,6 +460,7 @@ class PermissionDelegateTest : BaseSessionTest() { session: GeckoSession, url: String?, perms: MutableList, + hasUserGesture: Boolean, ) { for (perm in perms) { if (perm.permission == PermissionDelegate.PERMISSION_TRACKING) { @@ -501,6 +500,7 @@ class PermissionDelegateTest : BaseSessionTest() { assertTrackingProtectionPermission(null) mainSession.loadTestPath(HELLO_HTML_PATH) + mainSession.waitForPageStop() assertTrackingProtectionPermission(ContentPermission.VALUE_DENY) } @@ -515,8 +515,7 @@ class PermissionDelegateTest : BaseSessionTest() { override fun onContentPermissionRequest( session: GeckoSession, perm: ContentPermission, - ): - GeckoResult { + ): GeckoResult { assertThat("URI should match", perm.uri, endsWith(url)) assertThat( "Type should match", @@ -551,7 +550,7 @@ class PermissionDelegateTest : BaseSessionTest() { mainSession.delegateDuringNextWait(object : NavigationDelegate { @AssertCalled(count = 1) - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { var permFound2 = false for (perm in perms) { if (perm.permission == PermissionDelegate.PERMISSION_DESKTOP_NOTIFICATION && @@ -587,8 +586,7 @@ class PermissionDelegateTest : BaseSessionTest() { override fun onContentPermissionRequest( session: GeckoSession, perm: ContentPermission, - ): - GeckoResult { + ): GeckoResult { return GeckoResult.fromValue(ContentPermission.VALUE_DENY) } }) @@ -617,7 +615,7 @@ class PermissionDelegateTest : BaseSessionTest() { mainSession.delegateDuringNextWait(object : NavigationDelegate { @AssertCalled(count = 1) - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { var permFound2 = false for (perm in perms) { if (perm.permission == PermissionDelegate.PERMISSION_DESKTOP_NOTIFICATION && @@ -649,8 +647,7 @@ class PermissionDelegateTest : BaseSessionTest() { mainSession.waitUntilCalled(object : PermissionDelegate { @AssertCalled(count = 2) - override fun onContentPermissionRequest(session: GeckoSession, perm: ContentPermission): - GeckoResult { + override fun onContentPermissionRequest(session: GeckoSession, perm: ContentPermission): GeckoResult { val expectedType = if (sessionRule.currentCall.counter == 1) PermissionDelegate.PERMISSION_AUTOPLAY_AUDIBLE else PermissionDelegate.PERMISSION_AUTOPLAY_INAUDIBLE assertThat("Type should match", perm.permission, equalTo(expectedType)) return GeckoResult.fromValue(ContentPermission.VALUE_DENY) @@ -670,8 +667,7 @@ class PermissionDelegateTest : BaseSessionTest() { override fun onContentPermissionRequest( session: GeckoSession, perm: ContentPermission, - ): - GeckoResult { + ): GeckoResult { assertThat("URI should match", perm.uri, endsWith(url)) assertThat( "Type should match", @@ -707,7 +703,7 @@ class PermissionDelegateTest : BaseSessionTest() { mainSession.delegateDuringNextWait(object : NavigationDelegate { @AssertCalled(count = 1) - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { var permFound2 = false for (perm in perms) { if (perm.permission == PermissionDelegate.PERMISSION_DESKTOP_NOTIFICATION && @@ -736,8 +732,7 @@ class PermissionDelegateTest : BaseSessionTest() { override fun onContentPermissionRequest( session: GeckoSession, perm: ContentPermission, - ): - GeckoResult { + ): GeckoResult { assertThat("URI should match", perm.uri, endsWith(url)) assertThat( "Type should match", @@ -777,7 +772,7 @@ class PermissionDelegateTest : BaseSessionTest() { session2.delegateDuringNextWait(object : NavigationDelegate { @AssertCalled(count = 1) - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { var permFound2 = false for (perm in perms) { if (perm.permission == PermissionDelegate.PERMISSION_DESKTOP_NOTIFICATION && @@ -805,8 +800,7 @@ class PermissionDelegateTest : BaseSessionTest() { override fun onContentPermissionRequest( session: GeckoSession, perm: ContentPermission, - ): - GeckoResult { + ): GeckoResult { assertThat("URI should match", perm.uri, endsWith(url)) assertThat( "Type should match", @@ -841,7 +835,7 @@ class PermissionDelegateTest : BaseSessionTest() { mainSession.delegateDuringNextWait(object : NavigationDelegate { @AssertCalled(count = 1) - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { var permFound2 = false for (perm in perms) { if (perm.permission == PermissionDelegate.PERMISSION_DESKTOP_NOTIFICATION && @@ -876,8 +870,7 @@ class PermissionDelegateTest : BaseSessionTest() { override fun onContentPermissionRequest( session: GeckoSession, perm: ContentPermission, - ): - GeckoResult { + ): GeckoResult { assertThat("URI should match", perm.uri, endsWith(url)) assertThat( "Type should match", @@ -919,7 +912,7 @@ class PermissionDelegateTest : BaseSessionTest() { mainSession.delegateDuringNextWait(object : NavigationDelegate { @AssertCalled(count = 1) - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { var permFound2 = false for (perm in perms) { if (perm.permission == PermissionDelegate.PERMISSION_DESKTOP_NOTIFICATION && @@ -954,8 +947,7 @@ class PermissionDelegateTest : BaseSessionTest() { override fun onContentPermissionRequest( session: GeckoSession, perm: ContentPermission, - ): - GeckoResult { + ): GeckoResult { assertThat("URI should match", perm.uri, endsWith(url)) assertThat( "Type should match", @@ -1000,8 +992,7 @@ class PermissionDelegateTest : BaseSessionTest() { override fun onContentPermissionRequest( session: GeckoSession, perm: ContentPermission, - ): - GeckoResult { + ): GeckoResult { return GeckoResult.fromValue(ContentPermission.VALUE_PROMPT) } }) @@ -1026,8 +1017,7 @@ class PermissionDelegateTest : BaseSessionTest() { override fun onContentPermissionRequest( session: GeckoSession, perm: ContentPermission, - ): - GeckoResult { + ): GeckoResult { assertThat("URI should match", perm.uri, endsWith(url)) assertThat( "Type should match", diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ProgressDelegateTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ProgressDelegateTest.kt index 3097452da8..f8046ed2ed 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ProgressDelegateTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ProgressDelegateTest.kt @@ -33,7 +33,7 @@ class ProgressDelegateTest : BaseSessionTest() { ProgressDelegate, NavigationDelegate { @AssertCalled - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { assertThat("LocationChange is called", url, endsWith(path)) } @@ -448,6 +448,11 @@ class ProgressDelegateTest : BaseSessionTest() { @WithDisplay(width = 400, height = 400) @Test fun saveAndRestoreStateNewSession() { + // TODO: Bug 1884334 + val geckoPrefs = sessionRule.getPrefs( + "fission.disableSessionHistoryInParent", + ) + assumeThat(geckoPrefs[0] as Boolean, equalTo(true)) // TODO: Bug 1837551 assumeThat(sessionRule.env.isFission, equalTo(false)) val helloUri = createTestUrl(HELLO_HTML_PATH) @@ -467,6 +472,7 @@ class ProgressDelegateTest : BaseSessionTest() { session: GeckoSession, url: String?, perms: MutableList, + hasUserGesture: Boolean, ) { assertThat("URI should match", url, equalTo(startUri)) } @@ -487,7 +493,7 @@ class ProgressDelegateTest : BaseSessionTest() { session.goBack() session.waitUntilCalled(object : NavigationDelegate { - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { assertThat("History should be preserved", url, equalTo(helloUri)) } }) @@ -511,7 +517,7 @@ class ProgressDelegateTest : BaseSessionTest() { sessionRule.forCallbacksDuringWait(object : NavigationDelegate { @AssertCalled - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { assertThat("URI should match", url, equalTo(startUri)) } }) @@ -532,6 +538,11 @@ class ProgressDelegateTest : BaseSessionTest() { @WithDisplay(width = 400, height = 400) @Test fun flushSessionState() { + // TODO: Bug 1884334 + val geckoPrefs = sessionRule.getPrefs( + "fission.disableSessionHistoryInParent", + ) + assumeThat(geckoPrefs[0] as Boolean, equalTo(true)) // TODO: Bug 1837551 assumeThat(sessionRule.env.isFission, equalTo(false)) val startUri = createTestUrl(SAVE_STATE_PATH) @@ -568,6 +579,11 @@ class ProgressDelegateTest : BaseSessionTest() { @NullDelegate(GeckoSession.HistoryDelegate::class) @Test fun noHistoryDelegateOnSessionStateChange() { + // TODO: Bug 1884334 + val geckoPrefs = sessionRule.getPrefs( + "fission.disableSessionHistoryInParent", + ) + assumeThat(geckoPrefs[0] as Boolean, equalTo(true)) // TODO: Bug 1837551 assumeThat(sessionRule.env.isFission, equalTo(false)) mainSession.loadTestPath(HELLO_HTML_PATH) diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/RuntimeSettingsTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/RuntimeSettingsTest.kt index 6504af8a4c..2b690726f3 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/RuntimeSettingsTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/RuntimeSettingsTest.kt @@ -277,8 +277,7 @@ class RuntimeSettingsTest : BaseSessionTest() { mainSession.loadUri("about:config") mainSession.waitUntilCalled(object : NavigationDelegate { @AssertCalled - override fun onLoadError(session: GeckoSession, uri: String?, error: WebRequestError): - GeckoResult? { + override fun onLoadError(session: GeckoSession, uri: String?, error: WebRequestError): GeckoResult? { assertThat("about:config should not load.", uri, equalTo("about:config")) return null } diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ScreenshotTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ScreenshotTest.kt index cee16f3f4c..f3141c661c 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ScreenshotTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ScreenshotTest.kt @@ -203,6 +203,11 @@ class ScreenshotTest : BaseSessionTest() { @WithDisplay(height = SCREEN_HEIGHT, width = SCREEN_WIDTH) @Test fun capturePixelsWhileSessionDeactivated() { + // TODO: Bug 1884334 + val geckoPrefs = sessionRule.getPrefs( + "fission.disableSessionHistoryInParent", + ) + assumeThat(geckoPrefs[0] as Boolean, equalTo(true)) // TODO: Bug 1837551 assumeThat(sessionRule.env.isFission, equalTo(false)) val screenshotFile = getComparisonScreenshot(SCREEN_WIDTH, SCREEN_HEIGHT) diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/SelectionActionDelegateTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/SelectionActionDelegateTest.kt index e5e8ec6ce2..d3e52cda6a 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/SelectionActionDelegateTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/SelectionActionDelegateTest.kt @@ -393,8 +393,7 @@ class SelectionActionDelegateTest : BaseSessionTest() { override fun onShowClipboardPermissionRequest( session: GeckoSession, perm: ClipboardPermission, - ): - GeckoResult { + ): GeckoResult { assertThat( "Type should match", perm.type, @@ -408,8 +407,7 @@ class SelectionActionDelegateTest : BaseSessionTest() { override fun onAlertPrompt( session: GeckoSession, prompt: PromptDelegate.AlertPrompt, - ): - GeckoResult { + ): GeckoResult { assertThat("Message should match", "allow", equalTo(prompt.message)) result.complete(null) return GeckoResult.fromValue(prompt.dismiss()) @@ -440,8 +438,7 @@ class SelectionActionDelegateTest : BaseSessionTest() { override fun onShowClipboardPermissionRequest( session: GeckoSession, perm: ClipboardPermission, - ): - GeckoResult? { + ): GeckoResult? { assertThat( "Type should match", perm.type, @@ -454,8 +451,7 @@ class SelectionActionDelegateTest : BaseSessionTest() { override fun onAlertPrompt( session: GeckoSession, prompt: PromptDelegate.AlertPrompt, - ): - GeckoResult { + ): GeckoResult { assertThat("Message should match", "deny", equalTo(prompt.message)) result.complete(null) return GeckoResult.fromValue(prompt.dismiss()) @@ -486,8 +482,7 @@ class SelectionActionDelegateTest : BaseSessionTest() { override fun onShowClipboardPermissionRequest( session: GeckoSession, perm: ClipboardPermission, - ): - GeckoResult? { + ): GeckoResult? { assertThat( "Type should match", perm.type, @@ -533,8 +528,7 @@ class SelectionActionDelegateTest : BaseSessionTest() { override fun onShowClipboardPermissionRequest( session: GeckoSession, perm: ClipboardPermission, - ): - GeckoResult? { + ): GeckoResult? { assertThat( "Type should match", perm.type, diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TestContentProvider.java b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TestContentProvider.java index 787448a859..b0591b693e 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TestContentProvider.java +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TestContentProvider.java @@ -18,6 +18,7 @@ public class TestContentProvider extends ContentProvider { private static final String LOGTAG = "TestContentProvider"; private static byte[] sTestData; private static String sMimeType; + private static boolean sAllowNullData = false; @Override public boolean onCreate() { @@ -62,7 +63,10 @@ public class TestContentProvider extends ContentProvider { public ParcelFileDescriptor openFile(final Uri uri, final String mode) throws FileNotFoundException { if (sTestData == null) { - throw new FileNotFoundException("No test data for: " + uri); + if (!sAllowNullData) { + throw new FileNotFoundException("No test data for: " + uri); + } + return null; } ParcelFileDescriptor[] pipe = null; @@ -98,6 +102,19 @@ public class TestContentProvider extends ContentProvider { */ public static void setTestData(final byte[] data, final String mimeType) { sTestData = data; + sAllowNullData = false; + sMimeType = mimeType; + } + + /** + * Set null that is used from content resolver but don't throw when calling openFile. + * + * @param data test data + * @param mimeType A mime type of test data. + */ + public static void setNullTestData(final String mimeType) { + sTestData = null; + sAllowNullData = true; sMimeType = mimeType; } } diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TextInputDelegateTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TextInputDelegateTest.kt index 7e4015a246..ca21d0a61d 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TextInputDelegateTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TextInputDelegateTest.kt @@ -537,7 +537,8 @@ class TextInputDelegateTest : BaseSessionTest() { "Can commit text (select before)", ic, "foobarfoo", - 5, /* checkGecko */ + 5, + /* checkGecko */ false, ) } @@ -641,7 +642,8 @@ class TextInputDelegateTest : BaseSessionTest() { "Can set new composing region text", ic, "frabar", - 6, /* checkGecko */ + 6, + /* checkGecko */ false, ) @@ -826,7 +828,13 @@ class TextInputDelegateTest : BaseSessionTest() { }.joinToString("") setupContent(content) val ic = mainSession.textInput.onCreateInputConnection(EditorInfo())!! - assertText("Can set large initial text", ic, content, /* checkGecko */ false) + assertText( + "Can set large initial text", + ic, + content, + /* checkGecko */ + false, + ) } @SdkSuppress(minSdkVersion = Build.VERSION_CODES.N_MR1) @@ -1279,6 +1287,25 @@ class TextInputDelegateTest : BaseSessionTest() { assertText("commit abc", ic, "abc") } + // Bug 1837931 - When 2nd commitText uses -1 as newCursorPosition into batch mode, text + // cannot insert correct position. + @WithDisplay(width = 512, height = 512) + // Child process updates require having a display. + @Test + fun inputConnection_multiple_commitText_into_batchEdit() { + setupContent("") + val ic = mainSession.textInput.onCreateInputConnection(EditorInfo())!! + + // Emulate GBoard's InputConnection API calls + ic.beginBatchEdit() + ic.commitText("( ", 1) + ic.commitText(")", -1) + ic.endBatchEdit() + processChildEvents() + + assertText("commit ()", ic, "( )") + } + // Bug 1593683 - Cursor is jumping when using the arrow keys in input field on GBoard @WithDisplay(width = 512, height = 512) // Child process updates require having a display. @@ -1294,7 +1321,14 @@ class TextInputDelegateTest : BaseSessionTest() { pressKey(ic, KeyEvent.KEYCODE_DPAD_LEFT) pressKey(ic, KeyEvent.KEYCODE_DPAD_LEFT) pressKey(ic, KeyEvent.KEYCODE_DPAD_LEFT) - assertSelection("IME caret is moved to top", ic, 0, 0, /* checkGecko */ false) + assertSelection( + "IME caret is moved to top", + ic, + 0, + 0, + /* checkGecko */ + false, + ) setComposingText(ic, "bar", 1) finishComposingText(ic) diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TrackingPermissionService.java b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TrackingPermissionService.java index 141849589e..4b7bcabee5 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TrackingPermissionService.java +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TrackingPermissionService.java @@ -36,7 +36,8 @@ public class TrackingPermissionService extends TestRuntimeService { public void onLocationChange( final @NonNull GeckoSession session, final @Nullable String url, - final @NonNull List perms) { + final @NonNull List perms, + final @NonNull Boolean hasUserGesture) { for (ContentPermission perm : perms) { if (perm.permission == PermissionDelegate.PERMISSION_TRACKING) { mContentPermission = perm; diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/VideoCaptureTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/VideoCaptureTest.kt new file mode 100644 index 0000000000..7e1f8b1275 --- /dev/null +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/VideoCaptureTest.kt @@ -0,0 +1,58 @@ +package org.mozilla.geckoview.test + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith +import org.webrtc.CameraEnumerationAndroid.CaptureFormat +import org.webrtc.CameraEnumerator +import org.webrtc.CameraVideoCapturer +import org.webrtc.CameraVideoCapturer.CameraEventsHandler +import org.webrtc.videoengine.VideoCaptureAndroid + +@RunWith(AndroidJUnit4::class) +@SmallTest +class VideoCaptureTest { + // Always throw exception. + class BadCameraEnumerator : CameraEnumerator { + override fun getDeviceNames(): Array? { + throw java.lang.RuntimeException("") + } + + override fun isFrontFacing(deviceName: String?): Boolean { + throw java.lang.RuntimeException("") + } + + override fun isBackFacing(deviceName: String?): Boolean { + throw java.lang.RuntimeException("") + } + + override fun isInfrared(deviceName: String?): Boolean { + throw java.lang.RuntimeException("") + } + + override fun getSupportedFormats(deviceName: String?): List? { + throw java.lang.RuntimeException("") + } + + override fun createCapturer( + deviceName: String?, + eventsHandler: CameraEventsHandler?, + ): CameraVideoCapturer? { + throw java.lang.RuntimeException("") + } + } + + @Test + fun constructWithBadEnumerator() { + val ctr = VideoCaptureAndroid::class.java.getDeclaredConstructors()[0].apply { isAccessible = true } + val capture = ctr.newInstance( + InstrumentationRegistry.getInstrumentation().targetContext, + "my camera", + BadCameraEnumerator(), + ) as VideoCaptureAndroid + assertEquals(false, capture.canCapture()) + } +} diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebExtensionTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebExtensionTest.kt index 126e52da34..702ba4d23b 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebExtensionTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebExtensionTest.kt @@ -7,6 +7,7 @@ package org.mozilla.geckoview.test import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.MediumTest import org.hamcrest.MatcherAssert.assertThat +import org.hamcrest.Matchers import org.hamcrest.Matchers.greaterThan import org.hamcrest.core.IsEqual.equalTo import org.hamcrest.core.StringEndsWith.endsWith @@ -90,6 +91,14 @@ class WebExtensionTest : BaseSessionTest() { assertTrue(borderify.isBuiltIn) + assertArrayEquals( + arrayOf("*://developer.mozilla.org/*"), + borderify.metaData.optionalOrigins, + ) + assertArrayEquals( + arrayOf("clipboardRead"), + borderify.metaData.optionalPermissions, + ) mainSession.reload() sessionRule.waitForPageStop() @@ -109,6 +118,156 @@ class WebExtensionTest : BaseSessionTest() { assertBodyBorderEqualTo("") } + @Test + fun verifyOptionalAndOriginsPermissionsMV3() { + mainSession.loadUri("https://example.com") + sessionRule.waitForPageStop() + + // First let's check that the color of the border is empty before loading + // the WebExtension + assertBodyBorderEqualTo("") + + // Load the WebExtension that will add a border to the body + val borderify = sessionRule.waitForResult( + controller.installBuiltIn( + "resource://android/assets/web_extensions/borderify-mv3/", + ), + ) + + assertArrayEquals( + arrayOf("clipboardRead"), + borderify.metaData.optionalPermissions, + ) + + val expectedOptionalOrigins = arrayOf( + "*://*.example.com/*", + "*://opt-host-perm.example.com/*", + "*://host-perm.example.com/*", + ) + + expectedOptionalOrigins.sort() + borderify.metaData.optionalOrigins.sort() + + assertArrayEquals( + expectedOptionalOrigins, + borderify.metaData.optionalOrigins, + ) + + mainSession.reload() + sessionRule.waitForPageStop() + + // Check that the WebExtension was applied by checking the border color + assertBodyBorderEqualTo("red") + + // Uninstall WebExtension and check again + sessionRule.waitForResult(controller.uninstall(borderify)) + + mainSession.reload() + sessionRule.waitForPageStop() + + // Check that the WebExtension was not applied after being uninstalled + assertBodyBorderEqualTo("") + } + + @WithDisplay(width = 100, height = 100) + @Test + fun grantedOptionalPermissions() { + sessionRule.setPrefsUntilTestEnd( + mapOf( + "xpinstall.signatures.required" to false, + "extensions.install.requireBuiltInCerts" to false, + "extensions.update.requireBuiltInCerts" to false, + ), + ) + + val extension = sessionRule.waitForResult( + controller.ensureBuiltIn( + "resource://android/assets/web_extensions/optional-permission-request/", + "optional-permission-request@example.com", + ), + ) + + assertEquals("optional-permission-request@example.com", extension.id) + + mainSession.loadUri("${extension.metaData.baseUrl}clickToRequestPermission.html") + sessionRule.waitForPageStop() + + var grantedOptionalPermissions = extension.metaData.grantedOptionalPermissions + var grantedOptionalOrigins = extension.metaData.grantedOptionalOrigins + + assertThat( + "grantedOptionalPermissions must be 0.", + grantedOptionalPermissions.size, + equalTo(0), + ) + assertThat("grantedOptionalOrigins must be 0.", grantedOptionalOrigins.size, equalTo(0)) + + // click triggers permissions.request + mainSession.synthesizeTap(50, 50) + + sessionRule.delegateUntilTestEnd(object : WebExtensionController.PromptDelegate { + override fun onOptionalPrompt( + extension: WebExtension, + permissions: Array, + origins: Array, + ): GeckoResult { + return GeckoResult.allow() + } + }) + + var result = GeckoResult() + mainSession.webExtensionController.setMessageDelegate( + extension, + object : WebExtension.MessageDelegate { + override fun onMessage( + nativeApp: String, + message: Any, + sender: WebExtension.MessageSender, + ): GeckoResult? { + result.complete(message as String) + return null + } + }, + "browser", + ) + + result = GeckoResult() + val message = sessionRule.waitForResult(result) + assertThat("Permission request should be accepted.", message, equalTo("true")) + + val updatedExtension = sessionRule.waitForResult( + // Adds "internal:privateBrowsingAllowed" + controller.setAllowedInPrivateBrowsing(extension, true), + ) + + grantedOptionalPermissions = updatedExtension.metaData.grantedOptionalPermissions + grantedOptionalOrigins = updatedExtension.metaData.grantedOptionalOrigins + + assertThat( + "grantedOptionalPermissions must be 1.", + grantedOptionalPermissions.size, + equalTo(1), + ) + assertThat("grantedOptionalOrigins must be 1.", grantedOptionalOrigins.size, equalTo(1)) + assertThat( + "grantedOptionalOrigins must be *://example.com/*.", + grantedOptionalOrigins.first(), + equalTo("*://example.com/*"), + ) + + // geolocation is part of the manifest but not requested/granted. + assertFalse(grantedOptionalPermissions.contains("geolocation")) + + // "internal:privateBrowsingAllowed" must not be part of grantedOptionalPermissions. + assertThat( + "grantedOptionalPermissions must be activeTab.", + grantedOptionalPermissions.first(), + equalTo("activeTab"), + ) + + sessionRule.waitForResult(controller.uninstall(extension)) + } + private fun assertBodyBorderEqualTo(expected: String) { val color = mainSession.evaluateJS("document.body.style.borderColor") assertThat( @@ -1618,6 +1777,11 @@ class WebExtensionTest : BaseSessionTest() { // - verifies that the messages are received when restoring the tab in a fresh session @Test fun testRestoringExtensionPagePreservesMessages() { + // TODO: Bug 1884334 + val geckoPrefs = sessionRule.getPrefs( + "fission.disableSessionHistoryInParent", + ) + assumeThat(geckoPrefs[0] as Boolean, Matchers.equalTo(true)) // TODO: Bug 1837551 assumeThat(sessionRule.env.isFission, equalTo(false)) @@ -2138,7 +2302,7 @@ class WebExtensionTest : BaseSessionTest() { mainSession.waitUntilCalled(object : NavigationDelegate, ProgressDelegate { @GeckoSessionTestRule.AssertCalled(count = 1) - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { assertThat( "Url should load example.com first", url, @@ -2160,7 +2324,7 @@ class WebExtensionTest : BaseSessionTest() { val pageStop = GeckoResult() mainSession.delegateUntilTestEnd(object : NavigationDelegate, ProgressDelegate { - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList, hasUserGesture: Boolean) { page = url } diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebNotificationTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebNotificationTest.kt index 469fd049ce..358134313a 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebNotificationTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebNotificationTest.kt @@ -31,8 +31,7 @@ class WebNotificationTest : BaseSessionTest() { // Grant "desktop notification" permission mainSession.delegateUntilTestEnd(object : PermissionDelegate { - override fun onContentPermissionRequest(session: GeckoSession, perm: PermissionDelegate.ContentPermission): - GeckoResult? { + override fun onContentPermissionRequest(session: GeckoSession, perm: PermissionDelegate.ContentPermission): GeckoResult? { assertThat("Should grant DESKTOP_NOTIFICATIONS permission", perm.permission, equalTo(PermissionDelegate.PERMISSION_DESKTOP_NOTIFICATION)) return GeckoResult.fromValue(PermissionDelegate.ContentPermission.VALUE_ALLOW) } @@ -336,7 +335,11 @@ class WebNotificationTest : BaseSessionTest() { // Test that we can serialize a notification val parcel = Parcel.obtain() - notification.writeToParcel(parcel, /* ignored */ -1) + notification.writeToParcel( + parcel, + /* ignored */ + -1, + ) assertThat("Promise should have been resolved.", promiseResult.value as Double, equalTo(1.0)) } @@ -375,7 +378,11 @@ class WebNotificationTest : BaseSessionTest() { // Test that we can serialize a notification with an imageUrl.length >= 150 val parcel = Parcel.obtain() - notification.writeToParcel(parcel, /* ignored */ -1) + notification.writeToParcel( + parcel, + /* ignored */ + -1, + ) parcel.setDataPosition(0) val serializedNotification = WebNotification.CREATOR.createFromParcel(parcel) diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebPushTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebPushTest.kt index a2e6d58f3a..609275526c 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebPushTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebPushTest.kt @@ -60,8 +60,7 @@ class WebPushTest : BaseSessionTest() { sessionRule.setPrefsUntilTestEnd(mapOf("dom.webnotifications.requireuserinteraction" to false)) // Grant "desktop notification" permission mainSession.delegateUntilTestEnd(object : PermissionDelegate { - override fun onContentPermissionRequest(session: GeckoSession, perm: GeckoSession.PermissionDelegate.ContentPermission): - GeckoResult? { + override fun onContentPermissionRequest(session: GeckoSession, perm: GeckoSession.PermissionDelegate.ContentPermission): GeckoResult? { assertThat("Should grant DESKTOP_NOTIFICATIONS permission", perm.permission, equalTo(GeckoSession.PermissionDelegate.PERMISSION_DESKTOP_NOTIFICATION)) return GeckoResult.fromValue(GeckoSession.PermissionDelegate.ContentPermission.VALUE_ALLOW) } diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java index 9c9a9d6188..727f403931 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java @@ -831,7 +831,8 @@ public class GeckoSessionTestRule implements TestRule { public void onLocationChange( @NonNull GeckoSession session, @Nullable String url, - @NonNull List perms) {} + @NonNull List perms, + @NonNull Boolean hasUserGesture) {} @Override public void onShutdown() {} -- cgit v1.2.3