1
0
mirror of https://github.com/webslides/WebSlides.git synced 2025-08-16 10:04:45 +02:00
This commit is contained in:
Antonio Laguna
2017-05-29 10:16:40 +02:00
parent 8a9ea037c0
commit c5ee83c940
17 changed files with 147 additions and 255 deletions

View File

@@ -70,6 +70,9 @@
"jest": { "jest": {
"collectCoverage": true "collectCoverage": true
}, },
"pre-commit": [
"lint"
],
"babel": { "babel": {
"presets": [ "presets": [
[ [

View File

@@ -1,6 +1,6 @@
import Easings from './easing'; import Easings from './easing';
const SCROLLABLE_CONTAINER = document.getElementById('webslides'); let SCROLLABLE_CONTAINER = null;
/** /**
* Smoothly scrolls to a given Y position using Easing.Swing. It'll run a * Smoothly scrolls to a given Y position using Easing.Swing. It'll run a
@@ -10,6 +10,10 @@ const SCROLLABLE_CONTAINER = document.getElementById('webslides');
* @param {function} cb Callback function to call upon completion. * @param {function} cb Callback function to call upon completion.
*/ */
export default function scrollTo(y, duration = 500, cb = () => {}) { export default function scrollTo(y, duration = 500, cb = () => {}) {
if (!SCROLLABLE_CONTAINER) {
SCROLLABLE_CONTAINER = document.getElementById('webslides');
}
const delta = y - SCROLLABLE_CONTAINER.scrollTop; const delta = y - SCROLLABLE_CONTAINER.scrollTop;
const startLocation = SCROLLABLE_CONTAINER.scrollTop; const startLocation = SCROLLABLE_CONTAINER.scrollTop;
const increment = 16; const increment = 16;

View File

@@ -1,7 +1,7 @@
/*! /*!
* Name: WebSlides * Name: WebSlides
* Version: 1.3.1 * Version: 1.3.1
* Date: 2017-05-05 * Date: 2017-05-29
* Description: Making HTML presentations easy * Description: Making HTML presentations easy
* URL: https://github.com/webslides/webslides#readme * URL: https://github.com/webslides/webslides#readme
* Credits: @jlantunez, @LuisSacristan, @Belelros * Credits: @jlantunez, @LuisSacristan, @Belelros
@@ -71,7 +71,7 @@
/******/ __webpack_require__.p = "/static/js/"; /******/ __webpack_require__.p = "/static/js/";
/******/ /******/
/******/ // Load entry module and return exports /******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 5); /******/ return __webpack_require__(__webpack_require__.s = 6);
/******/ }) /******/ })
/************************************************************************/ /************************************************************************/
/******/ ([ /******/ ([
@@ -79,7 +79,7 @@
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__custom_event__ = __webpack_require__(18); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__custom_event__ = __webpack_require__(19);
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@@ -115,7 +115,9 @@ var DOM = function () {
var text = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var text = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
var node = document.createElement(tag); var node = document.createElement(tag);
if (id) {
node.id = id; node.id = id;
}
if (text) { if (text) {
node.textContent = text; node.textContent = text;
@@ -360,9 +362,9 @@ var DOM = function () {
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_dom__ = __webpack_require__(0);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Slide; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Slide; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return Events; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return Events; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_dom__ = __webpack_require__(0);
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@@ -683,10 +685,10 @@ var MobileDetector = function () {
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__plugins_plugins__ = __webpack_require__(12); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__plugins_plugins__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__slide__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__slide__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__utils_dom__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__utils_dom__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils_scroll_to__ = __webpack_require__(20); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils_scroll_to__ = __webpack_require__(21);
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@@ -1192,17 +1194,24 @@ var WebSlides = function () {
/***/ }), /***/ }),
/* 5 */ /* 5 */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/* 6 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__modules_webslides__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__modules_webslides__ = __webpack_require__(4);
__webpack_require__(5);
window.WebSlides = __WEBPACK_IMPORTED_MODULE_0__modules_webslides__["a" /* default */]; window.WebSlides = __WEBPACK_IMPORTED_MODULE_0__modules_webslides__["a" /* default */];
/***/ }), /***/ }),
/* 6 */ /* 7 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
@@ -1305,7 +1314,7 @@ var AutoSlide = function () {
/* harmony default export */ __webpack_exports__["a"] = (AutoSlide); /* harmony default export */ __webpack_exports__["a"] = (AutoSlide);
/***/ }), /***/ }),
/* 7 */ /* 8 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
@@ -1361,7 +1370,7 @@ var ClickNav = function () {
/* harmony default export */ __webpack_exports__["a"] = (ClickNav); /* harmony default export */ __webpack_exports__["a"] = (ClickNav);
/***/ }), /***/ }),
/* 8 */ /* 9 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
@@ -1431,7 +1440,7 @@ var Grid = function () {
/* harmony default export */ __webpack_exports__["a"] = (Grid); /* harmony default export */ __webpack_exports__["a"] = (Grid);
/***/ }), /***/ }),
/* 9 */ /* 10 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
@@ -1538,7 +1547,7 @@ var Hash = function () {
/* harmony default export */ __webpack_exports__["a"] = (Hash); /* harmony default export */ __webpack_exports__["a"] = (Hash);
/***/ }), /***/ }),
/* 10 */ /* 11 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
@@ -1632,7 +1641,7 @@ var Keyboard = function () {
/* harmony default export */ __webpack_exports__["a"] = (Keyboard); /* harmony default export */ __webpack_exports__["a"] = (Keyboard);
/***/ }), /***/ }),
/* 11 */ /* 12 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
@@ -1808,21 +1817,21 @@ var Navigation = function () {
/* harmony default export */ __webpack_exports__["a"] = (Navigation); /* harmony default export */ __webpack_exports__["a"] = (Navigation);
/***/ }), /***/ }),
/* 12 */ /* 13 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__autoslide__ = __webpack_require__(6); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__autoslide__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__click_nav__ = __webpack_require__(7); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__click_nav__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__grid__ = __webpack_require__(8); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__grid__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__hash__ = __webpack_require__(9); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__hash__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__keyboard__ = __webpack_require__(10); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__keyboard__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__navigation__ = __webpack_require__(11); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__navigation__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__scroll__ = __webpack_require__(13); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__scroll__ = __webpack_require__(14);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__touch__ = __webpack_require__(14); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__touch__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__video__ = __webpack_require__(15); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__video__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__youtube__ = __webpack_require__(16); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__youtube__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__zoom__ = __webpack_require__(17); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__zoom__ = __webpack_require__(18);
@@ -1850,7 +1859,7 @@ var Navigation = function () {
}); });
/***/ }), /***/ }),
/* 13 */ /* 14 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
@@ -1990,7 +1999,7 @@ var Scroll = function () {
/* harmony default export */ __webpack_exports__["a"] = (Scroll); /* harmony default export */ __webpack_exports__["a"] = (Scroll);
/***/ }), /***/ }),
/* 14 */ /* 15 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
@@ -2240,7 +2249,7 @@ var Touch = function () {
/* harmony default export */ __webpack_exports__["a"] = (Touch); /* harmony default export */ __webpack_exports__["a"] = (Touch);
/***/ }), /***/ }),
/* 15 */ /* 16 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
@@ -2327,7 +2336,7 @@ var Video = function () {
/* harmony default export */ __webpack_exports__["a"] = (Video); /* harmony default export */ __webpack_exports__["a"] = (Video);
/***/ }), /***/ }),
/* 16 */ /* 17 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
@@ -2663,7 +2672,7 @@ var YouTube = function () {
/* harmony default export */ __webpack_exports__["a"] = (YouTube); /* harmony default export */ __webpack_exports__["a"] = (YouTube);
/***/ }), /***/ }),
/* 17 */ /* 18 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
@@ -2924,7 +2933,7 @@ var Zoom = function () {
/* harmony default export */ __webpack_exports__["a"] = (Zoom); /* harmony default export */ __webpack_exports__["a"] = (Zoom);
/***/ }), /***/ }),
/* 18 */ /* 19 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
@@ -2972,7 +2981,7 @@ var WSCustomEvent = canIuseNativeCustom() ? NativeCustomEvent : IECustomEvent;
/* harmony default export */ __webpack_exports__["a"] = (WSCustomEvent); /* harmony default export */ __webpack_exports__["a"] = (WSCustomEvent);
/***/ }), /***/ }),
/* 19 */ /* 20 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
@@ -2997,12 +3006,12 @@ function linear(p) {
/* harmony default export */ __webpack_exports__["a"] = ({ swing: swing, linear: linear }); /* harmony default export */ __webpack_exports__["a"] = ({ swing: swing, linear: linear });
/***/ }), /***/ }),
/* 20 */ /* 21 */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__easing__ = __webpack_require__(19);
/* harmony export (immutable) */ __webpack_exports__["a"] = scrollTo; /* harmony export (immutable) */ __webpack_exports__["a"] = scrollTo;
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__easing__ = __webpack_require__(20);
var SCROLLABLE_CONTAINER = document.getElementById('webslides'); var SCROLLABLE_CONTAINER = document.getElementById('webslides');

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,8 @@
import Slide from '../../src/js/modules/slide'; import Slide from '../../src/js/modules/slide';
beforeAll(() => { beforeAll(() => {
const slides = '<section class="slide"><div class="content">Content</section>'.repeat(5); const slides = '<section class="slide"><div class="content">Content</section>'
.repeat(5);
document.body.innerHTML = `<div id="webslides">${slides}</div>`; document.body.innerHTML = `<div id="webslides">${slides}</div>`;
}); });
@@ -19,9 +20,9 @@ test('Slide utility', () => {
}; };
expect(Slide.isCandidate(slides[0])).toBe(true); expect(Slide.isCandidate(slides[0])).toBe(true);
slides.forEach( (slide, i) => webslides.slides.push(new Slide(slide, i))); slides.forEach((slide, i) => webslides.slides.push(new Slide(slide, i)));
expect(webslides.slides.length).toBe(slides.length); expect(webslides.slides.length).toBe(slides.length);
webslides.slides.forEach( (slide, i) => { webslides.slides.forEach((slide, i) => {
expect(typeof slide).toBe('object'); expect(typeof slide).toBe('object');
expect(slide.el).toBe(slides[i]); expect(slide.el).toBe(slides[i]);
expect(slide.el.id).toBe(`section-${i+1}`); expect(slide.el.id).toBe(`section-${i+1}`);

View File

@@ -1,32 +1,32 @@
import DOM from '../../src/js/utils/dom'; import WebSlides from '../../src/js/modules/webslides';
jest.useFakeTimers(); jest.useFakeTimers();
beforeAll(() => { beforeAll(() => {
const slides = '<section class="slide"><div class="content">Content</section>'.repeat(20); const slides =
document.body.innerHTML = `<div id="webslides">${slides}<div id="other"></div></div>`; '<section class="slide"><div class="content">Content</section>'.repeat(20);
document.body.innerHTML =
`<div id="webslides">${slides}<div id="other"></div></div>`;
}); });
test('WebSlides utility', () => { test('WebSlides utility', () => {
let webslides; let webslides;
// Needs to be required and not imported because const defined in top level
// in utils/scroll-to
const WebSlides = require('../../src/js/modules/webslides');
const ws = document.getElementById('webslides'); const ws = document.getElementById('webslides');
const change = jest.fn(); const change = jest.fn();
expect(() => { expect(() => {
ws.setAttribute('id', ''); ws.setAttribute('id', '');
webslides = new WebSlides.default(); webslides = new WebSlides();
}).toThrow(); }).toThrow();
ws.setAttribute('id', 'webslides'); ws.setAttribute('id', 'webslides');
expect(() => { expect(() => {
webslides = new WebSlides.default(); webslides = new WebSlides();
}).not.toThrow(); }).not.toThrow();
webslides.el.addEventListener('ws:slide-change', change); webslides.el.addEventListener('ws:slide-change', change);
expect(document.getElementById('other')).toBe(null); expect(document.getElementById('other')).toBe(null);
expect(webslides.slides.length).toBe(document.querySelectorAll('#webslides .slide').length); expect(webslides.slides.length)
webslides.slides.forEach( slide => { .toBe(document.querySelectorAll('#webslides .slide').length);
webslides.slides.forEach(slide => {
expect(typeof slide).toBe('object'); expect(typeof slide).toBe('object');
}); });
expect(webslides.plugins.autoslide).not.toBe(null); expect(webslides.plugins.autoslide).not.toBe(null);
@@ -72,5 +72,4 @@ test('WebSlides utility', () => {
expect(webslides.isDisabled()).toBe(true); expect(webslides.isDisabled()).toBe(true);
webslides.enable(); webslides.enable();
expect(webslides.isDisabled()).toBe(false); expect(webslides.isDisabled()).toBe(false);
}); });

View File

@@ -4,7 +4,8 @@ import AutoSlide from '../../src/js/plugins/autoslide';
jest.useFakeTimers(); jest.useFakeTimers();
beforeAll(() => { beforeAll(() => {
document.body.innerHTML = `<div id="webslides"></div><input id="focusable" />`; document.body.innerHTML =
`<div id="webslides"></div><input id="focusable" />`;
}); });
test('AutoSlide plugin', () => { test('AutoSlide plugin', () => {
@@ -20,7 +21,7 @@ test('AutoSlide plugin', () => {
expect(next).not.toBeCalled(); expect(next).not.toBeCalled();
const autoslide = new AutoSlide(webslides); new AutoSlide(webslides);
DOM.fireEvent(ws, 'ws:init'); DOM.fireEvent(ws, 'ws:init');
// Wait until next execution // Wait until next execution
@@ -39,5 +40,4 @@ test('AutoSlide plugin', () => {
jest.runTimersToTime(101); jest.runTimersToTime(101);
expect(next.mock.calls.length).toBe(2); expect(next.mock.calls.length).toBe(2);
}); });

View File

@@ -2,7 +2,8 @@ import DOM from '../../src/js/utils/dom';
import ClickNav from '../../src/js/plugins/click-nav'; import ClickNav from '../../src/js/plugins/click-nav';
beforeAll(() => { beforeAll(() => {
document.body.innerHTML = `<div id="webslides" data-test="test"><p>Text</p></div>`; document.body.innerHTML =
`<div id="webslides" data-test="test"><p>Text</p></div>`;
}); });
test('Click nav plugin', () => { test('Click nav plugin', () => {
@@ -20,7 +21,7 @@ test('Click nav plugin', () => {
expect(next).not.toBeCalled(); expect(next).not.toBeCalled();
const clicknav = new ClickNav(webslides); new ClickNav(webslides);
DOM.fireEvent(ws, 'click'); DOM.fireEvent(ws, 'click');
expect(next.mock.calls.length).toBe(1); expect(next.mock.calls.length).toBe(1);
}); });

View File

@@ -1,9 +1,9 @@
import DOM from '../../src/js/utils/dom';
import Keyboard from '../../src/js/plugins/keyboard'; import Keyboard from '../../src/js/plugins/keyboard';
import Keys from '../../src/js/utils/keys'; import Keys from '../../src/js/utils/keys';
// @TODO: Check to do this with simulant
const simulateKeyEvent = (el, code) => { const simulateKeyEvent = (el, code) => {
const evt = new KeyboardEvent("keydown", { const evt = new KeyboardEvent('keydown', {
bubbles: true, bubbles: true,
cancelableCode: true, cancelableCode: true,
which: code, which: code,
@@ -12,7 +12,10 @@ const simulateKeyEvent = (el, code) => {
}; };
beforeAll(() => { beforeAll(() => {
document.body.innerHTML = `<div id="webslides" data-test="test"><p>Text</p></div><input id="focusable" />`; document.body.innerHTML = `<div id="webslides" data-test="test">
<p>Text</p>
</div>
<input id="focusable" />`;
}); });
test('Keyboard plugin', () => { test('Keyboard plugin', () => {
@@ -20,7 +23,6 @@ test('Keyboard plugin', () => {
const next = jest.fn(); const next = jest.fn();
const prev = jest.fn(); const prev = jest.fn();
const ws = document.getElementById('webslides'); const ws = document.getElementById('webslides');
const focusable = document.getElementById('focusable');
let disabled = true; let disabled = true;
@@ -29,11 +31,11 @@ test('Keyboard plugin', () => {
goNext: next, goNext: next,
goPrev: prev, goPrev: prev,
isVertical: false, isVertical: false,
isDisabled: () => {return disabled;}, isDisabled: () => disabled,
el: ws el: ws
}; };
const keyboard = new Keyboard(webslides); new Keyboard(webslides);
expect(goto).not.toBeCalled(); expect(goto).not.toBeCalled();
expect(next).not.toBeCalled(); expect(next).not.toBeCalled();

View File

@@ -31,7 +31,7 @@ test('Navigation plugin', () => {
expect(fakeCounter.childNodes[0].href).toBe('about:blank#'); expect(fakeCounter.childNodes[0].href).toBe('about:blank#');
expect(fakeCounter.childNodes[0].title).toBe('View all slides'); expect(fakeCounter.childNodes[0].title).toBe('View all slides');
const nav = new Navigation(webslides); new Navigation(webslides);
const navElem = ws.querySelector('#navigation'); const navElem = ws.querySelector('#navigation');
const counter = navElem.querySelector('#counter'); const counter = navElem.querySelector('#counter');

View File

@@ -18,7 +18,9 @@ beforeAll(() => {
test('Scroll utility', () => { test('Scroll utility', () => {
// Forces mobile detection // Forces mobile detection
window.navigator = {userAgent: 'Android'}; window.navigator = {
userAgent: 'Android'
};
const ws = document.getElementById('webslides'); const ws = document.getElementById('webslides');
const next = jest.fn(); const next = jest.fn();
const prev = jest.fn(); const prev = jest.fn();
@@ -26,7 +28,7 @@ test('Scroll utility', () => {
let disabled = true; let disabled = true;
const webslides = { const webslides = {
el: ws, el: ws,
isDisabled: () => {return disabled;}, isDisabled: () => disabled,
isMoving: false, isMoving: false,
isVertical: false, isVertical: false,
goNext: next, goNext: next,
@@ -38,7 +40,7 @@ test('Scroll utility', () => {
} }
}; };
const scroll = new Scroll(webslides); new Scroll(webslides);
fireEvent(ws, 'wheel', 300, 200); fireEvent(ws, 'wheel', 300, 200);
expect(next).not.toBeCalled(); expect(next).not.toBeCalled();
@@ -61,5 +63,4 @@ test('Scroll utility', () => {
jest.runTimersToTime(201); jest.runTimersToTime(201);
expect(next.mock.calls.length).toBe(1); expect(next.mock.calls.length).toBe(1);
expect(prev.mock.calls.length).toBe(1); expect(prev.mock.calls.length).toBe(1);
}); });

View File

@@ -1,13 +1,14 @@
import Touch from '../../src/js/plugins/touch';
// Copy of DOM.fireEvent, but using touch offets // Copy of DOM.fireEvent, but using touch offets
const fireEvent = (target, eventType, offsetX, offsetY, touches) => { const getEvent = (eventType, offsetX, offsetY, touches) => {
const event = new CustomEvent(eventType); const event = new CustomEvent(eventType);
event.offsetX = offsetX; event.offsetX = offsetX;
event.offsetY = offsetY; event.offsetY = offsetY;
event.touches = touches; event.touches = touches;
target.dispatchEvent(event); return event;
}; };
beforeAll(() => { beforeAll(() => {
@@ -17,11 +18,9 @@ beforeAll(() => {
test('Touch utility', () => { test('Touch utility', () => {
// Overrides userAgent to force mobile detection // Overrides userAgent to force mobile detection
const UAProp = Object.getOwnPropertyDescriptor(window.navigator.__proto__, 'userAgent'); Object.getOwnPropertyDescriptor(window.navigator.__proto__, 'userAgent');
Object.defineProperty(window.navigator, 'userAgent', {get: () => 'Android'}); Object.defineProperty(window.navigator, 'userAgent', {get: () => 'Android'});
const Touch = require('../../src/js/plugins/touch');
const ws = document.getElementById('webslides'); const ws = document.getElementById('webslides');
const next = jest.fn(); const next = jest.fn();
const prev = jest.fn(); const prev = jest.fn();
@@ -30,7 +29,7 @@ test('Touch utility', () => {
let disabled = true; let disabled = true;
const webslides = { const webslides = {
el: ws, el: ws,
isDisabled: () => {return disabled;}, isDisabled: () => disabled,
isMoving: false, isMoving: false,
isVertical: false, isVertical: false,
goNext: next, goNext: next,
@@ -41,10 +40,10 @@ test('Touch utility', () => {
} }
}; };
const touch = new Touch.default(webslides); const touch = new Touch(webslides);
fireEvent(document, 'touchstart', 200, 200, [1]); touch.onStart_(getEvent('touchstart', 200, 200, [1]));
fireEvent(document, 'touchmove', 200, 400, [1]); touch.onMove_(getEvent('touchstart', 200, 400, [1]));
fireEvent(document, 'touchend', 200, 200, [1]); touch.onStop_(getEvent('touchstart', 200, 200, [1]));
expect(next).not.toBeCalled(); expect(next).not.toBeCalled();
expect(prev).not.toBeCalled(); expect(prev).not.toBeCalled();
@@ -52,28 +51,30 @@ test('Touch utility', () => {
disabled = false; disabled = false;
fireEvent(document, 'touchstart', 800, 200, [1]); touch.onStart_(getEvent('touchstart', 800, 200, [1]));
fireEvent(document, 'touchmove', 400, 200, [1]); touch.onMove_(getEvent('touchstart', 400, 400, [1]));
fireEvent(document, 'touchend', 400, 200, [1]); touch.onStop_(getEvent('touchstart', 400, 200, [1]));
expect(next.mock.calls.length).toBe(1); expect(next.mock.calls.length).toBe(1);
expect(prev.mock.calls.length).toBe(0); expect(prev.mock.calls.length).toBe(0);
expect(zoom.mock.calls.length).toBe(0); expect(zoom.mock.calls.length).toBe(0);
fireEvent(document, 'touchstart', 200, 200, [1]); touch.onStart_(getEvent('touchstart', 200, 200, [1]));
fireEvent(document, 'touchmove', 400, 200, [1]); touch.onMove_(getEvent('touchstart', 400, 200, [1]));
fireEvent(document, 'touchend', 400, 200, [1]); touch.onStop_(getEvent('touchstart', 400, 200, [1]));
expect(next.mock.calls.length).toBe(1); expect(next.mock.calls.length).toBe(1);
expect(prev.mock.calls.length).toBe(1); expect(prev.mock.calls.length).toBe(1);
expect(zoom.mock.calls.length).toBe(0); expect(zoom.mock.calls.length).toBe(0);
fireEvent(document, 'touchstart', 200, 200, [{clientX: 100, clientY: 100}, {clientX: 400, clientY: 400}]); touch.onStart_(getEvent('touchstart', 200, 200,
fireEvent(document, 'touchmove', 400, 200, [{clientX: 200, clientY: 200}, {clientX: 300, clientY: 300}]); [{clientX: 100, clientY: 100}, {clientX: 400, clientY: 400}]));
fireEvent(document, 'touchend', 400, 200, [{clientX: 200, clientY: 200}, {clientX: 300, clientY: 300}]); touch.onMove_(getEvent('touchstart', 400, 200,
[{clientX: 200, clientY: 200}, {clientX: 300, clientY: 300}]));
touch.onStop_(getEvent('touchstart', 400, 200,
[{clientX: 200, clientY: 200}, {clientX: 300, clientY: 300}]));
expect(next.mock.calls.length).toBe(1); expect(next.mock.calls.length).toBe(1);
expect(prev.mock.calls.length).toBe(1); expect(prev.mock.calls.length).toBe(1);
expect(zoom.mock.calls.length).toBe(1); expect(zoom.mock.calls.length).toBe(1);
}); });

View File

@@ -1,52 +1,40 @@
import Video from '../../src/js/plugins/video'; import Video from '../../src/js/plugins/video';
import DOM from '../../src/js/utils/dom'; import DOM from '../../src/js/utils/dom';
// Copy of DOM.fireEvent, but using touch offets
const fireEvent = (target, eventType, offsetX, offsetY, touches) => {
const event = new CustomEvent(eventType);
event.offsetX = offsetX;
event.offsetY = offsetY;
event.touches = touches;
target.dispatchEvent(event);
};
beforeAll(() => { beforeAll(() => {
const slides = '12345'.replace(/(\d)/g, '<div id="section-$1" class="slide"><video autoplay="true" /></div>'); const slides = '12345'.replace(/(\d)/g,
'<div id="section-$1" class="slide"><video autoplay="true" /></div>');
document.body.innerHTML = `<div id="webslides">${slides}</div>`; document.body.innerHTML = `<div id="webslides">${slides}</div>`;
}); });
test('Video utility', () => { test('Video utility', () => {
const ws = document.getElementById('webslides'); const ws = document.getElementById('webslides');
const slides = ws.querySelectorAll('.slide'); const slides = ws.querySelectorAll('.slide');
const videos = ws.querySelectorAll('video'); const videos = ws.querySelectorAll('video');
const play = jest.fn(); const play = jest.fn();
const pause = jest.fn(); const pause = jest.fn();
videos.forEach( video => { videos.forEach(video => {
video.play = play; video.play = play;
video.pause = pause; video.pause = pause;
}) });
const webslides = { const webslides = {
el: ws, el: ws,
slides: [] slides: []
}; };
slides.forEach( slide => webslides.slides.push({el: slide})); slides.forEach(slide => webslides.slides.push({el: slide}));
expect(ws.querySelectorAll('video[autoplay]').length).toBe(5); expect(ws.querySelectorAll('video[autoplay]').length).toBe(5);
const video = new Video(webslides); new Video(webslides);
expect(ws.querySelectorAll('video[autoplay]').length).toBe(0); expect(ws.querySelectorAll('video[autoplay]').length).toBe(0);
expect(pause.mock.calls.length).toBe(5); expect(pause.mock.calls.length).toBe(5);
webslides.slides.forEach( slide => { webslides.slides.forEach(slide => {
DOM.fireEvent(slide.el, 'slide:enable', {slide: slide}); DOM.fireEvent(slide.el, 'slide:enable', {slide: slide});
DOM.fireEvent(slide.el, 'slide:disable', {slide: slide}); DOM.fireEvent(slide.el, 'slide:disable', {slide: slide});
}) });
expect(pause.mock.calls.length).toBe(10); expect(pause.mock.calls.length).toBe(10);
}); });

View File

@@ -1,24 +1,16 @@
import YouTube from '../../src/js/plugins/youtube'; import YouTube from '../../src/js/plugins/youtube';
import DOM from '../../src/js/utils/dom'; import DOM from '../../src/js/utils/dom';
// Copy of DOM.fireEvent, but using touch offets
const fireEvent = (target, eventType, offsetX, offsetY, touches) => {
const event = new CustomEvent(eventType);
event.offsetX = offsetX;
event.offsetY = offsetY;
event.touches = touches;
target.dispatchEvent(event);
};
beforeAll(() => { beforeAll(() => {
const video = '<div id="section-1" class="slide"><div class="embed"><div data-youtube="video" data-youtube-id="CQY3KUR3VzM" data-autoplay data-loop></div></div></div>'; const video = '<div id="section-1" class="slide"><div class="embed">' +
document.body.innerHTML = `<script></script><div id="webslides">${video}</div>`; '<div data-youtube="video" ' +
' data-youtube-id="CQY3KUR3VzM" ' +
' data-autoplay data-loop></div></div></div>';
document.body.innerHTML =
`<script></script><div id="webslides">${video}</div>`;
}); });
test('YouTube utility', () => { test('YouTube utility', () => {
const ws = document.getElementById('webslides'); const ws = document.getElementById('webslides');
const slides = ws.querySelectorAll('.slide'); const slides = ws.querySelectorAll('.slide');
const play = jest.fn(); const play = jest.fn();
@@ -30,23 +22,32 @@ test('YouTube utility', () => {
el: ws, el: ws,
slides: [] slides: []
}; };
slides.forEach( slide => webslides.slides.push({el: slide})); slides.forEach(slide => webslides.slides.push({el: slide}));
window.YT = { window.YT = {
Player: function(a, b) { Player: function(a, b) {
return { getIframe: () => { return {
getIframe: () => {
const div = DOM.createNode('div'); const div = DOM.createNode('div');
div.innerHTML = '<iframe id="widget8" src="https://www.youtube.com/embed/_m67JbGjWnc" title="YouTube video player" allowfullscreen="1" data-youtube-id="_m67JbGjWnc" frameborder="0" height="360" width="640"></iframe>'; div.innerHTML =
`<iframe id="widget8"
src="https://www.youtube.com/embed/_m67JbGjWnc"
data-youtube-id="_m67JbGjWnc"
frameborder="0" height="360" width="640"></iframe>`;
webslides.slides[0].el.appendChild(div); webslides.slides[0].el.appendChild(div);
return div.querySelector('iframe'); return div.querySelector('iframe');
} }
} }
};
} }
};
const youtube = new YouTube(webslides); new YouTube(webslides);
expect(typeof window.onYouTubeIframeAPIReady).toBe('function'); expect(typeof window.onYouTubeIframeAPIReady).toBe('function');
webslides.el.querySelector('[data-youtube]').dataset = {autoplay: true, youtubeId: 'CQY3KUR3VzM'}; webslides.el.querySelector('[data-youtube]').dataset = {
autoplay: true,
youtubeId: 'CQY3KUR3VzM'
};
window.onYouTubeIframeAPIReady(); window.onYouTubeIframeAPIReady();
@@ -85,5 +86,4 @@ test('YouTube utility', () => {
expect(pause.mock.calls.length).toBe(1); expect(pause.mock.calls.length).toBe(1);
expect(destroy.mock.calls.length).toBe(1); expect(destroy.mock.calls.length).toBe(1);
expect(create.mock.calls.length).toBe(1); expect(create.mock.calls.length).toBe(1);
}); });

View File

@@ -5,7 +5,7 @@ jest.useFakeTimers();
// Copy of DOM.fireEvent, but using keydown // Copy of DOM.fireEvent, but using keydown
const simulateKeyEvent = (el, code) => { const simulateKeyEvent = (el, code) => {
const evt = new KeyboardEvent("keydown", { const evt = new KeyboardEvent('keydown', {
bubbles: true, bubbles: true,
cancelableCode: true, cancelableCode: true,
which: code, which: code,
@@ -14,12 +14,12 @@ const simulateKeyEvent = (el, code) => {
}; };
beforeAll(() => { beforeAll(() => {
const slides = '12345'.replace(/(\d)/g, '<div id="section-$1" class="slide"><div>Slide $1</div></div>'); const slides = '12345'.replace(/(\d)/g,
'<div id="section-$1" class="slide"><div>Slide $1</div></div>');
document.body.innerHTML = `<div id="webslides">${slides}</div>`; document.body.innerHTML = `<div id="webslides">${slides}</div>`;
}); });
test('Zoom utility', () => { test('Zoom utility', () => {
const ws = document.getElementById('webslides'); const ws = document.getElementById('webslides');
const slides = ws.querySelectorAll('.slide'); const slides = ws.querySelectorAll('.slide');
const goto = jest.fn(); const goto = jest.fn();
@@ -33,9 +33,9 @@ test('Zoom utility', () => {
enable: enable, enable: enable,
disable: disable disable: disable
}; };
slides.forEach( slide => webslides.slides.push({el: slide})); slides.forEach(slide => webslides.slides.push({el: slide}));
const zoom = new Zoom(webslides); new Zoom(webslides);
const zws = document.querySelector('#webslides-zoomed'); const zws = document.querySelector('#webslides-zoomed');
const zoomSlides = zws.querySelectorAll('.slide'); const zoomSlides = zws.querySelectorAll('.slide');
@@ -62,5 +62,4 @@ test('Zoom utility', () => {
expect(disable.mock.calls.length).toBe(1); expect(disable.mock.calls.length).toBe(1);
expect(enable.mock.calls.length).toBe(1); expect(enable.mock.calls.length).toBe(1);
expect(goto.mock.calls.length).toBe(1); expect(goto.mock.calls.length).toBe(1);
}); });

View File

@@ -142,7 +142,6 @@ describe('Animation', () => {
expect(DOM.getAnimationEvent(fakeEl)).toBe('oAnimationEnd'); expect(DOM.getAnimationEvent(fakeEl)).toBe('oAnimationEnd');
}); });
test('Prefixed Gecko', () => { test('Prefixed Gecko', () => {
const fakeEl = { const fakeEl = {
style: { style: {
@@ -153,7 +152,6 @@ describe('Animation', () => {
expect(DOM.getAnimationEvent(fakeEl)).toBe('animationend'); expect(DOM.getAnimationEvent(fakeEl)).toBe('animationend');
}); });
test('Prefixed Webkit', () => { test('Prefixed Webkit', () => {
const fakeEl = { const fakeEl = {
style: { style: {
@@ -268,3 +266,4 @@ describe('Focusble Element', () => {
expect(DOM.isFocusableElement()).toBe(true); expect(DOM.isFocusableElement()).toBe(true);
}); });
}); });

View File

@@ -1,115 +0,0 @@
let phantom = require("phantom");
import test from 'ava';
let ph_, page_, status_;
/**
* Functions
*/
const load = async () => {
const log = console.log;
const nolog = function() {};
await phantom.create([], { logger: { warn: log, debug: nolog, error: log } }
).then(async ph => {
ph_ = ph;
return await ph_.createPage();
}).then(page => {
page_ = page;
return page_.open('file:///'+__dirname.replace(/\\/g, '/')+'/../../index.html');
}).then(async status => {
const content = await page_.property('content');
status_ = status;
return true;
}).catch(e => console.log(e));
}
const timeout = async ms => {
return new Promise(resolve => setTimeout(resolve, ms));
}
const onlyOneVisible = async t => {
await page_
.evaluate( () => window.ws.slides.filter(
slide => slide.el.style.display != 'none'
).length == 1 )
.then( ok => { t.true(ok); } );
}
/**
* Tests
*/
test.serial("Page loaded", async t => {
await load();
t.is(status_, 'success');
});
test.serial('#webslides exits', async t => {
await page_
.evaluate( () => document.querySelector('#webslides') != null )
.then( ok => { t.true(ok); } );
});
test.serial('WebSlides object exits', async t => {
await page_
.evaluate( () => window.ws != null )
.then( ok => { t.true(ok); } );
});
test.serial('Has slides', async t => {
await page_
.evaluate( () => window.ws.slides.length > 0 )
.then( ok => { t.true(ok); } );
});
test.serial('First slide visible', async t => {
await page_
.evaluate( () => window.ws.slides[0].el.style.display != 'none' )
.then( ok => { t.true(ok); } );
});
test.serial('Has only one slide visible', onlyOneVisible);
test.serial('goNext', async t => {
// First needs to execute the function
page_
.evaluate( () => {
window.ws.goNext();
return true;
});
// Then wait
await timeout(600);
// Finally test
await page_
.evaluate( () => window.ws.slides[1].el.style.display != 'none' )
.then( ok => { t.true(ok); } );
});
test.serial('Has only one slide visible', onlyOneVisible);
test.serial('goPrev', async t => {
// First needs to execute the function
page_
.evaluate( () => {
window.ws.goPrev();
return true;
});
// Then wait
await timeout(600);
// Finally test
await page_
.evaluate( () => window.ws.slides[0].el.style.display != 'none' )
.then( ok => { t.true(ok); } );
});
test.serial('Has only one slide visible', onlyOneVisible);
/**
* Last test
*/
test.serial('Closing', async t => {
await page_.close();
ph_.exit();
t.true(true);
});