diff options
| author | matgic78 <matgic78@gmail.com> | 2009-11-22 11:46:44 +0100 | 
|---|---|---|
| committer | matgic78 <matgic78@gmail.com> | 2009-11-27 16:11:57 +0100 | 
| commit | e4c17c961d145bb6c4c945e1d7be4eea702abecf (patch) | |
| tree | 42dd7057418bbfdd4a2065fb81d7828ff89eaac7 | |
| parent | src/CMakeLists.txt fix (diff) | |
| download | rekonq-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.txt | 54 | ||||
| -rw-r--r-- | src/clicktoflash.cpp | 142 | ||||
| -rw-r--r-- | src/clicktoflash.h | 59 | ||||
| -rw-r--r-- | src/webpluginfactory.cpp | 29 | ||||
| -rw-r--r-- | src/webpluginfactory.h | 9 | 
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 | 
