Greasemonkey: ํ”„๋ ˆ์ž„์—์„œ ์‹คํ–‰

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

ํ˜„์žฌ Greasemonkey 4๋Š” ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ๋งŒ ํƒ์ƒ‰ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๋ฏ€๋กœ ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ์— @noframes ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

์•ˆ๋…•ํ•˜์‹ญ๋‹ˆ๊นŒ,
๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ฝค ์˜ค๋ž˜๋œ ๊ฒฐํ•จ์ด๋ฉฐ iframe ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค...

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

webNavigation.onCommitted๋Š” ์ดˆ๊ธฐ ํ”„๋ ˆ์ž„ ์ƒ์„ฑ/ํŽ˜์ด์ง€ ๋ Œ๋”๋ง์„ '๋ณด์ง€' ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋ ˆ์ž„ ํƒ์ƒ‰์ด ์ดˆ๊ธฐ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์œ„์น˜์— ์žˆ์œผ๋ฉด ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ด๋ฅผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜ ์— 'allFrames': true ํ‚ค๊ฐ€ ํฌํ•จ๋œ๋‹ค๋ฉด ๋ฌธ์ œ๋Š” _๋‹ค์†Œ_ ํ•ด๊ฒฐ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ •์  html ํŽ˜์ด์ง€์˜ ๋ชจ๋“  ํ”„๋ ˆ์ž„์—๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‚ฝ์ž…๋˜์ง€๋งŒ ์›๋ณธ/URL ์ผ์น˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Javascript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ ˆ์ž„์„ ์ƒ์„ฑํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฃผ์ž…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ํ•ด๊ฒฐ์ฑ…์€ webNavigation.onCommitted ๋ฅผ {'urls': ['<all_urls>'], 'types': ['main_frame', 'sub_frame']} ํ•„ํ„ฐ๋กœ webRequest.onResponseStarted ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์ œํ•œ๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ ๋” ์ด์ƒ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Javascript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ ํ”„๋ ˆ์ž„๊ณผ ํ”„๋ ˆ์ž„ ๋‚ด์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

@arantius ์–ด๋–ค ๊ณ„ํš @Sxderp์—์„œ ์ˆ˜์ •์„ ๋ณ‘ํ•ฉ?

์ด๋Š” iframe์ด ์›๋ณธ ๊ฐ„ ๊ฐœ์ฒด์ธ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ ํŠน์ • iframe์—์„œ GM์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ ๋Š” ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ˆ˜์ •๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š” !

์ด๊ฒƒ์„ ๋†“์น˜๋ฉด ๊ณง ์กฐ์‚ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค๋ž˜๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋™์•ˆ ๊ด€์ฐฐํ•œ ๊ฒƒ์ธ๋ฐ ๋„์›€์ด ๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค...

iframe์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด
ํŽ˜์ด์ง€์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜์ •๋˜์ง€ ์•Š์€ ํŽ˜์ด์ง€๋กœ ๋‹ค์‹œ ์ƒˆ๋กœ ๊ณ ์ณ์ง‘๋‹ˆ๋‹ค.

ํŽ˜์ด์ง€๋ฅผ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ƒˆ๋กœ ๊ณ ์น  ๋•Œ๋งŒ ๊นœ๋ฐ•์ž„์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ž˜๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋™์•ˆ ๊ด€์ฐฐํ•œ ๊ฒƒ์ธ๋ฐ ๋„์›€์ด ๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค...

์ด๊ฒƒ์€ ๋‚ด ํŒจ์น˜ ๋˜๋Š” ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์— ์žˆ์Šต๋‹ˆ๊นŒ?

ํ— 4.0๋ฒ„์ „์ด์—ˆ๋˜๊ฑฐ๊ฐ™์€๋ฐ..
๋‚˜๋Š” @4.1b3์ด์—ˆ์ง€๋งŒ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์„ ๋‹ค์‹œ ์„ค์น˜ํ–ˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค(์ง€๊ธˆ๊นŒ์ง€!)

Eselce๊ฐ€ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ iframe์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์‹์œผ๋กœ๋“  ์‹คํ–‰๋˜์ง€๋งŒ iframe ๋˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋œ ํ›„ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค.

์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด 1๊ณผ "self !== top"๋งŒ ์–ป์Šต๋‹ˆ๋‹ค.

console.log('1');
if (self !== top) {
   console.log('self !== top');
   setTimeout(function() {
      console.log('Timeout');
   }, 2000);  
} else {
   console.log('self === top');
}

"์‹œ๊ฐ„ ์ดˆ๊ณผ"๋Š” ๋กœ๊ทธ์— ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋ชจ๋“  ๊ธฐ๋Šฅ ๋ฐ ๋ฐ”์ธ๋“œ๋„ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

4.1b3์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Quantum์—์„œ GM 4.0์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. main.html ๋ฐ framed.html ํŽ˜์ด์ง€์™€ ๋ชจ๋“  ํŽ˜์ด์ง€์— ๋กœ๋“œ๋˜๊ณ  ๋กœ๋“œ๋œ ํŽ˜์ด์ง€์˜ URL์„ ์ถœ๋ ฅํ•˜๋Š” GM ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ๋”๋ฏธ ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ main.html ์— ๋Œ€ํ•œ ์•Œ๋ฆผ๋งŒ ๋ฐ›์ง€๋งŒ ์•ฝ 5%์˜ ๊ฒฝ์šฐ, ํŠนํžˆ F5 ํ‚ค๋ฅผ ๋ˆ„๋ฅด๊ณ  ์žˆ์œผ๋ฉด framed.html ๋Œ€ํ•œ ์•Œ๋ฆผ๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒจ์น˜๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ iframe ๋‚ด์—์„œ GM 4.0์„ ์•ˆ์ •์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ํ•ดํ‚น์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚œ ๊ทธ๋ƒฅ userscripts์ด ์•ˆ์ •์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌ <embed src="..."> ๊ฐ€ ์•„๋‹ˆ๋ผ์—์„œ <iframe src="..">
๋‚˜๋Š” ์ž‘์€ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
https://openuserjs.org/scripts/cuzi/iframe_embed_Test_Greasemonkey_4

๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ •๋ณด: ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋‚ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ”„๋ ˆ์ž„์—์„œ ์™„์ „ํžˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ๋ณด๊ธฐ๋Š” ๋‚˜์ค‘์— ํŽ˜์ด์ง€ ์Šคํฌ๋ฆฝํŠธ ๋“ฑ์œผ๋กœ ๋ฎ์–ด์“ฐ์—ฌ์ง‘๋‹ˆ๋‹ค).
๋•Œ๋•Œ๋กœ ๋‚ด ์Šคํฌ๋ฆฝํŠธ์˜ ๋™๊ธฐ ๋ถ€๋ถ„์€ ์ข…๋ฃŒ๋˜์ง€๋งŒ ๋น„๋™๊ธฐ ๋ถ€๋ถ„์€ ํŽ˜์ด์ง€ ํ™œ๋™์— ์˜ํ•ด ๊ฐ‘์ž๊ธฐ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค ...
ํฌ๋ง, ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค!

