打开一个选项卡,并在firefox webextension中向它发出POST请求

时间:2016-05-10 12:08:51

标签: javascript firefox-webextensions

我尝试将使用低级SDK API的firefox addon迁移到WebExtension,并且在某些时候我想将url编码的数据POST到新标签页。

使用低级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中提交?

2 个答案:

答案 0 :(得分:1)

您是否真的需要发布到标签页或只显示回复?这将发布并获得您可以执行某些操作的响应。确保您的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);
});

答案 1 :(得分:0)

现在唯一的解决方案是在新标签页中创建表单并提交。 在后台脚本中:

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);

submitForm内容:

Presentations.Open("c:\temp\open.pptx::password::")