2 ã¤ãã®æ¡å¼µæ©è½
åãã¦ã®æ¡å¼µæ©è½ãä¸éãèªãã§ããå ´åãæ¢ã«æ¡å¼µæ©è½ã®æ¸ãæ¹ãç¥ã£ã¦ãããã¨ã¨æãã¾ãããã®è¨äºã§ã¯ãAPI ã®ä½¿ãæ¹ããã詳ãã説æãããããååãããå°ãè¤éãªã¢ããªã³ãæ¸ãã¦ã¿ã¾ãã
ãã®æ¡å¼µæ©è½ã§ã¯ Firefox ã®ãã¼ã«ãã¼ã«ãã¿ã³ãæ°ãã追å ãã¾ããã¦ã¼ã¶ã¼ããã®ãã¿ã³ãã¯ãªãã¯ããã¨ãåç©ã鏿ã§ãããããã¢ããã表示ããã¾ããã¦ã¼ã¶ã¼ãåç©ã鏿ããã¨ãã¦ã§ããã¼ã¸ã®ã³ã³ãã³ãã鏿ããåç©ã®ç»åã«ç½®ãæããã¾ãã
ãããã®æ©è½ã以ä¸ã®ããã«å®è£ ãã¦ããã¾ãã
-
ãã©ã¦ã¶ã¼ã¢ã¯ã·ã§ã³ï¼Firefox ã®ãã¼ã«ãã¼ã«è¡¨ç¤ºããããã¿ã³ï¼ãå®ç¾© ãã®ãã¿ã³ç¨ã«æ¬¡ã®ãã®ãç¨æãã¾ãã
- "beasts-32.png" ã¨ããã¢ã¤ã³ã³
- ãã¿ã³æ¼ä¸æã«éããããã¢ããï¼HTML / CSS / JavaScript ã§è¨è¿°ï¼
-
æ¡å¼µæ©è½ã®ã¢ã¤ã³ã³ãå®ç¾©ï¼ãã¡ã¤ã«å: "beasts-48.png"ï¼ãããã¯ã¢ããªã³ããã¼ã¸ã£ã¼ã«è¡¨ç¤ºããã¾ãã
-
ã¦ã§ããã¼ã¸ã«èªã¿è¾¼ã¾ããã³ã³ãã³ãã¹ã¯ãªãã "beastify.js" ã使 ãã®ã¹ã¯ãªããã«ãã£ã¦ã¦ã§ããã¼ã¸ãå®éã«å¤æ´ããã¾ãã
-
ã¦ã§ããã¼ã¸ãç½®ãæããåç©ã®ç»åãããã±ã¼ã¸å ç»åã "web-accessible ãªãªã½ã¼ã¹" ã¨ããã¦ã§ããã¼ã¸ããåç §ã§ããããã«ãã¾ãã
æ¡å¼µæ©è½ã®å ¨ä½çãªæ§é ã¯ããã®ããã«ã¤ã¡ã¼ã¸ãã¦ããã ããã°ã¨æãã¾ãã

