diff options
Diffstat (limited to 'mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebExtensionTest.kt')
-rw-r--r-- | mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebExtensionTest.kt | 168 |
1 files changed, 166 insertions, 2 deletions
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<String>, + origins: Array<String>, + ): GeckoResult<AllowOrDeny> { + return GeckoResult.allow() + } + }) + + var result = GeckoResult<String>() + mainSession.webExtensionController.setMessageDelegate( + extension, + object : WebExtension.MessageDelegate { + override fun onMessage( + nativeApp: String, + message: Any, + sender: WebExtension.MessageSender, + ): GeckoResult<Any>? { + result.complete(message as String) + return null + } + }, + "browser", + ) + + result = GeckoResult<String>() + 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<PermissionDelegate.ContentPermission>) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList<PermissionDelegate.ContentPermission>, hasUserGesture: Boolean) { assertThat( "Url should load example.com first", url, @@ -2160,7 +2324,7 @@ class WebExtensionTest : BaseSessionTest() { val pageStop = GeckoResult<Boolean>() mainSession.delegateUntilTestEnd(object : NavigationDelegate, ProgressDelegate { - override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList<PermissionDelegate.ContentPermission>) { + override fun onLocationChange(session: GeckoSession, url: String?, perms: MutableList<PermissionDelegate.ContentPermission>, hasUserGesture: Boolean) { page = url } |