ããæŽããæ¥ãäœæ¥ãçµäºããæ°æéåã«ãã¿ã¹ã¯ãååŸããŸããããŠãŒã¶ãŒã®ã¯ãªãã¯ã§ããŒãžããã¯ã©ã€ã¢ã³ãã®ãµã€ãã«ããŒã¿ãéä¿¡ãããã©ãŠã¶ãŒã¢ããªã±ãŒã·ã§ã³ãäœæããå¿
èŠããããŸãã ã©ããªã¢ããªã±ãŒã·ã§ã³ãšã©ã®ãã©ãŠã¶ãå®å
šã«ããªã次第ã§ã...ãã
å°ãèããŠã
Google Chromeæ¡åŒµæ©èœãªãã·ã§ã³ãæãä»ããŸããã
- Cromeã¯Blinkãšã³ãžã³ã䜿çšããŸãïŒWebKitã¯2013幎4æãŸã§äœ¿çšãããŠããŸããïŒãBlinkã¯WebKitã®åå²ã§ãïŒããã¯Safariã§ãïŒããŸããæ°ããOperaãå¿ããŸããïŒå€ãããã¯ããŒã¯ãããã¯ããŒã¯ã«äœ¿çšããŠããŸãïŒã ãããã£ãŠãChromeã®æ¡åŒµæ©èœãäœæããããšã«ãããæå°éã®å€æŽã§ïŒãŸãã¯è¿œå ããã«ïŒããã«2ã€ã®ãã©ãŠã¶ã«ç§»æ€ã§ããŸãã
- Google Chrome APIã®çµéšããªã
- Googleã¯ãŸã è¯ãäŒç€Ÿã§ã:)
ç§ã®èããå°ãèœã¡çãããšããç§ãæåã«ããããšã¯ãããŒãã®æ€çŽ¢ã§
Google Chromeæ¡åŒµæ©èœãå
¥åããããšã§ããã ãã®ãããã¯ã«é¢ããåºç¯ãªèšäºãèŠãŠãç§ã¯å®å¿ããŠå®¶ã«åž°ããŸãããææ¥ã®æããããèªãã åŸãäžæ¥ã®çµããã«ã¯ã
åžœåããã¶ã£ãŠãã ãïŒåœæã®èªåã®ééãïŒãšå®å
šã«ç¢ºä¿¡ããŸããã ãããã®ããã€ããèªãã åŸãç§ã¯ãããã©ã®ããã«æ©èœãããã«ã€ããŠã®äžè¬çãªã¢ã€ãã¢ãæã£ãŠããŸããããããã¯ç§ã®ã¢ã€ãã¢ãå®çŸããã«ã¯ååã§ã¯ãããŸããã§ããã ãããå§ããŸããã...
Google Chromeãéãã
chromeïŒ// extensionsãšå
¥åããéçºè
ã¢ãŒãã®ãã§ãã¯ããã¯ã¹ããªã³ã«ãã[å±éãããæ¡åŒµæ©èœãèªã¿èŸŒã]ãã¿ã³ãã¯ãªãã¯ãããã©ã«ããŒãéžæããŠ[OK]ãã¯ãªãã¯ããŸãã

