Bug 926691 - OS.File API must preverse |bytes| options to .readTo() and .write(). r=yoric

This commit is contained in:
Nils Maier 2013-10-15 14:05:57 -04:00
parent f71f3a0379
commit eb1847005b
3 changed files with 53 additions and 4 deletions

View File

@ -377,8 +377,10 @@ File.prototype = {
readTo: function readTo(buffer, options = {}) {
// If |buffer| is a typed array and there is no |bytes| options, we
// need to extract the |byteLength| now, as it will be lost by
// communication
if (isTypedArray(buffer) && !("bytes" in options)) {
// communication.
// Options might be a nullish value, so better check for that before using
// the |in| operator.
if (isTypedArray(buffer) && !(options && "bytes" in options)) {
// Preserve reference to option |outExecutionDuration|, if it is passed.
options = clone(options, ["outExecutionDuration"]);
options.bytes = buffer.byteLength;
@ -414,8 +416,10 @@ File.prototype = {
write: function write(buffer, options = {}) {
// If |buffer| is a typed array and there is no |bytes| options,
// we need to extract the |byteLength| now, as it will be lost
// by communication
if (isTypedArray(buffer)) {
// by communication.
// Options might be a nullish value, so better check for that before using
// the |in| operator.
if (isTypedArray(buffer) && !(options && "bytes" in options)) {
// Preserve reference to option |outExecutionDuration|, if it is passed.
options = clone(options, ["outExecutionDuration"]);
options.bytes = buffer.byteLength;

View File

@ -0,0 +1,44 @@
"use strict";
Components.utils.import("resource://gre/modules/osfile.jsm");
Components.utils.import("resource://gre/modules/Task.jsm");
function run_test() {
do_test_pending();
run_next_test();
}
/**
* Test to ensure that {bytes:} in options to |readTo| and |write| are correctly
* preserved.
*/
add_task(function* test_bytes() {
let path = OS.Path.join(OS.Constants.Path.tmpDir,
"test_osfile_async_bytes.tmp");
let file = yield OS.File.open(path, {trunc: true, read: true, write: true});
try {
try {
// 1. Test write, by supplying {bytes:} options smaller than the actual
// buffer.
yield file.write(new Uint8Array(2048), {bytes: 1024});
do_check_eq((yield file.stat()).size, 1024);
// 2. Test same for |readTo|.
yield file.setPosition(0, OS.File.POS_START);
let read = yield file.readTo(new Uint8Array(1024), {bytes: 512});
do_check_eq(read, 512);
// 3. Test that passing nullish values for |options| still works.
yield file.setPosition(0, OS.File.POS_END);
yield file.write(new Uint8Array(1024), null);
yield file.write(new Uint8Array(1024), undefined);
do_check_eq((yield file.stat()).size, 3072);
} finally {
yield file.close();
}
} finally {
yield OS.File.remove(path);
}
});
add_task(do_test_finished);

View File

@ -5,6 +5,7 @@ tail =
[test_osfile_closed.js]
[test_path.js]
[test_osfile_async.js]
[test_osfile_async_bytes.js]
[test_profiledir.js]
[test_logging.js]
[test_creationDate.js]