android - 实施 GeckoView Web 扩展
问题描述
我正在尝试在 Android 中为 GeckoView 实现一个 noddy 网络扩展,以简单地在网页上执行一些 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");
但是,页面加载时不会显示任何警报。除了尝试显示警告框之外,我还尝试了一些特定于站点的目标脚本,但是它们都没有工作。
有什么明显的遗漏或任何可能对我有帮助的资源吗?
非常感谢。
解决方案
但是,页面加载时没有显示警报
请注意,默认情况下,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)
})