FireFox Extension SDK преобразует GM_xmlhttprequest во что-то, совместимое с аддоном sdk

Я начал со сценария жирной обезьяны. там вы используете команду GM_xmlhttprequest и можете получить междоменные данные. Первоначально у меня был приведенный ниже код, работающий в Greasemonkey, теперь, когда я перерос возможности GM, мне нужно перенести его в дополнительный SDK.

GM_xmlhttpRequest({
      method: 'POST',
      url: "http://10.1.1.1/app/site_search_info.php",
      headers: {
             "Content-Type": "application/x-www-form-urlencoded"
          },
      data: encodeURI("link=" + itemDir[2]),
      onload:function(r)
               {
               ................ original html formating code here...
               }
 });

Мне удалось получить информацию о дате для каждого элемента строки, а затем добавить эту информацию к текущему тексту в каждой строке. я использовал вызов pagemod в main.js для загрузки моего search.js, который содержит этот код. когда я получаю страницу, которая должна выполнить xmlhttprequest, она не показывает ошибку в консоли ошибок браузера и не запускается. размещение предупреждения непосредственно перед появлением XHR. Поскольку это межсайтовый XHR, я могу только предположить, что либо я ошибся в синтаксисе при попытке заменить GM_xmlhttprequest, либо он заблокирован настройками безопасности.

поэтому для межсайтовых запросов я должен использовать

var Request = require("request").Request;
    Request({
      url: "http://10.1.1.1/app/site_search_info.php",
      headers: {
             "Content-Type": "application/x-www-form-urlencoded"
          },
      content: encodeURI("link=" + itemDir[2]),
      onload:function(r)
            {
................ original html formating code here... 
          };
}).post();

Или я должен использовать что-то вроде

var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"] 
                    .createInstance(Components.interfaces.nsIXMLHttpRequest); 
req.open('PUT',"http://10.1.1.1/app/site_search_info.php", false); /* synchronous! */ 
req.onload = function (r)
         { 
................ original html formating code here... 
          }; 
req.setRequestHeader('Content-Type', application/x-www-form-urlencoded); 
req.send(encodeURI("link=" + itemDir[2]))

Мне нужно опубликовать имя элемента, которое в конечном итоге кодирует «ссылка = плоскогубцы», и взять результат даты времени, который генерирует php-страница, и запустить его через код форматирования, а затем добавить исходную веб-страницу с этими данными.

Поскольку это мой первый XHR в SDK, мне нужно выяснить, является ли это синтаксической ошибкой в ​​​​XHR или он использует неправильный тип XHR, потому что безопасность блокирует это.

Если оба будут работать, то нужно ли их помещать в определенный файл .js или вызывать определенным образом?


person Kendrick    schedule 18.03.2012    source источник


Ответы (1)


Вы должны использовать модуль запроса SDK, первый вариант. Этот код должен быть в main.js, и в вашем обработчике onComplete вы должны отправить данные в свой контент-скрипт. Вот рабочий пример, который делает что-то вроде этого:

// main.js:

let data = require('self').data;

let pm = require("page-mod").PageMod({
    include: /^https:\/\/twitter.com\/.*\/status\/[\d]+$/,
    contentScriptFile: [data.url('jquery-1.7.1.min.js'), data.url('twitter_json.js')],
    onAttach: function(worker) {

        worker.port.on('tweet-loaded', function() {
            let tweet_id = /status\/([\d]+)$/.exec(worker.tab.url).pop();
            if (tweet_id) {
                let twitter_request = require("request").Request({
                    url: 'https://api.twitter.com/statuses/show/' + tweet_id + '.json',
                    onComplete: function(response) {
                        worker.port.emit('got-tweet-json', response.json);
                    }
                }).get();
            }
        });
    }
});


// content script

$(function() {
    // this setTimeout is a dumb hack, it seems we need to wait a bit longer before
    // modifying the page. I blame new twitter.
    window.setTimeout(function() {
        self.port.on('got-tweet-json', function(data) {
            var s_data = JSON.stringify(data, null, '   ');
            $('ul.actions').after('<pre id="json-dump"></pre>');

            $('ul.actions').append('<li><a id="json-link" href="#">View JSON</a></li>');

            $('#json-link').click(function(ev) {
                $('#json-dump').toggle();
                return false;
            });
            $('#json-dump')
                .html(s_data)
                .hide();
        });

        self.port.emit('tweet-loaded', true);


    }, 200);
});

https://builder.addons.mozilla.org/addon/1040966/latest/

Не window.setTimeout - я думаю, что это необходимо в данном случае из-за всего JS, который выполняется при загрузке при просмотре нового твиттера. Я бы сказал, что это зависит от необходимости между ОС и браузерами. :D

person therealjeffg    schedule 18.03.2012
comment
поэтому в сценарии содержимого в конце у меня есть var cells = document.getElementsByTagName('td'); for (i=0; i<cells.length; i+=5) { getItemPage(cells[i]);, который извлекает itemDir и вызывает GM_xmlhttprequest. Он форматирует данные, возвращенные запросом, а затем редактирует html с помощью cell.appendChild, который возвращает itemDir HREF с текстом cellInfo. - person Kendrick; 22.03.2012
comment
// Main var Request = require("request").Request; var pageMod = require("page-mod"); var data = require("self").data; pageMod.PageMod({ include: "http://site.com/*", contentScriptFile: data.url("item.js") onAttach: function(worker) { worker.port.on('cell', getItemPage(cell) { var link = cell.getElementsByTagName('a')[0].href; // get the link from cell var itemDir=link.toString().split("/"); Request({ как показано в исходном посте. - person Kendrick; 22.03.2012
comment
// item.js в конце. // getItemPage(cells[i]); self.port.emit('cells', true); self.port.on('itemDir', ? ); self.port.on('cellInfo', ? ); a = document.createElement('a'); a.href = "http://10.1.1.1/items/"+ itemDir[4]; a.innerHTML = cellInfo; cell.appendChild(a); } } } не совсем уверен, как вернуть itemDir и cellInfo или можно ли их как-то объединить. - person Kendrick; 22.03.2012
comment
Можете ли вы скопировать все это в gist или pastebin или что-то в этом роде? Как-то тяжело читать. - person therealjeffg; 23.03.2012