ax_tree_id.cc 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ui/accessibility/ax_tree_id.h"
  5. #include <algorithm>
  6. #include <iostream>
  7. #include "base/check.h"
  8. #include "base/json/values_util.h"
  9. #include "base/notreached.h"
  10. #include "base/values.h"
  11. #include "ui/accessibility/ax_enums.mojom.h"
  12. namespace ui {
  13. AXTreeID::AXTreeID() : AXTreeID(ax::mojom::AXTreeIDType::kUnknown) {}
  14. AXTreeID::AXTreeID(const AXTreeID& other) = default;
  15. AXTreeID::AXTreeID(ax::mojom::AXTreeIDType type) : type_(type) {
  16. if (type_ == ax::mojom::AXTreeIDType::kToken)
  17. token_ = base::UnguessableToken::Create();
  18. }
  19. AXTreeID::AXTreeID(const std::string& string) {
  20. if (string.empty()) {
  21. type_ = ax::mojom::AXTreeIDType::kUnknown;
  22. } else {
  23. type_ = ax::mojom::AXTreeIDType::kToken;
  24. absl::optional<base::UnguessableToken> token =
  25. base::ValueToUnguessableToken(base::Value(string));
  26. CHECK(token);
  27. token_ = *token;
  28. }
  29. }
  30. // static
  31. AXTreeID AXTreeID::FromString(const std::string& string) {
  32. return AXTreeID(string);
  33. }
  34. // static
  35. AXTreeID AXTreeID::FromToken(const base::UnguessableToken& token) {
  36. AXTreeID id;
  37. id.type_ = ax::mojom::AXTreeIDType::kToken;
  38. id.token_ = token;
  39. return id;
  40. }
  41. // static
  42. AXTreeID AXTreeID::CreateNewAXTreeID() {
  43. return AXTreeID(ax::mojom::AXTreeIDType::kToken);
  44. }
  45. AXTreeID& AXTreeID::operator=(const AXTreeID& other) = default;
  46. std::string AXTreeID::ToString() const {
  47. switch (type_) {
  48. case ax::mojom::AXTreeIDType::kUnknown:
  49. return "";
  50. case ax::mojom::AXTreeIDType::kToken:
  51. return base::UnguessableTokenToValue(*token_).GetString();
  52. }
  53. }
  54. void swap(AXTreeID& first, AXTreeID& second) {
  55. std::swap(first.type_, second.type_);
  56. std::swap(first.token_, second.token_);
  57. }
  58. bool AXTreeID::operator==(const AXTreeID& rhs) const {
  59. return type_ == rhs.type_ && token_ == rhs.token_;
  60. }
  61. bool AXTreeID::operator!=(const AXTreeID& rhs) const {
  62. return !(*this == rhs);
  63. }
  64. bool AXTreeID::operator<(const AXTreeID& rhs) const {
  65. return std::tie(type_, token_) < std::tie(rhs.type_, rhs.token_);
  66. }
  67. bool AXTreeID::operator<=(const AXTreeID& rhs) const {
  68. return std::tie(type_, token_) <= std::tie(rhs.type_, rhs.token_);
  69. }
  70. bool AXTreeID::operator>(const AXTreeID& rhs) const {
  71. return !(*this <= rhs);
  72. }
  73. bool AXTreeID::operator>=(const AXTreeID& rhs) const {
  74. return !(*this < rhs);
  75. }
  76. size_t AXTreeIDHash::operator()(const ui::AXTreeID& tree_id) const {
  77. DCHECK(tree_id.type() == ax::mojom::AXTreeIDType::kToken);
  78. return base::UnguessableTokenHash()(tree_id.token().value());
  79. }
  80. std::ostream& operator<<(std::ostream& stream, const AXTreeID& value) {
  81. return stream << value.ToString();
  82. }
  83. const AXTreeID& AXTreeIDUnknown() {
  84. static const AXTreeID ax_tree_id_unknown(ax::mojom::AXTreeIDType::kUnknown);
  85. return ax_tree_id_unknown;
  86. }
  87. } // namespace ui