blob: c3840e86ec09c6e30d2256812614645ab98e3505 [file] [log] [blame]
// 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
};
});