Greasemonkey: document.head๋Š” @run-at document-start์ผ ๋•Œ null์ž…๋‹ˆ๋‹ค.

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

ํ™˜๊ฒฝ

ํ‚ค | ๊ฐ’
-- | --
์‹œ์Šคํ…œ ํ”Œ๋žซํผ | AMD64, Windows-10-10.0.14393
๋ธŒ๋ผ์šฐ์ € | Firefox ๊ฐœ๋ฐœ์ž ์—๋””์…˜(55.0 ๋ฒ ํƒ€ 1, 64๋น„ํŠธ)
์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ | Mozilla/5.0(Windows NT 10.0, Win64, x64, rv:55.0) Gecko/20100101 Firefox/55.0
๋นŒ๋“œ ๊ตฌ์„ฑ | https://hg.mozilla.org/releases/mozilla-beta/rev/6872377277a618b2b9e0d2b4c2b9e51765ac199e
๊ทธ๋ฆฌ์Šค ์›์ˆญ์ด | 3.11

ํ…Œ์ŠคํŠธ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ:

// ==UserScript==
// <strong i="15">@name</strong>        HeadTest
// <strong i="16">@namespace</strong>   HeadTest
// <strong i="17">@include</strong>     *
// @run-at      document-start
// <strong i="18">@version</strong>     1
// <strong i="19">@grant</strong>       none
// ==/UserScript==
AddGlobalStyle('body{background-color:red;}');

function AddGlobalStyle(css) {
    var head, style;
    head = document.getElementsByTagName("head")[0];
    console.log("[Test]: Head: %o", head); //DEBUG
    console.log("[Test]: document.head: %o", document.head); //DEBUG
}

์˜ˆ์ƒ ๊ฒฐ๊ณผ:

[Test]: Head:  <head> 
[Test]: document.head:  <head>

์‹ค์ œ ๊ฒฐ๊ณผ:

[Test]: Head:  undefined
[Test]: document.head:  null

์ด ๋ฌธ์ œ๋Š” GM_addStyle ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

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

@the8472 ํ˜„์žฌ document-start ์˜ ๋™์ž‘์ด ์˜ฌ๋ฐ”๋ฅด๊ณ  ์˜๋„์ ์ด๋ผ๋ฉด ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ๊ด€์ฐฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ™์€ ๊ฒƒ

function addGlobalStyle(css){
  let headHunter = new MutationObserver(
    records => {
    ; check mutation records
    ; is added node's tag name 'head'?
    ; create a style node then throw it in
    ; then disconnect us
   }
  );
  headhunter.observer(document, {childlist : true});
}

document-end ์•ž์— ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ง€๋ฃจํ•˜๋‹ค.

GM_addstyle ๊ฐ€ ์ €๋ฅผ ์œ„ํ•ด ๊ทธ๋ ‡๊ฒŒ ํ•ด์ฃผ๊ฑฐ๋‚˜ ์œ„ํ‚ค์— ์œ ์šฉํ•œ ๊ฒฝ๊ณ ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ", ๋“ฑ)

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

๋งˆ์ง€๋ง‰ ์žฅ์ : Firefox 55.0a1(2017-03-17)
https://hg.mozilla.org/mozilla-central/rev/39607304b774591fa6e32c4b06158d869483c312 ์—์„œ ๋นŒ๋“œ

์ฒซ ๋ฒˆ์งธ ๋ถˆ๋Ÿ‰: Firefox 55.0a1(2017-03-17)
https://hg.mozilla.org/mozilla-central/rev/23a4b7430dd7e83a2809bf3dc41471f154301eda ์—์„œ ๋นŒ๋“œ

ํ‘ธ์‹œ๋กœ๊ทธ:
https://hg.mozilla.org/mozilla-central/pushloghtml?fromchange=39607304b774591fa6e32c4b06158d869483c312&tochange=23a4b7430dd7e83a2809bf3dc41471

๋ฒ„๊ทธ 1333990 ์ด ์šฉ์˜์ž์ž…๋‹ˆ๋‹ค.

์ฐธ์กฐ #1849

@janekptacijarabaci ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

setTimeout(()=>{
    AddGlobalStyle('body{background-color:red;}');
});

๋ถˆ์•ˆ์ •ํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์–ด ๋ณด์ด์ง€๋งŒ ์ด๊ฒƒ์ด ํ˜„์žฌ ๋‚ด๊ฐ€ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

