Есть ли в песочнице «контентные» скрипты расширения Google Chrome? - PullRequest
6 голосов
/ 18 апреля 2010

У меня сложилось впечатление, что content_scripts был выполнен прямо на странице, но теперь кажется, что происходит какая-то песочница.

Я работаю над расширением для регистрации всего трафика XHR сайта (для отладки и других целей разработки), и в консоли работает следующий снифф-код:

 var o = window.XMLHttpRequest.prototype.open;
 window.XMLHttpRequest.prototype.open = function(){
     console.log(arguments, 'open');
     return o.apply(this, arguments);
 };
 console.log('myopen');
 console.log(window, window.XMLHttpRequest, window.XMLHttpRequest.prototype, o, window.XMLHttpRequest.prototype.open);

Это регистрирует сообщение каждый раз, когда отправляется XHR. Когда я помещаю это в расширение, реальный прототип не изменяется. Очевидно, что window.XMLHttpRequest.prototype, который видит мой скрипт, отличается от такового на реальной странице.

Есть ли способ обойти это? Кроме того, это поведение песочницы зарегистрировано где-нибудь? Я оглянулся, но ничего не смог найти.

Ответы [ 2 ]

8 голосов
/ 14 января 2015

Несмотря на то, что Chrome Content Script живет в «изолированном мире», вы можете сделать что-то похожее на то, что вы просили, вставив элемент script в dom.

В качестве подтверждения концепции я использовал расширение TamperMonkey Chrome и создал этот скрипт:

// ==UserScript==
// @name         Modify Secret
// @namespace    http://your.homepage/
// @version      0.1
// @description  enter something useful
// @author       You
// @match        https://*/*
// @match        http://*/*
// @grant        none
// ==/UserScript==

console.log(secret);

var el = document.createElement('script');
el.innerHTML = 'secret = "the blue dog"';
document.body.appendChild(el);

Затем я перешел на http://s.codepen.io/boomerang/745009c49e60974cf9dba1b070f27d111458064000840/index.html, на котором запущен этот JavaScript:

var secret = 'the brown fox';

var secretPrinter = setInterval(function () {
    console.log(secret);
}, 1000);

Если вы осмотрите консоль, можно ожидать, что «коричневая лиса» будет постоянно печататься, но вместо этого у нас будет «голубая собака».


В целом, я думаю, что концепция безопасности, которую пытается реализовать браузер, состоит в том, чтобы предотвратить доступ среды среды страницы к среде скрипта контента. Понимая это, неудивительно, что вы можете сделать что-то подобное с помощью расширения для браузера.

6 голосов
/ 19 апреля 2010

Вы не можете этого сделать. Согласно документации :

Однако у скриптов контента есть некоторые ограничения. Они не могут:

  • Использовать Chrome. * API (кроме частей chrome.extension)
  • Использовать переменные или функции, определенные на страницах их расширения
  • Использование переменных или функций, определенных веб-страницами или другими скриптами содержимого
  • Создание межсайтовых XMLHttpRequests
...