#ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_AX_TARGET_WIN_H_
#define UI_ACCESSIBILITY_PLATFORM_INSPECT_AX_TARGET_WIN_H_
#include <wrl/client.h>
#include <string>
#include <variant>
#include "base/component_export.h"
#include "third_party/iaccessible2/ia2_api_all.h"
#include "ui/accessibility/platform/iaccessible2/scoped_co_mem_array.h"
namespace ui {
using IAccessibleComPtr = Microsoft::WRL::ComPtr<IAccessible>;
using IA2ComPtr = Microsoft::WRL::ComPtr<IAccessible2>;
using IA2HypertextComPtr = Microsoft::WRL::ComPtr<IAccessibleHypertext>;
using IA2TableComPtr = Microsoft::WRL::ComPtr<IAccessibleTable>;
using IA2TableCellComPtr = Microsoft::WRL::ComPtr<IAccessibleTableCell>;
using IA2TextComPtr = Microsoft::WRL::ComPtr<IAccessibleText>;
using IA2TextSelectionContainerComPtr =
Microsoft::WRL::ComPtr<IAccessibleTextSelectionContainer>;
using IA2ValueComPtr = Microsoft::WRL::ComPtr<IAccessibleValue>;
class COMPONENT_EXPORT(AX_PLATFORM) AXTargetWin final {
public:
AXTargetWin();
AXTargetWin(std::nullptr_t);
AXTargetWin(const AXTargetWin&);
AXTargetWin(AXTargetWin&&);
template <typename Type>
constexpr AXTargetWin(Type&& v)
: value_(std::make_shared<VariantType>(std::move(v))) {}
~AXTargetWin();
template <typename Type>
bool Is() const {
return value_ && std::holds_alternative<Type>(*value_);
}
template <typename Type>
const Type& As() const {
return std::get<Type>(*value_);
}
std::string ToString() const;
AXTargetWin& operator=(const AXTargetWin&) = default;
AXTargetWin& operator=(AXTargetWin&&) = default;
constexpr bool operator!() const { return value_ == nullptr; }
friend bool operator==(const AXTargetWin&, const AXTargetWin&) = default;
private:
using VariantType = std::variant<std::string,
int,
IAccessibleComPtr,
IA2ComPtr,
IA2HypertextComPtr,
IA2TableComPtr,
IA2TableCellComPtr,
IA2TextComPtr,
IA2TextSelectionContainerComPtr,
IA2ValueComPtr,
ScopedCoMemArray<LONG>,
ScopedCoMemArray<IA2TextSelection>>;
std::shared_ptr<const VariantType> value_;
};
}
#endif