browserapplication.cpp
上传用户:huahtool
上传日期:2015-12-10
资源大小:1089k
文件大小:14k
源码类别:

浏览器

开发平台:

Visual C++

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the demonstration applications of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #include "browserapplication.h"
  38. #include "bookmarks.h"
  39. #include "browsermainwindow.h"
  40. #include "cookiejar.h"
  41. #include "downloadmanager.h"
  42. #include "history.h"
  43. #include "networkaccessmanager.h"
  44. #include "tabwidget.h"
  45. #include "webview.h"
  46. #include <QtCore/QBuffer>
  47. #include <QtCore/QDir>
  48. #include <QtCore/QLibraryInfo>
  49. #include <QtCore/QSettings>
  50. #include <QtCore/QTextStream>
  51. #include <QtCore/QTranslator>
  52. #include <QtGui/QDesktopServices>
  53. #include <QtGui/QFileOpenEvent>
  54. #include <QtNetwork/QLocalServer>
  55. #include <QtNetwork/QLocalSocket>
  56. #include <QtNetwork/QNetworkProxy>
  57. #include <QtWebKit/QWebSettings>
  58. #include <QtCore/QDebug>
  59. DownloadManager *BrowserApplication::s_downloadManager = 0;
  60. HistoryManager *BrowserApplication::s_historyManager = 0;
  61. NetworkAccessManager *BrowserApplication::s_networkAccessManager = 0;
  62. BookmarksManager *BrowserApplication::s_bookmarksManager = 0;
  63. BrowserApplication::BrowserApplication(int &argc, char **argv)
  64.     : QApplication(argc, argv)
  65.     , m_localServer(0)
  66. {
  67.     QCoreApplication::setOrganizationName(QLatin1String("Trolltech"));
  68.     QCoreApplication::setApplicationName(QLatin1String("demobrowser"));
  69.     QCoreApplication::setApplicationVersion(QLatin1String("0.1"));
  70. #ifdef Q_WS_QWS
  71.     // Use a different server name for QWS so we can run an X11
  72.     // browser and a QWS browser in parallel on the same machine for
  73.     // debugging
  74.     QString serverName = QCoreApplication::applicationName() + QLatin1String("_qws");
  75. #else
  76.     QString serverName = QCoreApplication::applicationName();
  77. #endif
  78.     QLocalSocket socket;
  79.     socket.connectToServer(serverName);
  80.     if (socket.waitForConnected(500)) {
  81.         QTextStream stream(&socket);
  82.         QStringList args = QCoreApplication::arguments();
  83.         if (args.count() > 1)
  84.             stream << args.last();
  85.         else
  86.             stream << QString();
  87.         stream.flush();
  88.         socket.waitForBytesWritten();
  89.         return;
  90.     }
  91. #if defined(Q_WS_MAC)
  92.     QApplication::setQuitOnLastWindowClosed(false);
  93. #else
  94.     QApplication::setQuitOnLastWindowClosed(true);
  95. #endif
  96.     m_localServer = new QLocalServer(this);
  97.     connect(m_localServer, SIGNAL(newConnection()),
  98.             this, SLOT(newLocalSocketConnection()));
  99.     if (!m_localServer->listen(serverName)) {
  100.         if (m_localServer->serverError() == QAbstractSocket::AddressInUseError
  101.             && QFile::exists(m_localServer->serverName())) {
  102.             QFile::remove(m_localServer->serverName());
  103.             m_localServer->listen(serverName);
  104.         }
  105.     }
  106.     QDesktopServices::setUrlHandler(QLatin1String("http"), this, "openUrl");
  107.     QString localSysName = QLocale::system().name();
  108.     installTranslator(QLatin1String("qt_") + localSysName);
  109.     QSettings settings;
  110.     settings.beginGroup(QLatin1String("sessions"));
  111.     m_lastSession = settings.value(QLatin1String("lastSession")).toByteArray();
  112.     settings.endGroup();
  113. #if defined(Q_WS_MAC)
  114.     connect(this, SIGNAL(lastWindowClosed()),
  115.             this, SLOT(lastWindowClosed()));
  116. #endif
  117.     QTimer::singleShot(0, this, SLOT(postLaunch()));
  118. }
  119. BrowserApplication::~BrowserApplication()
  120. {
  121.     delete s_downloadManager;
  122.     qDeleteAll(m_mainWindows);
  123.     delete s_networkAccessManager;
  124.     delete s_bookmarksManager;
  125. }
  126. #if defined(Q_WS_MAC)
  127. void BrowserApplication::lastWindowClosed()
  128. {
  129.     clean();
  130.     BrowserMainWindow *mw = new BrowserMainWindow;
  131.     mw->slotHome();
  132.     m_mainWindows.prepend(mw);
  133. }
  134. #endif
  135. BrowserApplication *BrowserApplication::instance()
  136. {
  137.     return (static_cast<BrowserApplication *>(QCoreApplication::instance()));
  138. }
  139. #if defined(Q_WS_MAC)
  140. #include <QtGui/QMessageBox>
  141. void BrowserApplication::quitBrowser()
  142. {
  143.     clean();
  144.     int tabCount = 0;
  145.     for (int i = 0; i < m_mainWindows.count(); ++i) {
  146.         tabCount =+ m_mainWindows.at(i)->tabWidget()->count();
  147.     }
  148.     if (tabCount > 1) {
  149.         int ret = QMessageBox::warning(mainWindow(), QString(),
  150.                            tr("There are %1 windows and %2 tabs openn"
  151.                               "Do you want to quit anyway?").arg(m_mainWindows.count()).arg(tabCount),
  152.                            QMessageBox::Yes | QMessageBox::No,
  153.                            QMessageBox::No);
  154.         if (ret == QMessageBox::No)
  155.             return;
  156.     }
  157.     exit(0);
  158. }
  159. #endif
  160. /*!
  161.     Any actions that can be delayed until the window is visible
  162.  */
  163. void BrowserApplication::postLaunch()
  164. {
  165.     QString directory = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
  166.     if (directory.isEmpty())
  167.         directory = QDir::homePath() + QLatin1String("/.") + QCoreApplication::applicationName();
  168.     QWebSettings::setIconDatabasePath(directory);
  169.     setWindowIcon(QIcon(QLatin1String(":browser.svg")));
  170.     loadSettings();
  171.     // newMainWindow() needs to be called in main() for this to happen
  172.     if (m_mainWindows.count() > 0) {
  173.         QStringList args = QCoreApplication::arguments();
  174.         if (args.count() > 1)
  175.             mainWindow()->loadPage(args.last());
  176.         else
  177.             mainWindow()->slotHome();
  178.     }
  179.     BrowserApplication::historyManager();
  180. }
  181. void BrowserApplication::loadSettings()
  182. {
  183.     QSettings settings;
  184.     settings.beginGroup(QLatin1String("websettings"));
  185.     QWebSettings *defaultSettings = QWebSettings::globalSettings();
  186.     QString standardFontFamily = defaultSettings->fontFamily(QWebSettings::StandardFont);
  187.     int standardFontSize = defaultSettings->fontSize(QWebSettings::DefaultFontSize);
  188.     QFont standardFont = QFont(standardFontFamily, standardFontSize);
  189.     standardFont = qVariantValue<QFont>(settings.value(QLatin1String("standardFont"), standardFont));
  190.     defaultSettings->setFontFamily(QWebSettings::StandardFont, standardFont.family());
  191.     defaultSettings->setFontSize(QWebSettings::DefaultFontSize, standardFont.pointSize());
  192.     QString fixedFontFamily = defaultSettings->fontFamily(QWebSettings::FixedFont);
  193.     int fixedFontSize = defaultSettings->fontSize(QWebSettings::DefaultFixedFontSize);
  194.     QFont fixedFont = QFont(fixedFontFamily, fixedFontSize);
  195.     fixedFont = qVariantValue<QFont>(settings.value(QLatin1String("fixedFont"), fixedFont));
  196.     defaultSettings->setFontFamily(QWebSettings::FixedFont, fixedFont.family());
  197.     defaultSettings->setFontSize(QWebSettings::DefaultFixedFontSize, fixedFont.pointSize());
  198.     defaultSettings->setAttribute(QWebSettings::JavascriptEnabled, settings.value(QLatin1String("enableJavascript"), true).toBool());
  199.     defaultSettings->setAttribute(QWebSettings::PluginsEnabled, settings.value(QLatin1String("enablePlugins"), true).toBool());
  200.     QUrl url = settings.value(QLatin1String("userStyleSheet")).toUrl();
  201.     defaultSettings->setUserStyleSheetUrl(url);
  202.     settings.endGroup();
  203. }
  204. QList<BrowserMainWindow*> BrowserApplication::mainWindows()
  205. {
  206.     clean();
  207.     QList<BrowserMainWindow*> list;
  208.     for (int i = 0; i < m_mainWindows.count(); ++i)
  209.         list.append(m_mainWindows.at(i));
  210.     return list;
  211. }
  212. void BrowserApplication::clean()
  213. {
  214.     // cleanup any deleted main windows first
  215.     for (int i = m_mainWindows.count() - 1; i >= 0; --i)
  216.         if (m_mainWindows.at(i).isNull())
  217.             m_mainWindows.removeAt(i);
  218. }
  219. void BrowserApplication::saveSession()
  220. {
  221.     QWebSettings *globalSettings = QWebSettings::globalSettings();
  222.     if (globalSettings->testAttribute(QWebSettings::PrivateBrowsingEnabled))
  223.         return;
  224.     clean();
  225.     QSettings settings;
  226.     settings.beginGroup(QLatin1String("sessions"));
  227.     QByteArray data;
  228.     QBuffer buffer(&data);
  229.     QDataStream stream(&buffer);
  230.     buffer.open(QIODevice::ReadWrite);
  231.     stream << m_mainWindows.count();
  232.     for (int i = 0; i < m_mainWindows.count(); ++i)
  233.         stream << m_mainWindows.at(i)->saveState();
  234.     settings.setValue(QLatin1String("lastSession"), data);
  235.     settings.endGroup();
  236. }
  237. bool BrowserApplication::canRestoreSession() const
  238. {
  239.     return !m_lastSession.isEmpty();
  240. }
  241. void BrowserApplication::restoreLastSession()
  242. {
  243.     QList<QByteArray> windows;
  244.     QBuffer buffer(&m_lastSession);
  245.     QDataStream stream(&buffer);
  246.     buffer.open(QIODevice::ReadOnly);
  247.     int windowCount;
  248.     stream >> windowCount;
  249.     for (int i = 0; i < windowCount; ++i) {
  250.         QByteArray windowState;
  251.         stream >> windowState;
  252.         windows.append(windowState);
  253.     }
  254.     for (int i = 0; i < windows.count(); ++i) {
  255.         BrowserMainWindow *newWindow = 0;
  256.         if (m_mainWindows.count() == 1
  257.             && mainWindow()->tabWidget()->count() == 1
  258.             && mainWindow()->currentTab()->url() == QUrl()) {
  259.             newWindow = mainWindow();
  260.         } else {
  261.             newWindow = newMainWindow();
  262.         }
  263.         newWindow->restoreState(windows.at(i));
  264.     }
  265. }
  266. bool BrowserApplication::isTheOnlyBrowser() const
  267. {
  268.     return (m_localServer != 0);
  269. }
  270. void BrowserApplication::installTranslator(const QString &name)
  271. {
  272.     QTranslator *translator = new QTranslator(this);
  273.     translator->load(name, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
  274.     QApplication::installTranslator(translator);
  275. }
  276. #if defined(Q_WS_MAC)
  277. bool BrowserApplication::event(QEvent* event)
  278. {
  279.     switch (event->type()) {
  280.     case QEvent::ApplicationActivate: {
  281.         clean();
  282.         if (!m_mainWindows.isEmpty()) {
  283.             BrowserMainWindow *mw = mainWindow();
  284.             if (mw && !mw->isMinimized()) {
  285.                 mainWindow()->show();
  286.             }
  287.             return true;
  288.         }
  289.     }
  290.     case QEvent::FileOpen:
  291.         if (!m_mainWindows.isEmpty()) {
  292.             mainWindow()->loadPage(static_cast<QFileOpenEvent *>(event)->file());
  293.             return true;
  294.         }
  295.     default:
  296.         break;
  297.     }
  298.     return QApplication::event(event);
  299. }
  300. #endif
  301. void BrowserApplication::openUrl(const QUrl &url)
  302. {
  303.     mainWindow()->loadPage(url.toString());
  304. }
  305. BrowserMainWindow *BrowserApplication::newMainWindow()
  306. {
  307.     BrowserMainWindow *browser = new BrowserMainWindow();
  308.     m_mainWindows.prepend(browser);
  309.     browser->show();
  310.     return browser;
  311. }
  312. BrowserMainWindow *BrowserApplication::mainWindow()
  313. {
  314.     clean();
  315.     if (m_mainWindows.isEmpty())
  316.         newMainWindow();
  317.     return m_mainWindows[0];
  318. }
  319. void BrowserApplication::newLocalSocketConnection()
  320. {
  321.     QLocalSocket *socket = m_localServer->nextPendingConnection();
  322.     if (!socket)
  323.         return;
  324.     socket->waitForReadyRead(1000);
  325.     QTextStream stream(socket);
  326.     QString url;
  327.     stream >> url;
  328.     if (!url.isEmpty()) {
  329.         QSettings settings;
  330.         settings.beginGroup(QLatin1String("general"));
  331.         int openLinksIn = settings.value(QLatin1String("openLinksIn"), 0).toInt();
  332.         settings.endGroup();
  333.         if (openLinksIn == 1)
  334.             newMainWindow();
  335.         else
  336.             mainWindow()->tabWidget()->newTab();
  337.         openUrl(url);
  338.     }
  339.     delete socket;
  340.     mainWindow()->raise();
  341.     mainWindow()->activateWindow();
  342. }
  343. CookieJar *BrowserApplication::cookieJar()
  344. {
  345.     return (CookieJar*)networkAccessManager()->cookieJar();
  346. }
  347. DownloadManager *BrowserApplication::downloadManager()
  348. {
  349.     if (!s_downloadManager) {
  350.         s_downloadManager = new DownloadManager();
  351.     }
  352.     return s_downloadManager;
  353. }
  354. NetworkAccessManager *BrowserApplication::networkAccessManager()
  355. {
  356.     if (!s_networkAccessManager) {
  357.         s_networkAccessManager = new NetworkAccessManager();
  358.         s_networkAccessManager->setCookieJar(new CookieJar);
  359.     }
  360.     return s_networkAccessManager;
  361. }
  362. HistoryManager *BrowserApplication::historyManager()
  363. {
  364.     if (!s_historyManager) {
  365.         s_historyManager = new HistoryManager();
  366.         QWebHistoryInterface::setDefaultInterface(s_historyManager);
  367.     }
  368.     return s_historyManager;
  369. }
  370. BookmarksManager *BrowserApplication::bookmarksManager()
  371. {
  372.     if (!s_bookmarksManager) {
  373.         s_bookmarksManager = new BookmarksManager;
  374.     }
  375.     return s_bookmarksManager;
  376. }
  377. QIcon BrowserApplication::icon(const QUrl &url) const
  378. {
  379.     QIcon icon = QWebSettings::iconForUrl(url);
  380.     if (!icon.isNull())
  381.         return icon.pixmap(16, 16);
  382.     if (m_defaultIcon.isNull())
  383.         m_defaultIcon = QIcon(QLatin1String(":defaulticon.png"));
  384.     return m_defaultIcon.pixmap(16, 16);
  385. }