ํ์ฌ Greasemonkey 4๋ ์ต์์ ๋ ๋ฒจ์์๋ง ํ์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๋ฏ๋ก ๋ชจ๋ ์คํฌ๋ฆฝํธ์ @noframes
๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ ์ฉํฉ๋๋ค.
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 ์ ์์ ์ฌํญ์ด ์์ง ๋ฉ์ธ ๋ธ๋์น์ ํตํฉ๋์์ต๋๊น? ๊ทธ๋ ์ง ์๋ค๋ฉด ์ด๋ป๊ฒ ๊ทธ์ ํฌํฌ๋ฅผ ์ค์นํ ์ ์์ต๋๊น?
git clone -b use-on-response-started-for-execute --single-branch https://github.com/Sxderp/greasemonkey.git
[1]./package.sh
์คํํ๋ฉด XPI ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.about:config
๋ก ์ด๋ํ์ฌ xpinstall.signatures.required
๋ฅผ false
about:addons
๋ก ์ด๋ํ์ฌ ํฑ๋๋ฐํด๋ฅผ ํด๋ฆญํ ๋ค์ ํ์ผ์์ ์ค์น๋ฅผ ์ ํํฉ๋๋ค.[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 ํฌํจ)๋ฅผ ํค๋์ ์ ์ธํด์ผ ํ์ต๋๋ค. (์ ์ด์ฟผ๋ฆฌ ํฌํจ)
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๊ฐ์ง ์์ต๋๋ค.... ๋ฒ๊ทธ๋ ์ถฉ๋์ ๋ง๋ญ๋๋ค.
๋น์ ๋ ์ด ๋ฌธ์ ๋ฅผ ์๊ณ ์์ต๋๊น?
ํ ์คํธ ์ค์ธ ํน์ URL์ด ๋ด ํต์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ๊ธฐ ๋๋ฌธ์ ์ ๊ณตํ๊ธฐ๊ฐ ๊บผ๋ ค์ง์ง๋ง ์ผ๊ด๋์ง๋ง ์ด์ํ ๋์์ ์ ๋ฌํ๊ณ ์์ต๋๋ค.
์ํธ ์์ฉํด์ผ ํ๋ ์ฌ์ดํธ๊ฐ ์์ต๋๋ค. ์ฒ์์๋ ๋ค๋ฅธ ๋๋ฉ์ธ์์ rows="100%,0"(ํ๋ฉด์ ์ฑ์ฐ๋ ํ๋์ ํ๋ ์)์ธ ํ๋ ์์ธํธ/ํ๋ ์์ ๋ก๋ํฉ๋๋ค. ์ด ํ๋ ์์ ์ค๊ฐ ํ๋ ์์ธํธ/ํ๋ ์์ ๋๋ฉ์ธ ๋ด์ ํ๋์ ํ๋ ์์ธํธ/3๊ฐ์ ํ๋ ์์ ํฌํจํฉ๋๋ค.
1+3 ์์ ํ๋ ์์ GM ์คํฌ๋ฆฝํธ ์ค ์ผ๋ถ๋ ์กด์ฌํ๊ฒ "๋ฒ์ฉ"ํ๋ค๊ฐ ์ด๊ธฐ ์ฃผ๊ธฐ ํ์ ์ฌ๋ผ์ง๋๋ค. ๋น๋๊ธฐ ์์ ํ์๋ ๋ค์ ๋์์ค์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ด ์ค๋ ๋์ ์ค๋ช ๋ ์ผ๋ถ ๋์์ ๋ง์ต๋๋ค. "๋ธ๋ฆฝ"๊ณผ ์๋์ ์ค๋ช ๋ ๋์์ ๋ธ๋ผ์ฐ์ /GM ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง ๋ฌด์์๊ฐ ์๋๋๋ค. ํจํด์ ์ด์ํ์ง๋ง ์ฃผ์ด์ง ์ค์ ์ ๋ํด 100% ๋ฐ๋ณต ๊ฐ๋ฅํฉ๋๋ค.
์ด ์์ ์์ "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 '์์';
๋ช ๋ฌ ์ ์ ์ด๊ฒ์ด ์ฒ์ ์ ์ถ๋์์ ๋ ์ฐ๋ฆฌ๋ ์ผ์ ๋ค๋ฅด๊ฒ ํ์ต๋๋ค. ์ค๋ ์ฐ๋ฆฌ๋ ํ์์ ๊ฐ์งํ๊ธฐ ์ํด 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)
๋ ์๋ค๋ฉด ์ ๋ง ์ข๊ฒ ์ง ๋ง ๊ทธ๊ฑด ์ ์ณ๋๊ณ ์.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ ํ์ญ๋๊น,
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๊ฒ ์ต๋๊น? ๊ฝค ์ค๋๋ ๊ฒฐํจ์ด๋ฉฐ iframe ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ชจ๋ ์คํฌ๋ฆฝํธ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค...