Greasemonkey: ๋ฌธ์„œ ์‹œ์ž‘ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์‹œ๊ฐ„ ์ง€์›

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

์ง€์› document-start ์— ๋Œ€ํ•ด @run-at .

์ž์„ธํ•œ ๋‚ด์šฉ์€ #2483์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ "๋ถˆ๊ฐ€๋Šฅ"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

content_scripts ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํ‚ค์˜ run_at ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4๋…„ ์ „์— Chrome์— ๋Œ€ํ•œ ์•ˆํƒ€๊นŒ์›€์„ ๊ณต์œ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‹ค์‹œ Firefox๋ฅผ ์œ„ํ•ด. ๐Ÿ˜ญ

๋‚ด ์ œ์•ˆ์„ https://bugs.chromium.org/p/chromium/issues/detail?id=257956 ์—์„œ ๋ฐ”๊พธ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

tabs.insertCSS/executeScript๋Š” ํƒญ์˜ URL์ด ๋น„์–ด ์žˆ์ง€ ์•Š๊ฒŒ ์„ค์ •๋  ๋•Œ๊นŒ์ง€ CSS/JS๋ฅผ ์‚ฝ์ž…ํ•ด์•ผ ํ•˜๋ฉฐ(not null, not undefined, not empty string ""), ํƒญ์ด ์ œ๊ฑฐ/๋ณ€๊ฒฝ๋˜๋ฉด ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค.

WebExtension API๋Š” ๊ฐœ์„ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@iology ์™œ ๋‚ด ์ œ์•ˆ์„

๋‹ค์Œ์€ ๋‚ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•ด์•ผ ํ•จ)

/**
 * <strong i="8">@typedef</strong> UserScript
 * <strong i="9">@property</strong> {Object} header The parsed header of a script
 * <strong i="10">@property</strong> {String} script The raw script data
 * <strong i="11">@property</strong> {String} type The script media type (in case a script is WebAssembly
 *                         or something other than JavaScript)
 */

/** The load state of this script. Used by the `matches()` function */
const READY_STATE = document.readyState;

(async () => {
    (await (browser.storage.local.get({scripts: []}) // Excuse this horrible code style
        .then(ret => ret.scripts)))                  // of combining `await` and `.then()`
        .forEach(/* <strong i="12">@param</strong> {UserScript} script */ script => {
            if (matches(script.header)) {
                let scriptTag = document.createElement("script");
                scriptTag.setAttribute("type", script.type)
                scriptTag.textContent = script.script;
                document.appendChild(scriptTag);
            }
        });
})();

/**
 * Checks if this script matches this page and @run-at property.
 * 
 * <strong i="13">@param</strong> {Object} scriptHeader The parsed header of a script
 * <strong i="14">@return</strong> {boolean} `true` if this page matches, `false` otherwise
 */
function matches(scriptHeader) {
    // Uses window.location and READY_STATE.
    // TODO: Implement
}

@ExE-Boss ํ™•์žฅ ์ €์žฅ์†Œ์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ์ฏค์—๋Š” ํŽ˜์ด์ง€์˜ ์ผ๋ถ€๊ฐ€ ์ด๋ฏธ ๋กœ๋“œ๋˜์–ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ WebExtensions๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ ๋น„๋™๊ธฐ์‹์ด๋ผ๋Š” ์‚ฌ์‹ค ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‹ค์ œ๋กœ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

