Google chrome extension 请求iframe内的屏幕共享
我已经构建了一个Chrome扩展,它成功地实现了与WebRTC的屏幕共享,但是对于使用该扩展在iframe中运行的站点有一个要求Google chrome extension 请求iframe内的屏幕共享,google-chrome-extension,google-chrome-app,Google Chrome Extension,Google Chrome App,我已经构建了一个Chrome扩展,它成功地实现了与WebRTC的屏幕共享,但是对于使用该扩展在iframe中运行的站点有一个要求 function getUserScreen(sources, extensionId) { const request = { type: 'getUserScreen', sources: sources }; return new Promise((resolve, reject) =>
function getUserScreen(sources, extensionId) {
const request = {
type: 'getUserScreen',
sources: sources
};
return new Promise((resolve, reject) => {
chrome.runtime.sendMessage(extensionId, request, response => {
switch (response && response.type) {
case 'success':
log('success!');
resolve(response.streamId);
break;
case 'error':
log('error!');
reject(new Error(error.message));
break;
default:
log('unknown!');
reject(new Error('Unknown response'));
break;
}
});
}).then(streamId => {
return navigator.mediaDevices.getUserMedia({
video: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: streamId,
maxWidth: window.screen.width,
maxHeight: window.screen.height
}
}
});
});
}
有可能做到这一点吗?下面是我的一个代码示例——“未知”情况在iframe中始终执行
function getUserScreen(sources, extensionId) {
const request = {
type: 'getUserScreen',
sources: sources
};
return new Promise((resolve, reject) => {
chrome.runtime.sendMessage(extensionId, request, response => {
switch (response && response.type) {
case 'success':
log('success!');
resolve(response.streamId);
break;
case 'error':
log('error!');
reject(new Error(error.message));
break;
default:
log('unknown!');
reject(new Error('Unknown response'));
break;
}
});
}).then(streamId => {
return navigator.mediaDevices.getUserMedia({
video: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: streamId,
maxWidth: window.screen.width,
maxHeight: window.screen.height
}
}
});
});
}
一种方法是使用
消息
事件。通过“message”事件,IFrame可以用来与网页进行通信,因此它还可以与扩展可能在该网页上执行的任何内容脚本进行通信;谷歌推荐这种方法,如下所示:
从iframe来看,它看起来像这样:
var msg = { type: "CUSTOM_FROM_IFRAME", data: "Say hi." };
parent.postMessage(msg, "*");
window.addEventListener("message", ev=>{
if(ev.type == "CUSTOM_FROM_CONTENTSCRIPT") console.log("can proceed");
});
内容脚本:
window.addEventListener("message", ev=>
{
if(ev.type == "CUSTOM_FROM_IFRAME")
chrome.runtime.sendMessage({type: ev.type, data: ev.data}, response => {
myIFrame_element.contentWindow.postMessage({type: "CUSTOM_FROM_CONTENTSCRIPT", data: response.data}, "*"); });
});
从后台页面执行内容脚本代码:
chrome.tabs.executeScript(mypgage_tab_id, {src: contentscript.js});
你解决了这个问题吗?