| // Copyright (c) 2012 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. |
| |
| cr.define('tracing', function() { |
| /** |
| * Uses an embedded iframe to measure provided elements without forcing layout |
| * on the main document. |
| * @constructor |
| * @extends {Object} |
| */ |
| function MeasuringStick() { |
| var iframe = document.createElement('iframe'); |
| iframe.style.cssText = 'width:100%;height:0;border:0;visibility:hidden'; |
| document.body.appendChild(iframe); |
| this._doc = iframe.contentDocument; |
| this._window = iframe.contentWindow; |
| this._doc.body.style.cssText = 'padding:0;margin:0;overflow:hidden'; |
| |
| var stylesheets = document.querySelectorAll('link[rel=stylesheet]'); |
| for (var i = 0; i < stylesheets.length; i++) { |
| var stylesheet = stylesheets[i]; |
| var link = this._doc.createElement('link'); |
| link.rel = 'stylesheet'; |
| link.href = stylesheet.href; |
| this._doc.head.appendChild(link); |
| } |
| } |
| |
| MeasuringStick.prototype = { |
| __proto__: Object.prototype, |
| |
| /** |
| * Measures the provided element without forcing layout on the main |
| * document. |
| */ |
| measure: function(element) { |
| this._doc.body.appendChild(element); |
| var style = this._window.getComputedStyle(element); |
| var width = parseInt(style.width, 10); |
| var height = parseInt(style.height, 10); |
| this._doc.body.removeChild(element); |
| return { width: width, height: height }; |
| } |
| }; |
| |
| return { |
| MeasuringStick: MeasuringStick |
| }; |
| }); |