首页 > 解决方案 > 如何将 JS 注入 Android 中的 GeckoView?

问题描述

在迁移到 GeckoView 的 77.0.20200603183750 版本之前,我们使用的是 71.0.20191208234333 版本,所以我们必须更改 imp. WebExtension 实例,它只采用一个参数,即 JS 文件的位置

从:

currentGeckoView.session?.run{

            getGeckoRuntime(this)?.run{

                val extension = WebExtension("resource://android/assets/location_search/")
                extension.setMessageDelegate(messageDelegate, "location_search")
                registerWebExtension(extension)
            }

            settings.userAgentMode = GeckoSessionSettings.USER_AGENT_MODE_MOBILE
            settings.userAgentOverride = "Mozilla/5.0 (Linux; Android ${Build.VERSION.RELEASE}; Mobile) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36"
            settings.allowJavascript = true
            progressDelegate = createProgressDelegate()
        } 

至:

currentGeckoView.session?.run{
            val geckoRuntime = getGeckoRuntime(this)

            geckoRuntime?.webExtensionController?.install("resource://android/assets/location_search/")
                ?.accept({ extension ->
                    extension?.setMessageDelegate(messageDelegate, "location_search")
                    geckoRuntime.registerWebExtension(extension!!)
                }, { exception ->
                    Log.d("webExtensionController",
                        "Exception message from WebExtension: $exception"
                    )
                })

            settings.userAgentMode = GeckoSessionSettings.USER_AGENT_MODE_MOBILE
            settings.userAgentOverride = "Mozilla/5.0 (Linux; Android ${Build.VERSION.RELEASE}; Mobile) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36"
            settings.allowJavascript = true
            progressDelegate = createProgressDelegate()
        }

虽然 JS 注入成功,但这会导致无法传递网页的当前状态。由于此操作,Session.loading即使页面加载成功,布尔字段仍然为真。

我们在迁移到新版本时使用了firefox-source-docs,我们无法在 .77 版的实例上调用ensureBuiltIn方法。WebExtensionControllerGeckoView

根据上面的文档,我们需要像下面那样调用 ensureBuiltIn 方法,但我们不能调用,因为它在编译的 WebExtension.class 中变成了内部方法。

geckoRuntime.getWebExtensionController()
  .ensureBuiltIn("resource://android/assets/messaging/", "messaging@example.com")
  .accept(
        extension -> Log.i("MessageDelegate", "Extension installed: " + extension),
        e -> Log.e("MessageDelegate", "Error registering WebExtension", e)
  );

在 GeckoView 中迁移到新版本的 WebExtension 时,是否有人帮助我们了解我们所缺少的内容?

标签: firefox-addon-webextensionsgeckoview

解决方案


推荐阅读