blob: 4dd24b3dfcb7464ee440eff9405f18bba5fef28a [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.ui.IframeMaskTest');
goog.setTestOnly('goog.ui.IframeMaskTest');
goog.require('goog.dom');
goog.require('goog.dom.TagName');
goog.require('goog.dom.iframe');
goog.require('goog.structs.Pool');
goog.require('goog.style');
goog.require('goog.testing.MockClock');
goog.require('goog.testing.StrictMock');
goog.require('goog.testing.jsunit');
goog.require('goog.ui.IframeMask');
goog.require('goog.ui.Popup');
goog.require('goog.ui.PopupBase');
goog.require('goog.userAgent');
var iframeMask;
var mockClock;
function setUp() {
goog.dom.getElement('sandbox').innerHTML = '<div id="popup"></div>';
mockClock = new goog.testing.MockClock(true);
iframeMask = new goog.ui.IframeMask();
}
function tearDown() {
iframeMask.dispose();
mockClock.dispose();
assertNoIframes();
}
function findOneAndOnlyIframe() {
var iframes = document.getElementsByTagName(goog.dom.TagName.IFRAME);
assertEquals('There should be exactly 1 iframe in the document',
1, iframes.length);
return iframes[0];
}
function assertNoIframes() {
assertEquals('Expected no iframes in the document', 0,
goog.dom.getElementsByTagNameAndClass(goog.dom.TagName.IFRAME).length);
}
function testApplyFullScreenMask() {
iframeMask.applyMask();
var iframe = findOneAndOnlyIframe();
assertEquals('block', iframe.style.display);
assertEquals('absolute', iframe.style.position);
// coerce zindex to a string
assertEquals('1', iframe.style.zIndex + '');
iframeMask.hideMask();
assertEquals('none', iframe.style.display);
}
function testApplyOpacity() {
iframeMask.setOpacity(0.3);
iframeMask.applyMask();
if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) {
assertContains('Expected opactity to be set in the CSS style',
'30', findOneAndOnlyIframe().style.cssText);
} else {
assertContains('Expected opactity to be set in the CSS style',
'0.3', findOneAndOnlyIframe().style.cssText);
}
}
function testApplyZIndex() {
iframeMask.setZIndex(5);
iframeMask.applyMask();
// coerce zindex to a string
assertEquals('5', findOneAndOnlyIframe().style.zIndex + '');
}
function testSnapElement() {
iframeMask.setSnapElement(goog.dom.getElement('popup'));
iframeMask.applyMask();
var iframe = findOneAndOnlyIframe();
var bounds = goog.style.getBounds(iframe);
assertEquals(100, bounds.left);
assertEquals(900, bounds.top);
assertEquals(300, bounds.width);
assertEquals(400, bounds.height);
iframeMask.setSnapElement(document.documentElement);
// Make sure that snapping to a different element changes the bounds.
assertNotEquals('Snap element not updated',
400, goog.style.getBounds(iframe).height);
}
function testAttachToPopup() {
var popup = new goog.ui.Popup(goog.dom.getElement('popup'));
iframeMask.listenOnTarget(popup, goog.ui.PopupBase.EventType.SHOW,
goog.ui.PopupBase.EventType.HIDE, goog.dom.getElement('popup'));
assertNoIframes();
popup.setVisible(true);
assertNoIframes();
// Tick because the showing of the iframe mask happens asynchronously.
// (Otherwise the handling of the mousedown can take so long that a bounce
// occurs).
mockClock.tick(1);
var iframe = findOneAndOnlyIframe();
var bounds = goog.style.getBounds(iframe);
assertEquals(300, bounds.width);
assertEquals(400, bounds.height);
assertEquals('block', iframe.style.display);
popup.setVisible(false);
assertEquals('none', iframe.style.display);
}
function testQuickHidingPopup() {
var popup = new goog.ui.Popup(goog.dom.getElement('popup'));
iframeMask.listenOnTarget(popup, goog.ui.PopupBase.EventType.SHOW,
goog.ui.PopupBase.EventType.HIDE);
assertNoIframes();
popup.setVisible(true);
assertNoIframes();
popup.setVisible(false);
assertNoIframes();
// Tick because the showing of the iframe mask happens asynchronously.
// (Otherwise the handling of the mousedown can take so long that a bounce
// occurs).
mockClock.tick(1);
assertNoIframes();
}
function testRemoveHandlers() {
var popup = new goog.ui.Popup(goog.dom.getElement('popup'));
iframeMask.listenOnTarget(popup, goog.ui.PopupBase.EventType.SHOW,
goog.ui.PopupBase.EventType.HIDE);
iframeMask.removeHandlers();
popup.setVisible(true);
// Tick because the showing of the iframe mask happens asynchronously.
// (Otherwise the handling of the mousedown can take so long that a bounce
// occurs).
mockClock.tick(1);
assertNoIframes();
}
function testIframePool() {
var iframe = goog.dom.iframe.createBlank(goog.dom.getDomHelper());
var mockPool = new goog.testing.StrictMock(goog.structs.Pool);
mockPool.getObject();
mockPool.$returns(iframe);
mockPool.$replay();
iframeMask.dispose();
// Create a new iframe mask with a pool, and verify that it checks
// its iframe out of the pool instead of creating one.
iframeMask = new goog.ui.IframeMask(null, mockPool);
iframeMask.applyMask();
mockPool.$verify();
findOneAndOnlyIframe();
mockPool.$reset();
mockPool.releaseObject(iframe);
mockPool.$replay();
// When the iframe mask has a pool, the pool is responsible for
// removing the iframe from the DOM.
iframeMask.hideMask();
mockPool.$verify();
findOneAndOnlyIframe();
// And showing the iframe again should check it out of the pool again.
mockPool.$reset();
mockPool.getObject();
mockPool.$returns(iframe);
mockPool.$replay();
iframeMask.applyMask();
mockPool.$verify();
// When the test is over, the iframe mask should be disposed. Make sure
// that the pool removes the iframe from the page.
mockPool.$reset();
mockPool.releaseObject(iframe);
mockPool.$does(function() {
goog.dom.removeNode(iframe);
});
mockPool.$replay();
}