2012-05-01 3 views
0

Я пытаюсь использовать скрипт содержимого для ввода собственных файлов JS на страницу. Способ, которым я пытаюсь это сделать, основан на системе, используемой расширением Chrome, которое называется dotjs, которое запускает небольшой сервер на вашем компьютере, и делает AJAX reuests на localhost, чтобы получить файлы с этого сервера.Сообщения, которые не отправляются из сценария содержимого в background.js

Я уверен, что те запросы AJAX будут проходить только в том случае, если они отправлены из background.js, а не из сценария контента из-за той же политики происхождения. Мне также нужно использовать webRequest, который снова работает только на фоновой странице. Но, поскольку мне нужно вводить материал на страницу, мне нужен сценарий содержимого. Таким образом, мое расширение работает со сценарием контента, который отправляет сообщения на справочную страницу, запрашивая, чтобы он выполнял все необходимые запросы webRequest и AJAX.

Проблема в том, что сообщения, похоже, не получаются background.js. У меня есть console.log() s в обработчике onRequest в background.js, как вы можете видеть, и они не отображаются в моей консоли.

manifest.json

{ 
    "name": "dotjs", 
    "version": "1.5", 
    "description": "~/.js", 
    "icons": { "48": "icon48.png", 
      "128": "icon128.png" }, 
    "content_scripts": [{ 
    "all_frames": true, 
    "run_at":  "document_start", 
    "matches": ["[censored]"], 
    "js":   ["dotjs.js"] 
    }], 
    "background": { 
    "scripts": ["jquery.js", "background.js"] 
    }, 
    "permissions": ["tabs", "webRequest", "extension"] 
} 

dotjs.js

console.log("dotjs.js running"); 

var requestFilter = 
    { 
     url: "[censored]" 
    }; 

var blockingResponse = 
    { 
     redirectUrl: "http://localhost:2262/Pigman/ips.chat.js" 
    }; 

function requestInterceptor(details) 
{ 
    return blockingResponse; 
} 

chrome.extension.sendRequest(
    { 
     type: "setListener", 
     func: requestInterceptor, 
     filter: requestFilter 
    } 
); 

chrome.extension.sendRequest(
    { 
     type: "loadJS", 
     filename: "Elizabot/elizabot.js" 
    }, 
    function (response) { eval(response); } 
); 

chrome.extension.sendRequest(
    { 
     type: "loadJS", 
     filename: "Elizabot/elizadata.js" 
    }, 
    function (response) { eval(response); } 
); 

background.js

function loadJSFile(filename) 
{ 
    $.ajax({ 
     url: 'http://localhost:2262/Pigman/' + filename + '.js', 
     dataType: 'text', 
     success: function(d){ 
      return d; 
     }, 
     error: function(){ 
      console.log('no file found at localhost:2262/' + filename + '.js') 
     } 
    }); 
} 

chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) 
    { 
     console.log("background.js received request:"); 
     console.log(request); 
     if (request.type == "setListener") 
     { 
      chrome.webRequest.onBeforeRequest.addListener(request.func, request.filter); 
     } 
     if (request.type == "loadJS") 
     { 
      sendResponse(loadJSFile(request.filename)); 
     } 
    } 
); 

ответ

2

Есть много недостатков в у наш код/​​дизайн:

  1. контента скрипты могут сделать кросс-происхождения запроса AJAX, при условии, что URL ресурса указано в разделе в файле манифеста permissions.
  2. API webRequest API не выполняет никаких запросов, созданных в рамках расширения Chrome.
  3. return заявления в success обработчика делает не возвращает ответ вызывающие loadJSFile:

    sendResponse(loadJSFile(request.filename)); 
    ... 
    function loadJSFile(filename) { 
        $.ajax({ 
         ... 
         success: function(d){ 
          return d; 
         } ... 
    

    По крайней мере, использование:

    loadJSFile(request.filename, sendResponse); 
    function loadJSFile(filename, sendResponse) { 
        $.ajax({ 
         url: 'http://localhost:2262/Pigman/' + filename + '.js', 
         dataType: 'text', 
         success: sendResponse, /// <--- Now it works! 
    

шлейф отладка: Я уверен, что сообщения регистрируются в консоли. Вы просто смотрите на неправильное место. См. Google chrome extension - logging from background.js о шагах по чтению вывода консоли для фоновой страницы.

+0

Спасибо, теперь мне стало намного легче, я вижу консольный вывод. Я чувствую себя очень потерянным в мире расширений Chrome, потому что я не мог найти никаких хороших учебников, и официальная документация берет очень спартанский подход. –

+0

[Официальная документация] (http://code.google.com/chrome/extensions/devguide.html) является достойной ссылкой. Если вы нуждаетесь в советах, трюках и примерах, просмотрите [мои ответы в теге google-chrome-extension] (http://stackoverflow.com/search?tab=relevance&q=user%3a938089%20 [google- хром-расширение]). Обычно я добавляю демо к своим ответам и всегда включаю соответствующие ссылки. –

Смежные вопросы