2012-04-16 1 views
1

Im делает действительно простое расширение Chrome, то, что перенаправляет страницы на HTTP-протоколе, на протокол https, если существует. Im на отладке, и я нашел facebook, что имеет как http, так и https.Получение -> Происхождение * не разрешено Access-Control-Allow-Origin

Код здесь:

function redirect() {  
    chrome.tabs.query({active: true}, function(tabArray) { 
     var currentURL = tabArray[0].url;    //http://facebook.com 
     var httpsURL = generateSSL(currentURL);   //https://facebook.com 
     if(httpsURL == currentURL){ 
      console.log(currentURL+" is already on HTTPS"); 
      chrome.browserAction.setIcon({path:"../images/padlock_green.png"}); 
     } else if(checkSSL(httpsURL)){      
      chrome.tabs.update(tabArray[0].id, {url: httpsURL}); 
      chrome.browserAction.setIcon({path:"../images/padlock_green.png"}); 
      chrome.browserAction.setBadgeText({text:"SSL"}); 
      console.log("SSL found,"+currentURL+" redirected to"+httpsURL); 
     } else { 
      //donothing 
      console.log(currentURL+" has no SSL"); 
      chrome.browserAction.setIcon({path:"../images/padlock_red.png"}); 
     } 
    }); 
} 

Аякса вызов:

function checkSSL(url){ 
    $.support.ajax = true; 
    $.ajax({ 
     url: url, 
     type:'HEAD', 
     error: function() 
     { 
      return false; 
     }, 
     success: function() 
     { 
      return true; 
     } 
    }); 
} 

Проблема заключается в том, что я получаю в консоли следующее сообщ об ошибке:

XMLHttpRequest cannot load https://www.facebook.com/. Origin chrome-extension://pgidanbjmliilmmohlphbagcapafjjpg is not allowed by Access-Control-Allow-Origin. 

I не имеют никаких идей, что может быть проблемой :(

+0

Кажется, что ваше расширение делает запрос Ajax ... –

+0

sry, я забыл скопировать вызов ajax, я обновил сообщение:/ –

+0

Но этот вызов Ajax - это проблема ... вам не разрешено это делать, это сообщение об ошибке. Кроме того, вы не можете вернуть значение из обратного вызова Ajax, вся настройка не будет работать. Вы должны найти другой способ проверить, доступна ли версия HTTPS. –

ответ

1

Ваш код имеет несколько небольших вопросы:

  • Ваш файл манифеста запрашивает разрешения только для http://*/*, неhttps://*/*, поэтому ваш запрос на сайт HTTPS не удается. Вам необходимо разрешение *://*/*, поэтому вы можете получить все страницы по всем доменам по всем протоколам, а не только по HTTP.

  • Вторая проблема заключается в том, что вы ожидаете, что ваш вызов $.ajax будет возвращать логическое значение, но это не то, что происходит. Вызов $.ajax имеет два callbacks, каждый из которых возвращает логическое значение, но checkSSL заканчивается перед завершением вызова Ajax, что означает, что checkSSL всегда возвращает undefined.

Что вы хотите сделать вместо этого обеспечить checkSSL с функцией обратного вызова в качестве аргумента:

function checkSSL(url, callback){ 
    $.ajax({ 
     url: url, 
     type:'HEAD', 
     error: function() { callback(false); }, 
     success: function() { callback(true); } 
    }); 
} 

Затем использовать эту функцию обратного вызова для выполнения вызова кода после вызова checkSSL:

function redirect() {  
    chrome.tabs.query({active: true}, function(tabArray) { 
     var currentURL = tabArray[0].url;    //http://facebook.com 
     var httpsURL = generateSSL(currentURL);   //https://facebook.com 
     if(httpsURL == currentURL){ 
      console.log(currentURL+" is already on HTTPS"); 
      chrome.browserAction.setIcon({path:"../images/padlock_green.png"}); 
     } else { 
      // call checkSSL and take action in an anonymous callback function! 
      checkSSL(httpsURL, function(urlDoesExist) { 
       if(urlDoesExist) {     
        chrome.tabs.update(tabArray[0].id, {url: httpsURL}); 
        chrome.browserAction.setIcon({path:"../images/padlock_green.png"}); 
        chrome.browserAction.setBadgeText({text:"SSL"}); 
        console.log("SSL found,"+currentURL+" redirected to"+httpsURL); 
       } else { 
        //donothing 
        console.log(currentURL+" has no SSL"); 
        chrome.browserAction.setIcon({path:"../images/padlock_red.png"}); 
       } 
      }); 
     } 
    }); 
} 

Обратите внимание на изменения в коде ниже первого else. Мы не можем решить, что делать до тех пор, пока не будет разрешен вызов Ajax, поэтому функции Ajax success и error запускают обратный вызов с помощью логического аргумента. Эта функция обратного вызова затем принимает действие, основанное на значении булева.

+0

Отличный ответ, спасибо;) Хорошо работает ^^ –

0

Если пакет вашего расширения, вам разрешено делать перекрестные запросы домена, но если вы не создать его в качестве размещенной приложения/расширения, см:

Chrome extension Cross Domain Request

+0

Спасибо, приветствую arcticle, мне нужно прочитать его immadietely –