javascript расширение Google Chrome, если iframe не может проверить contentWindow - PullRequest
1 голос
/ 27 августа 2011

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

document.getElementById("td_messages_show").getElementsByTagName("iframe")[0].contentWindow.document;

Но если я открою отладчик и выполню ту же команду из командной строки, он вернет «Документ» с соответствующим содержимым. Сначала я подумал, что это потому, что кадр не был загружен, поэтому я нашел такой фрагмент и попытался его использовать.

function wait4Iframe2Load() {
   // Get a handle to the iframe element
   //console.log('Checking for null myFrame');
    var myFrame = document.getElementById("td_messages_show").getElementsByTagName("iframe")[0].contentWindow;
    if (myFrame!=null) 
    {
        console.log(myFrame);
       // Check if loading is complete
       if ( myFrame.document.readyState == 'complete' ) {
          // The loading is complete, call the function we want executed once the iframe is loaded
          console.log('Loading Complete');
          //frameContent=document.getElementById("td_messages_show").getElementsByTagName("iframe")[0].contentWindow.document.getElementsByTagName('tbody')[0];
          return;
       }
       else alert(" Frame is Not Loaded");
    }
    else myFrame = document.getElementById("td_messages_show").getElementsByTagName("iframe")[0].contentWindow;
   // If we are here, it is not loaded. Set things up so we check the status again in 100 milliseconds
   console.log('Waiting for frame to load...');
   window.setTimeout('wait4Iframe2Load()', 100);      
}

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

У кого-нибудь есть идеи, как решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 29 августа 2011

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

Как я понимаю, у этого фрейма есть определенный заранее известный URL, поэтому вы можете просто вставить скрипт через манифест (используйте опцию all_frames).

Если по какой-то причине вам нужно динамически ввести его, то есть:

chrome.tabs.executeScript(tabId, {allFrames: true});

Он будет вставлен в родительские страницы и страницы iframe. Затем внутри встроенного скрипта контента вы можете проверить, работает ли он внутри правильного iframe. Например, ваш динамически внедренный скрипт контента может выглядеть следующим образом (если вы внедрите его, хотя проверка URL-адреса манифеста не понадобится):

if(window.location.href == "http://iframe.example.com/" && window != window.top) {
    //we are in the right page that is embedded as iframe, do stuff
} else {
    //do nothing
}
0 голосов
/ 11 февраля 2012

Я создал эту библиотеку:

https://github.com/attachmentsme/Queuebert

для упрощения связи между вкладками браузера, фоновым процессом расширения и фреймами.

Вариант использования, с которым я столкнулся, был:

  • действие выполняется в одном фрейме.
  • результаты должны отображаться в альтернативном фрейме.

Делать это может быть больно, поэтому абстракция, которую я построил.

0 голосов
/ 05 января 2012

Извините, у вас есть решение, Джером?У меня та же проблема, что и у вас.Но я не могу комментировать ваш пост.Поэтому, пожалуйста, не возражайте, потому что это вопрос ...

Отредактировано:

Наконец-то я все заработал.Я не понимаю, в то время как флаг all_frames: true в manifest.json не затрагивается.Мне нужно кодировать как @ serg's:

chrome.tabs.executeScript(tabId, {allFrames:true, file:"content_script.js"})

Спасибо всем, и не могли бы вы принять ответ @ serg как правильный, Джером?: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...