Skip to content
This repository was archived by the owner on Nov 1, 2022. It is now read-only.

Commit

Permalink
Merge #6561 #6562
Browse files Browse the repository at this point in the history
6561: Issue #6314: Support fetching non base64 encoded data URIs r=Amejia481 a=csadilek

Simple change to support data URI that are not base64 encoded. With this backup/restore is now finally working in uBlock.

6562: Merge day! r=jonalmeida a=pocmo

Happy merge day everyone. 🍰 

Co-authored-by: Christian Sadilek <[email protected]>
Co-authored-by: Sebastian Kaspari <[email protected]>
  • Loading branch information
3 people committed Apr 7, 2020
3 parents 4edf28d + 40a09a2 + 5c5666b commit 4c77753
Show file tree
Hide file tree
Showing 28 changed files with 861 additions and 399 deletions.
6 changes: 3 additions & 3 deletions buildSrc/src/main/java/Gecko.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,17 @@ internal object GeckoVersions {
/**
* GeckoView Nightly Version.
*/
const val nightly_version = "76.0.20200406092400"
const val nightly_version = "77.0.20200407093520"

/**
* GeckoView Beta Version.
*/
const val beta_version = "75.0.20200403064004"
const val beta_version = "76.0.20200406152003"

/**
* GeckoView Release Version.
*/
const val release_version = "74.0.20200309095159"
const val release_version = "75.0.20200403170909"
}

@Suppress("MaxLineLength")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import androidx.test.filters.MediumTest
import mozilla.components.browser.engine.gecko.fetch.GeckoViewFetchClient
import mozilla.components.concept.fetch.Client
import org.junit.Assert.assertTrue
import org.junit.Ignore
import org.junit.Test

@MediumTest
Expand Down Expand Up @@ -109,6 +110,7 @@ class GeckoViewFetchTestCases : mozilla.components.tooling.fetch.tests.FetchTest

@Test
@UiThreadTest
@Ignore("https://bugzilla.mozilla.org/show_bug.cgi?id=1626335")
override fun get200WithCookiePolicy() {
super.get200WithCookiePolicy()
}
Expand All @@ -130,4 +132,10 @@ class GeckoViewFetchTestCases : mozilla.components.tooling.fetch.tests.FetchTest
override fun getThrowsIOExceptionWhenHostNotReachable() {
super.getThrowsIOExceptionWhenHostNotReachable()
}

@Test
@UiThreadTest
override fun getDataUri() {
super.getDataUri()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,6 @@ class GeckoEngineSession(
notifyObservers { onNavigateBack() }
}
}

/**
* See [EngineSession.goForward]
*/
Expand Down Expand Up @@ -372,23 +371,30 @@ class GeckoEngineSession(
return GeckoResult.fromValue(AllowOrDeny.ALLOW)
}

