首页 > 解决方案 > 实施 GeckoView Web 扩展

问题描述

我正在尝试在 Android 中为 GeckoView 实现一个 noddy 网络扩展,以简单地在网页上执行一些 javascript,相当于普通 Android WebView 上的 webView.evaluateJavascript(),但是我无法找到任何有用的示例或教程在线的。

我之前曾尝试过 WebView,但是我在登录期间尝试访问错误的站点意味着我无法访问它。但是登录适用于 GeckoView

到目前为止,我已经遵循了这些:

  1. https://sammacbeth.eu/blog/2019/09/04/geckoview-extensions.html

  2. https://mozilla.github.io/geckoview/consumer/docs/web-extensions

  3. https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Your_first_WebExtension

但是,它们似乎有点过时了,即使是 mozilla 自己的文档,因为我使用的 API 不再遵循示例。

我正在使用 GeckoView 的稳定版本:73.0.20200217142647

根据上面的[3],我的文件结构是:

java
 |
 +-- assets
 |   |
 |   +--checkExtension
 |      |
 |      manifest.json
 |      checkExtension.js
 |
 +-- res
 |
 +-- src

manifest.json 的内容是

 {

  "manifest_version": 2,
  "name": "checkExtension",
  "version": "1.0",

  "description": "Automatically clicks the authorise button to continue the photo upload.",

  "content_scripts": [
    {
      "matches": ["*"],
      "js": ["checkExtension.js"]
    }
  ],
  "permissions": [
    "nativeMessaging",
    "geckoViewAddons"
  ]

}

'matches' 设置为 '*' 以便它应该匹配导航到的所有页面

checkExtension.js 只包含:

alert('hello')

我的 GeckoView 活动是:

GeckoView view = findViewById(R.id.geckoview);
GeckoSession session = new GeckoSession();
GeckoRuntime runtime = GeckoRuntime.create(this);

session.open(runtime);

WebExtension test = new WebExtension(
    "resource://assets/extension/checkExtension/",
    runtime.getWebExtensionController());

runtime.registerWebExtension(test);

view.setSession(session);
session.loadUri("https://www.google.com");

但是,页面加载时不会显示任何警报。除了尝试显示警告框之外,我还尝试了一些特定于站点的目标脚本,但是它们都没有工作。

有什么明显的遗漏或任何可能对我有帮助的资源吗?

非常感谢。

标签: androidmozillafirefox-addon-webextensionsgeckoview

解决方案


但是,页面加载时没有显示警报

请注意,默认情况下,GeckoView 本身不会显示任何警报,而是GeckoSession.PromptDelegate.onAlertPrompt()在您注册PromptDelegate.

而不是使用alert你可以记录,或实现onAlertPrompt()记录或显示一个对话框。这是示例应用程序的实现方式: https ://searchfox.org/mozilla-central/rev/fca0be7e2cf2f922c9b927423ce28e8a04b3fd90/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/BasicGeckoViewPrompt.java#68-81

除此之外,registerWebExtension()GeckoResult还可以使用它来检测扩展是否已成功加载。这可以帮助您调试问题,例如:

runtime.registerWebExtension(ext.nativeExtension).then({
    Log.d(TAG, "WebExtension registered successfully")
}, { throwable ->
    Log.d(TAG, "WebExtension registration failed", throwable)
})

推荐阅读