summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatgic78 <matgic78@gmail.com>2009-11-22 11:46:44 +0100
committermatgic78 <matgic78@gmail.com>2009-11-27 16:11:57 +0100
commite4c17c961d145bb6c4c945e1d7be4eea702abecf (patch)
tree42dd7057418bbfdd4a2065fb81d7828ff89eaac7
parentsrc/CMakeLists.txt fix (diff)
downloadrekonq-e4c17c961d145bb6c4c945e1d7be4eea702abecf.tar.xz
ClickToFlash : first step
For now, no config and only working when there is only one flash in the page
-rw-r--r--src/CMakeLists.txt54
-rw-r--r--src/clicktoflash.cpp142
-rw-r--r--src/clicktoflash.h59
-rw-r--r--src/webpluginfactory.cpp29
-rw-r--r--src/webpluginfactory.h9
5 files changed, 266 insertions, 27 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 23d5595e..6aed2351 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -7,38 +7,40 @@ ADD_SUBDIRECTORY( tests )
### ------- SETTING REKONQ FILES..
SET( rekonq_KDEINIT_SRCS
- application.cpp
- findbar.cpp
- mainview.cpp
- mainwindow.cpp
- previewimage.cpp
- sessionmanager.cpp
- tabbar.cpp
- webpage.cpp
- webpluginfactory.cpp
- websnap.cpp
- webview.cpp
+application.cpp
+findbar.cpp
+mainview.cpp
+mainwindow.cpp
+previewimage.cpp
+sessionmanager.cpp
+tabbar.cpp
+webpage.cpp
+webpluginfactory.cpp
+websnap.cpp
+webview.cpp
#----------------------------------------
- history/autosaver.cpp
- history/historymanager.cpp
- history/historymodels.cpp
- history/historypanel.cpp
- history/sidepanel.cpp
+history/autosaver.cpp
+history/historymanager.cpp
+history/historymodels.cpp
+history/historypanel.cpp
+history/sidepanel.cpp
#----------------------------------------
- rekonqpage/newtabpage.cpp
+rekonqpage/newtabpage.cpp
#----------------------------------------
- settings/settingsdialog.cpp
+settings/settingsdialog.cpp
#----------------------------------------
- bookmarks/bookmarksmanager.cpp
- bookmarks/bookmarkspanel.cpp
- bookmarks/bookmarkstreemodel.cpp
- bookmarks/bookmarksproxy.cpp
+bookmarks/bookmarksmanager.cpp
+bookmarks/bookmarkspanel.cpp
+bookmarks/bookmarkstreemodel.cpp
+bookmarks/bookmarksproxy.cpp
#----------------------------------------
- adblock/adblockmanager.cpp
- adblock/khtml_filter.cpp
+adblock/adblockmanager.cpp
+adblock/khtml_filter.cpp
#----------------------------------------
- urlbar/urlbar.cpp
- urlbar/lineedit.cpp
+urlbar/urlbar.cpp
+urlbar/lineedit.cpp
+#----------------------------------------
+clicktoflash.cpp
)
diff --git a/src/clicktoflash.cpp b/src/clicktoflash.cpp
new file mode 100644
index 00000000..d89c1ec5
--- /dev/null
+++ b/src/clicktoflash.cpp
@@ -0,0 +1,142 @@
+/**
+ * Copyright (c) 2009, Benjamin C. Meyer
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the Benjamin Meyer nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "clicktoflash.h"
+
+#include <KLocalizedString>
+
+#include <QFile>
+#include <QMenu>
+#include <QWebFrame>
+#include <QWebView>
+#include <QWebElement>
+#include <QHBoxLayout>
+
+#include <KDebug>
+
+ClickToFlash::ClickToFlash(const WebPluginFactory *factory, QWidget *parent)
+ : QWidget(parent)
+ , m_factory(factory)
+{
+
+ kDebug() << "creating clicktoflash";
+ QHBoxLayout *l = new QHBoxLayout(this);
+ setLayout(l);
+
+ QToolButton *button = new QToolButton(this);
+ button->setPopupMode(QToolButton::InstantPopup);
+ button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+ button->setText(i18n("Load animation"));
+ button->setAutoRaise(false);
+ layout()->addWidget(button);
+ connect(button, SIGNAL(clicked(bool)), this, SLOT(load(bool)));
+}
+
+/*void ClickToFlash::showContextMenu()
+{
+ QMenu menu;
+ menu.addAction(tr("Load"), this, SLOT(load()));
+ menu.addAction(tr("Load All"), this, SLOT(loadAll()));
+ menu.addSeparator();
+ QString host = url.host();
+ QAction *add = menu.addAction(tr("Add %1 to Whitelist").arg(host), this, SLOT(addToWhitelist()));
+ QAction *remove = menu.addAction(tr("Remove from Whitelist"), this, SLOT(removeFromWhitelist()));
+ bool onWhitelist = m_plugin->onWhitelist(host);
+ add->setEnabled(!onWhitelist);
+ remove->setEnabled(onWhitelist);
+ menu.addSeparator();
+ menu.addAction(tr("Settings"), this, SLOT(configure()));
+ menu.exec(QCursor::pos());
+}
+
+void ClickToFlash::addToWhitelist()
+{
+ m_plugin->addToWhitelist(url.host());
+}
+
+void ClickToFlash::removeFromWhitelist()
+{
+ m_plugin->removeFromWhitelist(url.host());
+}
+
+void ClickToFlash::configure()
+{
+ m_plugin->configure();
+}
+
+void ClickToFlash::loadAll()
+{
+ load(true);
+}
+*/
+void ClickToFlash::load(bool loadAll)
+{
+ QWidget *parent = parentWidget();
+ QWebView *view = 0;
+ while (parent)
+ {
+ if (QWebView *aView = qobject_cast<QWebView*>(parent))
+ {
+ view = aView;
+ break;
+ }
+ parent = parent->parentWidget();
+ }
+ if (!view)
+ return;
+
+ const QString selector = QLatin1String("%1[type=\"application/x-shockwave-flash\"]");
+
+ hide();
+
+ QList<QWebFrame*> frames;
+ frames.append(view->page()->mainFrame());
+ while (!frames.isEmpty())
+ {
+ QWebFrame *frame = frames.takeFirst();
+ QWebElement docElement = frame->documentElement();
+
+ QWebElementCollection elements;
+ elements.append(docElement.findAll(selector.arg(QLatin1String("object"))));
+ elements.append(docElement.findAll(selector.arg(QLatin1String("embed"))));
+
+ QWebElement element;
+ foreach (element, elements)
+ {
+ QWebElement substitute = element.clone();
+ emit signalLoadClickToFlash(true);
+ element.replace(substitute);
+ }
+
+ frames += frame->childFrames();
+ }
+
+ deleteLater();
+}
+
+
diff --git a/src/clicktoflash.h b/src/clicktoflash.h
new file mode 100644
index 00000000..382c6001
--- /dev/null
+++ b/src/clicktoflash.h
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2009, Benjamin C. Meyer
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the Benjamin Meyer nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef CLICKTOFLASH_H
+#define CLICKTOFLASH_H
+
+#include <QWidget>
+#include <QToolButton>
+
+class WebPluginFactory;
+
+class ClickToFlash : public QWidget
+{
+ Q_OBJECT
+public:
+ ClickToFlash(const WebPluginFactory *factory, QWidget *parent = 0);
+
+signals:
+ void signalLoadClickToFlash(bool);
+
+private slots:
+ /*void configure();
+ void addToWhitelist();
+ void removeFromWhitelist();
+ void showContextMenu();
+ void loadAll();*/
+ void load(bool loadAll = false);
+
+private:
+ const WebPluginFactory *m_factory;
+};
+
+#endif // CLICKTOFLASH_H
+
diff --git a/src/webpluginfactory.cpp b/src/webpluginfactory.cpp
index af799905..2c8ed181 100644
--- a/src/webpluginfactory.cpp
+++ b/src/webpluginfactory.cpp
@@ -32,6 +32,7 @@
#include "application.h"
#include "mainwindow.h"
#include "previewimage.h"
+#include "clicktoflash.h"
// KDE Includes
#include <KDebug>
@@ -40,6 +41,8 @@
WebPluginFactory::WebPluginFactory(QObject *parent)
: KWebPluginFactory(parent)
{
+ loadClickToFlash = false;
+ connect(this, SIGNAL(signalLoadClickToFlash(bool)), SLOT(setLoadClickToFlash(bool)));
}
@@ -48,6 +51,13 @@ WebPluginFactory::~WebPluginFactory()
}
+
+void WebPluginFactory::setLoadClickToFlash(bool load)
+{
+ loadClickToFlash = load;
+}
+
+
QObject *WebPluginFactory::create(const QString &mimeType,
const QUrl &url,
const QStringList &argumentNames,
@@ -74,7 +84,19 @@ QObject *WebPluginFactory::create(const QString &mimeType,
return new PreviewImage(url, title, number, isFavorite);
}
-
+
+ if(mimeType == QString("application/x-shockwave-flash")
+ && !loadClickToFlash) // the button wasn't clicked
+ {
+ ClickToFlash* ctf = new ClickToFlash(this);
+ connect(ctf, SIGNAL(signalLoadClickToFlash(bool)), this, SLOT(setLoadClickToFlash(bool)));
+ return ctf;
+ }
+
+ // this let QtWebKit using builtin plugins
+ // to load in example flash contents and so on..
+ kDebug() << "No plugins found for" << mimeType << ". Falling back to QtWebKit ones...";
+ emit signalLoadClickToFlash(false);
return KWebPluginFactory::create(mimeType, url, argumentNames, argumentValues);
}
@@ -88,5 +110,10 @@ QList<QWebPluginFactory::Plugin> WebPluginFactory::plugins() const
p.description = "plugin for embedding Web snapped images";
plugins.append(p);
+ p.name = "application/x-shockwave-flash";
+ p.description = "Plugin for flash animations";
+ plugins.append(p);
+
+
return plugins;
}
diff --git a/src/webpluginfactory.h b/src/webpluginfactory.h
index 30a366d4..20dc6642 100644
--- a/src/webpluginfactory.h
+++ b/src/webpluginfactory.h
@@ -50,6 +50,15 @@ public:
const QStringList &argumentValues) const;
virtual QList<Plugin> plugins() const;
+
+signals:
+ void signalLoadClickToFlash(bool) const;
+
+public slots:
+ void setLoadClickToFlash(bool load);
+
+private:
+ bool loadClickToFlash;
};
#endif // WEB_PLUGIN_FACTORY_H