[dart:html] Add different bindings for FileSystem APIs

Closes https://github.com/dart-lang/sdk/issues/45036

The FileSystem API has different bindings for different browsers,
and the values are all taken directly from the MDN:
https://developer.mozilla.org/en-US/docs/Web/API/File_and_Directory_Entries_API
Along with this, some APIs that need to expose these bindings are modified to
expose all possible bindings.

Change-Id: I18ce6d1208349eb9d5bd9d802d17dda1ddae2dec
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/225323
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Reviewed-by: Riley Porter <rileyporter@google.com>
Commit-Queue: Srujan Gaddam <srujzs@google.com>
This commit is contained in:
Srujan Gaddam 2021-12-23 00:11:03 +00:00 committed by Commit Bot
parent 26aacf2156
commit 01642c2122
6 changed files with 85 additions and 15 deletions

View file

@ -9165,12 +9165,19 @@ class DataTransferItem extends JavaScriptObject {
Entry getAsEntry() {
Entry entry = _webkitGetAsEntry() as Entry;
if (entry.isFile!)
if (entry.isFile!) {
applyExtension('FileEntry', entry);
else if (entry.isDirectory!)
applyExtension('webkitFileSystemFileEntry', entry);
applyExtension('FileSystemFileEntry', entry);
} else if (entry.isDirectory!) {
applyExtension('DirectoryEntry', entry);
else
applyExtension('webkitFileSystemDirectoryEntry', entry);
applyExtension('FileSystemDirectoryEntry', entry);
} else {
applyExtension('Entry', entry);
applyExtension('webkitFileSystemEntry', entry);
applyExtension('FileSystemEntry', entry);
}
return entry;
}
@ -9597,7 +9604,8 @@ class DialogElement extends HtmlElement {
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
@Native("DirectoryEntry")
@Native(
"DirectoryEntry,webkitFileSystemDirectoryEntry,FileSystemDirectoryEntry")
class DirectoryEntry extends Entry {
/**
* Create a new directory with the specified `path`. If `exclusive` is true,
@ -9612,6 +9620,9 @@ class DirectoryEntry extends Entry {
DirectoryReader createReader() {
DirectoryReader reader = _createReader();
applyExtension('DirectoryReader', reader);
applyExtension('WebKitDirectoryReader', reader);
applyExtension('webkitFileSystemDirectoryReader', reader);
applyExtension('FileSystemDirectoryReader', reader);
return reader;
}
@ -9732,6 +9743,8 @@ class DirectoryEntry extends Entry {
var completer = new Completer<Entry>();
__getFile(path, options, (value) {
applyExtension('FileEntry', value);
applyExtension('webkitFileSystemFileEntry', value);
applyExtension('FileSystemFileEntry', value);
completer.complete(value);
}, (error) {
completer.completeError(error);
@ -9758,7 +9771,8 @@ class DirectoryEntry extends Entry {
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
@Native("DirectoryReader")
@Native(
"DirectoryReader,WebKitDirectoryReader,webkitFileSystemDirectoryReader,FileSystemDirectoryReader")
class DirectoryReader extends JavaScriptObject {
// To suppress missing implicit constructor warnings.
factory DirectoryReader._() {
@ -9774,10 +9788,18 @@ class DirectoryReader extends JavaScriptObject {
_readEntries((values) {
values.forEach((value) {
applyExtension('Entry', value);
applyExtension('webkitFileSystemEntry', value);
applyExtension('FileSystemEntry', value);
Entry entry = value as Entry;
if (entry.isFile!)
if (entry.isFile!) {
applyExtension('FileEntry', entry);
else if (entry.isDirectory!) applyExtension('DirectoryEntry', entry);
applyExtension('webkitFileSystemFileEntry', entry);
applyExtension('FileSystemFileEntry', entry);
} else if (entry.isDirectory!) {
applyExtension('DirectoryEntry', entry);
applyExtension('webkitFileSystemDirectoryEntry', entry);
applyExtension('FileSystemDirectoryEntry', entry);
}
});
completer.complete(new List<Entry>.from(values));
}, (error) {
@ -15334,7 +15356,7 @@ typedef void _EntriesCallback(List entries);
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
@Native("Entry")
@Native("Entry,webkitFileSystemEntry,FileSystemEntry")
class Entry extends JavaScriptObject {
// To suppress missing implicit constructor warnings.
factory Entry._() {
@ -15393,6 +15415,8 @@ class Entry extends JavaScriptObject {
var completer = new Completer<Entry>();
_getParent((value) {
applyExtension('Entry', value);
applyExtension('webkitFileSystemEntry', value);
applyExtension('FileSystemEntry', value);
completer.complete(value);
}, (error) {
completer.completeError(error);
@ -16093,7 +16117,7 @@ typedef void _FileCallback(File? file);
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
@Native("FileEntry")
@Native("FileEntry,webkitFileSystemFileEntry,FileSystemFileEntry")
class FileEntry extends Entry {
// To suppress missing implicit constructor warnings.
factory FileEntry._() {
@ -16312,7 +16336,7 @@ class FileReader extends EventTarget {
// BSD-style license that can be found in the LICENSE file.
@SupportedBrowser(SupportedBrowser.CHROME)
@Native("DOMFileSystem")
@Native("DOMFileSystem,WebKitFileSystem,webkitFileSystem,FileSystem")
class FileSystem extends JavaScriptObject {
// To suppress missing implicit constructor warnings.
factory FileSystem._() {
@ -33355,7 +33379,12 @@ class Window extends EventTarget
var completer = new Completer<FileSystem>();
__requestFileSystem(type, size, (value) {
applyExtension('DOMFileSystem', value);
applyExtension('WebKitFileSystem', value);
applyExtension('webkitFileSystem', value);
applyExtension('FileSystem', value);
applyExtension('DirectoryEntry', value.root);
applyExtension('webkitFileSystemDirectoryEntry', value.root);
applyExtension('FileSystemDirectoryEntry', value.root);
completer.complete(value);
}, (error) {
completer.completeError(error);

View file

@ -293,8 +293,23 @@ _dart2js_dom_custom_native_specs = monitored.Dict(
'CSSStyleDeclaration,MSStyleCSSProperties,CSS2Properties',
'ApplicationCache':
'ApplicationCache,DOMApplicationCache,OfflineResourceList',
'DirectoryEntry':
#Chrome Edge/Opera
'DirectoryEntry,webkitFileSystemDirectoryEntry,FileSystemDirectoryEntry',
'DirectoryReader':
#Chrome Edge Opera
'DirectoryReader,WebKitDirectoryReader,webkitFileSystemDirectoryReader,FileSystemDirectoryReader',
'DOMFileSystem':
#Chrome Edge Opera
'DOMFileSystem,WebKitFileSystem,webkitFileSystem,FileSystem',
'Entry':
#Chrome Edge
'Entry,webkitFileSystemEntry,FileSystemEntry',
'Event':
'Event,InputEvent,SubmitEvent', # Workaround for issue 40901.
'FileEntry':
#Chrome Edge
'FileEntry,webkitFileSystemFileEntry,FileSystemFileEntry',
'HTMLTableCellElement':
'HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement',
'GainNode':

View file

@ -268,6 +268,8 @@ ddc_extensions = monitored.Dict(
'getDirectory': [''],
'getFile': [
'applyExtension(\'FileEntry\', value);',
'applyExtension(\'webkitFileSystemFileEntry\', value);',
'applyExtension(\'FileSystemFileEntry\', value);',
]
},
'Entry': {
@ -276,6 +278,8 @@ ddc_extensions = monitored.Dict(
],
'getParent': [
'applyExtension(\'Entry\', value);',
'applyExtension(\'webkitFileSystemEntry\', value);',
'applyExtension(\'FileSystemEntry\', value);',
]
},
'FileEntry': {
@ -291,7 +295,12 @@ ddc_extensions = monitored.Dict(
'Window': {
'webkitRequestFileSystem': [
'applyExtension(\'DOMFileSystem\', value);',
'applyExtension(\'WebKitFileSystem\', value);',
'applyExtension(\'webkitFileSystem\', value);',
'applyExtension(\'FileSystem\', value);',
'applyExtension(\'DirectoryEntry\', value.root);',
'applyExtension(\'webkitFileSystemDirectoryEntry\', value.root);',
'applyExtension(\'FileSystemDirectoryEntry\', value.root);',
]
},
})

View file

@ -9,12 +9,19 @@ $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS
Entry getAsEntry() {
Entry entry = _webkitGetAsEntry() $#NULLSAFECAST(as Entry);
if (entry.isFile$NULLASSERT)
if (entry.isFile$NULLASSERT) {
applyExtension('FileEntry', entry);
else if (entry.isDirectory$NULLASSERT)
applyExtension('webkitFileSystemFileEntry', entry);
applyExtension('FileSystemFileEntry', entry);
} else if (entry.isDirectory$NULLASSERT) {
applyExtension('DirectoryEntry', entry);
else
applyExtension('webkitFileSystemDirectoryEntry', entry);
applyExtension('FileSystemDirectoryEntry', entry);
} else {
applyExtension('Entry', entry);
applyExtension('webkitFileSystemEntry', entry);
applyExtension('FileSystemEntry', entry);
}
return entry;
}

View file

@ -19,6 +19,9 @@ $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS
DirectoryReader createReader() {
DirectoryReader reader = _createReader();
applyExtension('DirectoryReader', reader);
applyExtension('WebKitDirectoryReader', reader);
applyExtension('webkitFileSystemDirectoryReader', reader);
applyExtension('FileSystemDirectoryReader', reader);
return reader;
}

View file

@ -12,11 +12,18 @@ $!MEMBERS
_readEntries((values) {
values.forEach((value) {
applyExtension('Entry', value);
applyExtension('webkitFileSystemEntry', value);
applyExtension('FileSystemEntry', value);
Entry entry = value as Entry;
if (entry.isFile$NULLASSERT)
if (entry.isFile$NULLASSERT) {
applyExtension('FileEntry', entry);
else if (entry.isDirectory$NULLASSERT)
applyExtension('webkitFileSystemFileEntry', entry);
applyExtension('FileSystemFileEntry', entry);
} else if (entry.isDirectory$NULLASSERT) {
applyExtension('DirectoryEntry', entry);
applyExtension('webkitFileSystemDirectoryEntry', entry);
applyExtension('FileSystemDirectoryEntry', entry);
}
});
completer.complete(new List<Entry>.from(values));
}, (error) {