summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--INSTALL4
-rw-r--r--src/bookmarks/bookmarkcontextmenu.cpp10
-rw-r--r--src/bookmarks/bookmarksmanager.cpp4
-rw-r--r--src/data/home.html44
-rw-r--r--src/data/rekonq.desktop3
-rw-r--r--src/mainview.cpp24
-rw-r--r--src/mainview.h1
-rw-r--r--src/mainwindow.cpp36
-rw-r--r--src/settings/generalwidget.cpp2
-rw-r--r--src/urlbar/listitem.cpp11
-rw-r--r--src/urlbar/rsswidget.cpp5
-rw-r--r--src/urlbar/urlresolver.cpp40
-rw-r--r--src/urlbar/urlresolver.h13
-rw-r--r--src/webpage.cpp380
-rw-r--r--src/webpage.h13
-rw-r--r--src/webview.cpp2
16 files changed, 337 insertions, 255 deletions
diff --git a/INSTALL b/INSTALL
index 85571f57..62a57536 100644
--- a/INSTALL
+++ b/INSTALL
@@ -30,4 +30,6 @@ then be found in build/src and is executed with ./rekonq.
=== Getting Help ===
-If you need help with rekonq, you can find it in the irc-channel #rekonq on freenode. \ No newline at end of file
+If you need help with rekonq, you can find it in the irc-channel #rekonq on irc.freenode.net or by viewing the Handbook that comes with rekonq.
+You can view the rekonq Handbook by pressing F1 after starting rekonq.
+Techbase page : http://techbase.kde.org/Projects/rekonq
diff --git a/src/bookmarks/bookmarkcontextmenu.cpp b/src/bookmarks/bookmarkcontextmenu.cpp
index 47608710..c96fa7bf 100644
--- a/src/bookmarks/bookmarkcontextmenu.cpp
+++ b/src/bookmarks/bookmarkcontextmenu.cpp
@@ -213,11 +213,12 @@ void BookmarkContextMenu::deleteBookmark()
{
KBookmark bm = bookmark();
bool folder = bm.isGroup();
+ QString name = QString(bm.text()).replace("&&", "&");
if (KMessageBox::warningContinueCancel(
QApplication::activeWindow(),
- folder ? i18n("Are you sure you wish to remove the bookmark folder\n\"%1\"?", bm.text())
- : i18n("Are you sure you wish to remove the bookmark\n\"%1\"?", bm.text()),
+ folder ? i18n("Are you sure you wish to remove the bookmark folder\n\"%1\"?", name)
+ : i18n("Are you sure you wish to remove the bookmark\n\"%1\"?", name),
folder ? i18n("Bookmark Folder Deletion")
: i18n("Bookmark Deletion"),
KStandardGuiItem::del())
@@ -233,9 +234,10 @@ void BookmarkContextMenu::deleteBookmark()
void BookmarkContextMenu::editBookmark()
{
KBookmark selected = bookmark();
-
+ selected.setFullText(selected.text().replace("&&", "&"));
KBookmarkDialog *dialog = owner()->bookmarkDialog(manager(), QApplication::activeWindow());
dialog->editBookmark(selected);
+ selected.setFullText(selected.text().replace("&", "&&"));
delete dialog;
}
@@ -317,7 +319,7 @@ void BookmarkContextMenu::bookmarkCurrentPage()
if (selected.isGroup())
parent = selected.toGroup();
- KBookmark newBk = parent.addBookmark(owner()->currentTitle(), KUrl(owner()->currentUrl()), "text-html");
+ KBookmark newBk = parent.addBookmark(owner()->currentTitle().replace("&", "&&"), KUrl(owner()->currentUrl()), "text-html");
parent.moveBookmark(newBk, selected.parentGroup().previous(selected));
}
diff --git a/src/bookmarks/bookmarksmanager.cpp b/src/bookmarks/bookmarksmanager.cpp
index 0c437934..503e1df8 100644
--- a/src/bookmarks/bookmarksmanager.cpp
+++ b/src/bookmarks/bookmarksmanager.cpp
@@ -409,7 +409,9 @@ void BookmarkProvider::fillBookmarkBar(KToolBar *toolBar)
else
{
- toolBar->addAction(new KBookmarkAction(bookmark, m_owner, this));
+ KBookmarkAction* a = new KBookmarkAction(bookmark, m_owner, this);
+ a->setIconText(a->iconText().replace("&", "&&"));
+ toolBar->addAction(a);
}
}
}
diff --git a/src/data/home.html b/src/data/home.html
index 25236743..cedd8855 100644
--- a/src/data/home.html
+++ b/src/data/home.html
@@ -40,9 +40,7 @@ font: normal bold 1em;
a {
color: #3F7AB7;
text-decoration: none;
--webkit-transition-property: color;
--webkit-transition-duration: 0.5s;
--webkit-transition-timing-function: ease;
+-webkit-transition: color 0.5s ease;
}
a:hover {
color: black;
@@ -81,7 +79,12 @@ height: 16px;
.link {
display: inline-block;
+-webkit-transition: opacity 0.5s ease;
}
+.link:not(.current):hover {
+opacity: 0.6;
+}
+
.link img, .link span {
vertical-align: middle; display: inline-block;
}
@@ -89,15 +92,6 @@ vertical-align: middle; display: inline-block;
color: black;
}
-#actions .link {
--webkit-transition-property: opacity;
--webkit-transition-duration: 0.8s;
--webkit-transition-timing-function: ease;
-opacity: 0.2;
-}
-#actions .link:hover {
-opacity: 1;
-}
#actions .link img {
margin-right: 3px; width: 16px;
}
@@ -141,22 +135,13 @@ background: url(%2/bg.png) no-repeat;
padding: 0 12px;
}
-.thumbnail:hover .preview ,
-.thumbnail:hover .button img {
-opacity: 0.8;
-}
-.button img, .preview {
--webkit-transition-property: opacity;
--webkit-transition-duration: 0.8s;
--webkit-transition-timing-function: ease-in-out;
-}
-
.button img {
display: inline-block;
width: 16px;
height: 16px;
opacity: 0;
}
+
.remove {
float: right;
}
@@ -164,7 +149,20 @@ float: right;
float: left;
}
-.thumbnail a:hover, .thumbnail span {
+.button img, .preview {
+-webkit-transition: opacity 0.8s ease-in-out;
+}
+.thumb-inner:hover .preview {
+opacity: 0.6;
+}
+.thumb-inner:hover .button img {
+opacity: 0.4;
+-webkit-transition: opacity 0.8s ease-out;
+}
+.thumb-inner .button img:hover {
+opacity: 1;
+}
+.thumbnail a:hover {
color:#3F7AB7;
}
diff --git a/src/data/rekonq.desktop b/src/data/rekonq.desktop
index 5f4291b7..1aca0333 100644
--- a/src/data/rekonq.desktop
+++ b/src/data/rekonq.desktop
@@ -5,6 +5,7 @@ Name[da]=rekonq
Name[de]=rekonq
Name[en_GB]=rekonq
Name[es]=rekonq
+Name[et]=rekonq
Name[fr]=rekonq
Name[ga]=rekonq
Name[it]=rekonq
@@ -22,6 +23,8 @@ Name[zh_TW]=rekonq
GenericName=WebKit KDE Browser
GenericName[da]=KDE-browser baseret på WebKit
GenericName[de]=WebKit-basierter Webbrowser für KDE
+GenericName[et]=KDE WebKiti veebibrauser
+GenericName[fr]=Navigateur Webkit pour KDE
GenericName[pt]=Navegador do KDE Usando o WebKit
GenericName[pt_BR]=Navegador WebKit do KDE
GenericName[sv]=Webkit webbläsare för KDE
diff --git a/src/mainview.cpp b/src/mainview.cpp
index 1c36adcf..0bc6fbde 100644
--- a/src/mainview.cpp
+++ b/src/mainview.cpp
@@ -512,6 +512,8 @@ void MainView::closeTab(int index, bool del)
UrlBar *urlbar = _widgetBar->urlBar(index);
_widgetBar->removeWidget(urlbar);
+ _widgetBar->setCurrentIndex(m_currentTabIndex);
+
if (del)
{
tab->deleteLater(); // tab is scheduled for deletion.
@@ -592,11 +594,10 @@ void MainView::webViewIconChanged()
void MainView::webViewTitleChanged(const QString &title)
{
- QString tabTitle = title;
- if (title.isEmpty())
- {
- tabTitle = i18n("(Untitled)");
- }
+ QString viewTitle = title.isEmpty()? i18n("(Untitled)") : title;
+ QString tabTitle = viewTitle;
+ tabTitle.replace("&", "&&");
+
WebView *view = qobject_cast<WebView *>(sender());
int index = indexOf(view->parentWidget());
if (-1 != index)
@@ -605,7 +606,7 @@ void MainView::webViewTitleChanged(const QString &title)
}
if (currentIndex() == index)
{
- emit currentTitle(tabTitle);
+ emit currentTitle(viewTitle);
}
Application::historyManager()->updateHistoryEntry(view->url(), tabTitle);
}
@@ -657,6 +658,17 @@ void MainView::openClosedTab()
}
}
+void MainView::switchToTab()
+{
+ // uses the sender to determine the tab index
+ QAction *sender = static_cast<QAction*>(QObject::sender());
+ int index = sender->data().toInt();
+ index -= 1; // to compensate for off by 1 presented to the user
+ if( index < 0 || index >= count() )
+ return;
+ setCurrentIndex( index );
+}
+
QLabel *MainView::animatedLoading(int index, bool addMovie)
{
if (index == -1)
diff --git a/src/mainview.h b/src/mainview.h
index 0cff4c81..636d37ac 100644
--- a/src/mainview.h
+++ b/src/mainview.h
@@ -135,6 +135,7 @@ public slots:
void detachTab(int index = -1);
void openClosedTabs();
void openClosedTab();
+ void switchToTab();
// WEB slot actions
void webReload();
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 54e64ab6..43418ed3 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -320,7 +320,9 @@ void MainWindow::setupActions()
browserLoading(false); //first init for blank start page
a = new KAction(i18n("Open Location"), this);
- a->setShortcut(Qt::CTRL + Qt::Key_L);
+ KShortcut openLocationShortcut(Qt::CTRL + Qt::Key_L);
+ openLocationShortcut.setAlternate(Qt::Key_F6);
+ a->setShortcut(openLocationShortcut);
actionCollection()->addAction(QL1S("open_location"), a);
connect(a, SIGNAL(triggered(bool)) , this, SLOT(openLocation()));
@@ -398,6 +400,16 @@ void MainWindow::setupActions()
closedTabsMenu->setDelayed(false);
actionCollection()->addAction(QL1S("closed_tab_menu"), closedTabsMenu);
+ // shortcuts for quickly switching to a tab
+ for( int i = 1; i <= 9; i++ ) {
+ a = new KAction(i18n("Switch to Tab %1", i), this);
+ a->setShortcut(KShortcut( QString("Alt+%1").arg(i) ));
+ a->setData( QVariant(i) );
+ actionCollection()->addAction(QL1S(("switch_tab_" + QString::number(i)).toAscii()), a);
+ connect(a, SIGNAL(triggered(bool)), m_view, SLOT(switchToTab()));
+ }
+
+
// ============================== Indexed Tab Actions ====================================
a = new KAction(KIcon("tab-close"), i18n("&Close Tab"), this);
actionCollection()->addAction(QL1S("close_tab"), a);
@@ -941,26 +953,8 @@ void MainWindow::viewPageSource()
if (!currentTab())
return;
- KUrl url(currentTab()->url());
- bool isTempFile = false;
- if (!url.isLocalFile())
- {
- KTemporaryFile sourceFile;
-
- /// TODO: autochoose tempfile suffix
- sourceFile.setSuffix(QString(".html"));
- sourceFile.setAutoRemove(false);
-
- if (sourceFile.open())
- {
- sourceFile.write(currentTab()->page()->mainFrame()->toHtml().toUtf8());
-
- url = KUrl();
- url.setPath(sourceFile.fileName());
- isTempFile = true;
- }
- }
- KRun::runUrl(url, QL1S("text/plain"), this, isTempFile);
+ KUrl url = currentTab()->url();
+ KRun::runUrl(url, QL1S("text/plain"), this, false);
}
diff --git a/src/settings/generalwidget.cpp b/src/settings/generalwidget.cpp
index fc2d4d5d..09c9e5c7 100644
--- a/src/settings/generalwidget.cpp
+++ b/src/settings/generalwidget.cpp
@@ -69,7 +69,7 @@ void GeneralWidget::hasChanged()
void GeneralWidget::setHomeToCurrentPage()
{
- MainWindow *mw = qobject_cast<MainWindow*>(parent());
+ MainWindow *mw = Application::instance()->mainWindow();
WebTab *webTab = mw->currentTab();
if (webTab)
{
diff --git a/src/urlbar/listitem.cpp b/src/urlbar/listitem.cpp
index f91840d2..5254c7dc 100644
--- a/src/urlbar/listitem.cpp
+++ b/src/urlbar/listitem.cpp
@@ -220,7 +220,16 @@ PreviewListItem::PreviewListItem(const UrlSearchItem &item, const QString &text,
QVBoxLayout *vLayout = new QVBoxLayout;
vLayout->setMargin(0);
- vLayout->addWidget(new TextLabel(item.title, text, this));
+
+ QString title = item.title;
+ if (title.isEmpty())
+ {
+ title = item.url.url();
+ title = title.remove("http://");
+ title.truncate(title.indexOf("/"));
+ }
+
+ vLayout->addWidget(new TextLabel(title, text, this));
vLayout->addWidget(new TextLabel("<i>" + item.url.url() + "</i>", text, this));
hLayout->addLayout(vLayout);
diff --git a/src/urlbar/rsswidget.cpp b/src/urlbar/rsswidget.cpp
index 07b45853..6cd63b95 100644
--- a/src/urlbar/rsswidget.cpp
+++ b/src/urlbar/rsswidget.cpp
@@ -115,9 +115,12 @@ RSSWidget::~RSSWidget()
void RSSWidget::showAt(const QPoint &pos)
{
+ adjustSize();
+
QPoint p;
- p.setX(pos.x() - 200);
+ p.setX(pos.x() - width());
p.setY(pos.y() + 10);
+
move(p);
show();
}
diff --git a/src/urlbar/urlresolver.cpp b/src/urlbar/urlresolver.cpp
index 21e3fe9c..07b40bac 100644
--- a/src/urlbar/urlresolver.cpp
+++ b/src/urlbar/urlresolver.cpp
@@ -141,12 +141,23 @@ UrlSearchList UrlResolver::orderedSearchItems()
int checkPoint = 9 - firstResults;
UrlSearchList historyList = historyResolution();
+ UrlSearchItem privileged = privilegedItem(&historyList);
int historyResults = historyList.count();
+
+ UrlSearchList bookmarksList = bookmarksResolution();
+ if (privileged.type == UrlSearchItem::Undefined)
+ {
+ privileged = privilegedItem(&bookmarksList);
+ }
+
+ if (privileged.type != UrlSearchItem::Undefined)
+ {
+ list.insert(0,privileged);
+ }
- UrlSearchList bookmarksList = bookmarksResolution();
- int bookmarkResults = bookmarksList.count();
+ int bookmarksResults = bookmarksList.count();
- if (historyResults + bookmarkResults > checkPoint)
+ if (historyResults + bookmarksResults > checkPoint)
{
historyList = historyList.mid(0, 3);
bookmarksList = bookmarksList.mid(0, 3);
@@ -178,8 +189,6 @@ UrlSearchList UrlResolver::orderedSearchItems()
list << i;
}
- list = placeTypedDomaineNameOnTop(list);
-
return list;
}
@@ -246,22 +255,19 @@ UrlSearchList UrlResolver::bookmarksResolution()
}
-UrlSearchList UrlResolver::placeTypedDomaineNameOnTop(UrlSearchList list)
+UrlSearchItem UrlResolver::privilegedItem(UrlSearchList* list)
{
- int i = 0;
- bool found = false;
-
- while(i<list.count() && !found)
+ int i=0;
+ while(i<list->count())
{
- UrlSearchItem item = list.at(i);
- if (item.url.url().contains("."+_typedString+".") || item.url.url().contains("/"+_typedString+"."))
+ UrlSearchItem item = list->at(i);
+ kDebug() << item.url.host();
+ if (item.url.host().contains( _typedString + QL1C('.') ) )
{
- list.removeAt(i);
- list.insert(0,item);
- found = true;
+ list->removeAt(i);
+ return item;
}
i++;
}
-
- return list;
+ return UrlSearchItem();
}
diff --git a/src/urlbar/urlresolver.h b/src/urlbar/urlresolver.h
index 0c7df8c8..2249ea32 100644
--- a/src/urlbar/urlresolver.h
+++ b/src/urlbar/urlresolver.h
@@ -45,6 +45,7 @@ public:
enum types
{
+ Undefined = 0x00000000,
Search = 0x00000001,
Browse = 0x00000010,
History = 0x00000100,
@@ -54,7 +55,15 @@ public:
int type;
KUrl url;
QString title;
-
+
+ UrlSearchItem(const UrlSearchItem &item)
+ : type(item.type), url(item.url), title(item.title)
+ {};
+
+ UrlSearchItem()
+ : type(UrlSearchItem::Undefined), url(KUrl()), title("")
+ {};
+
UrlSearchItem(const int &_type, const KUrl &_url, const QString &_title = QString())
: type(_type), url(_url), title(_title)
{};
@@ -82,7 +91,7 @@ private:
UrlSearchList historyResolution();
UrlSearchList qurlFromUserInputResolution();
UrlSearchList bookmarksResolution();
- UrlSearchList placeTypedDomaineNameOnTop(UrlSearchList list);
+ UrlSearchItem privilegedItem(UrlSearchList* list);
static QRegExp _browseRegexp;
};
diff --git a/src/webpage.cpp b/src/webpage.cpp
index 507263cc..00745445 100644
--- a/src/webpage.cpp
+++ b/src/webpage.cpp
@@ -97,6 +97,72 @@ static bool domainSchemeMatch(const QUrl& u1, const QUrl& u2)
}
+// NOTE
+// This is heavily based on the one from KdeWebKit and
+// extended to provide the extra functionality we need:
+// 1. KGet Integration
+// 2. Save downloads history
+static bool downloadResource (const KUrl& srcUrl, const KIO::MetaData& metaData = KIO::MetaData(),
+ QWidget* parent = 0, const QString& suggestedName = QString())
+{
+ KUrl destUrl;
+
+ int result = KIO::R_OVERWRITE;
+ const QUrl fileName ((suggestedName.isEmpty() ? srcUrl.fileName() : suggestedName));
+
+ do
+ {
+ destUrl = KFileDialog::getSaveFileName(fileName, QString(), parent);
+
+ if (destUrl.isLocalFile())
+ {
+ QFileInfo finfo (destUrl.toLocalFile());
+ if (finfo.exists())
+ {
+ QDateTime now = QDateTime::currentDateTime();
+ KIO::RenameDialog dlg (parent, i18n("Overwrite File?"), srcUrl, destUrl,
+ KIO::RenameDialog_Mode(KIO::M_OVERWRITE | KIO::M_SKIP),
+ -1, finfo.size(),
+ now.toTime_t(), finfo.created().toTime_t(),
+ now.toTime_t(), finfo.lastModified().toTime_t());
+ result = dlg.exec();
+ }
+ }
+ }
+ while (result == KIO::R_CANCEL && destUrl.isValid());
+
+ // Save download on history manager
+ Application::historyManager()->addDownload(srcUrl.pathOrUrl() , destUrl.pathOrUrl());
+
+ if (ReKonfig::kgetDownload())
+ {
+ //KGet integration:
+ if (!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.kget"))
+ {
+ KToolInvocation::kdeinitExecWait("kget");
+ }
+ QDBusInterface kget("org.kde.kget", "/KGet", "org.kde.kget.main");
+ if (kget.isValid())
+ {
+ kget.call("addTransfer", srcUrl.prettyUrl(), destUrl.prettyUrl(), true);
+ return true;
+ }
+ return false;
+ }
+
+ KIO::Job *job = KIO::file_copy(srcUrl, destUrl, -1, KIO::Overwrite);
+
+ if (!metaData.isEmpty())
+ job->setMetaData(metaData);
+
+ job->addMetaData(QL1S("MaxCacheSize"), QL1S("0")); // Don't store in http cache.
+ job->addMetaData(QL1S("cache"), QL1S("cache")); // Use entry from cache if available.
+ job->uiDelegate()->setAutoErrorHandlingEnabled(true);
+ return true;
+
+}
+
+
// ---------------------------------------------------------------------------------
@@ -246,111 +312,151 @@ void WebPage::handleUnsupportedContent(QNetworkReply *reply)
if (_protHandler.postHandling(reply->request(), mainFrame()))
return;
- if (reply->error() == QNetworkReply::NoError)
- {
- KUrl replyUrl = reply->url();
+ if (reply->error() != QNetworkReply::NoError)
+ return;
+
+ KUrl replyUrl = reply->url();
- // HACK -------------------------------------------
- QString mimeType;
- QString suggestedFileName;
-
- QString app = reply->header(QNetworkRequest::ContentTypeHeader).toString();
- QStringList headerList = app.split( ';' );
-
- if(headerList.count() > 0)
+ // HACK -------------------------------------------
+ // This is done to fix #231204 && #212808
+
+ QString mimeType;
+ QString suggestedFileName;
+
+ QString app = reply->header(QNetworkRequest::ContentTypeHeader).toString();
+ QStringList headerList = app.split( ';' );
+
+ if(headerList.count() > 0)
+ {
+ mimeType = headerList.takeFirst().trimmed();
+ Q_FOREACH(const QString &head, headerList)
{
- mimeType = headerList.takeFirst().trimmed();
- Q_FOREACH(const QString &head, headerList)
+ if( head.contains( QL1S("name") ) )
{
- if( head.contains( QL1S("name") ) )
- {
- // this is not so sure.. :)
- suggestedFileName = head;
- suggestedFileName = suggestedFileName.remove( QL1S("name=") );
- suggestedFileName = suggestedFileName.remove( '"' );
- suggestedFileName = suggestedFileName.trimmed();
- break;
- }
+ // this is not so sure.. :)
+ suggestedFileName = head;
+ suggestedFileName = suggestedFileName.remove( QL1S("name=") );
+ suggestedFileName = suggestedFileName.remove( '"' );
+ suggestedFileName = suggestedFileName.trimmed();
+ break;
}
}
- else
+ }
+ else
+ {
+ mimeType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
+ }
+
+ // NOTE
+ // This part has been copied from KWebPage::downloadResponse code
+ if (reply->hasRawHeader("Content-Disposition"))
+ {
+ KIO::MetaData metaData = reply->attribute(static_cast<QNetworkRequest::Attribute>(KIO::AccessManager::MetaData)).toMap();
+ if (metaData.value(QL1S("content-disposition-type")).compare(QL1S("attachment"), Qt::CaseInsensitive) == 0)
+ {
+ suggestedFileName = metaData.value(QL1S("content-disposition-filename"));
+ }
+ else
{
- mimeType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
+ const QString value = QL1S(reply->rawHeader("Content-Disposition").simplified());
+ if (value.startsWith(QL1S("attachment"), Qt::CaseInsensitive))
+ {
+ const int length = value.size();
+ int pos = value.indexOf(QL1S("filename"), 0, Qt::CaseInsensitive);
+ if (pos > -1)
+ {
+ pos += 9;
+ while (pos < length && (value.at(pos) == QL1C(' ') || value.at(pos) == QL1C('=') || value.at(pos) == QL1C('"')))
+ pos++;
+
+ int endPos = pos;
+ while (endPos < length && value.at(endPos) != QL1C('"') && value.at(endPos) != QL1C(';'))
+ endPos++;
+
+ if (endPos > pos)
+ {
+ suggestedFileName = value.mid(pos, (endPos-pos)).trimmed();
+ }
+ }
+ }
}
- // ------------------------------------------------
-
- KService::Ptr appService = KMimeTypeTrader::self()->preferredService(mimeType);
-
- bool isLocal = replyUrl.isLocalFile();
+ }
+
+ kDebug() << "Detected MimeType = " << mimeType;
+ kDebug() << "Suggested File Name = " << suggestedFileName;
+ // ------------------------------------------------
+
+ KService::Ptr appService = KMimeTypeTrader::self()->preferredService(mimeType);
- if (appService.isNull()) // no service can handle this. We can just download it..
- {
- kDebug() << "no service can handle this. We can just download it..";
+ bool isLocal = replyUrl.isLocalFile();
- isLocal
- ? KMessageBox::sorry(view(), i18n("No service can handle this :("))
- : downloadThings(reply->request(), suggestedFileName);
+ if (appService.isNull()) // no service can handle this. We can just download it..
+ {
+ kDebug() << "no service can handle this. We can just download it..";
- return;
- }
+ isLocal
+ ? KMessageBox::sorry(view(), i18n("No service can handle this :("))
+ : downloadReply(reply, suggestedFileName);
- if (!isLocal)
- {
+ return;
+ }
- KParts::BrowserOpenOrSaveQuestion dlg(Application::instance()->mainWindow(), replyUrl, mimeType);
- if(!suggestedFileName.isEmpty())
- dlg.setSuggestedFileName(suggestedFileName);
-
- switch (dlg.askEmbedOrSave())
- {
- case KParts::BrowserOpenOrSaveQuestion::Save:
- kDebug() << "user choice: no services, just download!";
- downloadThings(reply->request(), suggestedFileName);
- return;
+ if (!isLocal)
+ {
- case KParts::BrowserOpenOrSaveQuestion::Cancel:
- return;
+ KParts::BrowserOpenOrSaveQuestion dlg(Application::instance()->mainWindow(), replyUrl, mimeType);
+ if(!suggestedFileName.isEmpty())
+ dlg.setSuggestedFileName(suggestedFileName);
+
+ switch (dlg.askEmbedOrSave())
+ {
+ case KParts::BrowserOpenOrSaveQuestion::Save:
+ kDebug() << "user choice: no services, just download!";
+ downloadReply(reply, suggestedFileName);
+ return;
- default: // non extant case
- break;
- }
- }
+ case KParts::BrowserOpenOrSaveQuestion::Cancel:
+ return;
- // case KParts::BrowserRun::Embed
- KService::List partServices = KMimeTypeTrader::self()->query(mimeType, QL1S("KParts/ReadOnlyPart"));
- if (partServices.count() > 0)
- {
- QString p = replyUrl.pathOrUrl();
-
- // A part can handle this. Embed it!
- QString html;
- html += "<html>";
- html += "<head>";
- html += "<title>";
- html += p;
- html += "</title>";
- html += "<style type=\"text/css\">";
- html += "* { border: 0; padding: 0; margin: 0; }";
- html += "</style>";
- html += "</head>";
- html += "<body>";
- html += "<object type=\"" + mimeType + "\" data=\"" + p + "\" width=\"100%\" height=\"100%\" />";
- html += "</body>";
- html += "</html>";
-
- mainFrame()->setHtml(html);
- _isOnRekonqPage = true;
- Application::instance()->mainWindow()->mainView()->urlBar()->setQUrl(replyUrl);
- Application::instance()->mainWindow()->updateActions();
- }
- else
- {
- // No parts, just app services. Load it!
- KRun::run(*appService, replyUrl, 0);
+ default: // non extant case
+ break;
}
+ }
- return;
+ // case KParts::BrowserRun::Embed
+ KService::List partServices = KMimeTypeTrader::self()->query(mimeType, QL1S("KParts/ReadOnlyPart"));
+ if (partServices.count() > 0)
+ {
+ QString p = replyUrl.pathOrUrl();
+
+ // A part can handle this. Embed it!
+ QString html;
+ html += "<html>";
+ html += "<head>";
+ html += "<title>";
+ html += p;
+ html += "</title>";
+ html += "<style type=\"text/css\">";
+ html += "* { border: 0; padding: 0; margin: 0; }";
+ html += "</style>";
+ html += "</head>";
+ html += "<body>";
+ html += "<object type=\"" + mimeType + "\" data=\"" + p + "\" width=\"100%\" height=\"100%\" />";
+ html += "</body>";
+ html += "</html>";
+
+ mainFrame()->setHtml(html);
+ _isOnRekonqPage = true;
+ Application::instance()->mainWindow()->mainView()->urlBar()->setQUrl(replyUrl);
+ Application::instance()->mainWindow()->updateActions();
}
+ else
+ {
+ // No parts, just app services. Load it!
+ KRun::run(*appService, replyUrl, 0);
+ }
+
+ return;
}
@@ -402,24 +508,28 @@ void WebPage::manageNetworkErrors(QNetworkReply *reply)
}
break;
+ case QNetworkReply::OperationCanceledError: // operation canceled via abort() or close() calls
+ // ignore this..
+ return;
+
case QNetworkReply::ContentAccessDenied: // access to remote content denied (similar to HTTP error 401)
kDebug() << "We (hopefully) are managing this through the adblock :)";
break;
case QNetworkReply::UnknownNetworkError: // unknown network-related error detected
- if (_protHandler.postHandling(reply->request(), mainFrame()))
- break;
+ _protHandler.postHandling(reply->request(), mainFrame());
+ return;
case QNetworkReply::ConnectionRefusedError: // remote server refused connection
case QNetworkReply::HostNotFoundError: // invalid hostname
case QNetworkReply::TimeoutError: // connection time out
- case QNetworkReply::OperationCanceledError: // operation canceled via abort() or close() calls
case QNetworkReply::ProxyNotFoundError: // invalid proxy hostname
case QNetworkReply::ContentOperationNotPermittedError: // operation requested on remote content not permitted
case QNetworkReply::ContentNotFoundError: // remote content not found on server (similar to HTTP error 404)
case QNetworkReply::ProtocolUnknownError: // Unknown protocol
case QNetworkReply::ProtocolInvalidOperationError: // requested operation is invalid for this protocol
+ kDebug() << "ERROR " << reply->error() << ": " << reply->errorString();
if (reply->url() == _loadingUrl)
{
mainFrame()->setHtml(errorPage(reply));
@@ -478,89 +588,23 @@ QString WebPage::errorPage(QNetworkReply *reply)
}
-// WARNING
-// this code is actually copied from KWebPage::downloadRequest to save
-// downloads data before. If you have some better ideas about,
-// feel free to let us know about :)
-void WebPage::downloadThings(const QNetworkRequest &request, const QString &suggestedFileName)
+void WebPage::downloadReply(const QNetworkReply *reply, const QString &suggestedFileName)
{
- KUrl destUrl;
- KUrl srcUrl(request.url());
-
- if( !ReKonfig::kgetDownload() && suggestedFileName.isEmpty() )
- {
- kDebug() << "Using KWebPage downloadRequest..";
- Application::historyManager()->addDownload(srcUrl.pathOrUrl() , destUrl.pathOrUrl());
- KWebPage::downloadRequest(request);
- return;
- }
-
- int result = KIO::R_OVERWRITE;
-
- do
- {
- QString fName = suggestedFileName.isEmpty()
- ? srcUrl.fileName()
- : suggestedFileName;
-
- destUrl = KFileDialog::getSaveFileName(fName, QString(), view());
-
- if (destUrl.isLocalFile())
- {
- QFileInfo finfo(destUrl.toLocalFile());
- if (finfo.exists())
- {
- QDateTime now = QDateTime::currentDateTime();
- QPointer<KIO::RenameDialog> dlg = new KIO::RenameDialog(view(),
- i18n("Overwrite File?"),
- srcUrl,
- destUrl,
- KIO::RenameDialog_Mode(KIO::M_OVERWRITE | KIO::M_SKIP),
- -1,
- finfo.size(),
- now.toTime_t(),
- finfo.created().toTime_t(),
- now.toTime_t(),
- finfo.lastModified().toTime_t()
- );
- result = dlg->exec();
- delete dlg;
- }
- }
- }
- while (result == KIO::R_CANCEL && destUrl.isValid());
+ downloadResource( reply->url(), KIO::MetaData(), view(), suggestedFileName);
+}
- if (result == KIO::R_OVERWRITE && destUrl.isValid())
- {
- // now store data
- // now, destUrl, srcUrl
- Application::historyManager()->addDownload(srcUrl.pathOrUrl() , destUrl.pathOrUrl());
- if (ReKonfig::kgetDownload())
- {
- //KGet integration:
- if (!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.kget"))
- {
- KToolInvocation::kdeinitExecWait("kget");
- }
- QDBusInterface kget("org.kde.kget", "/KGet", "org.kde.kget.main");
- if (kget.isValid())
- {
- kget.call("addTransfer", srcUrl.prettyUrl(), destUrl.prettyUrl(), true);
- return;
- }
- }
+void WebPage::downloadRequest(const QNetworkRequest &request)
+{
+ downloadResource(request.url(),
+ request.attribute(static_cast<QNetworkRequest::Attribute>(KIO::AccessManager::MetaData)).toMap(),
+ view());
+}
- // else, use KIO or fallback to it
- KIO::Job *job = KIO::file_copy(srcUrl, destUrl, -1, KIO::Overwrite);
- QVariant attr = request.attribute(static_cast<QNetworkRequest::Attribute>(KIO::AccessManager::MetaData));
- if (attr.isValid() && attr.type() == QVariant::Map)
- job->setMetaData(KIO::MetaData(attr.toMap()));
- job->addMetaData(QL1S("MaxCacheSize"), QL1S("0")); // Don't store in http cache.
- job->addMetaData(QL1S("cache"), QL1S("cache")); // Use entry from cache if available.
- job->uiDelegate()->setAutoErrorHandlingEnabled(true);
- }
+void WebPage::downloadUrl(const KUrl &url)
+{
+ downloadResource( url, KIO::MetaData(), view() );
}
diff --git a/src/webpage.h b/src/webpage.h
index eff4c3fc..f3d201c2 100644
--- a/src/webpage.h
+++ b/src/webpage.h
@@ -68,7 +68,10 @@ public:
public slots:
void downloadAllContentsWithKGet(QPoint);
-
+
+ virtual void downloadRequest(const QNetworkRequest &request);
+ virtual void downloadUrl(const KUrl &url);
+
protected:
WebPage *createWindow(WebWindowType type);
@@ -83,13 +86,7 @@ private slots:
void showSSLInfo(QPoint);
void updateImage(bool ok);
- /**
- * This new slot is needed to provide integration between rekonq & KGet,
- * to better manage file names and to not overwrite KWebPage default behavior on need
- *
- * @see KWebPage::downloadRequest.
- */
- void downloadThings(const QNetworkRequest &request, const QString &suggestedFileName = QString());
+ void downloadReply(const QNetworkReply *reply, const QString &suggestedFileName = QString());
private:
QString errorPage(QNetworkReply *reply);
diff --git a/src/webview.cpp b/src/webview.cpp
index 99c48f0b..878a7403 100644
--- a/src/webview.cpp
+++ b/src/webview.cpp
@@ -77,7 +77,7 @@ WebView::WebView(QWidget* parent)
// download system
connect(this, SIGNAL(linkShiftClicked(const KUrl &)), page, SLOT(downloadUrl(const KUrl &)));
- connect(page, SIGNAL(downloadRequested(const QNetworkRequest &)), page, SLOT(downloadThings(const QNetworkRequest &)));
+ connect(page, SIGNAL(downloadRequested(const QNetworkRequest &)), page, SLOT(downloadRequest(const QNetworkRequest &)));
// middle click || ctrl + click signal
connect(this, SIGNAL(linkMiddleOrCtrlClicked(const KUrl &)), this, SLOT(loadUrlInNewTab(const KUrl &)));