accessibility-developer-tools
Version:
This is a library of accessibility-related testing and utility code.
219 lines (177 loc) • 6.43 kB
JavaScript
// 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 = goog.dom.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();
}