From 832bd37114bf65d61489048fa3e221997c7c1bda Mon Sep 17 00:00:00 2001 From: David Rosca Date: Fri, 28 Aug 2015 20:43:37 +0200 Subject: [PATCH] SpeedDial: Implement loading page thumbnails QWebEngineView must be visible in order to grab page contents, so loading thumbnails is creating a new background window that is loading the page. --- src/lib/data/html/speeddial.html | 22 +++++---- src/lib/plugins/speeddial.cpp | 26 ++++------- src/lib/plugins/speeddial.h | 4 +- src/lib/tools/pagethumbnailer.cpp | 77 +++++++------------------------ src/lib/tools/pagethumbnailer.h | 21 +-------- 5 files changed, 44 insertions(+), 106 deletions(-) diff --git a/src/lib/data/html/speeddial.html b/src/lib/data/html/speeddial.html index df059608c..17b0a5387 100644 --- a/src/lib/data/html/speeddial.html +++ b/src/lib/data/html/speeddial.html @@ -151,7 +151,7 @@ function onReloadClick(box) { return; $(img).attr('src', LOADING_IMAGE); - external.speedDial.loadThumbnail(url); + external.speedDial.loadThumbnail(url, false); } function boxEdited() { @@ -167,19 +167,20 @@ function boxEdited() { var changedUrl = a.getAttribute('href'); var fetchTitleChecked = document.getElementById('fetchTitle').checked; + var pages = allPages(); + if (fetchTitleChecked || (originalUrl != changedUrl && changedUrl !== '') ) { var img = box.getElementsByTagName('img')[0]; img.setAttribute('src', LOADING_IMAGE); $('#fadeOverlay').fadeOut("slow", function() { $("#fadeOverlay").remove(); - external.speedDial.loadThumbnail(a.getAttribute('href'), fetchTitleChecked); - external.speedDial.removeImageForUrl(a.getAttribute('href')); }); + external.speedDial.loadThumbnail(a.getAttribute('href'), fetchTitleChecked); } else { hideEditBox(); } - external.speedDial.changed(allPages()); + external.speedDial.changed(pages); }); } @@ -240,7 +241,7 @@ function addBox(url, title, img_source) { document.getElementById("quickdial").appendChild(div); if (img_source == LOADING_IMAGE) { - external.speedDial.loadThumbnail(url); + external.speedDial.loadThumbnail(url, false); } return div; @@ -264,7 +265,6 @@ function setTitleToUrl(url, title) { continue; var boxUrl = box.getElementsByTagName('a')[0].getAttribute('href'); - console.log(boxUrl + " > " + url); if (url != boxUrl) continue; @@ -283,7 +283,7 @@ function setImageToUrl(url, img_source) { if ($(imgElement).size() == 0) return; - $(imgElement).attr('src', img_source + '?' + new Date()); + $(imgElement).attr('src', img_source/* + '?' + new Date()*/); }); } @@ -320,7 +320,7 @@ function removeBox(id) { } function alignPage() { - $('head').append(''); + $('head').append(''); $('#quickdial div.entry').css({'width' : DIAL_WIDTH + 'px', 'height' : Math.round(DIAL_WIDTH / 1.54) + 'px'}); @@ -430,11 +430,13 @@ $(document).ready(function () { function init() { %INITIAL-SCRIPT% + external.speedDial.pagesChanged.connect(function() { window.location.reload(); }); - alignPage(); + external.speedDial.thumbnailLoaded.connect(setImageToUrl); + external.speedDial.pageTitleLoaded.connect(setTitleToUrl); $(window).resize(function() { alignPage(); }); $("div").disableSelection(); @@ -448,6 +450,8 @@ function init() external.speedDial.changed(allPages()); } }); + + alignPage(); } // Initialize diff --git a/src/lib/plugins/speeddial.cpp b/src/lib/plugins/speeddial.cpp index bc400dcdd..cdd483ab4 100644 --- a/src/lib/plugins/speeddial.cpp +++ b/src/lib/plugins/speeddial.cpp @@ -206,15 +206,15 @@ QString SpeedDial::initialScript() QString imgSource = m_thumbnailsDir + QCryptographicHash::hash(page.url.toUtf8(), QCryptographicHash::Md4).toHex() + ".png"; if (!QFile(imgSource).exists()) { - //imgSource = "qrc:html/loading.gif"; - imgSource = "qrc:html/broken-page.png"; + imgSource = "qrc:html/loading.gif"; if (page.url.isEmpty()) { imgSource.clear(); } } else { - imgSource = QUrl::fromLocalFile(imgSource).toString(); + QByteArray data = QzTools::pixmapToByteArray(QPixmap(imgSource)); + imgSource = QByteArrayLiteral("data:image/png;base64,") + data; } m_initialScript.append(QString("addBox('%1', '%2', '%3');\n").arg(page.url, page.title, imgSource)); @@ -259,14 +259,12 @@ void SpeedDial::loadThumbnail(const QString &url, bool loadTitle) return; } -#if QTWEBENGINE_DISABLED PageThumbnailer* thumbnailer = new PageThumbnailer(this); thumbnailer->setUrl(QUrl::fromEncoded(url.toUtf8())); thumbnailer->setLoadTitle(loadTitle); connect(thumbnailer, SIGNAL(thumbnailCreated(QPixmap)), this, SLOT(thumbnailCreated(QPixmap))); thumbnailer->start(); -#endif } void SpeedDial::removeImageForUrl(const QString &url) @@ -322,7 +320,6 @@ void SpeedDial::setSdCentered(int cntr) void SpeedDial::thumbnailCreated(const QPixmap &pixmap) { -#if QTWEBENGINE_DISABLED PageThumbnailer* thumbnailer = qobject_cast(sender()); if (!thumbnailer) { return; @@ -342,22 +339,17 @@ void SpeedDial::thumbnailCreated(const QPixmap &pixmap) if (!pixmap.save(fileName, "PNG")) { qWarning() << "SpeedDial::thumbnailCreated Cannot save thumbnail to " << fileName; } - - fileName = QUrl::fromLocalFile(fileName).toString(); + //fileName = QUrl::fromLocalFile(fileName).toString(); } m_regenerateScript = true; + thumbnailer->deleteLater(); - pages(); - foreach (QWebEngineFrame* frame, pages()) { - frame->evaluateJavaScript(QString("setImageToUrl('%1', '%2');").arg(escapeUrl(url), escapeTitle(fileName))); - if (loadTitle) { - frame->evaluateJavaScript(QString("setTitleToUrl('%1', '%2');").arg(escapeUrl(url), escapeTitle(title))); - } - } + if (loadTitle) + emit pageTitleLoaded(url, title); - thumbnailer->deleteLater(); -#endif + QByteArray data = QzTools::pixmapToByteArray(QPixmap(fileName)); + emit thumbnailLoaded(url, QString(QByteArrayLiteral("data:image/png;base64,") + data)); } QString SpeedDial::escapeTitle(QString title) const diff --git a/src/lib/plugins/speeddial.h b/src/lib/plugins/speeddial.h index 905aa9b2f..ea79fe437 100644 --- a/src/lib/plugins/speeddial.h +++ b/src/lib/plugins/speeddial.h @@ -65,10 +65,12 @@ public: signals: void pagesChanged(); + void thumbnailLoaded(const QString &url, const QString &src); + void pageTitleLoaded(const QString &url, const QString &title); public slots: void changed(const QString &allPages); - void loadThumbnail(const QString &url, bool loadTitle = false); + void loadThumbnail(const QString &url, bool loadTitle); void removeImageForUrl(const QString &url); QString getOpenFileName(); diff --git a/src/lib/tools/pagethumbnailer.cpp b/src/lib/tools/pagethumbnailer.cpp index d7573c45e..a00ba7a22 100644 --- a/src/lib/tools/pagethumbnailer.cpp +++ b/src/lib/tools/pagethumbnailer.cpp @@ -16,51 +16,27 @@ * along with this program. If not, see . * ============================================================ */ #include "pagethumbnailer.h" -#include "mainapplication.h" -#include "networkmanagerproxy.h" -#if QTWEBENGINE_DISABLED - -#include -#include #include - -CleanPluginFactory::CleanPluginFactory(QObject* parent) - : QWebPluginFactory(parent) -{ -} - -QList CleanPluginFactory::plugins() const -{ - return QList(); -} - -QObject* CleanPluginFactory::create(const QString &mimeType, const QUrl &url, const QStringList &argumentNames, const QStringList &argumentValues) const -{ - Q_UNUSED(mimeType) - Q_UNUSED(url) - Q_UNUSED(argumentNames) - Q_UNUSED(argumentValues) - - return new QObject; -} +#include +#include PageThumbnailer::PageThumbnailer(QObject* parent) : QObject(parent) - , m_page(new QWebEnginePage(this)) + , m_view(new QWebEngineView()) , m_size(QSize(450, 253)) , m_loadTitle(false) { - NetworkManagerProxy* networkProxy = new NetworkManagerProxy(this); - networkProxy->setPrimaryNetworkAccessManager(mApp->networkManager()); - m_page->setNetworkAccessManager(networkProxy); - - m_page->mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff); - m_page->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff); - - // HD Ready -,- // Every page should fit in this resolution - m_page->setViewportSize(QSize(1280, 720)); + m_view->resize(QSize(1280, 720)); + + // Well ... + QWidget *w = QApplication::activeWindow(); + m_view->show(); + if (w) { + QApplication::setActiveWindow(w); + w->activateWindow(); + } } void PageThumbnailer::setSize(const QSize &size) @@ -98,22 +74,14 @@ QString PageThumbnailer::title() if (title.isEmpty()) { title = m_url.toString(); } - return title; } -void PageThumbnailer::setEnableFlash(bool enable) -{ - if (!enable) { - m_page->setPluginFactory(new CleanPluginFactory); - } -} - void PageThumbnailer::start() { - m_page->mainFrame()->load(m_url); + m_view->load(m_url); - connect(m_page, SIGNAL(loadFinished(bool)), this, SLOT(createThumbnail(bool))); + connect(m_view, &QWebEngineView::loadFinished, this, &PageThumbnailer::createThumbnail); } void PageThumbnailer::createThumbnail(bool status) @@ -123,23 +91,12 @@ void PageThumbnailer::createThumbnail(bool status) return; } - m_title = m_page->mainFrame()->title().trimmed(); - - QPixmap pixmap(2 * m_size); - - qreal scalingFactor = 2 * static_cast(m_size.width()) / 1280; + m_title = m_view->title().trimmed(); - QPainter painter(&pixmap); - painter.scale(scalingFactor, scalingFactor); - m_page->mainFrame()->render(&painter, QWebEngineFrame::ContentsLayer); - painter.end(); - - emit thumbnailCreated(pixmap.scaled(m_size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + emit thumbnailCreated(m_view->grab().scaled(m_size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); } PageThumbnailer::~PageThumbnailer() { - m_page->deleteLater(); + m_view->deleteLater(); } - -#endif diff --git a/src/lib/tools/pagethumbnailer.h b/src/lib/tools/pagethumbnailer.h index d48c11a39..7a1797a90 100644 --- a/src/lib/tools/pagethumbnailer.h +++ b/src/lib/tools/pagethumbnailer.h @@ -18,28 +18,15 @@ #ifndef PAGETHUMBNAILER_H #define PAGETHUMBNAILER_H -#if QTWEBENGINE_DISABLED - #include #include #include -#include #include "qzcommon.h" -class QWebEnginePage; +class QWebEngineView; class QPixmap; -class QUPZILLA_EXPORT CleanPluginFactory : public QWebPluginFactory -{ - Q_OBJECT -public: - explicit CleanPluginFactory(QObject* parent = 0); - - QList plugins() const; - QObject* create(const QString &mimeType, const QUrl &url, const QStringList &argumentNames, const QStringList &argumentValues) const; -}; - class QUPZILLA_EXPORT PageThumbnailer : public QObject { Q_OBJECT @@ -56,8 +43,6 @@ public: void setLoadTitle(bool load); QString title(); - void setEnableFlash(bool enable); - void start(); signals: @@ -69,7 +54,7 @@ private slots: void createThumbnail(bool status); private: - QWebEnginePage* m_page; + QWebEngineView* m_view; QSize m_size; QUrl m_url; @@ -77,6 +62,4 @@ private: bool m_loadTitle; }; -#endif - #endif // PAGETHUMBNAILER_H