Разширението на Chrome не инжектира Javascript в iframe

Имам contentscript, който по същество прави console.log, за да покаже, че е бил инжектиран в страница, и моят manifest.json има all_frames, зададен на true.

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

Когато отида на http://www.html5video.org, получавам съобщение само от един кадър, но ако Гледам DOM и виждам, че има iframe за видеото, така че бих очаквал моят contentscript да бъде инжектиран в него, но не е така.

Крайната ми цел е да получа селектор за видеоклипа на страницата и бих очаквал да мога да го направя чрез инжектиране на код, който го търси в iframe.

Помощта се оценява.


person Jared Sohn    schedule 26.02.2012    source източник


Отговори (1)


Подозирам, че Chrome ще инжектира вашите скриптове за съдържание във IFRAME, който е част от оригиналния източник на страница, какъвто е случаят с примера на reddit.com - IFRAME са част от оригиналната страница, така че Chrome може и ще инжектира в тях. За връзката html5video IFRAME не е част от оригиналния източник. Въпреки това, ако проверите елементите, можете да видите IFRAME, което ми подсказва, че IFRAME е динамично заредено в DOM. Виждам същото поведение с разширение, което съм написал, така че изглежда последователно.

Ако трябва да инжектирате в IFRAME, тогава може би можете да закачите събитието за създаване на DOM и да предприемете действието, от което се нуждаете:

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

АКТУАЛИЗАЦИЯ:

Какво ще кажете за това за http://html5video.org/ - използвайки следния код content_script мога да получа IFRAME и след това ВИДЕО етикет. Забележка: Този подход/концепция също трябва да работи доста добре и за 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

person RidingTheRails    schedule 27.02.2012
comment
Единственият IFRAME, присъстващ в примера на reddit преди щракване, е за рекламите. IFRAME за всеки медиен елемент се създава динамично, когато щракнете върху бутона „възпроизвеждане на видео“; Не виждам разлика. Не мисля, че добавянето на слушателя на събития ще работи, защото трябва да имам достъп до съдържанието вътре в IFRAME, което мисля, че мога да направя само като инжектирам contentscript вътре в него. (Вярвам, че видях доклад за грешка в crbug, който гласи, че не можете да видите съдържанието на IFRAMES в рамките на страница от родителя в contentscript.) - person Jared Sohn; 27.02.2012
comment
Освен това моят contentscript отваря връзка към порт към фоновата страница, така че имам възможността да стартирам повторно моя contentscript чрез команда в изскачащото меню. Самото търсене в JQuery за ‹VIDEO› не намира нищо. - person Jared Sohn; 27.02.2012
comment
Съжалявам за закъснението; беше на почивка. Вашият код работи за мен, което ме убеждава, че трябва да мога да конвертирам кода ви в общо решение за моето приложение. Също така ще проучи защо кодът, който написах по-рано, не работи, но вашият код работи. - person Jared Sohn; 07.04.2012
comment
Актуализация: Ако погледнете съдържанието на събитието за мутация на DOM, то всъщност е причинено от приспособление за twitter, а не от зареждането на iframe. По принцип причината, поради която кодът ми работи добре за reddit.com/r/videos, е, че вградените рамки са за различни сайтове, така че моят скрипт за съдържание се инжектира в него, но на html5video.org той е на същия сайт, така че contentscript не е инжектирани. Истинският проблем беше, че търсих видео в страницата чрез код като този: $(document).find(video).each( function(i) { actOnVideo(this); }); когато (продължение...) - person Jared Sohn; 25.04.2012
comment
когато трябва да включа така: $(document).find(iframe).each(function(i){ $(this).contents().find(video).each( function(j) { actOnVideo(this) });});}); така че селекторът да може да намира случаи, в които видео маркерът се показва във вградена рамка. Освен това трябва да направя това рекурсивно, в случай че има подредени вградени рамки. - person Jared Sohn; 25.04.2012
comment
Интересно е да се знае, че събитието за мутация е от джаджата на Twitter. Изглежда, че имате добро решение и това, което казахте в последния коментар, изглежда добре. Благодаря за споделянето на актуализацията. - person RidingTheRails; 25.04.2012
comment
Актуализация: Мисля, че по-ранните ми разсъждения за това в кои вградени рамки се инжектира contentscript бяха неправилни. Ако отидете на gmail.com, ще видите, че има три вграждания (програма за качване, звук за чат и нещо, свързано с медиите) и всяко съществува в различен iframe със същия домейн. В момента забелязвам, че моят contentscript е инжектиран в програмата за качване и медийните, но не и в тази за звука на чата. (Въпреки че ако рестартирам разширението, след като страницата е заредена, то инжектира и звука за чат.) - person Jared Sohn; 01.06.2012
comment
Четох другаде, че contentscripts се инжектират във всички iframe с изключение на тези, които нямат източник или имат източник, зададен на about:blank. Това би обяснило защо не се инжектира в html5video.org, но не обяснява защо изпитвам проблеми със звука на чата в gmail. В момента си мисля, че проблемът може да е в това, че iframe на звука за чат се създава динамично (докато другите не са), въпреки че моето разбиране е, че той все още ще инжектира contentscripts в тези раздели (както прави в reddit/r/videos .) - person Jared Sohn; 01.06.2012