Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(47)

Side by Side Diff: chrome/renderer/extensions/automation_internal_custom_bindings.cc

Issue 2911553002: Fix automation API bounding boxes on high-dpi devices (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/renderer/extensions/automation_internal_custom_bindings.h" 5 #include "chrome/renderer/extensions/automation_internal_custom_bindings.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <memory> 10 #include <memory>
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 // walking up the parent hierarchy to offset by frame offsets and 121 // walking up the parent hierarchy to offset by frame offsets and
122 // scroll offsets. 122 // scroll offsets.
123 static gfx::Rect ComputeGlobalNodeBounds(TreeCache* cache, 123 static gfx::Rect ComputeGlobalNodeBounds(TreeCache* cache,
124 ui::AXNode* node, 124 ui::AXNode* node,
125 gfx::RectF local_bounds) { 125 gfx::RectF local_bounds) {
126 gfx::RectF bounds = local_bounds; 126 gfx::RectF bounds = local_bounds;
127 while (node) { 127 while (node) {
128 if (node->data().transform) 128 if (node->data().transform)
129 node->data().transform->TransformRect(&bounds); 129 node->data().transform->TransformRect(&bounds);
130 130
131 TreeCache* previous_cache = cache;
aboxhall 2017/05/26 01:04:59 Where does cache get mutated?
dmazzoni 2017/05/26 06:41:33 Commented.
131 ui::AXNode* container = 132 ui::AXNode* container =
132 cache->tree.GetFromId(node->data().offset_container_id); 133 cache->tree.GetFromId(node->data().offset_container_id);
133 if (!container) { 134 if (!container) {
134 if (node == cache->tree.root()) { 135 if (node == cache->tree.root()) {
135 container = cache->owner->GetParent(node, &cache); 136 container = cache->owner->GetParent(node, &cache);
136 } else { 137 } else {
137 container = cache->tree.root(); 138 container = cache->tree.root();
138 } 139 }
139 } 140 }
140 141
141 if (!container || container == node) 142 if (!container || container == node)
142 break; 143 break;
143 144
145 // All trees other than the desktop tree are scaled by the device
146 // scale factor. When crossing out of another tree into the desktop
147 // tree, unscale the bounds by the device scale factor.
148 if (previous_cache->tree_id != api::automation::kDesktopTreeID &&
149 cache->tree_id == api::automation::kDesktopTreeID) {
150 float scale_factor = cache->owner->GetDeviceScaleFactor();
151 if (scale_factor > 0)
152 bounds.Scale(1.0 / scale_factor);
153 }
154
144 gfx::RectF container_bounds = container->data().location; 155 gfx::RectF container_bounds = container->data().location;
145 bounds.Offset(container_bounds.x(), container_bounds.y()); 156 bounds.Offset(container_bounds.x(), container_bounds.y());
146 157
147 int scroll_x = 0; 158 int scroll_x = 0;
148 int scroll_y = 0; 159 int scroll_y = 0;
149 if (container->data().GetIntAttribute(ui::AX_ATTR_SCROLL_X, &scroll_x) && 160 if (container->data().GetIntAttribute(ui::AX_ATTR_SCROLL_X, &scroll_x) &&
150 container->data().GetIntAttribute(ui::AX_ATTR_SCROLL_Y, &scroll_y)) { 161 container->data().GetIntAttribute(ui::AX_ATTR_SCROLL_Y, &scroll_y)) {
151 bounds.Offset(-scroll_x, -scroll_y); 162 bounds.Offset(-scroll_x, -scroll_y);
152 } 163 }
153 164
154 node = container; 165 node = container;
155 } 166 }
156 167
157 // All trees other than the desktop tree are scaled by the device
158 // scale factor. Unscale them so they're all in consistent units.
159 if (cache->tree_id != api::automation::kDesktopTreeID) {
160 float scale_factor = cache->owner->context()
161 ->GetRenderFrame()
162 ->GetRenderView()
163 ->GetDeviceScaleFactor();
164 if (scale_factor > 0)
165 bounds.Scale(1.0 / scale_factor);
166 }
167
168 return gfx::ToEnclosingRect(bounds); 168 return gfx::ToEnclosingRect(bounds);
169 } 169 }
170 170
171 ui::AXNode* FindNodeWithChildTreeId(ui::AXNode* node, int child_tree_id) { 171 ui::AXNode* FindNodeWithChildTreeId(ui::AXNode* node, int child_tree_id) {
172 if (child_tree_id == node->data().GetIntAttribute(ui::AX_ATTR_CHILD_TREE_ID)) 172 if (child_tree_id == node->data().GetIntAttribute(ui::AX_ATTR_CHILD_TREE_ID))
173 return node; 173 return node;
174 174
175 for (int i = 0; i < node->child_count(); ++i) { 175 for (int i = 0; i < node->child_count(); ++i) {
176 ui::AXNode* result = 176 ui::AXNode* result =
177 FindNodeWithChildTreeId(node->ChildAtIndex(i), child_tree_id); 177 FindNodeWithChildTreeId(node->ChildAtIndex(i), child_tree_id);
(...skipping 908 matching lines...) Expand 10 before | Expand all | Expand 10 after
1086 (*in_out_cache)->tree_id); 1086 (*in_out_cache)->tree_id);
1087 if (parent) { 1087 if (parent) {
1088 (*in_out_cache)->parent_node_id_from_parent_tree = parent->id(); 1088 (*in_out_cache)->parent_node_id_from_parent_tree = parent->id();
1089 *in_out_cache = parent_cache; 1089 *in_out_cache = parent_cache;
1090 return parent; 1090 return parent;
1091 } 1091 }
1092 1092
1093 return nullptr; 1093 return nullptr;
1094 } 1094 }
1095 1095
1096 float AutomationInternalCustomBindings::GetDeviceScaleFactor() const {
1097 return context()->GetRenderFrame()->GetRenderView()->GetDeviceScaleFactor();
1098 }
1099
1096 void AutomationInternalCustomBindings::RouteTreeIDFunction( 1100 void AutomationInternalCustomBindings::RouteTreeIDFunction(
1097 const std::string& name, 1101 const std::string& name,
1098 TreeIDFunction callback) { 1102 TreeIDFunction callback) {
1099 scoped_refptr<TreeIDWrapper> wrapper = new TreeIDWrapper(this, callback); 1103 scoped_refptr<TreeIDWrapper> wrapper = new TreeIDWrapper(this, callback);
1100 RouteFunction(name, base::Bind(&TreeIDWrapper::Run, wrapper)); 1104 RouteFunction(name, base::Bind(&TreeIDWrapper::Run, wrapper));
1101 } 1105 }
1102 1106
1103 void AutomationInternalCustomBindings::RouteNodeIDFunction( 1107 void AutomationInternalCustomBindings::RouteNodeIDFunction(
1104 const std::string& name, 1108 const std::string& name,
1105 NodeIDFunction callback) { 1109 NodeIDFunction callback) {
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
1429 for (auto id : ids) 1433 for (auto id : ids)
1430 nodes->AppendInteger(id); 1434 nodes->AppendInteger(id);
1431 args.Append(std::move(nodes)); 1435 args.Append(std::move(nodes));
1432 } 1436 }
1433 1437
1434 bindings_system_->DispatchEventInContext("automationInternal.onNodesRemoved", 1438 bindings_system_->DispatchEventInContext("automationInternal.onNodesRemoved",
1435 &args, nullptr, context()); 1439 &args, nullptr, context());
1436 } 1440 }
1437 1441
1438 } // namespace extensions 1442 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698