Создавать расширение Chrome делая инъекцию коду Javascript

В следующем изображении:

Cuadros de la consola de javascript de Google Chrome.

Возможно видеть следующие frames:

rp (rpframe)
op (check_session)
top
chrome-extension://ij..akgmfblomjnbfdcnoofoefjc

У меня есть проблема в javascript, я пробую создавать расширение Google Chrome, иду в top и я верю в так называемую дату variable.

var variable=new Date()

Но изменившись с frame top в chrome-extension://... я не могу соглашаться в дату variable.

Возможно соглашаться на стоимость variable с chrome-extension://... ?

Я, думая, что есть переменная, которая содержит все переменные поля ввода top, попробовал соглашаться на вещи как эта, window.variable, parent.variable, но оно не функционировало.

Добавочная информация, из-за которой Маурисио попросил у меня больше код, это manifest.json моего расширения, не точно так, но казавшийся:

{
    "content_scripts": [ {
    "all_frames": false, //Esto hace que mi script se ejecute solo en top.
        "js": [
            "JSON pruned.js", //Librería que convierte a cadena un objeto recursivo.
            "programa.js", //Mi programa.
            ...
        ],
        "matches": [ "*://*.ejemplo.com/*" ],
        "run_at": "document_end"
    } ],
    "description": "Ejemplo.",
    "homepage_url": "http://ejemplo.com/index.html",
    "icons": {
        ...
    },
    "browser_action": {
        "default_icon": {
            ...
        }
    },
    "manifest_version": 2,
    "minimum_chrome_version": "32",
    "name": "Ejemplo",
    "permissions": [ "storage", "http://*/", "https://*/" ],
    "update_url": "https://clients2.google.com/service/update2/crx",
    "version": "1"
}

3
задан 20.03.2017, 13:17
2 ответа

Привет ArtEze!

То, что происходит, состоит в том, что content scripts работают в песчаном ящике, и хотя они могут работать с DOM страницы, есть некие вещи, что не как переменная window.

Я перевожу тебе (и я приспосабливаю немного в твой вопрос) великолепный ответ, который дал Роб W в StackOverflow:


content scripts работают в изолированной среде. Это значит, что, если ты хочешь согласиться на все то, что есть в среде top, ты должен делать инъекцию твоему коду Javascript на самой странице.

Конечно, когда ты захочешь использовать одну из API Chrome (chrome.*) в рукописном шрифте, ты будешь должен осуществлять специальный event handler, как он описывается в этом ответе: Chrome расширение - retrieving первоначальный Gmail's message.

Иначе, если ты не должен использовать АПИС де Чроме, я рекомендую тебе делать инъекцию всему твоему коду JS посредством этикетки <script> динамика:

Таблица контентов

  • Метод 1: Делать инъекцию другому файлу
  • Метод 2: Делать инъекцию впитанному коду
  • Метод 2b: Используя функцию
  • Метод 3: Используя онлайновое событие
  • Динамическая стоимость во введенном коде

Метод 1: Делать инъекцию другому файлу

