Commit e799258b authored by Luca Greco's avatar Luca Greco Committed by luca.greco@alcacoop.it
Browse files

Bug 1964408 - Scan application scopes early on startup if app-builtin-addons...

Bug 1964408 - Scan application scopes early on startup if app-builtin-addons location is missing from addonStartup.json.lz4 data. r=baku,willdurand

Differential Revision: https://phabricator.services.mozilla.com/D248116
parent 0f111893
Loading
Loading
Loading
Loading
+7 −0
Changes for toolkit/mozapps/extensions/internal/XPIProvider.sys.mjs: 7 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -1521,6 +1521,13 @@ var XPIStates = {
      startupScanScopes = AddonManager.SCOPE_ALL;
    }

    if (!oldLocations.has(KEY_APP_SYSTEM_BUILTINS)) {
      logger.warn(
        `Force scan SCOPE_APPLICATION (${KEY_APP_SYSTEM_BUILTINS} location missing from XPIStates)`
      );
      startupScanScopes |= AddonManager.SCOPE_APPLICATION;
    }

    for (let loc of XPIStates.locations()) {
      oldLocations.delete(loc.name);

+75 −0
Changes for toolkit/mozapps/extensions/test/xpcshell/test_system_builtins.js: 75 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -162,3 +162,78 @@ add_task(
    await promiseShutdownManager();
  }
);

// This tests case verifies that in case of a missing or completely corrupted
// xpi states, the builin addons are still installed and started up as expected.
add_task(
  {
    pref_set: [
      ["extensions.skipInstallDefaultThemeForTests", true],
      // Set the same startupScanScopes value set by default on a Firefox Desktop
      // instance.
      ["extensions.startupScanScopes", 0],
    ],
  },
  async function test_missing_xpistate() {
    const builtins = [1, 2, 3].map(i => ({
      addon_id: `@builtin${i}`,
      addon_version: "1.1",
      res_url: `resource://builtin-addon${i}/`,
    }));
    await Promise.all(
      [1, 2, 3].map(i =>
        setupBuiltinExtension(
          {
            manifest: {
              name: `Built-In System Add-on ${i}`,
              version: "1.1",
              browser_specific_settings: {
                gecko: { id: `@builtin${i}` },
              },
            },
          },
          `builtin-addon${i}`
        )
      )
    );
    AddonTestUtils.updateAppInfo(appInfoInitial);
    await overrideBuiltIns({ builtins });
    let promiseBuiltin1Started = promiseWebExtensionStartup(`@builtin1`);
    let promiseBuiltin2Started = promiseWebExtensionStartup(`@builtin2`);
    let promiseBuiltin3Started = promiseWebExtensionStartup(`@builtin2`);
    await promiseStartupManager();
    info("Await @builtin1 startup");
    await promiseBuiltin1Started;
    info("Await @builtin2 startup");
    await promiseBuiltin2Started;
    info("Await @builtin3 startup");
    await promiseBuiltin3Started;
    await promiseShutdownManager();

    ok(
      AddonTestUtils.addonStartup.exists(),
      "Expect addonStartup.json.lz4 file to exist"
    );
    await IOUtils.remove(AddonTestUtils.addonStartup.path);
    ok(
      !AddonTestUtils.addonStartup.exists(),
      "Expect addonStartup.json.lz4 file to be removed"
    );

    info("======== Startup with missing addonStartup.json.lz4");

    promiseBuiltin1Started = promiseWebExtensionStartup(`@builtin1`);
    promiseBuiltin2Started = promiseWebExtensionStartup(`@builtin2`);
    promiseBuiltin3Started = promiseWebExtensionStartup(`@builtin2`);

    await overrideBuiltIns({ builtins });
    await promiseStartupManager();
    info("Await @builtin1 startup");
    await promiseBuiltin1Started;
    info("Await @builtin2 startup");
    await promiseBuiltin2Started;
    info("Await @builtin3 startup");
    await promiseBuiltin3Started;
    await promiseShutdownManager();
  }
);