diff --git a/src/lib/3rdparty/qtsingleapplication.cpp b/src/lib/3rdparty/qtsingleapplication.cpp index e10c72a3c..81d75dc42 100644 --- a/src/lib/3rdparty/qtsingleapplication.cpp +++ b/src/lib/3rdparty/qtsingleapplication.cpp @@ -159,8 +159,9 @@ void QtSingleApplication::sysInit(const QString &appId) QtSingleApplication::QtSingleApplication(int &argc, char** argv, bool GUIenabled) : QApplication(argc, argv, GUIenabled) + , peer(0) + , actWin(0) { - sysInit(); } @@ -172,6 +173,8 @@ QtSingleApplication::QtSingleApplication(int &argc, char** argv, bool GUIenabled QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char** argv) : QApplication(argc, argv) + , peer(0) + , actWin(0) { sysInit(appId); } @@ -184,8 +187,9 @@ QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char** */ QtSingleApplication::QtSingleApplication(int &argc, char** argv, Type type) : QApplication(argc, argv, type) + , peer(0) + , actWin(0) { - sysInit(); } @@ -198,6 +202,8 @@ QtSingleApplication::QtSingleApplication(int &argc, char** argv, Type type) */ QtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, visual, cmap) + , peer(0) + , actWin(0) { sysInit(); } @@ -211,6 +217,8 @@ QtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HA */ QtSingleApplication::QtSingleApplication(Display* dpy, int &argc, char** argv, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, argc, argv, visual, cmap) + , peer(0) + , actWin(0) { sysInit(); } @@ -224,6 +232,8 @@ QtSingleApplication::QtSingleApplication(Display* dpy, int &argc, char** argv, Q */ QtSingleApplication::QtSingleApplication(Display* dpy, const QString &appId, int argc, char** argv, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, argc, argv, visual, cmap) + , peer(0) + , actWin(0) { sysInit(appId); } @@ -246,10 +256,15 @@ bool QtSingleApplication::isRunning() #ifdef Q_OS_HAIKU return false; #else - return peer->isClient(); + return (peer && peer->isClient()); #endif } +void QtSingleApplication::setAppId(const QString &id) +{ + sysInit(id); +} + /*! Tries to send the text \a message to the currently running @@ -269,7 +284,7 @@ bool QtSingleApplication::sendMessage(const QString &message, int timeout) #ifdef Q_OS_HAIKU return false; #else - return peer->sendMessage(message, timeout); + return (peer && peer->sendMessage(message, timeout)); #endif } @@ -280,7 +295,7 @@ bool QtSingleApplication::sendMessage(const QString &message, int timeout) */ QString QtSingleApplication::id() const { - return peer->applicationId(); + return (peer ? peer->applicationId() : ""); } @@ -299,6 +314,10 @@ QString QtSingleApplication::id() const void QtSingleApplication::setActivationWindow(QWidget* aw, bool activateOnMessage) { actWin = aw; + if (!peer) { + return; + } + if (activateOnMessage) { connect(peer, SIGNAL(messageReceived(const QString &)), this, SLOT(activateWindow())); } diff --git a/src/lib/3rdparty/qtsingleapplication.h b/src/lib/3rdparty/qtsingleapplication.h index f8a5fd86f..d3d0f29e2 100644 --- a/src/lib/3rdparty/qtsingleapplication.h +++ b/src/lib/3rdparty/qtsingleapplication.h @@ -80,6 +80,7 @@ public: #endif bool isRunning(); + void setAppId(const QString &id); QString id() const; void setActivationWindow(QWidget* aw, bool activateOnMessage = true); diff --git a/src/lib/app/mainapplication.cpp b/src/lib/app/mainapplication.cpp index 6e35264ac..b807b8f7d 100644 --- a/src/lib/app/mainapplication.cpp +++ b/src/lib/app/mainapplication.cpp @@ -54,18 +54,20 @@ #endif #include #include -#include #include -#include -#include #include +#include +#include +#include +#include +#include #if defined(PORTABLE_BUILD) && !defined(NO_SYSTEM_DATAPATH) #define NO_SYSTEM_DATAPATH #endif MainApplication::MainApplication(int &argc, char** argv) - : QtSingleApplication("QupZillaWebBrowser", argc, argv) + : QtSingleApplication(argc, argv) , m_cookiemanager(0) , m_browsingLibrary(0) , m_historymodel(0) @@ -80,6 +82,7 @@ MainApplication::MainApplication(int &argc, char** argv) , m_desktopNotifications(0) , m_searchEnginesManager(0) , m_dbWriter(new DatabaseWriter(this)) + , m_isPrivateSession(false) , m_isClosing(false) , m_isStateChanged(false) , m_isRestoring(false) @@ -135,8 +138,7 @@ MainApplication::MainApplication(int &argc, char** argv) m_postLaunchActions.append(OpenDownloadManager); break; case Qz::CL_StartPrivateBrowsing: - messages.append("ACTION:StartPrivateBrowsing"); - m_postLaunchActions.append(PrivateBrowsing); + m_isPrivateSession = true; break; case Qz::CL_OpenUrlInCurrentTab: startUrl = QUrl::fromUserInput(pair.text); @@ -156,6 +158,11 @@ MainApplication::MainApplication(int &argc, char** argv) } } + // Don't start single application in private browsing + if (!m_isPrivateSession) { + setAppId("QupZillaWebBrowser"); + } + if (messages.isEmpty()) { messages.append(" "); } @@ -201,11 +208,6 @@ MainApplication::MainApplication(int &argc, char** argv) Settings::createSettings(m_activeProfil + "settings.ini"); - Settings settings; - m_startingAfterCrash = settings.value("SessionRestore/isRunning", false).toBool(); - bool checkUpdates = settings.value("Web-Browser-Settings/CheckUpdates", DEFAULT_CHECK_UPDATES).toBool(); - settings.setValue("SessionRestore/isRunning", true); - translateApp(); QupZilla* qupzilla = new QupZilla(Qz::BW_FirstAppWindow, startUrl); @@ -224,8 +226,15 @@ MainApplication::MainApplication(int &argc, char** argv) m_plugins->loadPlugins(); } - if (checkUpdates) { - new Updater(qupzilla); + if (!m_isPrivateSession) { + Settings settings; + m_startingAfterCrash = settings.value("SessionRestore/isRunning", false).toBool(); + bool checkUpdates = settings.value("Web-Browser-Settings/CheckUpdates", DEFAULT_CHECK_UPDATES).toBool(); + settings.setValue("SessionRestore/isRunning", true); + + if (checkUpdates) { + new Updater(qupzilla); + } } QTimer::singleShot(0, this, SLOT(postLaunch())); @@ -236,10 +245,6 @@ MainApplication::MainApplication(int &argc, char** argv) void MainApplication::postLaunch() { - if (m_postLaunchActions.contains(PrivateBrowsing)) { - togglePrivateBrowsingMode(true); - } - if (m_postLaunchActions.contains(OpenDownloadManager)) { downManager()->show(); } @@ -303,7 +308,11 @@ void MainApplication::loadSettings() //Web browsing settings settings.beginGroup("Web-Browser-Settings"); - m_websettings->enablePersistentStorage(m_activeProfil); + + if (!m_isPrivateSession) { + m_websettings->enablePersistentStorage(m_activeProfil); + m_websettings->setAttribute(QWebSettings::LocalStorageEnabled, settings.value("HTML5StorageEnabled", true).toBool()); + } m_websettings->setAttribute(QWebSettings::DeveloperExtrasEnabled, true); m_websettings->setAttribute(QWebSettings::PluginsEnabled, settings.value("allowFlash", true).toBool()); m_websettings->setAttribute(QWebSettings::JavascriptEnabled, settings.value("allowJavaScript", true).toBool()); @@ -315,7 +324,6 @@ void MainApplication::loadSettings() m_websettings->setAttribute(QWebSettings::ZoomTextOnly, settings.value("zoomTextOnly", false).toBool()); m_websettings->setAttribute(QWebSettings::PrintElementBackgrounds, settings.value("PrintElementBackground", true).toBool()); m_websettings->setAttribute(QWebSettings::XSSAuditingEnabled, settings.value("XSSAuditing", false).toBool()); - m_websettings->setAttribute(QWebSettings::LocalStorageEnabled, settings.value("HTML5StorageEnabled", true).toBool()); m_websettings->setMaximumPagesInCache(settings.value("maximumCachedPages", 3).toInt()); m_websettings->setDefaultTextEncoding(settings.value("DefaultEncoding", m_websettings->defaultTextEncoding()).toString()); @@ -353,6 +361,11 @@ void MainApplication::loadSettings() // Allows to load files from qrc: scheme in qupzilla: pages QWebSecurityOrigin::addLocalScheme("qupzilla"); + if (m_isPrivateSession) { + m_websettings->setAttribute(QWebSettings::PrivateBrowsingEnabled, true); + history()->setSaving(false); + } + if (m_downloadManager) { m_downloadManager->loadSettings(); } @@ -418,15 +431,6 @@ QList MainApplication::mainWindows() return list; } -void MainApplication::togglePrivateBrowsingMode(bool state) -{ - webSettings()->setAttribute(QWebSettings::PrivateBrowsingEnabled, state); - history()->setSaving(!state); - cookieJar()->turnPrivateJar(state); - - emit message(Qz::AM_CheckPrivateBrowsing, state); -} - void MainApplication::sendMessages(Qz::AppMessageType mes, bool state) { emit message(mes, state); @@ -454,9 +458,6 @@ void MainApplication::receiveAppMessage(QString message) downManager()->show(); actWin = downManager(); } - else if (text == "StartPrivateBrowsing") { - sendMessages(Qz::AM_StartPrivateBrowsing, true); - } else if (text.startsWith("OpenUrlInCurrentTab")) { actUrl = QUrl::fromUserInput(text.remove("OpenUrlInCurrentTab")); } @@ -534,6 +535,11 @@ void MainApplication::connectDatabase() db.setDatabaseName(m_activeProfil + "browsedata.db"); qWarning("Cannot find SQLite database file! Copying and using the defaults!"); } + + if (m_isPrivateSession) { + db.setConnectOptions("QSQLITE_OPEN_READONLY"); + } + if (!db.open()) { qWarning("Cannot open SQLite database! Continuing without database...."); } @@ -583,6 +589,10 @@ void MainApplication::quitApplication() void MainApplication::saveSettings() { + if (m_isPrivateSession) { + return; + } + m_isClosing = true; m_networkmanager->disconnectObjects(); @@ -730,6 +740,41 @@ DesktopNotificationsFactory* MainApplication::desktopNotifications() return m_desktopNotifications; } +void MainApplication::startPrivateBrowsing() +{ + QStringList args; + foreach(const QString & arg, arguments()) { + if (arg.startsWith("-")) { + args.append(arg); + } + } + + args.append("--private-browsing"); + + if (!QProcess::startDetached(applicationFilePath(), args)) { + qWarning() << "MainApplication: Cannot start new browser process for private browsing!" << applicationFilePath() << args; + } +} + +QUrl MainApplication::userStyleSheet(const QString &filePath) const +{ + QString userStyle; + + QFile file(filePath); + if (!filePath.isEmpty() && file.open(QFile::ReadOnly)) { + userStyle = file.readAll(); + userStyle.remove("\n"); + file.close(); + } + + userStyle.append(AdBlockManager::instance()->elementHidingRules() + "{ display:none !important;}"); + + QString encodedStyle = userStyle.toAscii().toBase64(); + QString dataString = QString("data:text/css;charset=utf-8;base64,%1").arg(encodedStyle); + + return QUrl(dataString); +} + void MainApplication::aboutToCloseWindow(QupZilla* window) { if (!window) { @@ -754,8 +799,7 @@ static const int sessionVersion = 0x0003; bool MainApplication::saveStateSlot() { - if (m_websettings->testAttribute(QWebSettings::PrivateBrowsingEnabled) || - m_isRestoring || m_mainWindows.count() == 0) { + if (m_isPrivateSession || m_isRestoring || m_mainWindows.count() == 0) { return false; } @@ -794,7 +838,7 @@ bool MainApplication::saveStateSlot() bool MainApplication::restoreStateSlot(QupZilla* window) { - if (m_postLaunchActions.contains(PrivateBrowsing)) { + if (m_isPrivateSession) { return false; } @@ -844,25 +888,6 @@ bool MainApplication::restoreStateSlot(QupZilla* window) return true; } -QUrl MainApplication::userStyleSheet(const QString &filePath) const -{ - QString userStyle; - - QFile file(filePath); - if (!filePath.isEmpty() && file.open(QFile::ReadOnly)) { - userStyle = file.readAll(); - userStyle.remove("\n"); - file.close(); - } - - userStyle.append(AdBlockManager::instance()->elementHidingRules() + "{ display:none !important;}"); - - QString encodedStyle = userStyle.toAscii().toBase64(); - QString dataString = QString("data:text/css;charset=utf-8;base64,%1").arg(encodedStyle); - - return QUrl(dataString); -} - bool MainApplication::checkSettingsDir() { /* diff --git a/src/lib/app/mainapplication.h b/src/lib/app/mainapplication.h index b40bdfbf7..6dc9cbd21 100644 --- a/src/lib/app/mainapplication.h +++ b/src/lib/app/mainapplication.h @@ -72,14 +72,13 @@ public: inline static MainApplication* getInstance() { return static_cast(QCoreApplication::instance()); } inline QString currentProfilePath() { return m_activeProfil; } inline QString currentLanguage() { return m_activeLanguage; } + inline bool isPrivateSession() { return m_isPrivateSession; } inline bool isClosing() { return m_isClosing; } inline bool isStartingAfterCrash() { return m_startingAfterCrash; } inline int windowCount() { return m_mainWindows.count(); } bool checkSettingsDir(); - void togglePrivateBrowsingMode(bool state); - QupZilla* getWindow(); CookieManager* cookieManager(); BrowsingLibrary* browsingLibrary(); @@ -109,6 +108,8 @@ public slots: void setStateChanged(); void addNewTab(const QUrl &url = QUrl()); + void startPrivateBrowsing(); + signals: void message(Qz::AppMessageType mes, bool state); @@ -149,6 +150,7 @@ private: QString m_activeLanguage; QString m_activeThemePath; + bool m_isPrivateSession; bool m_isClosing; bool m_isStateChanged; bool m_isRestoring; diff --git a/src/lib/app/qupzilla.cpp b/src/lib/app/qupzilla.cpp index 9b5b485dc..24b7a94d1 100644 --- a/src/lib/app/qupzilla.cpp +++ b/src/lib/app/qupzilla.cpp @@ -108,6 +108,10 @@ QupZilla::QupZilla(Qz::BrowserWindow type, QUrl startUrl) setAttribute(Qt::WA_DeleteOnClose); setWindowTitle(tr("QupZilla")); + if (mApp->isPrivateSession()) { + setProperty("private", QVariant(true)); + } + m_isStarting = true; setupUi(); @@ -450,9 +454,8 @@ void QupZilla::setupMenu() m_menuTools->addAction(QIcon::fromTheme("edit-clear"), tr("Clear Recent &History"), this, SLOT(showClearPrivateData())); m_actionPrivateBrowsing = new QAction(tr("&Private Browsing"), this); m_actionPrivateBrowsing->setShortcut(QKeySequence("Ctrl+Shift+P")); - m_actionPrivateBrowsing->setCheckable(true); - m_actionPrivateBrowsing->setChecked(mApp->webSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled)); - connect(m_actionPrivateBrowsing, SIGNAL(triggered(bool)), this, SLOT(startPrivate(bool))); + m_actionPrivateBrowsing->setVisible(!mApp->isPrivateSession()); + connect(m_actionPrivateBrowsing, SIGNAL(triggered(bool)), mApp, SLOT(startPrivateBrowsing())); m_menuTools->addAction(m_actionPrivateBrowsing); m_menuTools->addSeparator(); #if !defined(Q_WS_X11) && !defined(Q_WS_MAC) @@ -581,8 +584,7 @@ void QupZilla::loadSettings() m_sideBarManager->showSideBar(activeSideBar, false); //Private browsing - m_actionPrivateBrowsing->setChecked(mApp->webSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled)); - m_privateBrowsing->setVisible(mApp->webSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled)); + m_privateBrowsing->setVisible(mApp->isPrivateSession()); #ifdef Q_WS_WIN if (m_usingTransparentBackground && !makeTransparent) { @@ -657,7 +659,7 @@ void QupZilla::setWindowTitle(const QString &t) { QString title = t; - if (mApp->webSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled)) { + if (mApp->isPrivateSession()) { title.append(tr(" (Private Browsing)")); } @@ -695,10 +697,6 @@ void QupZilla::receiveMessage(Qz::AppMessageType mes, bool state) m_bookmarksMenuChanged = true; break; - case Qz::AM_StartPrivateBrowsing: - startPrivate(state); - break; - default: qWarning("Unresolved message sent! This could never happen!"); break; @@ -1499,40 +1497,6 @@ void QupZilla::savePageScreen() p->show(); } -void QupZilla::startPrivate(bool state) -{ - static bool askedThisSession = false; - - Settings settings; - bool askNow = settings.value("Browser-View-Settings/AskOnPrivate", true).toBool(); - - if (state && askNow && !askedThisSession) { - QString title = tr("Are you sure you want to turn on private browsing?"); - QString text1 = tr("When private browsing is turned on, some actions concerning your privacy will be disabled:"); - - QStringList actions; - actions.append(tr("Webpages are not added to the history.")); - actions.append(tr("Current cookies cannot be accessed.")); - actions.append(tr("Your session is not stored.")); - - QString text2 = tr("Until you close the window, you can still click the Back and Forward " - "buttons to return to the webpages you have opened."); - - QString message = QString(QLatin1String("%1

%2

  • %3

%4

")).arg(title, text1, actions.join(QLatin1String("
  • ")), text2); - - QMessageBox::StandardButton button = QMessageBox::question(this, tr("Start Private Browsing"), - message, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); - if (button != QMessageBox::Yes) { - m_actionPrivateBrowsing->setChecked(false); - return; - } - - askedThisSession = true; - } - - mApp->togglePrivateBrowsingMode(state); -} - void QupZilla::resizeEvent(QResizeEvent* event) { m_bookmarksToolbar->setMaximumWidth(width()); diff --git a/src/lib/app/qupzilla.h b/src/lib/app/qupzilla.h index f30f0710d..9db62ec98 100644 --- a/src/lib/app/qupzilla.h +++ b/src/lib/app/qupzilla.h @@ -181,7 +181,6 @@ private slots: void zoomOut(); void zoomReset(); void fullScreen(bool make); - void startPrivate(bool state); void changeEncoding(); void closeWindow(); diff --git a/src/lib/app/qz_namespace.h b/src/lib/app/qz_namespace.h index 81c5e2902..2c2df8ee8 100644 --- a/src/lib/app/qz_namespace.h +++ b/src/lib/app/qz_namespace.h @@ -35,7 +35,6 @@ enum AppMessageType { AM_ReloadSettings, AM_HistoryStateChanged, AM_BookmarksChanged, - AM_StartPrivateBrowsing }; enum BrowserWindow { diff --git a/src/lib/autofill/autofillmodel.cpp b/src/lib/autofill/autofillmodel.cpp index ee66c076e..5882de188 100644 --- a/src/lib/autofill/autofillmodel.cpp +++ b/src/lib/autofill/autofillmodel.cpp @@ -234,7 +234,7 @@ void AutoFillModel::completePage(WebPage* page) void AutoFillModel::post(const QNetworkRequest &request, const QByteArray &outgoingData) { //Dont save in private browsing - if (mApp->webSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled)) { + if (mApp->isPrivateSession()) { return; } diff --git a/src/lib/bookmarks/bookmarkicon.cpp b/src/lib/bookmarks/bookmarkicon.cpp index f9e513874..0ec9231ec 100644 --- a/src/lib/bookmarks/bookmarkicon.cpp +++ b/src/lib/bookmarks/bookmarkicon.cpp @@ -88,7 +88,7 @@ void BookmarkIcon::speedDialChanged() void BookmarkIcon::setBookmarkSaved() { - setProperty("bookmarked", true); + setProperty("bookmarked", QVariant(true)); style()->unpolish(this); style()->polish(this); setToolTip(tr("Edit this bookmark")); @@ -96,7 +96,7 @@ void BookmarkIcon::setBookmarkSaved() void BookmarkIcon::setBookmarkDisabled() { - setProperty("bookmarked", false); + setProperty("bookmarked", QVariant(false)); style()->unpolish(this); style()->polish(this); setToolTip(tr("Bookmark this Page")); diff --git a/src/lib/cookies/cookiejar.cpp b/src/lib/cookies/cookiejar.cpp index 20372c6c5..ed9b18b94 100644 --- a/src/lib/cookies/cookiejar.cpp +++ b/src/lib/cookies/cookiejar.cpp @@ -118,17 +118,11 @@ bool CookieJar::setCookiesFromUrl(const QList &cookieList, const void CookieJar::saveCookies() { - if (m_deleteOnClose) { + if (m_deleteOnClose || mApp->isPrivateSession()) { return; } - QList allCookies; - if (m_tempList.isEmpty()) { - allCookies = getAllCookies(); - } - else { - allCookies = m_tempList; - } + QList allCookies = getAllCookies(); QFile file(m_activeProfil + "cookies.dat"); file.open(QIODevice::WriteOnly); @@ -150,9 +144,10 @@ void CookieJar::saveCookies() void CookieJar::restoreCookies() { - if (!QFile::exists(m_activeProfil + "cookies.dat")) { + if (!QFile::exists(m_activeProfil + "cookies.dat") || mApp->isPrivateSession()) { return; } + QDateTime now = QDateTime::currentDateTime(); QList restoredCookies; @@ -184,12 +179,7 @@ void CookieJar::restoreCookies() void CookieJar::clearCookies() { - if (m_tempList.isEmpty()) { - setAllCookies(QList()); - } - else { - m_tempList.clear(); - } + setAllCookies(QList()); } QList CookieJar::getAllCookies() @@ -201,16 +191,3 @@ void CookieJar::setAllCookies(const QList &cookieList) { QNetworkCookieJar::setAllCookies(cookieList); } - -void CookieJar::turnPrivateJar(bool state) -{ - if (state) { - m_tempList = QNetworkCookieJar::allCookies(); - QNetworkCookieJar::setAllCookies(QList()); - } - else { - QNetworkCookieJar::setAllCookies(m_tempList); - m_tempList.clear(); - } -} - diff --git a/src/lib/cookies/cookiejar.h b/src/lib/cookies/cookiejar.h index c87f465c7..898f0e954 100644 --- a/src/lib/cookies/cookiejar.h +++ b/src/lib/cookies/cookiejar.h @@ -41,10 +41,10 @@ public: void clearCookies(); void setAllowCookies(bool allow); - void turnPrivateJar(bool state); private: QupZilla* p_QupZilla; + bool m_allowCookies; bool m_filterTrackingCookie; bool m_allowCookiesFromDomain; @@ -54,7 +54,6 @@ private: QStringList m_blacklist; QString m_activeProfil; - QList m_tempList; }; #endif // COOKIEJAR_H diff --git a/src/lib/data/html/start.html b/src/lib/data/html/start.html index 76d500a0e..dbef49fcf 100644 --- a/src/lib/data/html/start.html +++ b/src/lib/data/html/start.html @@ -5,6 +5,7 @@