blob: 9522f65c2e838cdbf2cff89e0a7b9e39bb50343d [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() {
// Returns the bounding rectangle wrt to the top-most document.
function getBoundingRect(el) {
var client_rect = el.getBoundingClientRect();
var bound = { left: client_rect.left,
top: client_rect.top,
width: client_rect.width,
height: client_rect.height };
var frame = el.ownerDocument.defaultView.frameElement;
while (frame) {
var frame_bound = frame.getBoundingClientRect();
// This computation doesn't account for more complex CSS transforms on the
// frame (e.g. scaling or rotations).
bound.left += frame_bound.left;
bound.top += frame_bound.top;
frame = frame.ownerDocument.frameElement;
}
return bound;
}
function getBoundingVisibleRect(el) {
var rect = getBoundingRect(el);
if (rect.top < 0) {
rect.height += rect.top;
rect.top = 0;
}
if (rect.left < 0) {
rect.width += rect.left;
rect.left = 0;
}
// TODO(ymalik): Remove the fallback path once the visualViewportHeight and
// visualViewportWidth properties roll into stable.
var visualViewportHeight = window.innerHeight;
var visualViewportWidth = window.innerWidth;
if (chrome.gpuBenchmarking.visualViewportHeight) {
visualViewportHeight = chrome.gpuBenchmarking.visualViewportHeight();
}
if (chrome.gpuBenchmarking.visualViewportWidth) {
visualViewportWidth = chrome.gpuBenchmarking.visualViewportWidth();
}
var outsideHeight = (rect.top + rect.height) - visualViewportHeight;
var outsideWidth = (rect.left + rect.width) - visualViewportWidth;
if (outsideHeight > 0) {
rect.height -= outsideHeight;
}
if (outsideWidth > 0) {
rect.width -= outsideWidth;
}
return rect;
};
window.__GestureCommon_GetBoundingVisibleRect = getBoundingVisibleRect;
})();