screen_ai_ax_tree_serializer.cc 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // Copyright 2022 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 "components/services/screen_ai/screen_ai_ax_tree_serializer.h"
  5. #include <set>
  6. #include <utility>
  7. #include "base/check.h"
  8. #include "base/containers/contains.h"
  9. #include "base/logging.h"
  10. #include "base/memory/ptr_util.h"
  11. #include "base/notreached.h"
  12. #include "ui/accessibility/ax_enums.mojom.h"
  13. #include "ui/accessibility/ax_tree_id.h"
  14. namespace screen_ai {
  15. ScreenAIAXTreeSerializer::ScreenAIAXTreeSerializer(
  16. const ui::AXTreeID& parent_tree_id,
  17. std::vector<ui::AXNodeData>&& nodes)
  18. : tree_(std::make_unique<ui::AXSerializableTree>()) {
  19. ui::AXTreeUpdate update;
  20. if (!nodes.empty()) {
  21. DCHECK(base::Contains(
  22. std::set{ax::mojom::Role::kDialog, ax::mojom::Role::kRootWebArea,
  23. ax::mojom::Role::kPdfRoot},
  24. nodes[0].role));
  25. update.root_id = nodes[0].id;
  26. } else {
  27. update.root_id = ui::kInvalidAXNodeID;
  28. }
  29. update.nodes = nodes;
  30. update.tree_data.tree_id = ui::AXTreeID::CreateNewAXTreeID();
  31. update.tree_data.parent_tree_id = parent_tree_id;
  32. update.tree_data.title = "Screen AI";
  33. if (!tree_->Unserialize(update))
  34. LOG(FATAL) << tree_->error();
  35. tree_source_ = base::WrapUnique<ui::AXTreeSource<const ui::AXNode*>>(
  36. tree_->CreateTreeSource());
  37. DCHECK(tree_source_);
  38. serializer_ = std::make_unique<ui::AXTreeSerializer<const ui::AXNode*>>(
  39. tree_source_.get(), /* crash_on_error */ true);
  40. }
  41. ScreenAIAXTreeSerializer::~ScreenAIAXTreeSerializer() = default;
  42. ui::AXTreeUpdate ScreenAIAXTreeSerializer::Serialize() const {
  43. DCHECK(serializer_);
  44. DCHECK(tree_);
  45. ui::AXTreeUpdate out_update;
  46. if (!serializer_->SerializeChanges(tree_->root(), &out_update)) {
  47. NOTREACHED() << "Failure to serialize should have already caused the "
  48. "process to crash due to the `crash_on_error` in "
  49. "`AXTreeSerializer` constructor call.";
  50. }
  51. return out_update;
  52. }
  53. } // namespace screen_ai