From e4c17c961d145bb6c4c945e1d7be4eea702abecf Mon Sep 17 00:00:00 2001 From: matgic78 Date: Sun, 22 Nov 2009 11:46:44 +0100 Subject: ClickToFlash : first step For now, no config and only working when there is only one flash in the page --- src/CMakeLists.txt | 54 +++++++++--------- src/clicktoflash.cpp | 142 +++++++++++++++++++++++++++++++++++++++++++++++ src/clicktoflash.h | 59 ++++++++++++++++++++ src/webpluginfactory.cpp | 29 +++++++++- src/webpluginfactory.h | 9 +++ 5 files changed, 266 insertions(+), 27 deletions(-) create mode 100644 src/clicktoflash.cpp create mode 100644 src/clicktoflash.h 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 + +#include +#include +#include +#include +#include +#include + +#include + +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(parent)) + { + view = aView; + break; + } + parent = parent->parentWidget(); + } + if (!view) + return; + + const QString selector = QLatin1String("%1[type=\"application/x-shockwave-flash\"]"); + + hide(); + + QList 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 +#include + +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 @@ -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 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 plugins() const; + +signals: + void signalLoadClickToFlash(bool) const; + +public slots: + void setLoadClickToFlash(bool load); + +private: + bool loadClickToFlash; }; #endif // WEB_PLUGIN_FACTORY_H -- cgit v1.2.1