// Note that the `extensions.background.idle.timeout` pref needs to be set to a // a high value if using the following APIs, to avoid intermittent failures due // to the background being stopped for being idle.
async #run(command, ...args) { return await SpecialPowers.spawn( this.extension.backgroundContext.xulBrowser,
args,
command
);
}
async allOriginalInterventions() { returnthis.#run(async function () { const available =
content.wrappedJSObject.interventions.getAllOriginalInterventions(); // structured cloning won't work, so get the interesting bits for tests. return JSON.parse(JSON.stringify(available));
});
}
async availableInterventions() { returnthis.#run(async function () { const available =
content.wrappedJSObject.interventions.getAvailableInterventions(); // structured cloning won't work, so get the interesting bits for tests. return JSON.parse(JSON.stringify(available));
});
}
async availableShims() { returnthis.#run(async function () { // structured cloning won't work, so get the interesting bits for tests. const available = []; for (let shim of content.wrappedJSObject.shims.shims.values()) { constfinal = {}; for (let [name, value] of Object.entries(shim)) { if (name !== "manager" && !name.startsWith("_")) { final[name] = value;
}
} final.enabled = shim.enabled;
available.push(final);
} return JSON.parse(JSON.stringify(available));
});
}
// Force a shim's enabled-state transition to fully complete (including the // AllowList registration via browser.trackingProtection.shim/revoke). // Toggling extensions.webcompat.disabled_shims.<id> from the parent process // triggers the extension's pref-change listener which calls // _onEnabledStateChanged but does NOT await it, so the listener finishes // before _allowRequestsInETP has updated the urlclassifier-before-block- // channel AllowList. This explicitly re-invokes and awaits the transition.
async settleShimStateChange(_id) { returnthis.#run(async function (id) { const shim = content.wrappedJSObject.shims.shims.get(id); if (!shim) { return;
}
await shim._onEnabledStateChanged({ alsoClearResourceCache: true });
}, _id);
}
const TrackingProtection =
tab.documentGlobal.gProtectionsHandler.blockers.TrackingProtection;
ok(TrackingProtection, "TP is attached to the tab");
ok(TrackingProtection.enabled, "TP is enabled");
async function clickOnPagePlaceholder(tab) { // Setup promise for listening for protections panel open
let popupShownPromise = BrowserTestUtils.waitForEvent(
window, "popupshown", true,
e => e.target.id == panelId()
);
await SpecialPowers.spawn(tab.linkedBrowser, [], async () => { // Check that the "embed" was replaced with a placeholder
let placeholder = content.document.querySelector( ".shimmed-embedded-content"
);
ok(placeholder, "Embed is replaced with a placeholder");
// Get the button element from the placeholder
let shadowRoot = placeholder.openOrClosedShadowRoot;
ok(shadowRoot, "Shadow root exists");
// Check that all elements are present
let placeholderButton = shadowRoot.querySelector( "#smartblock-placeholder-button"
);
ok(placeholderButton, "Placeholder button exists");
let placeholderTitle = shadowRoot.querySelector( "#smartblock-placeholder-title"
);
ok(placeholderTitle, "Placeholder title exists");
let placeholderLabel = shadowRoot.querySelector( "#smartblock-placeholder-desc"
);
ok(placeholderLabel, "Placeholder description exists");
let placeholderImage = shadowRoot.querySelector( "#smartblock-placeholder-image"
);
ok(placeholderImage, "Placeholder image exists");
// Click button to open protections panel
EventUtils.synthesizeMouseAtCenter(placeholderButton, {}, content);
});
// If this await finished, then protections panel is open return popupShownPromise;
}
async function enableContentClassifierBlockList(blockListUrl) {
let wasEnabled = Services.prefs.getBoolPref(
CONTENT_CLASSIFIER_PROTECTION_ENABLED_PREF, false
);
let currentUrl = Services.prefs.getStringPref(
CONTENT_CLASSIFIER_PROTECTION_LIST_URLS_PREF, ""
);
let needsLoad = !wasEnabled || currentUrl !== blockListUrl;
let listsLoaded = needsLoad
? TestUtils.topicObserved(CONTENT_CLASSIFIER_LISTS_LOADED_TOPIC)
: null;
function disableContentClassifier() {
Services.prefs.clearUserPref(CONTENT_CLASSIFIER_TESTING_PREF);
Services.prefs.clearUserPref(CONTENT_CLASSIFIER_PROTECTION_ENABLED_PREF);
Services.prefs.clearUserPref(CONTENT_CLASSIFIER_PROTECTION_LIST_URLS_PREF);
}
// Wait for the webcompat extension to settle a shim's effective enabled // state. Toggling `extensions.webcompat.disabled_shims.<id>` triggers an // async pref-change listener in the extension that updates the shim and // re-registers its matches with the urlclassifier-before-block-channel // AllowList; polling shim.enabled alone only confirms the listener has // observed the new pref value, not that the registration has completed, // so we follow up with settleShimStateChange.
async function waitForShimEnabledState(shimId, expectedEnabled) {
await TestUtils.waitForCondition(
async () => { const shims = await WebCompatExtension.availableShims(); const shim = shims.find(s => s.id === shimId); return shim?.enabled === expectedEnabled;
},
`Shim ${shimId} should be ${expectedEnabled ? "enabled" : "disabled"}`
);
await WebCompatExtension.settleShimStateChange(shimId);
}
async function generateTestShims() {
await WebCompatExtension.updateShims([
{
id: "MochitestShim",
platform: "all",
branch: ["all:ignoredOtherPlatform"],
name: "Test shim for Mochitests",
bug: "mochitest",
file: "mochitest-shim-1.js",
matches: [ "*://example.com/browser/browser/extensions/webcompat/tests/browser/shims_test.js",
],
needsShimHelpers: ["getOptions", "optIn"],
options: {
simpleOption: true,
complexOption: { a: 1, b: "test" },
branchValue: { value: true, branches: [] },
platformValue: { value: true, platform: "neverUsed" },
},
unblocksOnOptIn: ["*://trackertest.org/*"],
},
{
disabled: true,
id: "MochitestShim2",
platform: "all",
name: "Test shim for Mochitests (disabled by default)",
bug: "mochitest",
file: "mochitest-shim-2.js",
matches: [ "*://example.com/browser/browser/extensions/webcompat/tests/browser/shims_test_2.js",
],
needsShimHelpers: ["getOptions", "optIn"],
options: {
simpleOption: true,
complexOption: { a: 1, b: "test" },
branchValue: { value: true, branches: [] },
platformValue: { value: true, platform: "neverUsed" },
},
unblocksOnOptIn: ["*://trackertest.org/*"],
},
{
id: "MochitestShim3",
platform: "all",
name: "Test shim for Mochitests (host)",
bug: "mochitest",
file: "mochitest-shim-3.js",
notHosts: ["example.com"],
matches: [ "*://example.com/browser/browser/extensions/webcompat/tests/browser/shims_test_3.js",
],
},
{
id: "MochitestShim4",
platform: "all",
name: "Test shim for Mochitests (notHost)",
bug: "mochitest",
file: "mochitest-shim-3.js",
hosts: ["example.net"],
matches: [ "*://example.com/browser/browser/extensions/webcompat/tests/browser/shims_test_3.js",
],
},
{
id: "MochitestShim5",
platform: "all",
name: "Test shim for Mochitests (branch)",
bug: "mochitest",
file: "mochitest-shim-3.js",
branches: ["never matches"],
matches: [ "*://example.com/browser/browser/extensions/webcompat/tests/browser/shims_test_3.js",
],
},
{
id: "MochitestShim6",
platform: "never matches",
name: "Test shim for Mochitests (platform)",
bug: "mochitest",
file: "mochitest-shim-3.js",
matches: [ "*://example.com/browser/browser/extensions/webcompat/tests/browser/shims_test_3.js",
],
},
{
id: "MochitestShimXHR",
platform: "all",
name: "Test shim for fetch blocking",
bug: "mochitest",
file: "empty-shim.txt",
matches: [ "*://itisatracker.org/browser/browser/extensions/webcompat/tests/browser/shims_test_fetch.txt",
],
onlyIfBlockedByETP: true,
},
{ // Shim used by browser_shims.js content-classifier tests. Registers // a match for the fetch URL so the urlclassifier-before-block-channel // listener will call channel.replace(). No file/target/runFirst so // there is no webRequest redirect and the content classifier sees // the original URL.
disabled: true,
id: "MochitestShimContent",
platform: "all",
name: "Test shim for content classifier replace path",
bug: "mochitest",
matches: [
{
patterns: [ "*://itisatracker.org/browser/browser/extensions/webcompat/tests/browser/shims_test_fetch.txt",
],
types: ["xmlhttprequest"],
},
],
},
{
id: "EmbedTestShim",
platform: "desktop",
name: "Test shim for smartblock embed unblocking",
bug: "1892175",
runFirst: "embed-test-shim.js", // Blank stub file just so we run the script above when the matched script // files get blocked.
file: "empty-script.js",
matches: [ "https://itisatracker.org/browser/browser/extensions/webcompat/tests/browser/embed_test.js",
], // Use instagram logo as an example
logos: ["instagram.svg"],
needsShimHelpers: [ "embedClicked", "smartblockEmbedReplaced", "smartblockGetFluentString", "shouldShowEmbedContentInPlaceholders",
],
isSmartblockEmbedShim: true,
onlyIfBlockedByETP: true,
unblocksOnOptIn: ["*://itisatracker.org/*"],
},
]);
registerCleanupFunction(async () => {
await WebCompatExtension.resetInterventionsAndShimsToDefaults();
});
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-08-25)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.