2015-09-10 3 views
1

Я попытался использовать addProgressListener, но я не знаю, как получить данные для сообщения в onStateChange и отправить его обратно.Как отправить сообщение/получить данные в случае неудачи?

exports.main = function() { 
    var {Cc, Ci, Cu} = require("chrome"); 
    var windows = require("sdk/windows").browserWindows; 
    const windowUtils = require("sdk/window/utils"); 
    var {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm"); 
    var { setTimeout, clearTimeout } = require("sdk/timers"); 
    var gBrowser = windowUtils.getMostRecentBrowserWindow().getBrowser(); 
    var tabs = require("sdk/tabs"); 
    const STATE_START = Ci.nsIWebProgressListener.STATE_START; 
    const STATE_STOP = Ci.nsIWebProgressListener.STATE_STOP; 
    const STATE_REDIRECTING = Ci.nsIWebProgressListener.STATE_REDIRECTING; 
    const STATE_TRANSFERRING = Ci.nsIWebProgressListener.STATE_TRANSFERRING; 
    const STATE_RESTORING = Ci.nsIWebProgressListener.STATE_RESTORING; 
    var timer = null; 
    var counter = 0; 
    var start_url = ''; 
    var retry = false; 

    var myListener = { 

     QueryInterface: XPCOMUtils.generateQI(Ci), 
     onState: function(aWebProgress, aRequest, aFlag, aStatus) { 
      console.log('test'); 
     }, 
     onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) { 
      Ci.nsIUploadChannel2 
      if(!aRequest.name.startsWith('http')) { 
       return false; 
      } 

      if (!(start_url && (start_url == aRequest.name))) { 
       if (!aWebProgress.isLoadingDocument && !retry) { 
        return false; 
       } 
      } 
      retry = false; 
      if (aFlag & STATE_START) { 
       if (timer) { 
        clearTimeout(timer); 
        timer = null 
        start_url = ''; 
        counter = 0 
       } 
       console.log("start"); 
       start_url = aRequest.name; 
       timer = setTimeout(function() { 
        if (counter < 5) { 
         // console.log("after start"); 
         console.log("aRequest.name: ", aRequest.name); 
         new_tab = gBrowser.addTab(aRequest.name); 
         gBrowser.removeCurrentTab(); 
         gBrowser.selectedTab = new_tab; 
         retry = true; 
         counter += 1 
         myListener['onStateChange'](aWebProgress, aRequest, 
                    aFlag, aStatus); 
        } else { 
         gBrowser.removeCurrentTab(); 
        } 
       }, 10000) 

      } 
      if (aFlag & STATE_STOP) { 
       if (timer) { 
        console.log("stop"); 
        clearTimeout(timer); 
        timer = null 
        start_url = ''; 
        counter = 0 
       } 
      } 
     }, 

     onLocationChange: function(aProgress, aRequest, aURI) { 
      start_url = aRequest.name; 
      console.log('onLocationChange: ', aRequest.name) 
     }, 
     onProgressChange: function(aWebProgress, aRequest, curSelf, 
               maxSelf, curTot, maxTot) { 
      console.log('onProgressChange: ', aRequest.name) 
     }, 
     onStatusChange: function(aWebProgress, aRequest, aStatus, aMessage) { 
      console.log('onStatusChange: ', aRequest.name) 
     }, 
     onSecurityChange: function(aWebProgress, aRequest, aState) { 
      console.log('onSecurityChange: ', aRequest.name) 
     } 
    } 
    gBrowser.addProgressListener(myListener); 
} 

Я также пытался использовать observerService, но ни одна из этих тем не позволяет отслеживать каждый запрос и сделать свои планы.

observerService.addObserver(this, "http-on-opening-request", false); 
observerService.addObserver(this, "http-on-examine-merged-response", false); 
observerService.addObserver(this, "http-on-examine-cached-responsee", false); 
observerService.addObserver(this, "http-on-examine-response", false); 

Я полагаю, что запрос данные могут быть получены с помощью nsIUploadChannel, но я не понимаю, как использовать его.

+1

Да почтовые данные должны быть в nsIUploadChannel, вот пример суть: https://gist.github.com/Noitidart/28624e20bfee2dc128c4#file-gistfile1-txt-L7 – Noitidart

+0

@Noitidart я, я видел его, но я не могу понять, как использовать – Tany

+0

Хорошо, я положил в тестируемое решение на основе вашего фрагмента – Noitidart

ответ

0

Попробуйте это, непроверенный, даже не проверив опечатки.

onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) { 
    if (aRequest instanceof Ci.nsIHttpChannel) { 
      if (aRequest.QueryInterface(Ci.nsIHttpChannel).uploadStream) { 
       // see line 10 - https://gist.github.com/Noitidart/28624e20bfee2dc128c4#file-gistfile1-txt-L10 
      } 
    } 
    if(!aRequest.name.startsWith('http')) { 
     return false; 
    } 
+0

что это 'this.oHttp'? если я делаю [pastebin] (http://pastebin.com/1p3wVSwQ), я получил 'Type Error' – Tany

+0

@tany 'this.oHttp == aRequest.QueryInterface (Ci.nsIHttpChannel)' – Noitidart

+0

'http = aRequest.QueryInterface (Ci .nsIHttpChannel) '-> получил ошибку' is null', 'this.oHttp' -> получил' this.oHttp undefined' – Tany