2012-04-26 9 views
0

XMLHttpRequest를 사용하여 서버와 Firefox 확장 프로그램간에 데이터를 교환하고 있습니다. 불행히도 이러한 요청은 현재 열려있는 페이지와 연결되어있는 것처럼 보입니다. 현재 탭이 닫힌 상태에서 요청을하면 오류가 발생하여 실패합니다. 탭에서 진행되는 작업과 상관없이 확장 프로그램 자체에서 내 요청을 보내려면 어떻게해야합니까?Firefox 확장 프로그램의 XMLHttpRequest

편집 : 다음은이 문제를 재현하는 코드입니다. 그것은 주요 확장 본문 (나는 "Hello world"튜토리얼 http://kb.mozillazine.org/Getting_started_with_extension_development에서 내 디자인을 기반으로하므로 추가 기능 SDK는 없습니다)로 실행됩니다. 즉 위 튜토리얼의 "overlay.js"코드와 동일한 위치에서 실행됩니다.

function createXMLHttpRequest() { 
    return Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"] 
     .createInstance(Components.interfaces.nsIXMLHttpRequest);  
} 

function issueRequest() { 
    var req = createXMLHttpRequest(); 
    req.open("GET", "http://google.com", true); 
    req.addEventListener("load", function(event) { 
     alert("SUCCES"); 
    }); 
    req.addEventListener("error", function(event) { 
     alert("ERROR"); 
    }); 
    req.send(); 
}; 

window.addEventListener("DOMContentLoaded", function(event) { 
    issueRequest(); 

    var doc = event.originalTarget; 
    var win = doc.defaultView; 

    win.addEventListener("unload", function(event) { 
     issueRequest(); 
    }); 
}); 

이 닫을 후 새로운 탭이 개방 된 후, "SUCCESS"및 "ERROR"을 초래한다. 나는 두 가지 성공을 원합니다.

+0

어떻게하면 XMLHttpRequest를 생성합니까? Add-on SDK를 사용하고 콘텐츠 스크립트에서 사용하는 것 같습니다. –

+0

@WladimirPalant 문제를 보여주는 테스트 사례가 줄어 들었습니다. Add-on SDK를 사용하지 않고이 코드는 언급 된 튜토리얼에 대한 이해가 컨텐츠 스크립트로 실행됩니다. –

+0

코드에서'win.location.href'의 값을 확인하십시오 - 저는 그것이 브라우저 페이지이고 내용 페이지가 아니라는 것을 확신합니다. 따라서 탭이 아니라 브라우저 창이 닫힐 때까지 기다리는 중입니다. –

답변

1

해당 스크립트가 브라우저 창 오버레이에서 실행중인 경우 DOMContentLoaded 처리기를 잘못된 노드에 연결하면 브라우저 창 자체가로드 될 때만 알림을 받게됩니다. 따라서 처리기 unload 처리기가 브라우저 창을 닫을 때까지 기다리면 탭을 닫을 때까지 기다릴 수 있습니다. 올바른 코드는 다음과 같습니다 :

// Wait for the browser window to load before doing anything 
window.addEventListener("load", function() { 
    // Attach a listener to the tabbrowser to get notified about new pages 
    window.gBrowser.addEventListener("DOMContentLoaded", function(event) { 
    issueRequest(); 

    var doc = event.originalTarget; 
    var win = doc.defaultView; 

    win.addEventListener("unload", function(event) { 
     issueRequest(); 
    }); 
    }, false); 
}, false) 
+0

전체 브라우저에서 발생하는 이벤트를 수신하는 것은 사실이지만 탭의 DOMContentLoaded 이벤트는 항상 팝업으로 표시되므로 코드와 크롬 이벤트를로드하는 것과 동일한 이벤트가 발생합니다. 나는 당신의 코드를 시도했는데 그것은 탭 경고 ERROR의 광산 폐쇄와 같은 방식으로 작동하지 않는다. win과 win.location.href는 각각 Google과 귀하의 버전이 동일합니다 (Google을 여는 동안) : "Window www.google.com"및 "http://www.google.com/" –

관련 문제