251 lines
8.1 KiB
JavaScript
251 lines
8.1 KiB
JavaScript
// Copyright 2011 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.LabelInputTest');
|
|
goog.setTestOnly('goog.ui.LabelInputTest');
|
|
|
|
goog.require('goog.a11y.aria');
|
|
goog.require('goog.a11y.aria.State');
|
|
goog.require('goog.dom');
|
|
goog.require('goog.dom.classlist');
|
|
goog.require('goog.events.EventType');
|
|
goog.require('goog.testing.MockClock');
|
|
goog.require('goog.testing.events');
|
|
goog.require('goog.testing.events.Event');
|
|
goog.require('goog.testing.jsunit');
|
|
goog.require('goog.ui.LabelInput');
|
|
goog.require('goog.userAgent');
|
|
|
|
var labelInput;
|
|
var mockClock;
|
|
|
|
function setUp() {
|
|
mockClock = new goog.testing.MockClock(true);
|
|
}
|
|
|
|
function tearDown() {
|
|
mockClock.dispose();
|
|
labelInput.dispose();
|
|
}
|
|
|
|
function testGetLabel() {
|
|
labelInput = new goog.ui.LabelInput();
|
|
assertEquals('no label', '', labelInput.getLabel());
|
|
|
|
labelInput = new goog.ui.LabelInput('search');
|
|
assertEquals('label is given in the ctor', 'search', labelInput.getLabel());
|
|
}
|
|
|
|
function testSetLabel() {
|
|
labelInput = new goog.ui.LabelInput();
|
|
labelInput.setLabel('search');
|
|
assertEquals('label is set', 'search', labelInput.getLabel());
|
|
|
|
labelInput.createDom();
|
|
labelInput.enterDocument();
|
|
mockClock.tick(10);
|
|
assertNotNull(labelInput.getElement());
|
|
assertLabelValue(labelInput, 'search');
|
|
|
|
labelInput.setLabel('new label');
|
|
assertLabelValue(labelInput, 'new label');
|
|
}
|
|
|
|
function assertLabelValue(labelInput, expectedLabel) {
|
|
assertEquals(
|
|
'label should have aria-label attribute \'' + expectedLabel + '\'',
|
|
expectedLabel, goog.a11y.aria.getState(labelInput.getElement(),
|
|
goog.a11y.aria.State.LABEL));
|
|
// When browsers support the placeholder attribute, we use that instead of
|
|
// the value property - and this test will fail.
|
|
if (!isPlaceholderSupported()) {
|
|
assertEquals(
|
|
'label is updated', expectedLabel, labelInput.getElement().value);
|
|
} else {
|
|
assertEquals('value is empty', '', labelInput.getElement().value);
|
|
}
|
|
}
|
|
|
|
function testPlaceholderAttribute() {
|
|
labelInput = new goog.ui.LabelInput();
|
|
labelInput.setLabel('search');
|
|
|
|
// Some browsers don't support the placeholder attribute, in which case we
|
|
// this test will fail.
|
|
if (! isPlaceholderSupported()) {
|
|
return;
|
|
}
|
|
|
|
labelInput.createDom();
|
|
labelInput.enterDocument();
|
|
mockClock.tick(10);
|
|
assertEquals('label should have placeholder attribute \'search\'', 'search',
|
|
labelInput.getElement().placeholder);
|
|
|
|
labelInput.setLabel('new label');
|
|
assertEquals('label should have aria-label attribute \'new label\'',
|
|
'new label', labelInput.getElement().placeholder);
|
|
}
|
|
|
|
function testDecorateElementWithExistingPlaceholderAttribute() {
|
|
labelInput = new goog.ui.LabelInput();
|
|
labelInput.setLabel('search');
|
|
|
|
labelInput.decorate(goog.dom.getElement('p'));
|
|
labelInput.enterDocument();
|
|
mockClock.tick(10);
|
|
|
|
// The presence of an existing placeholder doesn't necessarily mean the
|
|
// browser supports placeholders. Make sure labels are used for browsers
|
|
// without placeholder support:
|
|
if (isPlaceholderSupported()) {
|
|
assertEquals('label should have placeholder attribute \'search\'', 'search',
|
|
labelInput.getElement().placeholder);
|
|
} else {
|
|
assertNotNull(labelInput.getElement());
|
|
assertEquals('label is rendered', 'search', labelInput.getElement().value);
|
|
assertEquals('label should have aria-label attribute \'search\'', 'search',
|
|
goog.a11y.aria.getState(labelInput.getElement(),
|
|
goog.a11y.aria.State.LABEL));
|
|
}
|
|
}
|
|
|
|
function testDecorateElementWithFocus() {
|
|
labelInput = new goog.ui.LabelInput();
|
|
labelInput.setLabel('search');
|
|
|
|
var decoratedElement = goog.dom.getElement('i');
|
|
|
|
decoratedElement.value = '';
|
|
decoratedElement.focus();
|
|
|
|
labelInput.decorate(decoratedElement);
|
|
labelInput.enterDocument();
|
|
mockClock.tick(10);
|
|
|
|
assertEquals('label for pre-focused input should not have LABEL_CLASS_NAME',
|
|
-1,
|
|
labelInput.getElement().className.indexOf(labelInput.labelCssClassName));
|
|
|
|
if (!isPlaceholderSupported()) {
|
|
assertEquals('label rendered for pre-focused element',
|
|
'', labelInput.getElement().value);
|
|
// NOTE(user): element.blur() doesn't seem to trigger the BLUR event in
|
|
// IE in the test environment. This could be related to the IE issues with
|
|
// testClassName() below.
|
|
goog.testing.events.fireBrowserEvent(
|
|
new goog.testing.events.Event(
|
|
goog.events.EventType.BLUR, decoratedElement));
|
|
mockClock.tick(10);
|
|
assertEquals('label not rendered for blurred element',
|
|
'search', labelInput.getElement().value);
|
|
}
|
|
}
|
|
|
|
function testDecorateElementWithFocusDelay() {
|
|
if (isPlaceholderSupported()) {
|
|
return; // Delay only affects the older browsers.
|
|
}
|
|
var placeholder = 'search';
|
|
|
|
labelInput = new goog.ui.LabelInput();
|
|
labelInput.setLabel(placeholder);
|
|
var delay = 150;
|
|
labelInput.labelRestoreDelayMs = delay;
|
|
|
|
var decoratedElement = goog.dom.getElement('i');
|
|
|
|
decoratedElement.value = '';
|
|
decoratedElement.focus();
|
|
|
|
labelInput.decorate(decoratedElement);
|
|
labelInput.enterDocument();
|
|
// wait for all initial setup to settle
|
|
mockClock.tick(delay);
|
|
|
|
// NOTE(user): element.blur() doesn't seem to trigger the BLUR event in
|
|
// IE in the test environment. This could be related to the IE issues with
|
|
// testClassName() below.
|
|
goog.testing.events.fireBrowserEvent(
|
|
new goog.testing.events.Event(
|
|
goog.events.EventType.BLUR, decoratedElement));
|
|
|
|
mockClock.tick(delay - 1);
|
|
assertEquals('label should not be restored before labelRestoreDelay',
|
|
'', labelInput.getElement().value);
|
|
|
|
mockClock.tick(1);
|
|
assertEquals('label not rendered for blurred element with labelRestoreDelay',
|
|
placeholder, labelInput.getElement().value);
|
|
}
|
|
|
|
function testClassName() {
|
|
labelInput = new goog.ui.LabelInput();
|
|
|
|
// IE always fails this test, suspect it is a focus issue.
|
|
if (goog.userAgent.IE) {
|
|
return;
|
|
}
|
|
// FF does not perform focus if the window is not active in the first place.
|
|
if (goog.userAgent.GECKO && document.hasFocus && !document.hasFocus()) {
|
|
return;
|
|
}
|
|
|
|
labelInput.decorate(goog.dom.getElement('i'));
|
|
labelInput.setLabel('search');
|
|
|
|
var el = labelInput.getElement();
|
|
assertTrue('label before focus should have LABEL_CLASS_NAME',
|
|
goog.dom.classlist.contains(el, labelInput.labelCssClassName));
|
|
|
|
labelInput.getElement().focus();
|
|
|
|
assertFalse('label after focus should not have LABEL_CLASS_NAME',
|
|
goog.dom.classlist.contains(el, labelInput.labelCssClassName));
|
|
|
|
labelInput.getElement().blur();
|
|
|
|
assertTrue('label after blur should have LABEL_CLASS_NAME',
|
|
goog.dom.classlist.contains(el, labelInput.labelCssClassName));
|
|
}
|
|
|
|
function isPlaceholderSupported() {
|
|
if (goog.dom.getElement('i').placeholder != null) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
function testEnable() {
|
|
labelInput = new goog.ui.LabelInput();
|
|
labelInput.createDom();
|
|
labelInput.enterDocument();
|
|
|
|
var labelElement = labelInput.getElement();
|
|
var disabledClass = goog.getCssName(labelInput.labelCssClassName, 'disabled');
|
|
|
|
assertTrue('label should be enabled', labelInput.isEnabled());
|
|
assertFalse('label should not have the disabled class',
|
|
goog.dom.classlist.contains(labelElement, disabledClass));
|
|
|
|
labelInput.setEnabled(false);
|
|
assertFalse('label should be disabled', labelInput.isEnabled());
|
|
assertTrue('label should have the disabled class',
|
|
goog.dom.classlist.contains(labelElement, disabledClass));
|
|
|
|
labelInput.setEnabled(true);
|
|
assertTrue('label should be enabled', labelInput.isEnabled());
|
|
assertFalse('label should not have the disabled class',
|
|
goog.dom.classlist.contains(labelElement, disabledClass));
|
|
}
|