// 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. base.exportTo('tracing', function() { /** * Uses an embedded iframe to measure provided elements without forcing layout * on the main document. You must call attach() on the stick before using it, * and call detach() on it when you are done using it. * @constructor * @extends {Object} */ function MeasuringStick() { this.iframe_ = undefined; } MeasuringStick.prototype = { __proto__: Object.prototype, /** * Measures the provided element without forcing layout on the main * document. */ measure: function(element) { this.iframe_.contentDocument.body.appendChild(element); var style = this.iframe_.contentWindow.getComputedStyle(element); var width = parseInt(style.width, 10); var height = parseInt(style.height, 10); this.iframe_.contentDocument.body.removeChild(element); return { width: width, height: height }; }, attach: function() { var iframe = document.createElement('iframe'); iframe.style.cssText = 'width:100%;height:0;border:0;visibility:hidden'; document.body.appendChild(iframe); this.iframe_ = iframe; this.iframe_.contentDocument.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.iframe_.contentDocument.createElement('link'); link.rel = 'stylesheet'; link.href = stylesheet.href; this.iframe_.contentDocument.head.appendChild(link); } }, detach: function() { document.body.removeChild(this.iframe_); this.iframe_ = undefined; } }; return { MeasuringStick: MeasuringStick }; });