Проблема XMLHttpRequest в расширении Firefox - PullRequest
0 голосов
/ 03 января 2019

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

Вот файл manifest.json (имя хоста и домен были заменены поддельным):

{
  "applications": {
    "gecko": {
      "id": "extension@example.com",
      "strict_min_version": "58.0a1"
    }
  },
  "browser_action": {
    "browser_style": true,
    "default_title": "Title",
    "default_popup": "mowl.html"
  },
  "description": "Description",
  "homepage_url": "https://example.com",
  "manifest_version": 2,
  "name": "Name",
  "permissions": [
    "*://www.example.com/*",
    "tabs"
  ],
  "content_security_policy": "script-src 'self' https://www.example.com; object-src 'self'",
  "version": "1.0"
}

Это всплывающий файл HTML:

<!DOCTYPE html>

<html>
<head>
<meta charset="utf-8">
<script src="mowl.js"></script>
</head>

<body>
  Please login: <br><br>
  <input type='email' placeholder='Email address:'' name='email' id='email' size='50'><br><br>
  <input type='password' placeholder='Password' name='password' id='password' size='50'><br><br>
  <button id="signin">Ok</button>
</body>

</html>

И, наконец, код javascript:

function processlogin() {
  console.log('in processlogin');
  if(http.readyState == 4) {
      console.log(http.readyState);
  }
}

function buttonClicked() {
   document.querySelector('#signin').addEventListener('click', dologin, false);
}

function dologin () {
  console.log('in dologin');
  var website = "https://www.example.com/signin.php";
  var params = "email=" + document.getElementById('email').value + "&password=" + document.getElementById('password').value;
  http.open("POST", website);
  http.responseType = 'text';
  http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  http.onreadystatechange = processlogin;
  http.send(params);
}

document.addEventListener("DOMContentLoaded", buttonClicked);
var http = new XMLHttpRequest();

Тестирование этого кода в Firefox с помощью отладчика показывает, что неСетевой запрос выполняется вообще при нажатии кнопки.Я разместил операторы console.log в разных местах, чтобы убедиться, что разные функции вызываются, когда ожидается.

Но, изменяя javascript следующим образом:

function processlogin() {
  console.log('in processlogin');
  if(http.readyState == 4) {
      console.log(http.readyState);
  }
}

function buttonClicked() {
   document.querySelector('#signin').addEventListener('click', dologin, false);
}

function dologin () {
  console.log('in dologin');
}

document.addEventListener("DOMContentLoaded", buttonClicked);
var http = new XMLHttpRequest();
var website = "https://www.example.com/signin.php";
var params = "email=" + document.getElementById('email').value + "&password=" + document.getElementById('password').value;
http.open("POST", website);
http.responseType = 'text';
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.onreadystatechange = processlogin;
http.send(params);

делает сетевой вызоввыполнено (очевидно, без необходимости нажатия на кнопку) и сообщается в отладчике Firefox.Я не понимаю, что происходит.

Кто-то может подсказать, что я делаю с этим не так?

Большое спасибо!

1 Ответ

0 голосов
/ 04 января 2019

Оказывается, что сетевые запросы выполняются независимо от того, находится ли код внутри или вне функции.НО по какой-либо причине F irefox отладчик НЕ показывает сетевые вызовы, когда они находятся внутри функции !!! или, возможно, выход очищается перед тем, как его можно увидеть, кто знает ...

...