diff --git a/app/src/main/java/com/futo/platformplayer/engine/packages/PackageBrowser.kt b/app/src/main/java/com/futo/platformplayer/engine/packages/PackageBrowser.kt index 61a41e14..faac04dc 100644 --- a/app/src/main/java/com/futo/platformplayer/engine/packages/PackageBrowser.kt +++ b/app/src/main/java/com/futo/platformplayer/engine/packages/PackageBrowser.kt @@ -2,6 +2,7 @@ package com.futo.platformplayer.engine.packages import android.annotation.SuppressLint import android.graphics.Bitmap +import android.net.Uri import android.os.Looper import android.util.Log import android.webkit.ConsoleMessage @@ -41,6 +42,7 @@ import okhttp3.OkHttpClient import okhttp3.Request import java.io.ByteArrayInputStream import java.nio.charset.Charset +import androidx.core.net.toUri class PackageBrowser: V8Package { val useAddDocumentStartJavaScript = true @@ -48,6 +50,9 @@ class PackageBrowser: V8Package { override val name: String get() = "Browser"; override val variableName: String = "browser"; + @Volatile private var _loadToken: String? = null + @Volatile private var _expectedMainUrl: String? = null + private val _json = Json { }; @Transient @@ -157,9 +162,14 @@ class PackageBrowser: V8Package { override fun onPageCommitVisible(view: WebView?, url: String?) { super.onPageCommitVisible(view, url) - _readySemaphore?.release(); - _readySemaphore = null; - Logger.i("PackageBrowser", "Browser loaded"); + Logger.i("PackageBrowser", "Browser loaded (commit visible): $url") + releaseReadyIfCurrent(url) + } + + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + Logger.i("PackageBrowser", "Browser loaded (finished): $url") + releaseReadyIfCurrent(url) } override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { @@ -275,14 +285,28 @@ class PackageBrowser: V8Package { @V8Function fun load(url: String) { - Logger.i("PackageBrowser", "Browser loading url [${url}]"); - _readySemaphore = Semaphore(1, 1); + Logger.i("PackageBrowser", "Browser loading url [$url]") + val token = UUID.randomUUID().toString() + _loadToken = token + _expectedMainUrl = url + _readySemaphore = Semaphore(1, acquiredPermits = 1) + StateApp.instance.scope.launch(Dispatchers.Main) { try { browser.loadUrl(url) } catch (t: Throwable) { Logger.e("PackageBrowser", "loadUrl failed", t) } } } + private fun releaseReadyIfCurrent(url: String?) { + if (url == null) return + val expected = _expectedMainUrl + if (url.toUri().host != expected?.toUri()?.host) return + + _readySemaphore?.release() + _readySemaphore = null + _expectedMainUrl = null + } + @V8Function fun run(js: String, callbackId: String? = null, callback: V8ValueFunction? = null) { waitTillLoaded(); diff --git a/app/src/stable/assets/sources/youtube b/app/src/stable/assets/sources/youtube index aa9c6ecb..19123f4c 160000 --- a/app/src/stable/assets/sources/youtube +++ b/app/src/stable/assets/sources/youtube @@ -1 +1 @@ -Subproject commit aa9c6ecb007b81cce95308abab459b7f7ea751be +Subproject commit 19123f4c12c04aeaa5ee558b0c237c44ac40cb5b diff --git a/app/src/unstable/assets/sources/youtube b/app/src/unstable/assets/sources/youtube index aa9c6ecb..19123f4c 160000 --- a/app/src/unstable/assets/sources/youtube +++ b/app/src/unstable/assets/sources/youtube @@ -1 +1 @@ -Subproject commit aa9c6ecb007b81cce95308abab459b7f7ea751be +Subproject commit 19123f4c12c04aeaa5ee558b0c237c44ac40cb5b