Commits:
4 changed files:
Changes:
mobile/shared/modules/geckoview/GeckoViewWebExtension.sys.mjs
... |
... |
@@ -354,7 +354,9 @@ async function exportExtension(aAddon, aSourceURI) { |
354
|
354
|
disabledFlags.push("appVersionDisabled");
|
355
|
355
|
}
|
356
|
356
|
const baseURL = policy ? policy.getURL() : "";
|
357
|
|
- const privateBrowsingAllowed = policy ? policy.privateBrowsingAllowed : false;
|
|
357
|
+ const privateBrowsingAllowed = policy
|
|
358
|
+ ? policy.privateBrowsingAllowed
|
|
359
|
+ : lazy.PrivateBrowsingUtils.permanentPrivateBrowsing;
|
358
|
360
|
|
359
|
361
|
let updateDate;
|
360
|
362
|
try {
|
... |
... |
@@ -509,6 +511,9 @@ class ExtensionInstallListener { |
509
|
511
|
|
510
|
512
|
async onInstallEnded(aInstall, aAddon) {
|
511
|
513
|
debug`onInstallEnded addonId=${aAddon.id}`;
|
|
514
|
+ if (lazy.PrivateBrowsingUtils.permanentPrivateBrowsing) {
|
|
515
|
+ await GeckoViewWebExtension.setPrivateBrowsingAllowed(aAddon.id, true);
|
|
516
|
+ }
|
512
|
517
|
const extension = await exportExtension(aAddon, aInstall.sourceURI);
|
513
|
518
|
this.resolve({ extension });
|
514
|
519
|
}
|
toolkit/mozapps/extensions/AddonManager.sys.mjs
... |
... |
@@ -83,7 +83,10 @@ const lazy = {}; |
83
|
83
|
ChromeUtils.defineESModuleGetters(lazy, {
|
84
|
84
|
AbuseReporter: "resource://gre/modules/AbuseReporter.sys.mjs",
|
85
|
85
|
AddonRepository: "resource://gre/modules/addons/AddonRepository.sys.mjs",
|
|
86
|
+ GeckoViewWebExtension: "resource://gre/modules/GeckoViewWebExtension.sys.mjs",
|
|
87
|
+ EventDispatcher: "resource://gre/modules/Messaging.sys.mjs",
|
86
|
88
|
Extension: "resource://gre/modules/Extension.sys.mjs",
|
|
89
|
+ PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",
|
87
|
90
|
RemoteSettings: "resource://services-settings/remote-settings.sys.mjs",
|
88
|
91
|
TelemetryTimestamps: "resource://gre/modules/TelemetryTimestamps.sys.mjs",
|
89
|
92
|
isGatedPermissionType:
|
... |
... |
@@ -2346,6 +2349,24 @@ var AddonManagerInternal = { |
2346
|
2349
|
return promiseInstall;
|
2347
|
2350
|
},
|
2348
|
2351
|
|
|
2352
|
+ async installGeckoViewWebExtension(extensionUri) {
|
|
2353
|
+ const installId = Services.uuid.generateUUID().toString();
|
|
2354
|
+ let { extension } = await lazy.GeckoViewWebExtension.installWebExtension(
|
|
2355
|
+ installId,
|
|
2356
|
+ extensionUri
|
|
2357
|
+ );
|
|
2358
|
+ if (lazy.PrivateBrowsingUtils.permanentPrivateBrowsing) {
|
|
2359
|
+ extension = await lazy.GeckoViewWebExtension.setPrivateBrowsingAllowed(
|
|
2360
|
+ extension.webExtensionId,
|
|
2361
|
+ true
|
|
2362
|
+ );
|
|
2363
|
+ }
|
|
2364
|
+ await lazy.EventDispatcher.instance.sendRequest({
|
|
2365
|
+ type: "GeckoView:WebExtension:OnInstalled",
|
|
2366
|
+ extension,
|
|
2367
|
+ });
|
|
2368
|
+ },
|
|
2369
|
+
|
2349
|
2370
|
/**
|
2350
|
2371
|
* Starts installation of an AddonInstall notifying the registered
|
2351
|
2372
|
* web install listener of a blocked or started install.
|
... |
... |
@@ -2518,6 +2539,10 @@ var AddonManagerInternal = { |
2518
|
2539
|
);
|
2519
|
2540
|
|
2520
|
2541
|
if (installAllowed) {
|
|
2542
|
+ if (AppConstants.platform == "android") {
|
|
2543
|
+ aInstall.cancel();
|
|
2544
|
+ return this.installGeckoViewWebExtension(aInstall.sourceURI);
|
|
2545
|
+ }
|
2521
|
2546
|
startInstall("AMO");
|
2522
|
2547
|
} else if (installPerm === Ci.nsIPermissionManager.DENY_ACTION) {
|
2523
|
2548
|
// Block without prompt
|
toolkit/mozapps/extensions/components.conf
... |
... |
@@ -32,14 +32,13 @@ Classes = [ |
32
|
32
|
'esModule': 'resource://gre/modules/amWebAPI.sys.mjs',
|
33
|
33
|
'constructor': 'WebAPI',
|
34
|
34
|
},
|
|
35
|
+ # tor-browser#43132: re-enable XPI handler on Android to allow scriptless extensions installation.
|
|
36
|
+ # This reverts https://bugzilla.mozilla.org/show_bug.cgi?id=1610571, which made sense for generic
|
|
37
|
+ # GeckoView extensionless embedders and for Firefox, relying on navigator.mozAddonManager.
|
|
38
|
+ {
|
|
39
|
+ 'cid': '{7beb3ba8-6ec3-41b4-b67c-da89b8518922}',
|
|
40
|
+ 'contract_ids': ['@mozilla.org/uriloader/content-handler;1?type=application/x-xpinstall'],
|
|
41
|
+ 'esModule': 'resource://gre/modules/amContentHandler.sys.mjs',
|
|
42
|
+ 'constructor': 'amContentHandler',
|
|
43
|
+ },
|
35
|
44
|
] |
36
|
|
-
|
37
|
|
-if buildconfig.substs['MOZ_WIDGET_TOOLKIT'] != 'android':
|
38
|
|
- Classes += [
|
39
|
|
- {
|
40
|
|
- 'cid': '{7beb3ba8-6ec3-41b4-b67c-da89b8518922}',
|
41
|
|
- 'contract_ids': ['@mozilla.org/uriloader/content-handler;1?type=application/x-xpinstall'],
|
42
|
|
- 'esModule': 'resource://gre/modules/amContentHandler.sys.mjs',
|
43
|
|
- 'constructor': 'amContentHandler',
|
44
|
|
- },
|
45
|
|
- ] |
toolkit/mozapps/extensions/internal/XPIInstall.sys.mjs
... |
... |
@@ -4475,6 +4475,11 @@ export var XPIInstall = { |
4475
|
4475
|
return false;
|
4476
|
4476
|
}
|
4477
|
4477
|
|
|
4478
|
+ // tor-browser#43132: short-circuit permission check on Android scriptless install from AMO
|
|
4479
|
+ if (AppConstants.platform == "android" && uri.prePath == "https://addons.mozilla.org") {
|
|
4480
|
+ return true;
|
|
4481
|
+ }
|
|
4482
|
+
|
4478
|
4483
|
let requireWhitelist = Services.prefs.getBoolPref(
|
4479
|
4484
|
PREF_XPI_WHITELIST_REQUIRED,
|
4480
|
4485
|
true
|
|