summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--kwebapp/CMakeLists.txt24
-rw-r--r--kwebapp/Messages.sh3
-rw-r--r--kwebapp/kwebmain.cpp65
-rw-r--r--kwebapp/webpage.cpp63
-rw-r--r--kwebapp/webpage.h51
-rw-r--r--kwebapp/webview.cpp121
-rw-r--r--kwebapp/webview.h45
-rw-r--r--src/application.cpp32
-rw-r--r--src/application.h2
-rw-r--r--src/iconmanager.cpp13
-rw-r--r--src/iconmanager.h2
-rw-r--r--src/mainwindow.cpp5
-rw-r--r--src/rekonqui.rc3
14 files changed, 430 insertions, 1 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index fe562612..1d898884 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -113,6 +113,8 @@ IF(REKONQ_CAN_BE_COMPILED)
ADD_SUBDIRECTORY( docs )
# ADD_SUBDIRECTORY( i18n )
+ ADD_SUBDIRECTORY( kwebapp )
+
ENDIF(REKONQ_CAN_BE_COMPILED)
# ================================================================================
diff --git a/kwebapp/CMakeLists.txt b/kwebapp/CMakeLists.txt
new file mode 100644
index 00000000..dda4616d
--- /dev/null
+++ b/kwebapp/CMakeLists.txt
@@ -0,0 +1,24 @@
+set( kwebapp_SRCS
+ webview.cpp
+ webpage.cpp
+ kwebmain.cpp
+ )
+
+include_directories ( ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${QT4_INCLUDES}
+ ${KDE4_INCLUDES}
+
+)
+
+
+kde4_add_executable(kwebapp ${kwebapp_SRCS})
+
+target_link_libraries(kwebapp
+ ${KDE4_KDEUI_LIBS}
+ ${KDE4_KDEWEBKIT_LIBS}
+)
+
+
+install(TARGETS kwebapp ${INSTALL_TARGETS_DEFAULT_ARGS} )
+
diff --git a/kwebapp/Messages.sh b/kwebapp/Messages.sh
new file mode 100644
index 00000000..37199e06
--- /dev/null
+++ b/kwebapp/Messages.sh
@@ -0,0 +1,3 @@
+#! /usr/bin/env bash
+$EXTRACTRC `find . -name \*.rc` >> rc.cpp
+$XGETTEXT *.cpp -o $podir/kwebapp.pot
diff --git a/kwebapp/kwebmain.cpp b/kwebapp/kwebmain.cpp
new file mode 100644
index 00000000..3de5b182
--- /dev/null
+++ b/kwebapp/kwebmain.cpp
@@ -0,0 +1,65 @@
+/*
+ * This file is part of the KDE project.
+ * Copyright (C) 2011 by Andrea Diamantini <adjam7@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 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 defined in Section 6 of version 3 of the license.
+ *
+ * This library 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 GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "webview.h"
+
+#include <KDE/KApplication>
+
+#include <KDE/KAboutData>
+#include <KDE/KCmdLineArgs>
+
+#include <QDebug>
+#include <QUrl>
+
+static const char description[] =
+ I18N_NOOP("Web Application Viewer");
+
+static const char version[] = "0.1";
+
+int main(int argc, char **argv)
+{
+ KAboutData about("kwebapp", 0, ki18n("kwebapp"), version, ki18n(description),
+ KAboutData::License_GPL, ki18n("(C) 2011 Andrea Diamantini"), KLocalizedString(), 0, "adjam7@gmail.com");
+ about.addAuthor(ki18n("Andrea Diamantini"), KLocalizedString(), "adjam7@gmail.com");
+ KCmdLineArgs::init(argc, argv, &about);
+
+ KCmdLineOptions options;
+ options.add("+[URL]", ki18n("Document to open"));
+ KCmdLineArgs::addCmdLineOptions(options);
+
+ KApplication app;
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ if (args->count() != 1)
+ {
+ qDebug() << "ERROR: Impossible to launch kwebapp WITHOUT just ONE url to load!!!";
+ return 0;
+ }
+
+ WebView *widg = new WebView;
+ widg->show();
+ widg->load(QUrl::fromUserInput(args->arg(0)));
+ args->clear();
+
+ return app.exec();
+}
+
diff --git a/kwebapp/webpage.cpp b/kwebapp/webpage.cpp
new file mode 100644
index 00000000..f1f3c38d
--- /dev/null
+++ b/kwebapp/webpage.cpp
@@ -0,0 +1,63 @@
+/*
+ * This file is part of the KDE project.
+ * Copyright (C) 2011 by Andrea Diamantini <adjam7@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 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 defined in Section 6 of version 3 of the license.
+ *
+ * This library 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 GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+// Self Includes
+#include "webpage.h"
+#include "webpage.moc"
+
+// KDE Includes
+#include <KRun>
+
+// Qt Includes
+#include <QNetworkRequest>
+
+
+WebPage::WebPage(QObject *parent)
+ : KWebPage(parent)
+ , _selfLoading(false)
+{
+ connect(this, SIGNAL(loadFinished(bool)), this, SLOT(disableSelfLoading()));
+}
+
+
+bool WebPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type)
+{
+ if (_selfLoading)
+ {
+ return KWebPage::acceptNavigationRequest(frame, request, type);
+ }
+
+ (void)new KRun(request.url(), view(), 0);
+ return false;
+}
+
+
+void WebPage::setSelfLoadingEnabled(bool b)
+{
+ _selfLoading = b;
+}
+
+
+void WebPage::disableSelfLoading()
+{
+ _selfLoading = false;
+}
diff --git a/kwebapp/webpage.h b/kwebapp/webpage.h
new file mode 100644
index 00000000..fd8c88f1
--- /dev/null
+++ b/kwebapp/webpage.h
@@ -0,0 +1,51 @@
+/*
+ * This file is part of the KDE project.
+ * Copyright (C) 2011 by Andrea Diamantini <adjam7@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 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 defined in Section 6 of version 3 of the license.
+ *
+ * This library 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 GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _WEB_PAGE_H
+#define _WEB_PAGE_H
+
+
+// KDE Includes
+#include <KWebPage>
+
+
+class WebPage : public KWebPage
+{
+ Q_OBJECT
+
+public:
+ WebPage(QObject *parent = 0);
+
+ void setSelfLoadingEnabled(bool);
+
+private Q_SLOTS:
+ void disableSelfLoading();
+
+protected:
+ virtual bool acceptNavigationRequest(QWebFrame *, const QNetworkRequest &, NavigationType);
+
+private:
+ bool _selfLoading;
+
+};
+
+#endif // _WEB_PAGE_H
diff --git a/kwebapp/webview.cpp b/kwebapp/webview.cpp
new file mode 100644
index 00000000..7a5ba4c1
--- /dev/null
+++ b/kwebapp/webview.cpp
@@ -0,0 +1,121 @@
+/***************************************************************************
+ * Copyright (C) 2011 by Andrea Diamantini <adjam7@gmail.com> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * 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 *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
+ ***************************************************************************/
+
+
+// Self Includes
+#include "webview.h"
+#include "webview.moc"
+
+// KDE Includes
+#include <KIO/Job>
+#include <KIO/RenameDialog>
+#include <KIO/JobUiDelegate>
+
+#include <KGlobalSettings>
+#include <KStandardDirs>
+#include <KFileDialog>
+#include <KJobUiDelegate>
+#include <KLocalizedString>
+#include <KMenu>
+#include <KAction>
+#include <KUrl>
+#include <KRun>
+
+// Qt Includes
+#include <QUrl>
+#include <QDebug>
+#include <QWebHitTestResult>
+#include <QWebHistory>
+#include <QNetworkRequest>
+#include <QPointer>
+
+
+WebView::WebView(QWidget *parent)
+ : KWebView(parent)
+{
+ page()->setForwardUnsupportedContent(true);
+ connect(page(), SIGNAL(unsupportedContent(QNetworkReply *)), page(), SLOT(downloadResponse(QNetworkReply *)));
+ connect(page(), SIGNAL(downloadRequested(const QNetworkRequest &)), page(), SLOT(downloadRequest(const QNetworkRequest &)));
+ connect(this, SIGNAL(linkShiftClicked(const KUrl &)), page(), SLOT(downloadUrl(const KUrl &)));
+
+ QWebSettings::setIconDatabasePath( KStandardDirs::locateLocal("cache","kwebapp.favicons") );
+
+ setContextMenuPolicy(Qt::CustomContextMenu);
+
+ connect(this, SIGNAL(titleChanged(const QString &)), this, SLOT(setTitle(const QString &)));
+ connect(this, SIGNAL(iconChanged()), this, SLOT(setIcon()));
+ connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(menuRequested(const QPoint &)));
+}
+
+
+void WebView::setTitle(const QString &t)
+{
+ setWindowTitle(t);
+}
+
+
+void WebView::setIcon()
+{
+ setWindowIcon(icon());
+}
+
+
+void WebView::menuRequested(const QPoint &pos)
+{
+ QWebHitTestResult result = page()->mainFrame()->hitTestContent(pos);
+
+ KMenu menu(this);
+ QAction *a;
+
+ // is a link?
+ if (!result.linkUrl().isEmpty())
+ {
+ a = new KAction(KIcon("window-new"), i18n("Open in default browser"), this);
+ a->setData(result.linkUrl());
+ connect(a, SIGNAL(triggered(bool)), this, SLOT(openLinkInDefaultBrowser()));
+ menu.addAction(a);
+
+ menu.addAction(pageAction(KWebPage::DownloadLinkToDisk));
+ menu.addAction(pageAction(KWebPage::CopyLinkToClipboard));
+ menu.addSeparator();
+ }
+
+ if(history()->canGoBack())
+ {
+ menu.addAction(pageAction(KWebPage::Back));
+ }
+
+ if(history()->canGoBack())
+ {
+ menu.addAction(pageAction(KWebPage::Forward));
+ }
+
+ menu.addAction(pageAction(KWebPage::Reload));
+
+ menu.exec(mapToGlobal(pos));
+}
+
+
+void WebView::openLinkInDefaultBrowser()
+{
+ KAction *a = qobject_cast<KAction*>(sender());
+ KUrl u(a->data().toUrl());
+
+ (void)new KRun(u, this, 0);
+}
diff --git a/kwebapp/webview.h b/kwebapp/webview.h
new file mode 100644
index 00000000..536dba8c
--- /dev/null
+++ b/kwebapp/webview.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+ * Copyright (C) 2011 by Andrea Diamantini <adjam7@gmail.com> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * 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 *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
+ ***************************************************************************/
+
+#ifndef WEB_VIEW_H
+#define WEB_VIEW_H
+
+
+// Local Includes
+#include "webpage.h"
+
+// KDE Includes
+#include <KWebView>
+
+
+class WebView : public KWebView
+{
+ Q_OBJECT
+
+public:
+ WebView(QWidget *parent = 0);
+
+private Q_SLOTS:
+ void setTitle(const QString &);
+ void setIcon();
+ void menuRequested(const QPoint &);
+ void openLinkInDefaultBrowser();
+};
+
+#endif // WEB_VIEW_H
diff --git a/src/application.cpp b/src/application.cpp
index df99b785..ea0a65e6 100644
--- a/src/application.cpp
+++ b/src/application.cpp
@@ -764,3 +764,35 @@ void Application::queryQuit()
// in case of just one window...
quit();
}
+
+
+void Application::createWebAppShortcut()
+{
+ KUrl u = mainWindow()->currentTab()->url();
+ QString h = u.host();
+
+ QString desktop = KGlobalSettings::desktopPath();
+ QFile wAppFile(desktop + QL1C('/') + h + QL1S(".desktop"));
+
+ if (!wAppFile.open(QIODevice::WriteOnly | QIODevice::Text))
+ {
+ kDebug() << "oops! " << wAppFile.errorString();
+ return;
+ }
+
+ iconManager()->saveDesktopIconForUrl(u);
+
+ QString iconPath = KStandardDirs::locateLocal("cache" , "favicons/" , true) + h + QL1S("_WEBAPPICON.png");
+
+ QTextStream out(&wAppFile);
+ out.setCodec("UTF-8");
+
+ out << QL1S("[Desktop Entry]\n");
+ out << QL1S("name=kwebapp\n");
+ out << QL1S("Icon=") << iconPath << QL1S("\n");
+ out << QL1S("Exec=kwebapp ") << u.url() << QL1S("\n");
+ out << QL1S("Type=Application\n");
+ out << QL1S("Categories=Application;\n");
+
+ wAppFile.close();
+}
diff --git a/src/application.h b/src/application.h
index 0c4d3101..30d2b55d 100644
--- a/src/application.h
+++ b/src/application.h
@@ -134,6 +134,8 @@ private slots:
void queryQuit();
+ void createWebAppShortcut();
+
private:
QWeakPointer<HistoryManager> m_historyManager;
QWeakPointer<BookmarkProvider> m_bookmarkProvider;
diff --git a/src/iconmanager.cpp b/src/iconmanager.cpp
index 9ee024e2..ac53fdac 100644
--- a/src/iconmanager.cpp
+++ b/src/iconmanager.cpp
@@ -225,3 +225,16 @@ void IconManager::notifyLastStuffs(KJob *j)
doLastStuffs(j);
emit iconChanged();
}
+
+
+void IconManager::saveDesktopIconForUrl(const KUrl &u)
+{
+ KIcon icon = iconForUrl(u);
+ QString destPath = _faviconsDir + u.host() + QL1S("_WEBAPPICON.png");
+
+ QPixmap pix = icon.pixmap(16, 16);
+ int s = KIconLoader::global()->currentSize(KIconLoader::Desktop);
+ pix = pix.scaled(s, s);
+
+ pix.save(destPath);
+}
diff --git a/src/iconmanager.h b/src/iconmanager.h
index 8f55b7df..85db5ddd 100644
--- a/src/iconmanager.h
+++ b/src/iconmanager.h
@@ -54,6 +54,8 @@ public:
void clearIconCache();
+ void saveDesktopIconForUrl(const KUrl &u);
+
private Q_SLOTS:
void doLastStuffs(KJob *);
void notifyLastStuffs(KJob *);
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index beab3afc..880e4d47 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -531,6 +531,11 @@ void MainWindow::setupActions()
a = new KAction(KIcon("preferences-web-browser-adblock"), i18n("Ad Block"), this);
actionCollection()->addAction(QL1S("adblock"), a);
connect(a, SIGNAL(triggered(bool)), rApp->adblockManager(), SLOT(showSettings()));
+
+ // Web Applications
+ a = new KAction(KIcon("applications-internet"), i18n("Create application shortcut"), this);
+ actionCollection()->addAction(QL1S("webapp_shortcut"), a);
+ connect(a, SIGNAL(triggered(bool)), rApp, SLOT(createWebAppShortcut()));
}
diff --git a/src/rekonqui.rc b/src/rekonqui.rc
index 66d34980..bad56615 100644
--- a/src/rekonqui.rc
+++ b/src/rekonqui.rc
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<!DOCTYPE gui SYSTEM "kpartgui.dtd">
-<gui name="rekonq" version="56">
+<gui name="rekonq" version="58">
<!--- =========== Rekonq Menu ============= -->
<Menu name="rekonqMenu" noMerge="1">
@@ -16,6 +16,7 @@
<Menu name="toolsMenu" icon="preferences-other" noMerge="1">
<text>&amp;Tools</text>
+ <Action name="webapp_shortcut" />
<Action name="web_inspector" />
<Action name="page_source" />
<Action name="net_analyzer" />