2011-05-17 5 views
1

J'ai un formulaire de connexion sur mon popup.html qui appelle la fonction suivante ...Extension Chrome: popup.html se ferme et ouvre la réponse dans un nouvel onglet?

chrome.extension.sendRequest({ 
     req: "login", 
     user: username, 
     pass: pass, 
     remember: remember 
    }, function(response) { 
     console.log("RESPONSE RECIEVED HOOORAH!"); 
      }); 

cette fonction à son tour va à l'instruction switch suivante dans mon background.html ..

do_login(request.user, request.pass, request.remember, false, true, function(response){ 
         if(response == true){ 
          sendResponse("success"); 
         }else{ 
          sendResponse("badLogin"); 
         } 
        }) 

ce qui suit est le contenu de do_login. Pendant l'exécution de do login, mon popup.html se referme et se rouvre aléatoirement dans un nouvel onglet, le code est complété et je suis connecté. Pourquoi cela se passe-t-il?

var xhr = new XMLHttpRequest(); 
    xhr.open("GET",requrl,true); 
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); 
    xhr.onreadystatechange = function(do_login){ 
     if(xhr.readyState == 4){ 
      if(xhr.status == 200){ 
       console.log(xhr.responseText); 
       try{ 
        //Incase they were just logged in as another user. 
        createContextMenu(); 
        //users info. 
        var resp = JSON.parse(xhr.responseText); 
        if(resp.default === void(0)){ 
         logOut(); 
         callback(null); 
        } 
       default = resp.default; 

       for(var i=0;i<resp.s.length;i++){ 
       globalStaks[i] = resp.s[i]; 
       } 
       st = global; 
       bud = resp.bud; 
       msg = resp.msg; 
       stakid = resp.default; 
       }catch(x){ 
       // This situation is where you have incorrect password 
       console.log("something is wrong with logging in ") 
       clearLoginInfo(); 
       console.log("Incorrect password"); 
       } 
       if(resp.msg == "denied") 
    { 
     clearLoginInfo(); 
     callback(false); 
    } 
    else 
    { 
     loggedIn = true; 
     user = username; 
     userid = resp.userid; 
     if(refresh){ 
      refreshpage(); 
     } 
     if(notificationdisplay){ 
      notification.cancel(); 
     } 
     if(remember) 
     { 
      clearLoginInfo(); 
      storeLogin(username,pass); 
     } 
     localStorage.setItem("pass",pass); 
     md5 = pass; 
     callback(true); 
     } 
     }else { 
      callback(false); 
     } 
    } 
} 
     xhr.send(null); 

EDIT

Il apparaît comme la dernière erreur recieved background.html lancers francs .. Attempting to use a disconnected port object

trace complète est ...

Uncaught Error: Attempting to use a disconnected port object 
chrome.Port.postMessagechrome/RendererExtensionBindings:147 
chromeHidden.Port.dispatchOnConnect.connectEventchrome/RendererExtensionBindings:89 
sendResponse.reply background.html:1266 
xhr.onreadystatechange 

Répondre

0

Le code et les données dans une fenêtre contextuelle est éphémère, en ce que dès que le popup se ferme, le code associé se ferme avec lui, donc tout rappel de dire un page d'arrière-plan à la popup échouera (il n'y a rien à rappeler).

Vous devez trouver ce qui ouvre la nouvelle page (tout votre code n'est pas inclus dans la question - que fait createContentMenu?). Les notifications sur le bureau peuvent vous faire perdre le focus et ainsi fermer potentiellement la fenêtre contextuelle.

Assurez-vous également d'attraper le formulaire submit dans votre popup, puis passez la requête via XMLHttpRequest (ou utilisez une imframe imbriquée pour héberger le formulaire), la soumission de formulaire dans un popup ne fonctionne pas comme vous le pensez (vous la page ne sera pas mise à jour dans la fenêtre contextuelle).

Questions connexes