...๊ทธ๋ฆฌ๊ณ  ๋ฌธ์„œ๋Š” ์—ฌ์ „ํžˆ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
https://developer.mozilla.org/en-US/docs/Observer_Notifications#Documents

https://bugzilla.mozilla.org/show_bug.cgi?id=1333990#c128

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. document-start ๋Š” ๋งค์šฐ ์ผ์ฐ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฝํŠธ๋Š” ์ฝ˜ํ…์ธ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ํŽ˜์ด์ง€๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ์‹คํ–‰ํ•˜๋ ค๋ฉด document-end ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋Œ์—ฐ๋ณ€์ด ๊ด€์ฐฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์š”์†Œ๊ฐ€ ์‚ฝ์ž…๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค.

@the8472
์–ด์ฉŒ๋ฉด ๋‹น์‹ ์ด ์˜ณ์Šต๋‹ˆ๋‹ค.
MDN์— ๋”ฐ๋ฅด๋ฉด:

๋ฌธ์„œ ์š”์†Œ ์‚ฝ์ž…
๋ฌธ์„œ์˜ ๋ฃจํŠธ ์š”์†Œ๊ฐ€ ์ƒ์„ฑ๋œ ์งํ›„, ๊ทธ๋Ÿฌ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

document-start ( document-element-inserted ๊ธฐ์ค€)์€ <html></html> ๊ฐ€ ์ƒ์„ฑ๋œ ์งํ›„์— ๋ฐœ์ƒํ•˜๋ฉฐ, ์ด๋•Œ <head> ๋Š” null์ž…๋‹ˆ๋‹ค.

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

์˜๋„์ ์ธ ๊ฒƒ์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ

GM_addStyle์€ ์–ด์จŒ๋“  ์–ด๋ฆฌ์„์Šต๋‹ˆ๋‹ค. <style> ํƒœ๊ทธ๋ฅผ <head> ์— ์‚ฝ์ž…ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋Œ์—ฐ๋ณ€์ด ๊ด€์ฐฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์‹ค์ œ ๋ฌธ์ œ๋ผ๋ฉด <head> ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํŒจ์น˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์˜ต์ €๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

@the8472 ํ˜„์žฌ document-start ์˜ ๋™์ž‘์ด ์˜ฌ๋ฐ”๋ฅด๊ณ  ์˜๋„์ ์ด๋ผ๋ฉด ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ๊ด€์ฐฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ™์€ ๊ฒƒ

function addGlobalStyle(css){
  let headHunter = new MutationObserver(
    records => {
    ; check mutation records
    ; is added node's tag name 'head'?
    ; create a style node then throw it in
    ; then disconnect us
   }
  );
  headhunter.observer(document, {childlist : true});
}

document-end ์•ž์— ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ง€๋ฃจํ•˜๋‹ค.

GM_addstyle ๊ฐ€ ์ €๋ฅผ ์œ„ํ•ด ๊ทธ๋ ‡๊ฒŒ ํ•ด์ฃผ๊ฑฐ๋‚˜ ์œ„ํ‚ค์— ์œ ์šฉํ•œ ๊ฒฝ๊ณ ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ", ๋“ฑ)

์˜ˆ, gm_addstyle์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์ž‘์—…๋„ ๋ฌธ์„œ ์‹œ์ž‘ ์‹œ ๋™์ผํ•œ ํ›„ํ”„๋ฅผ ๊ฑด๋„ˆ๋›ฐ์–ด์•ผ ํ•˜๋ฉฐ ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ํŠน๋ณ„ํ•˜์ง€ ์•Š์€ ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” DOM์ด ์—†์œผ๋ฏ€๋กœ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ด๋“  ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฌธ์„œ ์‹œ์ž‘ ์‹œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์–ด์จŒ๋“  ๊ด€์ฐฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋ณด๊ณ ์„œ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ WAI์ด๊ณ  3.x ๋ถ„๊ธฐ๋Š” ์–ด์จŒ๋“  ~์ฃฝ์—ˆ์Šต๋‹ˆ๋‹ค. (๋‚˜๋Š” ์šฐ์„  ์šฐ๋ฆฌ์˜ ์ƒˆ๋กœ์šด ์›น ํ™•์žฅ ๋Œ€๊ตฐ์ฃผ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.) GM_addStyle ์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์€ 4.x์—์„œ ์ ˆ๋Œ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ์ˆ˜์ •๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://arantius.com/misc/greasemonkey/amazon-url-cleaner.user.js ์™€ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ๋Š” DOM์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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