From 016f6a47bfe026016e318d150bfee7bd07393d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonatan=20P=C3=A5lsson?= Date: Wed, 5 Feb 2014 13:57:55 +0100 Subject: Implemented getPageIcon --- browser/browserview.cpp | 35 +++++++++++++++++++++- browser/browserview.h | 9 ++++++ browser/unit-tests/browserdbus/testbrowserdbus.cpp | 9 ++++++ browser/unit-tests/browserdbus/testbrowserdbus.h | 1 + browser/unit-tests/browserview/testbrowser.cpp | 14 ++++++++- browser/unit-tests/browserview/testbrowser.h | 1 + browser/webpagewindow.cpp | 8 +++-- browser/webpagewindow.h | 2 +- common/browserdbus.cpp | 14 +++++++++ common/browserdbus.h | 1 + 10 files changed, 88 insertions(+), 6 deletions(-) diff --git a/browser/browserview.cpp b/browser/browserview.cpp index 7d31ba0..163832b 100644 --- a/browser/browserview.cpp +++ b/browser/browserview.cpp @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include "browserview.h" #include "../common/browserdefs.h" @@ -180,7 +182,7 @@ void BrowserView::scrollPositionChanged(uint x, uint y) void BrowserView::setScrollPosition(uint x, uint y) { QString cmd = QString("window.scrollTo(%1,%2);").arg(QString::number(x), QString::number(y)); - m_webview.page()->mainFrame()->evaluateJavaScript(cmd); + m_webview.page()->mainFrame()->evaluateJavaScript(cmd); m_scrollPositionX = x; m_scrollPositionY = y; } @@ -190,3 +192,34 @@ void BrowserView::getScrollPosition(uint &x, uint &y) x = m_scrollPositionX; y = m_scrollPositionY; } + +QString BrowserView::createScreenshot(QString url) { + WebPageWaiter waiter; + QWebPage wp; + QSize renderSize(640,480); + + connect(&wp, SIGNAL(loadFinished(bool)), &waiter, SLOT (loadFinished(void))); + + wp.mainFrame()->load(QUrl(url)); + wp.setViewportSize(renderSize); + wp.mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff); + wp.mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff); + + for (int i = 0; i < 100; i++) { + waiter.finishedSem.tryAcquire(1,10); + QCoreApplication::processEvents(); + } + + QImage *image = new QImage(renderSize, + QImage::Format_ARGB32); + QPainter *painter = new QPainter(image); + QTemporaryFile outFile("XXXXXX.png"); + outFile.setAutoRemove(false); + outFile.open(); + wp.mainFrame()->render(painter); + + painter->end(); + image->save(&outFile, "PNG"); + outFile.close(); + return outFile.fileName(); +} diff --git a/browser/browserview.h b/browser/browserview.h index 32f9f9d..b889628 100644 --- a/browser/browserview.h +++ b/browser/browserview.h @@ -19,9 +19,17 @@ #include #include #include +#include #include "../common/browserdefs.h" +class WebPageWaiter : public QObject { +Q_OBJECT +public slots: + void loadFinished() { finishedSem.release(1); } +public: + QSemaphore finishedSem; +}; class InputHandler : public QObject { Q_OBJECT @@ -68,6 +76,7 @@ public: double getZoomFactor(); void getScrollPosition(uint&, uint&); void setScrollPosition(uint, uint); + static QString createScreenshot(QString url); signals: void pageLoadStarted(); diff --git a/browser/unit-tests/browserdbus/testbrowserdbus.cpp b/browser/unit-tests/browserdbus/testbrowserdbus.cpp index 393a3a7..ca462ef 100644 --- a/browser/unit-tests/browserdbus/testbrowserdbus.cpp +++ b/browser/unit-tests/browserdbus/testbrowserdbus.cpp @@ -178,4 +178,13 @@ void TestBrowserDBus::testCanSetAndGetScrollPosition() { QVERIFY(spy.last().value(1).toUInt() == 0); } +void TestBrowserDBus::testCanGeneratePageIcon() { + m_bdb->loadurl(testFileUrl()); + QTest::qSleep(300); + QString iconPath; + m_bdb->getPageIcon(testFileUrl(), iconPath); + qDebug() << iconPath; + QVERIFY(iconPath.compare(QString("")) != 0); +} + QTEST_MAIN (TestBrowserDBus); diff --git a/browser/unit-tests/browserdbus/testbrowserdbus.h b/browser/unit-tests/browserdbus/testbrowserdbus.h index d362402..8702923 100644 --- a/browser/unit-tests/browserdbus/testbrowserdbus.h +++ b/browser/unit-tests/browserdbus/testbrowserdbus.h @@ -34,6 +34,7 @@ private slots: void testGetsNotifiedWhenScrollingChanges(); void testCanSetAndGetZoomFactor(); void testCanSetAndGetScrollPosition(); + void testCanGeneratePageIcon(); private: QString testFileUrl() { diff --git a/browser/unit-tests/browserview/testbrowser.cpp b/browser/unit-tests/browserview/testbrowser.cpp index 7db92dc..b273683 100644 --- a/browser/unit-tests/browserview/testbrowser.cpp +++ b/browser/unit-tests/browserview/testbrowser.cpp @@ -3,9 +3,10 @@ #include #include #include +#include #include "testbrowser.h" -#include "../browserview.h" +#include "../../browserview.h" /////////////// Test cases /////////////// @@ -175,4 +176,15 @@ void TestBrowser::testGetUrl() QVERIFY (before.compare(after) != 0); } +void TestBrowser::testCanCreateScreenshot() { + BrowserView bvi; + bvi.show(); + { + QSignalSpy spy (&bvi, SIGNAL(pageLoadFinished(bool))); + spy.wait(1000); + } + QString fileName = bvi.createScreenshot(); + QVERIFY(QFileInfo(fileName).size() > 0); +} + QTEST_MAIN (TestBrowser); diff --git a/browser/unit-tests/browserview/testbrowser.h b/browser/unit-tests/browserview/testbrowser.h index 6d6cc54..c080273 100644 --- a/browser/unit-tests/browserview/testbrowser.h +++ b/browser/unit-tests/browserview/testbrowser.h @@ -14,4 +14,5 @@ private slots: void testReload(); void testGetTitle(); void testGetUrl(); + void testCanCreateScreenshot(); }; diff --git a/browser/webpagewindow.cpp b/browser/webpagewindow.cpp index b57d198..ecc70fb 100644 --- a/browser/webpagewindow.cpp +++ b/browser/webpagewindow.cpp @@ -58,8 +58,9 @@ conn::brw::ERROR_IDS webpagewindow::activate() { return conn::brw::EID_NOT_IMPLEMENTED; } -conn::brw::ERROR_IDS webpagewindow::getPageIcon(QString iconPath, QString iconFilePath) { - return conn::brw::EID_NOT_IMPLEMENTED; +conn::brw::ERROR_IDS webpagewindow::getPageIcon(QString iconPath, QString &iconFilePath) { + iconFilePath = webitem->createScreenshot(iconPath); + return conn::brw::EID_NO_ERROR; } conn::brw::ERROR_IDS webpagewindow::back() { @@ -233,4 +234,5 @@ conn::brw::ERROR_IDS webpagewindow::setScrollPosition(uint &x, uint &y) { return conn::brw::EID_NO_ERROR; } -conn::brw::ERROR_IDS webpagewindow::getFavicon(const QString&, QString&) {} +conn::brw::ERROR_IDS webpagewindow::getFavicon(const QString&, QString&) { +} diff --git a/browser/webpagewindow.h b/browser/webpagewindow.h index f7a6f01..72a570b 100644 --- a/browser/webpagewindow.h +++ b/browser/webpagewindow.h @@ -61,7 +61,7 @@ public Q_SLOTS: conn::brw::ERROR_IDS setVisible(bool a_bVisible); conn::brw::ERROR_IDS stop(); conn::brw::ERROR_IDS activate(); - conn::brw::ERROR_IDS getPageIcon(QString iconPath, QString iconFilePath); + conn::brw::ERROR_IDS getPageIcon(QString iconPath, QString &iconFilePath); conn::brw::ERROR_IDS getScrollPosition(uint &posX, uint &posY); QString getTitle(); diff --git a/common/browserdbus.cpp b/common/browserdbus.cpp index b574bdb..7c4996e 100644 --- a/common/browserdbus.cpp +++ b/common/browserdbus.cpp @@ -600,3 +600,17 @@ void BrowserDbus::setScrollPosition(uint &x, uint &y) { qDebug() << "ERROR " << error.name() << error.message(); } } + +void BrowserDbus::getPageIcon(QString iconPath, QString &iconFilePath) { + qDebug() << __PRETTY_FUNCTION__; + + QDBusReply reply = + actualtab->getPageIcon(iconPath,iconFilePath); + if(reply.isValid()) { + conn::brw::ERROR_IDS ret = reply.value(); + qDebug() << "ERROR_IDS " << ret; + } else { + QDBusError error = reply.error(); + qDebug() << "ERROR " << error.name() << error.message(); + } +} diff --git a/common/browserdbus.h b/common/browserdbus.h index 79e59cc..6482ef0 100644 --- a/common/browserdbus.h +++ b/common/browserdbus.h @@ -68,6 +68,7 @@ public: Q_INVOKABLE void setZoomFactor(double); Q_INVOKABLE void getScrollPosition(uint &x, uint &y); Q_INVOKABLE void setScrollPosition(uint &x, uint &y); + Q_INVOKABLE void getPageIcon(QString, QString &); QString title() { return m_title; } void setTitle(QString title) { m_title = title; } -- cgit v1.2.1