// Copyright 2011 The Closure Library Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS-IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** * @fileoverview Utilities for inspecting page layout. This is a port of * http://go/layoutbot.java * See {@link http://go/layouttesting}. */ goog.setTestOnly('goog.testing.style'); goog.provide('goog.testing.style'); goog.require('goog.dom'); goog.require('goog.math.Rect'); goog.require('goog.style'); /** * Determines whether the bounding rectangles of the given elements intersect. * @param {Element} element The first element. * @param {Element} otherElement The second element. * @return {boolean} Whether the bounding rectangles of the given elements * intersect. */ goog.testing.style.intersects = function(element, otherElement) { var elementRect = goog.style.getBounds(element); var otherElementRect = goog.style.getBounds(otherElement); return goog.math.Rect.intersects(elementRect, otherElementRect); }; /** * Determines whether the element has visible dimensions, i.e. x > 0 && y > 0. * @param {Element} element The element to check. * @return {boolean} Whether the element has visible dimensions. */ goog.testing.style.hasVisibleDimensions = function(element) { var elSize = goog.style.getSize(element); var shortest = elSize.getShortest(); if (shortest <= 0) { return false; } return true; }; /** * Determines whether the CSS style of the element renders it visible. * @param {!Element} element The element to check. * @return {boolean} Whether the CSS style of the element renders it visible. */ goog.testing.style.isVisible = function(element) { var visibilityStyle = goog.testing.style.getAvailableStyle_(element, 'visibility'); var displayStyle = goog.testing.style.getAvailableStyle_(element, 'display'); return (visibilityStyle != 'hidden' && displayStyle != 'none'); }; /** * Test whether the given element is on screen. * @param {!Element} el The element to test. * @return {boolean} Whether the element is on the screen. */ goog.testing.style.isOnScreen = function(el) { var doc = goog.dom.getDomHelper(el).getDocument(); var viewport = goog.style.getVisibleRectForElement(doc.body); var viewportRect = goog.math.Rect.createFromBox(viewport); return goog.dom.contains(doc, el) && goog.style.getBounds(el).intersects(viewportRect); }; /** * This is essentially goog.style.getStyle_. goog.style.getStyle_ is private * and is not a recommended way for general purpose style extractor. For the * purposes of layout testing, we only use this function for retrieving * 'visiblity' and 'display' style. * @param {!Element} element The element to retrieve the style from. * @param {string} style Style property name. * @return {string} Style value. * @private */ goog.testing.style.getAvailableStyle_ = function(element, style) { return goog.style.getComputedStyle(element, style) || goog.style.getCascadedStyle(element, style) || goog.style.getStyle(element, style); };