Это лучший метод и самый легкий, когда у тебя есть куча кода. Включи твой код JS в файл, например script.js. После способствуй тому, чтобы твой content рукописный шрифт был следующим (объясненный здесь: https://stackoverflow.com / в / 9310273/938089? google - chome-application-shortcut-custom-javascript):

var s = document.createElement('script');
// TODO: añadir "script.js" a web_accessible_resources en manifest.json
s.src = chrome.extension.getURL('script.js');
s.onload = function() {
    this.remove();
};
(document.head || document.documentElement).appendChild(s);

Заметь: если ты используешь этот метод, ты должен добавлять файл script.js в секцию "web_accessible_resources" (пример). Если ты это не сделаешь, Chrome не позволит тебе загружать твой рукописный шрифт и покажет следующую ошибку в консоли:

Denying похвалите of chrome-extension://[EXTENSIONID] / script.js. Resources must be listed in the web_accessible_resources manifest key in order to be loaded by pages outside the расширение.

Метод 2: Делать инъекцию впитанному коду

Этот метод полезный, если ты хочешь выполнить быстро маленький кусок кода. (см. также: How to disable facebook hotkeys with Chrome расширение?).

var actualCode = `// El código aquí
// Si quieres usar una variable, usa $ y claudators.
// Por ejemplo, para usar un número aleatorio fijo:
var someFixedRandomValue = ${ Math.random() };
// NOTA: No insertes variables inseguras de esta manera, mira abajo
// en la sección "Valores dinámicos en el código inyectado"
`;

var script = document.createElement('script');
script.textContent = actualCode;
(document.head||document.documentElement).appendChild(script);
script.remove();

Заметь: буквальные шаблоны вынесены начиная с Chrome 41. Если ты хочешь, чтобы твое расширение функционировало в Chrome 40, - используй:

var actualCode = ['/* El código aquí. Ejemplo: */' + 'alert(0);',
                  '// ¡Cuidado! Este array se tiene que unir',
                  '// usando una línea nueva. Si no, si faltan',
                  '// puntos y comas o hay comentarios de una',
                  '// sola línea (//) tucódigo estará patas arriba',
                  '// y no funcionará. ----->'].join('\n');

Метод 2b: Используя функцию

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

var actualCode = '(' + function() {
    // Todo el código se ejecuta en el scope local.
    // Por ejemplo, lo siguiente no sobreescribe el método global `alert`
    var alert = null;
    // Para sobreescribir una variable global, prefijar `window`:
    window.alert = null;
} + ')();';
var script = document.createElement('script');
script.textContent = actualCode;
(document.head||document.documentElement).appendChild(script);
script.remove();

Этот метод функционирует, потому что оператор + использованный с цепями символов и функции обрати все объекты в цепь символов. Если ты будешь использовать эту функцию больше одного раза, он состоит мудрецам в том, чтобы создавать функцию, чтобы предотвращать повторение кода. Осуществление могло бы быть следующим:

function injectScript(func) {
    var actualCode = '(' + func + ')();'
    ...
}
injectScript(function() {
   alert("Script inyectado");
});

Заметь: Как функция последовательно преобразована, первоначальный scope и все прикладные свойства теряются.

var scriptToInject = function() {
    console.log(typeof scriptToInject);
};
injectScript(scriptToInject);
// Salida de la consola:  "undefined"

Метод 3: Используя онлайновое событие

Иногда, ты хочешь выполнить код немедленно, например чтобы выполнять код до того, как был создан элемент <head>. Ты можешь выполнять "síncronamente" язык сценариев JavaScript используя детекторы событий. Цепи символов произведены таким же образом как в предыдущем методе, так что для краткости, я понимаю, что цепь символов кода уже встречается как переменная actualCode (см. метод 2/2b).

var actualCode = '// Código de ejemplo \n' + 
                 'console.log(document.documentElement.outerHTML);';

document.documentElement.setAttribute('onreset', actualCode);
document.documentElement.dispatchEvent(new CustomEvent('reset'));
document.documentElement.removeAttribute('onreset');

Заметь: Этот метод понимает, что нет больше детекторов глобальных событий, которые обнаруживают событие reset. Если они есть, также ты можешь выбирать другой из глобальных событий. Открой консоль Хаваскрипт (F12), напиши document.documentElement.on, и выбери другой из доступных событий.

Динамическая стоимость во введенном коде

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

var SALUDO = "Hi, I'm ";
var NOMBRE = "Rob";
var scriptToInject = function() {
    alert(SALUDO + NOMBRE);
};

Чтобы делать инъекцию этому коду, ты нуждаешься в том, чтобы переместить переменные как аргументы в анонимную функцию. Убедись осуществления этого правильно! Следующее не будет функционировать:

var scriptToInject = function (SALUDO, NOMBRE) { ... };
var actualCode = '(' + scriptToInject + ')(' + SALUDO + ',' + NOMBRE ')';
// Lo anterior funcionará para números y verdadero/falso, pero no para cadenas de caracteres.
// Para saber por qué, echa un vistazo a la resultante cadena de caracteres:
var actualCode = "(function(GREETING, NAME) {...})(Hi I'm,Rob)";
//                                                 ^^^^^^ ^^^ ¡No es una cadena de caracteres literal!

Решение состоит в том, чтобы использовать JSON.stringify перед тем, как перемещать аргумент. Например:

var actualCode = '(' + function(saludo, nombre) { ...
} + ')(' + JSON.stringify(SALUDO) + ',' + JSON.stringify(NOMBRE) + ')';

Если у тебя есть многообразные переменные, стой больше горе использовать JSON.stringify однажды, чтобы улучшать читабельность, например:

...
} + ')(' + JSON.stringify([arg1, arg2, arg3, arg4]) + ')';

Привет :-)

7
ответ дан 24.11.2019, 13:27

Напротив этой проблемы у меня есть одна soluciГіn немного incГіmoda, плохое состоит в том, что он требует, чтобы пользователь двинул мышь, так как он использует onmousemove, в этом случае посредника localStorage.

Она soluciГіn этот, в HTML я это помещаю.

<html>
    <body>
    </body>
</html>

В programa.js я это помещаю, нужно иметь в виду, что я могу соглашаться на html, но не прямой формы в переменные.

function función_1(funciones)
{
    variable_storage=JSON.stringify(variable)
    localStorage.setItem("variable_storage",variable_storage)
}
function intentando_acceder()
{
    var acceso_fecha
    try
    {
        acceso_fecha=localStorage.getItem("variable_storage")
    }
    catch(e)
    {
            setTimeout(intentando_acceder,1000)
    }
    if(acceso_fecha!=null)
    {
            alert(acceso_fecha)
    }
}
function intercambio()
{
    document.body.setAttribute("onmousemove","("+función_1+")()")
    setTimeout(intentando_acceder,1000)
}
intercambio()
1
ответ дан 24.11.2019, 13:27
  • 1
    @Mariano extensi и # 243; n выполни programa.js, тогда я показываю стоимость даты variable, двинув мышь в body, сначала помещаю переменную в localStorage и потом body это читает ах и # 237;. – ArtEze 11.09.2016, 12:09

Теги

Похожие вопросы