๋ˆ„๊ตฌ์—๊ฒŒ ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ์Šค๋ ˆ๋“œ(๋ฌธ์ œ)์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์š”์•ฝ:

  • ๋Œ€๋ถ€๋ถ„์˜ ๊ฒŒ์‹œ๋ฌผ์€ ์žŠ์–ด๋ฒ„๋ฆฌ์„ธ์š”. ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์•„๋งˆ๋„ ์Šคํฌ๋ฆฝํŠธ๋Š” ํ•ญ์ƒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ๋๊นŒ์ง€ ์‹คํ–‰๋˜์ง€๋Š” ์•Š์Œ)
  • ๋ถˆํ–‰ํžˆ๋„ ํŽ˜์ด์ง€๋Š” ๋‚˜์ค‘์— ์ƒˆ๋กœ๊ณ ์นจ๋ฉ๋‹ˆ๋‹ค - ๋ ˆ์ด์•„์›ƒ์ด ๋‹ค์‹œ ๊ณ„์‚ฐ๋˜๊ณ  ์‹คํ–‰์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค
  • ์ด๊ฒƒ์€ ์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ๋ถ€๋ถ„์— ๋Œ€๋ถ€๋ถ„(์ „๋ถ€๋Š” ์•„๋‹ˆ์ง€๋งŒ) ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๋Ÿฌํ•œ ๋‚ด๋ถ€์—๋ณ„๋กœ ๊ด€์‹ฌ์ด ์—†์ง€๋งŒ ์•„๋งˆ๋„ ๋ˆ„๊ตฐ๊ฐ€๋Š” ...

์ž„์‹œ ์ˆ˜์ •์œผ๋กœ iframe์„ ์ž„๋ฒ ๋“œ์šฉ์œผ๋กœ ๊ต์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค( ์˜ˆ์ œ ์Šคํฌ๋ฆฝํŠธ ). ์ด๋Š” ํŠธ๋ฆฌ๊ฑฐํ•  ํ”„๋ ˆ์ž„์— ํ•ด๋‹นํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค( <embed src="..."> ๊ฐ€ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋‚ธ @cvzi์— ๋Œ€ํ•œ ํฌ๋ ˆ๋”ง). .

Violentmonkey์™€ Tampermonkey๋Š” ์ž„๋ฒ ๋””๋“œ ํ”„๋ ˆ์ž„ ๋‚ด์—์„œ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. VM์€ ์˜คํ”ˆ ์†Œ์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ป๊ฒŒ ํ–ˆ๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ์„๊นŒ์š”?

๋ถˆํ–‰ํžˆ๋„ Violentmonkey์™€ Tampermonkey๋Š” ์—ฌ์ „ํžˆ ํŠน์ˆ˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ด์ „ GM_ ๋ช…๋ช… ์ฒด๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์Šคํฌ๋ฆฝํŠธ๋Š” ์•„์ง ์ด์‹ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

https://github.com/greasemonkey/gm4-polyfill

Tampermonkey => GM.* ํ˜ธ์ถœ(์ œ๊ณต๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ)
Violentmonkey => GM.* ํ˜ธ์ถœ
๊ทธ๋ฆฌ์Šค๋ชฝํ‚ค -3.17 / FF -56.0 => GM.* ํ˜ธ์ถœ
Greasemonkey 4.0+ / FF 57.0+ => ๋‚ด์žฅ GM.* ํ˜ธ์ถœ

// <strong i="11">@grant</strong>        GM.getValue
// <strong i="12">@grant</strong>        GM.setValue
// <strong i="13">@require</strong>      https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js
// <strong i="14">@grant</strong>        GM_getValue
// <strong i="15">@grant</strong>        GM_setValue

@Sxderp ์˜ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์•„์ง ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ํ†ตํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๊ทธ์˜ ํฌํฌ๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@Sxderp ์˜ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์•„์ง ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ํ†ตํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๊ทธ์˜ ํฌํฌ๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

  1. ์•„๋‹ˆ์š”.
  2. ๋ถˆํ–‰ํžˆ๋„ ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋งˆ์Šคํ„ฐ์™€ ๋™๊ธฐํ™”๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ๊ธฐ๋ฐ˜์„ ๋‘์ง€ ์•Š์€ ๋‚ด PR ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ถ„๊ธฐ ์ž์ฒด์— ํ˜„์žฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ค‘ ์ผ๋ถ€๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  3. ๋˜ํ•œ PR ์˜๊ฒฌ์— ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์€ _ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ_ ํ•˜์ง€๋งŒ Mozilla๊ฐ€ ๊ณ„์†ํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  4. ์—ฌ์ „ํžˆ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด(๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ) ์•„๋ž˜ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. git clone -b use-on-response-started-for-execute --single-branch https://github.com/Sxderp/greasemonkey.git [1]
  2. ./package.sh ์‹คํ–‰ํ•˜๋ฉด XPI ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  3. Firefox์—์„œ about:config ๋กœ ์ด๋™ํ•˜์—ฌ xpinstall.signatures.required ๋ฅผ false
  4. Firefox์—์„œ about:addons ๋กœ ์ด๋™ํ•˜์—ฌ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๋ฅผ ํด๋ฆญํ•œ ๋‹ค์Œ ํŒŒ์ผ์—์„œ ์„ค์น˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  5. 2๋‹จ๊ณ„์—์„œ ๋งŒ๋“  XPI๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

[1] git ๋ฒ„์ „์ด -b ๋ฐ/๋˜๋Š” --single-branch ํ”Œ๋ž˜๊ทธ(git์˜ ์ด์ „ ๋ฒ„์ „)๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ git clone https://github.com/Sxderp/greasemonkey.git ๋ฐ git checkout use-on-response-started-for-execute .

์•ˆ๋…•ํ•˜์‹ญ๋‹ˆ๊นŒ,
๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ฝค ์˜ค๋ž˜๋œ ๊ฒฐํ•จ์ด๋ฉฐ iframe ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค...

์ฐธ๊ณ ๋กœ ๋‚ด์ผ์€ 3์›” 13์ผ์ž…๋‹ˆ๋‹ค( Firefox 59.0 )...

@Sxderp ๋ฅผ ์ฐธ์กฐํ•˜๊ณ 

webNavigation.onCommitted๋Š” ์ดˆ๊ธฐ ํ”„๋ ˆ์ž„ ์ƒ์„ฑ/ํŽ˜์ด์ง€ ๋ Œ๋”๋ง์„ '๋ณด์ง€' ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋ ˆ์ž„ ํƒ์ƒ‰์ด ์ดˆ๊ธฐ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์œ„์น˜์— ์žˆ์œผ๋ฉด ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ด๋ฅผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜์— 'allFrames' ํ‚ค๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ: true ๋ฌธ์ œ๊ฐ€ ์–ด๋Š ์ •๋„ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ •์  html ํŽ˜์ด์ง€์˜ ๋ชจ๋“  ํ”„๋ ˆ์ž„์—๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‚ฝ์ž…๋˜์ง€๋งŒ ์›๋ณธ/URL ์ผ์น˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Javascript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ ˆ์ž„์„ ์ƒ์„ฑํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฃผ์ž…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ๋‚˜๋Š” (๋‚ด ์‹œ์Šคํ…œ์—์„œ) ๋ฆฌ์Šค๋„ˆ executeUserscriptOnNavigation ๊ฐ€ chrome.webNavigation.onCommitted ์•ˆ์ •์ ์œผ๋กœ ํ˜ธ์ถœ๋˜์–ด chrome.tabs.executeScriptInFrame ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ frameId ํ˜ธ์ถœ๋œ๋‹ค๋Š” ์ฆ๊ฑฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. . ์ด๊ฒƒ์ด ํ”„๋ ˆ์ž„์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? iframe์—์„œ ๋ฐ˜์‘ํ•˜๊ธฐ ์œ„ํ•ด chrome.webRequest.onResponseStarted ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! (์•„๋‹ˆ๋ฉด ์ด๋ฒคํŠธ์— ๋ฐ˜์‘์„ ํ•˜๋Š”๋ฐ ํ”„๋ ˆ์ž„์ด ์•ˆ๋ณด์ธ๋‹ค๋Š” ๋ง์”€์ด์‹ ๊ฐ€์š”?) ์ด๋ฆ„์€ ํ™•์‹คํžˆ...

