3

간단한 Web Extension을 작성하려고합니다. 현재 다양한 튜토리얼을 따르고 아키텍처를 이해하려고합니다.웹 확장 프로그램에서 명시 적으로 콘텐츠 스크립트를로드해야합니까?

특정 탭과의 상호 작용은 웹 사이트의 소스 코드에 삽입되는 content_scripts로 수행됩니다. content_scripts가 자동으로로드하는 것처럼 그것은 나에게 보인다 https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Anatomy_of_a_WebExtension#Content_scripts

이 MDN에 tutorial가 만드는이 더욱 명확 :

이 스크립트에 주어진 패턴과 일치하는 페이지에로드됩니다 content_scripts manifest.json 키. 스크립트는 페이지 자체가로드하는 스크립트와 마찬가지로 문서에 직접 액세스 할 수 있습니다 ( ).

내 확장 기능은 모든 텍스트 선택에 상황에 맞는 메뉴를 제공합니다. 출발점으로 크롬에 유용한 샘플 확장을 발견했습니다. 여기에서 찾을 수 있습니다 https://developers.chrome.com/extensions/samples, 그것은 "말하기 선택"이라고합니다

이 확장 기능은 tts 엔진을 사용하여 선택한 텍스트를 읽는 중입니다. 하지만 소스 코드의 한 부분은 혼란 스럽습니다. content_script를 탭에서 실행하는 명시적인 기능이 있습니다. 내가 볼 수있는, 지금까지

function loadContentScriptInAllTabs() { 
    chrome.windows.getAll({'populate': true}, function(windows) { 
    for (var i = 0; i < windows.length; i++) { 
     var tabs = windows[i].tabs; 
     for (var j = 0; j < tabs.length; j++) { 
     chrome.tabs.executeScript(
      tabs[j].id, 
      {file: 'keycodes.js', allFrames: true}); 
     chrome.tabs.executeScript(
      tabs[j].id, 
      {file: 'content_script.js', allFrames: true}); 
     } 
    } 
    }); 
} 

을 브라우저가 시작되면 코드가 즉시 실행 :이 코드는 자신의 배경 스크립트 중 하나에 초기화() 함수의 일부로 실행됩니다. 그렇게 중복되지 않습니까?

여기의 content_script 실행주의를 기울여야한다 이들의 manifest.json은 관련 코드입니다 :

"content_scripts": [ 
    { 
     "matches": [ 
     "<all_urls>" 
     ], 
     "all_frames": true, 
     "js": [ 
     "keycodes.js", 
     "content_script.js" 
     ] 
    } 
    ], 

열려있는 모든 탭에 스크립트를 삽입하는 적절한 방법은 무엇입니까?

답변

3

짧은 대답 : 크롬에는 필요하지만 Firefox에는 필요하지 않습니다. (확장 업데이트뿐 아니라 초기로드 포함) 확장 부하에서 일치하는 페이지에


크롬 does not load 콘텐츠 스크립트.

따라서 향후 탐색과 달리 확장로드시 탭의 컨텐츠 스크립트 기능을 열려면이 코드 (또는 이와 유사한 코드)가 필요합니다.

chrome.tabs.query으로이 코드를 조금 현대화 할 수 있습니다.


파이어 폭스는이 점에서 크롬과 호환되지 않는 : 그것은 가 자동으로로드시에 일치하는 모든 콘텐츠 스크립트를 삽입 않습니다. 따라서 일부 브라우저 감지 및/또는 한 번만 주입 코드를 사용해야합니다.

큰 변화로 도입하지 않기를 바랍니다. 쉽게 전환 할 수있는 동작을 선택하는 데 필요한 매니페스트 키를 제공하는 것이 좋습니다.


참고 : 확장 재로드 시나리오에서는 이전 인스턴스의 콘텐츠 스크립트는 계속 존재하지만 확장 API는 실패합니다. 그것을 우아하게 다루는 것은 당신의 책임입니다.

+1

빠른 답변 감사드립니다. 이전 답변에 포함시킨 링크가 매우 유용합니다. – lhk

관련 문제