dom/workers/test/test_fileReaderSync.xul

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 <?xml version="1.0"?>
     2 <?xml-stylesheet type="text/css" href="chrome://global/skin"?>
     3 <?xml-stylesheet type="text/css" href="/tests/SimpleTest/test.css"?>
     4 <!--
     5 https://bugzilla.mozilla.org/show_bug.cgi?id=664783
     6 -->
     7 <window title="Mozilla Bug 664783"
     8         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
     9   <script type="application/javascript"
    10           src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
    11   <script type="application/javascript" src="dom_worker_helper.js"/>
    13   <!-- test results are displayed in the html:body -->
    14   <body xmlns="http://www.w3.org/1999/xhtml">
    15   <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=664783"
    16      target="_blank">Mozilla Bug 664783</a>
    18   <div id="content" style="display: none">
    19     <input id="fileList" type="file"></input>
    20   </div>
    22   </body>
    24   <!-- test code goes here -->
    25   <script type="application/javascript">
    26   <![CDATA[
    28   /** Test for Bug 664783 **/
    30   var fileNum = 0;
    32   /**
    33    * Create a file which contains the given data and optionally adds the specified file extension.
    34    */
    35   function createFileWithData(fileData, /** optional */ extension) {
    36     var testFile = Components.classes["@mozilla.org/file/directory_service;1"]
    37                        .getService(Components.interfaces.nsIProperties)
    38                        .get("ProfD", Components.interfaces.nsIFile);
    39     var fileExtension = (extension == undefined) ? "" : "." + extension;
    40     testFile.append("workerFileReaderSync" + fileNum++ + fileExtension);
    42     var outStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
    43                         .createInstance(Components.interfaces.nsIFileOutputStream);
    44     outStream.init(testFile, 0x02 | 0x08 | 0x20, // write, create, truncate
    45                    0666, 0);
    46     outStream.write(fileData, fileData.length);
    47     outStream.close();
    49     var fileList = document.getElementById('fileList');
    50     fileList.value = testFile.path;
    52     return fileList.files[0];
    53   }
    55   function convertToUTF16(s) {
    56     res = "";
    57     for (var i = 0; i < s.length; ++i) {
    58       c = s.charCodeAt(i);
    59       res += String.fromCharCode(c & 255, c >>> 8);
    60     }
    61     return res;
    62   }
    64   /**
    65    * Converts the given string to a data URL of the specified mime type.
    66    */
    67   function convertToDataURL(mime, s) {
    68     return "data:" + mime + ";base64," + btoa(s);
    69   }
    71   /**
    72    * Create a worker to read a file containing fileData using FileReaderSync and
    73    * checks the return type against the expected type. Optionally set an encoding
    74    * for reading the file as text.
    75    */
    76   function readFileData(fileData, expectedText, /** optional */ encoding) {
    77     var worker = new Worker("fileReaderSync_worker.js");
    79     worker.onmessage = function(event) {
    80       is(event.data.text, expectedText, "readAsText in worker returned incorrect result.");
    81       is(event.data.bin, fileData, "readAsBinaryString in worker returned incorrect result.");
    82       is(event.data.url, convertToDataURL("application/octet-stream", fileData), "readAsDataURL in worker returned incorrect result.");
    83       is(event.data.arrayBuffer.byteLength, fileData.length, "readAsArrayBuffer returned buffer of incorrect length.");
    84       finish();
    85     };
    87     worker.onerror = function(event) {
    88       ok(false, "Worker had an error: " + event.data);
    89       finish();
    90     };
    92     var params = {file: createFileWithData(fileData), encoding: encoding};
    94     worker.postMessage(params);
    96     waitForWorkerFinish();
    97   }
    99   /**
   100    * Create a worker which reuses a FileReaderSync to read multiple files as DataURLs.
   101    */
   102   function reuseReaderForURL(files, expected) {
   103     var worker = new Worker("fileReaderSync_worker.js");
   105     worker.onerror = function(event) {
   106       ok(false, "Worker had an error: " + event.data);
   107       finish();
   108     };
   110     var k = 0;
   111     worker.onmessage = function(event) {
   112       is(event.data.url, expected[k], "readAsDataURL in worker returned incorrect result when reusing FileReaderSync.");
   113       k++;
   114       finish();
   115     };
   117     for (var i = 0; i < files.length; ++i) {
   118       var params = {file: files[i], encoding: undefined};
   119       worker.postMessage(params);
   120       waitForWorkerFinish();
   121     }
   122   }
   124   /**
   125    * Create a worker which reuses a FileReaderSync to read multiple files as text.
   126    */
   127   function reuseReaderForText(fileData, expected) {
   128     var worker = new Worker("fileReaderSync_worker.js");
   130     worker.onerror = function(event) {
   131       ok(false, "Worker had an error: " + event.data);
   132       finish();
   133     };
   135     var k = 0;
   136     worker.onmessage = function(event) {
   137       is(event.data.text, expected[k++], "readAsText in worker returned incorrect result when reusing FileReaderSync.");
   138       finish();
   139     };
   141     for (var i = 0; i < fileData.length; ++i) {
   142       var params = {file: createFileWithData(fileData[i]), encoding: undefined};
   143       worker.postMessage(params);
   144       waitForWorkerFinish();
   145     }
   146   }
   149   /**
   150    * Creates a a worker which reads a file containing fileData as an ArrayBuffer.
   151    * Verifies that the ArrayBuffer when interpreted as a string matches the original data.
   152    */
   153   function readArrayBuffer(fileData) {
   154     var worker = new Worker("fileReaderSync_worker.js");
   156     worker.onmessage = function(event) {
   157       var view = new Uint8Array(event.data.arrayBuffer);
   158       is(event.data.arrayBuffer.byteLength, fileData.length, "readAsArrayBuffer returned buffer of incorrect length.");
   159       is(String.fromCharCode.apply(String, view), fileData, "readAsArrayBuffer returned buffer containing incorrect data.");
   160       finish();
   161     };
   163     worker.onerror = function(event) {
   164       ok(false, "Worker had an error: " + event.data);
   165       finish();
   166     };
   168     var params = {file: createFileWithData(fileData), encoding: undefined};
   170     worker.postMessage(params);
   172     waitForWorkerFinish();
   173   }
   175   // Empty file.
   176   readFileData("", "");
   178   // Typical use case.
   179   readFileData("text", "text");
   181   // Test reading UTF-16 characters.
   182   readFileData(convertToUTF16("text"), "text", "UTF-16");
   184   // First read a file of type "text/plain", then read a file of type "application/octet-stream".
   185   reuseReaderForURL([createFileWithData("text", "txt"), createFileWithData("text")],
   186                     [convertToDataURL("text/plain", "text"),
   187                      convertToDataURL("application/octet-stream", "text")]);
   189   // First read UTF-16 characters marked using BOM, then read UTF-8 characters.
   190   reuseReaderForText([convertToUTF16("\ufefftext"), "text"],
   191                      ["text", "text"]);
   193   // Reading data as ArrayBuffer.
   194   readArrayBuffer("");
   195   readArrayBuffer("text");
   197   ]]>
   198   </script>
   199 </window>

mercurial