2016-12-20 5 views
0

JS 라이브러리에 대한 호출이 자바 스크립트 코드를 통과하도록 함수 재 작성을 사용하는 일부 자바 스크립트 코드를 분석하려고합니다. 내 자바 스크립트 코드는 Chrome 확장 프로그램의 일부이며 Chrome 확장 프로그램을 통해 콘텐츠 스크립트를 통해 대상 페이지의 DOM에 삽입/삽입합니다. 이것은 페이지가로드되고 라이브러리 호출이 내 기능을 수행 한 후에 유발되는 함수에서 잘 작동합니다. 하지만 페이지가 실제로로드되는 동안 (아마도 DOM이 렌더링되는 동안) JavaScript 코드가 실행됩니다. 이것은 내 사용자 정의 스크립트가 삽입되기 전에 발생합니다. 이렇게하면 사용자 정의 스크립트가 삽입되기 전에 함수 호출이 손실되거나 JS 호출이 제 기능을 수행하지 않습니다. 콘텐츠 스크립트를 사용하여 아래 링크에서 언급 한 것처럼 DOM에 추가하여 실제로 다른 JavaScript를 삽입합니다.콘텐츠 스크립트가 설치되기 전에 javascript가 실행되지 않습니다.

Insert code into the page context using a content script

나는 내가 DOM의 시작/끝으로 컨텐츠 스크립트의 로딩 시간을 처리 할 수 ​​있습니다 알고 있지만 내가 대상 페이지의 DOM에 추가 다른 스크립트 파일이며, 난 몰라 그것을 제어하는 ​​방법을 이해하는 것 같습니다. 누구든지 도움을 주시면 감사하겠습니다. 고맙습니다.

편집 : Is it possible to run a script in context of a webpage, before any of the webpage's scripts run, using a chrome extension? 에 설명 된 문제는 정확하게 동일하지만 해결 방법이 작동하지 않는 것 같습니다. 제 의도는 js 코드가 웹 페이지에서 실행되기 전에 삽입 된 스크립트를 실행하는 것입니다. manifest.json에서 document_start를 지정하면 콘텐츠 스크립트 실행이 웹 페이지보다 먼저 실행될 수 있지만 콘텐츠 스크립트 (첫 번째 링크에서 설명한대로 스크립트 삽입)를 통해 삽입되는 스크립트는 실행되지 않습니다.

의 manifest.json 매니페스트 파일이 document_start에 추가 content.js 컨텐츠 스크립트가 있습니다 :이 주입 스크립트는 웹 페이지

편집 2와 관련하여 특정 방식으로 실행되고 있지 않습니다. 따라서 content.js는 대상 웹 페이지 (기본 페이지)가 실행되기 전에 실행됩니다.

"content_scripts":[ 
    { 
    "matches":["<all_urls>"],    
    "js":["content.js"], 
    "run_at":"document_start", 
    "all_frames":false 
    } 
], 

content.js

content.js 내가 대상 페이지의 환경에 자바 스크립트와 상호 작용하는 것이 사실 수 있어요 그래서 나는 DOM에 main.js에 추가되는 아래의 코드가 . 콘텐츠 스크립트를 통해 대상 페이지의 JavaScript와 상호 작용할 수 없기 때문에 다른 파일에서이 작업을 수행하고 DOM에 첨부합니다. 둘 다 서로를 방해하지 않기 때문입니다. main.js에는 대상 페이지에서 JS를 실행하는 동안 JS 호출을 가로 채는 JavaScript가 있습니다. JS는 대상 페이지에서 라이브러리에 대한 호출을 작성하며 해당 라이브러리 함수에 대한 래퍼를 작성하려고합니다.

var u = document.createElement('script'); 
u.src = chrome.extension.getURL('main.js'); 
(document.head||document.documentElement).appendChild(u); 
u.onload = function() { 
    u.parentNode.removeChild(u); 
}; 

은 내가 document_start에서 실행되는 콘텐츠 스크립트를 통해 주입하기 때문에 main.js는 대상 페이지의 도메인과 대상 페이지에있는 스크립트의에서 사용할 수 있습니다 기대합니다. 대상 페이지의 HTML에서 someJSCall()과 같은 일부 JS 함수를 호출한다고 가정합니다. 대상 페이지의 도메인에 의해 someJSCall()이 정의됩니다. 이 시나리오 main.js (코드 내 크롬 확장을 통해 주입)에서

이미 사용할 수 있습니다. 따라서 someJSCall 함수에서 JS 라이브러리를 호출하면 main.js 래퍼 함수가 호출됩니다. 이 작동합니다.

문제는 targetpage의 JS에 정의 된 IIFE (즉시 호출 된 함수 표현식)가있는 경우입니다. 이러한 IIFE 호출이 라이브러리 호출을 수행하면 내 main.js 차단을 통과하지 못합니다. Chrome Dev Tools를 통해 브라우저에로드 된 파일을 보면 IIFE 호출이 실행되는 동안 main.js가로드되지 않은 것으로 나타납니다.

나는이 문제를 자세히 설명하기를 희망한다. 아직 명확하지 않은 경우 알려 주시기 바랍니다.

