blob: ce0fda0020110a3a85afb7816c3183b12450ecf6 [file]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_TEST_ACCESSIBILITY_AX_CLIENT_AX_CLIENT_UIA_H_
#define CHROME_TEST_ACCESSIBILITY_AX_CLIENT_AX_CLIENT_UIA_H_
#include <stdint.h>
#include <wrl/client.h>
#include <map>
#include <ostream>
#include <string>
#include <string_view>
#include "base/containers/heap_array.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/strings/to_string.h"
#include "chrome/test/accessibility/ax_client/ax_client_impl.h"
struct IUIAutomation;
struct IUIAutomationCacheRequest;
struct IUIAutomationElement;
struct IUIAutomationStructureChangedEventHandler;
namespace ax_client {
class AxClientUia : public AxClientImpl {
public:
AxClientUia();
~AxClientUia() override;
// AxClientImpl:
HRESULT Initialize(HWND hwnd) override;
HRESULT FindAll() override;
void Shutdown() override;
private:
// A bucket of properties that are cached when discovering elements.
struct ElementProperties {
ElementProperties(base::HeapArray<int32_t> runtime_id,
std::wstring automation_id,
std::wstring class_name,
std::wstring name);
~ElementProperties();
base::HeapArray<int32_t> runtime_id;
std::wstring automation_id;
std::wstring class_name;
std::wstring name;
friend std::ostream& operator<<(std::ostream& out,
const ElementProperties& props) {
out << base::ToString(props.name) << " ("
<< base::ToString(props.automation_id) << ", "
<< base::ToString(props.runtime_id.as_span())
<< "): " << base::ToString(props.class_name);
return out;
}
};
struct HeapArrayLess {
bool operator()(const base::HeapArray<int32_t>& lhs,
const base::HeapArray<int32_t>& rhs) const {
return lhs.as_span() < rhs.as_span();
}
};
// Adds `element` to the client's collection of discovered elements.
void AddElement(Microsoft::WRL::ComPtr<IUIAutomationElement> element,
std::string_view context);
// Removes the element with `runtime_id` from the client's collection of
// discovered elements.
void RemoveElement(const base::HeapArray<int32_t>& runtime_id,
std::string_view context);
// Event handlers.
void HandleStructureChangedEvent(
Microsoft::WRL::ComPtr<IUIAutomationElement> sender,
int change_type,
base::HeapArray<int32_t> runtime_id);
// Returns the value of a VT_I4 | VT_ARRAY cached property of `element`.
static base::HeapArray<int32_t> GetIntArrayProperty(
IUIAutomationElement* element,
int property_id);
// Returns the value of a VT_BSTR cached property of `element`.
static std::wstring GetStringProperty(IUIAutomationElement* element,
int property_id);
// Returns a bucket of the cached properties of `element`.
static ElementProperties GetProperties(IUIAutomationElement* element);
// The connection to UIA.
Microsoft::WRL::ComPtr<IUIAutomation> ui_automation_;
// A cache request for general operations, including the set of properties
// returned by `GetProperties()`.
Microsoft::WRL::ComPtr<IUIAutomationCacheRequest> cache_request_;
// The top-level browser window on which this client operates.
Microsoft::WRL::ComPtr<IUIAutomationElement> browser_window_;
// The runtime id of the top-level browser window.
base::HeapArray<int32_t> browser_runtime_id_;
// Event handlers.
Microsoft::WRL::ComPtr<IUIAutomationStructureChangedEventHandler>
structure_changed_handler_;
// The elements discovered by this client.
std::map<base::HeapArray<int32_t>,
Microsoft::WRL::ComPtr<IUIAutomationElement>,
HeapArrayLess>
elements_;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<AxClientUia> weak_ptr_factory_{this};
};
} // namespace ax_client
#endif // CHROME_TEST_ACCESSIBILITY_AX_CLIENT_AX_CLIENT_UIA_H_