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

Commit

Permalink
Closes #352: Expose tracking protection in session/engine
Browse files Browse the repository at this point in the history
  • Loading branch information
csadilek committed Jul 25, 2018
1 parent 0d1af10 commit a31f3d5
Show file tree
Hide file tree
Showing 12 changed files with 425 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,14 @@ import org.mozilla.geckoview.GeckoResponse
import org.mozilla.geckoview.GeckoRuntime
import org.mozilla.geckoview.GeckoSession
import org.mozilla.geckoview.GeckoResult
import org.mozilla.geckoview.GeckoSessionSettings

/**
* Gecko-based EngineSession implementation.
*/
@Suppress("TooManyFunctions")
class GeckoEngineSession(
runtime: GeckoRuntime
private val runtime: GeckoRuntime
) : EngineSession() {

internal var geckoSession = GeckoSession()
Expand All @@ -29,6 +31,7 @@ class GeckoEngineSession(

geckoSession.navigationDelegate = createNavigationDelegate()
geckoSession.progressDelegate = createProgressDelegate()
geckoSession.trackingProtectionDelegate = createTrackingProtectionDelegate()
}

/**
Expand Down Expand Up @@ -177,6 +180,23 @@ class GeckoEngineSession(
}
}

private fun createTrackingProtectionDelegate() = GeckoSession.TrackingProtectionDelegate {
session, uri, _ ->
session?.let { uri?.let { notifyObservers { onTrackerBlocked(it) } } }
}

override fun enableTrackingProtection(policy: TrackingProtectionPolicy) {
geckoSession.settings.setBoolean(GeckoSessionSettings.USE_TRACKING_PROTECTION, true)
runtime.settings.trackingProtectionCategories = policy.categories
notifyObservers { onTrackerBlockingEnabledChange(true) }
}

override fun disableTrackingProtection() {
geckoSession.settings.setBoolean(GeckoSessionSettings.USE_TRACKING_PROTECTION, false)
runtime.settings.trackingProtectionCategories = TrackingProtectionPolicy.none().categories
notifyObservers { onTrackerBlockingEnabledChange(false) }
}

companion object {
internal const val PROGRESS_START = 25
internal const val PROGRESS_STOP = 100
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package mozilla.components.browser.engine.gecko

import android.os.Handler
import mozilla.components.concept.engine.EngineSession
import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy
import org.junit.Assert
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
Expand All @@ -21,8 +22,10 @@ import org.mozilla.gecko.util.GeckoBundle
import org.mozilla.gecko.util.ThreadUtils
import org.mozilla.geckoview.GeckoResult
import org.mozilla.geckoview.GeckoRuntime
import org.mozilla.geckoview.GeckoRuntimeSettings
import org.mozilla.geckoview.GeckoSession
import org.mozilla.geckoview.GeckoSession.ProgressDelegate.SecurityInformation
import org.mozilla.geckoview.GeckoSessionSettings
import org.robolectric.RobolectricTestRunner

@RunWith(RobolectricTestRunner::class)
Expand Down Expand Up @@ -254,4 +257,56 @@ class GeckoEngineSessionTest {
engineSession.geckoSession.navigationDelegate.onLocationChange(null, "about:blank")
assertEquals("about:blank", observedUrl)
}

@Test
fun testTrackingProtectionDelegateNotifiesObservers() {
val engineSession = GeckoEngineSession(mock(GeckoRuntime::class.java))

var trackerBlocked = ""
engineSession.register(object : EngineSession.Observer {
override fun onTrackerBlocked(url: String) {
trackerBlocked = url
}
})

engineSession.geckoSession.trackingProtectionDelegate.onTrackerBlocked(engineSession.geckoSession, "tracker1", 0)
assertEquals("tracker1", trackerBlocked)
}

@Test
fun testEnableTrackingProtection() {
val runtime = mock(GeckoRuntime::class.java)
`when`(runtime.settings).thenReturn(mock(GeckoRuntimeSettings::class.java))
val engineSession = GeckoEngineSession(runtime)

var trackerBlockingEnabledObserved = false
engineSession.register(object : EngineSession.Observer {
override fun onTrackerBlockingEnabledChange(enabled: Boolean) {
trackerBlockingEnabledObserved = enabled
}
})

engineSession.enableTrackingProtection(TrackingProtectionPolicy.select(
TrackingProtectionPolicy.ANALYTICS, TrackingProtectionPolicy.AD))
assertTrue(trackerBlockingEnabledObserved)
assertTrue(engineSession.geckoSession.settings.getBoolean(GeckoSessionSettings.USE_TRACKING_PROTECTION))
}

@Test
fun testDisableTrackingProtection() {
val runtime = mock(GeckoRuntime::class.java)
`when`(runtime.settings).thenReturn(mock(GeckoRuntimeSettings::class.java))
val engineSession = GeckoEngineSession(runtime)

var trackerBlockingDisabledObserved = false
engineSession.register(object : EngineSession.Observer {
override fun onTrackerBlockingEnabledChange(enabled: Boolean) {
trackerBlockingDisabledObserved = !enabled
}
})

engineSession.disableTrackingProtection()
assertTrue(trackerBlockingDisabledObserved)
Assert.assertFalse(engineSession.geckoSession.settings.getBoolean(GeckoSessionSettings.USE_TRACKING_PROTECTION))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@ import org.mozilla.gecko.util.ThreadUtils
import org.mozilla.geckoview.GeckoResult
import org.mozilla.geckoview.GeckoRuntime
import org.mozilla.geckoview.GeckoSession
import org.mozilla.geckoview.GeckoSessionSettings

/**
* Gecko-based EngineSession implementation.
*/
@Suppress("TooManyFunctions")
class GeckoEngineSession(
runtime: GeckoRuntime
private val runtime: GeckoRuntime
) : EngineSession() {

internal var geckoSession = GeckoSession()
Expand All @@ -29,6 +31,7 @@ class GeckoEngineSession(
geckoSession.navigationDelegate = createNavigationDelegate()
geckoSession.progressDelegate = createProgressDelegate()
geckoSession.contentDelegate = createContentDelegate()
geckoSession.trackingProtectionDelegate = createTrackingProtectionDelegate()
}

/**
Expand Down Expand Up @@ -208,6 +211,23 @@ class GeckoEngineSession(
override fun onFocusRequest(session: GeckoSession) = Unit
}

private fun createTrackingProtectionDelegate() = GeckoSession.TrackingProtectionDelegate {
session, uri, _ ->
session?.let { uri?.let { notifyObservers { onTrackerBlocked(it) } } }
}

override fun enableTrackingProtection(policy: TrackingProtectionPolicy) {
geckoSession.settings.setBoolean(GeckoSessionSettings.USE_TRACKING_PROTECTION, true)
runtime.settings.trackingProtectionCategories = policy.categories
notifyObservers { onTrackerBlockingEnabledChange(true) }
}

override fun disableTrackingProtection() {
geckoSession.settings.setBoolean(GeckoSessionSettings.USE_TRACKING_PROTECTION, false)
runtime.settings.trackingProtectionCategories = TrackingProtectionPolicy.none().categories
notifyObservers { onTrackerBlockingEnabledChange(false) }
}

companion object {
internal const val PROGRESS_START = 25
internal const val PROGRESS_STOP = 100
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package mozilla.components.browser.engine.gecko

import android.os.Handler
import mozilla.components.concept.engine.EngineSession
import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy
import mozilla.components.support.test.mock
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
Expand All @@ -23,8 +24,10 @@ import org.mozilla.gecko.util.GeckoBundle
import org.mozilla.gecko.util.ThreadUtils
import org.mozilla.geckoview.GeckoResult
import org.mozilla.geckoview.GeckoRuntime
import org.mozilla.geckoview.GeckoRuntimeSettings
import org.mozilla.geckoview.GeckoSession
import org.mozilla.geckoview.GeckoSession.ProgressDelegate.SecurityInformation
import org.mozilla.geckoview.GeckoSessionSettings
import org.mozilla.geckoview.createMockedWebResponseInfo
import org.robolectric.RobolectricTestRunner

Expand All @@ -50,9 +53,7 @@ class GeckoEngineSessionTest {
var observedSecurityChange = false
engineSession.register(object : EngineSession.Observer {
override fun onLoadingStateChange(loading: Boolean) { observedLoadingState = loading }
override fun onLocationChange(url: String) { }
override fun onProgress(progress: Int) { observedProgress = progress }
override fun onNavigationStateChange(canGoBack: Boolean?, canGoForward: Boolean?) { }
override fun onSecurityChange(secure: Boolean, host: String?, issuer: String?) {
// We cannot assert on actual parameters as SecurityInfo's fields can't be set
// from the outside and its constructor isn't accessible either.
Expand Down Expand Up @@ -86,10 +87,7 @@ class GeckoEngineSessionTest {
var observedCanGoBack: Boolean = false
var observedCanGoForward: Boolean = false
engineSession.register(object : EngineSession.Observer {
override fun onLoadingStateChange(loading: Boolean) {}
override fun onLocationChange(url: String) { observedUrl = url }
override fun onProgress(progress: Int) { }
override fun onSecurityChange(secure: Boolean, host: String?, issuer: String?) { }
override fun onNavigationStateChange(canGoBack: Boolean?, canGoForward: Boolean?) {
canGoBack?.let { observedCanGoBack = canGoBack }
canGoForward?.let { observedCanGoForward = canGoForward }
Expand Down Expand Up @@ -231,10 +229,6 @@ class GeckoEngineSessionTest {

var observedSecurityChange = false
engineSession.register(object : EngineSession.Observer {
override fun onLoadingStateChange(loading: Boolean) { }
override fun onLocationChange(url: String) { }
override fun onProgress(progress: Int) { }
override fun onNavigationStateChange(canGoBack: Boolean?, canGoForward: Boolean?) { }
override fun onSecurityChange(secure: Boolean, host: String?, issuer: String?) {
observedSecurityChange = true
}
Expand Down Expand Up @@ -262,11 +256,7 @@ class GeckoEngineSessionTest {

var observedUrl = ""
engineSession.register(object : EngineSession.Observer {
override fun onLoadingStateChange(loading: Boolean) {}
override fun onLocationChange(url: String) { observedUrl = url }
override fun onProgress(progress: Int) { }
override fun onSecurityChange(secure: Boolean, host: String?, issuer: String?) { }
override fun onNavigationStateChange(canGoBack: Boolean?, canGoForward: Boolean?) { }
})

engineSession.geckoSession.navigationDelegate.onLocationChange(null, "about:blank")
Expand All @@ -293,4 +283,56 @@ class GeckoEngineSessionTest {

verify(observer).onTitleChange("Hello World!")
}

@Test
fun testTrackingProtectionDelegateNotifiesObservers() {
val engineSession = GeckoEngineSession(mock(GeckoRuntime::class.java))

var trackerBlocked = ""
engineSession.register(object : EngineSession.Observer {
override fun onTrackerBlocked(url: String) {
trackerBlocked = url
}
})

engineSession.geckoSession.trackingProtectionDelegate.onTrackerBlocked(engineSession.geckoSession, "tracker1", 0)
assertEquals("tracker1", trackerBlocked)
}

@Test
fun testEnableTrackingProtection() {
val runtime = mock(GeckoRuntime::class.java)
`when`(runtime.settings).thenReturn(mock(GeckoRuntimeSettings::class.java))
val engineSession = GeckoEngineSession(runtime)

var trackerBlockingEnabledObserved = false
engineSession.register(object : EngineSession.Observer {
override fun onTrackerBlockingEnabledChange(enabled: Boolean) {
trackerBlockingEnabledObserved = enabled
}
})

engineSession.enableTrackingProtection(TrackingProtectionPolicy.select(
TrackingProtectionPolicy.ANALYTICS, TrackingProtectionPolicy.AD))
assertTrue(trackerBlockingEnabledObserved)
assertTrue(engineSession.geckoSession.settings.getBoolean(GeckoSessionSettings.USE_TRACKING_PROTECTION))
}

@Test
fun testDisableTrackingProtection() {
val runtime = mock(GeckoRuntime::class.java)
`when`(runtime.settings).thenReturn(mock(GeckoRuntimeSettings::class.java))
val engineSession = GeckoEngineSession(runtime)

var trackerBlockingDisabledObserved = false
engineSession.register(object : EngineSession.Observer {
override fun onTrackerBlockingEnabledChange(enabled: Boolean) {
trackerBlockingDisabledObserved = !enabled
}
})

engineSession.disableTrackingProtection()
assertTrue(trackerBlockingDisabledObserved)
assertFalse(engineSession.geckoSession.settings.getBoolean(GeckoSessionSettings.USE_TRACKING_PROTECTION))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@ import mozilla.components.concept.engine.EngineSession
import org.mozilla.geckoview.GeckoResponse
import org.mozilla.geckoview.GeckoRuntime
import org.mozilla.geckoview.GeckoSession
import org.mozilla.geckoview.GeckoSessionSettings

/**
* Gecko-based EngineSession implementation.
*/
@Suppress("TooManyFunctions")
class GeckoEngineSession(
runtime: GeckoRuntime
private val runtime: GeckoRuntime
) : EngineSession() {

internal var geckoSession = GeckoSession()
Expand All @@ -28,6 +30,7 @@ class GeckoEngineSession(

geckoSession.navigationDelegate = createNavigationDelegate()
geckoSession.progressDelegate = createProgressDelegate()
geckoSession.trackingProtectionDelegate = createTrackingProtectionDelegate()
}

/**
Expand Down Expand Up @@ -174,6 +177,21 @@ class GeckoEngineSession(
}
}

private fun createTrackingProtectionDelegate() = GeckoSession.TrackingProtectionDelegate {
session, uri, _ ->
session?.let { uri?.let { notifyObservers { onTrackerBlocked(it) } } }
}

override fun enableTrackingProtection(policy: TrackingProtectionPolicy) {
geckoSession.settings.setBoolean(GeckoSessionSettings.USE_TRACKING_PROTECTION, true)
notifyObservers { onTrackerBlockingEnabledChange(true) }
}

override fun disableTrackingProtection() {
geckoSession.settings.setBoolean(GeckoSessionSettings.USE_TRACKING_PROTECTION, false)
notifyObservers { onTrackerBlockingEnabledChange(false) }
}

companion object {
internal const val PROGRESS_START = 25
internal const val PROGRESS_STOP = 100
Expand Down
Loading

0 comments on commit a31f3d5

Please sign in to comment.