blob: 93fb2c7b29cefaca4a61aa9e55fc3c57fdbecc78 [file] [log] [blame]
// Copyright 2008 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.
goog.provide('goog.dom.FontSizeMonitorTest');
goog.setTestOnly('goog.dom.FontSizeMonitorTest');
goog.require('goog.dom');
goog.require('goog.dom.FontSizeMonitor');
goog.require('goog.events');
goog.require('goog.events.Event');
goog.require('goog.testing.PropertyReplacer');
goog.require('goog.testing.events');
goog.require('goog.testing.jsunit');
goog.require('goog.userAgent');
function isBuggyGecko() {
return goog.userAgent.GECKO && !goog.userAgent.isVersionOrHigher('1.9');
}
var monitor;
function setUp() {
monitor = new goog.dom.FontSizeMonitor();
}
function tearDown() {
monitor.dispose();
}
function getResizeTarget() {
return goog.userAgent.IE ? monitor.sizeElement_ :
goog.dom.getFrameContentWindow(monitor.sizeElement_);
}
function testFontSizeNoChange() {
// This tests that firing the resize event without changing the font-size
// does not trigger the event.
var fired = false;
goog.events.listen(monitor, goog.dom.FontSizeMonitor.EventType.CHANGE,
function(e) {
fired = true;
});
var resizeEvent = new goog.events.Event('resize', getResizeTarget());
goog.testing.events.fireBrowserEvent(resizeEvent);
assertFalse('The font size should not have changed', fired);
}
function testFontSizeChanged() {
// One can trigger the iframe resize by changing the
// document.body.style.fontSize but the event is fired asynchronously in
// Firefox. Instead, we just override the lastWidth_ to simulate that the
// size changed.
var fired = false;
goog.events.listen(monitor, goog.dom.FontSizeMonitor.EventType.CHANGE,
function(e) {
fired = true;
});
monitor.lastWidth_--;
var resizeEvent = new goog.events.Event('resize', getResizeTarget());
goog.testing.events.fireBrowserEvent(resizeEvent);
assertTrue('The font size should have changed', fired);
}
function testCreateAndDispose() {
var frameCount = window.frames.length;
var iframeElementCount = document.getElementsByTagName('iframe').length;
var divElementCount = document.getElementsByTagName('div').length;
var monitor = new goog.dom.FontSizeMonitor();
monitor.dispose();
var newFrameCount = window.frames.length;
var newIframeElementCount = document.getElementsByTagName('iframe').length;
var newDivElementCount = document.getElementsByTagName('div').length;
assertEquals('There should be no trailing frames',
frameCount + isBuggyGecko(), newFrameCount);
assertEquals('There should be no trailing iframe elements',
iframeElementCount + isBuggyGecko(),
newIframeElementCount);
assertEquals('There should be no trailing div elements',
divElementCount, newDivElementCount);
}
function testWithDomHelper() {
var frameCount = window.frames.length;
var iframeElementCount = document.getElementsByTagName('iframe').length;
var divElementCount = document.getElementsByTagName('div').length;
var monitor = new goog.dom.FontSizeMonitor(goog.dom.getDomHelper());
var newFrameCount = window.frames.length;
var newIframeElementCount = document.getElementsByTagName('iframe').length;
var newDivElementCount = document.getElementsByTagName('div').length;
if (goog.userAgent.IE) {
assertEquals('There should be one new div element',
divElementCount + 1, newDivElementCount);
} else {
assertEquals('There should be one new frame',
frameCount + 1, newFrameCount);
assertEquals('There should be one new iframe element',
iframeElementCount + 1, newIframeElementCount);
}
// Use the first iframe in the doc. This is added in the HTML markup.
var win = window.frames[0];
var doc = win.document;
doc.open();
doc.write('<html><body></body></html>');
doc.close();
var domHelper = goog.dom.getDomHelper(doc);
var frameCount2 = win.frames.length;
var iframeElementCount2 = doc.getElementsByTagName('iframe').length;
var divElementCount2 = doc.getElementsByTagName('div').length;
var monitor2 = new goog.dom.FontSizeMonitor(domHelper);
var newFrameCount2 = win.frames.length;
var newIframeElementCount2 = doc.getElementsByTagName('iframe').length;
var newDivElementCount2 = doc.getElementsByTagName('div').length;
if (goog.userAgent.IE) {
assertEquals('There should be one new div element',
divElementCount2 + 1, newDivElementCount2);
} else {
assertEquals('There should be one new frame', frameCount2 + 1,
newFrameCount2);
assertEquals('There should be one new iframe element',
iframeElementCount2 + 1, newIframeElementCount2);
}
monitor.dispose();
monitor2.dispose();
}
function testEnsureThatDocIsOpenedForGecko() {
var pr = new goog.testing.PropertyReplacer();
pr.set(goog.userAgent, 'GECKO', true);
pr.set(goog.userAgent, 'IE', false);
var openCalled = false;
var closeCalled = false;
var instance = {
document: {
open: function() {
openCalled = true;
},
close: function() {
closeCalled = true;
}
},
attachEvent: function() {}
};
pr.set(goog.dom, 'getFrameContentWindow', function() {
return instance;
});
try {
var monitor = new goog.dom.FontSizeMonitor();
assertTrue('doc.open should have been called', openCalled);
assertTrue('doc.close should have been called', closeCalled);
monitor.dispose();
} finally {
pr.reset();
}
}
function testFirefox2WorkAroundFirefox3() {
var pr = new goog.testing.PropertyReplacer();
pr.set(goog.userAgent, 'GECKO', true);
pr.set(goog.userAgent, 'IE', false);
try {
// 1.9 should clear iframes
pr.set(goog.userAgent, 'VERSION', '1.9');
goog.userAgent.isVersionOrHigherCache_ = {};
var frameCount = window.frames.length;
var iframeElementCount = document.getElementsByTagName('iframe').length;
var divElementCount = document.getElementsByTagName('div').length;
var monitor = new goog.dom.FontSizeMonitor();
monitor.dispose();
var newFrameCount = window.frames.length;
var newIframeElementCount = document.getElementsByTagName('iframe').length;
var newDivElementCount = document.getElementsByTagName('div').length;
assertEquals('There should be no trailing frames',
frameCount, newFrameCount);
assertEquals('There should be no trailing iframe elements',
iframeElementCount,
newIframeElementCount);
assertEquals('There should be no trailing div elements',
divElementCount, newDivElementCount);
} finally {
pr.reset();
}
}
function testFirefox2WorkAroundFirefox2() {
var pr = new goog.testing.PropertyReplacer();
pr.set(goog.userAgent, 'GECKO', true);
pr.set(goog.userAgent, 'IE', false);
try {
// 1.8 should NOT clear iframes
pr.set(goog.userAgent, 'VERSION', '1.8');
goog.userAgent.isVersionOrHigherCache_ = {};
var frameCount = window.frames.length;
var iframeElementCount = document.getElementsByTagName('iframe').length;
var divElementCount = document.getElementsByTagName('div').length;
var monitor = new goog.dom.FontSizeMonitor();
monitor.dispose();
var newFrameCount = window.frames.length;
var newIframeElementCount = document.getElementsByTagName('iframe').length;
var newDivElementCount = document.getElementsByTagName('div').length;
assertEquals('There should be no trailing frames',
frameCount + 1, newFrameCount);
assertEquals('There should be no trailing iframe elements',
iframeElementCount + 1,
newIframeElementCount);
assertEquals('There should be no trailing div elements',
divElementCount, newDivElementCount);
} finally {
pr.reset();
}
}