实施 GeckoView Web 扩展

Posted

技术标签:

【中文标题】实施 GeckoView Web 扩展【英文标题】:Implement GeckoView Web Extension 【发布时间】:2020-06-03 19:40:22 【问题描述】:

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

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

到目前为止,我已经关注了这些:

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

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

    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");

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

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

非常感谢。

【问题讨论】:

我看到的一个问题是扩展的 URL 应该是 resource://assets/checkExtension/ 而不是你所拥有的,你应该等待 pocmo 响应告诉你的结果,那将为您提供有关扩展程序未运行原因的更多信息 【参考方案1】:

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

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

您可以使用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)
)

【讨论】:

以上是关于实施 GeckoView Web 扩展的主要内容,如果未能解决你的问题,请参考以下文章

在没有标记源的情况下实施 Vuforia 扩展跟踪

泽西岛,已实施的Web服务列表

实施 Firestore 时,Flutter Web 应用程序不会加载

需要帮助以了解和实施基本的 Web 应用程序安全性

实施具有自己的登录系统(无社交媒体)的 RESTful Web 应用程序时是不是需要 OAuth?

Flutter web:实施 Firebase 应用检查后出现 403 权限被拒绝错误