설명
chrome.debugger API는 Chrome의 원격 디버깅 프로토콜의 대체 전송 역할을 합니다. chrome.debugger를 사용하여 하나 이상의 탭에 연결하여 네트워크 상호작용을 계측하고, JavaScript를 디버그하고, DOM 및 CSS를 변경하는 등의 작업을 할 수 있습니다. Debuggee 속성 tabId을 사용하여 sendCommand로 탭을 타겟팅하고 onEvent 콜백에서 tabId로 이벤트를 라우팅합니다.
권한
debugger이 API를 사용하려면 확장 프로그램의 매니페스트에서 "debugger" 권한을 선언해야 합니다.
{
"name": "My extension",
...
"permissions": [
"debugger",
],
...
}
엔터프라이즈 정책 제한사항
엔터프라이즈 기기에서 일부 정책은 연결 시 전부 또는 전무 모델을 사용하여 디버거를 연결하는 확장 프로그램을 제한할 수 있습니다
(chrome.debugger.attach()):
- 호스트 제한사항: 엔터프라이즈 정책
ExtensionSettings가 확장 프로그램의 차단된 호스트 (runtime_blocked_hosts)를 구성하는 경우chrome.debugger.attach()는 오류"Host access is restricted by policy."와 함께 모든 타겟에서 차단됩니다 (runtime_allowed_hosts에 개별 출처가 있는 경우에도). - 스크린샷 및 DLP 정책: 엔터프라이즈 정책
DisableScreenshots가 스크린샷 캡처를 사용 중지하거나 데이터 손실 방지 (DLP) 규칙이 타겟에 적용되는 경우chrome.debugger.attach()가 오류"Screenshot capture is restricted by policy."와 함께 실패합니다.
개념 및 사용법
연결되면 chrome.debugger API를 사용하여 Chrome DevTools 프로토콜
(CDP) 명령어를 지정된 타겟으로 보낼 수 있습니다. CDP를 자세히 설명하는 것은 이 문서의 범위를 벗어납니다
. CDP에 대해 자세히 알아보려면
공식 CDP 문서를 확인하세요.
타겟
타겟은 디버그되는 항목을 나타냅니다. 여기에는 탭, iframe 또는 작업자가 포함될 수 있습니다. 각 타겟은 UUID로 식별되며 연결된 유형 (iframe, shared_worker 등)이 있습니다.
타겟 내에는 여러 실행 컨텍스트가 있을 수 있습니다. 예를 들어 동일한 프로세스 iframe은 고유한 타겟을 가져오지 않지만 단일 타겟에서 액세스할 수 있는 여러 컨텍스트로 표시됩니다.
제한된 도메인
보안상의 이유로 chrome.debugger API는 모든 Chrome DevTools 프로토콜 도메인에 대한 액세스 권한을 제공하지 않습니다. 사용 가능한 도메인은 접근성,
감사, CacheStorage, 콘솔,
CSS, 데이터베이스, 디버거, DOM,
DOMDebugger, DOMSnapshot,
에뮬레이션, 가져오기, IO, 입력,
검사기, 로그, 네트워크, 오버레이,
페이지, 성능, 프로파일러,
런타임, 스토리지, 타겟, 추적,
WebAudio, WebAuthn입니다.
프레임 작업
프레임과 타겟 간에는 일대일 매핑이 없습니다. 단일 탭 내에서 여러 동일한 프로세스 프레임이 동일한 타겟을 공유하지만 다른 실행 컨텍스트를 사용할 수 있습니다. 반면에 프로세스 외부 iframe에 새 타겟이 생성될 수 있습니다.
모든 프레임에 연결하려면 각 프레임 유형을 별도로 처리해야 합니다.
Runtime.executionContextCreated이벤트를 수신 대기하여 동일한 프로세스 프레임과 연결된 새 실행 컨텍스트를 식별합니다.단계에 따라 관련 타겟에 연결하여 프로세스 외부 프레임을 식별합니다.
관련 타겟에 연결
타겟에 연결한 후 프로세스 외부 하위 프레임 또는 연결된 작업자를 비롯한 추가 관련 타겟에 연결할 수 있습니다.
Chrome 125부터 chrome.debugger API는 플랫 세션을 지원합니다. 이렇게 하면 chrome.debugger.attach를 추가로 호출하지 않고도 기본 디버거 세션에 추가 타겟을 하위 요소로 추가하고 메시지를 보낼 수 있습니다. 대신 chrome.debugger.sendCommand를 호출할 때 sessionId 속성을 추가하여 명령어를 보낼 하위 타겟을 식별할 수 있습니다.
프로세스 외부 하위 프레임에 자동으로 연결하려면 먼저 Target.attachedToTarget 이벤트의 리스너를 추가합니다.
chrome.debugger.onEvent.addListener((source, method, params) => {
if (method === "Target.attachedToTarget") {
// `source` identifies the parent session, but we need to construct a new
// identifier for the child session
const session = { ...source, sessionId: params.sessionId };
// Call any needed CDP commands for the child session
await chrome.debugger.sendCommand(session, "Runtime.enable");
}
});
그런 다음 자동 연결을 Target.setAutoAttach 명령어를 전송하여
flatten 옵션을 true로 설정하여 사용 설정합니다.
await chrome.debugger.sendCommand({ tabId }, "Target.setAutoAttach", {
autoAttach: true,
waitForDebuggerOnStart: false,
flatten: true,
filter: [{ type: "iframe", exclude: false }]
});
자동 연결은 타겟이 인식하는 프레임에만 연결되며, 이는 연결된 프레임의 직계 하위 요소인 프레임으로 제한됩니다. 예를 들어 프레임 계층 구조 A -> B -> C (모두 교차 출처)에서 A와 연결된 타겟에 Target.setAutoAttach를 호출하면 세션이 B에도 연결됩니다. 그러나 이는 재귀적이지 않으므로 세션을 C에 연결하려면 B에 대해서도 Target.setAutoAttach를 호출해야 합니다.
예
이 API를 사용해 보려면 디버거 API 예시를 chrome-extension-samples 저장소에서 설치하세요.
유형
Debuggee
디버깅 대상 식별자입니다. tabId, extensionId 또는 targetId를 지정해야 합니다.
속성
-
extensionId
문자열 선택사항
디버그하려는 확장 프로그램의 ID입니다. 확장 프로그램 백그라운드 페이지에 연결하는 것은
--silent-debugger-extension-api명령줄 스위치가 사용되는 경우에만 가능합니다. -
tabId
숫자 선택사항
디버그하려는 탭의 ID입니다.
-
targetId
문자열 선택사항
디버그 타겟의 불투명 ID입니다.
DebuggerSession
디버거 세션 식별자입니다. tabId, extensionId 또는 targetId 중 하나를 지정해야 합니다. 선택사항으로 sessionId를 제공할 수도 있습니다. `onEvent`onEvent에서 전송된 인수에 sessionId가 지정된 경우 이벤트가 루트 디버깅 대상 세션 내의 하위 프로토콜 세션에서 발생한다는 의미입니다. `sendCommand`에 전달될 때 sessionId가 지정되면 sendCommand루트 디버깅 대상 세션 내의 하위 프로토콜 세션을 타겟팅합니다.
속성
-
extensionId
문자열 선택사항
디버그하려는 확장 프로그램의 ID입니다. 확장 프로그램 백그라운드 페이지에 연결하는 것은
--silent-debugger-extension-api명령줄 스위치가 사용되는 경우에만 가능합니다. -
sessionId
문자열 선택사항
Chrome DevTools 프로토콜 세션의 불투명 ID입니다. tabId, extensionId 또는 targetId로 식별되는 루트 세션 내의 하위 세션을 식별합니다.
-
tabId
숫자 선택사항
디버그하려는 탭의 ID입니다.
-
targetId
문자열 선택사항
디버그 타겟의 불투명 ID입니다.
DetachReason
연결 종료 이유입니다.
열거형
'target_closed'
'canceled_by_user'
TargetInfo
디버그 타겟 정보
속성
-
attached
부울
디버거가 이미 연결된 경우 true입니다.
-
extensionId
문자열 선택사항
확장 프로그램 ID입니다(type = 'background_page'인 경우 정의됨).
-
faviconUrl
문자열 선택사항
타겟 파비콘 URL입니다.
-
id
문자열
타겟 ID입니다.
-
tabId
숫자 선택사항
탭 ID입니다(type == 'page'인 경우 정의됨).
-
title
문자열
타겟 페이지 제목입니다.
-
type
타겟 유형입니다.
-
url
문자열
타겟 URL입니다.
TargetInfoType
타겟 유형입니다.
열거형
'page'
'background_page'
'worker'
'other'
메서드
attach()
chrome.debugger.attach(
target: Debuggee,
requiredVersion: string,
): Promise<void>
디버거를 지정된 타겟에 연결합니다.
매개변수
-
target
연결하려는 디버깅 타겟입니다.
-
requiredVersion
문자열
필수 디버깅 프로토콜 버전('0.1')입니다. 메이저 버전이 일치하고 마이너 버전이 크거나 같은 디버깅 대상에만 연결할 수 있습니다. 프로토콜 버전 목록은 여기에서 확인할 수 있습니다.
반환 값
-
Promise<void>
Chrome 96 이상연결 작업이 성공하거나 실패하면 확인됩니다. 프로미스는 값 없이 확인됩니다. 연결에 실패하면 프로미스가 거부됩니다.
매개변수
-
target
분리하려는 디버깅 타겟입니다.
반환 값
-
Promise<void>
Chrome 96 이상분리 작업이 성공하거나 실패하면 확인됩니다. 프로미스는 값 없이 확인됩니다. 분리에 실패하면 프로미스가 거부됩니다.
반환 값
-
Promise<TargetInfo[]>
Chrome 96 이상
sendCommand()
chrome.debugger.sendCommand(
target: DebuggerSession,
method: string,
commandParams?: object,
): Promise<object | undefined>
지정된 명령어를 디버깅 타겟으로 보냅니다.
매개변수
-
target
명령어를 보낼 디버깅 타겟입니다.
-
method
문자열
메서드 이름입니다. 원격 디버깅 프로토콜에 정의된 메서드 중 하나여야 합니다.
-
commandParams
객체 선택사항
요청 매개변수가 있는 JSON 객체입니다. 이 객체는 지정된 메서드의 원격 디버깅 매개변수 스키마를 준수해야 합니다.
반환 값
-
Promise<object | undefined>
Chrome 96 이상응답 본문입니다. 메시지를 게시하는 중에 오류가 발생하면 프로미스가 거부됩니다.
이벤트
onDetach
chrome.debugger.onDetach.addListener(
callback: function,
)
브라우저가 탭의 디버깅 세션을 종료할 때 발생합니다. 이는 탭이 닫히거나 연결된 탭에 Chrome DevTools가 호출될 때 발생합니다.
매개변수
-
callback
함수
callback매개변수는 다음과 같습니다.(source: Debuggee, reason: DetachReason) => void
-
source
-
reason
-
onEvent
chrome.debugger.onEvent.addListener(
callback: function,
)
디버깅 타겟에서 계측 이벤트를 발생시킬 때마다 발생합니다.
매개변수
-
callback
함수
callback매개변수는 다음과 같습니다.(source: DebuggerSession, method: string, params?: object) => void
-
source
-
method
문자열
-
params
객체 선택사항
-