diff options
Diffstat (limited to 'src/application.cpp')
-rw-r--r-- | src/application.cpp | 366 |
1 files changed, 225 insertions, 141 deletions
diff --git a/src/application.cpp b/src/application.cpp index 05004f30..b1419d00 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -2,9 +2,9 @@ * * This file is a part of the rekonq project * -* Copyright (C) 2008-2009 by Andrea Diamantini <adjam7 at gmail dot com> +* Copyright (C) 2008-2010 by Andrea Diamantini <adjam7 at gmail dot com> * Copyright (C) 2009 by Paweł Prażak <pawelprazak at gmail dot com> -* Copyright (C) 2009 by Lionel Chauvin <megabigbug@yahoo.fr> +* Copyright (C) 2009-2010 by Lionel Chauvin <megabigbug@yahoo.fr> * * * This program is free software; you can redistribute it and/or @@ -12,9 +12,9 @@ * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy +* by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. -* +* * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -44,48 +44,60 @@ #include "adblockmanager.h" #include "webview.h" #include "filterurljob.h" +#include "tabbar.h" // KDE Includes #include <KCmdLineArgs> #include <KStandardDirs> #include <kio/job.h> #include <kio/jobclasses.h> -#include <KToolInvocation> #include <KUriFilter> #include <KMessageBox> -#include <KWindowInfo> #include <KUrl> #include <ThreadWeaver/Weaver> // Qt Includes -#include <QRegExp> -#include <QFile> -#include <QFileInfo> #include <QtCore/QTimer> -QPointer<HistoryManager> Application::s_historyManager; -QPointer<BookmarkProvider> Application::s_bookmarkProvider; -QPointer<SessionManager> Application::s_sessionManager; -QPointer<AdBlockManager> Application::s_adblockManager; +QWeakPointer<HistoryManager> Application::s_historyManager; +QWeakPointer<BookmarkProvider> Application::s_bookmarkProvider; +QWeakPointer<SessionManager> Application::s_sessionManager; +QWeakPointer<AdBlockManager> Application::s_adblockManager; Application::Application() - : KUniqueApplication() + : KUniqueApplication() { - connect(Weaver::instance(), SIGNAL( jobDone(ThreadWeaver::Job*) ), - this, SLOT( loadResolvedUrl(ThreadWeaver::Job*) ) ); + connect(Weaver::instance(), SIGNAL(jobDone(ThreadWeaver::Job*)), + this, SLOT(loadResolvedUrl(ThreadWeaver::Job*))); } Application::~Application() { - qDeleteAll(m_mainWindows); + // ok, we are closing well. + // Don't recover on next load.. + ReKonfig::setRecoverOnCrash(0); + saveConfiguration(); + + foreach(QWeakPointer<MainWindow> window, m_mainWindows) + { + delete window.data(); + window.clear(); + } + + delete s_bookmarkProvider.data(); + s_bookmarkProvider.clear(); - delete s_bookmarkProvider; - delete s_historyManager; - delete s_sessionManager; - delete s_adblockManager; + delete s_historyManager.data(); + s_historyManager.clear(); + + delete s_sessionManager.data(); + s_sessionManager.clear(); + + delete s_adblockManager.data(); + s_adblockManager.clear(); } @@ -93,81 +105,69 @@ int Application::newInstance() { KCmdLineArgs::setCwd(QDir::currentPath().toUtf8()); KCmdLineArgs* args = KCmdLineArgs::parsedArgs(); - - // we share one process for several mainwindows, - // so initialize only once - static bool first = true; - - if(args->count() == 0) + + bool isFirstLoad = m_mainWindows.isEmpty(); + + // is your app session restored? restore session... + // this mechanism also falls back to load usual plain rekonq + // if something goes wrong... + if (isFirstLoad && ReKonfig::recoverOnCrash() == 1 && sessionManager()->restoreSession()) + { + QTimer::singleShot(0, this, SLOT(postLaunch())); + kDebug() << "session restored"; + return 1; + } + + if (args->count() == 0) { - if(first) // we are starting rekonq, for the first time with no args: use startup behaviour + if (isFirstLoad) // we are starting rekonq, for the first time with no args: use startup behaviour { - switch(ReKonfig::startupBehaviour()) + switch (ReKonfig::startupBehaviour()) { - case 0: // open home page - mainWindow()->homePage(); - break; - case 1: // open new tab page - loadUrl( KUrl("about:home") ); - break; - case 2: // restore session - if(sessionManager()->restoreSession()) - break; - default: - mainWindow()->homePage(); + case 0: // open home page + mainWindow()->homePage(); + break; + case 1: // open new tab page + loadUrl(KUrl("about:home")); + break; + case 2: // restore session + if (sessionManager()->restoreSession()) break; - } + default: + mainWindow()->homePage(); + break; + } } else // rekonq has just been started. Just open a new window { - newMainWindow(); + loadUrl(KUrl("about:home") , Rekonq::NewWindow); } } - - if (first) - { - QTimer::singleShot(0, this, SLOT(postLaunch())); - first = false; - } - - // is your app session restored? restore session... - // this mechanism also falls back to load usual plain rekonq - // if something goes wrong... - if (isSessionRestored() && sessionManager()->restoreSession()) + else { - kDebug() << "session restored"; - return 1; - } - - // are there args? load them.. - if (args->count() > 0) - { - // is there a window open on the current desktop ? use it! - for (int i = 0; i < m_mainWindows.size(); ++i) + if (isFirstLoad) { - MainWindow *m = m_mainWindows.at(i); - KWindowInfo w = KWindowInfo(m->winId(), NET::WMDesktop); - if(w.isOnCurrentDesktop()) + // No windows in the current desktop? No windows at all? + // Create a new one and load there sites... + loadUrl(args->arg(0), Rekonq::CurrentTab); + for (int i = 1; i < args->count(); ++i) + loadUrl(KUrl(args->arg(i)), Rekonq::SettingOpenTab); + } + else + { + // are there any windows there? use it + int index = m_mainWindows.size(); + if (index > 0) { + MainWindow *m = m_mainWindows.at(index - 1).data(); m->activateWindow(); - m->raise(); - for (int i = 0; i < args->count(); ++i) - loadUrl(args->arg(i), Rekonq::NewCurrentTab); - - return 2; + loadUrl(KUrl(args->arg(i)), Rekonq::NewCurrentTab); } } - - // No windows in the current desktop? No windows at all? - // Create a new one and load there sites... - loadUrl(args->arg(0), Rekonq::CurrentTab); - for (int i = 1; i < args->count(); ++i) - loadUrl(args->arg(i), Rekonq::SettingOpenTab); - - return 3; } - + + QTimer::singleShot(0, this, SLOT(postLaunch())); return 0; } @@ -180,18 +180,26 @@ Application *Application::instance() void Application::postLaunch() { + // updating rekonq configuration + updateConfiguration(); + setWindowIcon(KIcon("rekonq")); - + // set Icon Database Path to store "favicons" associated with web sites QString directory = KStandardDirs::locateLocal("cache" , "" , true); QWebSettings::setIconDatabasePath(directory); Application::historyManager(); Application::sessionManager(); - + // bookmarks loading connect(Application::bookmarkProvider(), SIGNAL(openUrl(const KUrl&, const Rekonq::OpenType&)), Application::instance(), SLOT(loadUrl(const KUrl&, const Rekonq::OpenType&))); + + // crash recovering + int n = ReKonfig::recoverOnCrash(); + ReKonfig::setRecoverOnCrash(++n); + saveConfiguration(); } @@ -203,14 +211,14 @@ void Application::saveConfiguration() const MainWindow *Application::mainWindow() { - if(m_mainWindows.isEmpty()) + if (m_mainWindows.isEmpty()) return newMainWindow(); - + MainWindow *active = qobject_cast<MainWindow*>(QApplication::activeWindow()); - - if(!active) + + if (!active) { - return m_mainWindows.at(0); + return m_mainWindows.at(0).data(); } return active; } @@ -218,53 +226,55 @@ MainWindow *Application::mainWindow() HistoryManager *Application::historyManager() { - if (!s_historyManager) + if (s_historyManager.isNull()) { s_historyManager = new HistoryManager(); - QWebHistoryInterface::setDefaultInterface(s_historyManager); + QWebHistoryInterface::setDefaultInterface(s_historyManager.data()); } - return s_historyManager; + return s_historyManager.data(); } BookmarkProvider *Application::bookmarkProvider() { - if (!s_bookmarkProvider) + if (s_bookmarkProvider.isNull()) { s_bookmarkProvider = new BookmarkProvider(instance()); } - return s_bookmarkProvider; + return s_bookmarkProvider.data(); } SessionManager *Application::sessionManager() { - if(!s_sessionManager) + if (s_sessionManager.isNull()) { s_sessionManager = new SessionManager(instance()); } - return s_sessionManager; + return s_sessionManager.data(); } KIcon Application::icon(const KUrl &url) { - if(!Application::instance()->mainWindowList().isEmpty()) // avoid infinite loop at startup - { + // avoid infinite loop at startup + if (Application::instance()->mainWindowList().isEmpty()) + return KIcon("text-html"); - if(url == KUrl("about:closedTabs")) - return KIcon("tab-close"); - if(url == KUrl("about:history")) - return KIcon("view-history"); - if(url == KUrl("about:bookmarks")) - return KIcon("bookmarks"); - if(url == KUrl("about:favorites")) - return KIcon("emblem-favorite"); - } - - if(url.isEmpty()) + // first things first.. + if (url.isEmpty()) return KIcon("text-html"); - + + // rekonq icons.. + if (url == KUrl("about:closedTabs")) + return KIcon("tab-close"); + if (url == KUrl("about:history")) + return KIcon("view-history"); + if (url == KUrl("about:bookmarks")) + return KIcon("bookmarks"); + if (url == KUrl("about:favorites")) + return KIcon("emblem-favorite"); + KIcon icon = KIcon(QWebSettings::iconForUrl(url)); if (icon.isNull()) { @@ -279,23 +289,20 @@ void Application::loadUrl(const KUrl& url, const Rekonq::OpenType& type) if (url.isEmpty()) return; - // sanitization - KUrl loadingUrl( url.toEncoded() ); - - if ( !loadingUrl.isValid() ) + if (!url.isValid()) { - KMessageBox::error(0, i18n("Malformed URL:\n%1", loadingUrl.url(KUrl::RemoveTrailingSlash))); + KMessageBox::error(0, i18n("Malformed URL:\n%1", url.url(KUrl::RemoveTrailingSlash))); return; } // first, create the webview(s) to not let hangs UI.. WebTab *tab = 0; MainWindow *w = 0; - w = (type == Rekonq::NewWindow) + w = (type == Rekonq::NewWindow) ? newMainWindow() : mainWindow(); - - switch(type) + + switch (type) { case Rekonq::SettingOpenTab: tab = w->mainView()->newWebTab(!ReKonfig::openTabsBack(), ReKonfig::openTabsNearCurrent()); @@ -311,39 +318,34 @@ void Application::loadUrl(const KUrl& url, const Rekonq::OpenType& type) tab = w->mainView()->currentWebTab(); break; }; - + WebView *view = tab->view(); - + if (view) { - FilterUrlJob *job = new FilterUrlJob(view, loadingUrl.pathOrUrl(), this); + FilterUrlJob *job = new FilterUrlJob(view, url.pathOrUrl(), this); Weaver::instance()->enqueue(job); } } - -void Application::loadUrl(const QString& urlString, const Rekonq::OpenType& type) -{ - return loadUrl( QUrl::fromUserInput(urlString), type ); -} - - -MainWindow *Application::newMainWindow() +MainWindow *Application::newMainWindow(bool withTab) { MainWindow *w = new MainWindow(); - w->mainView()->newWebTab(); // remember using newWebTab and NOT newTab here!! - + + if (withTab) + w->mainView()->newWebTab(); // remember using newWebTab and NOT newTab here!! + m_mainWindows.prepend(w); w->show(); - + return w; } void Application::removeMainWindow(MainWindow *window) { - m_mainWindows.removeAt(m_mainWindows.indexOf(window, 0)); + m_mainWindows.removeOne(window); } @@ -355,11 +357,11 @@ MainWindowList Application::mainWindowList() AdBlockManager *Application::adblockManager() { - if(!s_adblockManager) + if (s_adblockManager.isNull()) { s_adblockManager = new AdBlockManager(instance()); } - return s_adblockManager; + return s_adblockManager.data(); } @@ -368,19 +370,101 @@ void Application::loadResolvedUrl(ThreadWeaver::Job *job) FilterUrlJob *threadedJob = static_cast<FilterUrlJob *>(job); KUrl url = threadedJob->url(); WebView *view = threadedJob->view(); - + + // Bye and thanks :) + delete threadedJob; + if (view) { - view->setFocus(); - view->load(url); - + view->load(url); + // we are sure of the url now, let's add it to history // anyway we store here just http sites because local and ftp ones are // added trough the protocol handler and the other are ignored - if( url.protocol() == QLatin1String("http") || url.protocol() == QLatin1String("https") ) - historyManager()->addHistoryEntry( url.prettyUrl() ); + if (url.protocol() == QL1S("http") || url.protocol() == QL1S("https")) + historyManager()->addHistoryEntry(url.prettyUrl()); } - - // Bye and thanks :) - delete threadedJob; +} + + +void Application::newWindow() +{ + loadUrl(KUrl("about:home"), Rekonq::NewWindow); + mainWindow()->mainView()->urlBarWidget()->setFocus(); +} + + +void Application::updateConfiguration() +{ + // FIXME: + // all things related to mainview can be + // improved/moved/replicated in all the mainwindows + MainView *view = mainWindow()->mainView(); + + // ============== General ================== + view->updateTabBar(); + + // ============== Tabs ================== + if (ReKonfig::closeTabSelectPrevious()) + view->tabBar()->setSelectionBehaviorOnRemove(QTabBar::SelectPreviousTab); + else + view->tabBar()->setSelectionBehaviorOnRemove(QTabBar::SelectRightTab); + + // =========== Encodings & Fonts ============== + QWebSettings *defaultSettings = QWebSettings::globalSettings(); + + defaultSettings->setDefaultTextEncoding(ReKonfig::defaultEncoding()); + + int fnSize = ReKonfig::fontSize(); + int minFnSize = ReKonfig::minFontSize(); + + QFont standardFont = ReKonfig::standardFont(); + defaultSettings->setFontFamily(QWebSettings::StandardFont, standardFont.family()); + defaultSettings->setFontSize(QWebSettings::DefaultFontSize, fnSize); + defaultSettings->setFontSize(QWebSettings::MinimumFontSize, minFnSize); + + QFont fixedFont = ReKonfig::fixedFont(); + defaultSettings->setFontFamily(QWebSettings::FixedFont, fixedFont.family()); + defaultSettings->setFontSize(QWebSettings::DefaultFixedFontSize, fnSize); + + // ================ WebKit ============================ + defaultSettings->setAttribute(QWebSettings::AutoLoadImages, ReKonfig::autoLoadImages()); + defaultSettings->setAttribute(QWebSettings::DnsPrefetchEnabled, ReKonfig::dnsPrefetch()); + defaultSettings->setAttribute(QWebSettings::JavascriptEnabled, ReKonfig::javascriptEnabled()); + defaultSettings->setAttribute(QWebSettings::JavaEnabled, ReKonfig::javaEnabled()); + defaultSettings->setAttribute(QWebSettings::JavascriptCanOpenWindows, ReKonfig::javascriptCanOpenWindows()); + defaultSettings->setAttribute(QWebSettings::JavascriptCanAccessClipboard, ReKonfig::javascriptCanAccessClipboard()); + defaultSettings->setAttribute(QWebSettings::LinksIncludedInFocusChain, ReKonfig::linksIncludedInFocusChain()); + defaultSettings->setAttribute(QWebSettings::ZoomTextOnly, ReKonfig::zoomTextOnly()); + defaultSettings->setAttribute(QWebSettings::PrintElementBackgrounds, ReKonfig::printElementBackgrounds()); + + if (ReKonfig::pluginsEnabled() == 2) + defaultSettings->setAttribute(QWebSettings::PluginsEnabled, false); + else + defaultSettings->setAttribute(QWebSettings::PluginsEnabled, true); + + // ===== HTML 5 features WebKit support ====== + defaultSettings->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, ReKonfig::offlineStorageDatabaseEnabled()); + defaultSettings->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, ReKonfig::offlineWebApplicationCacheEnabled()); + defaultSettings->setAttribute(QWebSettings::LocalStorageEnabled, ReKonfig::localStorageEnabled()); + if (ReKonfig::localStorageEnabled()) + { + QString path = KStandardDirs::locateLocal("cache", QString("WebkitLocalStorage/rekonq"), true); + path.remove("rekonq"); + QWebSettings::setOfflineStoragePath(path); + QWebSettings::setOfflineStorageDefaultQuota(50000); + } + + // Applies user defined CSS to all open webpages. If there no longer is a + // user defined CSS removes it from all open webpages. + if (ReKonfig::userCSS().isEmpty()) + defaultSettings->setUserStyleSheetUrl(KUrl(KStandardDirs::locate("appdata" , "default.css"))); + else + defaultSettings->setUserStyleSheetUrl(ReKonfig::userCSS()); + + // ====== load Settings on main classes + Application::historyManager()->loadSettings(); + Application::adblockManager()->loadSettings(); + + defaultSettings = 0; } |