Firefox 확장 디버깅 - XPI에 포함 된 모든 JS 및 XUL 파일을 보는 방법은 무엇입니까?
-
21-12-2019 - |
문제
Firefox 28.0을 사용하여 Firefox 확장을 디버깅하려고합니다.
나는 https : // 개발자에게 제안 된 것으로 제안 된대로 dev 환경을 설정했습니다.Mozilla.org/En-us/add-ons/setting_up_extension_development_environment (실제로 나는 게으른 방법을 꺼내서 DEVPREFS 확장을 설치하여 모든 필요에 대한 모든 정보를 설정합니다)
i 그런 다음 Firefox를 열고 디버깅 환경 (도구> 웹 개발자> 브라우저 도구 상자)으로 이동합니다.
i 다음 디버거 탭으로 이동합니다.
그러나 소스 창 아래에서 내 확장 (예 : Chrome : // myExtension)에서 내 확장 XPI에 포함 된 JS 및 XUL 파일 만 볼 수 있습니다.
디버거에서 수동으로 "파일로드"를 수동으로 "로드 할 수 있으므로 나의 확장자의 런타임을 추적 할 수 있습니다.
해결책
디버거에는 "수동으로"파일을로드 할 수있는 기능이 없으므로 현재 JavaScript 엔진이로드하는 모든 파일이 표시됩니다. 자세한 내용을 파기하면 JavaScript 엔진이 새 스크립트를 컴파일 할 때마다 디버거가 알림을 받고 해당 파일을 해당 파일에 추가합니다. 따라서 일반적으로 해당 스크립트를 사용하는 페이지 나 대화 상자를 열고 디버거에서 볼 수 있습니다. 나는 "정상적으로"라고 말합니다. 이는 안정적으로 작동하지 않는 것처럼 보이지 않았습니다. 디버거가 일부 스크립트를 놓치게 만드는 버그 인 것처럼 보입니다.
이제 디버거가 특정 파일을로드하도록 강제로 알림을 굽는 것을 고려할 수 있습니다. 파일이 실제로로드되기 전에 중단 점을 설정하려면됩니다. 나는 그것을 시도했다. 그리고 그것은 실제로 가능하지만, Firefox 내부를 엉망으로 만드는 것이 필요하며, 미래의 Firefox 버전에서 변경 될 수있는 여러 구현 세부 정보를 사용할 수 있습니다. 특히 디버거와 통신하는 데 사용되는 DebuggerServer
인스턴스를 가져와야합니다. In-Process 디버거가 항상 동일한 인스턴스를 사용하는 것과 동일한 인스턴스를 사용하는 동안 새 인스턴스가 각 원격 디버거에 대해 생성됩니다. 내가 알 수있는 것에서 버그 993029에서 구현 된 변경 사항에서만 해당 인스턴스가 가능합니다. / A> 현재 Firefox 32 (현재 Firefox Aurora 채널에서 사용할 수 있습니다 < / a>) 이상.
문제점은 toolboxprocess.jsm . 버그 993029에 의해 도입 된 변경 사항을 기 전에 BrowserToolboxProcess
객체가 생성되고 IT에 대한 참조가 없으며 사실 이후에 해당 연결이 불가능합니다. Firefox 32부터 생성 된 모든 생성 된 BrowserToolboxProcess
객체는 processes
세트 및 열거 할 수 있습니다.
이 코드는 debugger.onnewscript () 원격 디버거로 전달됩니다.
(function()
{
// Iterate over existing processes
const {processes} = Cu.import("resource:///modules/devtools/ToolboxProcess.jsm", null);
for (var process of processes)
{
// Iterate over connections associated with each process
var debuggerServer = process.debuggerServer;
for (var connID in debuggerServer._connections)
{
if (!debuggerServer._connections.hasOwnProperty(connID))
continue;
var conn = debuggerServer._connections[connID];
// Get ChromeDebuggerActor instance for the connection
var chromeDebugger = conn._getOrCreateActor(conn.rootActor._extraActors.chromeDebugger.actorID);
// Fake new script call
chromeDebugger.onNewScript({
url: "chrome://myextension/content/script.js", // CHANGE THAT LINE
source: {text:""},
getChildScripts: () => []
});
}
}
})();
.
위에서 언급 했듯이이 코드는 Firefox 32에서 시작하여 Firefox 33.0A1에서 테스트했습니다. 스크래치 패드에서 실행할 수 있고 환경을 "브라우저"로 전환하십시오 . 미래의 Firefox 버전에서는 계속해서 작동할지 보장은 없으며 언제든지 변경할 수있는 몇 가지 구현 세부 사항이 있습니다.