blob: 87d012764deaad08d27ad26f169d8f1dcd2cc44a [file] [log] [blame]
// Copyright 2021 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/base/interaction/element_identifier.h"
#include <cstring>
#include "base/containers/contains.h"
#include "base/no_destructor.h"
namespace ui {
std::string ElementIdentifier::GetName() const {
if (!handle_)
return std::string();
RegisterKnownIdentifier(*this);
return handle_->name;
}
intptr_t ElementIdentifier::GetRawValue() const {
if (!handle_)
return 0;
RegisterKnownIdentifier(*this);
return reinterpret_cast<intptr_t>(handle_);
}
// static
ElementIdentifier ElementIdentifier::FromRawValue(intptr_t value) {
if (!value)
return ElementIdentifier();
const auto* impl =
reinterpret_cast<const internal::ElementIdentifierImpl*>(value);
CHECK(base::Contains(GetKnownIdentifiers(), impl));
return ElementIdentifier(impl);
}
// static
ElementIdentifier ElementIdentifier::FromName(const char* name) {
for (const auto* impl : GetKnownIdentifiers()) {
if (!strcmp(impl->name, name))
return ElementIdentifier(impl);
}
return ElementIdentifier();
}
// static
void ElementIdentifier::RegisterKnownIdentifier(
ElementIdentifier element_identifier) {
CHECK(element_identifier);
#if DCHECK_IS_ON()
// Enforce uniqueness in DCHECK builds.
const ElementIdentifier existing = FromName(element_identifier.handle_->name);
DCHECK(!existing || existing == element_identifier);
#endif
GetKnownIdentifiers().insert(element_identifier.handle_);
}
// static
ElementIdentifier::KnownIdentifiers& ElementIdentifier::GetKnownIdentifiers() {
static base::NoDestructor<KnownIdentifiers> known_identifiers;
return *known_identifiers.get();
}
void PrintTo(ElementIdentifier element_identifier, std::ostream* os) {
*os << "ElementIdentifier " << element_identifier.GetRawValue() << " ["
<< element_identifier.GetName() << "]";
}
void PrintTo(ElementContext element_context, std::ostream* os) {
*os << "ElementContext " << static_cast<const void*>(element_context);
}
extern std::ostream& operator<<(std::ostream& os,
ElementIdentifier element_identifier) {
PrintTo(element_identifier, &os);
return os;
}
extern std::ostream& operator<<(std::ostream& os,
ElementContext element_context) {
PrintTo(element_context, &os);
return os;
}
} // namespace ui