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