Skip to content

Commit 916f4c2

Browse files
Destroy bg webview on every request
1 parent b09ee28 commit 916f4c2

File tree

5 files changed

+74
-70
lines changed

5 files changed

+74
-70
lines changed

android/app/src/main/java/io/freetubeapp/freetube/MainActivity.kt

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,12 @@ class MainActivity : AppCompatActivity() {
5656

5757
// region JS interfaces
5858
private lateinit var jsInterface: FreeTubeJavaScriptInterface
59-
lateinit var bgJsInterface: BotGuardJavascriptInterface
6059
lateinit var sigJsInterface: SigWebViewJavascriptInterface
6160
// endregion
6261

6362
// region Bindings
6463
private lateinit var binding: ActivityMainBinding
6564
lateinit var webView: BackgroundPlayWebView
66-
lateinit var bgWebView: BotGuardWebView
6765
lateinit var sigWebView: SigWebView
6866
lateinit var content: View
6967
private var fullscreenView: View? = null
@@ -330,27 +328,6 @@ class MainActivity : AppCompatActivity() {
330328
webView.loadUrl("file:///android_asset/index.html")
331329
}
332330

333-
bgWebView = binding.botGuardWebView
334-
bgJsInterface = BotGuardJavascriptInterface(this)
335-
bgWebView.addJavascriptInterface(bgJsInterface, "Android")
336-
bgWebView.settings.javaScriptEnabled = true
337-
bgWebView.settings.allowUniversalAccessFromFileURLs = true
338-
bgWebView.webChromeClient = object: WebChromeClient() {
339-
340-
override fun onConsoleMessage(consoleMessage: ConsoleMessage): Boolean {
341-
val messageData = JSONObject()
342-
messageData.put("content", consoleMessage.message())
343-
messageData.put("level", consoleMessage.messageLevel())
344-
messageData.put("timestamp", System.currentTimeMillis())
345-
messageData.put("id", UUID.randomUUID())
346-
messageData.put("key", "${messageData["id"]}-${messageData["timestamp"]}")
347-
messageData.put("sourceId", consoleMessage.sourceId())
348-
messageData.put("lineNumber", consoleMessage.lineNumber())
349-
consoleMessages.add(messageData)
350-
webView.dispatchEvent("console-message", "data", messageData)
351-
return super.onConsoleMessage(consoleMessage);
352-
}
353-
}
354331

355332
sigWebView = binding.sigWebView
356333
sigJsInterface = SigWebViewJavascriptInterface(sigWebView, jsInterface.jsCommunicator)
@@ -450,4 +427,27 @@ class MainActivity : AppCompatActivity() {
450427
}
451428
})
452429
}
430+
431+
fun generateBgWebview(): BotGuardWebView {
432+
val wv = BotGuardWebView(this)
433+
wv.settings.javaScriptEnabled = true
434+
wv.settings.allowUniversalAccessFromFileURLs = true
435+
wv.webChromeClient = object: WebChromeClient() {
436+
437+
override fun onConsoleMessage(consoleMessage: ConsoleMessage): Boolean {
438+
val messageData = JSONObject()
439+
messageData.put("content", consoleMessage.message())
440+
messageData.put("level", consoleMessage.messageLevel())
441+
messageData.put("timestamp", System.currentTimeMillis())
442+
messageData.put("id", UUID.randomUUID())
443+
messageData.put("key", "${messageData["id"]}-${messageData["timestamp"]}")
444+
messageData.put("sourceId", consoleMessage.sourceId())
445+
messageData.put("lineNumber", consoleMessage.lineNumber())
446+
consoleMessages.add(messageData)
447+
webView.dispatchEvent("console-message", "data", messageData)
448+
return super.onConsoleMessage(consoleMessage)
449+
}
450+
}
451+
return wv
452+
}
453453
}

android/app/src/main/java/io/freetubeapp/freetube/javascript/FreeTubeJavaScriptInterface.kt

