// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_AX_TARGET_WIN_H_
#define UI_ACCESSIBILITY_PLATFORM_INSPECT_AX_TARGET_WIN_H_
#include <string>
#include <wrl/client.h>
#include "base/component_export.h"
#include "third_party/abseil-cpp/absl/types/variant.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_ && absl::holds_alternative<Type>(*value_);
}
template <typename Type>
const Type& As() const {
return absl::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& lhs, const AXTargetWin& rhs) {
return !(lhs.value_ == rhs.value_);
}
private:
using VariantType = absl::variant<std::string,
int,
IAccessibleComPtr,
IA2ComPtr,
IA2HypertextComPtr,
IA2TableComPtr,
IA2TableCellComPtr,
IA2TextComPtr,
IA2TextSelectionContainerComPtr,
IA2ValueComPtr,
ScopedCoMemArray<LONG>,
ScopedCoMemArray<IA2TextSelection>>;
// Keep the value const to prevent accidental change of the value shared
// between multiple instances of AXTargetWin.
std::shared_ptr<const VariantType> value_; // nocheck
};
} // namespace ui
#endif // UI_ACCESSIBILITY_PLATFORM_INSPECT_AX_TARGET_WIN_H_