FireFox Extension SDK, преобразующий GM_xmlhttprequest в нечто совместимое с аддоном SDK - PullRequest
1 голос
/ 19 марта 2012

Я начал со скрипта обезьянки.там вы используете команду 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]))

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

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

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

1 Ответ

1 голос
/ 19 марта 2012

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

<code>// 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">
'); $ ('ul.actions'). append (' Просмотр JSON '); $ ('# json-link'). click (function (ev) { $ ( '# JSON-свалка') переключение (). вернуть ложь; }); $ ( '# JSON-свалка') .html (s_data) .скрывать(); }); self.port.emit ('твит-загружен', правда); }, 200); });

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

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

...