UNPKG

sku-pg

Version:

Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!

434 lines (381 loc) 15.3 kB
<!DOCTYPE html> <html> <!-- Copyright 2007 The Closure Library Authors. All Rights Reserved. Use of this source code is governed by an Apache 2.0 License. See the COPYING file for details. --> <head> <title>Closure Unit Tests - goog.ui.Dialog</title> <script src="../base.js"></script> <script> goog.require('goog.ui.Dialog'); goog.require('goog.dom'); goog.require('goog.events'); goog.require('goog.style'); goog.require('goog.testing.events'); goog.require('goog.testing.jsunit'); </script> </head> <body> <iframe id="f" src="javascript:'<input>'"></iframe> <script> var dialog; function setUp() { dialog = new goog.ui.Dialog(); var buttons = new goog.ui.Dialog.ButtonSet(); buttons.set(goog.ui.Dialog.DefaultButtonKeys.CANCEL, 'Foo!', false, true); buttons.set(goog.ui.Dialog.DefaultButtonKeys.OK, 'OK', true); dialog.setButtonSet(buttons); dialog.setVisible(true); } function tearDown() { dialog.dispose(); } function testCrossFrameFocus() { if (goog.userAgent.IE) { return; } dialog.setVisible(false); var iframeWindow = goog.dom.getElement('f').contentWindow; var iframeInput = iframeWindow.document.getElementsByTagName('input')[0]; dialog.setButtonSet(goog.ui.Dialog.ButtonSet.OK); var buttonElement = dialog.getButtonSet().getButton(0); var focusCounter = 0; goog.events.listen(buttonElement, 'focus', function() { focusCounter++; }); iframeInput.focus(); dialog.setVisible(true); dialog.setVisible(false); iframeInput.focus(); dialog.setVisible(true); assertEquals(2, focusCounter); } function testNoTitleClose() { assertTrue(goog.style.isElementShown(dialog.getTitleCloseElement())); dialog.setHasTitleCloseButton(false); assertFalse(goog.style.isElementShown(dialog.getTitleCloseElement())); } /** * Helper that clicks the first button in the dialog and checks if that * results in a goog.ui.Dialog.EventType.SELECT being dispatched. * @param {boolean} disableButton Whether to disable the button being * tested. * @return {boolean} Whether a goog.ui.Dialog.EventType.SELECT was dispatched. */ function checkSelectDispatchedOnButtonClick(disableButton) { var aButton = dialog.getButtonElement().getElementsByTagName('BUTTON')[0]; assertNotEquals(aButton, null); aButton.disabled = disableButton; var wasCalled = false; var callRecorder = function() { wasCalled = true; }; goog.events.listen(dialog, goog.ui.Dialog.EventType.SELECT, callRecorder); goog.testing.events.fireClickSequence(aButton); return wasCalled; } function testButtonClicksDispatchSelectEvents() { assertTrue('Select event should be dispatched' + ' when clicking on an enabled button', checkSelectDispatchedOnButtonClick(false)); } function testDisabledButtonClicksDontDispatchSelectEvents() { assertFalse('Select event should not be dispatched' + ' when clicking on a disabled button', checkSelectDispatchedOnButtonClick(true)); } function testEnterKeyDispatchesDefaultSelectEvents() { var okButton = dialog.getButtonElement().getElementsByTagName('BUTTON')[1]; assertNotEquals(okButton, null); var wasCalled = false; var callRecorder = function() { wasCalled = true; }; goog.events.listen(dialog, goog.ui.Dialog.EventType.SELECT, callRecorder); // Test that event is not dispatched when default button is disabled. okButton.disabled = true; goog.testing.events.fireKeySequence(dialog.getElement(), goog.events.KeyCodes.ENTER); assertFalse(wasCalled); // Test that event is dispatched when default button is enabled. okButton.disabled = false; goog.testing.events.fireKeySequence(dialog.getElement(), goog.events.KeyCodes.ENTER); assertTrue(wasCalled); } function testEnterKeyDoesNothingOnSpecialFormElements() { dialog.setContent('<textarea>Hello dialog</textarea>'); var textarea = dialog.getContentElement(). getElementsByTagName('TEXTAREA')[0]; var wasCalled = false; var callRecorder = function() { wasCalled = true; }; goog.events.listen(dialog, goog.ui.Dialog.EventType.SELECT, callRecorder); // Enter does not fire on the enabled textarea. goog.testing.events.fireKeySequence(textarea, goog.events.KeyCodes.ENTER); assertFalse(wasCalled); // Enter fires on the disabled textarea. textarea.disabled = true; goog.testing.events.fireKeySequence(textarea, goog.events.KeyCodes.ENTER); assertTrue(wasCalled); } function testEscapeKeyDoesNothingOnSpecialFormElements() { dialog.setContent('<select><option>Hello</option>' + '<option>dialog</option></select>'); var select = dialog.getContentElement(). getElementsByTagName('SELECT')[0]; var wasCalled = false; var callRecorder = function() { wasCalled = true; }; goog.events.listen(dialog, goog.ui.Dialog.EventType.SELECT, callRecorder); // Escape does not fire on the enabled select box. goog.testing.events.fireKeySequence(select, goog.events.KeyCodes.ESC); assertFalse(wasCalled); // Escape fires on the disabled select. select.disabled = true; goog.testing.events.fireKeySequence(select, goog.events.KeyCodes.ESC); assertTrue(wasCalled); } function testEscapeCloses() { // If escapeCloses is set to false, the dialog should ignore the escape key assertTrue(dialog.isEscapeToCancel()); dialog.setEscapeToCancel(false); assertFalse(dialog.isEscapeToCancel()); var buttons = new goog.ui.Dialog.ButtonSet(); buttons.set(goog.ui.Dialog.DefaultButtonKeys.OK, 'OK', true); dialog.setButtonSet(buttons); goog.testing.events.fireKeySequence(dialog.getContentElement(), goog.events.KeyCodes.ESC); assertTrue(dialog.isVisible()); // Having a cancel button should make no difference, escape should still not // work. buttons.set(goog.ui.Dialog.DefaultButtonKeys.CANCEL, 'Foo!', false, true); dialog.setButtonSet(buttons); goog.testing.events.fireKeySequence(dialog.getContentElement(), goog.events.KeyCodes.ESC); assertTrue(dialog.isVisible()); } function testEnterKeyWithoutDefaultDoesNotPreventPropagation() { var buttons = new goog.ui.Dialog.ButtonSet(); buttons.set(goog.ui.Dialog.DefaultButtonKeys.CANCEL, 'Foo!', false); // Set a button set without a default selected button dialog.setButtonSet(buttons); dialog.setContent('<span id="linkel" tabindex="0">Link Span</span>'); var call = false; function called() { call = true; } var element = document.getElementById("linkel"); goog.events.listen(element, goog.events.EventType.KEYDOWN, called); goog.testing.events.fireKeySequence(element, goog.events.KeyCodes.ENTER); assertTrue('Should have gotten event on the link', call); } function testPreventDefaultedSelectCausesStopPropagation() { dialog.setButtonSet(goog.ui.Dialog.ButtonSet.OK_CANCEL); var callCount = 0; var keypressCount = 0; var keydownCount = 0; var preventDefaulter = function(e) { e.preventDefault(); }; goog.events.listen( dialog, goog.ui.Dialog.EventType.SELECT, preventDefaulter); goog.events.listen( document.body, goog.events.EventType.KEYPRESS, function() { keypressCount++; }); goog.events.listen( document.body, goog.events.EventType.KEYDOWN, function() { keydownCount++; }); // Ensure that if the SELECT event is prevented, all key events // are still stopped from propagating. goog.testing.events.fireKeySequence( dialog.getElement(), goog.events.KeyCodes.ENTER); assertEquals('The KEYPRESS should be stopped', 0, keypressCount); assertEquals('The KEYDOWN should not be stopped', 1, keydownCount); keypressCount = 0; keydownCount = 0; goog.testing.events.fireKeySequence( dialog.getElement(), goog.events.KeyCodes.ESC); assertEquals('The KEYDOWN should be stopped', 0, keydownCount); // Note: Some browsers don't yield keypresses on escape, so don't check. goog.events.unlisten( dialog, goog.ui.Dialog.EventType.SELECT, preventDefaulter); keypressCount = 0; keydownCount = 0; goog.testing.events.fireKeySequence( dialog.getElement(), goog.events.KeyCodes.ENTER); assertEquals('The KEYPRESS should be stopped', 0, keypressCount); assertEquals('The KEYDOWN should not be stopped', 1, keydownCount); } function testEnterKeyHandledInKeypress() { var inKeyPress = false; goog.events.listen( document.body, goog.events.EventType.KEYPRESS, function() { inKeyPress = true; }, true /* capture */); goog.events.listen( document.body, goog.events.EventType.KEYPRESS, function() { inKeyPress = false; }, false /* !capture */); var selectCalled = false; goog.events.listen( dialog, goog.ui.Dialog.EventType.SELECT, function() { selectCalled = true; assertTrue( 'Select must be dispatched during keypress to allow popups', inKeyPress); }); goog.testing.events.fireKeySequence( dialog.getElement(), goog.events.KeyCodes.ENTER); assertTrue(selectCalled); } function testButtonsWithContentsDispatchSelectEvents() { var aButton = dialog.getButtonElement().getElementsByTagName('BUTTON')[0]; var aSpan = document.createElement('SPAN'); aButton.appendChild(aSpan); var wasCalled = false; var callRecorder = function() { wasCalled = true; }; goog.events.listen(dialog, goog.ui.Dialog.EventType.SELECT, callRecorder); goog.testing.events.fireClickSequence(aSpan); assertTrue(wasCalled); } function testAfterHideEvent() { var wasCalled = false; var callRecorder = function() { wasCalled = true; }; goog.events.listen(dialog, goog.ui.Dialog.EventType.AFTER_HIDE, callRecorder); dialog.setVisible(false); assertTrue(wasCalled); } function testCannedButtonSets() { dialog.setButtonSet(goog.ui.Dialog.ButtonSet.OK); assertButtons([goog.ui.Dialog.DefaultButtonKeys.OK]); dialog.setButtonSet(goog.ui.Dialog.ButtonSet.OK_CANCEL); assertButtons([goog.ui.Dialog.DefaultButtonKeys.OK, goog.ui.Dialog.DefaultButtonKeys.CANCEL]); dialog.setButtonSet(goog.ui.Dialog.ButtonSet.YES_NO); assertButtons([goog.ui.Dialog.DefaultButtonKeys.YES, goog.ui.Dialog.DefaultButtonKeys.NO]); dialog.setButtonSet(goog.ui.Dialog.ButtonSet.YES_NO_CANCEL); assertButtons([goog.ui.Dialog.DefaultButtonKeys.YES, goog.ui.Dialog.DefaultButtonKeys.NO, goog.ui.Dialog.DefaultButtonKeys.CANCEL]); dialog.setButtonSet(goog.ui.Dialog.ButtonSet.CONTINUE_SAVE_CANCEL); assertButtons([goog.ui.Dialog.DefaultButtonKeys.CONTINUE, goog.ui.Dialog.DefaultButtonKeys.SAVE, goog.ui.Dialog.DefaultButtonKeys.CANCEL]); } function testDefaultButtonClassName() { var key = 'someKey'; var msg = 'someMessage'; var isDefalut = false; var buttonSetOne = new goog.ui.Dialog.ButtonSet().set(key, msg, isDefault); dialog.setButtonSet(buttonSetOne); var defaultClassName = goog.getCssName(buttonSetOne.class_, 'default'); var buttonOne = buttonSetOne.getButton(key); assertNotEquals(defaultClassName, buttonOne.className); var isDefault = true; var buttonSetTwo = new goog.ui.Dialog.ButtonSet().set(key, msg, isDefault); dialog.setButtonSet(buttonSetTwo); var buttonTwo = buttonSetTwo.getButton(key); assertEquals(defaultClassName, buttonTwo.className); } function testGetButton() { dialog.setButtonSet(goog.ui.Dialog.ButtonSet.OK); var buttons = document.getElementsByName( goog.ui.Dialog.DefaultButtonKeys.OK); assertEquals(buttons[0], dialog.getButtonSet().getButton( goog.ui.Dialog.DefaultButtonKeys.OK)); } function testGetAllButtons() { dialog.setButtonSet(goog.ui.Dialog.ButtonSet.YES_NO_CANCEL); var buttons = dialog.getElement().getElementsByTagName( goog.dom.TagName.BUTTON); for (var i = 0; i < buttons.length; i++) { assertEquals(buttons[i], dialog.getButtonSet().getAllButtons()[i]); } } function testIframeMask() { // generate a new dialog dialog.dispose(); dialog = new goog.ui.Dialog(null, true /* iframe mask */); dialog.setVisible(true); var iframes = goog.dom.getElementsByTagNameAndClass(goog.dom.TagName.IFRAME); // NOTE: one iframe already exists in the document, so we check for 1 extra // iframe. assertEquals('No iframe mask created', 2, iframes.length); } function testNonModalDialog() { // generate a new dialog dialog.dispose(); dialog = new goog.ui.Dialog(null, true /* iframe mask */); dialog.setModal(false); dialog.setVisible(true); var iframes = goog.dom.getElementsByTagNameAndClass(goog.dom.TagName.IFRAME); // NOTE: one iframe already exists in the document, so we check there are // no extra iframes in the document. assertEquals('Iframe mask created for modal dialog', 1, iframes.length); } function testSwapModalForOpenDialog() { dialog.dispose(); dialog = new goog.ui.Dialog(null, true /* iframe mask */); dialog.setVisible(true); dialog.setModal(false); assertNull('IFrame bg element should be null', dialog.bgIframeEl_); assertNull('bg element should be null', dialog.bgEl_); dialog.setModal(true); assertNotNull('IFrame bg element should not be null', dialog.bgIframeEl_); assertNotNull('bg element should not be null', dialog.bgEl_); assertEquals('IFrame bg element is a child of body', document.body, dialog.bgIframeEl_.parentNode); assertEquals('bg element is a child of body', document.body, dialog.bgEl_.parentNode); assertTrue('IFrame bg element should visible', goog.style.isElementShown(dialog.bgIframeEl_)); assertTrue('bg element should be visible', goog.style.isElementShown(dialog.bgEl_)); } /** * Assert that the dialog has buttons with the given keys in the correct * order. * @param {Array.<string>} keys An array of button keys. */ function assertButtons(keys) { var buttons = dialog.getElement().getElementsByTagName( goog.dom.TagName.BUTTON); var actualKeys = []; for (var i = 0; i < buttons.length; i++) { actualKeys[i] = buttons[i].name; } assertArrayEquals(keys, actualKeys); } function testButtonSetOkFiresDialogEventOnEscape() { dialog.setButtonSet(goog.ui.Dialog.ButtonSet.OK); var wasCalled = false; var callRecorder = function() { wasCalled = true; }; goog.events.listen(dialog, goog.ui.Dialog.EventType.SELECT, callRecorder); goog.testing.events.fireKeySequence( dialog.getElement(), goog.events.KeyCodes.ESC); assertTrue(wasCalled); } </script> </body> </html>