val isSameDomain = this@GeckoEngineSession.currentUrl?.tryGetHostFromUrl() ==
request.uri.tryGetHostFromUrl()
val response = settings.requestInterceptor?.onLoadRequest(
this@GeckoEngineSession,
request.uri,
request.hasUserGesture,
isSameDomain
)?.apply {
when (this) {
is InterceptionResponse.Content -> loadData(data, mimeType, encoding)
is InterceptionResponse.Url -> loadUrl(url)
is InterceptionResponse.AppIntent -> {
notifyObservers {
onLaunchIntentRequest(url = url, appIntent = appIntent)
val interceptor = settings.requestInterceptor
val response = if (
interceptor != null && (!request.isDirectNavigation || interceptor.interceptsAppInitiatedRequests())
) {
val engineSession = this@GeckoEngineSession
val isSameDomain = engineSession.currentUrl?.tryGetHostFromUrl() == request.uri.tryGetHostFromUrl()
interceptor.onLoadRequest(
engineSession,
request.uri,
request.hasUserGesture,
isSameDomain
)?.apply {
when (this) {
is InterceptionResponse.Content -> loadData(data, mimeType, encoding)
is InterceptionResponse.Url -> loadUrl(url)
is InterceptionResponse.AppIntent -> {
notifyObservers {
onLaunchIntentRequest(url = url, appIntent = appIntent)
}
}
}
}
} else {
null
}

return if (response != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ class GeckoEngineView @JvmOverloads constructor(
currentGeckoView.session?.let {
// Release a previously assigned session. Otherwise GeckoView will close it
// automatically.
detachSelectionActionDelegate(currentGeckoView.session)
detachSelectionActionDelegate(it)
currentGeckoView.releaseSession()
}

Expand Down Expand Up @@ -149,7 +149,9 @@ class GeckoEngineView @JvmOverloads constructor(
override fun release() {
detachSelectionActionDelegate(currentSession?.geckoSession)

currentSession?.apply { unregister(observer) }
currentSession?.apply {
unregister(observer)
}

currentSession = null

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package mozilla.components.browser.engine.gecko.selection
import android.app.Activity
import android.content.Context
import android.view.MenuItem
import androidx.annotation.VisibleForTesting
import mozilla.components.concept.engine.selection.SelectionActionDelegate
import org.mozilla.geckoview.BasicSelectionActionDelegate

Expand All @@ -17,7 +18,8 @@ import org.mozilla.geckoview.BasicSelectionActionDelegate
*/
open class GeckoSelectionActionDelegate(
activity: Activity,
private val customDelegate: SelectionActionDelegate
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
internal val customDelegate: SelectionActionDelegate
) : BasicSelectionActionDelegate(activity) {

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1151,6 +1151,8 @@ class GeckoEngineSessionTest {
var interceptorCalledWithUri: String? = null

val interceptor = object : RequestInterceptor {
override fun interceptsAppInitiatedRequests() = true

override fun onLoadRequest(
engineSession: EngineSession,
uri: String,
Expand All @@ -1163,10 +1165,7 @@ class GeckoEngineSessionTest {
}

val defaultSettings = DefaultSettings(requestInterceptor = interceptor)

GeckoEngineSession(mock(), geckoSessionProvider = geckoSessionProvider,
defaultSettings = defaultSettings)

GeckoEngineSession(mock(), geckoSessionProvider = geckoSessionProvider, defaultSettings = defaultSettings)
captureDelegates()

navigationDelegate.value.onLoadRequest(geckoSession, mockLoadRequest("sample:about"))
Expand All @@ -1180,6 +1179,8 @@ class GeckoEngineSessionTest {
var interceptorCalledWithUri: String? = null

val interceptor = object : RequestInterceptor {
override fun interceptsAppInitiatedRequests() = true

override fun onLoadRequest(
engineSession: EngineSession,
uri: String,
Expand All @@ -1192,13 +1193,10 @@ class GeckoEngineSessionTest {
}

val defaultSettings = DefaultSettings(requestInterceptor = interceptor)

GeckoEngineSession(mock(), geckoSessionProvider = geckoSessionProvider,
defaultSettings = defaultSettings)

GeckoEngineSession(mock(), geckoSessionProvider = geckoSessionProvider, defaultSettings = defaultSettings)
captureDelegates()

navigationDelegate.value.onLoadRequest(geckoSession, mockLoadRequest("sample:about"))
navigationDelegate.value.onLoadRequest(geckoSession, mockLoadRequest("sample:about", "trigger:uri"))

assertEquals("sample:about", interceptorCalledWithUri)
verify(geckoSession).loadUri(
Expand All @@ -1209,6 +1207,35 @@ class GeckoEngineSessionTest {
)
}

@Test
fun settingInterceptorCanIgnoreAppInitiatedRequests() {
var interceptorCalled = false

val interceptor = object : RequestInterceptor {
override fun interceptsAppInitiatedRequests() = false

override fun onLoadRequest(
engineSession: EngineSession,
uri: String,
hasUserGesture: Boolean,
isSameDomain: Boolean
): RequestInterceptor.InterceptionResponse? {
interceptorCalled = true
return RequestInterceptor.InterceptionResponse.Url("https://mozilla.org")
}
}

val defaultSettings = DefaultSettings(requestInterceptor = interceptor)
GeckoEngineSession(mock(), geckoSessionProvider = geckoSessionProvider, defaultSettings = defaultSettings)
captureDelegates()

navigationDelegate.value.onLoadRequest(geckoSession, mockLoadRequest("sample:about", isDirectNavigation = true))
assertFalse(interceptorCalled)

navigationDelegate.value.onLoadRequest(geckoSession, mockLoadRequest("sample:about", isDirectNavigation = false))
assertTrue(interceptorCalled)
}

@Test
fun onLoadRequestWithoutInterceptor() {
val defaultSettings = DefaultSettings()
Expand All @@ -1228,6 +1255,8 @@ class GeckoEngineSessionTest {
var interceptorCalledWithUri: String? = null

val interceptor = object : RequestInterceptor {
override fun interceptsAppInitiatedRequests() = true

override fun onLoadRequest(
engineSession: EngineSession,
uri: String,
Expand Down Expand Up @@ -1761,7 +1790,7 @@ class GeckoEngineSessionTest {
captureDelegates()

val result = navigationDelegate.value.onLoadRequest(geckoSession,
mockLoadRequest("sample:about", GeckoSession.NavigationDelegate.TARGET_WINDOW_NEW))
mockLoadRequest("sample:about", null, GeckoSession.NavigationDelegate.TARGET_WINDOW_NEW))

assertNotNull(result)
assertEquals(result!!.poll(0), AllowOrDeny.ALLOW)
Expand Down Expand Up @@ -1863,6 +1892,8 @@ class GeckoEngineSessionTest {
var observedIntent: Intent? = null

engineSession.settings.requestInterceptor = object : RequestInterceptor {
override fun interceptsAppInitiatedRequests() = true

override fun onLoadRequest(
engineSession: EngineSession,
uri: String,
Expand Down Expand Up @@ -1913,6 +1944,8 @@ class GeckoEngineSessionTest {
var observedTriggeredByWebContent: Boolean? = null

engineSession.settings.requestInterceptor = object : RequestInterceptor {
override fun interceptsAppInitiatedRequests() = true

override fun onLoadRequest(
engineSession: EngineSession,
uri: String,
Expand Down Expand Up @@ -2224,40 +2257,6 @@ class GeckoEngineSessionTest {
assertFalse(engineSession.firstContentfulPaint)
}

@Test
fun `GIVEN canGoBack true WHEN goBack() is called THEN verify EngineObserver onNavigateBack() is triggered`() {
var observedOnNavigateBack = false
val engineSession = GeckoEngineSession(mock(),
geckoSessionProvider = geckoSessionProvider)
engineSession.register(object : EngineSession.Observer {
override fun onNavigateBack() {
observedOnNavigateBack = true
}
})

captureDelegates()
navigationDelegate.value.onCanGoBack(mock(), true)
engineSession.goBack()
assertTrue(observedOnNavigateBack)
}

@Test
fun `GIVEN canGoBack false WHEN goBack() is called THEN verify EngineObserver onNavigateBack() is not triggered`() {
var observedOnNavigateBack = false
val engineSession = GeckoEngineSession(mock(),
geckoSessionProvider = geckoSessionProvider)
engineSession.register(object : EngineSession.Observer {
override fun onNavigateBack() {
observedOnNavigateBack = true
}
})

captureDelegates()
navigationDelegate.value.onCanGoBack(mock(), false)
engineSession.goBack()
assertFalse(observedOnNavigateBack)
}

class MockSecurityInformation(
origin: String? = null,
certificate: X509Certificate? = null
Expand Down Expand Up @@ -2347,6 +2346,39 @@ class GeckoEngineSessionTest {
assertEquals(parsedIssuerName, observedIssuer)
}

@Test
fun `GIVEN canGoBack true WHEN goBack() is called THEN verify EngineObserver onNavigateBack() is triggered`() {
var observedOnNavigateBack = false
val engineSession = GeckoEngineSession(mock(),
geckoSessionProvider = geckoSessionProvider)
engineSession.register(object : EngineSession.Observer {
override fun onNavigateBack() {
observedOnNavigateBack = true
}
})

captureDelegates()
navigationDelegate.value.onCanGoBack(mock(), true)
engineSession.goBack()
assertTrue(observedOnNavigateBack)
}

@Test
fun `GIVEN canGoBack false WHEN goBack() is called THEN verify EngineObserver onNavigateBack() is not triggered`() {
var observedOnNavigateBack = false
val engineSession = GeckoEngineSession(mock(),
geckoSessionProvider = geckoSessionProvider)
engineSession.register(object : EngineSession.Observer {
override fun onNavigateBack() {
observedOnNavigateBack = true
}
})

captureDelegates()
navigationDelegate.value.onCanGoBack(mock(), false)
engineSession.goBack()
assertFalse(observedOnNavigateBack)
}
private fun mockGeckoSession(): GeckoSession {
val session = mock<GeckoSession>()
whenever(session.settings).thenReturn(
Expand All @@ -2356,9 +2388,11 @@ class GeckoEngineSessionTest {

private fun mockLoadRequest(
uri: String,
triggerUri: String? = null,
target: Int = 0,
triggeredByRedirect: Boolean = false,
hasUserGesture: Boolean = false
hasUserGesture: Boolean = false,
isDirectNavigation: Boolean = false
): GeckoSession.NavigationDelegate.LoadRequest {
var flags = 0
if (triggeredByRedirect) {
Expand All @@ -2370,9 +2404,10 @@ class GeckoEngineSessionTest {
String::class.java,
Int::class.java,
Int::class.java,
Boolean::class.java,
Boolean::class.java)
constructor.isAccessible = true

return constructor.newInstance(uri, uri, target, flags, hasUserGesture)
return constructor.newInstance(uri, triggerUri, target, flags, hasUserGesture, isDirectNavigation)
}
}
Loading

0 comments on commit 4c77753

Please sign in to comment.