Manifest V3의 화면 밖 문서

Ian Stanion
Ian Stanion

백그라운드 페이지에서 확장 프로그램 서비스 워커로 전환할 때 기능을 대체하려면 개발자는 Chrome 109부터 chrome.offscreen API 및 매니페스트 권한을 사용할 수 있습니다. 이 권한을 요청하면 사용자 환경을 방해하는 새 창이나 탭을 불편하게 열지 않고도 DOM API를 사용할 수 있는 오프스크린 문서를 만들 수 있습니다. 이제 Chrome 확장 프로그램에서 chrome.offscreen API를 사용할 수 있습니다.

Chromium에서 Manifest V3 확장 프로그램은 서비스 워커 기반이지만 서비스 워커는 전체 문서 기반 페이지 (백그라운드 및 이벤트 페이지 포함)와 동일한 API 및 메커니즘을 지원하지 않습니다. 또한 콘텐츠 스크립트를 사용하여 웹페이지의 DOM API에 액세스하면 확장 프로그램이 페이지마다 다른 콘텐츠 보안 정책의 영향을 받게 됩니다. 이 문제를 해결하기 위해 매니페스트 V3 확장 프로그램이 전용 API를 통해 런타임에 최소한의 범위가 지정되고 상대적으로 권한이 없는 오프스크린 문서를 열 수 있도록 허용하여 DOM 관련 기능과 API를 지원하는 오프스크린 문서를 도입합니다.

지형지물 정보

오프스크린 문서는 특히 서비스 워커에서 지원되지 않는 사용 사례 (예: 오디오 재생)를 처리하도록 설계되었으므로 이 페이지의 전체 기간과 부여되는 권한은 확장 프로그램 서비스 워커의 전체 기간 및 권한과 별개입니다. 페이지에는 작업 실행을 중지하면 해체되는 등 Manifest V2의 이벤트 페이지와 유사한 전체 기간 메커니즘이 있습니다. 또한 사용자 에이전트는 지정된 목적과 관련된 전체 기간에 추가 제한을 적용할 수 있습니다. 오프스크린 문서는 DOM API에서만 액세스할 수 있는 API의 공백을 메우도록 설계되었습니다. 따라서 확장 프로그램 API는 이 컨텍스트에서 직접 노출될 필요가 없습니다. 확장 프로그램에서 이를 '백그라운드 페이지 교체'로 사용할 가능성을 줄이기 위해 chrome.runtime 메시징 API만 오프스크린 문서에 노출됩니다. 개발자는 서비스 워커를 통해 오프스크린 문서를 클라이언트로 주장하여 웹 메시지를 사용할 수도 있습니다. 특히 사이트 스크래핑과 같은 일부 사용 사례에서는 교차 출처 프레임에 대한 액세스가 필요하므로 이러한 문서에서는 현재 확장 프로그램 페이지에 적용되는 것과 동일한 규칙에 따라 교차 출처 프레임을 삽입할 수 있습니다. 오프스크린 문서에서 확장 프로그램에서 지정한 콘텐츠 스크립트는 일반 웹페이지에서와 마찬가지로 필요한 콘텐츠를 스크랩하기 위해 이러한 프레임에서 실행할 수 있습니다.

이유 및 목적 요구

오프스크린 문서를 만들려면 명시된 이유와 추가 근거가 필요합니다. 이러한 이유는 API 참조 문서에 나와 있으며 문서의 전체 기간을 다양한 방식으로 처리합니다. 예를 들어 오디오 재생을 위해 연 문서에는 현재 클립보드 관리를 위해 연 문서와는 다른 규칙이 전체 기간에 적용됩니다. 문서에 영향을 미치는 매개변수가 아닌 개발자가 작성한 문자열인 정당화에서 오프스크린 문서의 목적에 관한 추가 세부정보를 추가할 수도 있습니다. 개발자가 의견과 사용 사례를 공유함에 따라 시간이 지남에 따라 API에 추가 이유가 더 포함될 수 있습니다.

향후 계획

구현의 용이성을 위해 이 API의 첫 번째 버전은 한 번에 확장 프로그램당, 프로필당 단일 페이지만 지원합니다. 향후 버전에서는 여러 페이지를 지원하도록 이 제한을 완화할 수 있습니다. 현재 확장 프로그램이 활성 시크릿 프로필과 함께 분할 모드로 실행 중인 경우 일반 프로필과 시크릿 프로필 모두 오프스크린 문서를 하나씩 보유할 수 있습니다. 나중에 확장 프로그램 작업자 DOM 기능도 제공할 예정입니다. 나중에 교체할 수 있도록 서비스 워커에서 offscreen API를 사용하는 함수를 주석 처리된 등가 함수와 페어링하여 확장 프로그램을 '미래에 대비'할 수 있습니다.

// Solution 1 - Service workers cannot directly interact with
// the system clipboard. To work around this, we'll create an offscreen
// document and pass the data we want to write to the clipboard.
async function addToClipboard(value) {
    await chrome.offscreen.createDocument({
      url: 'offscreen.html',
      reasons: [chrome.offscreen.Reason.CLIPBOARD],
      justification: 'Write text to the clipboard.',
    });
  }


// Solution 2 – Once extension service workers can use the Clipboard API,
// replace the offscreen document based implementation with something like this
async function addToClipboardV2(value) {
  navigator.clipboard.writeText(value);
}

또한 DOM 기능과 API가 서비스 워커에 추가되면 문서를 만드는 이유 목록이 서비스 워커의 현재 상태와 오프스크린 문서를 사용하는 이유에 따라 추가되거나 줄어듭니다.

결론

오프스크린 문서를 사용하면 현재 서비스 워커에서 실행할 수 없는 DOM 또는 창 상호작용 액세스가 필요한 확장 프로그램을 사용할 수 있습니다. 또한 새로운 사용 사례를 추가하고 향후 해결된 사용 사례를 삭제할 수 있는 유연한 접근 방식을 제공합니다. 확장 프로그램은 특정 사용 사례에 제안된 오프스크린 문서 API를 사용해야 하며 확장 프로그램의 기본 백그라운드 컨텍스트는 매니페스트에 지정된 서비스 워커로 유지되어야 합니다. 오프스크린 문서는 API 액세스가 제한되어 있으므로 기본 확장 프로그램 로직을 저장하는 위치가 되어서는 안 됩니다. 오프스크린 문서의 수명은 이를 만든 서비스 워커와 무관합니다. 확장 프로그램의 서비스 워커 전체 기간 고려사항 및 서비스 워커 전체 기간과 관련된 사용 사례는 별도의 블로그 게시물에서 다룹니다. 오프스크린 문서를 사용하는 이유는 서비스 워커 자체에 기능과 API가 추가됨에 따라 시간이 지남에 따라 달라집니다. 이 과정이 진행되는 동안 개발자의 의견을 기다립니다.

Unsplash카리 셰어님 제공 사진