Расширение Chrome не внедряет Javascript в iframe - PullRequest
1 голос
/ 27 февраля 2012

У меня есть сценарий содержимого, который, по сути, делает console.log, чтобы указать, что он был внедрен в страницу, и для моего manifest.json для all_frames установлено значение true.

В результате, если я перехожу к http://www.reddit.com/r/videos, я вижу сообщение за кадр, и если я нажимаю на видео, я также вижу сообщение, поступающее из сценария, вставленного в iframe видео. Это указывает мне на то, что если страница динамически модифицируется для включения iframe, в нее будет вставлен контент.

Когда я перехожу на http://www.html5video.org,, я получаю сообщение только из одного кадра, но если я смотрю на DOM, я вижу, что для видео есть фрейм, поэтому я ожидаю, что в него будет вставлен мой контент-скрипт. , но это не так.

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

Помощь приветствуется.

1 Ответ

4 голосов
/ 27 февраля 2012

Я подозреваю, что Chrome внедрит ваши скрипты контента в IFRAME, который является частью исходного источника страницы, как в случае с примером reddit.com - IFRAME являются частью исходной страницы, поэтому Chrome может и будет внедрять в них,Для ссылки html5video IFRAME не является частью исходного источника.Однако, если вы осмотрите элементы, вы увидите IFRAME, который подсказывает мне, что IFRAME был динамически загружен в DOM.Я вижу то же поведение с написанным мною расширением, поэтому оно выглядит непротиворечивым.

Если вам нужно внедрить в IFRAME, то, возможно, вы можете подключить событие создания DOM и выполнить требуемое действие:

document.addEventListener('DOMNodeInserted', onNodeInserted, false);

ОБНОВЛЕНИЕ:

Как насчет этого для http://html5video.org/ - используя следующий код content_script, я могу получить IFRAME, а затем тег VIDEO.Примечание: этот подход / концепция также должен работать очень хорошо для Reddit.

content_script.js

console.log("content script for: " + document.title);

var timer;

document.addEventListener('DOMNodeInserted', onNodeInserted, false);

function onNodeInserted(e)
{
    if(timer) clearTimeout(timer);
    timer = setTimeout("doSomething()", 250);
}

function doSomething()
{
    $media = $(".mwEmbedKalturaIframe");
    console.log($media);
    $video = $media.contents().find("video");
    console.log($video);
}

manifest.json

{
  // Required
  "name": "Foo Extension",
  "version": "0.0.1",

  // Recommended
  "description": "A plain text description",
  "icons": { "48": "foo.png" },
  //"default_locale": "en",

  // Pick one (or none)
  "browser_action": {
    "default_icon": "Foo.png", // optional
    "default_title": "Foo Extension"      // optional; shown in tooltip
    },

  "permissions": [ "http://*/", "https://*/", "tabs" ],

  "content_scripts": [
    {
      "matches": ["http://*/*", "https://*/*"],
      "js": ["jquery-1.7.1.min.js", "content_script.js" ],
      "run_at": "document_idle",
      "all_frames": true
    }
    ]
}

См. Также: jQuery / JavaScript: доступ к содержимому iframe

...