#include <string>
#include <tuple>
#include "base/functional/callback.h"
#include "base/location.h"
#include "base/task/sequenced_task_runner.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/test_timeouts.h"
#include "chrome/browser/accessibility/browser_test_with_ax_client.h"
#include "content/public/test/browser_test.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/accessibility/accessibility_features.h"
#include "ui/accessibility/platform/ax_platform_node_win.h"
namespace {
class LeakedNodeDetectionBrowsertest
: public BrowserTestWithAxClient,
public testing::WithParamInterface<BrowserTestWithAxClient::ClientApi> {
protected:
static BrowserTestWithAxClient::ClientApi client_api() { return GetParam(); }
LeakedNodeDetectionBrowsertest();
private:
ClientApi GetClientApi() const override { return client_api(); }
base::test::ScopedFeatureList scoped_feature_list_;
};
LeakedNodeDetectionBrowsertest::LeakedNodeDetectionBrowsertest() {
scoped_feature_list_.InitWithFeatures(
{features::kUiaProvider, features::kUiaDisconnectRootProviders}, {});
}
}
IN_PROC_BROWSER_TEST_P(LeakedNodeDetectionBrowsertest, DetectGhostNodeLeaks) {
ASSERT_HRESULT_SUCCEEDED(InitializeClient(browser()));
ASSERT_HRESULT_SUCCEEDED(FindAll());
{
base::RunLoop run_loop;
base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
FROM_HERE, run_loop.QuitClosure(), TestTimeouts::tiny_timeout());
run_loop.Run();
}
VLOG(1) << NodeCountsToString(ui::AXPlatformNodeWin::GetCounts());
CloseBrowserSynchronously(browser());
WaitForNodeCounts({0U, 0U, 0U, 0U});
}
IN_PROC_BROWSER_TEST_P(LeakedNodeDetectionBrowsertest,
DISABLED_TerminateClient) {
ASSERT_HRESULT_SUCCEEDED(InitializeClient(browser()));
ASSERT_HRESULT_SUCCEEDED(FindAll());
{
base::RunLoop run_loop;
base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
FROM_HERE, run_loop.QuitClosure(), TestTimeouts::tiny_timeout());
run_loop.Run();
}
VLOG(1) << NodeCountsToString(ui::AXPlatformNodeWin::GetCounts());
TerminateClient();
CloseBrowserSynchronously(browser());
WaitForNodeCounts({0U, 0U, 0U, 0U});
}
INSTANTIATE_TEST_SUITE_P(
UiaClient,
LeakedNodeDetectionBrowsertest,
testing::Values(BrowserTestWithAxClient::ClientApi::kUiAutomation));
INSTANTIATE_TEST_SUITE_P(
Ia2Client,
LeakedNodeDetectionBrowsertest,
testing::Values(BrowserTestWithAxClient::ClientApi::kIAccessible2));