blob: ec76ebaedb258ba8a7a2db3eec455dd3baee7273 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This file provides common functionality for synthetic gesture actions.
'use strict';
(function() {
// Make sure functions are injected only once.
if (window.__GestureCommon_GetBoundingVisibleRect)
return;
// Returns the bounding rectangle wrt to the top-most document.
function getBoundingRect(el) {
var clientRect = el.getBoundingClientRect();
var bound = { left: clientRect.left,
top: clientRect.top,
width: clientRect.width,
height: clientRect.height };
var frame = el.ownerDocument.defaultView.frameElement;
while (frame) {
var frameBound = frame.getBoundingClientRect();
// This computation doesn't account for more complex CSS transforms on the
// frame (e.g. scaling or rotations).
bound.left += frameBound.left;
bound.top += frameBound.top;
frame = frame.ownerDocument.frameElement;
}
return bound;
}
// TODO(ulan): Remove this function once
// chrome.gpuBenchmarking.pageScaleFactor is available in reference builds.
function getPageScaleFactor() {
if (chrome.gpuBenchmarking.pageScaleFactor)
return chrome.gpuBenchmarking.pageScaleFactor();
return 1;
}
// Zoom-independent window height. See crbug.com/627123 for more details.
function getWindowHeight() {
return getPageScaleFactor() * chrome.gpuBenchmarking.visualViewportHeight();
}
// Zoom-independent window width. See crbug.com/627123 for more details.
function getWindowWidth() {
return getPageScaleFactor() * chrome.gpuBenchmarking.visualViewportWidth();
}
function clamp(min, value, max) {
return Math.min(Math.max(min, value), max);
}
function getBoundingVisibleRect(el) {
// Get the element bounding rect.
var rect = getBoundingRect(el);
// Get the window dimensions.
var windowHeight = getWindowHeight();
var windowWidth = getWindowWidth();
// Then clip the rect to the screen size.
rect.top = clamp(0, rect.top, windowHeight);
rect.left = clamp(0, rect.left, windowWidth);
rect.height = clamp(0, rect.height, windowHeight - rect.top);
rect.width = clamp(0, rect.width, windowWidth - rect.left);
return rect;
}
window.__GestureCommon_GetBoundingVisibleRect = getBoundingVisibleRect;
window.__GestureCommon_GetWindowHeight = getWindowHeight;
window.__GestureCommon_GetWindowWidth = getWindowWidth;
})();