DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (409f3966645a)

VCS Links

Line Code
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
<!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>
  <script type="text/javascript" src="gUM_support.js"></script>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1041393">ImageCapture tests</a>
<script type="application/javascript">

let repeat = 100;
let count;

// Check if the callback returns even no JS reference on it.
function gcTest(track) {
  return new Promise(function(resolve, reject) {
    count = 0;
    let i;
    let 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) {
    let 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;
    let i;
    for(i = 0; i < repeat; i++) {
      imageCapture.takePhoto();
    }
  });
}

// Check if the blob is decodable.
function blobTest(track) {
  return new Promise(function(resolve, reject) {
    let imageCapture = new ImageCapture(track);
    imageCapture.onphoto = function(blob) {
      let 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) {
    let 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();
  });
}

async function init() {
  // use loopback camera if available, otherwise fake, MediaStreamGraph will be the backend of ImageCapture.
  await setupGetUserMediaTestPrefs();
  let stream = await navigator.mediaDevices.getUserMedia({video: true});
  return stream.getVideoTracks()[0];
}

async function start() {
  try {
    let track = await init();
    info("ImageCapture track disable test.");
    track = await trackTest(track);
    info("ImageCapture blob test.");
    track = await blobTest(track);
    info("ImageCapture rapid takePhoto() test.");
    track = await rapidTest(track);
    info("ImageCapture multiple instances test.");
    await gcTest(track);
  } catch (e) {
    ok(false, "Unexpected error during test: " + e);
  } finally {
    SimpleTest.finish();
  }
}

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

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