summaryrefslogtreecommitdiffstats
path: root/dom/media/test/test_imagecapture.html
blob: f6da9e231b951ddff0a21194d29c2a7f229ea430 (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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1041393
-->
<head>
  <meta charset="utf-8">
  <title>ImageCapture tests</title>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1041393">ImageCapture tests</a>
<script type="application/javascript">

var repeat = 100;
var count;

// Check if the callback returns even no JS reference on it.
function gcTest(track) {
  return new Promise(function(resolve, reject) {
    count = 0;
    var i;
    var imageCapture;
    for(i = 0; i < repeat; i++) {
      imageCapture = new ImageCapture(track);
      imageCapture.onphoto = function(blob) {
        count++;
        if (count == repeat) {
          ok(true, "pass gc testing");
          resolve(track);
        }
      };
      imageCapture.onerror = function(error) {
        ok(false, "takePhoto failure in gc testing");
        reject();
      };

      imageCapture.takePhoto();
    }
    info("Call gc ");
    SpecialPowers.gc();
  });
}

// Continue calling takePhoto() in rapid succession.
function rapidTest(track) {
  return new Promise(function(resolve, reject) {
    var imageCapture = new ImageCapture(track);
    imageCapture.onphoto = function(blob) {
      count++;
      if (count == repeat) {
        ok(true, "pass raipd takePhoto() testing");
        resolve(track);
      }
    };
    imageCapture.onerror = function(error) {
      ok(false, "takePhoto() failure in rapid testing");
      reject();
    };

    count = 0;
    var i;
    for(i = 0; i < repeat; i++) {
      imageCapture.takePhoto();
    }
  });
}

// Check if the blob is decodable.
function blobTest(track) {
  return new Promise(function(resolve, reject) {
    var imageCapture = new ImageCapture(track);
    imageCapture.onphoto = function(blob) {
      var img = new Image();
      img.onerror = function() {
        ok(false, "fail to decode blob");
        reject();
      }
      img.onload = function() {
        ok(true, "decode blob success");
        resolve(track);
      }
      img.src = URL.createObjectURL(blob.data);
    };
    imageCapture.onerror = function(error) {
      ok(false, "fail to capture image");
    };

    imageCapture.takePhoto();
  });
}

// It should return an error event after disabling video track.
function trackTest(track) {
  return new Promise(function(resolve, reject) {
    var imageCapture = new ImageCapture(track);
    imageCapture.onphoto = function(blob) {
      ok(false, "expect error when video track is disable");
      reject();
    };
    imageCapture.onerror = function(error) {
      ok(error.imageCaptureError.code == error.imageCaptureError.PHOTO_ERROR, "error code is PHOTO_ERROR")
      track.enabled = true;
      resolve(track);
    };

    track.enabled = false;
    imageCapture.takePhoto()
  });
}

function init() {
  return new Promise(function(resolve, reject) {
    // use fake camera, MediaStreamGraph will be the backend of ImageCapture.
    var constraints = {video: true, fake: true}

    window.navigator.mozGetUserMedia(
      constraints,
      function(stream) {
        var track = stream.getVideoTracks()[0];
        resolve(track);
      },
      function(err) {
        reject(err);
      }
    );
  });
}

function start() {
  init().then(function(track) {
    info("ImageCapture track disable test.");
    return trackTest(track);
  }).then(function(track) {
    info("ImageCapture blob test.");
    return blobTest(track);
  }).then(function(track) {
    info("ImageCapture rapid takePhoto() test.");
    return rapidTest(track);
  }).then(function(track) {
    info("ImageCapture multiple instances test.");
    return gcTest(track);
  }).then(SimpleTest.finish);
}

SimpleTest.requestCompleteLog();
SimpleTest.waitForExplicitFinish();

SpecialPowers.pushPrefEnv({"set": [["dom.imagecapture.enabled", true],
                                  ["media.navigator.permission.disabled", true]
                                  ]}, start);
</script>
</pre>
</body>
</html>