ãã®æ¡å¼µæ©è½ã¯ã·ã³ãã«ã§ãããWebExtensions API ã®åºæ¬çãªã³ã³ã»ãããå¤ãå«ãã§ãã¾ãã
- ãã¼ã«ãã¼ã«ãã¿ã³ã追å ãã
- HTML / CSS / JavaScript ãç¨ãã¦ãããã¢ããã®ããã«ãå®ç¾©ãã
- ã¦ã§ããã¼ã¸ã«ã³ã³ãã³ãã¹ã¯ãªãããå·®ãè¾¼ã
- æ¡å¼µæ©è½ã®ä¸ã«ããã¦ã³ã³ãã³ãã¹ã¯ãªããã¨ä»ã®ã¹ã¯ãªããã¨ãéä¿¡ããã
- ã¦ã§ããã¼ã¸ã§ç¨ãããªã½ã¼ã¹ãæ¡å¼µæ©è½ã«ããã±ã¼ã¸åãã
æ¡å¼µæ©è½ãæ¸ã
æ°ãããã£ã¬ã¯ããªã¼ã使ãããã®ãã£ã¬ã¯ããªã¼ã«ç§»åãã¾ãã
mkdir beastify
cd beastify
manifest.json
ããã§ã¯ã"beastify" ãã£ã¬ã¯ããªã¼é ä¸ã«æ°ãããã¡ã¤ã« "manifest.json" ã使ãã¾ãã以ä¸ã®å å®¹ãæ¸ãè¾¼ãã§ä¿åãã¦ãã ããã
{
"manifest_version": 2,
"name": "Beastify",
"version": "1.0",
"description": "Adds a browser action icon to the toolbar. Click the button to choose a beast. The active tab's body content is then replaced with a picture of the chosen beast. See https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/Examples#beastify",
"homepage_url": "https://github.com/mdn/webextensions-examples/tree/main/beastify",
"icons": {
"48": "icons/beasts-48.png"
},
"permissions": ["activeTab"],
"browser_action": {
"default_icon": "icons/beasts-32.png",
"default_title": "Beastify",
"default_popup": "popup/choose_beast.html"
},
"web_accessible_resources": [
"beasts/frog.jpg",
"beasts/turtle.jpg",
"beasts/snake.jpg"
]
}
-
æåã® 3 ã¤ã®ãã¼
manifest_versionãnameãversionã¯å¿ é ã§ãããæ¡å¼µæ©è½ã®åºæ¬çãªã¡ã¿ãã¼ã¿ãæå®ãã¾ã -
descriptionã¨homepage_urlã¯çç¥å¯è½ã§ãããè¨å®ãã¦ãããã¨ããå§ããã¾ããããã¯æ¡å¼µæ©è½ã«ã¤ãã¦ã®å½¹ç«ã¤æ å ±ã¨ãªãã¾ã -
iconsã¯çç¥å¯è½ã§ãããè¨å®ãã¦ãããã¨ããå§ããã¾ãããã®å¤ã¯æ¡å¼µæ©è½ã®ã¢ã¤ã³ã³ãæå®ãããã®ã§ãããã¢ã¤ã³ã³ã¯ã¢ããªã³ããã¼ã¸ã£ã¼ã«è¡¨ç¤ºããã¾ã -
permissionsã¯æ¡å¼µæ©è½ã«å¿ è¦ãªãã¼ããã·ã§ã³ã®ãªã¹ãã§ããããã§ã¯activeTabãã¼ããã·ã§ã³ ãè¦è«ãã¦ãã¾ã -
browser_actionã¯ãã¼ã«ãã¼ã®ãã¿ã³ãæå®ãããã®ã§ããããã§ã¯ 3 ã¤ã®æ å ±ãæå®ãã¦ãã¾ãdefault_iconã§ã¯ãã¿ã³ã®ã¢ã¤ã³ã³ãæå®ãã¾ãï¼å¿ é é ç®ï¼default_titleã§ã¯ãã¼ã«ãããã®æååãæå®ãã¾ãï¼çç¥å¯ï¼default_popupã§ã¯ã¦ã¼ã¶ã¼ããã¿ã³ãã¯ãªãã¯ããéã«è¡¨ç¤ºããããããã¢ãããæå®ãã¾ããä»åã¯ãããã¢ããã表示ããããã®ã§ãæ¡å¼µæ©è½ã«å«ãã HTML ãã¡ã¤ã«ãdefualt_popupãã¼ã§æå®ãã¦ãã¾ã
-
web_accessible_resourcesã¯ã¦ã§ããã¼ã¸ããã¢ã¯ã»ã¹ããããã¡ã¤ã«ã®ãªã¹ãã§ãããã®æ¡å¼µæ©è½ã§ã¯ãæ¡å¼µæ©è½ã«å梱ããç»åã§ã¦ã§ããã¼ã¸ãç½®ãæãããããç»åãã¦ã§ããã¼ã¸ããã¢ã¯ã»ã¹å¯è½ã«ããå¿ è¦ãããã¾ã
ãã¹ã¯ãã¹ã¦ manifest.json èªèº«ããã®ç¸å¯¾ãã¹ã§æå®ãããã¨ã«æ³¨æãã¾ãã
ã¢ã¤ã³ã³
æ¡å¼µæ©è½ã«ã¯ã¢ã¤ã³ã³ãç¨æããã¨è¯ãã§ãããããã®ã¢ã¤ã³ã³ã¯ãã¢ããªã³ããã¼ã¸ã£ã¼ã§æ¡å¼µæ©è½ã®ãªã¹ã横ã«è¡¨ç¤ºããã¾ãï¼ã¢ããªã³ããã¼ã¸ã£ã¼ã¯ "about:addons" ã® URL ãã確èªã§ãã¾ãï¼ãä»åã® manifest.json ã§ã¯ "icons/beasts-48.png" ãç¨æãã¦ããã¨å®£è¨ãã¦ãã¾ãã
"icons" ãã£ã¬ã¯ããªã¼ã使ãã¦ãããã«ã¢ã¤ã³ã³ã "beasts-48.png" ã¨ããååã§ ä¿åãã¾ããå¿ è¦ã§ããã° ãµã³ãã«ã§ä½¿ç¨ãã¦ããã¢ã¤ã³ã³ãå©ç¨ãã¦ãæ§ãã¾ããï¼ãã®ã¢ã¤ã³ã³ã¯ Aha-Soft's Free Retina iconset ããå¼ç¨ãããã®ã§ããã該å½ããã©ã¤ã»ã³ã¹ã®ä¸ã§ä½¿ç¨ãã¦ãã¾ãï¼ã
ã¢ã¤ã³ã³ãèªåã§ç¨æããå ´å 48x48 ãã¯ã»ã«ã®ãµã¤ãºã«ããå¿
è¦ãããã¾ããé«è§£å度ã®ãã£ã¹ãã¬ã¤ã« 96x96 ãã¯ã»ã«ã®ã¢ã¤ã³ã³ã表示ããããå ´åã¯ãmanifest.json ã® icons ãªãã¸ã§ã¯ãã« 96 ã¨ããããããã£ã§è¨å®ãã¦ãã ããã
"icons": {
"48": "icons/beasts-48.png",
"96": "icons/beasts-96.png"
}
ãã¼ã«ãã¼ã®ãã¿ã³
ãã¼ã«ãã¼ã®ãã¿ã³ã«ãã¢ã¤ã³ã³ãå¿ è¦ã§ããä»åã® manifest.json ã§ã¯ "icons/beasts-32.png" ãç¨æãã¦ããã¨å®£è¨ãã¦ãã¾ãã
ã¢ã¤ã³ã³ã "beasts-32.png" ã¨ããååã§ "icons" ãã£ã¬ã¯ããªã¼å ã«ä¿åãã¾ããå¿ è¦ã§ããã° ãµã³ãã«ã§ä½¿ç¨ãã¦ããã¢ã¤ã³ã³ ãå©ç¨ãã¦ãæ§ãã¾ããï¼ãã®ã¢ã¤ã³ã³ã¯ IconBeast Lite ã®ã¢ã¤ã³ã³é ããå¼ç¨ãããã®ã§ããã該å½ãã ã©ã¤ã»ã³ã¹ ã®ä¸ã§ä½¿ç¨ãã¦ãã¾ãï¼ã
ãããã¢ããã使ããªãå ´åãã¦ã¼ã¶ã¼ããã¿ã³ãã¯ãªãã¯ããéã«ã¯ã¯ãªãã¯ã¤ãã³ããæ¡å¼µæ©è½ã«åãã¦éåºããã¾ãããããã¢ããã使ãå ´åã«ã¯ã¯ãªãã¯ã¤ãã³ãã¯éåºãããã代ããã«ãããã¢ãããéãã¾ããä»åã¯ãããã¢ãããå¿ è¦ãªã®ã§ã次ã®é ã§ä½æãã¾ãããã
ãããã¢ãã
ä»åã®ãããã¢ããã§ã¯ãã¦ã¼ã¶ã¼ã 3 ã¤ã®åç©ãã 1 ã¤é¸æã§ããæ©è½ãæã¤ãã¨ã¨ãã¾ãã
æ¡å¼µæ©è½ã®ã«ã¼ããã£ã¬ã¯ããªã¼é ä¸ã« "popup" ã¨ãããã£ã¬ã¯ããªã¼ãæ°ãã使ãã¾ããããã«ã¯ãããã¢ããç¨ã®ã³ã¼ããä¿ç®¡ãã¾ãããããã¢ããã¯æ¬¡ã® 3 ãã¡ã¤ã«ããæ§æããã¾ãã
choose_beast.htmlããã«ã®ã³ã³ãã³ããå®ç¾©ããchoose_beast.cssã³ã³ãã³ãã®ã¹ã¿ã¤ã«ãæå®ããchoose_beast.jsã¢ã¯ãã£ããªã¿ãã§ã³ã³ãã³ãã¹ã¯ãªãããå®è¡ããã¦ã¼ã¶ã¼ã®é¸æãå¦çãã
mkdir popup
cd popup
touch choose_beast.html choose_beast.css choose_beast.js
choose_beast.html
HTML ãã¡ã¤ã«ã¯æ¬¡ã®ããã«ãªãã¾ãã
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="choose_beast.css" />
</head>
<body>
<div id="popup-content">
<button>Frog</button>
<button>Turtle</button>
<button>Snake</button>
<button type="reset">Reset</button>
</div>
<div id="error-content" class="hidden">
<p>Can't beastify this web page.</p>
<p>Try a different page.</p>
</div>
<script src="choose_beast.js"></script>
</body>
</html>
"popup-content" ã¨ãã ID ã® <div> è¦ç´ ããã£ã¦ãåç©ã®é¸æããããã¿ã³ã¨ãªã»ãããã¿ã³å
¥ã£ã¦ãã¾ãã"error-content" ã¨ãã ID ã® <div> è¦ç´ 㨠"hidden" ã¯ã©ã¹ãããã¾ããããã¯ãããã¢ããã®åæåã«åé¡ãããå ´åã«ä½¿ãã¾ãã
é常ã®ã¦ã§ããã¼ã¸ã¨åãããã« CSS 㨠JS ãã¡ã¤ã«ãèªã¿è¾¼ãã§ãããã¨ã«æ³¨æãã¦ãã ããã
choose_beast.css
ãã® CSS ã§ã¯ãããã¢ããã®ãµã¤ãºãåºå®ãã3 ã¤ã®é¸æè¢ããããã¢ãããåããããã«ããåºæ¬çãªã¹ã¿ã¤ãªã³ã°ãæ½ãã¦ãã¾ããã¾ãè¦ç´ ã class="hidden" ã§é ãã¦ããã¾ã: ã¤ã¾ã <div id="error-content"... ã¯æ¢å®ã§ã¯é ãã¦ãã¾ãã
html,
body {
width: 100px;
}
.hidden {
display: none;
}
button {
border: none;
width: 100%;
margin: 3% auto;
padding: 4px;
text-align: center;
font-size: 1.5em;
cursor: pointer;
background-color: #e5f2f2;
}
button:hover {
background-color: #cff2f2;
}
button[type="reset"] {
background-color: #fbfbc9;
}
button[type="reset"]:hover {
background-color: #eaea9d;
}
choose_beast.js
ããããããã¢ããç¨ã® JavaScript ã§ãã
/**
* ãã¼ã¸ã®ãã¹ã¦ãé ã CSSããã ã
* "beastify-image" ã¯ã©ã¹ãæã¤è¦ç´ ã¯é¤ã
*/
const hidePage = `body > :not(.beastify-image) {
display: none;
}`;
/**
* ãã¿ã³ã¯ãªãã¯ãå¾
ã¡åããããã¼ã¸å
ã®ã³ã³ãã³ãã¹ã¯ãªããã«
* é©åãªã¡ãã»ã¼ã¸ãéã
*/
function listenForClicks() {
document.addEventListener("click", (e) => {
/**
* åç©ã®ååãåãåã£ã¦ã対å¿ããç»åã® URL ãåå¾ãã
*/
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");
}
}
/**
* ã¢ã¯ãã£ããªã¿ãã«ãã¼ã¸ãé ã CSS ãæ¿å
¥ãã¦
* åç©ã® URL ãåå¾ãã
* ã¢ã¯ãã£ããªã¿ãã®ã³ã³ãã³ãã¹ã¯ãªããã« "beastify" ã¡ãã»ã¼ã¸ãéã
*/
function beastify(tabs) {
browser.tabs.insertCSS({ code: hidePage }).then(() => {
const url = beastNameToURL(e.target.textContent);
browser.tabs.sendMessage(tabs[0].id, {
command: "beastify",
beastURL: url,
});
});
}
/**
* ã¢ã¯ãã£ããªã¿ããããã¼ã¸ãé ã CSS ãåé¤ãã
* ã¢ã¯ãã£ããªã¿ãã®ã³ã³ãã³ãã¹ã¯ãªããã« "reset" ã¡ãã»ã¼ã¸ãéã
*/
function reset(tabs) {
browser.tabs.removeCSS({ code: hidePage }).then(() => {
browser.tabs.sendMessage(tabs[0].id, {
command: "reset",
});
});
}
/**
* ãã ã³ã³ã½ã¼ã«ã«ã¨ã©ã¼ããã°åºåãã
*/
function reportError(error) {
console.error(`Could not beastify: ${error}`);
}
/**
* ã¢ã¯ãã£ããªã¿ããåå¾ãã
* "beastify()" ã "reset()" ãé©åã«å¼ã³åºã
*/
if (e.target.tagName !== "BUTTON" || !e.target.closest("#popup-content")) {
// <div id="popup-content"> å
ã®ãã¿ã³ãã¯ãªãã¯ããã¦ããªãå ´åã¯ç¡è¦ã
return;
}
if (e.target.type === "reset") {
browser.tabs
.query({ active: true, currentWindow: true })
.then(reset)
.catch(reportError);
} else {
browser.tabs
.query({ active: true, currentWindow: true })
.then(beastify)
.catch(reportError);
}
});
}
/**
* ã¹ã¯ãªããã«ã¨ã©ã¼ããã£ãã
* ãããã¢ããã®ã¨ã©ã¼ã¡ãã»ã¼ã¸ã表示ããé常㮠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}`);
}
/**
* ãããã¢ãããèªã¿è¾¼ãã æãã³ã³ãã³ãã¹ã¯ãªãããã¢ã¯ãã£ããªã¿ãã«æ¿å
¥ãã
* ã¯ãªãã¯ãã³ãã©ã¼ã追å ããã
* ã¹ã¯ãªããã®æ¿å
¥ãã§ããªãå ´åãã¨ã©ã¼å¦çãããã
*/
browser.tabs
.executeScript({ file: "/content_scripts/beastify.js" })
.then(listenForClicks)
.catch(reportExecuteScriptError);
éå§ããã®ã¯ 99 è¡ç®ã§ãããããã¢ããã¹ã¯ãªããã¯ãããã¢ãããèªã¿è¾¼ã¾ã次第ãã¢ã¯ãã£ããªã¿ãã®ã³ã³ãã³ãã¹ã¯ãªãããå®è¡ãããã®ææ®µã¯ browser.tabs.executeScript() API ã§ããã³ã³ãã³ãã¹ã¯ãªããã®å®è¡ãæåããããã¿ããéãããããã¦ã¼ã¶ã¼ãå¥ã®ãã¼ã¸ã«ç§»åããã¾ã§ãã³ã³ãã³ãã¹ã¯ãªããããã¼ã¸ã«ãã¼ããããã¾ã¾ã«ãªãã¾ãã
browser.tabs.executeScript() ã®å¼ã³åºãããã失æããçç±ã¯ãã³ã³ãã³ãã¹ã¯ãªããããã¹ã¦ã®ãã¼ã¸ã§ã¯å®è¡ã§ããªããã¨ã§ããä¾ãã°ãabout:debugging ã®ãããªæ¨©éã®ãããã©ã¦ã¶ã¼ãã¼ã¸ã§ã¯å®è¡ã§ãã¾ããããaddons.mozilla.org ãã¡ã¤ã³å
ã®ãã¼ã¸ã§ãå®è¡ã§ãã¾ããã失æããå ´åãreportExecuteScriptError() 㯠<div id="popup-content"> ãé ãã¦ã<div id="error-content"... ã表示ããã¨ã©ã¼ã console ã«ãã°åºåãã¾ãã
ã³ã³ãã³ãã¹ã¯ãªããã®å®è¡ãæåããããlistenForClicks() ãå¼ã³åºãã¾ããããã¯ãããã¢ããã®ã¯ãªãã¯ãå¾
ã¡åããã¾ãã
- ã¯ãªãã¯å ããããã¢ããå ã®ãã¿ã³ã§ãªããã°ãç¡è¦ãã¦ä½ãããªã
type="reset"ã®ä»ãããã¿ã³ãã¯ãªãã¯ãããããreset()ãå¼ã³åºã- ãã®ä»ã®ãã¿ã³ï¼ã¤ã¾ã beast ãã¿ã³ï¼ãã¯ãªãã¯ãããã
beastify()ãå¼ã³åºã
beastify() 颿°ã¯æ¬¡ã® 3 ã¤ãè¡ãã¾ãã
- ç¹å®ã®åç©ç»åãæã URL ããã¿ã³ã¯ãªãã¯ã«å²ãå½ã¦ã
- CSS ãæ¿å
¥ãã¦ãã¼ã¸ã®å
¨ã³ã³ãã³ããé ãããã®ææ®µã¯
browser.tabs.insertCSS()API - ã³ã³ãã³ãã¹ã¯ãªããã« "beastify" éãããã®ææ®µã¯
browser.tabs.sendMessage()APIããã¼ã¸ãåç©åãããå°ãã¦ãåç©ç»åã¸ã® URL ãæ¸¡ã
reset() 颿°ã¯åç©åãåãæ¶ãã¾ãã
- 追å ãã CSS ãåé¤ãããã®ææ®µã¯
browser.tabs.removeCSS()API - ã³ã³ãã³ãã¹ã¯ãªããã«ãã¼ã¸ããªã»ãããã "reset" ã¡ãã»ã¼ã¸ãéã
ã³ã³ãã³ãã¹ã¯ãªãã
æ¡å¼µæ©è½ã®ã«ã¼ããã£ã¬ã¯ããªã¼é ä¸ã« "content_scripts" ã¨ãããã£ã¬ã¯ããªã¼ãæ°ãã使ãã¾ããç¶ãã¦ããã« "beastify.js" ã¨ããååã®ãã¡ã¤ã«ã使ããä¸è¨ã®ã¹ã¯ãªãããè¨è¿°ãã¾ãã
(() => {
/**
* ã°ãã¼ãã«ãªã¬ã¼ã夿°ããã§ãã¯ãè¨å®ããã
* ã³ã³ãã³ãã¹ã¯ãªãããåã³åããã¼ã¸ã«æ¿å
¥ãããå ´åã
* 次ã¯ä½ãããªãã
*/
if (window.hasRun) {
return;
}
window.hasRun = true;
/**
* åç©ã®ç»åã® URL ãåãåããæ¢åã®åç©ããã¹ã¦åé¤ããæ¬¡ã«
* ç»åãæã IMG è¦ç´ ã®ä½æã»ã¹ã¿ã¤ã«é©ç¨ãè¡ãã
* 使ãããã¼ããããã¥ã¡ã³ãå
ã«æ¿å
¥ãã
*/
function insertBeast(beastURL) {
removeExistingBeasts();
const beastImage = document.createElement("img");
beastImage.setAttribute("src", beastURL);
beastImage.style.height = "100vh";
beastImage.className = "beastify-image";
document.body.appendChild(beastImage);
}
/**
* ãã¼ã¸ãããã¹ã¦ã®åç©ãåé¤ãã
*/
function removeExistingBeasts() {
const existingBeasts = document.querySelectorAll(".beastify-image");
for (const beast of existingBeasts) {
beast.remove();
}
}
/**
* ããã¯ã°ã©ã¦ã³ãã¹ã¯ãªããããã®ã¡ãã»ã¼ã¸ãå¾
ã¡åããã
* "beastify()" ã "reset()" ãå¼ã³åºãã
*/
browser.runtime.onMessage.addListener((message) => {
if (message.command === "beastify") {
insertBeast(message.beastURL);
} else if (message.command === "reset") {
removeExistingBeasts();
}
});
})();
ãã®ã³ã³ãã³ãã¹ã¯ãªãããæåã«ãããã¨ã¯ãã°ãã¼ãã«å¤æ°ã® window.hasRun ã®ãã§ãã¯ã§ã: ã»ããããã¦ããã°ã¹ã¯ãªããã¯æ©ããªã¿ã¼ã³ããããã§ãªããã° window.hasRun ãã»ãããã¦å¦çãç¶ãã¾ããããããçç±ã¯ãã¦ã¼ã¶ã¼ããããã¢ãããéããã³ã«ããããã¢ããã¯ã¢ã¯ãã£ããªã¿ãã®ã³ã³ãã³ãã¹ã¯ãªãããå®è¡ãã¦ããã®ããã« 1 ã¤ã®ã¿ãã«è¤æ°ã®å®è¡ã¹ã¯ãªããã®ã¤ã³ã¹ã¿ã³ã¹ãã§ãã¦ãã¾ãã¾ãããããèµ·ããã¨ãæåã®ã¤ã³ã¹ã¿ã³ã¹ã ããå¦çããã®ã確ãããå¿
è¦ãããã¾ãã
ãã®æ¬¡ã«ãå§ã¾ãå ´æã¯ 40 è¡ã§ãããã§ã³ã³ãã³ãã¹ã¯ãªããã¯ãããã¢ããããã®ã¡ãã»ã¼ã¸ãå¾
ã¡åããããã®ææ®µã¯ browser.runtime.onMessage API ã§ããä¸ã§è¦ãããã«ããããã¢ããã¹ã¯ãªãã㯠2 種é¡ã®ç°ãªãã¡ãã»ã¼ã¸ãéãã¾ã: "beastify" 㨠"reset"
- ã¡ãã»ã¼ã¸ã "beastify" ãªããåç©ç»åãæã URL ãå«ã¾ããã¯ãã§ãã以åã® "beastify" å¼ã³åºãã§è¿½å ãããåç©ããã¹ã¦åé¤ãã¦ã
<img>è¦ç´ ã使ã追å ãã¦ããã®src屿§ã«åç©ã® URL ãã»ãããã¾ãã - ã¡ãã»ã¼ã¸ã "reset" ãªãããã 追å ãããåç©ããã¹ã¦åé¤ãã¾ãã
åç©
æå¾ã«ãåç©ã®ç»åãç¨æãã¦ããå¿ è¦ãããã¾ãã
æ¡å¼µæ©è½ã®ã«ã¼ããã£ã¬ã¯ããªã¼é ä¸ã« "beasts" ã¨ããååã®ãã£ã¬ã¯ããªã¼ãæ°ãã使ãããã®ä¸ã« 3 ã¤ã®ç»åãé©åãªååã§ä¿åãã¾ããç»å㯠GitHub ãªãã¸ããªã¼ ãããã¾ãã¯ããããã§ãåå¾ã§ãã¾ãã



