Разработка расширений Chrome - POST для новой вкладки - PullRequest
13 голосов
/ 12 сентября 2011

Существует ли простое решение для динамического агрегирования данных POST в новую вкладку?

chrome.tabs.create не имеет опции «POST». Обычно я бы использовал

chrome.browserAction.onClicked.addListener(function (t) {
  chrome.tabs.create(
  {
    "url" : "http://super.url",
    "method" : "POST" // oops.. no option.
  });
});

Ответы [ 3 ]

15 голосов
/ 13 сентября 2011

Вы можете просто объединить эти два метода:

  1. Вы можете выполнять команды JavaScript, добавив префикс javascript: в адресную строку или в href значениях <a> тегов.
  2. Только с помощью JavaScript вы можете создать элемент формы и заполнить его своими данными, а затем ПОСТАВИТЬ.

.

function fakePost() {   
    var form = document.createElement("form");
    form.setAttribute("method", "post");
    form.setAttribute("action", "http://cvsguimaraes.altervista.org/fiddles/postcheck.php");
    var params = {userId: 2, action: "delete"};
    for(var key in params) {
        var hiddenField = document.createElement("input");
        hiddenField.setAttribute("type", "hidden");
        hiddenField.setAttribute("name", key);
        hiddenField.setAttribute("value", params[key]);
        form.appendChild(hiddenField);
    }
    document.body.appendChild(form); // Not sure if this step is necessary
    form.submit();
};
//minify function
fakePostCode = fakePost.toString().replace(/(\n|\t)/gm,'');

chrome.browserAction.onClicked.addListener(function (t) {
  chrome.tabs.create({"url" : "javascript:"+fakePostCode+"; fakePost();"});
});

Конечно, это просто грязный хак,Если вам нужно что-то лучше, вы можете использовать XHR Object или разработать что-то более похожее на ответ @ Xan ниже.

14 голосов
/ 15 мая 2014

Код в ответе cvsguimaraes работает для коротких строк данных, которые могут вписаться в URL. Как свидетельствует этот вопрос , это не всегда так.

Ответ Кенни Эвитта намекает на решение. Я сделал реализацию этого вопроса и нашел время, чтобы обобщить его. Я представляю это здесь.

Идея состоит в том, чтобы открыть страницу, связанную с расширением (post.html), предоставить ей необходимую информацию посредством обмена сообщениями и выполнить POST с этой страницы.

post.html

<html>
  <head>
    <title>Redirecting...</title>
  </head>
  <body>
    <h1>Redirecting...</h1>
    <!-- Decorate as you wish, this is a page that redirects to a final one -->
    <script src="post.js"></script>
  </body>
</html>

post.js

var onMessageHandler = function(message){
  // Ensure it is run only once, as we will try to message twice
  chrome.runtime.onMessage.removeListener(onMessageHandler);

  // code from https://stackoverflow.com/a/7404033/934239
  var form = document.createElement("form");
  form.setAttribute("method", "post");
  form.setAttribute("action", message.url);
  for(var key in message.data) {
    var hiddenField = document.createElement("input");
    hiddenField.setAttribute("type", "hidden");
    hiddenField.setAttribute("name", key);
    hiddenField.setAttribute("value", message.data[key]);
    form.appendChild(hiddenField);
  }
  document.body.appendChild(form);
  form.submit();
}

chrome.runtime.onMessage.addListener(onMessageHandler);

background.js (или другой сценарий без содержимого внутри расширения)

function postData(url, data) {
  chrome.tabs.create(
    { url: chrome.runtime.getURL("post.html") },
    function(tab) {
      var handler = function(tabId, changeInfo) {
        if(tabId === tab.id && changeInfo.status === "complete"){
          chrome.tabs.onUpdated.removeListener(handler);
          chrome.tabs.sendMessage(tabId, {url: url, data: data});
        }
      }

      // in case we're faster than page load (usually):
      chrome.tabs.onUpdated.addListener(handler);
      // just in case we're too late with the listener:
      chrome.tabs.sendMessage(tab.id, {url: url, data: data});
    }
  );  
}

// Usage:
postData("http://httpbin.org/post", {"hello": "world", "lorem": "ipsum"});

Обратите внимание на двойной обмен сообщениями: с помощью обратного вызова chrome.tabs.create мы не можем быть уверены, что слушатель готов, и мы не можем быть уверены, что загрузка еще не завершена (хотя в моем тестировании она все еще загружается). Но лучше, чем потом сожалеть.

1 голос
/ 12 сентября 2011

Из комментариев @Amman Cheval к ​​вопросу:

[отправьте] ваши динамические данные в фоновый файл, создав новую вкладку с формой.Заполните форму, используя форму, используя контент, используя фоновый файл, а затем отправьте форму.

Сначала прочитайте о скриптах содержимого в документации Google.Тогда прочитайте о передаче сообщений.После того как вы все поняли, было бы довольно просто отправить сообщение из сценария, в фоновый режим и в сценарий другой вкладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...