Расширение Chrome для междоменного расширения AJAX дает NETWORK_ERR: исключение XMLHttpRequest 101 - PullRequest
2 голосов
/ 15 марта 2012

Я создаю расширение Chrome для уведомлений Disqus.Это включает в себя HTTP-вызов disqus.com, но я не могу получить AJAX-вызов - Chrome выдает мне известную ошибку NETWORK_ERR: XMLHttpRequest Exception 101.

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

manifest.json:

{
 "name": "Disqus notifier",
 "version": "1.0",
 "description": "Get notifications when you have new replies on your Disqus posts",
 "browser_action": {
   "default_icon": "icon.png",
   "popup": "popup.html"
 },
 "icons": {
    "16": "icon16.png",
    "48": "icon48.png",
    "128": "icon128.png"
 },
 "background_page": "background.html",
  "permissions": [
        "http://*/*",
        "https://*/*"
    ]
}

background.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <script type="text/javascript" src="background.js"></script>
</head>
<body>

</body>
</html>

background.js:

function poll() {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = handleStateChange; // Implemented elsewhere.
    xhr.open("GET", chrome.extension.getURL('http://disqus.com/api/3.0/messagesx/unread.json?user=<...>&api_key=<...>'), false);
    xhr.send(null);
    console.log(xhr.responseText);
}

function handleStateChange() {
    if (this.readyState == 4) {
        var resp = JSON.parse(this.responseText);
        updateUi(resp);
    }
}

function updateUi(json) {
    console.log("JSON: ", json);
}

popup.html:

<html>
<head>
    <title>Disqus notifier</title>
    <script type="text/javascript">
        function updateButtonClicked() {
            chrome.extension.getBackgroundPage().poll();
        }
    </script>
</head>

<body>
  <button type="button" onclick="updateButtonClicked()">Update</button>
</body>
</html>

Строка xhr.send(null); - это то, что регистрирует ошибку 101.В обработчике событий handleStateChange, this.responseText - пустая строка, приводящая к сбою JSON.parse с Unexpected end of input.

Итак: чего мне не хватает, чтобы получить возможность создавать междоменный AJAXзвонки?

1 Ответ

7 голосов
/ 15 марта 2012

В вашем background.js есть ошибка ....

xhr.open("GET", chrome.extension.getURL('http://disqus.com/api/3.0/messagesx/unread.json?user=<...>&api_key=<...>'), false);

... должно быть .....

xhr.open("GET", 'http://disqus.com/api/3.0/messagesx/unread.json?user=<...>&api_key=<...>', false);

chrome.extension.getURL - для получения URL-адреса файла в вашем расширении.
http://code.google.com/chrome/extensions/extension.html#method-getURL
Вы можете делать запросы xhr не только с фоновой страницы (теперь вы можете с уверенностью сказать, что это любая страница вашего расширения, включая скрипты содержимого).
Chrome не будет блокировать вызовы xhr с неупакованного расширения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...