frame_node_impl_describer.cc 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // Copyright 2020 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/performance_manager/graph/frame_node_impl_describer.h"
  5. #include <sstream>
  6. #include <string>
  7. #include <utility>
  8. #include "base/values.h"
  9. #include "components/performance_manager/graph/frame_node_impl.h"
  10. #include "components/performance_manager/public/graph/node_data_describer_registry.h"
  11. #include "components/performance_manager/public/graph/node_data_describer_util.h"
  12. namespace performance_manager {
  13. namespace {
  14. const char kDescriberName[] = "FrameNodeImpl";
  15. std::string ViewportIntersectionToString(
  16. const absl::optional<gfx::Rect>& viewport_intersection) {
  17. if (!viewport_intersection.has_value())
  18. return "Nullopt";
  19. return viewport_intersection->ToString();
  20. }
  21. std::string FrameNodeVisibilityToString(FrameNode::Visibility visibility) {
  22. switch (visibility) {
  23. // using FrameNode::Visibility;
  24. case FrameNode::Visibility::kUnknown:
  25. return "Unknown";
  26. case FrameNode::Visibility::kVisible:
  27. return "Visible";
  28. case FrameNode::Visibility::kNotVisible:
  29. return "Not visible";
  30. }
  31. }
  32. } // namespace
  33. FrameNodeImplDescriber::~FrameNodeImplDescriber() = default;
  34. void FrameNodeImplDescriber::OnPassedToGraph(Graph* graph) {
  35. graph->GetNodeDataDescriberRegistry()->RegisterDescriber(this,
  36. kDescriberName);
  37. }
  38. void FrameNodeImplDescriber::OnTakenFromGraph(Graph* graph) {
  39. graph->GetNodeDataDescriberRegistry()->UnregisterDescriber(this);
  40. }
  41. base::Value FrameNodeImplDescriber::DescribeFrameNodeData(
  42. const FrameNode* node) const {
  43. const FrameNodeImpl* impl = FrameNodeImpl::FromNode(node);
  44. base::Value ret(base::Value::Type::DICTIONARY);
  45. // Document specific properties. These are emitted in a nested dictionary, as
  46. // a frame node can be reused for different documents.
  47. base::Value doc(base::Value::Type::DICTIONARY);
  48. doc.SetStringKey("url", impl->document_.url.value().possibly_invalid_spec());
  49. doc.SetBoolKey("has_nonempty_beforeunload",
  50. impl->document_.has_nonempty_beforeunload);
  51. doc.SetBoolKey("network_almost_idle",
  52. impl->document_.network_almost_idle.value());
  53. doc.SetBoolKey("had_form_interaction",
  54. impl->document_.had_form_interaction.value());
  55. ret.SetKey("document", std::move(doc));
  56. // Frame node properties.
  57. ret.SetIntKey("render_frame_id", impl->render_frame_id_);
  58. ret.SetStringKey("frame_token", impl->frame_token_.value().ToString());
  59. ret.SetIntKey("browsing_instance_id", impl->browsing_instance_id_.value());
  60. ret.SetIntKey("site_instance_id", impl->site_instance_id_.value());
  61. ret.SetStringKey("lifecycle_state",
  62. MojoEnumToString(impl->lifecycle_state_.value()));
  63. ret.SetBoolKey("is_ad_frame", impl->is_ad_frame_.value());
  64. ret.SetBoolKey("is_holding_weblock", impl->is_holding_weblock_.value());
  65. ret.SetBoolKey("is_holding_indexeddb_lock",
  66. impl->is_holding_indexeddb_lock_.value());
  67. ret.SetBoolKey("is_current", impl->is_current_.value());
  68. ret.SetKey("priority",
  69. PriorityAndReasonToValue(impl->priority_and_reason_.value()));
  70. ret.SetBoolKey("is_audible", impl->is_audible_.value());
  71. ret.SetStringKey(
  72. "viewport_intersection",
  73. ViewportIntersectionToString(impl->viewport_intersection_.value()));
  74. ret.SetStringKey("visibility",
  75. FrameNodeVisibilityToString(impl->visibility_.value()));
  76. return ret;
  77. }
  78. } // namespace performance_manager