Skip to content

Commit 7221c4e

Browse files
committed
FileListCreator should only be used for resolving directories
https://bugs.webkit.org/show_bug.cgi?id=213259 <rdar://problem/64375709> Reviewed by David Kilzer. Depending on whether directories should be resolved, FileListCreator::create would either synchronously execute its completion handler then return nullptr or asynchronously dispatch its completion handler then return a non-null RefPtr. Interfaces with sometimes-synchronous callbacks can be hard to use correctly; e.g., r262962 fixes a problem where FileInputType::m_fileListCreator was being modified in an unexpected order. This patch makes the interface between FileInputType and FileListCreator less error-prone and more explicit by renaming FileListCreator to DirectoryFileListCreator, making its job solely to create directory FileLists on a background queue, and giving it an explicit start member function. For non-directories, FileInputType::filesChosen now bypasses DirectoryFileListCreator and directly converts from Vector<FileChooserFileInfo> to FileList. Covered by existing tests. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * html/DirectoryFileListCreator.cpp: Renamed from html/FileListCreator.cpp. (WebCore::createFileList): Removed the template and ShouldResolveDirectories parameter. (WebCore::DirectoryFileListCreator::DirectoryFileListCreator): Moved the work queue dispatching to DirectoryFileListCreator::start. (WebCore::DirectoryFileListCreator::start): Added; moved the work queue dispatching here from the ctor. * html/DirectoryFileListCreator.h: Renamed from html/FileListCreator.h. (WebCore::DirectoryFileListCreator::create): Stopped performing non-directory creation and changed the return value back to Ref<>. * html/FileInputType.cpp: (WebCore::FileInputType::filesChosen): Moved most of the work done in the FileListCreator completion handler to didCreateFileList. When !FileInputType::allowsDirectories, used Vector::map to convert paths to a Vector<Ref<File>>, used that to create a FileList, then called didCreateFileList. Otherwise, created and started a DirectoryFileListCreator that calls didCreateFileList in its completion handler. (WebCore::FileInputType::didCreateFileList): Added; sets the new file list and icon and clears m_directoryFileListCreator. * html/FileInputType.h: Canonical link: https://commits.webkit.org/226061@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@263129 268f45cc-cd09-0410-ab3c-d52691b4dbfc
1 parent 059b7f1 commit 7221c4e

7 files changed

Lines changed: 105 additions & 46 deletions

File tree

Source/WebCore/ChangeLog

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,50 @@
1+
2020-06-16 Andy Estes <aestes@apple.com>
2+
3+
FileListCreator should only be used for resolving directories
4+
https://bugs.webkit.org/show_bug.cgi?id=213259
5+
<rdar://problem/64375709>
6+
7+
Reviewed by David Kilzer.
8+
9+
Depending on whether directories should be resolved, FileListCreator::create would either
10+
synchronously execute its completion handler then return nullptr or asynchronously dispatch
11+
its completion handler then return a non-null RefPtr. Interfaces with sometimes-synchronous
12+
callbacks can be hard to use correctly; e.g., r262962 fixes a problem where
13+
FileInputType::m_fileListCreator was being modified in an unexpected order.
14+
15+
This patch makes the interface between FileInputType and FileListCreator less error-prone
16+
and more explicit by renaming FileListCreator to DirectoryFileListCreator, making its job
17+
solely to create directory FileLists on a background queue, and giving it an explicit start
18+
member function. For non-directories, FileInputType::filesChosen now bypasses
19+
DirectoryFileListCreator and directly converts from Vector<FileChooserFileInfo> to FileList.
20+
21+
Covered by existing tests.
22+
23+
* Sources.txt:
24+
* WebCore.xcodeproj/project.pbxproj:
25+
26+
* html/DirectoryFileListCreator.cpp: Renamed from html/FileListCreator.cpp.
27+
(WebCore::createFileList): Removed the template and ShouldResolveDirectories parameter.
28+
(WebCore::DirectoryFileListCreator::DirectoryFileListCreator): Moved the work queue
29+
dispatching to DirectoryFileListCreator::start.
30+
(WebCore::DirectoryFileListCreator::start): Added; moved the work queue dispatching here
31+
from the ctor.
32+
33+
* html/DirectoryFileListCreator.h: Renamed from html/FileListCreator.h.
34+
(WebCore::DirectoryFileListCreator::create): Stopped performing non-directory creation and
35+
changed the return value back to Ref<>.
36+
37+
* html/FileInputType.cpp:
38+
(WebCore::FileInputType::filesChosen): Moved most of the work done in the FileListCreator
39+
completion handler to didCreateFileList. When !FileInputType::allowsDirectories, used
40+
Vector::map to convert paths to a Vector<Ref<File>>, used that to create a FileList, then
41+
called didCreateFileList. Otherwise, created and started a DirectoryFileListCreator that
42+
calls didCreateFileList in its completion handler.
43+
(WebCore::FileInputType::didCreateFileList): Added; sets the new file list and icon and
44+
clears m_directoryFileListCreator.
45+
46+
* html/FileInputType.h:
47+
148
2020-06-16 Dean Jackson <dino@apple.com>
249

