#pragma once
#include "BaseClickableWithKeyInputType.h"
#include "FileChooser.h"
#include "FileIconLoader.h"
#include <wtf/RefPtr.h>
#include <wtf/WeakPtr.h>
namespace WebCore {
class DirectoryFileListCreator;
class DragData;
class FileList;
class Icon;
class FileInputType final : public BaseClickableWithKeyInputType, private FileChooserClient, private FileIconLoaderClient, public CanMakeWeakPtr<FileInputType> {
public:
explicit FileInputType(HTMLInputElement&);
virtual ~FileInputType();
static Vector<FileChooserFileInfo> filesFromFormControlState(const FormControlState&);
private:
const AtomString& formControlType() const final;
FormControlState saveFormControlState() const final;
void restoreFormControlState(const FormControlState&) final;
bool appendFormData(DOMFormData&, bool) const final;
bool valueMissing(const String&) const final;
String valueMissingText() const final;
void handleDOMActivateEvent(Event&) final;
RenderPtr<RenderElement> createInputRenderer(RenderStyle&&) final;
bool canSetStringValue() const final;
FileList* files() final;
void setFiles(RefPtr<FileList>&&) final;
enum class RequestIcon { Yes, No };
void setFiles(RefPtr<FileList>&&, RequestIcon);
String displayString() const final;
bool canSetValue(const String&) final;
bool getTypeSpecificValue(String&) final; void setValue(const String&, bool valueChanged, TextFieldEventBehavior) final;
#if ENABLE(DRAG_SUPPORT)
bool receiveDroppedFilesWithImageTranscoding(const Vector<String>& paths);
bool receiveDroppedFiles(const DragData&) final;
#endif
Icon* icon() const final;
bool isFileUpload() const final;
void createShadowSubtree() final;
void disabledStateChanged() final;
void attributeChanged(const QualifiedName&) final;
String defaultToolTip() const final;
void filesChosen(const Vector<FileChooserFileInfo>&, const String& displayString = { }, Icon* = nullptr) final;
void filesChosen(const Vector<String>& paths, const Vector<String>& replacementPaths = { });
void iconLoaded(RefPtr<Icon>&&) final;
FileChooserSettings fileChooserSettings() const;
void applyFileChooserSettings();
void didCreateFileList(Ref<FileList>&&, RefPtr<Icon>&&);
void requestIcon(const Vector<String>&);
bool allowsDirectories() const;
RefPtr<FileChooser> m_fileChooser;
std::unique_ptr<FileIconLoader> m_fileIconLoader;
Ref<FileList> m_fileList;
RefPtr<DirectoryFileListCreator> m_directoryFileListCreator;
RefPtr<Icon> m_icon;
String m_displayString;
};
}