Source code

Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const kClsidTestShellEx = "{10a9521e-0205-4cc7-93a1-62f30a9a54b3}";
const kFriendlyName = "Minimum Shell Extension for Firefox testing";
const kExtensionSubkeys = [".zzz\\shellex\\IconHandler"];
const kExtensionModuleName = "TestShellEx.dll";
const kUserBlockedModuleName = "TestDllBlocklist_UserBlocked.dll";
const kFileFilterInDialog = "*.zzz";
const kATP = Cc["@mozilla.org/about-thirdparty;1"].getService(
Ci.nsIAboutThirdParty
);
function loadShellExtension() {
// This method call opens the file dialog and shows the support file
// "hello.zzz" in it, which loads TestShellEx.dll to show an icon
// for files with the .zzz extension.
kATP.openAndCloseFileDialogForTesting(
kExtensionModuleName,
getTestFilePath(""),
kFileFilterInDialog
);
}
async function registerObject() {
const reg = Cc["@mozilla.org/windows-registry-key;1"].createInstance(
Ci.nsIWindowsRegKey
);
reg.create(
Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
"Software\\Classes\\CLSID\\" + kClsidTestShellEx,
Ci.nsIWindowsRegKey.ACCESS_ALL
);
reg.writeStringValue("", kFriendlyName);
const inprocServer = reg.createChild(
"InprocServer32",
Ci.nsIWindowsRegKey.ACCESS_ALL
);
const moduleFullPath = getTestFilePath(kExtensionModuleName);
Assert.ok(await IOUtils.exists(moduleFullPath), "The module file exists.");
inprocServer.writeStringValue("", moduleFullPath);
inprocServer.writeStringValue("ThreadingModel", "Apartment");
reg.close();
info("registerObject() done - " + moduleFullPath);
}
function registerExtensions() {
for (const subkey of kExtensionSubkeys) {
const reg = Cc["@mozilla.org/windows-registry-key;1"].createInstance(
Ci.nsIWindowsRegKey
);
reg.create(
Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
"Software\\Classes\\" + subkey,
Ci.nsIWindowsRegKey.ACCESS_ALL
);
let currentExtension = "";
try {
// If the key was just created above, the default value does not exist,
// so readStringValue will throw NS_ERROR_FAILURE.
currentExtension = reg.readStringValue("");
} catch (e) {}
try {
if (!currentExtension) {
reg.writeStringValue("", kClsidTestShellEx);
} else if (currentExtension != kClsidTestShellEx) {
throw new Error(
`Another extension \`${currentExtension}\` has been registered.`
);
}
} catch (e) {
throw new Error("Failed to register TestShellEx.dll: " + e);
} finally {
reg.close();
}
}
}
function unregisterAll() {
for (const subkey of kExtensionSubkeys) {
const reg = Cc["@mozilla.org/windows-registry-key;1"].createInstance(
Ci.nsIWindowsRegKey
);
try {
reg.open(
Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
"Software\\Classes\\" + subkey,
Ci.nsIWindowsRegKey.ACCESS_ALL
);
if (reg.readStringValue("") != kClsidTestShellEx) {
// If another extension is registered, don't overwrite it.
continue;
}
// Set an empty string instead of deleting the key
// not to touch non-default values.
reg.writeStringValue("", "");
} catch (e) {
info(`Failed to unregister \`${subkey}\`: ` + e);
} finally {
reg.close();
}
}
const reg = Cc["@mozilla.org/windows-registry-key;1"].createInstance(
Ci.nsIWindowsRegKey
);
reg.open(
Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
"Software\\Classes\\CLSID",
Ci.nsIWindowsRegKey.ACCESS_ALL
);
try {
const child = reg.openChild(
kClsidTestShellEx,
Ci.nsIWindowsRegKey.ACCESS_ALL
);
try {
child.removeChild("InprocServer32");
} catch (e) {
} finally {
child.close();
}
reg.removeChild(kClsidTestShellEx);
} catch (e) {
} finally {
reg.close();
}
}