UserActionElementSet.h [plain text]
#pragma once
#include <wtf/HashMap.h>
#include <wtf/OptionSet.h>
#include <wtf/Ref.h>
namespace WebCore {
class Element;
class UserActionElementSet {
public:
bool isActive(const Element& element) { return hasFlag(element, Flag::IsActive); }
bool isFocused(const Element& element) { return hasFlag(element, Flag::IsFocused); }
bool isHovered(const Element& element) { return hasFlag(element, Flag::IsHovered); }
bool inActiveChain(const Element& element) { return hasFlag(element, Flag::InActiveChain); }
void setActive(Element& element, bool enable) { setFlags(element, enable, Flag::IsActive); }
void setFocused(Element& element, bool enable) { setFlags(element, enable, Flag::IsFocused); }
void setHovered(Element& element, bool enable) { setFlags(element, enable, Flag::IsHovered); }
void setInActiveChain(Element& element, bool enable) { setFlags(element, enable, Flag::InActiveChain); }
void clearActiveAndHovered(Element& element) { clearFlags(element, { Flag::IsActive, Flag::InActiveChain, Flag::IsHovered }); }
void clear();
private:
enum class Flag {
IsActive = 1 << 0,
InActiveChain = 1 << 1,
IsHovered = 1 << 2,
IsFocused = 1 << 3
};
void setFlags(Element& element, bool enable, OptionSet<Flag> flags) { enable ? setFlags(element, flags) : clearFlags(element, flags); }
void setFlags(Element&, OptionSet<Flag>);
void clearFlags(Element&, OptionSet<Flag>);
bool hasFlag(const Element&, Flag) const;
HashMap<RefPtr<Element>, OptionSet<Flag>> m_elements;
};
}