<!doctype html> <!-- @license Copyright (c) 2015 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt --> <html> <head> <meta charset="UTF-8"> <title>iron-dropdown-scroll-manager tests</title> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"> <script src="../../webcomponentsjs/webcomponents-lite.js"></script> <script src="../../web-component-tester/browser.js"></script> <script src="../../test-fixture/test-fixture-mocha.js"></script> <script src="../../iron-test-helpers/mock-interactions.js"></script> <link rel="import" href="../iron-dropdown-scroll-manager.html"> <link rel="import" href="../../test-fixture/test-fixture.html"> <link rel="import" href="x-scrollable-element.html"> </head> <body> <test-fixture id="DOMSubtree"> <template> <x-scrollable-element id="Parent"></x-scrollable-element> </template> </test-fixture> <script> suite('IronDropdownScrollManager', function() { var parent; var childOne; var childTwo; var grandchildOne; var grandchildTwo; var ancestor; setup(function() { parent = fixture('DOMSubtree'); childOne = parent.$$('#ChildOne'); childTwo = parent.$$('#ChildTwo'); grandChildOne = parent.$$('#GrandchildOne'); grandChildTwo = parent.$$('#GrandchildTwo'); ancestor = document.body; }); suite('constraining scroll in the DOM', function() { setup(function() { Polymer.IronDropdownScrollManager.pushScrollLock(childOne); }); teardown(function() { Polymer.IronDropdownScrollManager.removeScrollLock(childOne); }); test('recognizes sibling as locked', function() { expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(childTwo)) .to.be.equal(true); }); test('recognizes neice as locked', function() { expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(grandChildTwo)) .to.be.equal(true); }); test('recognizes parent as locked', function() { expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(parent)) .to.be.equal(true); }); test('recognizes ancestor as locked', function() { expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(ancestor)) .to.be.equal(true); }); test('recognizes locking child as unlocked', function() { expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(childOne)) .to.be.equal(false); }); test('recognizes descendant of locking child as unlocked', function() { expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(grandChildOne)) .to.be.equal(false); }); test('unlocks locked elements when there are no locking elements', function() { Polymer.IronDropdownScrollManager.removeScrollLock(childOne); expect(Polymer.IronDropdownScrollManager.elementIsScrollLocked(parent)) .to.be.equal(false); }); test('does not check locked elements when there are no locking elements', function() { sinon.spy(Polymer.IronDropdownScrollManager, 'elementIsScrollLocked'); childOne.dispatchEvent(new CustomEvent('wheel', { bubbles: true, cancelable: true })); expect(Polymer.IronDropdownScrollManager .elementIsScrollLocked.callCount).to.be.eql(1); Polymer.IronDropdownScrollManager.removeScrollLock(childOne); childOne.dispatchEvent(new CustomEvent('wheel', { bubbles: true, cancelable: true })); expect(Polymer.IronDropdownScrollManager .elementIsScrollLocked.callCount).to.be.eql(1); }); suite('various scroll events', function() { var scrollEvents; var events; setup(function() { scrollEvents = [ 'wheel', 'mousewheel', 'DOMMouseScroll', 'touchmove' ]; events = scrollEvents.map(function(scrollEvent) { return new CustomEvent(scrollEvent, { bubbles: true, cancelable: true }); }); }); test('prevents wheel events from locked elements', function() { events.forEach(function(event) { childTwo.dispatchEvent(event); expect(event.defaultPrevented).to.be.eql(true); }); }); test('allows wheel events from unlocked elements', function() { events.forEach(function(event) { childOne.dispatchEvent(event); expect(event.defaultPrevented).to.be.eql(false); }); }); }); }); }); </script> </body> </html>