升级电子从4.1.4到5.0.0后,我得到了这个错误
阻止原点为“file://”的帧访问跨原点帧。at HTMLIFrameElement.preload(renderer.js:31:78)
我添加了new BrowserWindow({ webPreferences })
,如这里所示,但这个错误仍然存在。
这是我的index.html
<html>
<head>
<meta charset="UTF-8">
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon"/>
</head>
<body>
<iframe data-bind="visible: showIframe, attr:{src:appUrl}" allow="autoplay; geolocation; microphone; camera" allowfullscreen></iframe>
</body>
<script>
require('./renderer.js');
</script>
</html>
字符串
下面是来自main.js的一些代码
const {
autoUpdater
} = require('electron-updater');
const platform = require('os').platform();
const electron = require('electron');
const fs = require('fs-extra');
const CronJob = require('cron').CronJob;
const {
app,
BrowserWindow,
Tray,
Menu,
ipcMain
} = electron;
const path = require('path');
const url = require('url');
const {
appConf, uiConf
} = require('./config.json');
// Deep linked url
let deeplinkingUrl;
//global reference for main window
let mainWindow = null;
let mainWindowWidth = 1100;
let mainWindowHeight = 650;
if (uiConf.width) {
mainWindowWidth = uiConf.width;
}
if (uiConf.height) {
mainWindowHeight = uiConf.height;
}
app.on('ready', (e) => {
createWindow();
});
/**
* creating main window for app
*/
function createWindow () {
// Create the browser window.
mainWindow = new BrowserWindow({
webPreferences: {
nodeIntegration: true,
webSecurity: false
},
minWidth: mainWindowWidth,
width: mainWindowWidth,
minHeight: mainWindowHeight,
height: mainWindowHeight,
icon: path.join(__dirname, appConf.appIcon),
title: appConf.appName,
show: false
});
mainWindow.once('ready-to-show', () => {
mainWindow.show();
});
mainWindow.setMenu(null);
// and load the index.html of the app.
mainWindow.loadURL(url.format({
pathname: path.join(__dirname, 'index.html'),
protocol: 'file:',
slashes: true
}));
// Open the DevTools.
mainWindow.webContents.openDevTools();
}
型
这是我的renderer.js
(function () {
const {
ipcRenderer,
shell
} = require('electron');
const {
appConf
} = require('./config.json');
const checkInternetConnected = require('check-internet-connected');
/*
* For screenshare
*/
var appFrame = document.getElementsByTagName('iframe')[0];
function preload() {
document.getElementsByTagName('iframe')[0].contentWindow.desktopCapturer = require('electron').desktopCapturer;
document.getElementsByTagName('iframe')[0].contentWindow.electronOpenUrl = openUrlElectron;
document.getElementsByTagName('iframe')[0].contentWindow.deviceType = 'win';
}
appFrame.addEventListener('load', preload);
function sendToIFrame(type, data) {
appFrame.contentWindow.postMessage({
type: type,
data: data
}, "*");
}
function openUrlElectron(url) {
shell.openExternal(url);
}
// codes...
// codes...
// codes...
})();
型
应用程序现在工作正常,但我知道我的desktopCapturer不会工作。我认为contentWindow脚本提升导致了这个问题或我不知道的东西。
2条答案
按热度按时间oymdgrw71#
在Chrome 67默认启用站点隔离安全功能后,这是一个已知的问题,并且它会反映在任何使用包含它的Chromium版本的框架中(例如电子5+)
http://www.chromium.org/Home/chromium-security/site-isolation
使用--disable-web-security进行调试时,可能还需要禁用站点隔离(使用--disable-features=IsolateOrigins,site-per-process)以访问跨源帧。
这里有一些关于它的公开问题
https://github.com/electron/electron/issues/18214的
https://github.com/cypress-io/cypress/issues/1951的
在Electron 5+中,直到解决了这个问题,您可以在应用程序'ready'事件之前添加此行
字符串
dxpyg8gm2#
我以前遇到过这个错误,我通过设置
nodeIntegration
=false
修复了它,这允许处理跨域请求。这样做的一个副作用是inter-process communication将不再工作,但我发现了一种使用预加载脚本的方法(如果您希望我详细说明,请告诉我)。