Commit ae4cf7c1 authored by Trent Apted's avatar Trent Apted Committed by Commit Bot

Switch chrome://media-app to the new createWritable() API method.

The `Save` operation in chrome://media-app started failing after
r749464. Console errors like `createWriter` is undefined.

r749464 tore out the old API and replaced it with a new one.
Unfortunately, this only changed IDL files, and not the externs file
that JS needs to compile against.

This change updates the externs file to match the IDL file, making the
regression detectable at compile time.

Filed b/151394309 to investigate ways to detect when the externs file
does not match the idl files and complain about it.

The externs file is verbatim from cl/300232012.

Bug: 1061813
Change-Id: I2de55447b640aec3338640db75a323a877beffde
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2103011Reviewed-by: default avatarBugs Nash <bugsnash@chromium.org>
Commit-Queue: Trent Apted <tapted@chromium.org>
Cr-Commit-Position: refs/heads/master@{#750852}
parent a1ac6ead
......@@ -45,8 +45,8 @@ guestMessagePipe.registerHandler(Message.OVERWRITE_FILE, async (message) => {
if (!currentlyWritableFileHandle || overwrite.token != fileToken) {
throw new Error('File not current.');
}
const writer = await currentlyWritableFileHandle.createWriter();
await writer.write(0, overwrite.blob);
const writer = await currentlyWritableFileHandle.createWritable();
await writer.write(overwrite.blob);
await writer.truncate(overwrite.blob.size);
await writer.close();
});
......
......@@ -13,22 +13,58 @@ class FileSystemWriter {
/**
* @param {number} position
* @param {BufferSource|Blob|string} data
* @return {Promise<undefined>}
* @return {!Promise<undefined>}
*/
async write(position, data) {}
/**
* @param {number} size
* @return {Promise<undefined>}
* @return {!Promise<undefined>}
*/
async truncate(size) {}
/**
* @return {Promise<undefined>}
* @return {!Promise<undefined>}
*/
async close() {}
}
/**
* @typedef {{
* type: string,
* size: (number|undefined),
* position: (number|undefined),
* data: (BufferSource|Blob|string|undefined)
* }}
*/
var WriteParams;
/** @interface */
class FileSystemWritableFileStream {
/**
* @param {BufferSource|Blob|string|WriteParams} data
* @return {!Promise<undefined>}
*/
async write(data) {}
/**
* @param {number} size
* @return {!Promise<undefined>}
*/
async truncate(size) {}
/**
* @return {!Promise<undefined>}
*/
async close() {}
/**
* @param {number} offset
* @return {!Promise<undefined>}
*/
async seek(offset) {}
}
/** @typedef {{writable: boolean}} */
var FileSystemHandlePermissionDescriptor;
......@@ -47,13 +83,13 @@ class FileSystemHandle {
/**
* @param {FileSystemHandlePermissionDescriptor} descriptor
* @return {Promise<PermissionState>}
* @return {!Promise<PermissionState>}
*/
queryPermission(descriptor) {}
/**
* @param {FileSystemHandlePermissionDescriptor} descriptor
* @return {Promise<PermissionState>}
* @return {!Promise<PermissionState>}
*/
requestPermission(descriptor) {}
}
......@@ -64,12 +100,19 @@ var FileSystemCreateWriterOptions;
/** @interface */
class FileSystemFileHandle extends FileSystemHandle {
/**
* @deprecated TODO(b/151564533): Remove when m82 is stable.
* @param {FileSystemCreateWriterOptions=} options
* @return {Promise<!FileSystemWriter>}
* @return {!Promise<!FileSystemWriter>}
*/
createWriter(options) {}
/** @return {Promise<!File>} */
/**
* @param {FileSystemCreateWriterOptions=} options
* @return {!Promise<!FileSystemWritableFileStream>}
*/
createWritable(options) {}
/** @return {!Promise<!File>} */
getFile() {}
}
......@@ -121,10 +164,10 @@ class FileSystemDirectoryHandle extends FileSystemHandle {
/** @interface */
class LaunchParams {
constructor() {
/** @type{Array<FileSystemHandle>} */
/** @type {Array<FileSystemHandle>} */
this.files;
/** @type{Request} */
/** @type {Request} */
this.request;
}
}
......@@ -134,15 +177,15 @@ var LaunchConsumer;
/** @interface */
class LaunchQueue {
/** @param{LaunchConsumer} consumer */
/** @param {LaunchConsumer} consumer */
setConsumer(consumer) {}
}
/**
* @typedef {{
* description: (string|undefined),
* mimeTypes: (Array<string>|undefined),
* extensions: (Array<string>|undefined)
* mimeTypes: (!Array<string>|undefined),
* extensions: (!Array<string>|undefined)
* }}
*/
var ChooseFileSystemEntriesOptionsAccepts;
......@@ -151,17 +194,17 @@ var ChooseFileSystemEntriesOptionsAccepts;
* @typedef {{
* type: (string|undefined),
* multiple: (boolean|undefined),
* accepts: (Array<ChooseFileSystemEntriesOptionsAccepts>|undefined),
* accepts: (!Array<!ChooseFileSystemEntriesOptionsAccepts>|undefined),
* excludeAcceptAllOption: (boolean|undefined)
* }}
*/
var chooseFileSystemEntriesOptions;
/**
* @param {(chooseFileSystemEntriesOptions|undefined)} options
* @return {Promise<(FileSystemHandle|Array<FileSystemHandle>)>}
* @param {(!chooseFileSystemEntriesOptions|undefined)} options
* @return {!Promise<(!FileSystemHandle|!Array<!FileSystemHandle>)>}
*/
window.chooseFileSystemEntries = function(options) {};
window.chooseFileSystemEntries;
/** @type {LaunchQueue} */
window.launchQueue;
......@@ -25,8 +25,8 @@ class GuestDriver {
}
}
/** @implements FileSystemWriter */
class FakeFileWriter {
/** @implements FileSystemWritableFileStream */
class FakeWritableFileStream {
constructor(/** !Blob= */ data = new Blob()) {
this.data = data;
......@@ -38,7 +38,8 @@ class FakeFileWriter {
});
}
/** @override */
async write(position, data) {
async write(data) {
const position = 0; // Assume no seeks.
this.data = new Blob([
this.data.slice(0, position),
data,
......@@ -53,6 +54,10 @@ class FakeFileWriter {
async close() {
this.resolveClose(this.data);
}
/** @override */
async seek(offset) {
throw new Error('seek() not implemented.')
}
}
/** @implements FileSystemFileHandle */
......@@ -62,8 +67,8 @@ class FakeFileSystemFileHandle {
this.isDirectory = false;
this.name = 'fakefile';
/** @type{?FakeFileWriter} */
this.lastWriter;
/** @type{?FakeWritableFileStream} */
this.lastWritable;
}
/** @override */
......@@ -72,12 +77,16 @@ class FakeFileSystemFileHandle {
requestPermission(descriptor) {}
/** @override */
createWriter(options) {
this.lastWriter = new FakeFileWriter();
return Promise.resolve(this.lastWriter);
throw new Error('createWriter() deprecated.')
}
/** @override */
createWritable(options) {
this.lastWritable = new FakeWritableFileStream();
return Promise.resolve(this.lastWritable);
}
/** @override */
getFile() {
console.error('getFile() not implemented');
return null;
return Promise.resolve(new File([], 'fake-file'));
}
}
......@@ -182,11 +182,11 @@ TEST_F('MediaAppUIBrowserTest', 'OverwriteOriginalIPC', async () => {
loadFile(await createTestImageFile(), handle);
// Write should not be called initially.
assertEquals(undefined, handle.lastWriter);
assertEquals(undefined, handle.lastWritable);
const message = {overwriteLastFile: 'Foo'};
const testResponse = await guestMessagePipe.sendMessage('test', message);
const writeResult = await handle.lastWriter.closePromise;
const writeResult = await handle.lastWritable.closePromise;
assertEquals(testResponse.testQueryResult, 'overwriteOriginal resolved');
assertEquals(await writeResult.text(), 'Foo');
......
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