Commit d633f1fd authored by Noel Gordon's avatar Noel Gordon Committed by Commit Bot

[piexwasm] Accept RAW image source data in a File

piex-wasm assumes a fileSystemURL input as the RAW image source. Allow
other users to input the RAW image source in a File.

Add readFile helper, and make fileSystemURL and File source inputs use
it to read the file.

fileSystemURL case has automated test coverage, so readFIle is tested,
so no change in files app behavior.

Bug: 1132695
Change-Id: Ic05c5b5a2178826445221448824f8ef41dc81ea7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2437084Reviewed-by: default avatarTrent Apted <tapted@chromium.org>
Commit-Queue: Trent Apted <tapted@chromium.org>
Auto-Submit: Noel Gordon <noel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#811898}
parent c6dd0522
...@@ -114,10 +114,9 @@ function PiexLoaderResponse(data) { ...@@ -114,10 +114,9 @@ function PiexLoaderResponse(data) {
* Returns the source data. * Returns the source data.
* *
* If the source is an ArrayBuffer, return it. Otherwise assume the source is * If the source is an ArrayBuffer, return it. Otherwise assume the source is
* is DOM file system URL: resolve the associated file system entry, and read * is a File or DOM fileSystemURL and return its content in an ArrayBuffer.
* and return its content in an ArrayBuffer.
* *
* @param {string|!ArrayBuffer} source * @param {!ArrayBuffer|!File|string} source
* @return {!Promise<!ArrayBuffer>} * @return {!Promise<!ArrayBuffer>}
*/ */
function readSourceData(source) { function readSourceData(source) {
...@@ -130,11 +129,11 @@ function readSourceData(source) { ...@@ -130,11 +129,11 @@ function readSourceData(source) {
* Reject the Promise on fileEntry URL resolve or file read failures. * Reject the Promise on fileEntry URL resolve or file read failures.
*/ */
function failure(error) { function failure(error) {
reject(new Error('Reading file system: ' + error)); reject(new Error('Reading file system: ' + (error.message || error)));
} }
/** /**
* Returns true if the fileEntry file size is within sensible limits. * Returns true if the file size is within sensible limits.
* @param {number} size - file size. * @param {number} size - file size.
* @return {boolean} * @return {boolean}
*/ */
...@@ -143,25 +142,39 @@ function readSourceData(source) { ...@@ -143,25 +142,39 @@ function readSourceData(source) {
} }
/** /**
* Reads the fileEntry's content into an ArrayBuffer: resolve Promise * Reads the file content to an ArrayBuffer. Resolve the Promise with
* with the ArrayBuffer result or reject the Promise on failure. * the ArrayBuffer result, or reject the Promise on failure.
* @param {!Entry} entry - file system entry of |url|. * @param {!File} file - file to read.
*/
function readFile(file) {
if (valid(file.size)) {
const reader = new FileReader();
reader.onerror = failure;
reader.onload = (_) => resolve(reader.result);
reader.readAsArrayBuffer(file);
} else {
failure('invalid file size: ' + file.size);
}
}
/**
* Resolve the fileEntry's file then read it with readFile, or reject
* the Promise on failure.
* @param {!Entry} entry - file system entry.
*/ */
function readEntry(entry) { function readEntry(entry) {
const fileEntry = /** @type {!FileEntry} */ (entry); const fileEntry = /** @type {!FileEntry} */ (entry);
fileEntry.file((file) => { fileEntry.file((file) => {
if (valid(file.size)) { readFile(file);
const reader = new FileReader();
reader.onerror = failure;
reader.onload = (_) => resolve(reader.result);
reader.readAsArrayBuffer(file);
} else {
failure('invalid file size: ' + file.size);
}
}, failure); }, failure);
} }
const url = /** @type {string} */ (source); if (source instanceof File) {
readFile(/** @type {!File} */ (source));
return;
}
const url = /** @type {string} fileSystemURL */ (source);
globalThis.webkitResolveLocalFileSystemURL(url, readEntry, failure); globalThis.webkitResolveLocalFileSystemURL(url, readEntry, failure);
}); });
} }
...@@ -481,7 +494,7 @@ function PiexLoader() {} ...@@ -481,7 +494,7 @@ function PiexLoader() {}
* to reload the page. Callback |onPiexModuleFailed| is used to indicate that * to reload the page. Callback |onPiexModuleFailed| is used to indicate that
* the caller should initiate failure recovery steps. * the caller should initiate failure recovery steps.
* *
* @param {string|!ArrayBuffer} source * @param {!ArrayBuffer|!File|string} source
* @param {!function()} onPiexModuleFailed * @param {!function()} onPiexModuleFailed
* @return {!Promise<!PiexLoaderResponse>} * @return {!Promise<!PiexLoaderResponse>}
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment