0

XMLHttpRequest を使用して、サーバーと開発中の Firefox 拡張機能の間でデータを交換しています。残念ながら、これらのリクエストは現在開いているページに何らかの形で関連しているようです。現在のタブを閉じているときにリクエストを発行しようとすると、エラーで失敗します。タブで何が起こっているかに関係なく、拡張機能自体からリクエストを発信するにはどうすればよいですか?

編集: この問題を再現するコードは次のとおりです。これはメインの拡張本体として実行されます ( http://kb.mozillazine.org/Getting_started_with_extension_developmentの「Hello world」チュートリアルに基づいて設計したため、アドオン 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();
    });
});

これにより、新しいタブを開いた後は「成功」、閉じた後は「エラー」になります。私は2つの成功を望んでいます。

4

1 に答える 1

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)
于 2012-04-27T21:05:45.827 に答える