åããã¦ã¿ãã
æ£ãããã¡ã¤ã«ãæ£ããå ´æã«ãããã©ãããããä¸åº¦ç¢ºèªãã¦ãã ããã
beastify/
beasts/
frog.jpg
snake.jpg
turtle.jpg
content_scripts/
beastify.js
icons/
beasts-32.png
beasts-48.png
popup/
choose_beast.css
choose_beast.html
choose_beast.js
manifest.json
Firefox ã§ "about:debugging" ãéãã"䏿çãªã¢ããªã³ãèªã¿è¾¼ã" ãã¯ãªãã¯ããèªåã§ä½æãã manifest.json ãã¡ã¤ã«ã鏿ãã¦ãã ãããæ¡å¼µæ©è½ã®ã¢ã¤ã³ã³ã Firefox ã®ãã¼ã«ãã¼ã«è¡¨ç¤ºããã¦ããã¯ãã§ãã
![]()
é©å½ãªã¦ã§ããã¼ã¸ãéããæ¡å¼µæ©è½ã®ã¢ã¤ã³ã³ãã¯ãªãã¯ããåç©ã鏿ãã¦ãã ãããããã¨ã¦ã§ããã¼ã¸ãåç©ã®ç»åã«ç½®ãæããã¯ãã§ãã

ã³ãã³ãã©ã¤ã³ããéçºãã
ä»®ã¤ã³ã¹ãã¼ã«ã web-ext ãã¼ã«ãç¨ãã¦èªååã§ãã¾ããæ¬¡ã試ãã¦ãã ããã
cd beastify
web-ext run
次ã¯ä½ï¼
ããã§ãããé«åº¦ãª Firefox ç¨ WebExtension ã使ãããã¨ãã§ãã¾ããã