mirror of
https://github.com/mdn/webextensions-examples.git
synced 2026-04-16 06:18:35 +02:00
* MDN get started tutorial examples to manifest V3 * Migrate to Scripting API * Updated to readmes and code comments * Apply suggestions to readmes from review Co-authored-by: Simeon Vincent <svincent@gmail.com> * Convert choose_beast.js to async * Apply suggestions from review Co-authored-by: Simeon Vincent <svincent@gmail.com> * Updated illustrated API list for beastify * Apply suggestions from review Co-authored-by: Rob Wu <rob@robwu.nl> --------- Co-authored-by: Simeon Vincent <svincent@gmail.com> Co-authored-by: Rob Wu <rob@robwu.nl>
115 lines
3.2 KiB
JavaScript
115 lines
3.2 KiB
JavaScript
/**
|
|
* CSS to hide everything on the page,
|
|
* except for elements that have the ".beastify-image" class.
|
|
*/
|
|
const hidePage = `body > :not(.beastify-image) {
|
|
display: none !important;
|
|
}`;
|
|
|
|
/**
|
|
* Listen for clicks on the buttons, and send the appropriate message to
|
|
* the content script in the page.
|
|
*/
|
|
function listenForClicks() {
|
|
document.addEventListener("click", async (e) => {
|
|
/**
|
|
* Given the name of a beast, get the URL for the corresponding image.
|
|
*/
|
|
function beastNameToURL(beastName) {
|
|
switch (beastName) {
|
|
case "Frog":
|
|
return browser.runtime.getURL("beasts/frog.jpg");
|
|
case "Snake":
|
|
return browser.runtime.getURL("beasts/snake.jpg");
|
|
case "Turtle":
|
|
return browser.runtime.getURL("beasts/turtle.jpg");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Insert the page-hiding CSS into the active tab,
|
|
* get the beast URL, and
|
|
* send a "beastify" message to the content script in the active tab.
|
|
*/
|
|
async function beastify(tab) {
|
|
await browser.scripting.insertCSS({
|
|
target: { tabId: tab.id },
|
|
css: hidePage,
|
|
});
|
|
const url = beastNameToURL(e.target.textContent);
|
|
await browser.tabs.sendMessage(tab.id, {
|
|
command: "beastify",
|
|
beastURL: url,
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Remove the page-hiding CSS from the active tab and
|
|
* send a "reset" message to the content script in the active tab.
|
|
*/
|
|
async function reset(tab) {
|
|
await browser.scripting.removeCSS({
|
|
target: { tabId: tab.id },
|
|
css: hidePage,
|
|
});
|
|
await browser.tabs.sendMessage(tab.id, { command: "reset" });
|
|
}
|
|
|
|
/**
|
|
* Log the error to the console.
|
|
*/
|
|
function reportError(error) {
|
|
console.error(`Could not beastify: ${error}`);
|
|
}
|
|
|
|
/**
|
|
* Get the active tab,
|
|
* then call "beastify()" or "reset()" as appropriate.
|
|
*/
|
|
if (e.target.tagName !== "BUTTON" || !e.target.closest("#popup-content")) {
|
|
// Ignore when click is not on a button within <div id="popup-content">.
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const [tab] = await browser.tabs.query({ active: true, currentWindow: true });
|
|
|
|
if (e.target.type === "reset") {
|
|
await reset(tab);
|
|
} else {
|
|
await beastify(tab);
|
|
}
|
|
} catch (error) {
|
|
reportError(error);
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* There was an error executing the script.
|
|
* Display the popup's error message, and hide the normal UI.
|
|
*/
|
|
function reportExecuteScriptError(error) {
|
|
document.querySelector("#popup-content").classList.add("hidden");
|
|
document.querySelector("#error-content").classList.remove("hidden");
|
|
console.error(`Failed to execute beastify content script: ${error.message}`);
|
|
}
|
|
|
|
/**
|
|
* When the popup loads, inject a content script into the active tab
|
|
* and add a click handler.
|
|
* If the extension couldn't inject the script, handle the error.
|
|
*/
|
|
(async function runOnPopupOpened() {
|
|
try {
|
|
const [tab] = await browser.tabs.query({ active: true, currentWindow: true });
|
|
|
|
await browser.scripting.executeScript({
|
|
target: { tabId: tab.id },
|
|
files: ["/content_scripts/beastify.js"],
|
|
});
|
|
listenForClicks();
|
|
} catch (e) {
|
|
reportExecuteScriptError(e);
|
|
}
|
|
})(); |