Расширение Chrome: popup.html закрывает и открывает ответ на новой вкладке?

#javascript #ajax #google-chrome-extension

#javascript #ajax #google-chrome-extension

Вопрос:

У меня есть форма входа на моем popup.html которое вызывает следующую функцию…

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

эта функция, в свою очередь, переходит к следующему оператору switch в моем background.html ..

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

ниже приводится содержимое do_login . Во время выполнения do login мой popup.html случайным образом закрывается и снова открывается на новой вкладке, код там завершен, и я вошел в систему. Почему это происходит?

  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);
  

Редактировать

Это отображается как последняя полученная ошибка background.html .. Attempting to use a disconnected port object

полная трассировка есть…

  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
  

Ответ №1:

Код и данные во всплывающем окне эфемерны, поскольку, как только всплывающее окно закрывается, связанный с ним код закрывается вместе с ним, поэтому любой обратный вызов, скажем, с фоновой страницы на всплывающее окно, завершится неудачей (перезванивать не к чему).

Вам нужно найти, что открывает новую страницу (не весь ваш код включен в вопрос — что делает createContentMenu?). Уведомления на рабочем столе могут привести к тому, что вы потеряете фокус и, следовательно, потенциально закроете всплывающее окно.

Также убедитесь, что вы перехватываете отправку формы во всплывающем окне, а затем передаете запрос через XMLHttpRequest (или используете встроенный imframe для размещения формы), поскольку отправка формы во всплывающем окне работает не так, как вы могли подумать (ваша страница не будет обновляться во всплывающем окне).