2015-11-16 68 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的安全問題。

相關問題