greasemonkey выдает SecurityError для простого скрипта - PullRequest
0 голосов
/ 28 марта 2020

Я новичок в greasemonkey и пытаюсь понять, чем greasemonkey отличается от встроенной веб-консоли. Простой скрипт, который отлично работает на веб-консоли, работает , а не на greasemonkey, и я понятия не имею, почему.

Среды

  • Firefox 74.0 на Arch Linux

  • Greasemonkey 4.9

Веб-консоль

Вот тестовый скрипт, который я использую:

(function() {
    "use strict";

    const w = window.open('https://www.google.com/', 'w');

    console.log("Hello");

    w.onload = () => {
        console.log("World");
    };

})();

Когда я получаю доступ к https://www.google.com/webhp?gl=us&hl=en&gws_rd=cr&pws=0 (главная страница Google США), скопируйте и вставьте скрипт в веб-консоль, а затем выполните его,

  1. Новое окно w открывается https://www.google.com/.

  2. Печатается строка Hello.

  3. Выводится строка World.

Все как положено.

Greasemonkey

На greasemonkey я использую приведенный ниже скрипт. Часть заголовка - единственное отличие.

// ==UserScript==
// @name     test
// @namespace n
// @match https://www.google.com/webhp?gl=us&hl=en&gws_rd=cr&pws=0
// ==/UserScript==

(function() {
    "use strict";

    const w = window.open('https://www.google.com/', 'w');

    console.log("Hello");

    w.onload = () => {
        console.log("World");
    };

})();

Когда я получаю доступ к https://www.google.com/webhp?gl=us&hl=en&gws_rd=cr&pws=0 (главная страница Google США),

  1. Новый открывается окно w загрузка https://www.google.com/.

  2. Печатается строка Hello.

  3. SecurityError выдается, говоря

    Ошибка сценария в [Greasemonkey script n / test]:
    SecurityError: В доступе запрещен доступ к свойству "onload" при проверке объекта между источниками: 42: 19
    user-script: n / test: 42

Когда я использую unsafeWindow вместо window,

  1. A открывается новое окно w загрузка https://www.google.com/.

  2. Печатается строка Hello.

  3. И больше ничего не происходит. (Нет ошибок, нет World)

Вопрос

Как мне изменить скрипт, чтобы он мог выполняться на greasemonkey?


Обновление

Согласно этому комментарию скрипт работает на Tampermonkey или Violentmonkey под Chrome.

Я не подтвердил это, но подтвердил, что скрипт работает на Tampermonkey 4.10.6105 или Violentmonkey 2.12.7 в Firefox.

1 Ответ

1 голос
/ 28 марта 2020

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

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

Это разделение предназначено для всех сценариев содержимого, а не только для GM. В противном случае это создало бы большую угрозу безопасности, если бы JS на одной вкладке / странице мог получить доступ к данным на других вкладках.

Обновление:

Как указано wOxxOm, CSP и политика перекрестного происхождения предотвращают Обмен ресурсами между источниками (CORS) .

В вашем примере, в Firefox, первая проблема заключается в том, что Firefox будет " Блокировать всплывающее окно windows "из содержимого скрипта.

Тестирование Firefox выделенный userScripts API на FireMonkey , после разрешения всплывающего окна, все еще вызывает ошибку:

SecurityError: Разрешение отклонено чтобы получить доступ к свойству "onload" на объекте перекрестного происхождения

В этом случае, я полагаю, это происходит из-за изолированной среды пользовательских скриптов для безопасности.

GM / TM / VM не используйте API-интерфейс userScripts и используйте другие средства для добавления пользовательских сценариев, что приводит к разным результатам.

...