Greasemonkey: WebExt: ๋ชจ๋“  GM API ์ง€์›

์— ๋งŒ๋“  2017๋…„ 03์›” 03์ผ  ยท  19์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: greasemonkey/greasemonkey

https://wiki.greasespot.net/Greasemonkey_Manual :API

Greasemonkey API๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ถŒํ•œ ์žˆ๋Š” ์ž‘์—…์ด๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“  ๋™๊ธฐ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ์—๋Š” (๊ฑฐ์˜) API ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์—†์œผ๋ฏ€๋กœ ๊ถŒํ•œ ์žˆ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์›น ํ™•์žฅ ์€ ๋™๊ธฐ์‹ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ๋งŒ ๋ฐ›์Šต๋‹ˆ๋‹ค(์ธ์šฉ ํ•„์š”).

๋”ฐ๋ผ์„œ ๊ฐ ๋ฐฉ๋ฒ•์—๋Š” ๊ณ ์œ ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ์‰ฝ๊ฒŒ:

  • GM_getResourceURL ๋Š” ๋™๊ธฐ์ ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜์ง€๋งŒ ๊ณ„์‚ฐํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • GM_addStyle ๋Š” ์‚ฌ์†Œํ•ฉ๋‹ˆ๋‹ค.
  • GM_log ๋Š” ํ๊ธฐ๋˜๊ฑฐ๋‚˜ console.log ๋งคํ•‘๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • GM_openInTab ๊ธฐ๋Šฅ์ ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.
  • GM_registerMenuCommand ์—๋Š” ๋™๊ธฐ ๋™์ž‘์ด ์—†์Šต๋‹ˆ๋‹ค.
  • GM_setClipboard ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • GM_xmlhttpRequest ๋Š” ์™„์ „ํžˆ ๋น„๋™๊ธฐ์‹์ž…๋‹ˆ๋‹ค.

๋” ์—ด์‹ฌํžˆ:

  • GM_deleteValue ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆœ์„œ๋Š” ์—ฌ์ „ํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, X์˜ ์‚ญ์ œ๋Š” ํ–ฅํ›„ X ์ง‘ํ•ฉ๋ณด๋‹ค ๋จผ์ € ๋ฐœ์ƒํ•ด์•ผ ํ•จ).
  • GM_setValue ๋Š” ์‚ญ์ œ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐ ๊ฒฐ๊ณผ๋Š” ์—†์ง€๋งŒ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์—ด์‹ฌํžˆ:

  • GM_getValue ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • GM_listValues ๋Š” ๋™๊ธฐ์ ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (ํ”Œ๋Ÿฌ์Šค AFAICT ์Šคํ† ๋ฆฌ์ง€ ๋Š” ์ข‹์€ ์ง€์› API๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์˜ต์…˜์€ ์ด๋ฆ„์œผ๋กœ ํ•˜๋‚˜์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๋ชจ๋“  ์ด๋ฆ„ ๊ณผ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ถ„๋ฆฌํ•  ๋ฐฉ๋ฒ•๋„ ์—†์Šต๋‹ˆ๋‹ค.)
  • GM_getResourceText ๋Š” ๋™๊ธฐ์ ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋ฉฐ ๋งค์šฐ ํฐ ๊ฐ’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ฆ‰, ๋ฉ”๋ชจ๋ฆฌ์— ๋ชจ๋‘ ๋ฏธ๋ฆฌ ์บ์‹ฑํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋น„์Œ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

Tampermonkey์—์„œ GM_addStyle ์—๋Š” CSP ์ œํ•œ์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํƒ€์ผ์„ ์‚ฝ์ž…ํ•˜๋Š” ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค(์ธ๋ผ์ธ <style> ์ด ๊ธˆ์ง€๋œ ๊ฒฝ์šฐ). Greasemonkey์—์„œ๋„ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  19 ๋Œ“๊ธ€

ํฌ์ธํ„ฐ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ค, ์•„๋งˆ๋„ ์–ด๋Š ์ •๋„์˜ ๋™๊ธฐ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/runtime/onMessage#Sending_a_synchronous_response

์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜์‹ญ์‹œ์˜ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์œ„์—์„œ ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•œ ๋™๊ธฐ ๊ตฌํ˜„(๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ „์šฉ API ์ง€์›)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๋Š” ์ฝ˜ํ…์ธ  ์ธก๋ฉด์—์„œ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์‚ฌ์‹ค์ƒ ๋น„๋™๊ธฐ์‹์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ "๋™๊ธฐ์‹"์€ ์ž˜๋ชป๋œ ์ด๋ฆ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณด๋ฅ˜ ์ค‘์ธ ์‘๋‹ต์„ ์ˆ˜๋™์œผ๋กœ ์ถ”์ ํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก ์ž์‹์—์„œ ๋ถ€๋ชจ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์‘๋‹ต๊ณผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

