Listen to AddonManager events
Categories
(GeckoView :: Extensions, enhancement, P3)
Tracking
(firefox112 wontfix, firefox113 fixed)
People
(Reporter: willdurand, Assigned: willdurand)
References
Details
(Whiteboard: [addons-jira])
Attachments
(3 files)
The idea here is to implement an AddonListener
in GeckoView that we would automatically register using the addAddonListener()
method in order to listen to events such as onUninstalled()
, onDisabled()
, onEnabled()
, etc. These events are not "install" events, they are emitted by the AddonManager
for various reasons.
This is how I see the implementation in mobile/android/modules/geckoview/GeckoViewWebExtension.jsm
:
class ExtensionAddonListener {
constructor() {
lazy.AddonManager.addAddonListener(this);
}
async onDisabled(aAddon) {
debug`onDisabled ${aAddon.id}`;
const extension = await exportExtension(
aAddon,
aAddon.userPermissions,
/* aSourceURI */ null
);
lazy.EventDispatcher.instance.sendRequestForResult({
type: "GeckoView:WebExtension:OnDisabled",
extension,
});
}
// TODO: handle more events
}
new ExtensionAddonListener();
Each supported event should send a request, e.g., onDisabled()
would send the GeckoView:WebExtension:OnDisabled
request, which the WebExtensionController
would have to handle. This might require a new delegate (AddonManagerDelegate
?) that would "simply" pass the information to the embedder:
public class WebExtensionController {
// ...
private AddonManagerDelegate mAddonManagerDelegate;
public interface AddonManagerDelegate {
@Nullable
default void onDisabled(final @NonNull WebExtension extension) {}
}
// ...
void handleMessage(...) {
// ...
if ("GeckoView:WebExtension:OnDisabled".equals(event)) {
final GeckoBundle anExtensionBundle = bundle.getBundle("extension");
final WebExtension anExtension = new WebExtension(
mDelegateControllerProvider,
anExtensionBundle
);
mAddonManagerDelegate.onDisabled(anExtension);
return;
}
}
}
We need to listen to these events in order to support new install flows (e.g. using mozAddonManager
) but also to reflect changes to an add-on to the embedder (e.g. if we block an add-on, we want to make sure the app will no longer show the add-on as installed/enabled).
Updated•1 year ago
|
Assignee | ||
Comment 1•1 year ago
|
||
This is the first step to listen to other AddonManager events. We likely
need a new delegate because there is no other existing delegate we can
leverage I think.
In Fenix, we could use this new delegate like this:
diff --git a/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt b/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt
index 5d34a952e8..8031bd1f67 100644
--- a/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt
+++ b/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt
@@ -357,8 +357,15 @@ class GeckoEngine(
}
}
- runtime.webExtensionController.promptDelegate = promptDelegate
+ val addonManagerDelegate = object : WebExtensionController.AddonManagerDelegate {
+ override fun onDisabled(extension: org.mozilla.geckoview.WebExtension) {
+ webExtensionDelegate.onDisabled(GeckoWebExtension(extension, runtime))
+ }
+ }
+
+ runtime.webExtensionController.setPromptDelegate(promptDelegate)
runtime.webExtensionController.setDebuggerDelegate(debuggerDelegate)
+ runtime.webExtensionController.setAddonManagerDelegate(addonManagerDelegate)
}
/**
@@ -422,7 +429,6 @@ class GeckoEngine(
runtime.webExtensionController.disable((extension as GeckoWebExtension).nativeExtension, source.id).then(
{
val disabledExtension = GeckoWebExtension(it!!, runtime)
- webExtensionDelegate?.onDisabled(disabledExtension)
onSuccess(disabledExtension)
GeckoResult<Void>()
},
Updated•1 year ago
|
Updated•1 year ago
|
Assignee | ||
Comment 2•1 year ago
|
||
Depends on D173835
Depends on D173835
Assignee | ||
Comment 3•1 year ago
|
||
For completeness, I added this event too.
Depends on D174466
Pushed by wdurand@mozilla.com: https://hg.mozilla.org/integration/autoland/rev/e69ce1b32ff2 Listen to AddonManager "onDisabled" event. r=geckoview-reviewers,zmckenney,rpl,amejiamarmol https://hg.mozilla.org/integration/autoland/rev/152d4079f316 Listen to AddonManager "onEnabled" event. r=zmckenney,rpl,geckoview-reviewers https://hg.mozilla.org/integration/autoland/rev/2fa13aa9553d Listen to AddonManager "onUninstalled" event. r=zmckenney,rpl,geckoview-reviewers,calu,amejiamarmol
Comment 5•1 year ago
|
||
Backed out for xpcshell failures on test_ext_indexedDB_principal.js
Failure log: https://treeherder.mozilla.org/logviewer?job_id=411330825&repo=autoland
Backout link: https://hg.mozilla.org/integration/autoland/rev/d153deeb1dc72ac1e190b82a6d0ccc97f87b6d3c
Assignee | ||
Comment 6•1 year ago
|
||
Sorry about that, I noticed (new?) failures locally as well and was about to push another commit.. Anyway, I'll update the patches and re-land the stack once I get a green try push.
Comment 7•1 year ago
•
|
||
There are also these: https://treeherder.mozilla.org/logviewer?job_id=411335898&repo=autoland and all the xpcshell failures look to be Android only.
Pushed by wdurand@mozilla.com: https://hg.mozilla.org/integration/autoland/rev/87701a14d81d Listen to AddonManager "onDisabled" event. r=geckoview-reviewers,zmckenney,rpl,amejiamarmol https://hg.mozilla.org/integration/autoland/rev/0c59791435ce Listen to AddonManager "onEnabled" event. r=zmckenney,rpl,geckoview-reviewers,amejiamarmol https://hg.mozilla.org/integration/autoland/rev/9c4e16dbfdff Listen to AddonManager "onUninstalled" event. r=zmckenney,rpl,geckoview-reviewers,calu,amejiamarmol
Comment 9•1 year ago
•
|
||
Backed out 3 changesets (bug 1822763) for causing xpcshell failures at test_ext_manifest.js, test_ext_clear_cached_resources.js, test_ext_webidl_api_event_callback.js and test_ext_webidl_api.js
Backout: https://hg.mozilla.org/integration/autoland/rev/38a61f0fdb7ae5dba9313ee4e2bc3bd44d8dc34d
Failure logs:
https://treeherder.mozilla.org/logviewer?job_id=411363331&repo=autoland&lineNumber=3596
https://treeherder.mozilla.org/logviewer?job_id=411363922&repo=autoland&lineNumber=3538
https://treeherder.mozilla.org/logviewer?job_id=411364786&repo=autoland&lineNumber=3658
https://treeherder.mozilla.org/logviewer?job_id=411365989&repo=autoland&lineNumber=3651
Comment 10•1 year ago
|
||
Pushed by wdurand@mozilla.com: https://hg.mozilla.org/integration/autoland/rev/52079267cc83 Listen to AddonManager "onDisabled" event. r=geckoview-reviewers,zmckenney,rpl,amejiamarmol https://hg.mozilla.org/integration/autoland/rev/e135887f1a8c Listen to AddonManager "onEnabled" event. r=zmckenney,rpl,geckoview-reviewers,amejiamarmol https://hg.mozilla.org/integration/autoland/rev/834ccb7b14b1 Listen to AddonManager "onUninstalled" event. r=zmckenney,rpl,geckoview-reviewers,calu,amejiamarmol
Assignee | ||
Updated•1 year ago
|
Comment 11•1 year ago
|
||
bugherder |
https://hg.mozilla.org/mozilla-central/rev/52079267cc83
https://hg.mozilla.org/mozilla-central/rev/e135887f1a8c
https://hg.mozilla.org/mozilla-central/rev/834ccb7b14b1
Updated•1 year ago
|
Description
•