File: arc_serialization_delegate.cc

package info (click to toggle)
chromium 138.0.7204.183-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 6,080,960 kB
  • sloc: cpp: 34,937,079; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,954; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,811; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (71 lines) | stat: -rw-r--r-- 3,196 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/arc/accessibility/arc_serialization_delegate.h"

#include "chrome/browser/ash/arc/accessibility/geometry_util.h"
#include "components/exo/shell_surface.h"
#include "ui/aura/window.h"
#include "ui/compositor/layer.h"
#include "ui/display/display.h"
#include "ui/display/screen.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_delegate.h"

namespace arc {
void ArcSerializationDelegate::PopulateBounds(
    const ax::android::AccessibilityInfoDataWrapper& node,
    ui::AXNodeData& out_data) const {
  aura::Window* window = tree_source_->window();
  ax::android::AccessibilityInfoDataWrapper* root = tree_source_->GetRoot();
  gfx::Rect info_data_bounds = node.GetBounds();
  gfx::RectF& out_bounds_px = out_data.relative_bounds.bounds;

  if (window && root && exo::WMHelper::HasInstance()) {
    if (tree_source_->is_notification() ||
        tree_source_->is_input_method_window() ||
        root->GetId() != node.GetId()) {
      // By default, populate the bounds relative to the tree root.
      const gfx::Rect& root_bounds = root->GetBounds();
      info_data_bounds.Offset(-1 * root_bounds.x(), -1 * root_bounds.y());

      out_bounds_px = ScaleAndroidPxToChromePx(info_data_bounds, window);
      out_data.relative_bounds.offset_container_id = root->GetId();
    } else {
      // For the root node of application tree, populate the bounds to be
      // relative to its container View.
      views::Widget* widget = views::Widget::GetWidgetForNativeView(window);
      CHECK(widget);
      CHECK(widget->widget_delegate());
      CHECK(widget->widget_delegate()->GetContentsView());
      gfx::PointF root_origin = gfx::PointF(widget->widget_delegate()
                                                ->GetContentsView()
                                                ->GetBoundsInScreen()
                                                .origin());

      // Android sends bounds in display coordinate.
      // Make window bounds relative to display so that we can compute the
      // actual offset of a11y window bounds from ash window.
      // TODO(hirokisato): Android pi sends different coordinate.
      const display::Display display =
          display::Screen::GetScreen()->GetDisplayNearestView(window);
      root_origin.Offset(-display.bounds().x(), -display.bounds().y());

      // Adjust the origin because a maximized window has an offset in
      // Android.
      root_origin.Offset(0, -1 * GetChromeWindowHeightOffsetInDip(window));

      // Scale to Chrome pixels.
      root_origin.Scale(
          window->GetToplevelWindow()->layer()->device_scale_factor());

      out_bounds_px = ScaleAndroidPxToChromePx(info_data_bounds, window);
      out_bounds_px.Offset(-1 * root_origin.x(), -1 * root_origin.y());
    }
  } else {
    // We cannot compute global bounds, so use the raw bounds.
    out_bounds_px.SetRect(info_data_bounds.x(), info_data_bounds.y(),
                          info_data_bounds.width(), info_data_bounds.height());
  }
}
}  // namespace arc