2015-05-13 2 views
2

Я вставил iframe из сценария контента. Он работает нормально. Но если я хочу отображать содержимое html родителя в iframe, я должен использовать обмен сообщениями для обмена данными между iframe и скриптом контента, но он не работает. Затем я пытаюсь отправить сообщение из iframe на «страницу событий», затем в «сценарий содержимого». Когда контент-скрипт получит сообщение, он запросит содержимое html и ответит. Это тоже не работает. Как я могу заставить его работать?Расширение Chrome, отправляющее сообщение от iFrame до страницы событий, затем в сценарий содержимого

сценарий Содержание: стр

var iframe = document.createElement('iframe'); 
iframe.id = "popup"; 
iframe.src = chrome.runtime.getURL('frame.html'); 
document.body.appendChild(iframe); 

chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { 
    if (msg.from === 'event' && msg.method == 'ping') { 
    sendResponse({ data: 'pong' }); 
    } 
}); 

событие:

chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { 
    if (msg.from === 'popup' && msg.method === 'ping') { 
    chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
     chrome.tabs.sendMessage(tabs[0].id, { 
     from: 'event', 
     method:'ping'}, function(response) { 
      sendResponse(response.data); 
     }); 
    }); 
    } 
}); 

frame.js

// This callback function is never called, so no response is returned. 
// But I can see message's sent successfully to event page from logs. 
chrome.runtime.sendMessage({from: 'popup', method:'ping'}, 
    function(response) { 
    $timeout(function(){ 
    $scope.welcomeMsg = response; 
    }, 0); 
}); 

ответ

2

Я нашел RELAT вопрос. https://stackoverflow.com/a/20077854/772481

Из документации chrome.runtime.onMessage.addListener:

Эта функция становится недействительным, когда возвращается слушатель событий, если вы не вернете истинное от слушателя событий, чтобы указать, что вы хотите отправить ответ асинхронно (это будет поддерживать канал сообщений открытым до другого конца до тех пор, пока не будет вызван вызов sendResponse).

Поэтому я должен вернуть true, чтобы указать, что sendResponse является асинхронным.

страница событие:

chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { 
    if (msg.from === 'popup' && msg.method === 'ping') { 
    chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
     chrome.tabs.sendMessage(tabs[0].id, { 
     from: 'event', 
     method:'ping'}, function(response) { 
      sendResponse(response.data); 
     }); 
    }); 
    return true; // <-- Indicate that sendResponse will be async 
    } 
}); 
Смежные вопросы