감사합니다.

+0

주제가 될 질문을 작성하십시오. 문제가 중복 된 ** complete ** [mcve]를 포함하십시오. * manifest.json *, background/content/popup 스크립트/HTML 중 일부를 포함합니다. 디버깅 도움을 구하는 질문 ("**이 코드가 작동하지 않는 이유는 무엇입니까? **")에는 다음이 포함되어야합니다 : ► 원하는 동작, ► 특정 문제 또는 오류 * 및 질문을 재현하는 데 필요한 가장 짧은 코드 ** 그 자체**. 분명한 문제 성명이없는 질문은 다른 독자에게 유용하지 않습니다. 참조 : "** [mcve] **를 만드는 방법", [여기에 대해 나는 어떤 주제를 물을 수 있습니까?] (http://stackoverflow.com/help/on-topic), [ask]. – Makyen

+2

가능한 복제본 [크롬 확장을 사용하여 웹 페이지의 스크립트가 실행되기 전에 웹 페이지의 컨텍스트에서 스크립트를 실행할 수 있습니까?] (http://stackoverflow.com/questions/13540636/is-it-possible) 웹 페이지가 있기 전에 웹 페이지의 컨텍스트에서 스크립트 실행 – rsanchez

+0

왜 복제본이 아닌지에 대한 명확하지 않은 설명을 제공했습니다. 그러나 주제에 대해 디버깅 질문을하는 데 필요한 것을 제공하지 않았습니다. 목록에 대한 첫 번째 의견을 참조하십시오. 여기에없는 것의 대부분은 ** [mcve] **입니다. 문제가 중복되어 링크 된 사본의 솔루션으로 문제가 해결되지 않는 이유를 구체적으로 보여주는 [mcve]가 없으면 귀하를 도울 수 없습니다. 우리가 도와주고 싶지 않은 것은 아닙니다. 당신이 그렇게 할 수있는 충분한 정보를 제공하지 못했기 때문입니다. – Makyen

답변

0

"DOM의 시작/끝 부분에 콘텐츠 스크립트를로드 할 시간을 처리 할 수 ​​있습니다."라는 질문에 설명되어 있지만 귀하의 질문을 실행하여 문제를 해결할 수없는 이유를 명확하게 밝히지 않았습니다 콘텐츠 스크립트는 document_start입니다.

당신은 당신의 스크립트 전에 당신이 당신의 manifest.jsoncontent_scripts 항목에 run_at 속성 document_start을 지정하거나 chrome.tabs.executeScript()에 전달 된 runAt 옵션에 의해 건설되고로 주입되는 페이지에 주입 할 수 있습니다. 이렇게하면 document.headdocument.body이 모두 null 일 때 스크립트가 실행됩니다. 그런 다음 페이지에 추가 할 내용을 제어 할 수 있습니다.

정확하게 스크립트가 실행될 때 chrome.tabs.executeScript()을 실행할 때 페이지를로드하는 프로세스와 관련하여 chrome.tabs.executeScript()을 정확하게 입력하십시오. 처리의 비동기 특성으로 인해 (백그라운드 스크립트는 대개 다른 프로세스에서 실행 됨) document.headdocument.body이 모두 null 일 때 스크립트를 일관성있게 주입하는 것이 어렵습니다. 내가 성취 한 최선의 방법은 때때로 스크립트가 주입되도록하는 것입니다. 그리고 때로는 페이지가 채워지지만 다른 리소스를 가져 오기 전에 스크립트를 주입해야합니다. 이 타이밍은 대부분의 경우 작동하지만 페이지가 있기 전에 실제로 스크립트를 실행해야하는 경우 manifest.jsoncontent_scripts 항목을 사용해야합니다.

headbody이 존재하기 전에 콘텐츠 스크립트를 실행하면 가장 먼저 삽입되는 내용을 제어 할 수 있습니다. 따라서 페이지에 다른 항목보다 먼저 <script>을 삽입 할 수 있습니다. 이렇게하면 페이지 컨텍스트에서 다른 스크립트보다 먼저 스크립트를 실행해야합니다.

+0

입력 해 주셔서 감사합니다. 내가 실제로 직면하고있는 문제는 js 라이브러리에 대한 호출이 내 javascript (라이브러리 호출에 관한 주변 조언과 같은 함수 재 작성)을 통과하도록하려는 것입니다. 컨텐트 스크립트는 일반 JS 호출을 방해하지 않으므로 앞에서 설명한 링크에서 설명한 방법을 사용하여 웹 페이지 컨텍스트에 주입합니다. 그것은 DOM에 추가하는 것입니다. 문제는 –

+0

입니다. 문제는 HTML 페이지에서 js로드시 스스로를 호출하는 IIFE 호출이 발생할 때입니다. 라이브러리 호출이 제대로 작동하고 내 주변의 조언이 이미 삽입 된 경우. 그러나 IIFE를 사용할 때 JS가 주입되기 전에 실행됩니다. 제 질문이 이전보다 조금 더 명확 해 졌으면 좋겠어요. 다시 한번 감사드립니다. –