tst_doubleTapToZoom.qml   [plain text]


import QtQuick 2.0
import QtTest 1.0
import QtWebKit 3.0
import QtWebKit.experimental 1.0
import Test 1.0
import "../common"

Item {
    TestWebView {
        id: webView
        width: 320
        height: 240

        property variant result

        property variant content: "data:text/html," +
            "<head>" +
            "    <meta name='viewport' content='width=device-width'>" +
            "</head>" +
            "<body>" +
            "    <div id='target' " +
            "         style='position:absolute; left:20; top:20; width:220; height:80;'>" +
            "    </div>" +
            "    <div id='smalltarget' " +
            "         style='position:absolute; left:20; top:120; width:140; height:80;'>" +
            "    </div>" +
            "</body>"

        signal resultReceived
    }

    SignalSpy {
        id: resultSpy
        target: webView
        signalName: "resultReceived"
    }

    SignalSpy {
        id: scaleSpy
        target: webView.experimental.test
        signalName: "contentsScaleCommitted"
    }

    TestCase {
        name: "DoubleTapToZoom"
        when: windowShown

        property variant test: webView.experimental.test

        function init() {
            resultSpy.clear()
            scaleSpy.clear()
        }

        function windowSize() {
            resultSpy.clear();
            var result;

             webView.experimental.evaluateJavaScript(
                "window.innerWidth + 'x' + window.innerHeight",
                function(size) { webView.resultReceived(); result = size });
            resultSpy.wait();
            return result;
        }

        function elementRect(id) {
            resultSpy.clear();
            var result;

             webView.experimental.evaluateJavaScript(
                "JSON.stringify(document.getElementById('" + id + "').getBoundingClientRect());",
                function(rect) { webView.resultReceived(); result = JSON.parse(rect); });
            resultSpy.wait();
            return result;
        }

        function doubleTapAtPoint(x, y) {
            scaleSpy.clear()
            test.touchDoubleTap(webView, x, y)
            scaleSpy.wait()
        }

        function test_basic_zoomInAndBack() {
            webView.url = webView.content
            verify(webView.waitForViewportReady())

            compare(windowSize(), "320x240")

            compare(test.contentsScale, 1.0)

            var rect = elementRect("target");
            var newScale = webView.width / (rect.width + 2 * 10) // inflated by 10px
            doubleTapAtPoint(100, 50)

            compare(test.contentsScale, newScale)

            doubleTapAtPoint(100, 50)

            compare(test.contentsScale, 1.0)
        }

        function test_double_zoomInAndBack() {
            webView.url = webView.content
            verify(webView.waitForViewportReady())

            compare(windowSize(), "320x240")
            compare(test.contentsScale, 1.0)

            var target = elementRect("target");
            var smalltarget = elementRect("smalltarget");
            var targetScale = webView.width / (target.width + 2 * 10) // inflated by 10px
            var smallTargetScale = webView.width / (smalltarget.width + 2 * 10) // inflated by 10px

            doubleTapAtPoint(100, 50)

            compare(test.contentsScale, targetScale)

            doubleTapAtPoint(100, 160)

            compare(test.contentsScale, smallTargetScale)

            // Zoom out by double clicking first the small target and then the large target.
            doubleTapAtPoint(100, 120)

            compare(test.contentsScale, targetScale)

            doubleTapAtPoint(100, 50)

            compare(test.contentsScale, 1.0)
        }

        function test_double_zoomInAndBack2() {
            webView.url = webView.content
            verify(webView.waitForViewportReady())

            compare(windowSize(), "320x240")
            compare(test.contentsScale, 1.0)

            var target = elementRect("target");
            var smalltarget = elementRect("smalltarget");
            var targetScale = webView.width / (target.width + 2 * 10) // inflated by 10px
            var smallTargetScale = webView.width / (smalltarget.width + 2 * 10) // inflated by 10px

            doubleTapAtPoint(100, 50)

            compare(test.contentsScale, targetScale)

            doubleTapAtPoint(100, 160)

            compare(test.contentsScale, smallTargetScale)

            // Zoom out by double clicking the small target twice.
            doubleTapAtPoint(100, 120)

            compare(test.contentsScale, targetScale)

            doubleTapAtPoint(100, 160)

            compare(test.contentsScale, 1.0)
        }

        function test_double_zoomInOutAndBack() {
            webView.url = webView.content
            verify(webView.waitForViewportReady())

            compare(windowSize(), "320x240")
            compare(test.contentsScale, 1.0)

            var target = elementRect("target");
            var smalltarget = elementRect("smalltarget");
            var targetScale = webView.width / (target.width + 2 * 10) // inflated by 10px
            var smallTargetScale = webView.width / (smalltarget.width + 2 * 10) // inflated by 10px

            doubleTapAtPoint(100, 50)

            compare(test.contentsScale, targetScale)

            doubleTapAtPoint(100, 160)

            compare(test.contentsScale, smallTargetScale)

            // Zoom out by double clicking the large target twice.
            doubleTapAtPoint(100, 40)

            compare(test.contentsScale, targetScale)

            doubleTapAtPoint(100, 50)

            compare(test.contentsScale, 1.0)
        }

        function test_double_zoomInOutAndBack2() {
            webView.url = webView.content
            verify(webView.waitForViewportReady())

            compare(windowSize(), "320x240")
            compare(test.contentsScale, 1.0)

            var target = elementRect("target");
            var smalltarget = elementRect("smalltarget");
            var targetScale = webView.width / (target.width + 2 * 10) // inflated by 10px
            var smallTargetScale = webView.width / (smalltarget.width + 2 * 10) // inflated by 10px

            // Zoom in directly to the small target, and then out over the large target.
            doubleTapAtPoint(100, 140)

            compare(test.contentsScale, smallTargetScale)

            doubleTapAtPoint(100, 20)

            compare(test.contentsScale, targetScale)

            doubleTapAtPoint(100, 50)

            compare(test.contentsScale, 1.0)
        }
    }
}