1
mirror of https://invent.kde.org/network/falkon.git synced 2024-09-22 18:22:10 +02:00
falkonOfficial/src/plugins/clicktoflash.cpp

249 lines
8.8 KiB
C++
Raw Normal View History

2011-03-02 16:57:41 +01:00
/* ============================================================
2011-03-03 18:29:20 +01:00
* QupZilla - WebKit based browser
* Copyright (C) 2010-2011 nowrep
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
* ============================================================ */
/* ============================================================
2011-03-02 16:57:41 +01:00
*
* Copyright (C) 2009 by Benjamin C. Meyer <ben@meyerhome.net>
* Copyright (C) 2010 by Matthieu Gicquel <matgic78@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) 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 14 of version 3 of the license.
*
* 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, see <http://www.gnu.org/licenses/>.
*
* ============================================================ */
#include "clicktoflash.h"
#include "clickablelabel.h"
#include "mainapplication.h"
#include "pluginproxy.h"
#include "adblockmanager.h"
#include "adblocksubscription.h"
2011-03-02 16:57:41 +01:00
2011-03-17 17:03:04 +01:00
ClickToFlash::ClickToFlash(const QUrl &pluginUrl, QWidget* parent)
2011-03-02 16:57:41 +01:00
: QWidget(parent)
, m_url(pluginUrl)
{
//AdBlock
AdBlockManager* manager = AdBlockManager::instance();
if (manager->isEnabled()) {
QString urlString = pluginUrl.toEncoded();
AdBlockSubscription* subscription = manager->subscription();
if (!subscription->allow(urlString) && subscription->block(urlString)) {
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 = "%1[type=\"application/x-shockwave-flash\"]";
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("object")));
elements.append(docElement.findAll(selector.arg("embed")));
foreach(QWebElement element, elements) {
if (checkElement(element)) {
element.setAttribute("style", "visible:none;");
deleteLater();
return;
}
}
frames += frame->childFrames();
}
}
}
2011-03-17 17:03:04 +01:00
QHBoxLayout* horizontalLayout;
QFrame* frame;
QHBoxLayout* horizontalLayout_2;
QToolButton* toolButton;
2011-03-02 16:57:41 +01:00
horizontalLayout = new QHBoxLayout(this);
frame = new QFrame(this);
frame->setStyleSheet("QFrame { border: 1px solid #e8e8e8; }");
frame->setContentsMargins(0,0,0,0);
horizontalLayout_2 = new QHBoxLayout(frame);
toolButton = new QToolButton(frame);
toolButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
toolButton->setStyleSheet("QToolButton { background: url(:/icons/other/flash.png) no-repeat;\n"
"background-position: center; border: none;}\n"
"QToolButton:hover { background: url(:/icons/other/flashstart.png) no-repeat; \n"
"background-position: center; border:none;}");
toolButton->setCursor(Qt::PointingHandCursor);
horizontalLayout_2->addWidget(toolButton);
horizontalLayout->addWidget(frame);
horizontalLayout->setContentsMargins(0,0,0,0);
horizontalLayout_2->setContentsMargins(0,0,0,0);
connect(toolButton, SIGNAL(clicked(bool)), this, SLOT(load()));
setMinimumSize(27,27);
setContextMenuPolicy(Qt::CustomContextMenu);
connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(customContextMenuRequested(QPoint)));
}
void ClickToFlash::customContextMenuRequested(const QPoint &pos)
{
QMenu menu;
menu.addAction(tr("Flash blocked by ClickToFlash"));
menu.addSeparator();
menu.addAction(tr("Add %1 to whitelist").arg(m_url.host()), this, SLOT(toWhitelist()));
menu.actions().at(0)->setEnabled(false);
menu.exec(mapToGlobal(pos));
}
void ClickToFlash::toWhitelist()
{
2011-03-04 13:59:07 +01:00
mApp->plugins()->c2f_addWhitelist(m_url.host());
2011-03-02 16:57:41 +01:00
load();
}
void ClickToFlash::load()
{
// 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 = "%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("object")));
// elements.append(docElement.findAll(selector.arg("embed")));
// foreach(QWebElement element, elements) {
// if (checkElement(element)) {
// QWebElement substitute = element.clone();
// emit signalLoadClickToFlash(true);
// element.replace(substitute);
// deleteLater();
// return;
// }
// }
// frames += frame->childFrames();
// }
QWidget *parent = parentWidget();
QWebView *view = 0;
2011-03-02 16:57:41 +01:00
while (parent) {
if (QWebView *aView = qobject_cast<QWebView*>(parent)) {
2011-03-02 16:57:41 +01:00
view = aView;
break;
}
parent = parent->parentWidget();
}
if (!view)
return;
// const QString selector = QLatin1String("%1[type=\"application/x-shockwave-flash\"]");
const QString mime = QLatin1String("application/futuresplash");
2011-03-02 16:57:41 +01:00
hide();
2011-03-02 16:57:41 +01:00
QList<QWebFrame*> frames;
frames.append(view->page()->mainFrame());
while (!frames.isEmpty()) {
QWebFrame *frame = frames.takeFirst();
2011-03-02 16:57:41 +01:00
QWebElement docElement = frame->documentElement();
QWebElementCollection elements;
elements.append(docElement.findAll(QLatin1String("object")));
// elements.append(docElement.findAll(selector.arg(QLatin1String("object"))));
elements.append(docElement.findAll(QLatin1String("embed")));
// elements.append(docElement.findAll(selector.arg(QLatin1String("embed"))));
QWebElement element;
foreach (element, elements) {
if (!checkElement(element))
continue;
QWebElement substitute = element.clone();
substitute.setAttribute(QLatin1String("type"), mime);
element.replace(substitute);
return;
2011-03-02 16:57:41 +01:00
}
2011-03-02 16:57:41 +01:00
frames += frame->childFrames();
}
}
bool ClickToFlash::checkElement(QWebElement el)
{
QString checkString;
QString urlString;
checkString = QUrl(el.attribute("src")).toString(QUrl::RemoveQuery);
if (checkString.isEmpty())
checkString = QUrl(el.attribute("data")).toString(QUrl::RemoveQuery);
if (checkString.isEmpty())
return false;
2011-03-02 16:57:41 +01:00
urlString = m_url.toString(QUrl::RemoveQuery);
if (urlString.contains(checkString))
return true;
qDebug() << checkString << m_url;
// QWebElementCollection collec = el.findAll("*");
// int i = 0;
// while (i < collec.count()) {
// QWebElement el = collec.at(i);
// checkString = QUrl(el.attribute("src")).toString(QUrl::RemoveQuery);
// urlString = m_url.toString(QUrl::RemoveQuery);
// if (urlString.contains(checkString))
// return true;
// i++;
// }
2011-03-02 16:57:41 +01:00
return false;
}