Как извлечь глобальную переменную контекста из строки, используя GreaseMonkey / ViolentMonkey? - PullRequest
1 голос
/ 22 января 2020

При попытке извлечь переменную, определенную в глобальном контексте (обычно window), из строки в Javascript, я знаю, что вы можете просто сделать это так:

var testVar = 123;
console.log(window["testVar"]); // logs "123"

Однако внутри Пользовательский скрипт с введенным контентом, который я написал для ViolentMonkey, просто возвращает undefined, по-видимому, потому что глобальный контекст там работает иначе, чем в обычном скрипте страницы. Я пробовал разные способы доступа к глобальному контексту:

// ==UserScript==
// @name        Test
// @namespace   *
// @include     *
// @version     1
// @inject-into content
// @grant       none
// ==/UserScript==

var testVar = 123;

console.log(testVar); // logs "123"
console.log(window.testVar); // logs "undefined"
console.log(window["testVar"]); // logs "undefined"
console.log(this["testVar"]); // logs "undefined"
console.log(unsafeWindow["testVar"]); // logs "undefined"

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

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

Если возможно, я бы хотел избежать определения классов в пространствах имен, что было бы для меня рефакторингом ада, или использование eval по понятным причинам.

РЕДАКТИРОВАТЬ: Я также просматривал протестированные объекты контекста сверху в консоли, ни один из которых не содержит никаких следов переменной, которую я пытаюсь получить.

1 Ответ

0 голосов
/ 22 января 2020

Какой браузер вы используете?
Существуют некоторые поведенческие различия между Chrome & Firefox. Например:

В Chrome, eval() всегда запускает код в контексте скрипта содержимого, а не в контексте страницы.

В Firefox:

  • Если вы вызываете eval(), он запускает код в контексте скрипта содержимого.
  • Если вы вызываете window.eval(), он запускает код в контекст страницы.

source: Использование eval () в скриптах содержимого

var является глобальным в своей области.

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

AFAIK Песочница GreaseMonkey / ViolentMonkey / TamperMonkey для каждого пользовательского скрипта, в то время как FireMonkey (только Firefox) использует специальный API-интерфейс пользователя, который создает безопасную область для каждого пользовательского скрипта.

Следовательно, var testVar = 123; виден только в области содержимого сценария.

window объект - это общий объект, который содержит как область пользователя, так и область страницы.

Например:

var testVar = 123;
console.log(testVar);         // logs "123"
console.log(window.testVar);  // logs "undefined"



window.testVar = 456;

console.log(testVar);         // logs "123"
console.log(window.testVar);  // logs "456"

Примечание: протестировано с FireMonkey

, пытающимся получить переменную, определенную в глобальном контексте (обычно в окне)

Для получения переменной, определенной в контексте страницы (в отличие от ее установки), есть несколько опций, которые зависят от ситуации:

@ require

@require также необходимо ввести в ame context / scope как пользовательский сценарий, который ему требуется, то есть область содержимого, выполняемая менеджерами сценариев.

Чтобы ответить более точно, необходимо увидеть действительный код.

...