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

Unified Diff: chrome/renderer/extensions/automation_internal_custom_bindings.cc

Issue 2911553002: Fix automation API bounding boxes on high-dpi devices (Closed)
Patch Set: Add comment about mutating cache 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 side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/extensions/automation_internal_custom_bindings.cc
diff --git a/chrome/renderer/extensions/automation_internal_custom_bindings.cc b/chrome/renderer/extensions/automation_internal_custom_bindings.cc
index 9241f859718a90edfbbbf968647db336ae95b772..89a19c6ad1a9dfdf49704029ccbc007b7d4b76c6 100644
--- a/chrome/renderer/extensions/automation_internal_custom_bindings.cc
+++ b/chrome/renderer/extensions/automation_internal_custom_bindings.cc
@@ -128,6 +128,10 @@ static gfx::Rect ComputeGlobalNodeBounds(TreeCache* cache,
if (node->data().transform)
node->data().transform->TransformRect(&bounds);
+ // Walk up to this node's container. This may cross a tree
+ // boundary, in which case GetParent() modifies |cache|, so we
+ // save the old cache temporarily.
+ TreeCache* previous_cache = cache;
ui::AXNode* container =
cache->tree.GetFromId(node->data().offset_container_id);
if (!container) {
@@ -141,6 +145,16 @@ static gfx::Rect ComputeGlobalNodeBounds(TreeCache* cache,
if (!container || container == node)
break;
+ // All trees other than the desktop tree are scaled by the device
+ // scale factor. When crossing out of another tree into the desktop
+ // tree, unscale the bounds by the device scale factor.
+ if (previous_cache->tree_id != api::automation::kDesktopTreeID &&
+ cache->tree_id == api::automation::kDesktopTreeID) {
+ float scale_factor = cache->owner->GetDeviceScaleFactor();
+ if (scale_factor > 0)
+ bounds.Scale(1.0 / scale_factor);
+ }
+
gfx::RectF container_bounds = container->data().location;
bounds.Offset(container_bounds.x(), container_bounds.y());
@@ -154,17 +168,6 @@ static gfx::Rect ComputeGlobalNodeBounds(TreeCache* cache,
node = container;
}
- // All trees other than the desktop tree are scaled by the device
- // scale factor. Unscale them so they're all in consistent units.
- if (cache->tree_id != api::automation::kDesktopTreeID) {
- float scale_factor = cache->owner->context()
- ->GetRenderFrame()
- ->GetRenderView()
- ->GetDeviceScaleFactor();
- if (scale_factor > 0)
- bounds.Scale(1.0 / scale_factor);
- }
-
return gfx::ToEnclosingRect(bounds);
}
@@ -1093,6 +1096,10 @@ ui::AXNode* AutomationInternalCustomBindings::GetParent(
return nullptr;
}
+float AutomationInternalCustomBindings::GetDeviceScaleFactor() const {
+ return context()->GetRenderFrame()->GetRenderView()->GetDeviceScaleFactor();
+}
+
void AutomationInternalCustomBindings::RouteTreeIDFunction(
const std::string& name,
TreeIDFunction callback) {

Powered by Google App Engine
This is Rietveld 408576698