Как я могу предоставить ограниченный интерфейс для GMasexkey GM_xmlhttpRequest к Javascript моей страницы? - PullRequest
1 голос
/ 10 июня 2009

У меня есть пользовательский скрипт Greasemonkey, который выполняет большую часть своего кода в непривилегированном контексте, вставляя тег <script> следующим образом:

function code {
  ...
}

var script = document.createElement("script");
script.type = "application/javascript";
script.innerHTML = "(" + code + ")();";
document.body.appendChild(script);

Это позволяет избежать необходимости делать опасные вещи с unsafeWindow.

Однако мой код должен получать информацию от API в другом домене, который не поддерживает JSONP. GM_xmlhttpRequest может получить доступ к другим доменам, но доступен только в привилегированном контексте Greasemonkey.

Я хотел бы написать функцию, которая предоставляет ограниченный интерфейс и выполняет именно тот вызов API, который мне нужен, используя GM_xmlhttpRequest, а затем предоставляет эту (теоретически безопасную) функцию нормальному контексту страницы. Моя первая попытка была примерно такой:

unsafeWindow.foo = function() {
  console.log("Foo!");
  console.log(GM_xmlhttpRequest.toString());
  GM_xmlhttpRequest({
    method: "GET",
    url: "http://www.example.net/",
    headers: {
      "User-Agent": navigator.userAgent,
      "Accept": "text/html"
    },
    onload: function(response) {
      console.log(response);
      unsafeWindow.console.log(response);
      alert(response);
      unsafeWindow.alert(response);
    }
  });
  console.log("Bar!");
};

Интересно, что когда я звоню foo() из контекста страницы, я вижу "Foo!", Строковые GM_xmlhttpRequest и "Bar!" в логе консоли. Однако я никогда не получаю ответ в консоли или в предупреждении. Если я сам создаю GM_xmlhttpRequest в контексте GM, я получаю и предупреждения, и сообщения журнала.

Вопрос: возможно ли то, что я пытаюсь сделать? Или есть другой способ сделать то же самое?

1 Ответ

1 голос
/ 10 июня 2009

Aha! Ответ был отправлен на аналогичный вопрос .

Greasemonkey делает это очень намеренно и предоставляет простой обходной путь на странице 0.7.20080121.0 совместимости :

unsafeWindow.foo = function() {
  window.setTimeout(GM_xmlhttpRequest, 0, {
    // ...
  });
};

Это работает.

...