blob: 44b6b2409bb62fb4d1df8674b1b1386c18862bbc [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/accessibility/ax_tree_id.h"
#include <algorithm>
#include <iostream>
#include "base/check.h"
#include "base/json/values_util.h"
#include "base/notreached.h"
#include "base/values.h"
#include "ui/accessibility/ax_enums.mojom.h"
namespace ui {
AXTreeID::AXTreeID() : AXTreeID(ax::mojom::AXTreeIDType::kUnknown) {}
AXTreeID::AXTreeID(const AXTreeID& other) = default;
AXTreeID::AXTreeID(ax::mojom::AXTreeIDType type) : type_(type) {
if (type_ == ax::mojom::AXTreeIDType::kToken)
token_ = base::UnguessableToken::Create();
}
AXTreeID::AXTreeID(const std::string& string) {
if (string.empty()) {
type_ = ax::mojom::AXTreeIDType::kUnknown;
} else {
type_ = ax::mojom::AXTreeIDType::kToken;
std::optional<base::UnguessableToken> token =
base::ValueToUnguessableToken(base::Value(string));
CHECK(token);
token_ = *token;
}
}
// static
AXTreeID AXTreeID::FromString(const std::string& string) {
return AXTreeID(string);
}
// static
AXTreeID AXTreeID::FromToken(const base::UnguessableToken& token) {
AXTreeID id;
id.type_ = ax::mojom::AXTreeIDType::kToken;
id.token_ = token;
return id;
}
// static
AXTreeID AXTreeID::CreateNewAXTreeID() {
return AXTreeID(ax::mojom::AXTreeIDType::kToken);
}
AXTreeID& AXTreeID::operator=(const AXTreeID& other) = default;
std::string AXTreeID::ToString() const {
switch (type_) {
case ax::mojom::AXTreeIDType::kUnknown:
return "";
case ax::mojom::AXTreeIDType::kToken:
return base::UnguessableTokenToValue(*token_).GetString();
}
}
void swap(AXTreeID& first, AXTreeID& second) {
std::swap(first.type_, second.type_);
std::swap(first.token_, second.token_);
}
size_t AXTreeIDHash::operator()(const AXTreeID& tree_id) const {
DCHECK(tree_id.type() == ax::mojom::AXTreeIDType::kToken);
return base::UnguessableTokenHash()(tree_id.token().value());
}
std::ostream& operator<<(std::ostream& stream, const AXTreeID& value) {
return stream << value.ToString();
}
const AXTreeID& AXTreeIDUnknown() {
static const AXTreeID ax_tree_id_unknown(ax::mojom::AXTreeIDType::kUnknown);
return ax_tree_id_unknown;
}
} // namespace ui