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

Commit 7a00a81

Browse files
jonalmeidacsadilek
authored andcommitted
Issue #605: Include base64 support + review comments
1 parent 32e2064 commit 7a00a81

File tree

16 files changed

+210
-35
lines changed

16 files changed

+210
-35
lines changed

components/browser/engine-gecko-beta/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngineSession.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,11 @@ class GeckoEngineSession(
4343
/**
4444
* See [EngineSession.loadData]
4545
*/
46-
override fun loadData(data: String, mimeType: String) {
47-
geckoSession.loadString(data, mimeType)
46+
override fun loadData(data: String, mimeType: String, encoding: String) {
47+
when (encoding) {
48+
"base64" -> geckoSession.loadData(data.toByteArray(), mimeType)
49+
else -> geckoSession.loadString(data, mimeType)
50+
}
4851
}
4952

5053
/**

components/browser/engine-gecko-beta/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineSessionTest.kt

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ import org.junit.Assert.assertTrue
1414
import org.junit.Test
1515
import org.junit.runner.RunWith
1616
import org.mockito.ArgumentMatchers.any
17+
import org.mockito.ArgumentMatchers.anyString
18+
import org.mockito.ArgumentMatchers.eq
1719
import org.mockito.Mockito.`when`
1820
import org.mockito.Mockito.mock
21+
import org.mockito.Mockito.verify
1922
import org.mozilla.gecko.util.BundleEventListener
2023
import org.mozilla.gecko.util.GeckoBundle
2124
import org.mozilla.gecko.util.ThreadUtils
@@ -121,6 +124,7 @@ class GeckoEngineSessionTest {
121124
@Test
122125
fun testLoadData() {
123126
val engineSession = GeckoEngineSession(mock(GeckoRuntime::class.java))
127+
124128
var loadUriReceived = false
125129
engineSession.geckoSession.eventDispatcher.registerUiThreadListener(
126130
BundleEventListener { _, _, _ -> loadUriReceived = true },
@@ -131,8 +135,33 @@ class GeckoEngineSessionTest {
131135
assertTrue(loadUriReceived)
132136

133137
loadUriReceived = false
134-
engineSession.loadData("Hello!", "text/plain")
138+
engineSession.loadData("Hello!", "text/plain", "UTF-8")
139+
assertTrue(loadUriReceived)
140+
141+
loadUriReceived = false
142+
engineSession.loadData("ahr0cdovl21vemlsbgeub3jn==", "text/plain", "base64")
135143
assertTrue(loadUriReceived)
144+
145+
loadUriReceived = false
146+
engineSession.loadData("ahr0cdovl21vemlsbgeub3jn==", encoding = "base64")
147+
assertTrue(loadUriReceived)
148+
}
149+
150+
@Test
151+
fun testLoadDataBase64() {
152+
val engineSession = GeckoEngineSession(mock(GeckoRuntime::class.java))
153+
val geckoSession = mock(GeckoSession::class.java)
154+
155+
engineSession.geckoSession = geckoSession
156+
157+
engineSession.loadData("Hello!", "text/plain", "UTF-8")
158+
verify(geckoSession).loadString(eq("Hello!"), anyString())
159+
160+
engineSession.loadData("ahr0cdovl21vemlsbgeub3jn==", "text/plain", "base64")
161+
verify(geckoSession).loadData(eq("ahr0cdovl21vemlsbgeub3jn==".toByteArray()), eq("text/plain"))
162+
163+
engineSession.loadData("ahr0cdovl21vemlsbgeub3jn==", encoding = "base64")
164+
verify(geckoSession).loadData(eq("ahr0cdovl21vemlsbgeub3jn==".toByteArray()), eq("text/plain"))
136165
}
137166

138167
@Test

components/browser/engine-gecko-nightly/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngineSession.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,11 @@ class GeckoEngineSession(
4444
/**
4545
* See [EngineSession.loadData]
4646
*/
47-
override fun loadData(data: String, mimeType: String) {
48-
geckoSession.loadString(data, mimeType)
47+
override fun loadData(data: String, mimeType: String, encoding: String) {
48+
when (encoding) {
49+
"base64" -> geckoSession.loadData(data.toByteArray(), mimeType)
50+
else -> geckoSession.loadString(data, mimeType)
51+
}
4952
}
5053

5154
/**

components/browser/engine-gecko-nightly/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineSessionTest.kt

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import org.junit.Assert.assertTrue
1515
import org.junit.Test
1616
import org.junit.runner.RunWith
1717
import org.mockito.ArgumentMatchers.any
18+
import org.mockito.ArgumentMatchers.anyString
19+
import org.mockito.ArgumentMatchers.eq
1820
import org.mockito.Mockito.`when`
1921
import org.mockito.Mockito.mock
2022
import org.mockito.Mockito.verify
@@ -144,6 +146,7 @@ class GeckoEngineSessionTest {
144146
@Test
145147
fun testLoadData() {
146148
val engineSession = GeckoEngineSession(mock(GeckoRuntime::class.java))
149+
147150
var loadUriReceived = false
148151
engineSession.geckoSession.eventDispatcher.registerUiThreadListener(
149152
BundleEventListener { _, _, _ -> loadUriReceived = true },
@@ -154,8 +157,33 @@ class GeckoEngineSessionTest {
154157
assertTrue(loadUriReceived)
155158

156159
loadUriReceived = false
157-
engineSession.loadData("Hello!", "text/plain")
160+
engineSession.loadData("Hello!", "text/plain", "UTF-8")
161+
assertTrue(loadUriReceived)
162+
163+
loadUriReceived = false
164+
engineSession.loadData("ahr0cdovl21vemlsbgeub3jn==", "text/plain", "base64")
158165
assertTrue(loadUriReceived)
166+
167+
loadUriReceived = false
168+
engineSession.loadData("ahr0cdovl21vemlsbgeub3jn==", encoding = "base64")
169+
assertTrue(loadUriReceived)
170+
}
171+
172+
@Test
173+
fun testLoadDataBase64() {
174+
val engineSession = GeckoEngineSession(mock(GeckoRuntime::class.java))
175+
val geckoSession = mock(GeckoSession::class.java)
176+
177+
engineSession.geckoSession = geckoSession
178+
179+
engineSession.loadData("Hello!", "text/plain", "UTF-8")
180+
verify(geckoSession).loadString(eq("Hello!"), anyString())
181+
182+
engineSession.loadData("ahr0cdovl21vemlsbgeub3jn==", "text/plain", "base64")
183+
verify(geckoSession).loadData(eq("ahr0cdovl21vemlsbgeub3jn==".toByteArray()), eq("text/plain"))
184+
185+
engineSession.loadData("ahr0cdovl21vemlsbgeub3jn==", encoding = "base64")
186+
verify(geckoSession).loadData(eq("ahr0cdovl21vemlsbgeub3jn==".toByteArray()), eq("text/plain"))
159187
}
160188

161189
@Test

components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngineSession.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,11 @@ class GeckoEngineSession(
4343
/**
4444
* See [EngineSession.loadData]
4545
*/
46-
override fun loadData(data: String, mimeType: String) {
47-
geckoSession.loadString(data, mimeType)
46+
override fun loadData(data: String, mimeType: String, encoding: String) {
47+
when (encoding) {
48+
"base64" -> geckoSession.loadData(data.toByteArray(), mimeType)
49+
else -> geckoSession.loadString(data, mimeType)
50+
}
4851
}
4952

5053
/**

components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineSessionTest.kt

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ import org.junit.Assert.fail
1414
import org.junit.Test
1515
import org.junit.runner.RunWith
1616
import org.mockito.ArgumentMatchers.any
17+
import org.mockito.ArgumentMatchers.anyString
18+
import org.mockito.ArgumentMatchers.eq
1719
import org.mockito.Mockito.`when`
1820
import org.mockito.Mockito.mock
21+
import org.mockito.Mockito.verify
1922
import org.mozilla.gecko.util.BundleEventListener
2023
import org.mozilla.gecko.util.GeckoBundle
2124
import org.mozilla.geckoview.GeckoResponse
@@ -120,6 +123,7 @@ class GeckoEngineSessionTest {
120123
@Test
121124
fun testLoadData() {
122125
val engineSession = GeckoEngineSession(mock(GeckoRuntime::class.java))
126+
123127
var loadUriReceived = false
124128
engineSession.geckoSession.eventDispatcher.registerUiThreadListener(
125129
BundleEventListener { _, _, _ -> loadUriReceived = true },
@@ -130,8 +134,33 @@ class GeckoEngineSessionTest {
130134
assertTrue(loadUriReceived)
131135

132136
loadUriReceived = false
133-
engineSession.loadData("Hello!", "text/plain")
137+
engineSession.loadData("Hello!", "text/plain", "UTF-8")
138+
assertTrue(loadUriReceived)
139+
140+
loadUriReceived = false
141+
engineSession.loadData("ahr0cdovl21vemlsbgeub3jn==", "text/plain", "base64")
134142
assertTrue(loadUriReceived)
143+
144+
loadUriReceived = false
145+
engineSession.loadData("ahr0cdovl21vemlsbgeub3jn==", encoding = "base64")
146+
assertTrue(loadUriReceived)
147+
}
148+
149+
@Test
150+
fun testLoadDataBase64() {
151+
val engineSession = GeckoEngineSession(mock(GeckoRuntime::class.java))
152+
val geckoSession = mock(GeckoSession::class.java)
153+
154+
engineSession.geckoSession = geckoSession
155+
156+
engineSession.loadData("Hello!", "text/plain", "UTF-8")
157+
verify(geckoSession).loadString(eq("Hello!"), anyString())
158+
159+
engineSession.loadData("ahr0cdovl21vemlsbgeub3jn==", "text/plain", "base64")
160+
verify(geckoSession).loadData(eq("ahr0cdovl21vemlsbgeub3jn==".toByteArray()), eq("text/plain"))
161+
162+
engineSession.loadData("ahr0cdovl21vemlsbgeub3jn==", encoding = "base64")
163+
verify(geckoSession).loadData(eq("ahr0cdovl21vemlsbgeub3jn==".toByteArray()), eq("text/plain"))
135164
}
136165

137166
@Test
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package mozilla.components.browser.engine.system
2+
3+
/**
4+
* Used for when we need to schedule loading a url or data with a mime type, if there isn't
5+
* a session already created.
6+
*/
7+
data class ScheduledLoad constructor(
8+
val url: String?,
9+
val data: String? = null,
10+
val mimeType: String? = null
11+
) {
12+
constructor(data: String, mimeType: String) : this(null, data, mimeType)
13+
constructor() : this(null, null, null)
14+
}

components/browser/engine-system/src/main/java/mozilla/components/browser/engine/system/SystemEngineSession.kt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ import java.lang.ref.WeakReference
1414
* WebView-based EngineSession implementation.
1515
*/
1616
class SystemEngineSession : EngineSession() {
17-
internal var urlToLoad: String? = null
18-
internal var mimeTypeToLoad: String? = null
1917
internal var view: WeakReference<SystemEngineView>? = null
18+
internal var scheduledLoad = ScheduledLoad(null)
2019

2120
/**
2221
* See [EngineSession.loadUrl]
@@ -27,7 +26,7 @@ class SystemEngineSession : EngineSession() {
2726
if (internalView == null) {
2827
// We can't load a URL without a WebView. So let's just remember the URL here until
2928
// this session gets linked to a WebView. See: EngineView.render(session).
30-
urlToLoad = url
29+
scheduledLoad = ScheduledLoad(url)
3130
} else {
3231
internalView.loadUrl(url)
3332
}
@@ -36,16 +35,15 @@ class SystemEngineSession : EngineSession() {
3635
/**
3736
* See [EngineSession.loadData]
3837
*/
39-
override fun loadData(data: String, mimeType: String) {
38+
override fun loadData(data: String, mimeType: String, encoding: String) {
4039
val internalView = currentView()
4140

4241
if (internalView == null) {
4342
// We remember the data that we want to load and when then session gets linked
44-
// to a WebView we check for a mimeType and call loadData then.
45-
urlToLoad = data
46-
mimeTypeToLoad = mimeType
43+
// to a WebView we call loadData then.
44+
scheduledLoad = ScheduledLoad(data, mimeType)
4745
} else {
48-
internalView.loadData(data, mimeType, "UTF-8")
46+
internalView.loadData(data, mimeType, encoding)
4947
}
5048
}
5149

components/browser/engine-system/src/main/java/mozilla/components/browser/engine/system/SystemEngineView.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,14 @@ class SystemEngineView @JvmOverloads constructor(
4646

4747
internalSession.view = WeakReference(this)
4848

49-
internalSession.mimeTypeToLoad?.let {
50-
currentWebView.loadData(internalSession.urlToLoad, internalSession.mimeTypeToLoad, "UTF-8")
51-
internalSession.urlToLoad = null
52-
internalSession.mimeTypeToLoad = null
49+
internalSession.scheduledLoad.data?.let {
50+
currentWebView.loadData(it, internalSession.scheduledLoad.mimeType, "UTF-8")
51+
internalSession.scheduledLoad = ScheduledLoad()
5352
}
5453

55-
internalSession.urlToLoad?.let {
56-
currentWebView.loadUrl(internalSession.urlToLoad)
57-
internalSession.urlToLoad = null
54+
internalSession.scheduledLoad.url?.let {
55+
currentWebView.loadUrl(it)
56+
internalSession.scheduledLoad = ScheduledLoad()
5857
}
5958
}
6059

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package mozilla.components.browser.engine.system
2+
3+
import org.junit.Assert.assertNotNull
4+
import org.junit.Assert.assertNull
5+
import org.junit.Test
6+
7+
class ScheduledLoadTest {
8+
@Test
9+
fun testConstructorNullability() {
10+
var scheduledLoad = ScheduledLoad()
11+
assertNull(scheduledLoad.url)
12+
assertNull(scheduledLoad.data)
13+
assertNull(scheduledLoad.mimeType)
14+
15+
scheduledLoad = ScheduledLoad("https://mozilla.org")
16+
assertNotNull(scheduledLoad.url)
17+
assertNull(scheduledLoad.data)
18+
assertNull(scheduledLoad.mimeType)
19+
20+
scheduledLoad = ScheduledLoad("<html><body></body></html>", "text/html")
21+
assertNull(scheduledLoad.url)
22+
assertNotNull(scheduledLoad.data)
23+
assertNotNull(scheduledLoad.mimeType)
24+
}
25+
}

0 commit comments

Comments
 (0)