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

Side by Side Diff: telemetry/telemetry/internal/actions/gesture_common.js

Issue 3017493002: Fix coordinate calculations under pinch-zoom
Patch Set: Created 3 years, 3 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 // This file provides common functionality for synthetic gesture actions. 5 // This file provides common functionality for synthetic gesture actions.
6 'use strict'; 6 'use strict';
7 7
8 (function() { 8 (function() {
9 9
10 // Make sure functions are injected only once. 10 // Make sure functions are injected only once.
11 if (window.__GestureCommon_GetBoundingVisibleRect) 11 if (window.__GestureCommon_GetBoundingVisibleRect)
12 return; 12 return;
13 13
14 // Returns the bounding rectangle wrt to the top-most document. 14 // Returns the bounding rectangle wrt to the layout viewport.
15 function getBoundingRect(el) { 15 function getBoundingRect(el) {
16 var clientRect = el.getBoundingClientRect(); 16 var clientRect = el.getBoundingClientRect();
17 var bound = { left: clientRect.left, 17 var bound = { left: clientRect.left,
18 top: clientRect.top, 18 top: clientRect.top,
19 width: clientRect.width, 19 width: clientRect.width,
20 height: clientRect.height }; 20 height: clientRect.height };
21 21
22 var frame = el.ownerDocument.defaultView.frameElement; 22 var frame = el.ownerDocument.defaultView.frameElement;
23 while (frame) { 23 while (frame) {
24 var frameBound = frame.getBoundingClientRect(); 24 var frameBound = frame.getBoundingClientRect();
25 // This computation doesn't account for more complex CSS transforms on the 25 // This computation doesn't account for more complex CSS transforms on the
26 // frame (e.g. scaling or rotations). 26 // frame (e.g. scaling or rotations).
27 bound.left += frameBound.left; 27 bound.left += frameBound.left;
28 bound.top += frameBound.top; 28 bound.top += frameBound.top;
29 29
30 frame = frame.ownerDocument.frameElement; 30 frame = frame.ownerDocument.frameElement;
31 } 31 }
32 return bound; 32 return bound;
33 } 33 }
34 34
35 // TODO(ulan): Remove this function once
36 // chrome.gpuBenchmarking.pageScaleFactor is available in reference builds.
37 function getPageScaleFactor() {
38 if (chrome.gpuBenchmarking.pageScaleFactor)
39 return chrome.gpuBenchmarking.pageScaleFactor();
40 return 1;
41 }
42
43 // Zoom-independent window height. See crbug.com/627123 for more details. 35 // Zoom-independent window height. See crbug.com/627123 for more details.
44 function getWindowHeight() { 36 function getWindowHeight() {
45 return getPageScaleFactor() * chrome.gpuBenchmarking.visualViewportHeight(); 37 return chrome.gpuBenchmarking.pageScaleFactor() *
38 chrome.gpuBenchmarking.visualViewportHeight();
46 } 39 }
47 40
48 // Zoom-independent window width. See crbug.com/627123 for more details. 41 // Zoom-independent window width. See crbug.com/627123 for more details.
49 function getWindowWidth() { 42 function getWindowWidth() {
50 return getPageScaleFactor() * chrome.gpuBenchmarking.visualViewportWidth(); 43 return chrome.gpuBenchmarking.pageScaleFactor() *
44 chrome.gpuBenchmarking.visualViewportWidth();
51 } 45 }
52 46
53 function clamp(min, value, max) { 47 function clamp(min, value, max) {
54 return Math.min(Math.max(min, value), max); 48 return Math.min(Math.max(min, value), max);
55 } 49 }
56 50
51 // Returns the bounding rect in the visual viewport's coordinates.
57 function getBoundingVisibleRect(el) { 52 function getBoundingVisibleRect(el) {
58 // Get the element bounding rect. 53 // Get the element bounding rect.
59 var rect = getBoundingRect(el); 54 var rect = getBoundingRect(el);
60 55
56 // TODO(bokan): Remove this once gpuBenchmarking is changed to take all
57 // coordinates in viewport space. crbug.com/610021.
58 if ('gesturesExpectedInViewportCoordinates' in chrome.gpuBenchmarking) {
ericrk 2017/09/15 16:41:04 So, to make sure I understand, this code is the ne
bokan 2017/09/17 05:48:51 That's right. Once that CL lands the code guarded
59 // Apply the visual viewport transform (i.e. pinch-zoom) to the bounding
60 // rect.
61 const scale = chrome.gpuBenchmarking.pageScaleFactor();
62 const visualViewportX = chrome.gpuBenchmarking.visualViewportX();
63 const visualViewportY = chrome.gpuBenchmarking.visualViewportY();
64 rect.top = (rect.top - visualViewportY) * scale;
65 rect.left = (rect.left - visualViewportX) * scale;
66 rect.width *= scale;
ericrk 2017/09/15 16:41:04 So, I think your code is correct, but I want to ma
bokan 2017/09/17 05:48:51 Your understanding is correct. These values are in
67 rect.height *= scale;
68 }
69
61 // Get the window dimensions. 70 // Get the window dimensions.
62 var windowHeight = getWindowHeight(); 71 const windowHeight = getWindowHeight();
63 var windowWidth = getWindowWidth(); 72 const windowWidth = getWindowWidth();
64 73
65 // Then clip the rect to the screen size. 74 // Then clip the rect to the screen size.
66 rect.top = clamp(0, rect.top, windowHeight); 75 rect.top = clamp(0, rect.top, windowHeight);
67 rect.left = clamp(0, rect.left, windowWidth); 76 rect.left = clamp(0, rect.left, windowWidth);
68 rect.height = clamp(0, rect.height, windowHeight - rect.top); 77 rect.height = clamp(0, rect.height, windowHeight - rect.top);
69 rect.width = clamp(0, rect.width, windowWidth - rect.left); 78 rect.width = clamp(0, rect.width, windowWidth - rect.left);
70 79
71 return rect; 80 return rect;
72 } 81 }
73 82
74 window.__GestureCommon_GetBoundingVisibleRect = getBoundingVisibleRect; 83 window.__GestureCommon_GetBoundingVisibleRect = getBoundingVisibleRect;
75 window.__GestureCommon_GetWindowHeight = getWindowHeight; 84 window.__GestureCommon_GetWindowHeight = getWindowHeight;
76 window.__GestureCommon_GetWindowWidth = getWindowWidth; 85 window.__GestureCommon_GetWindowWidth = getWindowWidth;
77 })(); 86 })();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698