350
REGRESSION (r262643): DumpRenderTree at com.apple.WebCore: WebCore::Document::prepareCanvasesForDisplayIfNeeded

Source/WebCore/Sources.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1134,10 +1134,10 @@ html/DOMURL.cpp
11341134
html/DateInputType.cpp
11351135
html/DateTimeInputType.cpp
11361136
html/DateTimeLocalInputType.cpp
1137+
html/DirectoryFileListCreator.cpp
11371138
html/EmailInputType.cpp
11381139
html/EnterKeyHint.cpp
11391140
html/FTPDirectoryDocument.cpp
1140-
html/FileListCreator.cpp
11411141
html/FeaturePolicy.cpp
11421142
html/FileInputType.cpp
11431143
html/FormAssociatedElement.cpp

Source/WebCore/WebCore.xcodeproj/project.pbxproj

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2431,7 +2431,7 @@
24312431
8358CB701C53277500E0C2D8 /* JSXMLDocument.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F570AD1C53268E007FD6CB /* JSXMLDocument.h */; };
24322432
835D2D781F5F1FBD00141DED /* HTMLInputElementEntriesAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 835D2D751F5F1FB800141DED /* HTMLInputElementEntriesAPI.h */; };
24332433
835D363719FF6193004C93AB /* StyleBuilderCustom.h in Headers */ = {isa = PBXBuildFile; fileRef = 835D363619FF6193004C93AB /* StyleBuilderCustom.h */; };
2434-
835D54C51F4DE53800E60671 /* FileListCreator.h in Headers */ = {isa = PBXBuildFile; fileRef = 835D54C21F4DE53400E60671 /* FileListCreator.h */; };
2434+
835D54C51F4DE53800E60671 /* DirectoryFileListCreator.h in Headers */ = {isa = PBXBuildFile; fileRef = 835D54C21F4DE53400E60671 /* DirectoryFileListCreator.h */; };
24352435
8362E8C120CEF9CB00245886 /* ShouldTreatAsContinuingLoad.h in Headers */ = {isa = PBXBuildFile; fileRef = 8362E8BF20CEF9CB00245886 /* ShouldTreatAsContinuingLoad.h */; settings = {ATTRIBUTES = (Private, ); }; };
24362436
836589DE1F54A76900DC31F4 /* JSFileSystemDirectoryReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 836589D91F54A76200DC31F4 /* JSFileSystemDirectoryReader.h */; };
24372437
836589E01F54A76E00DC31F4 /* JSFileSystemEntriesCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 836589D81F54A76200DC31F4 /* JSFileSystemEntriesCallback.h */; };
@@ -10358,8 +10358,8 @@
1035810358
835D2D751F5F1FB800141DED /* HTMLInputElementEntriesAPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLInputElementEntriesAPI.h; sourceTree = "<group>"; };
1035910359
835D2D761F5F1FB800141DED /* HTMLInputElementEntriesAPI.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLInputElementEntriesAPI.cpp; sourceTree = "<group>"; };
1036010360
835D363619FF6193004C93AB /* StyleBuilderCustom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StyleBuilderCustom.h; sourceTree = "<group>"; };
10361-
835D54C11F4DE53400E60671 /* FileListCreator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileListCreator.cpp; sourceTree = "<group>"; };
10362-
835D54C21F4DE53400E60671 /* FileListCreator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileListCreator.h; sourceTree = "<group>"; };
10361+
835D54C11F4DE53400E60671 /* DirectoryFileListCreator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DirectoryFileListCreator.cpp; sourceTree = "<group>"; };
10362+
835D54C21F4DE53400E60671 /* DirectoryFileListCreator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectoryFileListCreator.h; sourceTree = "<group>"; };
1036310363
835F8B261D2D90BA00E408EC /* Slotable.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Slotable.idl; sourceTree = "<group>"; };
1036410364
8362E8BF20CEF9CB00245886 /* ShouldTreatAsContinuingLoad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShouldTreatAsContinuingLoad.h; sourceTree = "<group>"; };
1036510365
836589D81F54A76200DC31F4 /* JSFileSystemEntriesCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSFileSystemEntriesCallback.h; sourceTree = "<group>"; };
@@ -22257,6 +22257,8 @@
2225722257
F55B3D841251F12D003EF269 /* DateTimeInputType.h */,
2225822258
F55B3D851251F12D003EF269 /* DateTimeLocalInputType.cpp */,
2225922259
F55B3D861251F12D003EF269 /* DateTimeLocalInputType.h */,
22260+
835D54C11F4DE53400E60671 /* DirectoryFileListCreator.cpp */,
22261+
835D54C21F4DE53400E60671 /* DirectoryFileListCreator.h */,
2226022262
2ED609BA1145B07100C8684E /* DOMFormData.cpp */,
2226122263
2ED609BB1145B07100C8684E /* DOMFormData.h */,
2226222264
2E0888C3114883A900AF4265 /* DOMFormData.idl */,
@@ -22274,8 +22276,6 @@
2227422276
41A0829922932EF4008426E0 /* FeaturePolicy.h */,
2227522277
F55B3D891251F12D003EF269 /* FileInputType.cpp */,
2227622278
F55B3D8A1251F12D003EF269 /* FileInputType.h */,
22277-
835D54C11F4DE53400E60671 /* FileListCreator.cpp */,
22278-
835D54C21F4DE53400E60671 /* FileListCreator.h */,
2227922279
4A0DA2FC129B241900AB61E1 /* FormAssociatedElement.cpp */,
2228022280
4A0DA2FD129B241900AB61E1 /* FormAssociatedElement.h */,
2228122281
F50664F5157F52DC00AC226F /* FormController.cpp */,
@@ -29992,6 +29992,7 @@
2999229992
EDE3A5000C7A430600956A37 /* ColorMac.h in Headers */,
2999329993
7CAC6AE9247F082F00E61D59 /* ColorMatrix.h in Headers */,
2999429994
9382DF5810A8D5C900925652 /* ColorSpace.h in Headers */,
29995+
7C029C6E2493C8F800268204 /* ColorTypes.h in Headers */,
2999529996
0FEAF66B23BFC39E004030DA /* ColorUtilities.h in Headers */,
2999629997
BCDD454E1236C95C009A7985 /* ColumnInfo.h in Headers */,
2999729998
43EDD67F1B485DBF00640E75 /* CombinedFiltersAlphabet.h in Headers */,
@@ -30356,6 +30357,7 @@
3035630357
937FF3D51A1012D6008EBA31 /* DictionaryLookup.h in Headers */,
3035730358
2D5646B01B8F8493003C4994 /* DictionaryPopupInfo.h in Headers */,
3035830359
FDAF19991513D131008DB0C3 /* DirectConvolver.h in Headers */,
30360+
835D54C51F4DE53800E60671 /* DirectoryFileListCreator.h in Headers */,
3035930361
F47A09D120A93A9700240FAE /* DisabledAdaptations.h in Headers */,
3036030362
7EDAAFC919A2CCDC0034DFD1 /* DiskCacheMonitorCocoa.h in Headers */,
3036130363
1199FA5B208E3C7F002358CC /* DisplayBox.h in Headers */,
@@ -30588,7 +30590,6 @@
3058830590
1A88A90517553CD7000C74F9 /* FileIconLoader.h in Headers */,
3058930591
F55B3DBE1251F12D003EF269 /* FileInputType.h in Headers */,
3059030592
976D6C86122B8A3D001FD1F7 /* FileList.h in Headers */,
30591-
835D54C51F4DE53800E60671 /* FileListCreator.h in Headers */,
3059230593
7A09CEF11F02069B00E93BDB /* FileMonitor.h in Headers */,
3059330594
976D6C89122B8A3D001FD1F7 /* FileReader.h in Headers */,
3059430595
2E75841E12779ADA0062628B /* FileReaderLoader.h in Headers */,
@@ -33110,7 +33111,6 @@
3311033111
FE36FD1816C7826500F887C1 /* SQLTransactionState.h in Headers */,
3311133112
FE36FD1716C7826500F887C1 /* SQLTransactionStateMachine.h in Headers */,
3311233113
1A2E6E5A0CC55213004A2062 /* SQLValue.h in Headers */,
33113-
7C029C6E2493C8F800268204 /* ColorTypes.h in Headers */,
3311433114
93F1996308245E59001E9ABC /* SSLKeyGenerator.h in Headers */,
3311533115
26B999911803B3C900D01121 /* StackAllocator.h in Headers */,
3311633116
BC7FA62D0D1F0EFF00DB22A9 /* StaticNodeList.h in Headers */,

