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"
|
2011-04-04 21:28:15 +02:00
|
|
|
#include "adblockmanager.h"
|
|
|
|
#include "adblocksubscription.h"
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2011-04-18 21:35:57 +02:00
|
|
|
ClickToFlash::ClickToFlash(const QUrl &pluginUrl, const QStringList &argumentNames, const QStringList &argumentValues, QWidget* parent)
|
2011-03-02 16:57:41 +01:00
|
|
|
: QWidget(parent)
|
2011-04-18 21:35:57 +02:00
|
|
|
, m_argumentNames(argumentNames)
|
|
|
|
, m_argumentValues(argumentValues)
|
2011-04-19 18:15:36 +02:00
|
|
|
, m_url(pluginUrl)
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2011-04-04 21:28:15 +02:00
|
|
|
//AdBlock
|
|
|
|
AdBlockManager* manager = AdBlockManager::instance();
|
|
|
|
if (manager->isEnabled()) {
|
|
|
|
QString urlString = pluginUrl.toEncoded();
|
|
|
|
AdBlockSubscription* subscription = manager->subscription();
|
|
|
|
if (!subscription->allow(urlString) && subscription->block(urlString)) {
|
2011-04-21 13:28:07 +02:00
|
|
|
QTimer::singleShot(200, this, SLOT(hideAdBlocked()));
|
|
|
|
return;
|
2011-04-04 21:28:15 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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();
|
|
|
|
}
|
|
|
|
|
2011-04-21 13:28:07 +02:00
|
|
|
void ClickToFlash::hideAdBlocked()
|
|
|
|
{
|
|
|
|
findElement();
|
|
|
|
if (!m_element.isNull()) {
|
|
|
|
m_element.setAttribute("style", "display:none;");
|
|
|
|
deleteLater();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-18 21:35:57 +02:00
|
|
|
void ClickToFlash::findElement()
|
|
|
|
{
|
|
|
|
QWidget* parent = parentWidget();
|
|
|
|
QWebView* view = 0;
|
2011-03-02 16:57:41 +01:00
|
|
|
while (parent) {
|
2011-04-18 21:35:57 +02:00
|
|
|
if (QWebView* aView = qobject_cast<QWebView*>(parent)) {
|
2011-03-02 16:57:41 +01:00
|
|
|
view = aView;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
parent = parent->parentWidget();
|
|
|
|
}
|
|
|
|
if (!view)
|
|
|
|
return;
|
|
|
|
|
|
|
|
QList<QWebFrame*> frames;
|
2011-04-18 21:35:57 +02:00
|
|
|
m_mainFrame = view->page()->mainFrame();
|
|
|
|
frames.append(m_mainFrame);
|
|
|
|
|
2011-03-02 16:57:41 +01:00
|
|
|
while (!frames.isEmpty()) {
|
2011-04-18 21:35:57 +02:00
|
|
|
QWebFrame* frame = frames.takeFirst();
|
2011-03-02 16:57:41 +01:00
|
|
|
QWebElement docElement = frame->documentElement();
|
|
|
|
|
|
|
|
QWebElementCollection elements;
|
2011-04-15 20:44:57 +02:00
|
|
|
elements.append(docElement.findAll(QLatin1String("embed")));
|
2011-04-18 21:35:57 +02:00
|
|
|
elements.append(docElement.findAll(QLatin1String("object")));
|
2011-04-15 20:44:57 +02:00
|
|
|
|
|
|
|
QWebElement element;
|
|
|
|
foreach (element, elements) {
|
2011-04-18 21:35:57 +02:00
|
|
|
if (!checkElement(element) && !checkUrlOnElement(element))
|
2011-04-15 20:44:57 +02:00
|
|
|
continue;
|
2011-04-18 21:35:57 +02:00
|
|
|
m_element = element;
|
2011-04-15 20:44:57 +02:00
|
|
|
return;
|
2011-03-02 16:57:41 +01:00
|
|
|
}
|
|
|
|
frames += frame->childFrames();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-18 21:35:57 +02:00
|
|
|
void ClickToFlash::load()
|
|
|
|
{
|
|
|
|
findElement();
|
|
|
|
if (m_element.isNull()) {
|
2011-04-21 13:28:07 +02:00
|
|
|
qWarning("Click2Flash: Cannot find Flash object.");
|
2011-04-18 21:35:57 +02:00
|
|
|
} else {
|
|
|
|
QWebElement substitute = m_element.clone();
|
|
|
|
substitute.setAttribute(QLatin1String("type"), "application/futuresplash");
|
|
|
|
m_element.replace(substitute);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ClickToFlash::checkUrlOnElement(QWebElement el)
|
2011-03-02 16:57:41 +01:00
|
|
|
{
|
2011-04-18 21:35:57 +02:00
|
|
|
QString checkString = QUrl(el.attribute("src")).toString(QUrl::RemoveQuery);
|
2011-04-15 20:44:57 +02:00
|
|
|
if (checkString.isEmpty())
|
|
|
|
checkString = QUrl(el.attribute("data")).toString(QUrl::RemoveQuery);
|
|
|
|
if (checkString.isEmpty())
|
2011-04-18 21:35:57 +02:00
|
|
|
checkString = QUrl(el.attribute("value")).toString(QUrl::RemoveQuery);
|
2011-03-02 16:57:41 +01:00
|
|
|
|
2011-04-18 21:35:57 +02:00
|
|
|
if (m_url.toEncoded().contains(checkString.toAscii()))
|
2011-03-02 16:57:41 +01:00
|
|
|
return true;
|
2011-04-18 21:35:57 +02:00
|
|
|
return false;
|
|
|
|
}
|
2011-04-15 20:44:57 +02:00
|
|
|
|
2011-04-18 21:35:57 +02:00
|
|
|
bool ClickToFlash::checkElement(QWebElement el)
|
|
|
|
{
|
|
|
|
if (m_argumentNames == el.attributeNames()) {
|
|
|
|
foreach (QString name, m_argumentNames) {
|
|
|
|
if (m_argumentValues.indexOf(el.attribute(name)) == -1)
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
2011-03-02 16:57:41 +01:00
|
|
|
return false;
|
|
|
|
}
|