blob: ee68a0152f37dc84549c7ab095257c407e0127c5 [file] [log] [blame]
// 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_BROWSER_ACCESSIBILITY_BROWSER_TEST_WITH_AX_CLIENT_H_
#define CHROME_BROWSER_ACCESSIBILITY_BROWSER_TEST_WITH_AX_CLIENT_H_
#include <stddef.h>
#include <stdint.h>
#include <string>
#include "chrome/test/accessibility/ax_client/ax_client.test-mojom.h"
#include "chrome/test/accessibility/ax_client/launcher.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "ui/accessibility/platform/ax_platform_node_win.h"
// A test fixture that runs an accessibility client (ax_client) in a separate
// process. The fixture asserts that no AXPlatformNode instances are leaked
// during teardown. Tests based on this fixture may interleave operations on
// the browser with those in the client to evaluate interactions that mimic
// real-world scenarios involving assistive tech such as a screen reader.
class BrowserTestWithAxClient : public InProcessBrowserTest {
public:
enum class ClientApi {
// Use the UI Automation client APIs.
kUiAutomation,
// Use the IAccessible2 w/ Microsoft Active Accessibility client APIs.
kIAccessible2,
};
protected:
BrowserTestWithAxClient();
~BrowserTestWithAxClient() override;
// Enables platform-activation of accessibility modes so that native and web
// accessibility are turned on as a result of the AxClient's interactions with
// the browser via accessibility calls and launches the ax_client process.
void SetUpOnMainThread() override;
// Gracefully shuts down the ax_client process and waits for it to do so.
void TearDownOnMainThread() override;
// Gives the top-level HWND of `browser` to ax_client so that it can operate
// on it using the given client-side API; see
// `ax_client::mojom::AxClient::Initialize()`.
HRESULT InitializeClient(Browser* browser);
// Instructs the client to find all nodes in the window it is watching; see
// `ax_client::mojom::AxClient::FindAll()`.
HRESULT FindAll();
void TerminateClient();
// Returns the various accessibility node counts for human consumption.
static std::string NodeCountsToString(
const ui::AXPlatformNodeWin::Counts& counts);
// Asserts that there are no leaked AXPlatformNodeWin instances.
static void AssertNoLeakedNodes();
// Waits for the node counts to reach `counts`.
static void WaitForNodeCounts(const ui::AXPlatformNodeWin::Counts& counts);
private:
// Returns the type of accessibility API that the test would like the client
// to use.
virtual ClientApi GetClientApi() const = 0;
// Handles a connection error with the client by adding a non-fatal failure
// to the test run.
void OnAxClientError(const std::string& error);
// Handles a disconnect with the remote AxClient instance.
void OnClientDisconnect(uint32_t custom_reason,
const std::string& description);
// Launches and manages the lifetime of the ax_client process.
ax_client::Launcher ax_client_launcher_;
// The connection to ax_client.
mojo::Remote<ax_client::mojom::AxClient> ax_client_;
// A callback that will be run when the client disconnects expectedly.
base::OnceClosure disconnect_closure_;
};
#endif // CHROME_BROWSER_ACCESSIBILITY_BROWSER_TEST_WITH_AX_CLIENT_H_