diff options
Diffstat (limited to 'WebKit/qt/tests')
| -rw-r--r-- | WebKit/qt/tests/qwebframe/tst_qwebframe.cpp | 189 | ||||
| -rw-r--r-- | WebKit/qt/tests/qwebpage/tst_qwebpage.cpp | 97 | ||||
| -rw-r--r-- | WebKit/qt/tests/qwebview/tst_qwebview.cpp | 8 |
3 files changed, 261 insertions, 33 deletions
diff --git a/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp b/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp index eb3ae0a..2ae85e4 100644 --- a/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp +++ b/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp @@ -29,6 +29,7 @@ #include <QAbstractItemView> #include <QApplication> #include <QComboBox> +#include <QPaintEngine> #include <QPicture> #include <QRegExp> #include <QNetworkRequest> @@ -616,6 +617,7 @@ private slots: void baseUrl(); void hasSetFocus(); void render(); + void renderHints(); void scrollPosition(); void scrollToAnchor(); void scrollbarsOff(); @@ -625,6 +627,7 @@ private slots: void introspectQtMethods(); void setContent_data(); void setContent(); + void setCacheLoadControlAttribute(); private: QString evalJS(const QString&s) { @@ -2856,6 +2859,139 @@ void tst_QWebFrame::render() QCOMPARE(size.height(), picture.boundingRect().height()); // height: 100px } + +class DummyPaintEngine: public QPaintEngine { +public: + + DummyPaintEngine() + : QPaintEngine(QPaintEngine::AllFeatures) + , renderHints(0) + { + } + + bool begin(QPaintDevice*) + { + setActive(true); + return true; + } + + bool end() + { + setActive(false); + return false; + } + + void updateState(const QPaintEngineState& state) + { + renderHints = state.renderHints(); + } + + void drawPath(const QPainterPath&) { } + void drawPixmap(const QRectF&, const QPixmap&, const QRectF&) { } + + QPaintEngine::Type type() const + { + return static_cast<QPaintEngine::Type>(QPaintEngine::User + 2); + } + + QPainter::RenderHints renderHints; +}; + +class DummyPaintDevice: public QPaintDevice { +public: + DummyPaintDevice() + : QPaintDevice() + , m_engine(new DummyPaintEngine) + { + } + + ~DummyPaintDevice() + { + delete m_engine; + } + + QPaintEngine* paintEngine() const + { + return m_engine; + } + + QPainter::RenderHints renderHints() const + { + return m_engine->renderHints; + } + +protected: + int metric(PaintDeviceMetric metric) const; + +private: + DummyPaintEngine* m_engine; + friend class DummyPaintEngine; +}; + + +int DummyPaintDevice::metric(PaintDeviceMetric metric) const +{ + switch (metric) { + case PdmWidth: + return 400; + break; + + case PdmHeight: + return 200; + break; + + case PdmNumColors: + return INT_MAX; + break; + + case PdmDepth: + return 32; + break; + + default: + break; + } + return 0; +} + +void tst_QWebFrame::renderHints() +{ + QString html("<html><body><p>Hello, world!</p></body></html>"); + + QWebPage page; + page.mainFrame()->setHtml(html); + page.setViewportSize(page.mainFrame()->contentsSize()); + + // We will call frame->render and trap the paint engine state changes + // to ensure that GraphicsContext does not clobber the render hints. + DummyPaintDevice buffer; + QPainter painter(&buffer); + + painter.setRenderHint(QPainter::TextAntialiasing, false); + page.mainFrame()->render(&painter); + QVERIFY(!(buffer.renderHints() & QPainter::TextAntialiasing)); + QVERIFY(!(buffer.renderHints() & QPainter::SmoothPixmapTransform)); + QVERIFY(!(buffer.renderHints() & QPainter::HighQualityAntialiasing)); + + painter.setRenderHint(QPainter::TextAntialiasing, true); + page.mainFrame()->render(&painter); + QVERIFY(buffer.renderHints() & QPainter::TextAntialiasing); + QVERIFY(!(buffer.renderHints() & QPainter::SmoothPixmapTransform)); + QVERIFY(!(buffer.renderHints() & QPainter::HighQualityAntialiasing)); + + painter.setRenderHint(QPainter::SmoothPixmapTransform, true); + page.mainFrame()->render(&painter); + QVERIFY(buffer.renderHints() & QPainter::TextAntialiasing); + QVERIFY(buffer.renderHints() & QPainter::SmoothPixmapTransform); + QVERIFY(!(buffer.renderHints() & QPainter::HighQualityAntialiasing)); + + painter.setRenderHint(QPainter::HighQualityAntialiasing, true); + page.mainFrame()->render(&painter); + QVERIFY(buffer.renderHints() & QPainter::TextAntialiasing); + QVERIFY(buffer.renderHints() & QPainter::SmoothPixmapTransform); + QVERIFY(buffer.renderHints() & QPainter::HighQualityAntialiasing); +} + void tst_QWebFrame::scrollPosition() { // enlarged image in a small viewport, to provoke the scrollbars to appear @@ -3068,5 +3204,58 @@ void tst_QWebFrame::setContent() QCOMPARE(expected , mainFrame->toPlainText()); } +class CacheNetworkAccessManager : public QNetworkAccessManager { +public: + CacheNetworkAccessManager(QObject* parent = 0) + : QNetworkAccessManager(parent) + , m_lastCacheLoad(QNetworkRequest::PreferNetwork) + { + } + + virtual QNetworkReply* createRequest(Operation, const QNetworkRequest& request, QIODevice*) + { + QVariant cacheLoad = request.attribute(QNetworkRequest::CacheLoadControlAttribute); + if (cacheLoad.isValid()) + m_lastCacheLoad = static_cast<QNetworkRequest::CacheLoadControl>(cacheLoad.toUInt()); + else + m_lastCacheLoad = QNetworkRequest::PreferNetwork; // default value + return new FakeReply(request, this); + } + + QNetworkRequest::CacheLoadControl lastCacheLoad() const + { + return m_lastCacheLoad; + } + +private: + QNetworkRequest::CacheLoadControl m_lastCacheLoad; +}; + +void tst_QWebFrame::setCacheLoadControlAttribute() +{ + QWebPage page; + CacheNetworkAccessManager* manager = new CacheNetworkAccessManager(&page); + page.setNetworkAccessManager(manager); + QWebFrame* frame = page.mainFrame(); + + QNetworkRequest request(QUrl("http://abcdef.abcdef/")); + + request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysCache); + frame->load(request); + QCOMPARE(manager->lastCacheLoad(), QNetworkRequest::AlwaysCache); + + request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); + frame->load(request); + QCOMPARE(manager->lastCacheLoad(), QNetworkRequest::PreferCache); + + request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork); + frame->load(request); + QCOMPARE(manager->lastCacheLoad(), QNetworkRequest::AlwaysNetwork); + + request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork); + frame->load(request); + QCOMPARE(manager->lastCacheLoad(), QNetworkRequest::PreferNetwork); +} + QTEST_MAIN(tst_QWebFrame) #include "tst_qwebframe.moc" diff --git a/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp b/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp index c27ba02..4645a06 100644 --- a/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp +++ b/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp @@ -128,6 +128,7 @@ private slots: void findText(); void supportedContentType(); void infiniteLoopJS(); + void networkAccessManagerOnDifferentThread(); private: QWebView* m_view; @@ -249,14 +250,8 @@ void tst_QWebPage::infiniteLoopJS() void tst_QWebPage::geolocationRequestJS() { - /* - This test is disabled because it can only succeed if ENABLE(GEOLOCATION) is true. - The code needs to be updated when the API of requestPermissionFromUser is updated. - */ - QSKIP("Test disabled as long as geolocation is disabled from the build.", SkipSingle); - JSTestPage* newPage = new JSTestPage(m_view); - connect(newPage, SIGNAL(requestPermissionFromUser(QWebFrame*, QWebPage::Feature)), + connect(newPage, SIGNAL(featurePermissionRequested(QWebFrame*, QWebPage::Feature)), newPage, SLOT(requestPermission(QWebFrame*, QWebPage::Feature))); newPage->setGeolocationPermission(false); @@ -1397,6 +1392,14 @@ static bool inputMethodEnabled(QObject* object) return false; } +static void clickOnPage(QWebPage* page, const QPoint& position) +{ + QMouseEvent evpres(QEvent::MouseButtonPress, position, Qt::LeftButton, Qt::NoButton, Qt::NoModifier); + page->event(&evpres); + QMouseEvent evrel(QEvent::MouseButtonRelease, position, Qt::LeftButton, Qt::NoButton, Qt::NoModifier); + page->event(&evrel); +} + void tst_QWebPage::inputMethods() { QFETCH(QString, viewType); @@ -1433,11 +1436,9 @@ void tst_QWebPage::inputMethods() EventSpy viewEventSpy(container); QWebElementCollection inputs = page->mainFrame()->documentElement().findAll("input"); + QPoint textInputCenter = inputs.at(0).geometry().center(); - QMouseEvent evpres(QEvent::MouseButtonPress, inputs.at(0).geometry().center(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier); - page->event(&evpres); - QMouseEvent evrel(QEvent::MouseButtonRelease, inputs.at(0).geometry().center(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier); - page->event(&evrel); + clickOnPage(page, textInputCenter); // This part of the test checks if the SIP (Software Input Panel) is triggered, // which normally happens on mobile platforms, when a user input form receives @@ -1462,8 +1463,7 @@ void tst_QWebPage::inputMethods() QVERIFY(!viewEventSpy.contains(QEvent::RequestSoftwareInputPanel)); viewEventSpy.clear(); - page->event(&evpres); - page->event(&evrel); + clickOnPage(page, textInputCenter); QVERIFY(viewEventSpy.contains(QEvent::RequestSoftwareInputPanel)); //ImMicroFocus @@ -1565,8 +1565,7 @@ void tst_QWebPage::inputMethods() // LEFT to RIGHT selection // Deselect the selection by sending MouseButtonPress events // This moves the current cursor to the end of the text - page->event(&evpres); - page->event(&evrel); + clickOnPage(page, textInputCenter); { QList<QInputMethodEvent::Attribute> attributes; @@ -1614,8 +1613,7 @@ void tst_QWebPage::inputMethods() //RIGHT to LEFT selection //Deselect the selection (this moves the current cursor to the end of the text) - page->event(&evpres); - page->event(&evrel); + clickOnPage(page, textInputCenter); //ImAnchorPosition variant = page->inputMethodQuery(Qt::ImAnchorPosition); @@ -1662,28 +1660,20 @@ void tst_QWebPage::inputMethods() //END - Tests for Selection when the Editor is not in Composition mode //ImhHiddenText - QMouseEvent evpresPassword(QEvent::MouseButtonPress, inputs.at(1).geometry().center(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier); - page->event(&evpresPassword); - QMouseEvent evrelPassword(QEvent::MouseButtonRelease, inputs.at(1).geometry().center(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier); - page->event(&evrelPassword); + QPoint passwordInputCenter = inputs.at(1).geometry().center(); + clickOnPage(page, passwordInputCenter); QVERIFY(inputMethodEnabled(view)); QVERIFY(inputMethodHints(view) & Qt::ImhHiddenText); - page->event(&evpres); - page->event(&evrel); + clickOnPage(page, textInputCenter); QVERIFY(!(inputMethodHints(view) & Qt::ImhHiddenText)); page->mainFrame()->setHtml("<html><body><p>nothing to input here"); viewEventSpy.clear(); QWebElement para = page->mainFrame()->findFirstElement("p"); - { - QMouseEvent evpres(QEvent::MouseButtonPress, para.geometry().center(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier); - page->event(&evpres); - QMouseEvent evrel(QEvent::MouseButtonRelease, para.geometry().center(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier); - page->event(&evrel); - } + clickOnPage(page, para.geometry().center()); QVERIFY(!viewEventSpy.contains(QEvent::RequestSoftwareInputPanel)); @@ -2009,6 +1999,15 @@ void tst_QWebPage::inputMethods() anchorPosition = variant.toInt(); QCOMPARE(anchorPosition, 12); + // Check sending RequestSoftwareInputPanel event + page->mainFrame()->setHtml("<html><body>" \ + "<input type='text' id='input5' value='QtWebKit inputMethod'/>" \ + "<div id='btnDiv' onclick='i=document.getElementById("input5"); i.focus();'>abc</div>"\ + "</body></html>"); + QWebElement inputElement = page->mainFrame()->findFirstElement("div"); + clickOnPage(page, inputElement.geometry().center()); + + QVERIFY(!viewEventSpy.contains(QEvent::RequestSoftwareInputPanel)); delete container; } @@ -2599,5 +2598,45 @@ void tst_QWebPage::supportedContentType() QVERIFY2(m_page->supportsContentType(mimeType), QString("Cannot handle content types '%1'!").arg(mimeType).toLatin1()); } +class QtNAMThread : public QThread { +public: + QtNAMThread() + { + m_qnamFuture.reportStarted(); + } + ~QtNAMThread() + { + quit(); + wait(); + } + + QFuture<QNetworkAccessManager*> networkAccessManager() + { + return m_qnamFuture.future(); + } +protected: + void run() + { + QNetworkAccessManager* qnam = new QNetworkAccessManager; + m_qnamFuture.reportFinished(&qnam); + exec(); + delete qnam; + } +private: + QFutureInterface<QNetworkAccessManager*> m_qnamFuture; +}; + +void tst_QWebPage::networkAccessManagerOnDifferentThread() +{ + QtNAMThread qnamThread; + qnamThread.start(); + m_page->setNetworkAccessManager(qnamThread.networkAccessManager()); + QSignalSpy loadSpy(m_page, SIGNAL(loadFinished(bool))); + QUrl url = QUrl("qrc:///resources/index.html"); + m_page->mainFrame()->load(url); + QTRY_COMPARE(loadSpy.count(), 1); + QCOMPARE(m_page->mainFrame()->childFrames()[0]->url(), QUrl("qrc:///resources/frame_a.html")); +} + QTEST_MAIN(tst_QWebPage) #include "tst_qwebpage.moc" diff --git a/WebKit/qt/tests/qwebview/tst_qwebview.cpp b/WebKit/qt/tests/qwebview/tst_qwebview.cpp index 8cd2f3f..7bf66b7 100644 --- a/WebKit/qt/tests/qwebview/tst_qwebview.cpp +++ b/WebKit/qt/tests/qwebview/tst_qwebview.cpp @@ -79,22 +79,22 @@ void tst_QWebView::renderHints() { QWebView webView; - // default is only text antialiasing + // default is only text antialiasing + smooth pixmap transform QVERIFY(!(webView.renderHints() & QPainter::Antialiasing)); QVERIFY(webView.renderHints() & QPainter::TextAntialiasing); - QVERIFY(!(webView.renderHints() & QPainter::SmoothPixmapTransform)); + QVERIFY(webView.renderHints() & QPainter::SmoothPixmapTransform); QVERIFY(!(webView.renderHints() & QPainter::HighQualityAntialiasing)); webView.setRenderHint(QPainter::Antialiasing, true); QVERIFY(webView.renderHints() & QPainter::Antialiasing); QVERIFY(webView.renderHints() & QPainter::TextAntialiasing); - QVERIFY(!(webView.renderHints() & QPainter::SmoothPixmapTransform)); + QVERIFY(webView.renderHints() & QPainter::SmoothPixmapTransform); QVERIFY(!(webView.renderHints() & QPainter::HighQualityAntialiasing)); webView.setRenderHint(QPainter::Antialiasing, false); QVERIFY(!(webView.renderHints() & QPainter::Antialiasing)); QVERIFY(webView.renderHints() & QPainter::TextAntialiasing); - QVERIFY(!(webView.renderHints() & QPainter::SmoothPixmapTransform)); + QVERIFY(webView.renderHints() & QPainter::SmoothPixmapTransform); QVERIFY(!(webView.renderHints() & QPainter::HighQualityAntialiasing)); webView.setRenderHint(QPainter::SmoothPixmapTransform, true); |
