summaryrefslogtreecommitdiffstats
path: root/WebKit/qt/tests
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit/qt/tests')
-rw-r--r--WebKit/qt/tests/qwebframe/tst_qwebframe.cpp189
-rw-r--r--WebKit/qt/tests/qwebpage/tst_qwebpage.cpp97
-rw-r--r--WebKit/qt/tests/qwebview/tst_qwebview.cpp8
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(&quot;input5&quot;); 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);