2015-11-16 36 views
4

我正在将我的应用程序从WebKit移植到WebEngine(似乎这对于渲染angular-basad html来说更好)。 我面临的问题,我不能让QtWebEngine装载本地的iframe,尽管我设置,我发现所有可能的设置:QtWebEngine:iframe中的“不允许加载本地资源”,如何禁用web安全?

从mainwindow.cpp代码

view->page()->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessFileUrls, true); 
view->page()->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls, true); 
view->page()->settings()->setAttribute(QWebEngineSettings::LocalStorageEnabled, true); 

view->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessFileUrls, true); 
view->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls, true); 
view->settings()->setAttribute(QWebEngineSettings::LocalStorageEnabled, true); 

最简单的例子是采取WebEngine基于fancyBrowser(\实例\ Qt的5.4 \ webenginewidgets \ fancybrowser),并尝试在它加载本地HTML文件是这样的:

的index.html:

<html> 
<head> 
    <title>Hi there</title> 
</head> 
<body> 
    This is a page 
    a simple page 
    <iframe id="some_idrame" width="0" height="0" style="border: none" src="some_iframe.html" name="target" sandbox="allow-scripts"></iframe> 
</body> 
</html> 

some_iframe.html:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title>La-la-la</title> 
</head> 
<body> 
    Lalala 
</body> 
</html> 

如果你设置的环境变量QTWEBENGINE_REMOTE_DEBUGGING一些端口,那么你就可以打开127.0.0.1:port并查看控制台此错误:

"Not allowed to load local resource". 

我真的没有想法现在如何解决这个问题...应该有一些方法可以传递给WebEngine,如“--disable-web-security”...

感谢您的帮助!

+0

你怎么打开它在幻想浏览器?您是否输入了文件:// /index.html url? –

+0

另外,请粘贴完整的错误。 “不允许加载本地资源:XXXXXXXXXXXXX” 它抱怨的文件名称是什么? –

回答

0

另一种选择是从文件系统加载原始页面。我有从Qt的资源系统加载图像的问题,所以我子类QWebEngineView并创造了这个功能:

void WebEngineView::setLocalHtml(const QString &html) 
{ 
    if(html.isEmpty()) 
    { 
     setHtml(QString()); 
     return; 
    } 

    // Save html to a local file 
    QString filePath; 
    { 
     QTemporaryFile tempFile(QDir::toNativeSeparators(QDir::tempPath() + "/ehr_temp.XXXXXX.html")); 
     tempFile.setAutoRemove(false); 
     tempFile.open(); 
     QTextStream out(&tempFile); 
     out << html; 

     filePath = tempFile.fileName(); 
    } 

    // delete the file after it has been loaded 
    QMetaObject::Connection * const conn = new QMetaObject::Connection; 
    *conn = connect(this, &WebEngineView::loadFinished, [filePath, conn](){ 
     disconnect(*conn); 
     delete conn; 

     QFile::remove(filePath); 
    }); 

    load(QUrl::fromLocalFile(filePath)); 
} 

由于主网页是本地文件以及,这得到各地CORS的安全问题。

相关问题