3
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
4
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7
Code distributed by Google as part of the polymer project is also
8
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
12
<title>active-state</title>
14
<script src="../../webcomponentsjs/webcomponents-lite.js"></script>
15
<script src="../../web-component-tester/browser.js"></script>
16
<script src="../../iron-test-helpers/mock-interactions.js"></script>
17
<link rel="import" href="test-elements.html">
18
<link rel="import" href="../../paper-input/paper-input.html">
21
<test-fixture id="TrivialActiveState">
23
<test-button></test-button>
27
<test-fixture id="ToggleActiveState">
29
<test-button toggles></test-button>
33
<test-fixture id="ButtonWithNativeInput">
35
<test-light-dom><input id="input"></test-light-dom>
39
<test-fixture id="ButtonWithPaperInput">
41
<test-light-dom><paper-input id="input"></paper-input></test-light-dom>
46
suite('active-state', function() {
50
activeTarget = fixture('TrivialActiveState');
53
suite('active state with toggles attribute', function() {
55
activeTarget = fixture('ToggleActiveState');
58
suite('when down', function() {
59
test('is pressed', function() {
60
MockInteractions.down(activeTarget);
61
expect(activeTarget.hasAttribute('pressed')).to.be.eql(true);
65
suite('when clicked', function() {
66
test('is activated', function(done) {
67
MockInteractions.downAndUp(activeTarget, function() {
69
expect(activeTarget.hasAttribute('active')).to.be.eql(true);
70
expect(activeTarget.hasAttribute('aria-pressed')).to.be.eql(true);
71
expect(activeTarget.getAttribute('aria-pressed')).to.be.eql('true');
79
test('is deactivated by a subsequent click', function(done) {
80
MockInteractions.downAndUp(activeTarget, function() {
81
MockInteractions.downAndUp(activeTarget, function() {
83
expect(activeTarget.hasAttribute('active')).to.be.eql(false);
84
expect(activeTarget.hasAttribute('aria-pressed')).to.be.eql(true);
85
expect(activeTarget.getAttribute('aria-pressed')).to.be.eql('false');
94
test('the correct aria attribute is set', function(done) {
95
activeTarget.ariaActiveAttribute = 'aria-checked';
96
MockInteractions.downAndUp(activeTarget, function() {
98
expect(activeTarget.hasAttribute('active')).to.be.eql(true);
99
expect(activeTarget.hasAttribute('aria-checked')).to.be.eql(true);
100
expect(activeTarget.getAttribute('aria-checked')).to.be.eql('true');
108
test('the aria attribute is updated correctly', function(done) {
109
activeTarget.ariaActiveAttribute = 'aria-checked';
110
MockInteractions.downAndUp(activeTarget, function() {
112
expect(activeTarget.hasAttribute('active')).to.be.eql(true);
113
expect(activeTarget.hasAttribute('aria-checked')).to.be.eql(true);
114
expect(activeTarget.getAttribute('aria-checked')).to.be.eql('true');
116
activeTarget.ariaActiveAttribute = 'aria-pressed';
117
expect(activeTarget.hasAttribute('aria-checked')).to.be.eql(false);
118
expect(activeTarget.hasAttribute('aria-pressed')).to.be.eql(true);
119
expect(activeTarget.getAttribute('aria-pressed')).to.be.eql('true');
129
suite('without toggles attribute', function() {
130
suite('when mouse is down', function() {
131
test('does not get an active attribute', function() {
132
expect(activeTarget.hasAttribute('active')).to.be.eql(false);
133
MockInteractions.down(activeTarget);
134
expect(activeTarget.hasAttribute('active')).to.be.eql(false);
138
suite('when mouse is up', function() {
139
test('does not get an active attribute', function() {
140
MockInteractions.down(activeTarget);
141
expect(activeTarget.hasAttribute('active')).to.be.eql(false);
142
MockInteractions.up(activeTarget);
143
expect(activeTarget.hasAttribute('active')).to.be.eql(false);
148
suite('when space is pressed', function() {
149
test('triggers a click event', function(done) {
150
activeTarget.addEventListener('click', function() {
153
MockInteractions.pressSpace(activeTarget);
156
test('only triggers click after the key is released', function(done) {
157
var keyupTriggered = false;
159
activeTarget.addEventListener('keyup', function() {
160
keyupTriggered = true;
163
activeTarget.addEventListener('click', function() {
165
expect(keyupTriggered).to.be.eql(true);
172
MockInteractions.pressSpace(activeTarget);
176
suite('when enter is pressed', function() {
177
test('triggers a click event', function(done) {
178
activeTarget.addEventListener('click', function() {
182
MockInteractions.pressEnter(activeTarget);
185
test('only triggers click before the key is released', function(done) {
186
var keyupTriggered = false;
188
activeTarget.addEventListener('keyup', function() {
189
keyupTriggered = true;
192
activeTarget.addEventListener('click', function() {
194
expect(keyupTriggered).to.be.eql(false);
201
MockInteractions.pressEnter(activeTarget);
205
suite('nested native input inside button', function() {
206
test('space in light child input does not trigger a button click event', function(done) {
207
var item = fixture('ButtonWithNativeInput');
208
var input = item.querySelector('#input');
210
var itemClickHandler = sinon.spy();
211
item.addEventListener('click', itemClickHandler);
214
MockInteractions.pressSpace(input);
215
Polymer.Base.async(function(){
216
expect(itemClickHandler.callCount).to.be.equal(0);
221
test('space in button triggers a button click event', function(done) {
222
var item = fixture('ButtonWithNativeInput');
223
var input = item.querySelector('#input');
225
var itemClickHandler = sinon.spy();
226
item.addEventListener('click', itemClickHandler);
228
MockInteractions.pressSpace(item);
230
Polymer.Base.async(function(){
231
// You need two ticks, one for the MockInteractions event, and one
232
// for the button event.
233
Polymer.Base.async(function(){
234
expect(itemClickHandler.callCount).to.be.equal(1);
241
suite('nested paper-input inside button', function() {
242
test('space in light child input does not trigger a button click event', function(done) {
243
var item = fixture('ButtonWithPaperInput');
244
var input = item.querySelector('#input');
246
var itemClickHandler = sinon.spy();
247
item.addEventListener('click', itemClickHandler);
250
MockInteractions.pressSpace(input);
251
Polymer.Base.async(function(){
252
expect(itemClickHandler.callCount).to.be.equal(0);
257
test('space in button triggers a button click event', function(done) {
258
var item = fixture('ButtonWithPaperInput');
259
var input = item.querySelector('#input');
261
var itemClickHandler = sinon.spy();
262
item.addEventListener('click', itemClickHandler);
264
MockInteractions.pressSpace(item);
265
Polymer.Base.async(function(){
266
// You need two ticks, one for the MockInteractions event, and one
267
// for the button event.
268
Polymer.Base.async(function(){
269
expect(itemClickHandler.callCount).to.be.equal(1);