summaryrefslogtreecommitdiffstats
path: root/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-invalid-args.html
blob: af1488cffe632613f8f93493031e66455a14b250 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test.js"></script>
</head>
<body>
<script>
description("Ensure correct behavior of createImageBitmap for invalid inputs.");
window.jsTestIsAsync = true;

var reason;

function shouldBeRejected(promise, message) {
    return promise.then(function() {
        testFailed('Resolved unexpectedly: ' + message);
    }, function(e) {
        reason = e;
        testPassed('Rejected as expected: ' + message);
        shouldBeTrue('reason instanceof Error');
        debug(e);
    });
}

function checkInvalidRange(source, message) {
    return Promise.resolve().then(function() {
        return shouldBeRejected(createImageBitmap(source, 0, 0, 10, 0), message + ' / invalid range');
    }).then(function() {
        return shouldBeRejected(createImageBitmap(source, 0, 0, 0, 10), message + ' / invalid range');
    });
}

function createCanvas() {
    return new Promise(function(resolve, reject) {
        var canvas = document.createElement('canvas');
        canvas.setAttribute('width', '200');
        canvas.setAttribute('height', '200');
        resolve(canvas);
    });
}

function createInvalidCanvas() {
    // Create a terapixel canvas to generate an invalid canvas through
    // allocation failure
    return new Promise(function(resolve, reject) {
        var canvas = document.createElement('canvas');
        canvas.setAttribute('width', '100000000');
        canvas.setAttribute('height', '100000000');
        resolve(canvas);
    });
}

function createVideo() {
    return new Promise(function(resolve, reject) {
        var video = document.createElement('video');
        video.addEventListener('canplaythrough', resolve.bind(undefined, video), false);
        video.src = '../../compositing/resources/video.ogv';
    });
}

function createImage() {
    return createCanvas().then(function(canvas) {
        var image = new Image();
        var promise = new Promise(function(resolve, reject) {
            image.onload = resolve.bind(undefined, image);
        });
        image.src = canvas.toDataURL();
        return promise;
    });
}

function createBlob(url) {
    return new Promise(function(resolve, reject) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url);
        xhr.responseType = 'blob';
        xhr.onload = function() {
            resolve(xhr.response);
        };
        xhr.onerror = reject;
        xhr.send();
    });
}

Promise.resolve().then(function() {
    return shouldBeRejected(createImageBitmap(undefined), 'undefined');
}).then(function() {
    return shouldBeRejected(createImageBitmap(null), 'null');
}).then(function() {
    return shouldBeRejected(createImageBitmap(new Image), 'empty image');
}).then(function() {
    return shouldBeRejected(createImageBitmap(document.createElement('video')), 'empty video');
}).then(function() {
    return createImage().then(function(image) {
        return checkInvalidRange(image, 'image');
    });
}).then(function() {
    return createVideo().then(function(video) {
        return checkInvalidRange(video, 'video');
    });
}).then(function() {
    return createCanvas().then(function(canvas) {
        return checkInvalidRange(canvas, 'canvas');
    });
}).then(function() {
    return createCanvas().then(function(canvas) {
        var imagedata = canvas.getContext('2d').getImageData(0, 0, canvas.width, canvas.height);
        return checkInvalidRange(imagedata, 'canvas imagedata')
    });
}).then(function() {
    return createImage().then(function(image) {
        return createImageBitmap(image);
    }).then(function(bitmap) {
        return checkInvalidRange(bitmap, 'image bitmap');
    });
}).then(function() {
    return createBlob('resources/pattern.png').then(function(blob) {
        return checkInvalidRange(blob, 'blob');
    });
}).then(function() {
    return createBlob('resources/shadow-offset.js').then(function(blob) {
        return shouldBeRejected(createImageBitmap(blob), 'invalid blob');
    });
}).then(function() {
    return createInvalidCanvas().then(function(invalidCanvas) {
        return shouldBeRejected(createImageBitmap(invalidCanvas), 'invalid canvas');
    });
}).catch(function(e) {
    testFailed('Unexpected rejection: ' + e);
}).then(finishJSTest, finishJSTest);

</script>
</body>
</html>