#pragma once
#include "File.h"
#include "TextEncoding.h"
#include <wtf/Forward.h>
#include <wtf/Optional.h>
#include <wtf/RefCounted.h>
#include <wtf/Variant.h>
#include <wtf/text/WTFString.h>
namespace WebCore {
class HTMLFormElement;
class DOMFormData : public RefCounted<DOMFormData> {
public:
using FormDataEntryValue = Variant<RefPtr<File>, String>;
struct Item {
String name;
FormDataEntryValue data;
};
static Ref<DOMFormData> create(HTMLFormElement* form) { return adoptRef(*new DOMFormData(form)); }
static Ref<DOMFormData> create(const TextEncoding& encoding) { return adoptRef(*new DOMFormData(encoding)); }
const Vector<Item>& items() const { return m_items; }
const TextEncoding& encoding() const { return m_encoding; }
void append(const String& name, const String& value);
void append(const String& name, Blob&, const String& filename = { });
void remove(const String& name);
std::optional<FormDataEntryValue> get(const String& name);
Vector<FormDataEntryValue> getAll(const String& name);
bool has(const String& name);
void set(const String& name, const String& value);
void set(const String& name, Blob&, const String& filename = { });
class Iterator {
public:
explicit Iterator(DOMFormData&);
std::optional<KeyValuePair<String, FormDataEntryValue>> next();
private:
Ref<DOMFormData> m_target;
size_t m_index { 0 };
};
Iterator createIterator() { return Iterator { *this }; }
private:
explicit DOMFormData(const TextEncoding&);
explicit DOMFormData(HTMLFormElement*);
Item createFileEntry(const String& name, Blob&, const String& filename);
void set(const String& name, Item&&);
TextEncoding m_encoding;
Vector<Item> m_items;
};
}