æåã¯ãããã§ã¹ã
ãšããèšèããããŸããã 以äžã«ããã®ãã¡ã€ã«ã®å
容ãèŠãããšãã§ããŸãïŒmanifest.jsonã¯ãããã§ã¹ããã¡ã€ã«ã®å¿
é ã®ååã§ãïŒ
manifest.json{ "manifest_version": 2, "name": "My application",
manifest_version-çŸåš2ã®å€ãå¿
èŠã§ãã
version-æ¡åŒµæ©èœã®ããŒãžã§ã³ãæ°åãšãããã®ã¿ãå«ãŸããå ŽåããããŸãïŒã2.1.12ããã0.59ããªã©ïŒ
ã¢ã€ã³ã³ã¯ããã©ãŠã¶ã®ããŸããŸãªå Žæã«è¡šç€ºããããã¹ãŠã®ã¢ã€ã³ã³ã®ãªã¹ãã§ãïŒã¢ãã¬ã¹ããŒã«16ããã¹ãŠã®æ¡åŒµæ©èœã®ãªã¹ãã«48ãªã©ïŒã
èš±å¯ -
èš±å¯ã®ããé
åãããã«ãªã¹ããããŸããtabs.httpãšhttpsã ããå¿
èŠã§ããã¹ãŠã®ãµã€ããšã®ajax亀æã«å¿
èŠã§ãããŸããscript_in_content.jsãããã¯ã°ã©ãŠã³ãããŒãž-background.htmlãšããŒã¿ã亀æã§ããããã«ãªããŸãã
backgroundã¯ãèæ¯ããŒãžã®ååã§ãã ããã¯ã°ã©ãŠã³ãããŒãžã¯éèŠãªèŠçŽ ã§ãããäžéšã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯å¿
èŠãããŸããã å°ãåŸã§å¿
èŠã«ãªãã®ã¯ãªãã§ããã
content_scripts -script_in_content.jsãã¡ã€ã«ãã¿ãã§éãããããŒãžã«èªåçã«ããŒããããããšã瀺ããŸãã ãã®ããŒãžã¯ãhttpsã®ãµã€ãããéãå¿
èŠããããŸã
ïŒ// * / * httpãå«ããã¹ãŠã®ãµã€ãã®ããŒãžïŒhttpsã§ã¯ãªãïŒããã ããæå®ããããšãã§ããŸãã
browser_action-æ¡åŒµæ©èœã¢ã€ã³ã³ã衚瀺ããããã®2ã€ã®ãªãã·ã§ã³ããããŸãïŒ
browser_actionãš
page_actionpage_actionã¯ãæ¡åŒµåãã¿ãããšã«åå¥ã§ãããã€ãŸããã¢ã€ã³ã³ãã¢ãã¬ã¹ããŒã«è¡šç€ºãããããšã瀺ããŠããŸãã ãã®ã¢ã€ã³ã³ã¯ãå Žåã«ãã£ãŠã¯JSã䜿çšããŠé衚瀺/衚瀺ã§ããŸãã
äžæ¹ãbrowser_actionã¯åå¥ãšã¯èŠãªããããã¢ãã¬ã¹ããŒã«ã¯è¡šç€ºããããæ¡åŒµæ©èœã®ããã«ã«è¡šç€ºãããŸãã ãã®ã¢ã€ã³ã³ã¯JSã§é衚瀺ã«ããããšã¯ã§ããŸãããïŒãããã¯ããããšã¯ã§ããŸãïŒãåžžã«è¡šç€ºãããŸãã
Browser_actionã«ã¯
page_actionããã1ã€ã®å©ç¹ããããŸããbrowser_actionã¢ã€ã³ã³ã®äžã«ãçŸããæåãããã€ãæžãããšãã§ããŸãïŒ4ã€ãããããŸããïŒã

1ã€ã®ãµã€ãã§ã¯ãªããè€æ°ã®ãµã€ãã§äœæ¥ããå¿
èŠãããããã
browser_actionãéžæã
ãŸãã ã ãããŠãã¯ããã¢ã€ã³ã³ã«çŸãããã£ã©ã¯ã¿ãŒãé©çšããŸãã
Googleãããã«ã€ããŠèšã£ãŠããããšã¯æ¬¡ã®ãšããã§ãã
æ°ããŒãžã®ã¿ã«æå³ã®ããæ©èœã«ã¯ããŒãžã¢ã¯ã·ã§ã³ã䜿çšããŠãã ããã
ã»ãšãã©ã®ããŒãžã§æå³ã®ããæ©èœã«ã¯ããŒãžã¢ã¯ã·ã§ã³ã䜿çšããªãã§ãã ããã 代ããã«ãã©ãŠã¶ã¢ã¯ã·ã§ã³ã䜿çšããŠãã ããã
ãããŠãç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã¯äœãããã®ã§ããããã ããã«èšããŸããããã®ã¢ããªã±ãŒã·ã§ã³ã¯ãåŸã§èª¬æããŸãããã¯ã©ã€ã¢ã³ãã®ããã«è¡ããããã®ã®ã»ãã®äžéšã§ãã ãããŒãžã£ãŒããµã€ã
hantim.ruã«ã¢ã¯ã»ã¹ããŠå¥çŽ/æ¬ å¡ã«é¢ããæ
å ±ã衚瀺ãããšãã¢ããªã±ãŒã·ã§ã³ã¯ããŒãžã®htmlã³ãŒããè§£æãããã®æ
å ±ïŒæ¬ å¡ãéœåžãªã©ïŒãèŠã€ããŸãã æ¡åŒµæ©èœã¢ã€ã³ã³ãã¯ãªãã¯ãããšã管çè
ãããŒã¿ãå
¥åãããã°ã€ã³ãã©ãŒã ã衚瀺ãããéžæãã空åž/å¥çŽãäŒç€Ÿã®Webãµã€ãã®ãããã¡ã€ã«ã«è¿œå ã§ããŸãã
次ã«ããã¹ãŠã®ä»çµã¿ã«ã€ããŠèª¬æããŸãã Googleã¯æ¬¡ã®ç»åãæäŸããŸãã

1ïŒæ€æ»ããããŠã£ã³ããŠã¯ã¿ãã§éãããã®ã§ããã³ã³ãã³ãã¹ã¯ãªããã¯script_in_content.jsã§ãããããŒãžã®DOMãžã®ãã«ã¢ã¯ã»ã¹ããããŸãã
2ïŒèæ¯ããŒãžã¯ã¢ããªã±ãŒã·ã§ã³ã®äžå¿ã§ããããã®å Žåã¯background.htmlã§ãã
3ïŒDevToolsããŒãž-ããã¯ãæ¡åŒµæ©èœã¢ã€ã³ã³ïŒãã®å Žåã¯ãlogin.htmlãŸãã¯find.htmlïŒãã¯ãªãã¯ãããšè¡šç€ºãããŸãã
ãã®å³ã§ç§ãæ©ãŸãå¯äžã®ããšã¯ã
DevToolsããŒãžãš
InspectedãŠã£ã³ããŠã®éã®æ¥ç¶ã§ãã ãããšãªã¢ããå¥ã®ãšãªã¢ã«ããŒã¿ã転éãã解決çãèŠã€ãããŸããã§ããã ãããã
ããã¯ã°ã©ãŠã³ãããŒãžã仲ä»ãšããŠå
¬éãããã®ããŒã¿ãä»ããŠãã®ããŒã¿ã転éãããšããã¹ãŠãæ©èœããŸãã
ãããŠãã³ãŒãã®æãæ¥ãŸããã ç®ã«èŠããªãåŽããå§ããŸãããã
background.html <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script type="text/javascript" src="lib.js"></script> <script type="text/javascript" src="bg.js"></script> </head> <body></body> </html>
ããŸãããã°ãããã§åé¡ãçºçããªãã¯ãã§ãã 1ã€ã®ã³ã¡ã³ãïŒãbackground.html-ãã©ãŠã¶ãŒãåäœããŠããéã¯äžåºŠã ãèªã¿èŸŒãŸããŸãããèµ·åæã«äœ¿çšå¯èœã§ãããã ããã§ã2ã€ã®jsãã¡ã€ã«ãããŒãããŠããããšãããããŸãïŒlib.jsã¯é¢æ°ã®ã»ããã§ãããbg.jsã¯ã¢ããªã±ãŒã·ã§ã³ã®ãããããã§ãïŒã
bg.js window.onload = function(){
ãŸãã
window.onloadãåŸ
ã£ãŠããkatran.byã«ãªã¯ãšã¹ããéä¿¡ãïŒjsonããŒã¿ãååŸããã©ã®ãµã€ããããã©ã®RegExpã§å¿
èŠãªããŒã¿ãæäŸããŸãïŒããã©ãŠã¶ãŒã¿ãã§ãã³ãã©ãŒããã³ã°ãããŸãïŒããã¯ãããã§ã¹ãã§æå®ããŸããïŒæš©éãã¿ãïŒã
chrome.tabs.onActivated.addListener(function(info) { window.bg.onActivated(info); });
onActivated-ãŠãŒã¶ãŒãïŒã¯ãªãã¯ãŸãã¯Alt + Tabã§ïŒæ°ããã¿ãã«åãæ¿ãããšãã«çºçããŸãã
chrome.tabs.onUpdated.addListener(function(id, info, tab) { ..... });
onUpdated-ã¿ãã«ããŒãžãå®å
šã«ããŒãããããšïŒDOMã ãã§ãªãããã¹ãŠã®ç»åãïŒããŒããããŸãã
chrome.browserAction.onClicked.addListener(function(tab) { window.bg.onClicked(tab); });
onClicked-ãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã¢ã€ã³ã³ãã¯ãªãã¯ãããšçºçããŸãã å°ããªã³ã¡ã³ããã¯ãªãã¯äžã«
default_popupãèšå®ãããŠããå ŽåãonClickedãã³ãã©ãŒã¯èµ·åããŸããã
default_popupã¯ãæ¡åŒµæ©èœã¢ã€ã³ã³ãã¯ãªãã¯ããåŸã«è¡šç€ºãããHTMLããŒãžã§ãã
default_popupã¯ã
chrome.browserAction.setPopupïŒ{popupïŒ "find.html"}ïŒ;ã䜿çšããŠãããã§ã¹ãã§èšå®ã§ããŸã
ã ãŸãã¯
chrome.pageAction.setPopupïŒ{popupïŒ "find.html"}ïŒ; chrome.extension.onConnect.addListener(function(port){ port.onMessage.addListener(factory); });
portã䜿çšããŠ
script_in_content.jsããéä¿¡ãããããŒã¿ãåä¿¡ããã«ã¯ããã®
ããŒã¯ããžãã¯æ§é ãå¿
èŠ
ã§ã ã
ããŒã¿åŠçã¯
ãã¡ã¯ããªãŒã«ãã£ãŠè¡ãããŸã
ïŒobjïŒ function factory(obj){ if(obj && obj.method){ if(obj.data) window.bg[obj.method](obj.data); else window.bg[obj.method](); } }
ãŠãŒã¶ãŒãã¿ããããŒããããšã次ã®ããšãèµ·ãããŸãã
- åŒã³åºããããã³ãã©ãŒ
onUpdated
if (info && info.status && (info.status.toLowerCase() === 'complete'))
ãã¹ãŠãããŒããããå Žå-ãããªãŒãã£ã³ã°ãç¶è¡ããŸããif(!id || !tab || !tab.url || (tab.url.indexOf('http:') == -1))
ãŠãŒã¶ãŒãWebãµã€ããéããªãå ŽåïŒhttpsã確èªããã®ãå¿ããå ŽåïŒ :)ïŒãããã³ãããšãã°ãèšå®ã¿ããŸãã¯ftpãªã©ã«æ°ã¥ããå ŽåãäœãããŸããwindow.bg.push(tab);
-çŸåšã®ã¿ãã«é¢ããæ
å ±ãåéããchrome.tabs.executeScript(id, {code:"initialization()"});
-ä»ã script_in_content.jsãæ³šæããŠåæåïŒïŒé¢æ°ãå®è¡ããŸãwindow.bg.tabs[id].port_info.postMessage({method:'setTabId', data:id})
- script_in_content.jsã«ããŒã¿ãéä¿¡ããŸãchrome.browserAction.setPopup({popup: "find.html"});
-ãŠãŒã¶ãŒã以åã«ãã°ã€ã³ããå Žåã«ãããã¢ããããŒãžãèšå®ãã
background.htmlãã
script_in_content.jsã«ããŒã¿ã転éããã«ã¯2ã€ã®æ¹æ³ããããŸãã
- chrome.tabs.executeScriptïŒæŽæ°tabIdãInjectDetailsã®è©³çްã颿°ã³ãŒã«ããã¯ïŒ-1ã€ã§ããããã®æ¹æ³ã§ã¯ããŒã¿ãæååãšããŠã®ã¿ïŒãªããžã§ã¯ãã§ã¯ãªãé
åã§ã¯ãªãïŒè»¢éã§ããŸã
- hrome.tabs.sendMessageïŒinteger tabIdãä»»æã®ã¡ãã»ãŒãžã颿°responseCallbackïŒ -ãã®æ¹æ³ã§ã¯äœã§ãæž¡ãããšãã§ããŸãããå®éã«ã¯è¿œå ã®èšå®ãå¿
èŠã«ãªããŸã
ãã®ãããããŒã¿ãscript_in_content.jsã«éä¿¡ããã®ã§ãã³ãŒããæ€èšããŸãã
æåã«ç®ãåŒãã®ã¯ãbg.jsãšåãã§ããããšããããããã«ãbackground.htmlããã®ããŒã¿ã®åä¿¡ã§ãã
chrome.extension.onConnect.addListener(function(port){ port.onMessage.addListener(factory); });
ãæ°ä»ãã®ããã«ã
bg.jsã®åææ®µéã§
initialization()
ã
setTabId()
ã
setHosts()
ããã³
run()
ã
run()
ã æãè峿·±ãã®ã¯window.popup.runïŒïŒã§ãã ããã§ãéããŠããããŒãžã®ãµãŒããŒã®ãã¡ã€ã³åããã§ãã¯ããããã®ååãé¢å¿ã®ãããµã€ãã®ãªã¹ããšäžèŽããå ŽåïŒããŒã¿ãäŒæ¥ãªãœãŒã¹ã«è»¢éããå¿
èŠãããïŒ
find = true;
ãããŠããªã¯ãšã¹ã
window.bg.mustParsed(obj)
ã
bg.jsã«éä¿¡ããŸãã
mustParsed: function(data) { if(this.tabs[data.tab_id]){ var id = data.tab_id; this.tabs[id].must_parsed = data.find;
ãã¡ã€ã³ã®äžèŽãèŠã€ãã£ãå Žåã
parsePage()
ããŒãžã®ããŒãµãŒãå®è¡ã
ãŸã ã
parsePage: function() {
ã¹ã¯ãªãããããŒãžäžã§äœããèŠã€ããå ŽåããããèŠã€ãããã®ã¯ãã¹ãŠé
åã«å
¥ããããçŸåšã®ããŒãžã®URLã远å ããŠããèŠã€ãããã®ãèŠãŠ...ããšèšã£ãŠ
bg.jsã«éãè¿ããŸãã ããã«å¿ããŠã
bg.jsã¯å
¥åããŒã¿ãè§£æããRegExpãäœããèŠã€ããå Žåãã¢ã€ã³ã³ã«äžèŽæ°ïŒ1ã2ãªã©ïŒã
chrome.browserAction.setBadgeText({text: this.tabs[id].matches_count});
ã
ãããã¯ãã¹ãŠã
bg.jsããã³
script_in_content.jsãã³ãã«ã®ãã€ã©ã€ãã§ãã
次ã«ã
popupã«ã€ããŠèª¬æããŸãã ãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã¢ã€ã³ã³ãã¯ãªãã¯ãããšã
login.htmlãã©ãŒã ã衚瀺ãããŸãã
ãããŒãžã£ãŒã¯äŒæ¥ãµã€ãããããŒã¿ãå
¥åãã[ãã°ã€ã³]ãã¯ãªãã¯ãããšã次ã®ããšãèµ·ãããŸãã
login.html <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <script type="text/javascript" src="login.js"></script> <link type="text/css" rel="stylesheet" href="login.css"> <title>Grabber popup</title> </head> <body> <div class="body"> <div class="emptyLogin"> <div id="error_message"> </div> <form name="login_form" action="" method="get" id="popup_login_form"> <table> <tbody> <tr> <td align="right"> E-mail:</td> <td><input type="text" name="login" value="" tabindex="1"></td> </tr> <tr> <td align="right">:</td> <td><input type="password" name="pass" value="" tabindex="2"></td> </tr> <tr> <td colspan="2" align="center"><input type="submit" value="Login" class="button"></td> </tr> </tbody> </table> </form> </div> <div id="loader"><img src="ajax-loader.gif" title="Loding" alt="Loading"></div> </div> </body> </html>
login.js window.onload = function(){
login.jsã®ã¿ã¹ã¯ã¯ããã©ãŒã ã§
onsubmit
ããã³ã°ããããŠãŒã¶ãŒå/ãã¹ã¯ãŒãã
background.htmlïŒbg.jsïŒã«éä¿¡ããããšã§ãã
ããã¯ãæ¬¡ã®æ§æã䜿çšããŠè¡ãããŸãïŒã芧ã®
ãšãã ã
bg.jsãªããžã§ã¯ãã®ã¡ãœãããçŽæ¥åŒã³åºãããšãã§ããŸãïŒã
var bg_wnd = chrome.extension.getBackgroundPage(); var result = bg_wnd.bg.loginUser(data);
bg_wnd.bg.loginUser(data)
ã¯ãµãŒããŒã«ããŒã¿ãéä¿¡ãããã¹ãŠãæ£åžžã§ããã°ããããã¢ãã
login.htmlã
find.htmlã眮ãæãã
ãŠãŒã¶ãŒããŒã¿ã¯å€æ°ã«æ ŒçŽãããŸãã æ¬¡ã®ããã«ãããã¢ããã倿ŽããŸãã
setPopup: function(popup_file) { chrome.browserAction.setPopup({tabId: this.active_tab.tabId, popup: popup_file}); },
ãŠãŒã¶ãŒããããã¢ãã
login.htmlãéããŠãYour E-mailïŒããã£ãŒã«ãã«ã«ãŒãœã«ã眮ãããã¹ã¯ãŒãã«ç§»åããããšãæåŸ
ããŠïŒæåã«ïŒ
TabããŒãæŒããšããŠãŒã¶ãŒã¯äžæºã«ãªãããã©ãŒã«ã¹ã¯å€æŽãããŸããã ãã®
ãã°ã¯äŸç¶ãšããŠé¢é£ããŠããŸãã
ããã§ãã»ãã®å°ãæ®ã£ãã
ãã°ã€ã³ã«æåã
ããããããã¢ããã
find.htmlã«å€æŽã
ãŸã ã
find.html <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <script type="text/javascript" src="find.js"></script> <link type="text/css" rel="stylesheet" href="find.css"> <title>Grabber</title> </head> <body> <div class="body"> <div class="carsRows" id="popup_cars_rows"> <h3 style="text-align: center; margin: 5px 0;"> </h3> <form name="cars_form" action="" method="get" id="popup_cars_form"> <table id="popup_cars_table"> <thead> <tr> <th class="make"></th> <th class="info"></th> <th class="addBtn"> </th> </tr> </thead> <tbody> </tbody> </table> </form> </div> <div class="carsRows" id="popup_cars_rows_none" style="display: none;"> <h3 style="text-align: center; margin: 5px 0;"> </h3> </div> <div id="loader"><img src="ajax-loader.gif" title="Loding" alt="Loading"></div> </div> </body> </html>
find.js window.onload = function(){
find.htmlãèªã¿èŸŒãŸãããšããã«ã
find.jsã
åŒãç¶ããŸãã ãã®ã¿ã¹ã¯ã¯ãbg.jsã«ãçŸåšã®ããŒãžã«äœããããŸããããšå°ãã
bg.jsãäžãããã®ã衚瀺ããããš
ã§ã ã
window.onload = function(){
ã¿ãŒã³ããŒãœãªã¥ãŒã·ã§ã³ã®ããã«èŠããŸãã

[远å ]ãã¿ã³ã䜿çšãããšãã©ã®ããã«æ©èœããããçè§£ã§ãããšæããŸãã æåŸã«ããã®å
šäœãã©ã®ããã«ãããã°ãããŠããããè¿°ã¹ãããšæããŸãã
background.html -
bg.jsããã³
lib.jsã¹ã¯ãªããã®åäœã確èªããã«ã¯ã
chromeïŒ//æ¡åŒµæ©èœããŒãžã®
background.htmlãªã³ã¯ãã¯ãªãã¯ããŸãã
script_in_content.js-ããŒãžã®ã³ã³ããã¹ãã§å®è¡ããããããããŒãžãå®å
šã«æ€æ»ãããšã©ãŒåºåã衚瀺ãããã³ã³ãœãŒã«ãç£èŠã§ããŸãã
login.htmlããã³
find.html-éçºè
ããŒã«ã衚瀺ããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã¢ã€ã³ã³ãã¯ãªãã¯ããããŠã¹ã®å³
ãã¿ã³ã§ããŒãžæ€æ»ãéžæããå¿
èŠããã
ãŸã ã

PSã JavaScriptãHTMLã«è²Œãä»ããå Žåããã¹ãŠã®JavaScriptã¯jsãã¡ã€ã«ã«å«ãŸããŠããå¿
èŠããããŸã-chromeã¯èªããŸãã
ãŸããããã€ãã®ãªã³ã¯ïŒ
ããã¥ã¡ã³ãã®å ŽåïŒ
manifest.json ã
Chromeã®APIgithub.comïŒ
ãœãŒã¹ã³ãŒãPSS
x256ã«ãããšãå°å
¥ãä¿®æ£ããŸããã