chromium/chrome/browser/ash/accessibility/switch_access_test_utils.cc

// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ash/accessibility/switch_access_test_utils.h"

#include "ash/constants/ash_pref_names.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/path_service.h"
#include "base/strings/stringprintf.h"
#include "chrome/browser/ash/accessibility/accessibility_manager.h"
#include "chrome/browser/ash/accessibility/accessibility_test_utils.h"
#include "chrome/common/extensions/extension_constants.h"
#include "extensions/browser/browsertest_util.h"
#include "extensions/browser/extension_host_test_helper.h"

namespace {
constexpr char kTestSupportPath[] =
    "chrome/browser/resources/chromeos/accessibility/switch_access/"
    "test_support.js";
}  // namespace

namespace ash {

SwitchAccessTestUtils::SwitchAccessTestUtils(Profile* profile) {
  profile_ = profile;
  console_observer_ = std::make_unique<ExtensionConsoleErrorObserver>(
      profile_, extension_misc::kSwitchAccessExtensionId);
}

SwitchAccessTestUtils::~SwitchAccessTestUtils() {}

void SwitchAccessTestUtils::EnableSwitchAccess(
    const std::set<int>& select_key_codes,
    const std::set<int>& next_key_codes,
    const std::set<int>& previous_key_codes) {
  AccessibilityManager* manager = AccessibilityManager::Get();

  extensions::ExtensionHostTestHelper host_helper(
      profile_, extension_misc::kSwitchAccessExtensionId);
  manager->SetSwitchAccessEnabled(true);
  host_helper.WaitForHostCompletedFirstLoad();

  manager->SetSwitchAccessKeysForTest(
      select_key_codes, prefs::kAccessibilitySwitchAccessSelectDeviceKeyCodes);
  manager->SetSwitchAccessKeysForTest(
      next_key_codes, prefs::kAccessibilitySwitchAccessNextDeviceKeyCodes);
  manager->SetSwitchAccessKeysForTest(
      previous_key_codes,
      prefs::kAccessibilitySwitchAccessPreviousDeviceKeyCodes);

  EXPECT_TRUE(manager->IsSwitchAccessEnabled());

  InjectFocusRingWatcher();
}

void SwitchAccessTestUtils::WaitForFocusRing(const std::string& type,
                                             const std::string& role,
                                             const std::string& name) {
  ASSERT_TRUE(type == "primary" || type == "preview");
  std::string script = base::StringPrintf(
      R"JS(
          waitForFocusRing("%s", "%s", "%s", () => {
            window.domAutomationController.send('ok');
          });
        )JS",
      type.c_str(), role.c_str(), name.c_str());
  WaitForJS(script);
}

void SwitchAccessTestUtils::DoDefault(const std::string& name) {
  std::string script = base::StringPrintf(
      R"JS(
        doDefault("%s", () => {
          window.domAutomationController.send('ok');
        });
      )JS",
      name.c_str());
  WaitForJS(script);
}

void SwitchAccessTestUtils::PointScanClick(const int x, const int y) {
  std::string script = base::StringPrintf(
      R"JS(
        pointScanClick("%d", "%d", () => {
          window.domAutomationController.send('ok');
        });
      )JS",
      x, y);
  WaitForJS(script);
}

void SwitchAccessTestUtils::WaitForEventOnAutomationNode(
    const std::string& eventType,
    const std::string& name) {
  std::string script = base::StringPrintf(
      R"JS(
          waitForEventOnAutomationNode("%s", "%s", () => {
            window.domAutomationController.send('ok');
          });
        )JS",
      eventType.c_str(), name.c_str());
  WaitForJS(script);
}

void SwitchAccessTestUtils::WaitForJS(const std::string& js_to_eval) {
  std::string result =
      extensions::browsertest_util::ExecuteScriptInBackgroundPageDeprecated(
          profile_, extension_misc::kSwitchAccessExtensionId, js_to_eval,
          extensions::browsertest_util::ScriptUserActivation::kDontActivate);
  ASSERT_EQ(result, "ok");
}

void SwitchAccessTestUtils::InjectFocusRingWatcher() {
  base::ScopedAllowBlockingForTesting allow_blocking;
  base::FilePath source_dir;
  CHECK(base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &source_dir));
  auto test_support_path = source_dir.AppendASCII(kTestSupportPath);
  std::string script;
  ASSERT_TRUE(base::ReadFileToString(test_support_path, &script))
      << test_support_path;

  std::string result =
      extensions::browsertest_util::ExecuteScriptInBackgroundPageDeprecated(
          profile_, extension_misc::kSwitchAccessExtensionId, script);
  ASSERT_EQ("ready", result);
}

}  // namespace ash