Afaik์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋™๊ธฐ API๋Š” ๋™๊ธฐํ™” XHR์ด๋ฉฐ ์›น ์š”์ฒญ ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Sync XHR์ด ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: https://bugzilla.mozilla.org/show_bug.cgi?id=1360968, ๊ทธ๋ž˜์„œ ์ง€๊ธˆ์€ ์ฝ˜ํ…์ธ  > ๋ฐฐ๊ฒฝ์—์„œ ๋™๊ธฐํ™” ์ฑ„๋„์ด ์—†์Šต๋‹ˆ๋‹ค.

GM_setValue ๋ฐ GM_getValue ๊ฐ€ ๋™๊ธฐํ™” ์ž‘์—…์œผ๋กœ ์„ค๊ณ„๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์—ฌ๋Ÿฌ ํƒญ์—์„œ ์ž‘์—…ํ•  ๋•Œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ e10์—์„œ๋Š” ์•„๋‹ˆ์š”(https://github.com/greasemonkey /greasemonkey/issues/2427). ์ด์ „ ํ™•์žฅ API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ WebExt์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋™๊ธฐํ™” ๋ฉ”์‹œ์ง€๊ฐ€ ์—†์œผ๋ฉด(์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ์—๋„ ์งง์€ ๊ฐ’๋งŒ ๋‚ด๋ณด๋ƒ„) ๋” ๋งŽ์€ ํƒญ ๊ฐ„์— ๊ฐ’์„ ์ ์ ˆํ•˜๊ฒŒ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์‹œ์ ์—์„œ ์ด๊ฒƒ์€ ํ•ญ์ƒ ๊ฒฝ์Ÿ ์กฐ๊ฑด์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

WebExt ๋ฒ„์ „์—์„œ ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€๊ณ„์—†์ด ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„๋œ ์ƒˆ๋กœ์šด set/get ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋ฏ€๋กœ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ์—๋Š” ์—ฌ๋Ÿฌ ํƒญ์—์„œ ์ž‘๋™ํ•  ๋•Œ GM_setValue ๋ถ€์กฑ ๋ฐ GM_getValue ๋™์ž‘์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

imo, ์—ฌ๋Ÿฌ ํƒญ์—์„œ GM_setValue / GM_getValue ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋ฉฐ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ์— _GM_values_์˜ ๋ณต์‚ฌ๋ณธ(์บ์‹œ)์„ ์ €์žฅํ•˜๊ณ , ํ•ญ์ƒ ์บ์‹œ์—์„œ ์ฝ๊ณ , ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋‹ค์‹œ ์“ฐ๊ณ , ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋œ ์ด๋ฒคํŠธ๋กœ ์บ์‹œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


btw, ๊ทธ๋ ‡๋‹ค๋ฉด GM_addValueChangeListener ํ•ด๋‹นํ•˜๋Š” API๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” addValueChangeListener ๋ผ๋Š” ์ด๋ฆ„์ด ์‹ซ๋‹ค.

๋‚ด dev ๋ธŒ๋žœ์น˜ ์—๋Š” ๋‹ค์Œ ์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.

  • GM.getResourceURL
  • GM.deleteValue , GM.getValue , GM.listValues , GM.setValue

๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

  • GM_log
  • GM_addStyle

์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค :

  • GM_xmlhttpRequest

๋‚˜๋Š” ์—ฐ๊ธฐํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

  • GM_registerMenuCommand (์ด๊ฒƒ์€ ํ•ญ์ƒ ๋ง‰๋Œ€ํ•œ ์ง€์› ๋น„์šฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค)
  • GM_getResourceText

์ด๋Š” ์—ฌ๊ธฐ์„œ ์ง„ํ–‰ ์ƒํ™ฉ์ด ์‹ค์ œ๋กœ ๋งค์šฐ ๊ฐ€๊น๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์œ„ ์ปค๋ฐ‹์—์„œ ์ข‹์€ ํ”ผ๋“œ๋ฐฑ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”.

๋ฐฉ๊ธˆ ์ƒˆ๋กœ์šด ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. GM_xhr ๊ธฐ๋Šฅ ์—†์ด ๊ต์ฐจ ๋„๋ฉ”์ธ xhr ์š”์ฒญ์ด ์ด๋ฏธ ํ™œ์„ฑํ™”๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ณผ์—ฐ ํ–‰๋™์ธ๊ฐ€?

๋‹ค์Œ ์ฝ”๋“œ๋กœ userscript grant none์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

fetch(prompt()).then(resp => resp.text()).then(text => alert(text)).catch(error => alert(error));

์–ด, ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ํ™•์žฅ์˜ ๋ชจ๋“  ๊ถŒํ•œ๊ณผ ํ•จ๊ป˜ ํ™•์žฅ์˜ "์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ"๋กœ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์กฐ์‚ฌํ–ˆ์ง€๋งŒ ์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ถŒํ•œ์ด ์—†๋Š”("์›น ๋ฒ”์œ„" - "์ฝ˜ํ…์ธ " ๋ฒ”์œ„๊ฐ€ ๋ชจํ˜ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๋ถ€๋ฅด๋‚˜์š”?!) ๋‚ด๊ฐ€ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ์€ ํŽ˜์ด์ง€์˜ CSP์— ์˜ํ•ด ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ์ฐจ๋‹จ๋  ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ CSP๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ๋ฌธ์„œ ์š”์ฒญ์— ๋Œ€ํ•œ ํ—ค๋”๋ฅผ ๊ฐ€๋กœ์ฑ„๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ  CSP์—์„œ webextensions๋ฅผ ์ œ์™ธํ•˜๋Š” ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ํ™œ๋™์€ ๋งŽ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<script> ํƒœ๊ทธ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ window.eval ๋„ ํŽ˜์ด์ง€ ๋ฒ”์œ„์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ณต์‹ ์šฉ์–ด๋Š” "์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ ๋ฒ”์œ„"์™€ "ํŽ˜์ด์ง€ ๋ฒ”์œ„"์ž…๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” GM API๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ„๋„์˜ ๋ฒ”์œ„๋กœ ๋ž˜ํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ webextensions์—์„œ Sandbox ํ•ด๋‹นํ•˜๋Š” ๋ฒ„๊ทธ๋ฅผ ์‹ ๊ณ ํ–ˆ์ง€๋งŒ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

AIUI๋Š” script์™€ eval ๋ชจ๋‘ CSP์— ์˜ํ•œ ์ฐจ๋‹จ์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ eval์ด ๊ถŒํ•œ์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

https://bugzilla.mozilla.org/show_bug.cgi?id=1391669

์ž ์žฌ์ ์œผ๋กœ ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด <all_urls> ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์š”๊ตฌํ•œ๋‹ค๋ฉด, ์šฐ๋ฆฌ์˜ ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ทธ๊ฒƒ์„ ์–ป์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ XHR์€ ์–ด๋””์—์„œ๋‚˜ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ ์–ด๋„ Firefox( https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Content_scripts#Using_eval ()_in_content_scripts )์—์„œ๋Š” ํŽ˜์ด์ง€ ๋ฒ”์œ„๋กœ ๋“œ๋กญ๋‹ค์šดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ํŽ˜์ด์ง€ ๋ฒ”์œ„์ด๋ฉฐ ํŽ˜์ด์ง€์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋ชจ๋“  ํ•ญ๋ชฉ(AFAIK)์— API๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ ๋Š” API๋ฅผ ์Šคํฌ๋ฆฝํŠธ์— ์•ˆ์ „ํ•˜๊ฒŒ ๋…ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ์—์„œ fetch ๋ฐ xhr์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์ž์ฒด CORS ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ˆ˜์ •๋œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • GM.xmlhttpRequest() ๊ฐ€ 60a50d05b1e565571d8a3e638b0683a1a9c2beaa์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • GM.getResourceText() ๋Š” #2548์—์„œ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • GM.registerMenuCommand() ์€(๋Š”) ์˜๋„์ ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • cross-origin-fetch๋ฅผ ์ƒ์†ํ•˜๋Š” ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ(์œ„ ์ฃผ์„์— ๋”ฐ๋ฆ„)๋Š” #2549์ž…๋‹ˆ๋‹ค.

@the8472 https://github.com/greasemonkey/greasemonkey/issues/2232#issuecomment -326841025์—์„œ withUnsafeWindow() ๊ตฌํ˜„์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ด์ „ with (object) ... ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ๋ชจ๋ฐฉํ•˜์—ฌ ์กฐ๊ธˆ ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. (์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.)

@arantius ๋Š” 7์›” 25์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

GM_log
GM_addStyle

์ด๊ฒƒ๋“ค์€ ์ด ํ‹ฐ์ผ“์„ ๋งŒ๋“ค ๋•Œ( 3์›” 3์ผ @arantius ์— ์˜ํ•ด) ์‚ฌ์†Œํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(GM_log๋ฅผ console.log์— ๋งคํ•‘ํ•œ๋‹ค๊ณ  ๊ฐ€์ •).

๋‚ด ๊ฒฝํ—˜์ƒ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋‘ ๊ฐ€์ง€ API ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ๋ฒ„๋ฆฌ๋ฉด ์•„๋ฌด ์ด์œ ์—†์ด ์˜ค๋ž˜๋œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋งŽ์ด ๊นจ์ง€์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด dev ๋ธŒ๋žœ์น˜๋ฅผ ๋…์ ์ ์œผ๋กœ ์–ธ๊ธ‰ํ•˜์…จ์Šต๋‹ˆ๊นŒ?

Tampermonkey์—์„œ GM_addStyle ์—๋Š” CSP ์ œํ•œ์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํƒ€์ผ์„ ์‚ฝ์ž…ํ•˜๋Š” ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค(์ธ๋ผ์ธ <style> ์ด ๊ธˆ์ง€๋œ ๊ฒฝ์šฐ). Greasemonkey์—์„œ๋„ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