chrome.tabs.executeScriptInFrame ๋ฐ frameId ์•Œ๋ ค์ง„ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ช‡ ๋…„ ์ „์— ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. all_frames ๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ frameId ๊ฐ€ ์œ ํšจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. matchAboutBlank ์˜ต์…˜์„ true ๊ฒƒ์ด ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด executeScript ๊ฐ€ <unavailable> ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค). ํ•˜์ง€๋งŒ about:blank ๋ฌผ๊ฑด (์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ?) ...

์–ด๋–ค ์•„์ด๋””์–ด?

ํŠน์ง•? ์ด๊ฒƒ์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ˆ„๋ฝ ๋œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค ... ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ž˜๋ชป ํ•ด์„ํ–ˆ์Šต๋‹ˆ๋‹ค.

@Eselce , ์ด๊ฒƒ์€ ์˜ค๋ž˜์ „ ์ผ์ด๊ณ  ๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋‚ด์šฉ์„ ์™„์ „ํžˆ ๊ธฐ์–ตํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ํ•œ ๋ฒˆ

์ด์ œ ๋ฌธ์ œ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์„ ๋•Œ ๋™์ผํ•œ ์›๋ณธ ํ”„๋ ˆ์ž„๊ณผ ์›๊ฒฉ ํ”„๋ ˆ์ž„์ด ์žˆ๋Š” ์ •์  ํŽ˜์ด์ง€๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ์—์„œ onCommitted ์ฝœ๋ฐฑ์„ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ฌธ์„œ์— ๋Œ€ํ•ด ์‹คํ–‰๋˜์—ˆ์ง€๋งŒ ๋ฌธ์„œ [1]์˜ ์ •์  ํ”„๋ ˆ์ž„์— ๋Œ€ํ•ด์„œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‚ฝ์ž…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ดˆ๊ธฐ ๋กœ๋“œ ํ›„ ํ”„๋ ˆ์ž„ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์–ด๋”˜๊ฐ€๋ฅผ 'ํƒ์ƒ‰'ํ•˜๊ฒŒ ํ•˜๋ฉด onCommitted ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋˜๊ณ  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ƒˆ ์œ„์น˜์˜ ํ”„๋ ˆ์ž„์— ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด all_frames ์˜ต์…˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํŽ˜์ด์ง€์˜ ํ”„๋ ˆ์ž„์— ์‚ฝ์ž…๋˜์ง€๋งŒ ํ”„๋ ˆ์ž„์˜ ์›์ +๊ฒฝ๋กœ๋ฅผ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ์ ์ ˆํ•˜๊ฒŒ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ช…๋ฐฑํ•œ ๊ฒฐ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋‹ด์œผ๋กœ all_frames ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Javascript๋กœ ์ƒ์„ฑ๋œ ํ”„๋ ˆ์ž„์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

[1] ์ด ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ FF 52 ESR์—๋Š” ์—†์—ˆ์ง€๋งŒ 56(57?)์—๋Š” ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ํšŒ๊ท€). ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์ ์—์„œ ๋‹น์‹ ์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์น˜ ์ „์ฒด ํƒญ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ ํ”„๋ ˆ์ž„์ด ๊ฐœ๋ณ„์ ์œผ๋กœ ์ผ์น˜ํ•œ๋‹ค๋Š” ์ ์—์„œ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค(์ž์ฒด window ๋ฐ ์ž์ฒด document , ํ”„๋ ˆ์ž„์— ํฌํ•จ๋จ).

๊ธ€์Ž„, ๋‚˜๋Š” ๊ฑฐ์˜ ํ•ญ์ƒ ๊ฐ™์€ ๋ฉ”๋‰ด/ํ”„๋ ˆ์ž„ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด ์™”๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ ๋‹ค๋ฅธ ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

"ํ•ด๊ณ "๋ผ๊ณ  ๋งํ•˜๋ฉด ๋“ฃ๋Š” ์‚ฌ๋žŒ์˜ ์ˆœ์ˆ˜ํ•œ ์™ธ์นจ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด executeScript ์˜ค๋ฅ˜ ์กฐ๊ฑด์„ ์ƒ์„ฑํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋งŒ๋‚ฌ์ง€๋งŒ ๋ฆฌ์Šค๋„ˆ๋Š” ์—ฌ์ „ํžˆ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ location ( window , document ๋‹ค๋ฆ„) ๋•Œ๋ฌธ์— all_frames ์ด(๊ฐ€) ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. BTW: ๋ฉ”๋‰ด๋Š” ๊ฐ ํƒญ์˜ ๋ฉ”์ธํ”„๋ ˆ์ž„ URL๋งŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋‰ด๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๊ณ  ํ•ด์„œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค...

"ํ•ด๊ณ "๋ผ๊ณ  ๋งํ•˜๋ฉด ๋“ฃ๋Š” ์‚ฌ๋žŒ์˜ ์ˆœ์ˆ˜ํ•œ ์™ธ์นจ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

๊ทธ ํŠน์ • ๋ฉ”์‹œ์ง€์—์„œ ๋‚˜๋Š” ' onCommitted.addListener ์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.'๋ฅผ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์‹ญ๋‹ˆ๊นŒ,

์ด ๊ฒŒ์‹œ๋ฌผ์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ์ฝ์—ˆ์ง€๋งŒ ๋กœ์ปฌ ์Šคํฌ๋ฆฝํŠธ ".user.js"์—์„œ ๋Œ€์ฒด ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜์„ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ƒˆ๋กญ์Šต๋‹ˆ๋‹ค.

(Firefox ์—…๋ฐ์ดํŠธ ์ดํ›„๋กœ ์ƒ์„ฑ๋œ popup-iframe์€ ๋” ์ด์ƒ ์ถ”๊ฐ€ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ, ๋™์ผํ•œ ํŒ์—…์„ ์ƒˆ ์ฐฝ์—์„œ ์—ด๋ฉด ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.)

๋‹น์‹ ์˜ ๋„์›€์— ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค

๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ •ํ™•ํžˆ ์„ค๋ช…ํ•˜์…จ์Šต๋‹ˆ๋‹ค. @noframes ๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„ ์ฝ˜ํ…์ธ ์˜ URL์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ๊ณง ์ˆ˜์ •๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค(์ถ”๊ฐ€ ์ฐฝ์—์„œ ํ”„๋ ˆ์ž„์„ ์—ฌ๋Š” ๊ฒƒ์€ ์งœ์ฆ๋‚ฉ๋‹ˆ๋‹ค)...

Eselce๋‹˜ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Firefox ์—…๋ฐ์ดํŠธ ์ดํ›„๋กœ ํ•ญ์ƒ ๋Œ€์ƒ ์‚ฌ์ดํŠธ์—์„œ ์ด๋ฏธ ์‚ฌ์šฉ๋œ ๋ชจ๋“  scipts '.js'(require ํฌํ•จ)๋ฅผ ํ—ค๋”์— ์„ ์–ธํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. (์ œ์ด์ฟผ๋ฆฌ ํฌํ•จ)
๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.... ๋ฒ„๊ทธ๋‚˜ ์ถฉ๋Œ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
๋‹น์‹ ๋„ ์ด ๋ฌธ์ œ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

