Как запустить скрипт в iframe из расширения? - PullRequest
0 голосов
/ 24 марта 2020

Я работаю над расширением Chrome, которое должно собирать данные формы с веб-страницы, и это iframe. Проблема в том, что не все данные формы сразу доступны в iframe, но они появляются только при запуске скрипта. По какой-то причине я не могу вызвать сценарий и не могу понять, почему. Страницы находятся на одном сайте.

Я попытаюсь продемонстрировать ситуацию с помощью следующих фрагментов кода. Там скрипт на странице iframe просто меняет содержимое поля формы.

index. html (веб-страница)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>

<h1>INDEX1.HTML</h1>
<iframe id="iframe1" src="index2.html" style="width: 800px; height: 600px; border: 1px solid #aaa"></iframe>
<p><input id="input1" type="text" value="XYZ" /></p>

</body>
</html>

Поле формы на этой странице легко доступно из расширения.

index2. html (страница iframe)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<script>
function changeInput (n) {
    if (n == 1) document.getElementById('input2').value = 'ABC';
    else document.getElementById('input2').value = '123';
}
</script>
<body>

<h1>INDEX2.HTML</h1>
<p><button onclick="changeInput(1)">ABC</button>
<button onclick="changeInput(2)">123</button></p>
<p><input id="input2" type="text" value="ABC" /></p>

</body>
</html>

Нажатие кнопок изменяет значение поля формы. Однако я не могу запустить скрипт из расширения, и это проблема.

манифест. json

{
  "name": "Iframe-test",
  "version": "1.0",
  "manifest_version": 2,
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["content.js"],
      "all_frames": true
    }
  ],
  "browser_action": {
    "default_title": "Iframe-test",
    "default_popup": "popup.html"
  },
  "permissions": [ "tabs", "activeTab" ],
  "icons": { "16": "icon16.png",
      "32": "icon32.png",
      "48": "icon48.png",
      "128": "icon128.png" }
}

всплывающее окно. html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="popup.js"></script>
</head>
<body>

<p><input type="text" id="first" /></p>
<p><input type="text" id="second" /></p>
<p><input type="text" id="third" /></p>

</body>
</html>

Всплывающая страница расширения с полями для заполнения собранными данными.

popup. js

window.onload = function () {
    chrome.tabs.query({ currentWindow: true, active: true }, function (tabs) {
        chrome.tabs.sendMessage(tabs[0].id, null, function (response) {
            document.getElementById('first').value = response.value1;
            document.getElementById('second').value = response.value2;
            document.getElementById('third').value = response.value3;
        });
    }); 
};

Сценарий запускается после открытия всплывающего окна.

content. js

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
    val1 = document.getElementById('input1').value;
    val2 = document.getElementById('iframe1').contentWindow.document.getElementById('input2').value;
    document.getElementById('iframe1').contentWindow.changeInput(2);
    val3 = document.getElementById('iframe1').contentWindow.document.getElementById('input2').value;
    sendResponse({ value1: val1, value2: val2, value3: val3 });
});

Val1 собрано нормально, как и val2. Но затем сценарий не запускается, и val3 не может быть достигнут, и все это терпит неудачу. Когда я ввожу эти строки в журнал консоли, они работают нормально.

Могу поспорить, что это должно быть возможно, и где-то есть небольшая проблема, которую я просто не знаю, не вижу и не понимаю. Пожалуйста, укажите это для меня. Большое спасибо!

1 Ответ

0 голосов
/ 24 марта 2020

CORS означает Cross-Origin Resource Sharing

CORS предотвращает доступ кода к чему-то другому origin. origin - это источник, из которого выполняется код. Например, источником этой страницы является , и если я сделаю запрос к https://github.com, CORS заблокирует ее.

В качестве решения вы можете запустить версию chrome без CORS, и все должны работать без сбоев.

Чтобы запустить такую ​​версию, go в командной строке и введите "location\for\chrome" --disable-web-security --disable-gpu --user-data-dir=~/chromeTemp

...