Source/WebCore/html/FileListCreator.cpp renamed to Source/WebCore/html/DirectoryFileListCreator.cpp

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
*/
2525

2626
#include "config.h"
27-
#include "FileListCreator.h"
27+
#include "DirectoryFileListCreator.h"
2828

2929
#include "FileChooser.h"
3030
#include "FileList.h"
@@ -34,7 +34,7 @@
3434

3535
namespace WebCore {
3636

37-
FileListCreator::~FileListCreator()
37+
DirectoryFileListCreator::~DirectoryFileListCreator()
3838
{
3939
ASSERT(!m_completionHandler);
4040
}
@@ -57,44 +57,36 @@ static void appendDirectoryFiles(const String& directory, const String& relative
5757
}
5858
}
5959

60-
template<FileListCreator::ShouldResolveDirectories shouldResolveDirectories>
6160
static Ref<FileList> createFileList(const Vector<FileChooserFileInfo>& paths)
6261
{
6362
Vector<Ref<File>> fileObjects;
6463
for (auto& info : paths) {
65-
if (shouldResolveDirectories == FileListCreator::ShouldResolveDirectories::Yes && FileSystem::fileIsDirectory(info.path, FileSystem::ShouldFollowSymbolicLinks::No))
64+
if (FileSystem::fileIsDirectory(info.path, FileSystem::ShouldFollowSymbolicLinks::No))
6665
appendDirectoryFiles(info.path, FileSystem::pathGetFileName(info.path), fileObjects);
6766
else
6867
fileObjects.append(File::create(info.path, info.displayName));
6968
}
7069
return FileList::create(WTFMove(fileObjects));
7170
}
7271

