XHR запрещено в расширении Chrome, несмотря на добавление правильных разрешений? - PullRequest
0 голосов
/ 04 июля 2011

В настоящее время я работаю над Matlab API Search дополнением к моим разработчикам омнибоксовых расширений , и столкнулся со странной проблемой XHR (интересно, возможно, что-то недавно изменилось в Chrome) .

Когда расширение пытается извлечь список функций API из http://www.mathworks.com/help/techdoc/ref/funcalpha.html,, XHR завершается ошибкой с «Access-Control-Allow-Origin». Я видел этот сбой в прошлом с некоторыми другими моими расширениями, но обычно это было результатом того, что я забыл указать правильные разрешения в манифесте. Тем не менее, мой манифест включает «http://www.mathworks.com/" в список разрешений, поэтому я не понимаю, почему это не удается. Я видел упоминание о запрещении XHR с несколькими источниками в сценариях содержимого, но это сценарий, включенный в фоновая страница, а не контент-скрипт, поэтому я не понимаю, почему это не получается.

ПРИМЕЧАНИЕ. Я использую Chrome 14 (канал разработчика). Мне любопытно узнать, работает ли это недавно в Chrome 14 и работает ли оно в более ранних версиях Chrome, или я просто делаю глупости в своем коде. Если он не работает в Chrome 14, любые предложения об обходном пути будут с благодарностью.

Manifest:

{
    "name":"Matlab API Search",
    "description":"Adds support to the omnibox to search the Matlab API.",
    "background_page":"background.html",
    "icons":{"128":"icon128.png", "32":"icon32.png", "16":"icon16.png"},
    "omnibox":{"keyword":"matlab"},
    "permissions":[
        "tabs",
        "http://www.mathworks.com/"
    ],
    "version":"1.0"
}

XHR Звоните:

xhr("http://www.mathworks.com/help/techdoc/ref/funcalpha.html",
    function(url, req) {
    // ...
    },
    function(url, req) {
    // ...
    }).send(null);

Где функция xhr была определена следующим образом:

  function xhr(url, ifexists, ifnotexists, retry_interval) {
    var retry_time = retry_interval || 5;
    var req = new XMLHttpRequest();
    console.log("Fetching: " + url);
    req.open("GET", url);
    req.onreadystatechange=function(){
        if (req.readyState == 4){
            var status=req.status;
            if ((status == 200) || (status == 301) || (status == 302)) {
                ifexists(url, req);
            } else {
                ifnotexists(url, req);
                setTimeout(function() { xhr(url, ifexists, ifnotexists, retry_time + 5).send(null); }, retry_time);
            }
        }
    };
    return req;
  }

ПРИМЕЧАНИЕ
Я также попробовал следующие разрешения:

http://www.mathworks.com/*
http://*.mathworks.com/*
*://www.mathworks.com/*
*://*.mathworks.com/* 
*://*
http://*/*

(Я бы не хотел использовать «Все ваши данные на всех сайтах», во всяком случае, но это, кажется, подразумевает, что это не проблема с тем, как я объявил свои разрешения, поэтому я невероятно запутался ).

Версия
14.0.803.0 (Официальная сборка 90483) dev

Обновление
Я подал эту ошибку Chrome , так как я думаю, что это на самом деле ошибка в Chrome. Однако, если это не будет исправлено, я был бы очень признателен за любой обходной путь, который может сделать эту работу.

1 Ответ

0 голосов
/ 04 июля 2011

Добавьте * в конец вашего URL, он основан на символах подстановки.

{
    "name":"Matlab API Search",
    "description":"Adds support to the omnibox to search the Matlab API.",
    "background_page":"background.html",
    "icons":{"128":"icon128.png", "32":"icon32.png", "16":"icon16.png"},
    "omnibox":{"keyword":"matlab"},
    "permissions":[
        "tabs",
        "http://www.mathworks.com/*"
    ],
    "version":"1.0"
}

См. http://code.google.com/chrome/extensions/match_patterns.html - некоторые из наших документов, похоже, подразумевают, что он работает без *, ноне должно (см. «плохие примеры»).

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