Реализация веб-расширения GeckoView - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь реализовать простое веб-расширение для GeckoView в Android, чтобы просто выполнить javascript на веб-странице, что эквивалентно webView.evaluate Javascript () в обычном Android WebView, однако у меня возникают проблемы с поиском каких-либо полезных примеров или руководств в Интернете.

Ранее я уже пробовал 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

Содержимое манифеста. json is

 {

  "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"
  ]

}

'match' установлено в '*', так что оно должно соответствует любой и всем страницам, которые перешли на

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

Однако предупреждение не отображается когда страница загружается. Я пробовал несколько специфичных для сайта c целевых сценариев, кроме попыток показать окно оповещения, однако ни один из них не сработал.

Есть ли что-то очевидное, что отсутствует или какие-либо ресурсы, которые могут мне помочь ?

Большое спасибо.

1 Ответ

2 голосов
/ 20 февраля 2020

Однако при загрузке страницы предупреждение не отображается

Обратите внимание, что по умолчанию 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)
})
...