Откройте вкладку и сделайте к ней POST-запрос в веб-расширении Firefox.

Я пытаюсь перенести свой аддон Firefox, который использует низкоуровневый SDK API, в WebExtension и в в какой-то момент я хочу POST-данные, закодированные в URL-адресе, на новую вкладку.

С низкоуровневым API это возможно с помощью следующего кода:

const querystring = require('sdk/querystring');
let stringStream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream);
stringStream.data = querystring.stringify(params); // params is a json data

let postData = Cc["@mozilla.org/network/mime-input-stream;1"].createInstance(Ci.nsIMIMEInputStream);
postData.addHeader("Content-Type", "application/x-www-form-urlencoded");
postData.addContentLength = true;
postData.setData(stringStream);

var tabBrowser = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator).getMostRecentWindow("navigator:browser").gBrowser;
var selectedTabIndex = tabBrowser.tabContainer.selectedIndex;
var newTab = tabBrowser.loadOneTab("https://myurl.com/", {
    inBackground: false,
    postData: postData
});
tabBrowser.moveTabTo(newTab, selectedTabIndex + 1);

Но я не нашел эквивалента WebExtension.

Возможно ли это или единственное решение - создать форму и отправить ее в js?


person Jérémie Bertrand    schedule 10.05.2016    source источник


Ответы (2)


Вам действительно нужно отправить сообщение на вкладку или просто отобразить ответ? Это опубликует и получит ответ, с которым вы можете что-то сделать. Убедитесь, что ваш заголовок CORS также установлен правильно.

<meta http-equiv="Content-Security-Policy" content="default-src 'self' www.demo.com; script-src 'self'; img-src http: https: data:; style-src 'self' 'unsafe-inline'">

function ajax(url) {
    return new Promise(function(resolve, reject) {
        var xhr = new XMLHttpRequest();
        xhr.onload = function() {
            resolve(this.responseText);
        };
        xhr.onerror = reject;
        xhr.open('POST', url);
        xhr.send();
    });
}

ajax("www.demo.com/test.php?q=" + params).then(function(result) {
    //Do something with result
}).catch(function(err) {
      console.log("Error: " + err.message);
});
person Paul Heil    schedule 27.05.2016
comment
Хорошая идея, но мне нужно опубликовать данные в кодировке URL (например, HTML-форму) на веб-сайте, которым я не владею, поэтому я предпочитаю POST на вкладке, а не просто показ результата. Прямо сейчас я создаю HTML-форму через javascript, например, я отправлю код. - person Jérémie Bertrand; 27.05.2016
comment
Я думаю, вы можете просто изменить xhr.send(lorem=ipsum&name=binny); включить ваши параметры. http://www.openjs.com/articles/ajax_xmlhttp_using_post.php - person Paul Heil; 01.06.2016
comment
Другой пример: blog.mozilla.org/ addons/2016/05/31/ - person Paul Heil; 02.06.2016
comment
Спасибо, я попробую это :) - person Jérémie Bertrand; 03.06.2016
comment
Это может работать, но мне нужно заменить текущее содержимое страницы результатом, и я не могу изменить URL-адрес вкладки. Поэтому я использовал другое решение: вставить html-форму в текущую вкладку и отправить ее. - person Jérémie Bertrand; 19.06.2016

Сейчас единственное решение — создать форму на новой вкладке и отправить ее. В фоновом скрипте:

// tab creation
browser.tabs.create({ index: tab.index + 1, url: "https://myurl.com/" }, function (tab) {
    // load content script submitForm.js
    browser.tabs.executeScript(tab.id, { file: "submitForm.js" }, function () {
        // send message to submitForl.js with parameters
        chrome.tabs.sendMessage(tab.id, {url: tab.url, message: 'hello world'});
    });
});

Содержимое формы отправки:

function submitForm(request, sender, sendResponse)
{
    var f = document.createElement('form');
    f.setAttribute('method','post');
    f.setAttribute('action','https://myurl.com/form');

    var f1 = document.createElement('input');
    f1.setAttribute('type','hidden');
    f1.setAttribute('name','url]');
    f1.setAttribute('value', request.url);
    f.appendChild(f1);

    var f2 = document.createElement('input');
    f2.setAttribute('type','hidden');
    f2.setAttribute('name','content');
    f2.setAttribute('value', request.message);
    f.appendChild(f2);

    document.getElementsByTagName('body')[0].appendChild(f);
    f.submit();
}

// listen for messages and execute submitForm
chrome.runtime.onMessage.addListener(submitForm);
person Jérémie Bertrand    schedule 19.06.2016