Loading components/browser/engine-gecko-nightly/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngineSession.kt +14 −2 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import mozilla.components.concept.storage.RedirectSource import mozilla.components.concept.storage.VisitType import mozilla.components.support.ktx.android.util.Base64 import mozilla.components.support.ktx.kotlin.isEmail import mozilla.components.support.ktx.kotlin.isExtensionUrl import mozilla.components.support.ktx.kotlin.isGeoLocation import mozilla.components.support.ktx.kotlin.isPhone import mozilla.components.support.ktx.kotlin.tryGetHostFromUrl Loading Loading @@ -93,7 +94,7 @@ class GeckoEngineSession( set(value) { geckoSession.settings.suspendMediaWhenInactive = value } } private var initialLoad = true internal var initialLoad = true override val coroutineContext: CoroutineContext get() = context + job Loading Loading @@ -352,7 +353,9 @@ class GeckoEngineSession( return // ¯\_(ツ)_/¯ } // Ignore initial load of about:blank (see https://github.com/mozilla-mobile/android-components/issues/403) // Ignore initial loads of about:blank, see: // https://github.com/mozilla-mobile/android-components/issues/403 // https://github.com/mozilla-mobile/android-components/issues/6832 if (initialLoad && url == ABOUT_BLANK) { return } Loading @@ -375,6 +378,15 @@ class GeckoEngineSession( return GeckoResult.fromValue(AllowOrDeny.ALLOW) } // The process switch involved when loading extension pages will // trigger an initial load of about:blank which we want to // avoid: // https://github.com/mozilla-mobile/android-components/issues/6832 // https://github.com/mozilla-mobile/android-components/issues/403 if (currentUrl?.isExtensionUrl() != request.uri.isExtensionUrl()) { initialLoad = true } val interceptor = settings.requestInterceptor val response = if ( interceptor != null && (!request.isDirectNavigation || interceptor.interceptsAppInitiatedRequests()) Loading components/browser/engine-gecko-nightly/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineSessionTest.kt +31 −0 Original line number Diff line number Diff line Loading @@ -567,6 +567,37 @@ class GeckoEngineSessionTest { assertEquals("about:blank", observedUrl) } @Test fun `onLoadRequest will reset initial load flag on process switch to ignore about blank loads`() { val geckoResult = GeckoResult<Boolean?>() val mockedContentBlockingController = mock<ContentBlockingController>() whenever(runtime.contentBlockingController).thenReturn(mockedContentBlockingController) whenever(mockedContentBlockingController.checkException(any())).thenReturn(geckoResult) val session = GeckoEngineSession(runtime, geckoSessionProvider = geckoSessionProvider) captureDelegates() assertTrue(session.initialLoad) navigationDelegate.value.onLocationChange(mock(), "https://mozilla.org") assertFalse(session.initialLoad) navigationDelegate.value.onLoadRequest(mock(), mockLoadRequest("moz-extension://1234-test")) assertTrue(session.initialLoad) var observedUrl = "" session.register(object : EngineSession.Observer { override fun onLocationChange(url: String) { observedUrl = url } }) navigationDelegate.value.onLocationChange(mock(), "about:blank") assertEquals("", observedUrl) navigationDelegate.value.onLocationChange(mock(), "https://www.mozilla.org") assertEquals("https://www.mozilla.org", observedUrl) navigationDelegate.value.onLocationChange(mock(), "about:blank") assertEquals("about:blank", observedUrl) } @Test fun `do not keep track of current url via onPageStart events`() { val engineSession = GeckoEngineSession(mock(), Loading components/support/ktx/src/main/java/mozilla/components/support/ktx/kotlin/String.kt +5 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,11 @@ private val re = object { */ fun String.isUrl() = URLStringUtils.isURLLike(this) /** * Checks if this String is a URL of an extension page. */ fun String.isExtensionUrl() = this.startsWith("moz-extension://") /** * Checks if this string is a URL. * Loading components/support/ktx/src/test/java/mozilla/components/support/ktx/kotlin/StringTest.kt +8 −0 Original line number Diff line number Diff line Loading @@ -175,4 +175,12 @@ class StringTest { assertTrue("https://foo.bar".isSameOriginAs("https://foo.bar:443")) assertTrue("https://foo.bar:333".isSameOriginAs("https://foo.bar:333")) } @Test fun isExtensionUrl() { assertTrue("moz-extension://1232-abcd".isExtensionUrl()) assertFalse("mozilla.org".isExtensionUrl()) assertFalse("https://mozilla.org".isExtensionUrl()) assertFalse("http://mozilla.org".isExtensionUrl()) } } Loading
components/browser/engine-gecko-nightly/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngineSession.kt +14 −2 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import mozilla.components.concept.storage.RedirectSource import mozilla.components.concept.storage.VisitType import mozilla.components.support.ktx.android.util.Base64 import mozilla.components.support.ktx.kotlin.isEmail import mozilla.components.support.ktx.kotlin.isExtensionUrl import mozilla.components.support.ktx.kotlin.isGeoLocation import mozilla.components.support.ktx.kotlin.isPhone import mozilla.components.support.ktx.kotlin.tryGetHostFromUrl Loading Loading @@ -93,7 +94,7 @@ class GeckoEngineSession( set(value) { geckoSession.settings.suspendMediaWhenInactive = value } } private var initialLoad = true internal var initialLoad = true override val coroutineContext: CoroutineContext get() = context + job Loading Loading @@ -352,7 +353,9 @@ class GeckoEngineSession( return // ¯\_(ツ)_/¯ } // Ignore initial load of about:blank (see https://github.com/mozilla-mobile/android-components/issues/403) // Ignore initial loads of about:blank, see: // https://github.com/mozilla-mobile/android-components/issues/403 // https://github.com/mozilla-mobile/android-components/issues/6832 if (initialLoad && url == ABOUT_BLANK) { return } Loading @@ -375,6 +378,15 @@ class GeckoEngineSession( return GeckoResult.fromValue(AllowOrDeny.ALLOW) } // The process switch involved when loading extension pages will // trigger an initial load of about:blank which we want to // avoid: // https://github.com/mozilla-mobile/android-components/issues/6832 // https://github.com/mozilla-mobile/android-components/issues/403 if (currentUrl?.isExtensionUrl() != request.uri.isExtensionUrl()) { initialLoad = true } val interceptor = settings.requestInterceptor val response = if ( interceptor != null && (!request.isDirectNavigation || interceptor.interceptsAppInitiatedRequests()) Loading
components/browser/engine-gecko-nightly/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineSessionTest.kt +31 −0 Original line number Diff line number Diff line Loading @@ -567,6 +567,37 @@ class GeckoEngineSessionTest { assertEquals("about:blank", observedUrl) } @Test fun `onLoadRequest will reset initial load flag on process switch to ignore about blank loads`() { val geckoResult = GeckoResult<Boolean?>() val mockedContentBlockingController = mock<ContentBlockingController>() whenever(runtime.contentBlockingController).thenReturn(mockedContentBlockingController) whenever(mockedContentBlockingController.checkException(any())).thenReturn(geckoResult) val session = GeckoEngineSession(runtime, geckoSessionProvider = geckoSessionProvider) captureDelegates() assertTrue(session.initialLoad) navigationDelegate.value.onLocationChange(mock(), "https://mozilla.org") assertFalse(session.initialLoad) navigationDelegate.value.onLoadRequest(mock(), mockLoadRequest("moz-extension://1234-test")) assertTrue(session.initialLoad) var observedUrl = "" session.register(object : EngineSession.Observer { override fun onLocationChange(url: String) { observedUrl = url } }) navigationDelegate.value.onLocationChange(mock(), "about:blank") assertEquals("", observedUrl) navigationDelegate.value.onLocationChange(mock(), "https://www.mozilla.org") assertEquals("https://www.mozilla.org", observedUrl) navigationDelegate.value.onLocationChange(mock(), "about:blank") assertEquals("about:blank", observedUrl) } @Test fun `do not keep track of current url via onPageStart events`() { val engineSession = GeckoEngineSession(mock(), Loading
components/support/ktx/src/main/java/mozilla/components/support/ktx/kotlin/String.kt +5 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,11 @@ private val re = object { */ fun String.isUrl() = URLStringUtils.isURLLike(this) /** * Checks if this String is a URL of an extension page. */ fun String.isExtensionUrl() = this.startsWith("moz-extension://") /** * Checks if this string is a URL. * Loading
components/support/ktx/src/test/java/mozilla/components/support/ktx/kotlin/StringTest.kt +8 −0 Original line number Diff line number Diff line Loading @@ -175,4 +175,12 @@ class StringTest { assertTrue("https://foo.bar".isSameOriginAs("https://foo.bar:443")) assertTrue("https://foo.bar:333".isSameOriginAs("https://foo.bar:333")) } @Test fun isExtensionUrl() { assertTrue("moz-extension://1232-abcd".isExtensionUrl()) assertFalse("mozilla.org".isExtensionUrl()) assertFalse("https://mozilla.org".isExtensionUrl()) assertFalse("http://mozilla.org".isExtensionUrl()) } }