Lines changed: 43 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import android.provider.OpenableColumns
1919
import android.view.WindowManager
2020
import android.webkit.JavascriptInterface
2121
import androidx.activity.result.ActivityResult
22+
import android.webkit.WebView
2223
import androidx.annotation.RequiresApi
2324
import androidx.core.app.NotificationManagerCompat
2425
import androidx.core.view.WindowCompat
@@ -32,6 +33,7 @@ import io.freetubeapp.freetube.helpers.readBytes
3233
import io.freetubeapp.freetube.helpers.readText
3334
import io.freetubeapp.freetube.helpers.writeBytes
3435
import io.freetubeapp.freetube.helpers.writeText
36+
import io.freetubeapp.freetube.webviews.BotGuardWebView
3537
import org.json.JSONObject
3638
import java.io.File
3739
import java.io.FileInputStream
@@ -698,48 +700,50 @@ class FreeTubeJavaScriptInterface {
698700
resolve,
699701
reject
700702
->
701-
try {
702-
val bgScript = getBotGuardScript(videoId, sessionContext)
703-
val bgWv = context.bgWebView
704-
context.bgJsInterface.onReturnToken {
705-
run {
706-
context.runOnUiThread {
707-
resolve(it)
708-
bgWv.loadUrl("about:blank")
703+
context.runOnUiThread {
704+
try {
705+
val bgScript = getBotGuardScript(videoId, sessionContext)
706+
val bgWv = context.generateBgWebview()
707+
bgWv.jsInterface.onReturnToken {
708+
run {
709+
context.runOnUiThread {
710+
resolve(it)
711+
bgWv.destroy()
712+
}
709713
}
710714
}
715+
context.runOnUiThread {
716+
bgWv.loadDataWithBaseURL(
717+
"https://www.youtube.com/",
718+
"<script>\n" +
719+
"window.ofetch = window.fetch\n" +
720+
"window.fetch = async (url, data) => {\n" +
721+
" if (url.startsWith('https://www.google.com/')) {\n" +
722+
" return new Promise((resolve, _) => {" +
723+
" const script = document.createElement('script')\n" +
724+
" script.src = url\n" +
725+
" script.async = true\n" +
726+
" document.body.appendChild(script)\n" +
727+
" script.addEventListener('load', () => {\n" +
728+
" resolve({ text: () => '() => {}' })\n" +
729+
" })\n" +
730+
" })\n" +
731+
" }\n" +
732+
" const id = crypto.randomUUID()\n" +
733+
" if (data && 'body' in data) {" +
734+
" Android.queueBody(id, data.body)\n" +
735+
" data.headers['x-fta-request-id'] = id\n" +
736+
" }" +
737+
" return await window.ofetch(url, data)\n" +
738+
"}</script><script>${bgScript}</script>",
739+
"text/html",
740+
"utf-8",
741+
null
742+
)
743+
}
744+
} catch (exception: Exception) {
745+
reject(exception.message!!)
711746
}
712-
context.runOnUiThread {
713-
bgWv.loadDataWithBaseURL(
714-
"https://www.youtube.com/",
715-
"<script>\n" +
716-
"window.ofetch = window.fetch\n" +
717-
"window.fetch = async (url, data) => {\n" +
718-
" if (url.startsWith('https://www.google.com/')) {\n" +
719-
" return new Promise((resolve, _) => {" +
720-
" const script = document.createElement('script')\n" +
721-
" script.src = url\n" +
722-
" script.async = true\n" +
723-
" document.body.appendChild(script)\n" +
724-
" script.addEventListener('load', () => {\n" +
725-
" resolve({ text: () => '() => {}' })\n" +
726-
" })\n" +
727-
" })\n" +
728-
" }\n" +
729-
" const id = crypto.randomUUID()\n" +
730-
" if (data && 'body' in data) {" +
731-
" Android.queueBody(id, data.body)\n" +
732-
" data.headers['x-fta-request-id'] = id\n" +
733-
" }" +
734-
" return await window.ofetch(url, data)\n" +
735-
"}</script><script>${bgScript}</script>",
736-
"text/html",
737-
"utf-8",
738-
null
739-
)
740-
}
741-
} catch (exception: Exception) {
742-
reject(exception.message!!)
743747
}
744748
}).addJsCommunicator(jsCommunicator)
745749
}

android/app/src/main/java/io/freetubeapp/freetube/webviews/BotGuardWebView.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ class BotGuardWebView @JvmOverloads constructor(
1717
) :
1818
// no need to communicate window visibility to botguard
1919
BackgroundPlayWebView(context, attrs) {
20+
val jsInterface = BotGuardJavascriptInterface(context as MainActivity)
2021
init {
21-
val mainActivity = (context as MainActivity)
22+
addJavascriptInterface(jsInterface, "Android")
2223
webViewClient = object : WebViewClient() {
2324
override fun shouldInterceptRequest(
2425
view: WebView?,
@@ -27,8 +28,7 @@ class BotGuardWebView @JvmOverloads constructor(
2728
if (request!!.url.toString().startsWith("data:text/html") || request!!.url.toString().startsWith("https://www.youtube.com/api/jnn/v1/GenerateIT")) {
2829
return super.shouldInterceptRequest(view, request)
2930
}
30-
val jsInterface = mainActivity.bgJsInterface
31-
with(URL(request!!.url.toString()).openConnection() as HttpURLConnection) {
31+
with(URL(request.url.toString()).openConnection() as HttpURLConnection) {
3232
requestMethod = request.method
3333
// map headers
3434
for (header in request!!.requestHeaders) {

android/app/src/main/res/layout/activity_main.xml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,6 @@
1010
android:id="@+id/web_view"
1111
android:layout_width="match_parent"
1212
android:layout_height="match_parent" />
13-
<io.freetubeapp.freetube.webviews.BotGuardWebView
14-
android:id="@+id/bot_guard_web_view"
15-
android:layout_width="1920px"
16-
android:layout_height="1080px"
17-
android:visibility="invisible" />
1813
<io.freetubeapp.freetube.webviews.SigWebView
1914
android:id="@+id/sig_web_view"
2015
android:layout_width="1920px"

yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8512,6 +8512,11 @@ undici-types@~6.19.2:
85128512
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02"
85138513
integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
85148514

8515+
undici-types@~6.20.0:
8516+
version "6.20.0"
8517+
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433"
8518+
integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==
8519+
85158520
unicode-canonical-property-names-ecmascript@^2.0.0:
85168521
version "2.0.1"
85178522
resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2"

0 commit comments

Comments
 (0)