From 01642c21229cfa97612a974bf93c22930c00e4f4 Mon Sep 17 00:00:00 2001 From: Srujan Gaddam Date: Thu, 23 Dec 2021 00:11:03 +0000 Subject: [PATCH] [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 Reviewed-by: Riley Porter Commit-Queue: Srujan Gaddam --- sdk/lib/html/dart2js/html_dart2js.dart | 49 +++++++++++++++---- tools/dom/scripts/generator.py | 15 ++++++ tools/dom/scripts/htmlrenamer.py | 9 ++++ .../impl/impl_DataTransferItem.darttemplate | 13 +++-- .../impl/impl_DirectoryEntry.darttemplate | 3 ++ .../impl/impl_DirectoryReader.darttemplate | 11 ++++- 6 files changed, 85 insertions(+), 15 deletions(-) diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart index c6280c1cef4..182872b2d6d 100644 --- a/sdk/lib/html/dart2js/html_dart2js.dart +++ b/sdk/lib/html/dart2js/html_dart2js.dart @@ -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(); __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.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(); _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(); __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); diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py index bcc36f365fd..6ac22ce9283 100644 --- a/tools/dom/scripts/generator.py +++ b/tools/dom/scripts/generator.py @@ -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': diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py index 7e84e7c31ed..30fa1af4dbf 100644 --- a/tools/dom/scripts/htmlrenamer.py +++ b/tools/dom/scripts/htmlrenamer.py @@ -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);', ] }, }) diff --git a/tools/dom/templates/html/impl/impl_DataTransferItem.darttemplate b/tools/dom/templates/html/impl/impl_DataTransferItem.darttemplate index ca64994501a..42e643d44da 100644 --- a/tools/dom/templates/html/impl/impl_DataTransferItem.darttemplate +++ b/tools/dom/templates/html/impl/impl_DataTransferItem.darttemplate @@ -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; } diff --git a/tools/dom/templates/html/impl/impl_DirectoryEntry.darttemplate b/tools/dom/templates/html/impl/impl_DirectoryEntry.darttemplate index 98cced422f5..1e31f904625 100644 --- a/tools/dom/templates/html/impl/impl_DirectoryEntry.darttemplate +++ b/tools/dom/templates/html/impl/impl_DirectoryEntry.darttemplate @@ -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; } diff --git a/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate b/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate index b643159eca1..ab4f199fda5 100644 --- a/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate +++ b/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate @@ -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.from(values)); }, (error) {