summaryrefslogtreecommitdiff
path: root/src/application.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/application.cpp')
-rw-r--r--src/application.cpp366
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;
}