@ExE-Boss, ๋ฒ„๊ทธ์งˆ๋ผ( https://bugzilla.mozilla.org/show_bug.cgi?id=1332273 )๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ @document-start ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. FF57์— ์ฐฉ๋ฅ™ํ• ์ง€ ์—ฌ๋ถ€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ WebExtensions๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ ๋น„๋™๊ธฐ์‹์ด๋ผ๋Š” ์‚ฌ์‹ค ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‹ค์ œ๋กœ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

@ExE-Boss ๋ง ๊ทธ๋Œ€๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋‚˜๋„ ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋‚ด ์†”๋ฃจ์…˜์€ ์‹ค์ œ๋กœ #2525์— ๋Œ€ํ•ด์„œ๋งŒ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ๊นŒ์ง€ ์ „์ฒด ํŽ˜์ด์ง€๊ฐ€ ์™„์ „ํžˆ ๋กœ๋“œ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Violentmonkey๋„ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Tampermonkey๊ฐ€ ์–ด๋–ค ํ‘๋งˆ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ document-start ์‹ค์ œ

Tampermonkey 2.9 ๋ฐ ์ด์ „ ๋ฒ„์ „์€ GPL-3.0์ด๋ฉฐ GitHub์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค . ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์กฐ์‚ฌํ•ด ๋ณด์•˜๊ณ  ์ฒ˜์Œ์—๋Š” sync XHR ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์กฐ๊ธˆ ๋ฒ„์ „ 2.6์— ์ง€์›์ด ๋ฉ๋‹ˆ๋‹ค. .2767 .

Tampermonekey๊ฐ€ ์†Œ์Šค๋ฅผ ๋น„๊ณต๊ฐœ๋กœ ์ „ํ™˜ํ•œ ์ด์œ ๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‚˜๋Š” ๋ฌผ๊ฑด์„ ๋„์šฉํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์—†์Šต๋‹ˆ๋‹ค. Tampermonkey์˜ ๋…ผ๋ฆฌ๋ฅผ ๋’ค์ง‘๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๋ฒ•์ž…๋‹ˆ๋‹ค.

@Sxderp Firefox 57์—๋งŒ ํ•ด๋‹น๋˜๋ฉฐ ํ•ด๋‹น ๋ฒ„๊ทธ๋Š” 58+์—์„œ ์—ฌ์ „ํžˆ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ Tampermonkey๋Š” ๋ฌธ์„œ ์‹œ์ž‘ ์‹œ์—๋„ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์†๋„๋ฅผ ๋†’์ด๋Š” "์ฆ‰๊ฐ์ ์ธ" ์ฃผ์ž… ์˜ต์…˜(๋งค์šฐ ํ•ดํ‚ค๋จ)์ด ์žˆ์ง€๋งŒ xkcd.com๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ํŽ˜์ด์ง€์—์„œ๋Š” CSS(๋ฌธ์„œ ์‹œ์ž‘ ์‹œ ํ•ญ์ƒ ์ฃผ์ž…๋จ)๊ฐ€ ๋กœ๋“œ๋˜๊ธฐ ์ „์— ์—ฌ์ „ํžˆ ํ”Œ๋ž˜์‹œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ๋•Œ๋•Œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์—์„œ ํ”Œ๋ž˜์‹œ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

Tampermonkey์˜ ์ฝ”๋“œ๋ฅผ ๋’ค์ง‘๋Š” ๊ฒƒ์€ ์ด๊ฒƒ์„ ์•Œ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ทธ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์‹ค์ œ ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์•ˆํ•œ ํฌ๋Ÿผ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ ๋ณต์‚ฌ๋Š” copy-vio๊ฐ€ ์•„๋‹ˆ๋ผ ์ฝ”๋“œ ์ž์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ๋ถˆ์™„์ „ํ•œ ํ•ด๊ฒฐ์ฑ…์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ์™„๋ฒฝํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ ์–ด๋„ ๊ตฌ์„ฑ ์˜ต์…˜์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ๋™๊ธฐ์ ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜ ์˜ˆ๋Š” https://github.com/ccd0/4chan-x/issues/1627์„ ์ฐธ์กฐ localStorage ๋ฅผ ์ง€์›๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ ์–ด๋„ ๊ตฌ์„ฑ ์˜ต์…˜์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ๋™๊ธฐ์ ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹จ๊ธฐ๊ฐ„์— ์•„๋‹™๋‹ˆ๋‹ค. ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ (get|set)Value ์ €์žฅ์†Œ์™€ ํ†ต์‹ ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ตฌ์„ฑ ๊ฐ’์ด ์žˆ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์Šคํฌ๋ฆฝํŠธ์˜ ์ „์—ญ ๋ฒ”์œ„์— ์ฃผ์ž…๋˜๋Š” GM ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ผ์ข…์˜ ์ฃผ์ž…์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์ด๊ณ , ๋ณ„๋กœ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๊ตฌ์„ฑ ๊ฐ’์ด ์žˆ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์Šคํฌ๋ฆฝํŠธ์˜ ์ „์—ญ ๋ฒ”์œ„์— ์ฃผ์ž…๋˜๋Š” GM ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ผ์ข…์˜ ์ฃผ์ž…์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์ด๊ณ , ๋ณ„๋กœ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ GM ๊ฐœ์ฒด์˜ ์ผ๋ถ€์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. GM.initValues.yourVariable ์™€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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