73-
RefPtr<FileListCreator> FileListCreator::create(const Vector<FileChooserFileInfo>& paths, ShouldResolveDirectories shouldResolveDirectories, CompletionHandler&& completionHandler)
72+
DirectoryFileListCreator::DirectoryFileListCreator(CompletionHandler&& completionHandler)
73+
: m_workQueue(WorkQueue::create("DirectoryFileListCreator Work Queue"))
74+
, m_completionHandler(WTFMove(completionHandler))
7475
{
75-
if (shouldResolveDirectories == ShouldResolveDirectories::No) {
76-
completionHandler(createFileList<ShouldResolveDirectories::No>(paths));
77-
return nullptr;
78-
}
79-
80-
return adoptRef(*new FileListCreator(paths, WTFMove(completionHandler)));
8176
}
8277

83-
FileListCreator::FileListCreator(const Vector<FileChooserFileInfo>& paths, CompletionHandler&& completionHandler)
84-
: m_workQueue(WorkQueue::create("FileListCreator Work Queue"))
85-
, m_completionHandler(WTFMove(completionHandler))
78+
void DirectoryFileListCreator::start(const Vector<FileChooserFileInfo>& paths)
8679
{
8780
// Resolve directories on a background thread to avoid blocking the main thread.
8881
m_workQueue->dispatch([this, protectedThis = makeRef(*this), paths = crossThreadCopy(paths)]() mutable {
89-
auto fileList = createFileList<ShouldResolveDirectories::Yes>(paths);
90-
callOnMainThread([this, protectedThis = WTFMove(protectedThis), fileList = WTFMove(fileList)]() mutable {
91-
if (auto completionHandler = WTFMove(m_completionHandler))
82+
callOnMainThread([this, protectedThis = WTFMove(protectedThis), fileList = createFileList(paths)]() mutable {
83+
if (auto completionHandler = std::exchange(m_completionHandler, nullptr))
9284
completionHandler(WTFMove(fileList));
9385
});
9486
});
9587
}
9688

97-
void FileListCreator::cancel()
89+
void DirectoryFileListCreator::cancel()
9890
{
9991
m_completionHandler = nullptr;
10092
m_workQueue = nullptr;

Source/WebCore/html/FileListCreator.h renamed to Source/WebCore/html/DirectoryFileListCreator.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,22 @@ namespace WebCore {
3636
struct FileChooserFileInfo;
3737
class FileList;
3838

39-
class FileListCreator : public ThreadSafeRefCounted<FileListCreator> {
39+
class DirectoryFileListCreator : public ThreadSafeRefCounted<DirectoryFileListCreator> {
4040
public:
4141
using CompletionHandler = Function<void(Ref<FileList>&&)>;
4242

43-
enum class ShouldResolveDirectories { No, Yes };
44-
static RefPtr<FileListCreator> create(const Vector<FileChooserFileInfo>&, ShouldResolveDirectories, CompletionHandler&&);
43+
static Ref<DirectoryFileListCreator> create(CompletionHandler&& completionHandler)
44+
{
45+
return adoptRef(*new DirectoryFileListCreator(WTFMove(completionHandler)));
46+
}
4547

46-
~FileListCreator();
48+
~DirectoryFileListCreator();
4749

50+
void start(const Vector<FileChooserFileInfo>&);
4851
void cancel();
4952

5053
private:
51-
FileListCreator(const Vector<FileChooserFileInfo>&, CompletionHandler&&);
54+
explicit DirectoryFileListCreator(CompletionHandler&&);
5255

5356
RefPtr<WorkQueue> m_workQueue;
5457
CompletionHandler m_completionHandler;

Source/WebCore/html/FileInputType.cpp

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@
2424

2525
#include "Chrome.h"
2626
#include "DOMFormData.h"
27+
#include "DirectoryFileListCreator.h"
2728
#include "DragData.h"
2829
#include "ElementChildIterator.h"
2930
#include "Event.h"
3031
#include "File.h"
3132
#include "FileList.h"
32-
#include "FileListCreator.h"
3333
#include "FormController.h"
3434
#include "Frame.h"
3535
#include "HTMLInputElement.h"
@@ -409,19 +409,36 @@ void FileInputType::filesChosen(const Vector<FileChooserFileInfo>& paths, const
409409
if (!displayString.isEmpty())
410410
m_displayString = displayString;
411411

412-
if (m_fileListCreator)
413-
m_fileListCreator->cancel();
412+
if (m_directoryFileListCreator)
413+
m_directoryFileListCreator->cancel();
414414

415-
auto shouldResolveDirectories = allowsDirectories() ? FileListCreator::ShouldResolveDirectories::Yes : FileListCreator::ShouldResolveDirectories::No;
416-
m_fileListCreator = FileListCreator::create(paths, shouldResolveDirectories, [this, weakThis = makeWeakPtr(*this), icon = makeRefPtr(icon)](Ref<FileList>&& fileList) mutable {
417-
auto protectedThis = makeRefPtr(weakThis.get());
418-
if (!protectedThis)
415+
if (!allowsDirectories()) {
416+
auto files = paths.map([](auto& fileInfo) {
417+
return File::create(fileInfo.path, fileInfo.displayName);
418+
});
419+
didCreateFileList(FileList::create(WTFMove(files)), icon);
420+
return;
421+
}
422+
423+
m_directoryFileListCreator = DirectoryFileListCreator::create([this, weakThis = makeWeakPtr(*this), icon = makeRefPtr(icon)](Ref<FileList>&& fileList) mutable {
424+
ASSERT(isMainThread());
425+
if (!weakThis)
419426
return;
420-
setFiles(WTFMove(fileList), icon ? RequestIcon::Yes : RequestIcon::No);
421-
if (icon && !m_fileList->isEmpty() && element())
422-
iconLoaded(WTFMove(icon));
423-
m_fileListCreator = nullptr;
427+
didCreateFileList(WTFMove(fileList), WTFMove(icon));
424428
});
429+
m_directoryFileListCreator->start(paths);
430+
}
431+
432+
void FileInputType::didCreateFileList(Ref<FileList>&& fileList, RefPtr<Icon>&& icon)
433+
{
434+
auto protectedThis = makeRef(*this);
435+
436+
ASSERT(!allowsDirectories() || m_directoryFileListCreator);
437+
m_directoryFileListCreator = nullptr;
438+
439+
setFiles(WTFMove(fileList), icon ? RequestIcon::Yes : RequestIcon::No);
440+
if (icon && !m_fileList->isEmpty() && element())
441+
iconLoaded(WTFMove(icon));
425442
}
426443

427444
String FileInputType::displayString() const

Source/WebCore/html/FileInputType.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@
3939

4040
namespace WebCore {
4141

42+
class DirectoryFileListCreator;
4243
class DragData;
4344
class FileList;
44-
class FileListCreator;
4545
class Icon;
4646

4747
class FileInputType final : public BaseClickableWithKeyInputType, private FileChooserClient, private FileIconLoaderClient, public CanMakeWeakPtr<FileInputType> {
@@ -86,17 +86,17 @@ class FileInputType final : public BaseClickableWithKeyInputType, private FileCh
8686
// FileIconLoaderClient implementation.
8787
void iconLoaded(RefPtr<Icon>&&) final;
8888

89-
void requestIcon(const Vector<String>&);
90-
9189
void applyFileChooserSettings(const FileChooserSettings&);
90+
void didCreateFileList(Ref<FileList>&&, RefPtr<Icon>&&);
91+
void requestIcon(const Vector<String>&);
9292

9393
bool allowsDirectories() const;
9494

9595
RefPtr<FileChooser> m_fileChooser;
9696
std::unique_ptr<FileIconLoader> m_fileIconLoader;
9797

9898
Ref<FileList> m_fileList;
99-
RefPtr<FileListCreator> m_fileListCreator;
99+
RefPtr<DirectoryFileListCreator> m_directoryFileListCreator;
100100
RefPtr<Icon> m_icon;
101101
String m_displayString;
102102
};

0 commit comments

Comments
 (0)