설명
chrome.scripting
API를 사용하여 다양한 컨텍스트에서 스크립트를 실행합니다.
권한
scripting
가용성
매니페스트
chrome.scripting
API를 사용하려면 매니페스트에 "scripting"
권한을 선언하고 스크립트를 삽입할 페이지의 호스트 권한을 선언합니다. 임시 호스트 권한을 부여하는 "host_permissions"
키 또는 "activeTab"
권한을 사용합니다. 다음 예에서는 activeTab 권한을 사용합니다.
{
"name": "Scripting Extension",
"manifest_version": 3,
"permissions": ["scripting", "activeTab"],
...
}
개념 및 사용
chrome.scripting
API를 사용하여 웹사이트에 JavaScript와 CSS를 삽입할 수 있습니다. 이는 콘텐츠 스크립트로 할 수 있는 작업과 유사합니다. 하지만 chrome.scripting
네임스페이스를 사용하면 확장 프로그램이 런타임에 결정을 내릴 수 있습니다.
삽입 대상
target
매개변수를 사용하여 JavaScript 또는 CSS를 삽입할 타겟을 지정할 수 있습니다.
유일한 필수 필드는 tabId
입니다. 기본적으로 삽입은 지정된 탭의 기본 프레임에서 실행됩니다.
function getTabId() { ... }
chrome.scripting
.executeScript({
target : {tabId : getTabId()},
files : [ "script.js" ],
})
.then(() => console.log("script injected"));
지정된 탭의 모든 프레임에서 실행하려면 allFrames
불리언을 true
로 설정하면 됩니다.
function getTabId() { ... }
chrome.scripting
.executeScript({
target : {tabId : getTabId(), allFrames : true},
files : [ "script.js" ],
})
.then(() => console.log("script injected in all frames"));
개별 프레임 ID를 지정하여 탭의 특정 프레임에 삽입할 수도 있습니다. 프레임 ID에 대한 자세한 내용은 chrome.webNavigation
API를 참고하세요.
function getTabId() { ... }
chrome.scripting
.executeScript({
target : {tabId : getTabId(), frameIds : [ frameId1, frameId2 ]},
files : [ "script.js" ],
})
.then(() => console.log("script injected on target frames"));
삽입된 코드
확장 프로그램은 외부 파일이나 런타임 변수를 통해 삽입할 코드를 지정할 수 있습니다.
파일
파일은 확장 프로그램의 루트 디렉터리를 기준으로 하는 경로인 문자열로 지정됩니다. 다음 코드는 script.js
파일을 탭의 기본 프레임에 삽입합니다.
function getTabId() { ... }
chrome.scripting
.executeScript({
target : {tabId : getTabId()},
files : [ "script.js" ],
})
.then(() => console.log("injected script file"));
런타임 함수
scripting.executeScript()
를 사용하여 JavaScript를 삽입할 때 파일 대신 실행할 함수를 지정할 수 있습니다. 이 함수는 현재 확장 프로그램 컨텍스트에서 사용할 수 있는 함수 변수여야 합니다.
function getTabId() { ... }
function getTitle() { return document.title; }
chrome.scripting
.executeScript({
target : {tabId : getTabId()},
func : getTitle,
})
.then(() => console.log("injected a function"));
function getTabId() { ... }
function getUserColor() { ... }
function changeBackgroundColor() {
document.body.style.backgroundColor = getUserColor();
}
chrome.scripting
.executeScript({
target : {tabId : getTabId()},
func : changeBackgroundColor,
})
.then(() => console.log("injected a function"));
args
속성을 사용하여 이 문제를 해결할 수 있습니다.
function getTabId() { ... }
function getUserColor() { ... }
function changeBackgroundColor(backgroundColor) {
document.body.style.backgroundColor = backgroundColor;
}
chrome.scripting
.executeScript({
target : {tabId : getTabId()},
func : changeBackgroundColor,
args : [ getUserColor() ],
})
.then(() => console.log("injected a function"));
런타임 문자열
페이지 내에서 CSS를 삽입하는 경우 css
속성에서 사용할 문자열을 지정할 수도 있습니다. 이 옵션은 scripting.insertCSS()
에만 사용할 수 있으며 scripting.executeScript()
을 사용하여 문자열을 실행할 수는 없습니다.
function getTabId() { ... }
const css = "body { background-color: red; }";
chrome.scripting
.insertCSS({
target : {tabId : getTabId()},
css : css,
})
.then(() => console.log("CSS injected"));
결과 처리
JavaScript 실행 결과가 확장 프로그램에 전달됩니다. 프레임당 하나의 결과가 포함됩니다. 기본 프레임은 결과 배열의 첫 번째 색인으로 보장됩니다. 다른 모든 프레임은 비결정적 순서로 표시됩니다.
function getTabId() { ... }
function getTitle() { return document.title; }
chrome.scripting
.executeScript({
target : {tabId : getTabId(), allFrames : true},
func : getTitle,
})
.then(injectionResults => {
for (const {frameId, result} of injectionResults) {
console.log(`Frame ${frameId} result:`, result);
}
});
scripting.insertCSS()
는 결과를 반환하지 않습니다.
프로미스
스크립트 실행의 결과 값이 프로미스인 경우 Chrome은 프로미스가 해결될 때까지 기다린 후 결과 값을 반환합니다.
function getTabId() { ... }
async function addIframe() {
const iframe = document.createElement("iframe");
const loadComplete =
new Promise(resolve => iframe.addEventListener("load", resolve));
iframe.src = "https://example.com";
document.body.appendChild(iframe);
await loadComplete;
return iframe.contentWindow.document.title;
}
chrome.scripting
.executeScript({
target : {tabId : getTabId(), allFrames : true},
func : addIframe,
})
.then(injectionResults => {
for (const frameResult of injectionResults) {
const {frameId, result} = frameResult;
console.log(`Frame ${frameId} result:`, result);
}
});
예
모든 동적 콘텐츠 스크립트 등록 취소
다음 스니펫에는 확장 프로그램이 이전에 등록한 모든 동적 콘텐츠 스크립트를 등록 해제하는 함수가 포함되어 있습니다.
async function unregisterAllDynamicContentScripts() {
try {
const scripts = await chrome.scripting.getRegisteredContentScripts();
const scriptIds = scripts.map(script => script.id);
return chrome.scripting.unregisterContentScripts({ ids: scriptIds });
} catch (error) {
const message = [
"An unexpected error occurred while",
"unregistering dynamic content scripts.",
].join(" ");
throw new Error(message, {cause : error});
}
}
chrome.scripting
API를 사용해 보려면 Chrome 확장 프로그램 샘플 저장소에서 스크립팅 샘플을 설치하세요.
유형
ContentScriptFilter
속성
-
ids
string[] 선택사항
지정된 경우
getRegisteredContentScripts
는 이 목록에 지정된 ID가 있는 스크립트만 반환합니다.
CSSInjection
속성
-
css
문자열 선택사항
삽입할 CSS가 포함된 문자열입니다.
files
및css
중 하나를 정확히 지정해야 합니다. -
파일
string[] 선택사항
확장 프로그램의 루트 디렉터리를 기준으로 삽입할 CSS 파일의 경로입니다.
files
및css
중 하나를 정확히 지정해야 합니다. -
origin
StyleOrigin 선택사항
삽입의 스타일 출처입니다. 기본값은
'AUTHOR'
입니다. -
target
CSS를 삽입할 타겟을 지정하는 세부정보입니다.
ExecutionWorld
스크립트가 실행될 JavaScript 세계입니다.
열거형
'ISOLATED'
이 확장 프로그램에 고유한 실행 환경인 격리된 세계를 지정합니다.
'MAIN'
호스트 페이지의 JavaScript와 공유되는 실행 환경인 DOM의 기본 세계를 지정합니다.
InjectionResult
속성
-
documentId
문자열
Chrome 106 이상삽입과 연결된 문서입니다.
-
frameId
숫자
Chrome 90 이상삽입과 연결된 프레임입니다.
-
결과
선택사항
스크립트 실행 결과입니다.
InjectionTarget
속성
RegisteredContentScript
속성
-
allFrames
불리언 선택사항
true로 지정하면 프레임이 탭의 최상위 프레임이 아니더라도 모든 프레임에 삽입됩니다. 각 프레임은 URL 요구사항에 따라 독립적으로 확인되며, URL 요구사항을 충족하지 않으면 하위 프레임에 삽입되지 않습니다. 기본값은 false이며, 최상위 프레임만 일치합니다.
-
css
string[] 선택사항
일치하는 페이지에 삽입할 CSS 파일 목록입니다. 이러한 스타일은 페이지의 DOM이 생성되거나 표시되기 전에 이 배열에 표시되는 순서대로 삽입됩니다.
-
excludeMatches
string[] 선택사항
이 콘텐츠 스크립트가 삽입될 수 있는 페이지를 제외합니다. 이러한 문자열의 구문에 대한 자세한 내용은 일치 패턴을 참고하세요.
-
id
문자열
API 호출에 지정된 콘텐츠 스크립트의 ID입니다. 생성된 스크립트 ID의 접두사로 예약되어 있으므로 '_'로 시작해서는 안 됩니다.
-
js
string[] 선택사항
일치하는 페이지에 삽입할 JavaScript 파일 목록입니다. 이러한 값은 이 배열에 표시되는 순서대로 삽입됩니다.
-
matchOriginAsFallback
불리언 선택사항
Chrome 119 이상스크립트를 URL에 지원되지 않는 스키마(about:, data:, blob:, filesystem:)가 포함된 프레임에 삽입할 수 있는지 여부를 나타냅니다. 이 경우 스크립트를 삽입해야 하는지 확인하기 위해 URL의 출처가 확인됩니다. 출처가
null
인 경우 (data: URL의 경우) 사용된 출처는 현재 프레임을 만든 프레임이거나 이 프레임으로의 탐색을 시작한 프레임입니다. 이 프레임이 상위 프레임이 아닐 수도 있습니다. -
일치
string[] 선택사항
이 콘텐츠 스크립트가 삽입될 페이지를 지정합니다. 이러한 문자열의 구문에 대한 자세한 내용은 일치 패턴을 참고하세요.
registerContentScripts
에 지정해야 합니다. -
persistAcrossSessions
불리언 선택사항
이 콘텐츠 스크립트가 향후 세션에 유지되는지 여부를 지정합니다. 기본값은 true입니다.
-
runAt
RunAt 선택사항
JavaScript 파일이 웹페이지에 삽입되는 시기를 지정합니다. 기본값은
document_idle
입니다. -
세계
ExecutionWorld 선택사항
Chrome 102 이상스크립트를 실행할 JavaScript '세계'입니다. 기본값은
ISOLATED
입니다.
ScriptInjection
속성
-
args
any[] 선택사항
Chrome 92 이상제공된 함수에 전달할 인수입니다.
func
매개변수가 지정된 경우에만 유효합니다. 이러한 인수는 JSON으로 직렬화할 수 있어야 합니다. -
파일
string[] 선택사항
확장 프로그램의 루트 디렉터리를 기준으로 삽입할 JS 또는 CSS 파일의 경로입니다.
files
또는func
중 정확히 하나를 지정해야 합니다. -
injectImmediately
불리언 선택사항
Chrome 102 이상타겟에서 삽입을 최대한 빨리 트리거해야 하는지 여부입니다. 스크립트가 타겟에 도달할 때 페이지가 이미 로드되었을 수 있으므로 페이지 로드 전에 삽입이 발생한다는 보장은 없습니다.
-
target
스크립트를 삽입할 타겟을 지정하는 세부정보입니다.
-
세계
ExecutionWorld 선택사항
Chrome 95 이상스크립트를 실행할 JavaScript '세계'입니다. 기본값은
ISOLATED
입니다. -
func
void optional
Chrome 92 이상삽입할 JavaScript 함수입니다. 이 함수는 직렬화된 후 삽입을 위해 역직렬화됩니다. 즉, 바인딩된 매개변수와 실행 컨텍스트가 손실됩니다.
files
또는func
중 정확히 하나를 지정해야 합니다.func
함수는 다음과 같습니다.() => {...}
StyleOrigin
스타일 변경의 출처입니다. 자세한 내용은 스타일 출처를 참고하세요.
열거형
"AUTHOR"
"USER"
메서드
executeScript()
chrome.scripting.executeScript(
injection: ScriptInjection,
): Promise<InjectionResult[]>
타겟 컨텍스트에 스크립트를 삽입합니다. 기본적으로 스크립트는 document_idle
에서 실행되거나 페이지가 이미 로드된 경우 즉시 실행됩니다. injectImmediately
속성이 설정된 경우 페이지 로드가 완료되지 않았더라도 스크립트가 기다리지 않고 삽입됩니다. 스크립트가 프로미스로 평가되면 브라우저는 프로미스가 처리될 때까지 기다린 후 결과 값을 반환합니다.
매개변수
-
삽입할 스크립트의 세부정보입니다.
반환 값
-
Promise<InjectionResult[]>
Chrome 90 이상
getRegisteredContentScripts()
chrome.scripting.getRegisteredContentScripts(
filter?: ContentScriptFilter,
): Promise<RegisteredContentScript[]>
지정된 필터와 일치하는 이 확장 프로그램의 동적으로 등록된 모든 콘텐츠 스크립트를 반환합니다.
매개변수
-
filter
ContentScriptFilter 선택사항
확장 프로그램의 동적으로 등록된 스크립트를 필터링하는 객체입니다.
반환 값
-
Promise<RegisteredContentScript[]>
insertCSS()
chrome.scripting.insertCSS(
injection: CSSInjection,
): Promise<void>
타겟 컨텍스트에 CSS 스타일시트를 삽입합니다. 프레임이 여러 개 지정된 경우 삽입에 실패한 프레임은 무시됩니다.
매개변수
-
삽입
삽입할 스타일의 세부정보입니다.
반환 값
-
Promise<void>
Chrome 90 이상
registerContentScripts()
chrome.scripting.registerContentScripts(
scripts: RegisteredContentScript[],
): Promise<void>
이 확장 프로그램의 콘텐츠 스크립트를 하나 이상 등록합니다.
매개변수
-
스크립트
등록할 스크립트 목록을 포함합니다. 스크립트 파싱/파일 유효성 검사 중에 오류가 있거나 지정된 ID가 이미 있는 경우 스크립트가 등록되지 않습니다.
반환 값
-
Promise<void>
removeCSS()
chrome.scripting.removeCSS(
injection: CSSInjection,
): Promise<void>
이 확장 프로그램이 이전에 삽입한 CSS 스타일시트를 타겟 컨텍스트에서 삭제합니다.
매개변수
-
삽입
삭제할 스타일의 세부정보입니다.
css
,files
,origin
속성은insertCSS
을 통해 삽입된 스타일시트와 정확하게 일치해야 합니다. 존재하지 않는 스타일시트를 삭제하려고 하면 아무 작업도 실행되지 않습니다.
반환 값
-
Promise<void>
unregisterContentScripts()
chrome.scripting.unregisterContentScripts(
filter?: ContentScriptFilter,
): Promise<void>
이 확장 프로그램의 콘텐츠 스크립트를 등록 해제합니다.
매개변수
-
filter
ContentScriptFilter 선택사항
지정된 경우 필터와 일치하는 동적 콘텐츠 스크립트만 등록 해제합니다. 그렇지 않으면 확장 프로그램의 모든 동적 콘텐츠 스크립트가 등록 해제됩니다.
반환 값
-
Promise<void>
updateContentScripts()
chrome.scripting.updateContentScripts(
scripts: RegisteredContentScript[],
): Promise<void>
이 확장 프로그램의 하나 이상의 콘텐츠 스크립트를 업데이트합니다.
매개변수
-
스크립트
업데이트할 스크립트 목록이 포함되어 있습니다. 속성은 이 객체에 지정된 경우에만 기존 스크립트에 대해 업데이트됩니다. 스크립트 파싱/파일 유효성 검사 중에 오류가 발생하거나 지정된 ID가 완전히 등록된 스크립트에 해당하지 않으면 스크립트가 업데이트되지 않습니다.
반환 값
-
Promise<void>