2945์—๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ”„๋ ˆ์ž„์—์„œ ์‹œ์ž‘๋˜์ง€๋งŒ ๋ช‡ ๋ฐ€๋ฆฌ์ดˆ ํ›„์— ์ค‘๋‹จ๋œ๋‹ค๋Š” ๊ด€์ฐฐ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์˜ˆ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ค‘์ธ ํŠน์ • URL์ด ๋‚ด ํ†ต์ œ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ณตํ•˜๊ธฐ๊ฐ€ ๊บผ๋ ค์ง€์ง€๋งŒ ์ผ๊ด€๋˜์ง€๋งŒ ์ด์ƒํ•œ ๋™์ž‘์„ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒํ˜ธ ์ž‘์šฉํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ rows="100%,0"(ํ™”๋ฉด์„ ์ฑ„์šฐ๋Š” ํ•˜๋‚˜์˜ ํ”„๋ ˆ์ž„)์ธ ํ”„๋ ˆ์ž„์„ธํŠธ/ํ”„๋ ˆ์ž„์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋ ˆ์ž„์€ ์ค‘๊ฐ„ ํ”„๋ ˆ์ž„์„ธํŠธ/ํ”„๋ ˆ์ž„์˜ ๋„๋ฉ”์ธ ๋‚ด์— ํ•˜๋‚˜์˜ ํ”„๋ ˆ์ž„์„ธํŠธ/3๊ฐœ์˜ ํ”„๋ ˆ์ž„์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

1+3 ์ž์‹ ํ”„๋ ˆ์ž„์˜ GM ์Šคํฌ๋ฆฝํŠธ ์ค‘ ์ผ๋ถ€๋Š” ์กด์žฌํ•˜๊ฒŒ "๋ฒˆ์ฉ"ํ•˜๋‹ค๊ฐ€ ์ดˆ๊ธฐ ์ฃผ๊ธฐ ํ›„์— ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ž‘์—… ํ›„์—๋Š” ๋‹ค์‹œ ๋Œ์•„์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด ์Šค๋ ˆ๋“œ์— ์„ค๋ช…๋œ ์ผ๋ถ€ ๋™์ž‘์— ๋งž์Šต๋‹ˆ๋‹ค. "๋ธ”๋ฆฝ"๊ณผ ์•„๋ž˜์— ์„ค๋ช…๋œ ๋™์ž‘์€ ๋ธŒ๋ผ์šฐ์ €/GM ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ ๋ฌด์ž‘์œ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํŒจํ„ด์€ ์ด์ƒํ•˜์ง€๋งŒ ์ฃผ์–ด์ง„ ์„ค์ •์— ๋Œ€ํ•ด 100% ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  1. ์ฒซ ๋ฒˆ์งธ ํ”„๋ ˆ์ž„ ์„ธํŠธ/ํ”„๋ ˆ์ž„์€ ์ ˆ๋Œ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์ฃผ๊ธฐ์™€ ์ง€์—ฐ ํ›„ ๋ชจ๋‘ window.document ๋ฐ unsafeWindow.document๋ฅผ ํ†ตํ•ด ํ”„๋ ˆ์ž„ ํƒœ๊ทธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ํ•ด๋‹น ํ”„๋ ˆ์ž„์˜ GM ์Šคํฌ๋ฆฝํŠธ๊ฐ€ console.log์— ์•„๋ฌด ๊ฒƒ๋„ ๋ณด๊ณ ํ•˜์ง€ ์•Š๊ฒŒ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ( @include ๋Š” *์ด๋ฉฐ @exclude ๋˜๋Š” ๊ธฐํƒ€ URL ํ•„ํ„ฐ๋ง์ด ์—†์Šต๋‹ˆ๋‹ค.)
  2. ์ดํ›„ ๋™์ž‘ ์ค‘ ์ผ๋ถ€๋Š” Firefox 52.8 / GM 4.1๊ณผ Firefox 60.0 / GM 4.3 ๊ฐ„์— ๋‹ค๋ฅด์ง€๋งŒ @noframes ๊ฐ€ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๊ฐ ๊ฒฝ์šฐ์— ํ”„๋ ˆ์ž„์˜ GM ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์กด์žฌํ•˜๋„๋ก "๋ธ”๋ฆฝ"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ @includes *๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๋‹ค๋ฅธ URL ํ•„ํ„ฐ๋Š” ์—†์Šต๋‹ˆ๋‹ค. @noframes๊ฐ€ ์„ค์ •๋œ ์ƒํƒœ์—์„œ ๋ธ”๋ฆฝํ•ด์„œ๋Š”
  3. Firefox 52.8/GM 4.1์—์„œ ๋‹ค์Œ ํ”„๋ ˆ์ž„์…‹/3๊ฐœ ํ”„๋ ˆ์ž„์€ ํ•ญ์ƒ ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Firefox 60.0 / GM 4.3์—์„œ๋Š” ์ดˆ๊ธฐ ํ”„๋ ˆ์ž„ ๋กœ๋“œ ์‹œ "๋ธ”๋ฆฝ"ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  4. Firefox 60.0 / GM 4.3์—์„œ 3๊ฐœ์˜ ํ”„๋ ˆ์ž„ ์ค‘ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์„ ํƒ์ƒ‰ํ•˜๋Š” 3๊ฐœ์˜ ํ”„๋ ˆ์ž„ ์ค‘ ํ•˜๋‚˜์˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด(์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•„๋‹Œ ์•ต์ปค ๋งํฌ์˜ "target" ์†์„ฑ์„ ํ†ตํ•ด) ์ƒˆ URL์ด ์•„๋‹ˆ๋ผ "blip"๋ฉ๋‹ˆ๋‹ค. ํƒ์ƒ‰๋œ ํ”„๋ ˆ์ž„์˜ ์ด์ „ URL์ž…๋‹ˆ๋‹ค. (ํ•ญ๋ชฉ # 3์—์„œ ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ ๋ธ”ํ•‘๋œ ํ”„๋ ˆ์ž„ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.)
  5. ์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ์ด์ƒํ•œ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ธŒ๋ผ์šฐ์ € ์„ค์ • ๋ชจ๋‘์—์„œ --- ๋‹จ๊ณ„์— ๋”ฐ๋ผ 2๊ฐœ์˜ ํ”„๋ ˆ์ž„ ์„ธํŠธ ๋ ˆ์ด์–ด, ์ด 4๊ฐœ์˜ ํ”„๋ ˆ์ž„์ด ์žˆ๋Š” ์ดˆ๊ธฐ ํŽ˜์ด์ง€๋ฅผ ์—ด๊ณ  ํ•œ ํ”„๋ ˆ์ž„์˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ ๋™์ผํ•œ ํŽ˜์ด์ง€์˜ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์„ ํƒ์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ฒ˜์Œ์— ํ‘œ์‹œ๋œ ๋‘ ๋ฒˆ์งธ ์ˆ˜์ค€ ํ”„๋ ˆ์ž„ ์„ธํŠธ์—๋Š” "top.htm", "menu.htm" ๋ฐ "start,htm" ํ”„๋ ˆ์ž„์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. "menu.htm" ํ”„๋ ˆ์ž„์˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ "start.htm"์ด ์žˆ๋Š” ํ”„๋ ˆ์ž„์ด "content.htm"์œผ๋กœ ์ด๋™ํ•˜๋„๋ก ํ–ˆ์œผ๋ฉฐ, ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ธŒ๋ผ์šฐ์ € ์„ค์ •๋งˆ๋‹ค ์œ ์‚ฌํ•˜์ง€๋งŒ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ "content.htm" ํ”„๋ ˆ์ž„ ๋‚ด๋ถ€์˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ ๋™์ผํ•œ ํ”„๋ ˆ์ž„, ๋™์ผํ•œ ๋„๋ฉ”์ธ ๋‚ด๋ถ€๋ฅผ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ "content.htm"์— ๋Œ€ํ•œ ์Šคํฌ๋ฆฝํŠธ๋Š” "๋ธ”๋ฆฝ(blip)"ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ GM.xmlHttpRequest(๋น„๋™๊ธฐ ์ด๋ฒคํŠธ)๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์—๋„ ํ™œ์„ฑ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ "content.htm"์€ ๋ธŒ๋ผ์šฐ์ € ๋””์Šคํ”Œ๋ ˆ์ด ์–ด๋””์—๋„ ์—†์ง€๋งŒ ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ”„๋ ˆ์ž„ ๋‚ด ํŽ˜์ด์ง€์˜ GM ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํŽ˜์ด์ง€ ๋กœ๋“œ ๋Œ€์‹  ํŽ˜์ด์ง€ ์–ธ๋กœ๋“œ ์‹œ ๋กœ๋“œ๋˜๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. @run-at์„ document-start๋กœ ์„ค์ •ํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ unsafeWindow.document์˜ DOMContentReady ์ด๋ฒคํŠธ์— ๋„ฃ๋Š” ๊ฒƒ์€ ๊ฐœ์„ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (window.document์— ์„ค์ •ํ•˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

-๋ผ์ด์–ธ

Firefox 52.8/GM 4.1์—์„œ ๋‹ค์Œ ํ”„๋ ˆ์ž„์…‹/3๊ฐœ ํ”„๋ ˆ์ž„์€ ํ•ญ์ƒ ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Firefox 60.0 / GM 4.3์—์„œ๋Š” ์ดˆ๊ธฐ ํ”„๋ ˆ์ž„ ๋กœ๋“œ ์‹œ "๋ธ”๋ฆฝ"ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Firefox 57๋กœ์˜ ์ „ํ™˜์—์„œ Mozilla๋Š” _๋ฌด์–ธ๊ฐ€_๋ฅผ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ด๋“  ํ”„๋ ˆ์ž„์ด ํŠธ๋ฆฌ๊ฑฐ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์ด ๋ณ€๊ฒฝ(๋˜๋Š” ์ค‘๋‹จ)๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ๋ฌธ์ œ์—์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋Š” ์ดˆ๊ธฐ ํ”„๋ ˆ์ž„ ๋กœ๋“œ(57+)์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

userScript ๋˜๋Š” contentScript API๋กœ์˜ ์ตœ์ข… ์ „ํ™˜์€ ์–ด์จŒ๋“  ์ด ๋ชจ๋“  ๊ฒƒ์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์‚ฌ๋žŒ๋“ค์€ ๊ณ„์† ๋งํ•˜์ง€๋งŒ Violentmonkey๋Š” ๊ณ„์†ํ•ด์„œ ํ”„๋ ˆ์ž„์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. VM์ด ์›น ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ์—์„œ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜(CSP๋Š” ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ์›น ํŽ˜์ด์ง€๋Š” ์ „์—ญ ๊ฐœ์ฒด๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ์ €๋Š” ์˜ค๋ž˜์ „์— Greasemonkey๋ฅผ ๋ฒ„๋ ธ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ๋“ค์€ ๊ด€๋ จ๋œ ๋ฌธ์ œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €๋Š” ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์Šค์Šค๋กœ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด Firefox์˜ ํฌ๋กฌ์„ ๊นŠ์ด ํƒ์ƒ‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

ํ˜„์žฌ ๋‚ด ์ž์‹ ์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ƒ์œ„ ํ”„๋ ˆ์ž„์—์„œ Greasemonkey๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ•˜์œ„ ํ”„๋ ˆ์ž„์—์„œ Violentmonkey๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจํ˜ธํ•œ ์ˆ˜์ œ ๋ผ์ด์„ผ์Šค๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Tampermonkey๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋” ์ž˜ ์ž‘๋™ํ•˜๊ฑฐ๋‚˜ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

VM์€ ํŽ˜์ด์ง€์˜ ์ž์ฒด ์ปจํ…์ŠคํŠธ์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ญ์ œํ•œ๋‹ค๋Š” ์ ์„ ์—ผ๋‘์— ๋‘์‹ญ์‹œ์˜ค. ์•ˆ์ „ํ•œ ๋™๋“ฑ๋ฌผ์ด ์—†๋Š” GM์˜ unsafeWindow์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ธฐ์–ต์— ๋‚จ๋Š” ์‹œ๊ฐ„ ์ค‘ ํ•˜๋‚˜๋Š” ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ๊ฐ€ Array.prototype์— 'toJSON()' ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด JSON.stringify()๊ฐ€ ๋‚ด ์Šคํฌ๋ฆฝํŠธ ๋‚ด์—์„œ ์ž˜๋ชป๋œ JSON์„ ๋ฑ‰์–ด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฐœ๊ฒฌํ•œ ๋Œ€๋กœ ๋ฐฉ์–ด์ ์œผ๋กœ ํŠธ๋žฉํ•˜๊ณ  ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

VM์˜ ๋˜ ๋‹ค๋ฅธ ํฐ ๊ด€์‹ฌ์‚ฌ๋Š” ์ฝ˜ํ…์ธ  ํŽ˜์ด์ง€์˜ ์ฝ˜ํ…์ธ  ๋ณด์•ˆ ์ •์ฑ…์„ ์กด์ค‘ํ•˜๋ฏ€๋กœ ์Šคํฌ๋ฆฝํŠธ ์†Œ์Šค๋ฅผ ์ œํ•œํ•˜๋Š” ๋ชจ๋“  ์ง€์‹œ๋ฌธ์œผ๋กœ ์ธํ•ด VM ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์›น ์ฝ˜์†”์€ ์•„๋‹˜). ๊ทธ๋ž˜์„œ VM์„ ์™„์ „ํžˆ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๊ณ  GM๋งŒ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง CSP ์„ธํŠธ๊ฐ€ ์žˆ๋Š” ์ž์‹ ํ”„๋ ˆ์ž„์„ ๋งŒ๋‚œ ์ ์ด ์—†์ง€๋งŒ ๋งŒ๋‚˜๋ฉด ์™„์ „ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@RyanHanekamp ํŒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋Ÿฌ๋ฉด ์•„๋งˆ๋„ ์ผ๋ถ€ ์Šคํฌ๋ฆฝํŠธ์— Violentmonkey๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Violent์—๋„ ๋™๊ธฐ์‹ GM_getValue์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์ƒˆ๋กœ์šด Greasemonkey์—์„œ ์ˆ˜๋งŽ์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊นจ๋œจ๋ฆฌ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ๊ทธ๋ฆฌ์Šค๋ชฝํ‚ค๋ฅผ ๊ฐ€์žฅ ์‹ ๋ขฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

iframe์— ๊ด€ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด Javascript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด ํƒœ๊ทธ๋กœ ๊ต์ฒดํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

myObject= document.createElement('object');
myObject.setAttribute('id', 'myObject'); 
document.body.appendChild(myObject);
myObject.setAttribute('src', 'https://example.com');

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐœ์ฒด๊ฐ€ ๋กœ๋“œ๋˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
document.querySelector('#myObject').contentDocument.defaultView.document.querySelectorAll('someElementInsideObjectPage')
์ ์–ด๋„ ์ด๊ฒƒ์€ ๊ฐœ์ฒด๊ฐ€ ๊ธฐ๋ณธ ํŽ˜์ด์ง€์™€ ๋™์ผํ•œ ํ˜ธ์ŠคํŠธ์— ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐœ์ฒด( ... contentDocument.defaultView.postMessage('hello, object') )์™€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” VM ์ „๋ฌธ๊ฐ€๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ ์–ด๋„ ๋Œ€๋ถ€๋ถ„์˜ ์›๋ž˜ GM_* API๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์žฅ๊ธฐ์ ์œผ๋กœ ๋™๊ธฐ์‹ ํ”Œ๋žซํผ์œผ๋กœ ์—ญ์ถ”์ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ดํ•ด์— ๋”ฐ๋ฅด๋ฉด Greasemonkey๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šคํฌ๋ฆฝํŠธ์™€ ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ ๊ฐ„์˜ ๋™๊ธฐ ํ˜ธ์ถœ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ƒˆ๋กœ์šด Quantum ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ฒด ์†”๋ฃจ์…˜์— ๊ด€ํ•ด์„œ๋Š” ๋‚ด ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค. CSS/์†์„ฑ/๋“ฑ์„ ๋งˆ์ƒฌ๋งํ•˜๊ณ  ํ”„๋ ˆ์ž„๊ณผ iframe์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ์บก์ฒ˜ ํ”„๋กœ์„ธ์Šค์—์„œ ์ž ์žฌ์ ์œผ๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฐœ์ฒด๋ฅผ ํ•„ํ„ฐ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ GM์ด ๋งˆ์นจ๋‚ด ์ฃผ์„์— ๋งํ•œ ๋Œ€๋กœ ํ•  ๋•Œ๊นŒ์ง€๋Š” VM์ด โ€‹โ€‹๋” ์‰ฌ์› ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋™์ผํ•œ ์ถœ์ฒ˜์˜ ํ”„๋ ˆ์ž„/iframe์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋‚ด์šฉ์—๋„ ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์–ด๋ ค์šด ๋ถ€๋ถ„์€ ๊ต์ฐจ ์ถœ์ฒ˜์ด๋ฏ€๋กœ ํ”„๋ ˆ์ž„ ๋‚ด๋ถ€์— ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ถ€๋ชจ ์ฐฝ๊ณผ ๋‹ค์‹œ ๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด window.postMessage() ์ฑ„๋„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

@RyanHanekamp Violent Monkey๊ฐ€ ์—ฌ์ „ํžˆ ์˜ค๋ž˜๋˜๊ณ  ๋‹จ์ˆœํ•œ GM_*์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” Greasemonkey๊ฐ€ ์ƒˆ ๋ฒ„์ „๊ณผ ํ•จ๊ป˜ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์ด์ „์˜ ๋™๊ธฐ์‹ GM_getValue๋ฅผ ์œ ์ง€ํ–ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ƒˆ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ €๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์ž‘๋™ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„์ง€ ํ™•์‹ ์ด ์„œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ์˜จ๋ผ์ธ์—์„œ ์ฐพ์€ 2000ํ–‰์˜ ๊ณ ๋Œ€ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ด์ „ GM_getValue์˜ ์‚ฌ์šฉ์„ ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค...๋„ˆ๋ฌด ๋งŽ์€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ง€๊ธˆ ์†์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์™œ Violent๊ฐ€ ๋‹น์‹ ์—๊ฒŒ ๋” ๋‚˜์€ ์„ ํƒ์ธ์ง€ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. Anthony, Sxderp ๋˜๋Š” ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฒฐ๊ตญ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ด๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ๋ฐ”๋ผ์ง€๋งŒ ์ €๋Š” ์™„์ „ํ•œ ํ‰์‹ ๋„์ž…๋‹ˆ๋‹ค.

์˜ค, ๋™์ผํ•œ ์ถœ์ฒ˜์˜ iframe(postMessage ๋“ฑ ์—†์ด)์˜ ๋‚ด์šฉ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฐฉ๋ฒ•์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์‹œ๊ฐ„์„ ํ—ˆ๋น„ํ–ˆ๋˜ ๊ธฐ์–ต์ด ๋‚ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ถˆ๊ฐ€๋Šฅํ•ด ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ postMessage๋กœ๋„ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„ ๋ฐ iframe์—๋Š” window ์†์„ฑ๊ณผ ๋™์ผํ•œ contentWindow ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค DOM์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ document ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

iframe(๋™์ผํ•œ ์›์ ์—์„œ) ์ž‘์—…์˜ ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ถ€๋ถ„์€ ์ฝ˜ํ…์ธ ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ์‹œ์ ์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋  ๋•Œ๊นŒ์ง€ ์Šค์ฟผํŠธ๋ฅผ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. onload๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Firefox๋Š” ์†์ž/์ฆ์†์ž ๋“ฑ์˜ ํ”„๋ ˆ์ž„์„ ํฌํ•จํ•˜์—ฌ ๋กœ๋“œ๋œ ๋ชจ๋“  ํ”„๋ ˆ์ž„์— ๋Œ€ํ•ด ๋ฐœ์ƒํ•˜๋Š” DOMFrameContentLoaded ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ๋Š” event.target ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์›๋ณธ ํ”„๋ ˆ์ž„/iframe ์š”์†Œ์™€ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„/iframe์˜ ๋‚ด์šฉ์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒฝ์šฐ postMessage๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ window.parent ๊ฐ์ฒด์˜ ์ „์—ญ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ถ€๋ชจ์—๊ฒŒ ๋‹ค์‹œ ์ด์•ผ๊ธฐํ•˜๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งํ•˜์ž๋ฉด... ์ด๊ฒƒ์ด ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž ์žฌ์ ์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋„๋ฉ”์ธ ๊ฐ„ ์ฐฝ ์ฐธ์กฐ์— ์ˆ˜๋™์œผ๋กœ ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•ด GM ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๊ฑฐ๋‚˜ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์ž์—๊ฒŒ ํ›จ์”ฌ ๋” ๋งŽ์€ ์ฝ”๋”ฉ์ด ํ•„์š”ํ•˜์ง€๋งŒ ์ž‘์—…์„ ์™„๋ฃŒํ•  ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ„ด์€ DOMFrameContentLoaded๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  event.target์ด 1์„ธ๋Œ€์ธ์ง€ ํ™•์ธํ•˜๊ณ  ๊ทธ๋ ‡๋‹ค๋ฉด ์ˆ˜๋™์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. (1์„ธ๋Œ€ ํ”„๋ ˆ์ž„์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ 2์„ธ๋Œ€ ํ”„๋ ˆ์ž„์— ๋Œ€ํ•ด DOMContentLoaded๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์—ฌ ์™„์ „ํ•œ ์ฒด์ธ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) @run-at dom-start ๋™์ž‘์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์œผ๋ฉฐ ํƒ€์ด๋ฐ ๋ฌธ์ œ๋„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ์„ ํฌ๊ธฐํ•˜๊ณ  ๋Œ€์‹  ํ™•์žฅ์„ ์ง์ ‘ ์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”„๋ ˆ์ž„์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!

์ด ์ ์—์„œ Greasemonkey์™€ Violentmonkey์˜ ์ฐจ์ด์ ์€ Violentmonkey๊ฐ€ all_frames๊ฐ€ true๋กœ ์„ค์ •๋œ ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ์—์„œ ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ๋ฐ˜๋ฉด Greasemonkey์—๋Š” ์„ค์น˜ ์‹œ๊ฐ„ ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์—†๊ณ  ํƒญ์˜ ํ”„๋ ˆ์ž„์ด ํƒ์ƒ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  Violentmonkey๋Š” ํ›จ์”ฌ ์•ˆ์ „ํ•œ tabs.executeScript()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์ผ์‹œ์ ์œผ๋กœ SCRIPT ํƒœ๊ทธ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— CSP ํŽ˜์ด์ง€์—์„œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.)

all_frames, run_at start๊ฐ€ ์žˆ๋Š” ์ •์  ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋„ฃ๊ณ  start / document.DOMContentLoaded / document.Idle์— ๋Œ€ํ•œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค์— ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ฒƒ์„ ์ผ์น˜์‹œ์ผœ ๊ฐ run_at์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์†Œํ•˜์ง€๋งŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์–‘์˜ ์ž‘์—…. ๋‚ด๊ฐ€ ์ง์ ‘ ๊ณ ์น  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐœ๋ฐœ์ž ์ข…์†์„ฑ์„ ํ†ตํ•ด ์ง„ํ–‰ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์—†์œผ๋ฉฐ ์ถœ๋ ฅ ์ฝ”๋“œ๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@RyanHanekamp

๋Œ€์‹  ํ™•์žฅ์„ ์ง์ ‘ ์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”„๋ ˆ์ž„์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!

๊ท€ํ•˜์˜ ํ™•์žฅ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚ด ํ™•์žฅ์€ ๋ฒ”์šฉ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์š”์ ์€ all_urls๊ฐ€ ์žˆ๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ ์ •์  content_script๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด all_frames๊ฐ€ ํ”„๋ ˆ์ž„์ด ๋กœ๋“œ๋˜๊ฑฐ๋‚˜ ํƒ์ƒ‰๋  ๋•Œ๋งˆ๋‹ค ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํŽ˜์ด์ง€์˜ Content-Security-Policy์— ๊ด€๊ณ„์—†์ด ์ž˜ ํ‰๊ฐ€/ํ•จ์ˆ˜ ์ƒ์„ฑ์ž ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋ ˆ์ž„/์ฐฝ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์ง€๋งŒ run_at ์„ค์ •์— ๊ด€๊ณ„์—†์ด ์ดˆ๊ธฐ ์ƒ์„ฑ ์‹œ ์‹คํ–‰๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ”„๋ ˆ์ž„์€ ์ฒ˜์Œ์—๋Š” ๊ณต๋ฐฑ์œผ๋กœ ์ƒ์„ฑ๋œ ๋‹ค์Œ ์ฑ„์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—”์ง„์€ ์•„๋งˆ๋„ ์ดˆ๊ธฐ ์ƒ์„ฑ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ช…์‹œ์  ์ผ์น˜๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋Š” urls ๋ฐ์ดํ„ฐ๋„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. all_urls๊ฐ€ ํ•ด๋‹น ํ•ญ๋ชฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด http/https๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ •์  content_script ์ฐธ์กฐ์ผ ํ•„์š”๋Š” ์—†์ง€๋งŒ ํŽ˜์ด์ง€๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ ๋™์ ์œผ๋กœ ํ˜ธ์ถœ๋œ ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ๋กœ๋“œ๋˜๋Š”์ง€ ๋ฌธ์„œ์—์„œ ๋ถˆํ™•์‹คํ•œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋‚ด ์ธ์ƒ์€ ์ œ๊ณต๋œ ์ผ์น˜ ํŒจํ„ด์— ๋”ฐ๋ผ ํ˜„์žฌ ์ผ์น˜ํ•˜๋Š” ํƒญ/ํ”„๋ ˆ์ž„์—๋งŒ ์ฃผ์ž…๋˜๊ณ  ํƒ์ƒ‰์€ ์žฌ์ฃผ์ž…์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ชฉ์ ์„ ์œ„ํ•ด ์ •์  content_script๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์—๋Š” ๋‹จ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

Greasemonkey๋Š” ๋ถ„๋ช…ํžˆ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์ •์  ๋ฆฌ์†Œ์Šค๋กœ ํฌํ•จํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ๋Š” tabs.executeScript์— ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค(๋น„๋ก ๋ฉฐ์น  ๋ฐ–์— ์•ˆ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ๋Œ€ํ•œ ์ „๋ฌธ๊ฐ€๋Š” ์•„๋‹ˆ์ง€๋งŒ). ๊ทธ๋Ÿฌ๋‚˜ ์ •์  ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ frameId๊ฐ€ ํƒ์ƒ‰๋˜์—ˆ๊ณ  ์–ด๋–ค URL๋กœ ์ด๋™ํ–ˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ webRequest ๋˜๋Š” webNavigation์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฒคํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ด ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰ํ•œ ์‹œ๋„๋ฅผ ๋‚ด๊ฐ€ ์ธ์ง€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค. ์ •์  content_script์˜ ์‹ ํ˜ธ๋Š” Greasemonkey์˜ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ ๋กœ๋”/์ธ์ ํ„ฐ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ฐพ๊ณ  ์žˆ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

document_start์—์„œ ์—„๊ฒฉํ•˜๊ฒŒ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ์ง€์—ฐ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ๋น„๋™๊ธฐ์‹์ด๋ฉฐ ๋ฌธ์„œ๋Š” ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Violentmonkey๊ฐ€ tabs.executeScript ๋Œ€์‹  ์ž„์‹œ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ ์‚ฝ์ž…์€ content_script์—์„œ ๋™๊ธฐ์‹์œผ๋กœ ์ง์ ‘ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” run_at document_start์— ๋Œ€ํ•œ ๋ฌธ์„œ ์ƒํƒœ์˜ ๋ถˆํ™•์‹ค์„ฑ์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์ง€๋งŒ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ „ํ˜€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Greasemonkey ... CAN [์ •์  ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ] background ํ”„๋กœ์„ธ์Šค์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์„œ frameId๊ฐ€ ํƒ์ƒ‰๋˜์—ˆ์Œ์„ ์•Œ๋ฆฌ๊ณ  ์–ด๋–ค URL๋กœ ...

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ .user.js ํƒ์ƒ‰์„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ํ–ˆ๋˜ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช…ํ•˜๊ณ  ์ข‹์€ ์†”๋ฃจ์…˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ฝ˜ํ…์ธ ๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค!

๊ทธ๋Ÿฌ๋‚˜ ํ™•์žฅ ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ๋„ CSP(#2631 ๋ฐ http://bugzil.la/1267027 ๋ฐ http://bugzil.la/1411641)์— ์˜ํ•ด ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ CSP ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Firefox 60.0.1 ๋ฐ 52.8.1ESR์—์„œ content_script ๋‚ด์—์„œ ์ง์ ‘ Function() ์ƒ์„ฑ์ž๋ฅผ ํฌํ•จํ•˜์—ฌ ์ž์ฒด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„-src ๋ฐ์ดํ„ฐ:; object-src '์—†์Œ'; ์Šคํฌ๋ฆฝํŠธ-src '์—†์Œ'; style-src '์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ธ๋ผ์ธ' ๋ฐ์ดํ„ฐ:; connect-src '์—†์Œ'; media-src '์—†์Œ';

Firefox๊ฐ€ ๊ธฐ๋ณธ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— 2631์ด ๋‹ซํ˜”์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ bugzilla๋Š” content_script ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ(Violentmonkey ๋ฉ”์„œ๋“œ) ์ฃผ์ž…์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” CSP์— ๋Œ€ํ•œ ์ƒŒ๋“œ๋ฐ•์Šค ์†์„ฑ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ์ด ์ž์‹ ๊ณผ์˜ ๋„๋ฉ”์ธ ์ผ์น˜๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. NaN!==NaN๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

๋ช‡ ๋‹ฌ ์ „์— ์ด๊ฒƒ์ด ์ฒ˜์Œ ์ œ์ถœ๋˜์—ˆ์„ ๋•Œ ์šฐ๋ฆฌ๋Š” ์ผ์„ ๋‹ค๋ฅด๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ํƒ์ƒ‰์„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด webNavigation.onCommitted ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ๊ฐ€ ์ง€๊ธˆ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ…Œ์ŠคํŠธ์—์„œ ์–ด๋–ค ์ด์œ ๋กœ (ni)frame์—์„œ ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์ด์ œ ํ•ด๊ฒฐ๋˜์…จ๋‚˜์š”?

Tampermonkey์šฉ์œผ๋กœ ๋งŒ๋“  ์Šคํฌ๋ฆฝํŠธ๋ฅผ Greasemonkey๋กœ iframe์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ ์ฝ”๋“œ๋Š” ์šฐ๋ฆฌ ์ธก์—์„œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Mozilla๊ฐ€ ๋์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ํ•œ ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํŒŒ์‚ฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ #2663์ด ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Violentmonkey์™€ Tampermonkey๋Š” ์ž„๋ฒ ๋””๋“œ ํ”„๋ ˆ์ž„ ๋‚ด์—์„œ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Tampermonkey๋Š” ์ ์–ด๋„ ์ €์—๊ฒŒ๋Š” Chrome์˜ iframe์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Violentmonkey์™€ Tampermonkey๋Š” ์ž„๋ฒ ๋””๋“œ ํ”„๋ ˆ์ž„ ๋‚ด์—์„œ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Tampermonkey๋Š” ์ ์–ด๋„ ์ €์—๊ฒŒ๋Š” Chrome์˜ iframe์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Firefox Violentmonkey์—์„œ๋Š” ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ป๊ฒŒ ๊ฑฐ๊ธฐ์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ๋™๊ธฐํ™” GM_GetValue๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ Violentmonkey์—์„œ๋„ ์—ฌ์ „ํžˆ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฉ๊ธˆ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๊ทธ๊ฒŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? Firefox๊ฐ€ ๋น„๋™๊ธฐ์‹ GM.GetValue๋ฅผ ๊ฐ•์ œ ์‹คํ–‰ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋„ˆ๋ฌด ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ Violentmonkey๋Š” ๋™๊ธฐํ™” ๋ฐ ๊ธฐํƒ€ ๊ธฐ๋Šฅ์„ ๊ณ„์† ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ฒƒ์„ ํฌ์ƒํ•ด์•ผ ํ–ˆ์„๊นŒ์š”?

@Cerberus-tm Firefox์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ํ™•์žฅ ์ €์žฅ์†Œ ๋˜๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ปจํ…์ŠคํŠธ์—์„œ๋งŒ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์š”์ฒญ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ ์ž์ฒด๊ฐ€ ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ๋กœ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ „์†ก๋จ). ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ GM4 ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•ด๋‹น ํŽ˜์ด์ง€์— ๋กœ๋“œ๋˜๋Š” ๊ฐ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•ด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ์— ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ณ  ์บ์‹œํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ์— ๋™๊ธฐ์ ์œผ๋กœ ์ œ๊ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ์˜ ๋ฐ์ดํ„ฐ ์š”์ฒญ์— ๋™๊ธฐ์ ์œผ๋กœ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์บ์‹œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ GM4์˜ ํ™•์žฅ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ˆ˜์‹ ํ•˜๋„๋ก ํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ด๋ฅผ ์บ์‹ฑํ•˜๋ฉด ๊ฐ ์ฝ˜ํ…์ธ  ์Šคํฌ๋ฆฝํŠธ์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋„ ํฌ๊ฒŒ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.

TM๊ณผ VM์€ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ ๊ด€๋ฆฌ์ž๊ฐ€ Chrome์šฉ์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ์„ ๋•Œ ์›๋ž˜ Greasemonkey API์™€์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์œ„์™€ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ํ•˜๊ธฐ๋กœ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™•์žฅ ์ €์žฅ์†Œ์™€์˜ ๋น„๋™๊ธฐ ํ†ต์‹  ๋“ฑ. ์ด๋ฏธ Chrome์šฉ์œผ๋กœ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Firefox์šฉ์œผ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ ๋ณ€๊ฒฝํ•  ์ด์œ ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ WebExtensions์— ๋Œ€ํ•œ FF57 ์ปท์˜ค๋ฒ„๋Š” GM์˜ ์žฌ์ž‘์„ฑ์„ ๊ฐ•์ œํ–ˆ์ง€๋งŒ GM.getValue , GM.setValue ๋“ฑ์— ๋Œ€ํ•œ ๋น„๋™๊ธฐ API ์ฑ„ํƒ์„ ๊ฐ•์ œ ํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. WebExtensions๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ๊ธฐ๋ฐ˜ API๋Š” ๋™๊ธฐ์‹๋ณด๋‹ค ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์ง€๋งŒ ํ•„์š”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๊ทธ ์„ ํƒ๊ณผ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋Š” ๋‹ค๋ฅธ ์„ ํƒ๋“ค์ด ๋ถˆํ–‰ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. GM3์—์„œ ์ž˜ ์‹คํ–‰๋˜์—ˆ๋˜ ์Šคํฌ๋ฆฝํŠธ์™€์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ๋ฐ/๋˜๋Š” TM๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด GM4๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ ์ค‘ 30๊ฐœ ์ด์ƒ์€ ๋ชจ๋‘ GM3์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ–ˆ์ง€๋งŒ GM4์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(๋˜๋Š” ์ ์–ด๋„ GM4์™€ ํ˜ธํ™˜๋˜๋„๋ก ๋‹ค์‹œ ์ž‘์„ฑ๋˜๊ธฐ ์ „์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค). ๋‚ด๊ฐ€ ๋งค์ผ ์‚ฌ์šฉํ•˜๋Š” 28๊ฐœ์˜ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋Š”๋ฐ GM4์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ GM3์—์„œ๋Š” ์ž˜ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ iframe์— Greasemonkey/tampermonkey/userscript๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋‹ต๋ณ€์œผ๋กœ Stack Overflow์— ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋ ˆ์ž„์ด ๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ window.frames ๋ฐฐ์—ด์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ”„๋ ˆ์ž„์˜ ๋ณธ๋ฌธ์— ์‚ฌ์šฉ์ž ์ง€์ • ๋งˆ์ปค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ ํ”„๋ ˆ์ž„์„ ๋ณด์•˜๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ Greasemonkey๊ฐ€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ์†”๋ฃจ์…˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

waitForKeyElements() ์™€ ๊ฐ™์€ GM.waitFor(css_selector, action_function) ๋„ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹๊ฒ ์ง€ ๋งŒ ๊ทธ๊ฑด ์ œ์ณ๋‘๊ณ ์š”.

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