<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>browserapplication.cpp Example File | Qt WebEngine 5.9</title> <link rel="stylesheet" type="text/css" href="style/offline-simple.css" /> <script type="text/javascript"> document.getElementsByTagName("link").item(0).setAttribute("href", "style/offline.css"); // loading style sheet breaks anchors that were jumped to before // so force jumping to anchor again setTimeout(function() { var anchor = location.hash; // need to jump to different anchor first (e.g. none) location.hash = "#"; setTimeout(function() { location.hash = anchor; }, 0); }, 0); </script> </head> <body> <div class="header" id="qtdocheader"> <div class="main"> <div class="main-rounded"> <div class="navigationbar"> <table><tr> <td >Qt 5.9</td><td ><a href="qtwebengine-index.html">Qt WebEngine</a></td><td ><a href="qtwebengine-webenginewidgets-demobrowser-example.html">WebEngine Demo Browser Example</a></td><td >browserapplication.cpp Example File</td></tr></table><table class="buildversion"><tr> <td id="buildversion" width="100%" align="right">Qt 5.9.4 Reference Documentation</td> </tr></table> </div> </div> <div class="content"> <div class="line"> <div class="content mainContent"> <div class="sidebar"><div class="sidebar-content" id="sidebar-content"></div></div> <h1 class="title">browserapplication.cpp Example File</h1> <span class="subtitle">webenginewidgets/demobrowser/browserapplication.cpp</span> <!-- $$$webenginewidgets/demobrowser/browserapplication.cpp-description --> <div class="descr"> <a name="details"></a> <pre class="cpp"> <span class="comment">/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, you may use this file under the terms of the BSD license ** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of The Qt Company Ltd nor the names of its ** contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/</span> <span class="preprocessor">#include "browserapplication.h"</span> <span class="preprocessor">#include "bookmarks.h"</span> <span class="preprocessor">#include "browsermainwindow.h"</span> <span class="preprocessor">#include "cookiejar.h"</span> <span class="preprocessor">#include "downloadmanager.h"</span> <span class="preprocessor">#include "history.h"</span> <span class="preprocessor">#include "tabwidget.h"</span> <span class="preprocessor">#include "webview.h"</span> <span class="preprocessor">#include <QtCore/QBuffer></span> <span class="preprocessor">#include <QtCore/QDir></span> <span class="preprocessor">#include <QtCore/QLibraryInfo></span> <span class="preprocessor">#include <QtCore/QSettings></span> <span class="preprocessor">#include <QtCore/QTextStream></span> <span class="preprocessor">#include <QtCore/QTranslator></span> <span class="preprocessor">#include <QtGui/QDesktopServices></span> <span class="preprocessor">#include <QtGui/QFileOpenEvent></span> <span class="preprocessor">#include <QtWidgets/QMessageBox></span> <span class="preprocessor">#include <QtNetwork/QLocalServer></span> <span class="preprocessor">#include <QtNetwork/QLocalSocket></span> <span class="preprocessor">#include <QtNetwork/QNetworkProxy></span> <span class="preprocessor">#include <QtNetwork/QSslSocket></span> <span class="preprocessor">#include <QWebEngineProfile></span> <span class="preprocessor">#include <QWebEngineSettings></span> <span class="preprocessor">#include <QWebEngineScript></span> <span class="preprocessor">#include <QWebEngineScriptCollection></span> <span class="preprocessor">#include <QtCore/QDebug></span> DownloadManager <span class="operator">*</span>BrowserApplication<span class="operator">::</span>s_downloadManager <span class="operator">=</span> <span class="number">0</span>; HistoryManager <span class="operator">*</span>BrowserApplication<span class="operator">::</span>s_historyManager <span class="operator">=</span> <span class="number">0</span>; <span class="type">QNetworkAccessManager</span> <span class="operator">*</span>BrowserApplication<span class="operator">::</span>s_networkAccessManager <span class="operator">=</span> <span class="number">0</span>; BookmarksManager <span class="operator">*</span>BrowserApplication<span class="operator">::</span>s_bookmarksManager <span class="operator">=</span> <span class="number">0</span>; <span class="keyword">static</span> <span class="type">void</span> setUserStyleSheet(<span class="type"><a href="qwebengineprofile.html">QWebEngineProfile</a></span> <span class="operator">*</span>profile<span class="operator">,</span> <span class="keyword">const</span> <span class="type">QString</span> <span class="operator">&</span>styleSheet<span class="operator">,</span> BrowserMainWindow <span class="operator">*</span>mainWindow <span class="operator">=</span> <span class="number">0</span>) { Q_ASSERT(profile); <span class="type">QString</span> scriptName(<span class="type">QStringLiteral</span>(<span class="string">"userStyleSheet"</span>)); <span class="type"><a href="qwebenginescript.html">QWebEngineScript</a></span> script; <span class="type">QList</span><span class="operator"><</span><span class="type"><a href="qwebenginescript.html">QWebEngineScript</a></span><span class="operator">></span> styleSheets <span class="operator">=</span> profile<span class="operator">-</span><span class="operator">></span>scripts()<span class="operator">-</span><span class="operator">></span>findScripts(scriptName); <span class="keyword">if</span> (<span class="operator">!</span>styleSheets<span class="operator">.</span>isEmpty()) script <span class="operator">=</span> styleSheets<span class="operator">.</span>first(); Q_FOREACH (<span class="keyword">const</span> <span class="type"><a href="qwebenginescript.html">QWebEngineScript</a></span> <span class="operator">&</span>s<span class="operator">,</span> styleSheets) profile<span class="operator">-</span><span class="operator">></span>scripts()<span class="operator">-</span><span class="operator">></span>remove(s); <span class="keyword">if</span> (script<span class="operator">.</span>isNull()) { script<span class="operator">.</span>setName(scriptName); script<span class="operator">.</span>setInjectionPoint(<span class="type"><a href="qwebenginescript.html">QWebEngineScript</a></span><span class="operator">::</span>DocumentReady); script<span class="operator">.</span>setRunsOnSubFrames(<span class="keyword">true</span>); script<span class="operator">.</span>setWorldId(<span class="type"><a href="qwebenginescript.html">QWebEngineScript</a></span><span class="operator">::</span>ApplicationWorld); } <span class="type">QString</span> source <span class="operator">=</span> <span class="type">QString</span><span class="operator">::</span>fromLatin1(<span class="string">"(function() {"</span>\ <span class="string">"var css = document.getElementById(\"_qt_testBrowser_userStyleSheet\");"</span>\ <span class="string">"if (css == undefined) {"</span>\ <span class="string">" css = document.createElement(\"style\");"</span>\ <span class="string">" css.type = \"text/css\";"</span>\ <span class="string">" css.id = \"_qt_testBrowser_userStyleSheet\";"</span>\ <span class="string">" document.head.appendChild(css);"</span>\ <span class="string">"}"</span>\ <span class="string">"css.innerText = \"%1\";"</span>\ <span class="string">"})()"</span>)<span class="operator">.</span>arg(styleSheet); script<span class="operator">.</span>setSourceCode(source); profile<span class="operator">-</span><span class="operator">></span>scripts()<span class="operator">-</span><span class="operator">></span>insert(script); <span class="comment">// run the script on the already loaded views</span> <span class="comment">// this has to be deferred as it could mess with the storage initialization on startup</span> <span class="keyword">if</span> (mainWindow) <span class="type">QMetaObject</span><span class="operator">::</span>invokeMethod(mainWindow<span class="operator">,</span> <span class="string">"runScriptOnOpenViews"</span><span class="operator">,</span> <span class="type">Qt</span><span class="operator">::</span>QueuedConnection<span class="operator">,</span> Q_ARG(<span class="type">QString</span><span class="operator">,</span> source)); } BrowserApplication<span class="operator">::</span>BrowserApplication(<span class="type">int</span> <span class="operator">&</span>argc<span class="operator">,</span> <span class="type">char</span> <span class="operator">*</span><span class="operator">*</span>argv) : <span class="type">QApplication</span>(argc<span class="operator">,</span> argv) <span class="operator">,</span> m_localServer(<span class="number">0</span>) <span class="operator">,</span> m_privateProfile(<span class="number">0</span>) <span class="operator">,</span> m_privateBrowsing(<span class="keyword">false</span>) { <span class="type">QCoreApplication</span><span class="operator">::</span>setOrganizationName(QLatin1String(<span class="string">"Qt"</span>)); <span class="type">QCoreApplication</span><span class="operator">::</span>setApplicationName(QLatin1String(<span class="string">"demobrowser"</span>)); <span class="type">QCoreApplication</span><span class="operator">::</span>setApplicationVersion(QLatin1String(<span class="string">"0.1"</span>)); <span class="type">QString</span> serverName <span class="operator">=</span> <span class="type">QCoreApplication</span><span class="operator">::</span>applicationName() <span class="operator">+</span> <span class="type">QString</span><span class="operator">::</span>fromLatin1(QT_VERSION_STR)<span class="operator">.</span>remove(<span class="char">'.'</span>) <span class="operator">+</span> QLatin1String(<span class="string">"webengine"</span>); <span class="type">QLocalSocket</span> socket; socket<span class="operator">.</span>connectToServer(serverName); <span class="keyword">if</span> (socket<span class="operator">.</span>waitForConnected(<span class="number">500</span>)) { <span class="type">QTextStream</span> stream(<span class="operator">&</span>socket); stream <span class="operator"><</span><span class="operator"><</span> getCommandLineUrlArgument(); stream<span class="operator">.</span>flush(); socket<span class="operator">.</span>waitForBytesWritten(); <span class="keyword">return</span>; } <span class="preprocessor">#if defined(Q_OS_OSX)</span> <span class="type">QApplication</span><span class="operator">::</span>setQuitOnLastWindowClosed(<span class="keyword">false</span>); <span class="preprocessor">#else</span> <span class="type">QApplication</span><span class="operator">::</span>setQuitOnLastWindowClosed(<span class="keyword">true</span>); <span class="preprocessor">#endif</span> m_localServer <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QLocalServer</span>(<span class="keyword">this</span>); connect(m_localServer<span class="operator">,</span> SIGNAL(newConnection())<span class="operator">,</span> <span class="keyword">this</span><span class="operator">,</span> SLOT(newLocalSocketConnection())); <span class="keyword">if</span> (<span class="operator">!</span>m_localServer<span class="operator">-</span><span class="operator">></span>listen(serverName) <span class="operator">&</span><span class="operator">&</span> m_localServer<span class="operator">-</span><span class="operator">></span>serverError() <span class="operator">=</span><span class="operator">=</span> <span class="type">QAbstractSocket</span><span class="operator">::</span>AddressInUseError) { <span class="type">QLocalServer</span><span class="operator">::</span>removeServer(serverName); <span class="keyword">if</span> (<span class="operator">!</span>m_localServer<span class="operator">-</span><span class="operator">></span>listen(serverName)) qWarning(<span class="string">"Could not create local socket %s."</span><span class="operator">,</span> qPrintable(serverName)); } <span class="preprocessor">#ifndef QT_NO_OPENSSL</span> <span class="keyword">if</span> (<span class="operator">!</span><span class="type">QSslSocket</span><span class="operator">::</span>supportsSsl()) { <span class="type">QMessageBox</span><span class="operator">::</span>information(<span class="number">0</span><span class="operator">,</span> <span class="string">"Demo Browser"</span><span class="operator">,</span> <span class="string">"This system does not support OpenSSL. SSL websites will not be available."</span>); } <span class="preprocessor">#endif</span> <span class="type">QDesktopServices</span><span class="operator">::</span>setUrlHandler(QLatin1String(<span class="string">"http"</span>)<span class="operator">,</span> <span class="keyword">this</span><span class="operator">,</span> <span class="string">"openUrl"</span>); <span class="type">QString</span> localSysName <span class="operator">=</span> <span class="type">QLocale</span><span class="operator">::</span>system()<span class="operator">.</span>name(); installTranslator(QLatin1String(<span class="string">"qt_"</span>) <span class="operator">+</span> localSysName); <span class="type">QSettings</span> settings; settings<span class="operator">.</span>beginGroup(QLatin1String(<span class="string">"sessions"</span>)); m_lastSession <span class="operator">=</span> settings<span class="operator">.</span>value(QLatin1String(<span class="string">"lastSession"</span>))<span class="operator">.</span>toByteArray(); settings<span class="operator">.</span>endGroup(); <span class="preprocessor">#if defined(Q_OS_OSX)</span> connect(<span class="keyword">this</span><span class="operator">,</span> SIGNAL(lastWindowClosed())<span class="operator">,</span> <span class="keyword">this</span><span class="operator">,</span> SLOT(lastWindowClosed())); <span class="preprocessor">#endif</span> <span class="type">QTimer</span><span class="operator">::</span>singleShot(<span class="number">0</span><span class="operator">,</span> <span class="keyword">this</span><span class="operator">,</span> SLOT(postLaunch())); } BrowserApplication<span class="operator">::</span><span class="operator">~</span>BrowserApplication() { <span class="keyword">delete</span> s_downloadManager; <span class="keyword">for</span> (<span class="type">int</span> i <span class="operator">=</span> <span class="number">0</span>; i <span class="operator"><</span> m_mainWindows<span class="operator">.</span>size(); <span class="operator">+</span><span class="operator">+</span>i) { BrowserMainWindow <span class="operator">*</span>window <span class="operator">=</span> m_mainWindows<span class="operator">.</span>at(i); <span class="keyword">delete</span> window; } <span class="keyword">delete</span> s_networkAccessManager; <span class="keyword">delete</span> s_bookmarksManager; } <span class="type">void</span> BrowserApplication<span class="operator">::</span>lastWindowClosed() { <span class="preprocessor">#if defined(Q_OS_OSX)</span> clean(); BrowserMainWindow <span class="operator">*</span>mw <span class="operator">=</span> <span class="keyword">new</span> BrowserMainWindow; mw<span class="operator">-</span><span class="operator">></span>slotHome(); m_mainWindows<span class="operator">.</span>prepend(mw); <span class="preprocessor">#endif</span> } BrowserApplication <span class="operator">*</span>BrowserApplication<span class="operator">::</span>instance() { <span class="keyword">return</span> (<span class="keyword">static_cast</span><span class="operator"><</span>BrowserApplication <span class="operator">*</span><span class="operator">></span>(<span class="type">QCoreApplication</span><span class="operator">::</span>instance())); } <span class="type">void</span> BrowserApplication<span class="operator">::</span>quitBrowser() { <span class="preprocessor">#if defined(Q_OS_OSX)</span> clean(); <span class="type">int</span> tabCount <span class="operator">=</span> <span class="number">0</span>; <span class="keyword">for</span> (<span class="type">int</span> i <span class="operator">=</span> <span class="number">0</span>; i <span class="operator"><</span> m_mainWindows<span class="operator">.</span>count(); <span class="operator">+</span><span class="operator">+</span>i) { tabCount <span class="operator">+</span><span class="operator">=</span> m_mainWindows<span class="operator">.</span>at(i)<span class="operator">-</span><span class="operator">></span>tabWidget()<span class="operator">-</span><span class="operator">></span>count(); } <span class="keyword">if</span> (tabCount <span class="operator">></span> <span class="number">1</span>) { <span class="type">int</span> ret <span class="operator">=</span> <span class="type">QMessageBox</span><span class="operator">::</span>warning(mainWindow()<span class="operator">,</span> <span class="type">QString</span>()<span class="operator">,</span> tr(<span class="string">"There are %1 windows and %2 tabs open\n"</span> <span class="string">"Do you want to quit anyway?"</span>)<span class="operator">.</span>arg(m_mainWindows<span class="operator">.</span>count())<span class="operator">.</span>arg(tabCount)<span class="operator">,</span> <span class="type">QMessageBox</span><span class="operator">::</span>Yes <span class="operator">|</span> <span class="type">QMessageBox</span><span class="operator">::</span>No<span class="operator">,</span> <span class="type">QMessageBox</span><span class="operator">::</span>No); <span class="keyword">if</span> (ret <span class="operator">=</span><span class="operator">=</span> <span class="type">QMessageBox</span><span class="operator">::</span>No) <span class="keyword">return</span>; } exit(<span class="number">0</span>); <span class="preprocessor">#endif</span> } <span class="comment">/*! Any actions that can be delayed until the window is visible */</span> <span class="type">void</span> BrowserApplication<span class="operator">::</span>postLaunch() { <span class="type">QString</span> directory <span class="operator">=</span> <span class="type">QStandardPaths</span><span class="operator">::</span>writableLocation(<span class="type">QStandardPaths</span><span class="operator">::</span>DataLocation); <span class="keyword">if</span> (directory<span class="operator">.</span>isEmpty()) directory <span class="operator">=</span> <span class="type">QDir</span><span class="operator">::</span>homePath() <span class="operator">+</span> QLatin1String(<span class="string">"/."</span>) <span class="operator">+</span> <span class="type">QCoreApplication</span><span class="operator">::</span>applicationName(); <span class="preprocessor">#if defined(QWEBENGINESETTINGS_PATHS)</span> <span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>setIconDatabasePath(directory); <span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>setOfflineStoragePath(directory); <span class="preprocessor">#endif</span> setWindowIcon(<span class="type">QIcon</span>(QLatin1String(<span class="string">":demobrowser.svg"</span>))); loadSettings(); <span class="comment">// newMainWindow() needs to be called in main() for this to happen</span> <span class="keyword">if</span> (m_mainWindows<span class="operator">.</span>count() <span class="operator">></span> <span class="number">0</span>) { <span class="keyword">const</span> <span class="type">QString</span> url <span class="operator">=</span> getCommandLineUrlArgument(); <span class="keyword">if</span> (<span class="operator">!</span>url<span class="operator">.</span>isEmpty()) { mainWindow()<span class="operator">-</span><span class="operator">></span>loadPage(url); } <span class="keyword">else</span> { mainWindow()<span class="operator">-</span><span class="operator">></span>slotHome(); } } BrowserApplication<span class="operator">::</span>historyManager(); } <span class="type">void</span> BrowserApplication<span class="operator">::</span>loadSettings() { <span class="type">QSettings</span> settings; settings<span class="operator">.</span>beginGroup(QLatin1String(<span class="string">"websettings"</span>)); <span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span> <span class="operator">*</span>defaultSettings <span class="operator">=</span> <span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>globalSettings(); <span class="type"><a href="qwebengineprofile.html">QWebEngineProfile</a></span> <span class="operator">*</span>defaultProfile <span class="operator">=</span> <span class="type"><a href="qwebengineprofile.html">QWebEngineProfile</a></span><span class="operator">::</span>defaultProfile(); <span class="type">QString</span> standardFontFamily <span class="operator">=</span> defaultSettings<span class="operator">-</span><span class="operator">></span>fontFamily(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>StandardFont); <span class="type">int</span> standardFontSize <span class="operator">=</span> defaultSettings<span class="operator">-</span><span class="operator">></span>fontSize(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>DefaultFontSize); <span class="type">QFont</span> standardFont <span class="operator">=</span> <span class="type">QFont</span>(standardFontFamily<span class="operator">,</span> standardFontSize); standardFont <span class="operator">=</span> qvariant_cast<span class="operator"><</span><span class="type">QFont</span><span class="operator">></span>(settings<span class="operator">.</span>value(QLatin1String(<span class="string">"standardFont"</span>)<span class="operator">,</span> standardFont)); defaultSettings<span class="operator">-</span><span class="operator">></span>setFontFamily(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>StandardFont<span class="operator">,</span> standardFont<span class="operator">.</span>family()); defaultSettings<span class="operator">-</span><span class="operator">></span>setFontSize(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>DefaultFontSize<span class="operator">,</span> standardFont<span class="operator">.</span>pointSize()); <span class="type">QString</span> fixedFontFamily <span class="operator">=</span> defaultSettings<span class="operator">-</span><span class="operator">></span>fontFamily(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>FixedFont); <span class="type">int</span> fixedFontSize <span class="operator">=</span> defaultSettings<span class="operator">-</span><span class="operator">></span>fontSize(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>DefaultFixedFontSize); <span class="type">QFont</span> fixedFont <span class="operator">=</span> <span class="type">QFont</span>(fixedFontFamily<span class="operator">,</span> fixedFontSize); fixedFont <span class="operator">=</span> qvariant_cast<span class="operator"><</span><span class="type">QFont</span><span class="operator">></span>(settings<span class="operator">.</span>value(QLatin1String(<span class="string">"fixedFont"</span>)<span class="operator">,</span> fixedFont)); defaultSettings<span class="operator">-</span><span class="operator">></span>setFontFamily(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>FixedFont<span class="operator">,</span> fixedFont<span class="operator">.</span>family()); defaultSettings<span class="operator">-</span><span class="operator">></span>setFontSize(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>DefaultFixedFontSize<span class="operator">,</span> fixedFont<span class="operator">.</span>pointSize()); defaultSettings<span class="operator">-</span><span class="operator">></span>setAttribute(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>JavascriptEnabled<span class="operator">,</span> settings<span class="operator">.</span>value(QLatin1String(<span class="string">"enableJavascript"</span>)<span class="operator">,</span> <span class="keyword">true</span>)<span class="operator">.</span>toBool()); defaultSettings<span class="operator">-</span><span class="operator">></span>setAttribute(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>ScrollAnimatorEnabled<span class="operator">,</span> settings<span class="operator">.</span>value(QLatin1String(<span class="string">"enableScrollAnimator"</span>)<span class="operator">,</span> <span class="keyword">true</span>)<span class="operator">.</span>toBool()); defaultSettings<span class="operator">-</span><span class="operator">></span>setAttribute(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>PluginsEnabled<span class="operator">,</span> settings<span class="operator">.</span>value(QLatin1String(<span class="string">"enablePlugins"</span>)<span class="operator">,</span> <span class="keyword">true</span>)<span class="operator">.</span>toBool()); defaultSettings<span class="operator">-</span><span class="operator">></span>setAttribute(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>FullScreenSupportEnabled<span class="operator">,</span> <span class="keyword">true</span>); <span class="type">QString</span> css <span class="operator">=</span> settings<span class="operator">.</span>value(QLatin1String(<span class="string">"userStyleSheet"</span>))<span class="operator">.</span>toString(); setUserStyleSheet(defaultProfile<span class="operator">,</span> css<span class="operator">,</span> mainWindow()); defaultProfile<span class="operator">-</span><span class="operator">></span>setHttpUserAgent(settings<span class="operator">.</span>value(QLatin1String(<span class="string">"httpUserAgent"</span>))<span class="operator">.</span>toString()); defaultProfile<span class="operator">-</span><span class="operator">></span>setHttpAcceptLanguage(settings<span class="operator">.</span>value(QLatin1String(<span class="string">"httpAcceptLanguage"</span>))<span class="operator">.</span>toString()); <span class="keyword">switch</span> (settings<span class="operator">.</span>value(QLatin1String(<span class="string">"faviconDownloadMode"</span>)<span class="operator">,</span> <span class="number">1</span>)<span class="operator">.</span>toInt()) { <span class="keyword">case</span> <span class="number">0</span>: defaultSettings<span class="operator">-</span><span class="operator">></span>setAttribute(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>AutoLoadIconsForPage<span class="operator">,</span> <span class="keyword">false</span>); <span class="keyword">break</span>; <span class="keyword">case</span> <span class="number">1</span>: defaultSettings<span class="operator">-</span><span class="operator">></span>setAttribute(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>AutoLoadIconsForPage<span class="operator">,</span> <span class="keyword">true</span>); defaultSettings<span class="operator">-</span><span class="operator">></span>setAttribute(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>TouchIconsEnabled<span class="operator">,</span> <span class="keyword">false</span>); <span class="keyword">break</span>; <span class="keyword">case</span> <span class="number">2</span>: defaultSettings<span class="operator">-</span><span class="operator">></span>setAttribute(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>AutoLoadIconsForPage<span class="operator">,</span> <span class="keyword">true</span>); defaultSettings<span class="operator">-</span><span class="operator">></span>setAttribute(<span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>TouchIconsEnabled<span class="operator">,</span> <span class="keyword">true</span>); <span class="keyword">break</span>; } settings<span class="operator">.</span>endGroup(); settings<span class="operator">.</span>beginGroup(QLatin1String(<span class="string">"cookies"</span>)); <span class="type"><a href="qwebengineprofile.html">QWebEngineProfile</a></span><span class="operator">::</span>PersistentCookiesPolicy persistentCookiesPolicy <span class="operator">=</span> <span class="type"><a href="qwebengineprofile.html">QWebEngineProfile</a></span><span class="operator">::</span>PersistentCookiesPolicy(settings<span class="operator">.</span>value(QLatin1String(<span class="string">"persistentCookiesPolicy"</span>)<span class="operator">,</span> <span class="type"><a href="qwebengineprofile.html">QWebEngineProfile</a></span><span class="operator">::</span>AllowPersistentCookies)<span class="operator">.</span>toInt()); defaultProfile<span class="operator">-</span><span class="operator">></span>setPersistentCookiesPolicy(persistentCookiesPolicy); <span class="type">QString</span> pdataPath <span class="operator">=</span> settings<span class="operator">.</span>value(QLatin1String(<span class="string">"persistentDataPath"</span>))<span class="operator">.</span>toString(); defaultProfile<span class="operator">-</span><span class="operator">></span>setPersistentStoragePath(pdataPath); settings<span class="operator">.</span>endGroup(); settings<span class="operator">.</span>beginGroup(QLatin1String(<span class="string">"proxy"</span>)); <span class="type">QNetworkProxy</span> proxy; <span class="keyword">if</span> (settings<span class="operator">.</span>value(QLatin1String(<span class="string">"enabled"</span>)<span class="operator">,</span> <span class="keyword">false</span>)<span class="operator">.</span>toBool()) { <span class="keyword">if</span> (settings<span class="operator">.</span>value(QLatin1String(<span class="string">"type"</span>)<span class="operator">,</span> <span class="number">0</span>)<span class="operator">.</span>toInt() <span class="operator">=</span><span class="operator">=</span> <span class="number">0</span>) proxy <span class="operator">=</span> <span class="type">QNetworkProxy</span><span class="operator">::</span>Socks5Proxy; <span class="keyword">else</span> proxy <span class="operator">=</span> <span class="type">QNetworkProxy</span><span class="operator">::</span>HttpProxy; proxy<span class="operator">.</span>setHostName(settings<span class="operator">.</span>value(QLatin1String(<span class="string">"hostName"</span>))<span class="operator">.</span>toString()); proxy<span class="operator">.</span>setPort(settings<span class="operator">.</span>value(QLatin1String(<span class="string">"port"</span>)<span class="operator">,</span> <span class="number">1080</span>)<span class="operator">.</span>toInt()); proxy<span class="operator">.</span>setUser(settings<span class="operator">.</span>value(QLatin1String(<span class="string">"userName"</span>))<span class="operator">.</span>toString()); proxy<span class="operator">.</span>setPassword(settings<span class="operator">.</span>value(QLatin1String(<span class="string">"password"</span>))<span class="operator">.</span>toString()); <span class="type">QNetworkProxy</span><span class="operator">::</span>setApplicationProxy(proxy); } settings<span class="operator">.</span>endGroup(); } <span class="type">QList</span><span class="operator"><</span>BrowserMainWindow<span class="operator">*</span><span class="operator">></span> BrowserApplication<span class="operator">::</span>mainWindows() { clean(); <span class="type">QList</span><span class="operator"><</span>BrowserMainWindow<span class="operator">*</span><span class="operator">></span> list; <span class="keyword">for</span> (<span class="type">int</span> i <span class="operator">=</span> <span class="number">0</span>; i <span class="operator"><</span> m_mainWindows<span class="operator">.</span>count(); <span class="operator">+</span><span class="operator">+</span>i) list<span class="operator">.</span>append(m_mainWindows<span class="operator">.</span>at(i)); <span class="keyword">return</span> list; } <span class="type">void</span> BrowserApplication<span class="operator">::</span>clean() { <span class="comment">// cleanup any deleted main windows first</span> <span class="keyword">for</span> (<span class="type">int</span> i <span class="operator">=</span> m_mainWindows<span class="operator">.</span>count() <span class="operator">-</span> <span class="number">1</span>; i <span class="operator">></span><span class="operator">=</span> <span class="number">0</span>; <span class="operator">-</span><span class="operator">-</span>i) <span class="keyword">if</span> (m_mainWindows<span class="operator">.</span>at(i)<span class="operator">.</span>isNull()) m_mainWindows<span class="operator">.</span>removeAt(i); } <span class="type">void</span> BrowserApplication<span class="operator">::</span>saveSession() { <span class="keyword">if</span> (m_privateBrowsing) <span class="keyword">return</span>; clean(); <span class="type">QSettings</span> settings; settings<span class="operator">.</span>beginGroup(QLatin1String(<span class="string">"sessions"</span>)); <span class="type">QByteArray</span> data; <span class="type">QBuffer</span> buffer(<span class="operator">&</span>data); <span class="type">QDataStream</span> stream(<span class="operator">&</span>buffer); buffer<span class="operator">.</span>open(<span class="type">QIODevice</span><span class="operator">::</span>ReadWrite); stream <span class="operator"><</span><span class="operator"><</span> m_mainWindows<span class="operator">.</span>count(); <span class="keyword">for</span> (<span class="type">int</span> i <span class="operator">=</span> <span class="number">0</span>; i <span class="operator"><</span> m_mainWindows<span class="operator">.</span>count(); <span class="operator">+</span><span class="operator">+</span>i) stream <span class="operator"><</span><span class="operator"><</span> m_mainWindows<span class="operator">.</span>at(i)<span class="operator">-</span><span class="operator">></span>saveState(); settings<span class="operator">.</span>setValue(QLatin1String(<span class="string">"lastSession"</span>)<span class="operator">,</span> data); settings<span class="operator">.</span>endGroup(); } bool BrowserApplication<span class="operator">::</span>canRestoreSession() <span class="keyword">const</span> { <span class="keyword">return</span> <span class="operator">!</span>m_lastSession<span class="operator">.</span>isEmpty(); } <span class="type">void</span> BrowserApplication<span class="operator">::</span>restoreLastSession() { <span class="type">QList</span><span class="operator"><</span><span class="type">QByteArray</span><span class="operator">></span> windows; <span class="type">QBuffer</span> buffer(<span class="operator">&</span>m_lastSession); <span class="type">QDataStream</span> stream(<span class="operator">&</span>buffer); buffer<span class="operator">.</span>open(<span class="type">QIODevice</span><span class="operator">::</span>ReadOnly); <span class="type">int</span> windowCount; stream <span class="operator">></span><span class="operator">></span> windowCount; <span class="keyword">for</span> (<span class="type">int</span> i <span class="operator">=</span> <span class="number">0</span>; i <span class="operator"><</span> windowCount; <span class="operator">+</span><span class="operator">+</span>i) { <span class="type">QByteArray</span> windowState; stream <span class="operator">></span><span class="operator">></span> windowState; windows<span class="operator">.</span>append(windowState); } <span class="keyword">for</span> (<span class="type">int</span> i <span class="operator">=</span> <span class="number">0</span>; i <span class="operator"><</span> windows<span class="operator">.</span>count(); <span class="operator">+</span><span class="operator">+</span>i) { BrowserMainWindow <span class="operator">*</span>newWindow <span class="operator">=</span> <span class="number">0</span>; <span class="keyword">if</span> (m_mainWindows<span class="operator">.</span>count() <span class="operator">=</span><span class="operator">=</span> <span class="number">1</span> <span class="operator">&</span><span class="operator">&</span> mainWindow()<span class="operator">-</span><span class="operator">></span>tabWidget()<span class="operator">-</span><span class="operator">></span>count() <span class="operator">=</span><span class="operator">=</span> <span class="number">1</span> <span class="operator">&</span><span class="operator">&</span> mainWindow()<span class="operator">-</span><span class="operator">></span>currentTab()<span class="operator">-</span><span class="operator">></span>url() <span class="operator">=</span><span class="operator">=</span> <span class="type">QUrl</span>()) { newWindow <span class="operator">=</span> mainWindow(); } <span class="keyword">else</span> { newWindow <span class="operator">=</span> newMainWindow(); } newWindow<span class="operator">-</span><span class="operator">></span>restoreState(windows<span class="operator">.</span>at(i)); } } bool BrowserApplication<span class="operator">::</span>isTheOnlyBrowser() <span class="keyword">const</span> { <span class="keyword">return</span> (m_localServer <span class="operator">!</span><span class="operator">=</span> <span class="number">0</span>); } <span class="type">void</span> BrowserApplication<span class="operator">::</span>installTranslator(<span class="keyword">const</span> <span class="type">QString</span> <span class="operator">&</span>name) { <span class="type">QTranslator</span> <span class="operator">*</span>translator <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QTranslator</span>(<span class="keyword">this</span>); translator<span class="operator">-</span><span class="operator">></span>load(name<span class="operator">,</span> <span class="type">QLibraryInfo</span><span class="operator">::</span>location(<span class="type">QLibraryInfo</span><span class="operator">::</span>TranslationsPath)); <span class="type">QApplication</span><span class="operator">::</span>installTranslator(translator); } <span class="type">QString</span> BrowserApplication<span class="operator">::</span>getCommandLineUrlArgument() <span class="keyword">const</span> { <span class="keyword">const</span> <span class="type">QStringList</span> args <span class="operator">=</span> <span class="type">QCoreApplication</span><span class="operator">::</span>arguments(); <span class="keyword">if</span> (args<span class="operator">.</span>count() <span class="operator">></span> <span class="number">1</span>) { <span class="keyword">const</span> <span class="type">QString</span> lastArg <span class="operator">=</span> args<span class="operator">.</span>last(); <span class="keyword">const</span> bool isValidUrl <span class="operator">=</span> <span class="type">QUrl</span><span class="operator">::</span>fromUserInput(lastArg)<span class="operator">.</span>isValid(); <span class="keyword">if</span> (isValidUrl) <span class="keyword">return</span> lastArg; } <span class="keyword">return</span> <span class="type">QString</span>(); } <span class="preprocessor">#if defined(Q_OS_OSX)</span> bool BrowserApplication<span class="operator">::</span>event(<span class="type">QEvent</span><span class="operator">*</span> event) { <span class="keyword">switch</span> (event<span class="operator">-</span><span class="operator">></span>type()) { <span class="keyword">case</span> <span class="type">QEvent</span><span class="operator">::</span>ApplicationActivate: { clean(); <span class="keyword">if</span> (<span class="operator">!</span>m_mainWindows<span class="operator">.</span>isEmpty()) { BrowserMainWindow <span class="operator">*</span>mw <span class="operator">=</span> mainWindow(); <span class="keyword">if</span> (mw <span class="operator">&</span><span class="operator">&</span> <span class="operator">!</span>mw<span class="operator">-</span><span class="operator">></span>isMinimized()) { mainWindow()<span class="operator">-</span><span class="operator">></span>show(); } <span class="keyword">return</span> <span class="keyword">true</span>; } } <span class="keyword">case</span> <span class="type">QEvent</span><span class="operator">::</span>FileOpen: <span class="keyword">if</span> (<span class="operator">!</span>m_mainWindows<span class="operator">.</span>isEmpty()) { mainWindow()<span class="operator">-</span><span class="operator">></span>loadPage(<span class="keyword">static_cast</span><span class="operator"><</span><span class="type">QFileOpenEvent</span> <span class="operator">*</span><span class="operator">></span>(event)<span class="operator">-</span><span class="operator">></span>file()); <span class="keyword">return</span> <span class="keyword">true</span>; } <span class="keyword">default</span>: <span class="keyword">break</span>; } <span class="keyword">return</span> <span class="type">QApplication</span><span class="operator">::</span>event(event); } <span class="preprocessor">#endif</span> <span class="type">void</span> BrowserApplication<span class="operator">::</span>openUrl(<span class="keyword">const</span> <span class="type">QUrl</span> <span class="operator">&</span>url) { mainWindow()<span class="operator">-</span><span class="operator">></span>loadPage(url<span class="operator">.</span>toString()); } BrowserMainWindow <span class="operator">*</span>BrowserApplication<span class="operator">::</span>newMainWindow() { BrowserMainWindow <span class="operator">*</span>browser <span class="operator">=</span> <span class="keyword">new</span> BrowserMainWindow(); m_mainWindows<span class="operator">.</span>prepend(browser); browser<span class="operator">-</span><span class="operator">></span>show(); <span class="keyword">return</span> browser; } BrowserMainWindow <span class="operator">*</span>BrowserApplication<span class="operator">::</span>mainWindow() { clean(); <span class="keyword">if</span> (m_mainWindows<span class="operator">.</span>isEmpty()) newMainWindow(); <span class="keyword">return</span> m_mainWindows<span class="operator">[</span><span class="number">0</span><span class="operator">]</span>; } <span class="type">void</span> BrowserApplication<span class="operator">::</span>newLocalSocketConnection() { <span class="type">QLocalSocket</span> <span class="operator">*</span>socket <span class="operator">=</span> m_localServer<span class="operator">-</span><span class="operator">></span>nextPendingConnection(); <span class="keyword">if</span> (<span class="operator">!</span>socket) <span class="keyword">return</span>; socket<span class="operator">-</span><span class="operator">></span>waitForReadyRead(<span class="number">1000</span>); <span class="type">QTextStream</span> stream(socket); <span class="type">QString</span> url; stream <span class="operator">></span><span class="operator">></span> url; <span class="keyword">if</span> (<span class="operator">!</span>url<span class="operator">.</span>isEmpty()) { <span class="type">QSettings</span> settings; settings<span class="operator">.</span>beginGroup(QLatin1String(<span class="string">"general"</span>)); <span class="type">int</span> openLinksIn <span class="operator">=</span> settings<span class="operator">.</span>value(QLatin1String(<span class="string">"openLinksIn"</span>)<span class="operator">,</span> <span class="number">0</span>)<span class="operator">.</span>toInt(); settings<span class="operator">.</span>endGroup(); <span class="keyword">if</span> (openLinksIn <span class="operator">=</span><span class="operator">=</span> <span class="number">1</span>) newMainWindow(); <span class="keyword">else</span> mainWindow()<span class="operator">-</span><span class="operator">></span>tabWidget()<span class="operator">-</span><span class="operator">></span>newTab(); openUrl(url); } <span class="keyword">delete</span> socket; mainWindow()<span class="operator">-</span><span class="operator">></span>raise(); mainWindow()<span class="operator">-</span><span class="operator">></span>activateWindow(); } CookieJar <span class="operator">*</span>BrowserApplication<span class="operator">::</span>cookieJar() { <span class="preprocessor">#if defined(QWEBENGINEPAGE_SETNETWORKACCESSMANAGER)</span> <span class="keyword">return</span> (CookieJar<span class="operator">*</span>)networkAccessManager()<span class="operator">-</span><span class="operator">></span>cookieJar(); <span class="preprocessor">#else</span> <span class="keyword">return</span> <span class="number">0</span>; <span class="preprocessor">#endif</span> } DownloadManager <span class="operator">*</span>BrowserApplication<span class="operator">::</span>downloadManager() { <span class="keyword">if</span> (<span class="operator">!</span>s_downloadManager) { s_downloadManager <span class="operator">=</span> <span class="keyword">new</span> DownloadManager(); } <span class="keyword">return</span> s_downloadManager; } <span class="type">QNetworkAccessManager</span> <span class="operator">*</span>BrowserApplication<span class="operator">::</span>networkAccessManager() { <span class="keyword">if</span> (<span class="operator">!</span>s_networkAccessManager) { s_networkAccessManager <span class="operator">=</span> <span class="keyword">new</span> <span class="type">QNetworkAccessManager</span>(); } <span class="keyword">return</span> s_networkAccessManager; } HistoryManager <span class="operator">*</span>BrowserApplication<span class="operator">::</span>historyManager() { <span class="keyword">if</span> (<span class="operator">!</span>s_historyManager) s_historyManager <span class="operator">=</span> <span class="keyword">new</span> HistoryManager(); <span class="keyword">return</span> s_historyManager; } BookmarksManager <span class="operator">*</span>BrowserApplication<span class="operator">::</span>bookmarksManager() { <span class="keyword">if</span> (<span class="operator">!</span>s_bookmarksManager) { s_bookmarksManager <span class="operator">=</span> <span class="keyword">new</span> BookmarksManager; } <span class="keyword">return</span> s_bookmarksManager; } <span class="type">QIcon</span> BrowserApplication<span class="operator">::</span>icon(<span class="keyword">const</span> <span class="type">QUrl</span> <span class="operator">&</span>url) <span class="keyword">const</span> { <span class="preprocessor">#if defined(QTWEBENGINE_ICONDATABASE)</span> <span class="type">QIcon</span> icon <span class="operator">=</span> <span class="type"><a href="qwebenginesettings.html">QWebEngineSettings</a></span><span class="operator">::</span>iconForUrl(url); <span class="keyword">if</span> (<span class="operator">!</span>icon<span class="operator">.</span>isNull()) <span class="keyword">return</span> icon<span class="operator">.</span>pixmap(<span class="number">16</span><span class="operator">,</span> <span class="number">16</span>); <span class="preprocessor">#else</span> Q_UNUSED(url); <span class="preprocessor">#endif</span> <span class="keyword">return</span> defaultIcon(); } <span class="type">QIcon</span> BrowserApplication<span class="operator">::</span>defaultIcon() <span class="keyword">const</span> { <span class="keyword">if</span> (m_defaultIcon<span class="operator">.</span>isNull()) m_defaultIcon <span class="operator">=</span> <span class="type">QIcon</span>(QLatin1String(<span class="string">":defaulticon.png"</span>)); <span class="keyword">return</span> m_defaultIcon; } <span class="type">void</span> BrowserApplication<span class="operator">::</span>setPrivateBrowsing(bool privateBrowsing) { <span class="keyword">if</span> (m_privateBrowsing <span class="operator">=</span><span class="operator">=</span> privateBrowsing) <span class="keyword">return</span>; m_privateBrowsing <span class="operator">=</span> privateBrowsing; <span class="keyword">if</span> (privateBrowsing) { <span class="keyword">if</span> (<span class="operator">!</span>m_privateProfile) m_privateProfile <span class="operator">=</span> <span class="keyword">new</span> <span class="type"><a href="qwebengineprofile.html">QWebEngineProfile</a></span>(<span class="keyword">this</span>); Q_FOREACH (BrowserMainWindow<span class="operator">*</span> window<span class="operator">,</span> mainWindows()) { window<span class="operator">-</span><span class="operator">></span>tabWidget()<span class="operator">-</span><span class="operator">></span>setProfile(m_privateProfile); } } <span class="keyword">else</span> { Q_FOREACH (BrowserMainWindow<span class="operator">*</span> window<span class="operator">,</span> mainWindows()) { window<span class="operator">-</span><span class="operator">></span>tabWidget()<span class="operator">-</span><span class="operator">></span>setProfile(<span class="type"><a href="qwebengineprofile.html">QWebEngineProfile</a></span><span class="operator">::</span>defaultProfile()); window<span class="operator">-</span><span class="operator">></span>m_lastSearch <span class="operator">=</span> <span class="type">QString</span>(); window<span class="operator">-</span><span class="operator">></span>tabWidget()<span class="operator">-</span><span class="operator">></span>clear(); } } <span class="keyword">emit</span> privateBrowsingChanged(privateBrowsing); } </pre> </div> <!-- @@@webenginewidgets/demobrowser/browserapplication.cpp --> </div> </div> </div> </div> </div> <div class="footer"> <p> <acronym title="Copyright">©</acronym> 2017 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners.<br> The documentation provided herein is licensed under the terms of the <a href="http://www.gnu.org/licenses/fdl.html">GNU Free Documentation License version 1.3</a> as published by the Free Software Foundation.<br> Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners. </p> </div> </body> </html>