mirror of
https://github.com/DanielnetoDotCom/YouPHPTube
synced 2025-10-03 09:49:28 +02:00
udpate
This commit is contained in:
parent
2f89498789
commit
2da55b4ae7
70 changed files with 6454 additions and 18078 deletions
26
node_modules/.package-lock.json
generated
vendored
26
node_modules/.package-lock.json
generated
vendored
|
@ -151,14 +151,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@silvermine/videojs-chromecast": {
|
"node_modules/@silvermine/videojs-chromecast": {
|
||||||
"version": "1.3.4",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/@silvermine/videojs-chromecast/-/videojs-chromecast-1.3.4.tgz",
|
"resolved": "https://registry.npmjs.org/@silvermine/videojs-chromecast/-/videojs-chromecast-1.4.1.tgz",
|
||||||
"integrity": "sha512-4VC/WEXb18Iex2Tf679RRUR+oSJhNq7+SyMGIsawFglET0IebXnwYKtO6x4t+dVd3be/iN1p5Ny6/iUnny4ljA==",
|
"integrity": "sha512-tXeikkWoNC3WIl2WSkIag1CLMbGsgn+26LM4LoB4qx0TQ8mkg7pgpldCTkvXxLVaDluQ/uEm2uxrgrMmjOc6sw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"webcomponents.js": "git+https://git@github.com/webcomponents/webcomponentsjs.git#v0.7.24"
|
"webcomponents.js": "git+https://git@github.com/webcomponents/webcomponentsjs.git#v0.7.24"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"video.js": ">= 6 < 8"
|
"video.js": ">= 6 < 9"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@videojs/http-streaming": {
|
"node_modules/@videojs/http-streaming": {
|
||||||
|
@ -1915,9 +1915,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/videojs-ima/node_modules/@videojs/http-streaming/node_modules/video.js": {
|
"node_modules/videojs-ima/node_modules/@videojs/http-streaming/node_modules/video.js": {
|
||||||
"version": "7.21.3",
|
"version": "7.21.4",
|
||||||
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.3.tgz",
|
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.4.tgz",
|
||||||
"integrity": "sha512-fIboXbSDCT3P8eVzIEC3hnLDKC/y+6QftcHdFGUVGn5a7qmH62Mh0Bt/SrBAgdmKDQM1qdZXfXAxPg5+IaiIXQ==",
|
"integrity": "sha512-R5e57M/5uqxQMQpFpybNbd8GtiRwFJPqkHjrhv0QTJ2tqnesbjETbck5kU5dhFr1FevsJRFhjBG4hAnvRGnXbw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.12.5",
|
"@babel/runtime": "^7.12.5",
|
||||||
"@videojs/http-streaming": "2.16.2",
|
"@videojs/http-streaming": "2.16.2",
|
||||||
|
@ -1989,9 +1989,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/videojs-ima/node_modules/videojs-contrib-ads/node_modules/video.js": {
|
"node_modules/videojs-ima/node_modules/videojs-contrib-ads/node_modules/video.js": {
|
||||||
"version": "7.21.3",
|
"version": "7.21.4",
|
||||||
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.3.tgz",
|
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.4.tgz",
|
||||||
"integrity": "sha512-fIboXbSDCT3P8eVzIEC3hnLDKC/y+6QftcHdFGUVGn5a7qmH62Mh0Bt/SrBAgdmKDQM1qdZXfXAxPg5+IaiIXQ==",
|
"integrity": "sha512-R5e57M/5uqxQMQpFpybNbd8GtiRwFJPqkHjrhv0QTJ2tqnesbjETbck5kU5dhFr1FevsJRFhjBG4hAnvRGnXbw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.12.5",
|
"@babel/runtime": "^7.12.5",
|
||||||
"@videojs/http-streaming": "2.16.2",
|
"@videojs/http-streaming": "2.16.2",
|
||||||
|
@ -2076,12 +2076,6 @@
|
||||||
"webidl-conversions": "^3.0.0"
|
"webidl-conversions": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/wow.js": {
|
|
||||||
"version": "1.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/wow.js/-/wow.js-1.2.2.tgz",
|
|
||||||
"integrity": "sha512-YTW9eiZimHCJDWofsiz2507txaPteUiQD461I/D8533AiRAn3+Y68/1LDuQ3OTgPjagGZLPYKrpoSgjzeQrO6A==",
|
|
||||||
"deprecated": "deprecated in favour of aos (Animate On Scroll)"
|
|
||||||
},
|
|
||||||
"node_modules/wrappy": {
|
"node_modules/wrappy": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||||
|
|
29
node_modules/@silvermine/videojs-chromecast/CHANGELOG.md
generated
vendored
Normal file
29
node_modules/@silvermine/videojs-chromecast/CHANGELOG.md
generated
vendored
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
See [our coding standards][commit-messages] for commit guidelines.
|
||||||
|
|
||||||
|
### [1.4.1](https://github.com/silvermine/videojs-chromecast/compare/v1.4.0...v1.4.1) (2023-03-21)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* remove deprecated `.extend` method ([994b5b9](https://github.com/silvermine/videojs-chromecast/commit/994b5b9ae6df89f657e2ff4a920056826094b54f)), closes [#152](https://github.com/silvermine/videojs-chromecast/issues/152) [#147](https://github.com/silvermine/videojs-chromecast/issues/147)
|
||||||
|
|
||||||
|
|
||||||
|
## [1.4.0](https://github.com/silvermine/videojs-chromecast/compare/v1.3.4...v1.4.0) (2023-03-21)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* Add optional "Cast" label to button component ([220c362](https://github.com/silvermine/videojs-chromecast/commit/220c36247c9ac992b757b97257e24e665ac3feb5))
|
||||||
|
* Change label to "Disconnect Cast" when connected ([a7f495b](https://github.com/silvermine/videojs-chromecast/commit/a7f495b78d8472322079a75a834440fd20858b3c))
|
||||||
|
* Set image on cast device if the video has a poster ([902464c](https://github.com/silvermine/videojs-chromecast/commit/902464cecf468c554fb062bd93d09bae9e303922))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Chromecast button with label styling breaking on cast/disconnect ([2a181de](https://github.com/silvermine/videojs-chromecast/commit/2a181dea847927050b57453f9474a2f47028fdca))
|
||||||
|
|
||||||
|
|
||||||
|
[commit-messages]: https://github.com/silvermine/silvermine-info/blob/master/commit-history.md#commit-messages
|
20
node_modules/@silvermine/videojs-chromecast/README.md
generated
vendored
20
node_modules/@silvermine/videojs-chromecast/README.md
generated
vendored
|
@ -162,6 +162,9 @@ player.chromecast(); // initializes the Chromecast plugin
|
||||||
the last child of the control bar. A value less than 0 puts the button at the specified
|
the last child of the control bar. A value less than 0 puts the button at the specified
|
||||||
position from the end of the control bar. Note that it's likely not all child components
|
position from the end of the control bar. Note that it's likely not all child components
|
||||||
of the control bar are visible.
|
of the control bar are visible.
|
||||||
|
* **`plugins.chromecast.addCastLabelToButton`** (default: `false`) - by default, the Chromecast
|
||||||
|
button component will display only an icon. Setting `addCastLabelToButton` to `true` will
|
||||||
|
display a label titled `"Cast"` alongside the default icon.
|
||||||
|
|
||||||
##### Chromecast Tech configuration
|
##### Chromecast Tech configuration
|
||||||
|
|
||||||
|
@ -230,14 +233,17 @@ options = {
|
||||||
|
|
||||||
##### Localization
|
##### Localization
|
||||||
|
|
||||||
The `ChromecastButton` component has one translated string: "Open Chromecast menu". The
|
The `ChromecastButton` component has two translated strings: "Open Chromecast menu" and "Cast".
|
||||||
"Open Chromecast menu" string appears in both of the standard places for Button component
|
|
||||||
accessibility text: inside the `.vjs-control-text` span and as the `<button>` element's
|
|
||||||
`title` attribute.
|
|
||||||
|
|
||||||
To localize the Chromecast button text, follow the steps in the
|
* The "Open Chromecast menu" string appears in both of the standard places for Button
|
||||||
[Video.js Languages tutorial][videojs-translation] to add an `"Open Chromecast menu"` key
|
component accessibility text: inside the `.vjs-control-text` span and as the `<button>`
|
||||||
to the map of translation strings.
|
element's `title` attribute.
|
||||||
|
* The "Cast" string appears in an optional label within the Button component: inside the
|
||||||
|
`.vjs-chromecast-button-label` span.
|
||||||
|
|
||||||
|
To localize the Chromecast button strings, follow the steps in the
|
||||||
|
[Video.js Languages tutorial][videojs-translation] to add `"Open Chromecast menu"`
|
||||||
|
and `"Cast"` keys to the map of translation strings.
|
||||||
|
|
||||||
### Using the npm module
|
### Using the npm module
|
||||||
|
|
||||||
|
|
2
node_modules/@silvermine/videojs-chromecast/dist/silvermine-videojs-chromecast.css
generated
vendored
2
node_modules/@silvermine/videojs-chromecast/dist/silvermine-videojs-chromecast.css
generated
vendored
|
@ -1 +1 @@
|
||||||
.vjs-chromecast-button .vjs-icon-placeholder{background:url("images/ic_cast_white_24dp.png") center center no-repeat;background-size:contain;display:inline-block;width:12px;height:12px}.vjs-chromecast-button:hover{cursor:pointer}.vjs-chromecast-button:hover .vjs-icon-placeholder{background-image:url("images/ic_cast_white_24dp.png")}.vjs-chromecast-button.vjs-chromecast-casting-state .vjs-icon-placeholder{background-image:url("images/ic_cast_connected_white_24dp.png")}.vjs-chromecast-button.vjs-chromecast-casting-state:hover .vjs-icon-placeholder{background-image:url("images/ic_cast_connected_white_24dp.png")}.vjs-tech-chromecast{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;overflow:hidden}.vjs-tech-chromecast .vjs-tech-chromecast-poster::after{content:" ";display:block;height:2px;width:100px;background-color:#ccc;position:absolute;left:calc(50% - 50px)}.vjs-tech-chromecast .vjs-tech-chromecast-poster-img{max-height:180px;width:auto;border:2px solid #ccc}.vjs-tech-chromecast .vjs-tech-chromecast-poster-img.vjs-tech-chromecast-poster-img-empty{width:160px;height:90px}.vjs-tech-chromecast .vjs-tech-chromecast-title-container{position:absolute;bottom:50%;margin-bottom:100px;color:#ccc;text-align:center}.vjs-tech-chromecast .vjs-tech-chromecast-title{font-size:22px}.vjs-tech-chromecast .vjs-tech-chromecast-title.vjs-tech-chromecast-title-empty{display:none}.vjs-tech-chromecast .vjs-tech-chromecast-subtitle{font-size:18px;padding-top:.5em}.vjs-tech-chromecast .vjs-tech-chromecast-subtitle.vjs-tech-chromecast-subtitle-empty{display:none}
|
.vjs-chromecast-button .vjs-icon-placeholder{background:url("images/ic_cast_white_24dp.png") center center no-repeat;background-size:contain;display:inline-block;width:12px;height:12px}.vjs-chromecast-button:hover{cursor:pointer}.vjs-chromecast-button:hover .vjs-icon-placeholder{background-image:url("images/ic_cast_white_24dp.png")}.vjs-chromecast-button.vjs-chromecast-casting-state .vjs-icon-placeholder{background-image:url("images/ic_cast_connected_white_24dp.png")}.vjs-chromecast-button.vjs-chromecast-casting-state:hover .vjs-icon-placeholder{background-image:url("images/ic_cast_connected_white_24dp.png")}.vjs-chromecast-button.vjs-chromecast-button-lg:not(.vjs-hidden){display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;width:auto;padding:0 4px}.vjs-chromecast-button.vjs-chromecast-button-lg:not(.vjs-hidden) .vjs-chromecast-button-label{-webkit-box-flex:1;flex-grow:1;margin-left:4px}.vjs-chromecast-button.vjs-chromecast-button-lg:not(.vjs-hidden) .vjs-icon-placeholder{-webkit-box-flex:1;flex-grow:1}.vjs-tech-chromecast{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;overflow:hidden}.vjs-tech-chromecast .vjs-tech-chromecast-poster::after{content:" ";display:block;height:2px;width:100px;background-color:#ccc;position:absolute;left:calc(50% - 50px)}.vjs-tech-chromecast .vjs-tech-chromecast-poster-img{max-height:180px;width:auto;border:2px solid #ccc}.vjs-tech-chromecast .vjs-tech-chromecast-poster-img.vjs-tech-chromecast-poster-img-empty{width:160px;height:90px}.vjs-tech-chromecast .vjs-tech-chromecast-title-container{position:absolute;bottom:50%;margin-bottom:100px;color:#ccc;text-align:center}.vjs-tech-chromecast .vjs-tech-chromecast-title{font-size:22px}.vjs-tech-chromecast .vjs-tech-chromecast-title.vjs-tech-chromecast-title-empty{display:none}.vjs-tech-chromecast .vjs-tech-chromecast-subtitle{font-size:18px;padding-top:.5em}.vjs-tech-chromecast .vjs-tech-chromecast-subtitle.vjs-tech-chromecast-subtitle-empty{display:none}
|
3667
node_modules/@silvermine/videojs-chromecast/dist/silvermine-videojs-chromecast.js
generated
vendored
3667
node_modules/@silvermine/videojs-chromecast/dist/silvermine-videojs-chromecast.js
generated
vendored
File diff suppressed because it is too large
Load diff
2700
node_modules/@silvermine/videojs-chromecast/dist/silvermine-videojs-chromecast.min.js
generated
vendored
2700
node_modules/@silvermine/videojs-chromecast/dist/silvermine-videojs-chromecast.min.js
generated
vendored
File diff suppressed because it is too large
Load diff
8
node_modules/@silvermine/videojs-chromecast/package.json
generated
vendored
8
node_modules/@silvermine/videojs-chromecast/package.json
generated
vendored
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@silvermine/videojs-chromecast",
|
"name": "@silvermine/videojs-chromecast",
|
||||||
"version": "1.3.4",
|
"version": "1.4.1",
|
||||||
"description": "video.js plugin for casting to chromecast",
|
"description": "video.js plugin for casting to chromecast",
|
||||||
"main": "src/js/index.js",
|
"main": "src/js/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
@ -37,8 +37,8 @@
|
||||||
"webcomponents.js": "git+https://git@github.com/webcomponents/webcomponentsjs.git#v0.7.24"
|
"webcomponents.js": "git+https://git@github.com/webcomponents/webcomponentsjs.git#v0.7.24"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "7.13.16",
|
"@babel/core": "7.20.7",
|
||||||
"@babel/preset-env": "7.13.15",
|
"@babel/preset-env": "7.20.2",
|
||||||
"@commitlint/cli": "8.3.5",
|
"@commitlint/cli": "8.3.5",
|
||||||
"@commitlint/travis-cli": "8.3.5",
|
"@commitlint/travis-cli": "8.3.5",
|
||||||
"@silvermine/eslint-config": "3.0.1",
|
"@silvermine/eslint-config": "3.0.1",
|
||||||
|
@ -68,6 +68,6 @@
|
||||||
"sinon": "2.3.5"
|
"sinon": "2.3.5"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"video.js": ">= 6 < 8"
|
"video.js": ">= 6 < 9"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
285
node_modules/@silvermine/videojs-chromecast/src/js/components/ChromecastButton.js
generated
vendored
285
node_modules/@silvermine/videojs-chromecast/src/js/components/ChromecastButton.js
generated
vendored
|
@ -1,135 +1,14 @@
|
||||||
/**
|
module.exports = function(videojs) {
|
||||||
* The ChromecastButton module contains both the ChromecastButton class definition and
|
|
||||||
* the function used to register the button as a Video.js Component.
|
|
||||||
*
|
|
||||||
* @module ChromecastButton
|
|
||||||
*/
|
|
||||||
|
|
||||||
var ChromecastButton;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The Video.js Button class is the base class for UI button components.
|
|
||||||
*
|
|
||||||
* @external Button
|
|
||||||
* @see {@link http://docs.videojs.com/Button.html|Button}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @lends ChromecastButton.prototype */
|
|
||||||
ChromecastButton = {
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class is a button component designed to be displayed in the player UI's control
|
|
||||||
* bar. It opens the Chromecast menu when clicked.
|
|
||||||
*
|
|
||||||
* @constructs
|
|
||||||
* @extends external:Button
|
|
||||||
* @param player {Player} the video.js player instance
|
|
||||||
*/
|
|
||||||
constructor: function(player) {
|
|
||||||
this.constructor.super_.apply(this, arguments);
|
|
||||||
|
|
||||||
player.on('chromecastConnected', this._onChromecastConnected.bind(this));
|
|
||||||
player.on('chromecastDisconnected', this._onChromecastDisconnected.bind(this));
|
|
||||||
player.on('chromecastDevicesAvailable', this._onChromecastDevicesAvailable.bind(this));
|
|
||||||
player.on('chromecastDevicesUnavailable', this._onChromecastDevicesUnavailable.bind(this));
|
|
||||||
|
|
||||||
this.controlText('Open Chromecast menu');
|
|
||||||
|
|
||||||
// Use the initial state of `hasAvailableDevices` to call the corresponding event
|
|
||||||
// handlers because the corresponding events may have already been emitted before
|
|
||||||
// binding the listeners above.
|
|
||||||
if (player.chromecastSessionManager && player.chromecastSessionManager.hasAvailableDevices()) {
|
|
||||||
this._onChromecastDevicesAvailable();
|
|
||||||
} else {
|
|
||||||
this._onChromecastDevicesUnavailable();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overrides Button#buildCSSClass to return the classes used on the button element.
|
|
||||||
*
|
|
||||||
* @param el {DOMElement}
|
|
||||||
* @see {@link http://docs.videojs.com/Button.html#buildCSSClass|Button#buildCSSClass}
|
|
||||||
*/
|
|
||||||
buildCSSClass: function() {
|
|
||||||
return 'vjs-chromecast-button ' + (this._isChromecastConnected ? 'vjs-chromecast-casting-state ' : '') +
|
|
||||||
this.constructor.super_.prototype.buildCSSClass();
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overrides Button#handleClick to handle button click events. Chromecast functionality
|
|
||||||
* is handled outside of this class, which should be limited to UI related logic. This
|
|
||||||
* function simply triggers an event on the player.
|
|
||||||
*
|
|
||||||
* @fires ChromecastButton#chromecastRequested
|
|
||||||
* @param el {DOMElement}
|
|
||||||
* @see {@link http://docs.videojs.com/Button.html#handleClick|Button#handleClick}
|
|
||||||
*/
|
|
||||||
handleClick: function() {
|
|
||||||
this.player().trigger('chromecastRequested');
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles `chromecastConnected` player events.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
_onChromecastConnected: function() {
|
|
||||||
this._isChromecastConnected = true;
|
|
||||||
this._reloadCSSClasses();
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles `chromecastDisconnected` player events.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
_onChromecastDisconnected: function() {
|
|
||||||
this._isChromecastConnected = false;
|
|
||||||
this._reloadCSSClasses();
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles `chromecastDevicesAvailable` player events.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
_onChromecastDevicesAvailable: function() {
|
|
||||||
this.show();
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles `chromecastDevicesUnavailable` player events.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
_onChromecastDevicesUnavailable: function() {
|
|
||||||
this.hide();
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Re-calculates which CSS classes the button needs and sets them on the buttons'
|
|
||||||
* DOMElement.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
_reloadCSSClasses: function() {
|
|
||||||
if (!this.el_) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.el_.className = this.buildCSSClass();
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers the ChromecastButton Component with Video.js. Calls
|
* Registers the ChromecastButton Component with Video.js. Calls
|
||||||
* {@link http://docs.videojs.com/Component.html#.registerComponent}, which will add a
|
* {@link http://docs.videojs.com/Component.html#.registerComponent}, which will add a
|
||||||
* component called `chromecastButton` to the list of globally registered Video.js
|
* component called `chromecastButton` to the list of globally registered Video.js
|
||||||
* components. The `chromecastButton` is added to the player's control bar UI
|
* components. The `chromecastButton` is added to the player's control bar UI
|
||||||
* automatically once {@link module:enableChromecast} has been called. If you would like
|
* automatically once {@link module:enableChromecast} has been called. If you would
|
||||||
* to specify the order of the buttons that appear in the control bar, including this
|
* like to specify the order of the buttons that appear in the control bar, including
|
||||||
* button, you can do so in the options that you pass to the `videojs` function when
|
* this button, you can do so in the options that you pass to the `videojs` function
|
||||||
* creating a player:
|
* when creating a player:
|
||||||
*
|
*
|
||||||
* ```
|
* ```
|
||||||
* videojs('playerID', {
|
* videojs('playerID', {
|
||||||
|
@ -148,9 +27,155 @@ ChromecastButton = {
|
||||||
* @param videojs {object} A reference to {@link http://docs.videojs.com/module-videojs.html|Video.js}
|
* @param videojs {object} A reference to {@link http://docs.videojs.com/module-videojs.html|Video.js}
|
||||||
* @see http://docs.videojs.com/module-videojs.html#~registerPlugin
|
* @see http://docs.videojs.com/module-videojs.html#~registerPlugin
|
||||||
*/
|
*/
|
||||||
module.exports = function(videojs) {
|
|
||||||
var ChromecastButtonImpl;
|
|
||||||
|
|
||||||
ChromecastButtonImpl = videojs.extend(videojs.getComponent('Button'), ChromecastButton);
|
/**
|
||||||
videojs.registerComponent('chromecastButton', ChromecastButtonImpl);
|
* The Video.js Button class is the base class for UI button components.
|
||||||
|
*
|
||||||
|
* @external Button
|
||||||
|
* @see {@link http://docs.videojs.com/Button.html|Button}
|
||||||
|
*/
|
||||||
|
const ButtonComponent = videojs.getComponent('Button');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ChromecastButton module contains both the ChromecastButton class definition and
|
||||||
|
* the function used to register the button as a Video.js Component.
|
||||||
|
* @module ChromecastButton
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @lends ChromecastButton.prototype **/
|
||||||
|
class ChromecastButton extends ButtonComponent {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is a button component designed to be displayed in the
|
||||||
|
* player UI's control bar. It opens the Chromecast menu when clicked.
|
||||||
|
*
|
||||||
|
* @constructs
|
||||||
|
* @extends external:Button
|
||||||
|
* @param player {Player} the video.js player instance
|
||||||
|
*/
|
||||||
|
constructor(player, options) {
|
||||||
|
super(player, options);
|
||||||
|
|
||||||
|
player.on('chromecastConnected', this._onChromecastConnected.bind(this));
|
||||||
|
player.on('chromecastDisconnected', this._onChromecastDisconnected.bind(this));
|
||||||
|
player.on('chromecastDevicesAvailable', this._onChromecastDevicesAvailable.bind(this));
|
||||||
|
player.on('chromecastDevicesUnavailable', this._onChromecastDevicesUnavailable.bind(this));
|
||||||
|
|
||||||
|
// Use the initial state of `hasAvailableDevices` to call the corresponding event
|
||||||
|
// handlers because the corresponding events may have already been emitted before
|
||||||
|
// binding the listeners above.
|
||||||
|
if (player.chromecastSessionManager && player.chromecastSessionManager.hasAvailableDevices()) {
|
||||||
|
this._onChromecastDevicesAvailable();
|
||||||
|
} else {
|
||||||
|
this._onChromecastDevicesUnavailable();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.addCastLabelToButton) {
|
||||||
|
this.el().classList.add('vjs-chromecast-button-lg');
|
||||||
|
|
||||||
|
this._labelEl = document.createElement('span');
|
||||||
|
this._labelEl.classList.add('vjs-chromecast-button-label');
|
||||||
|
this._updateCastLabelText();
|
||||||
|
|
||||||
|
this.el().appendChild(this._labelEl);
|
||||||
|
} else {
|
||||||
|
this.controlText('Open Chromecast menu');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overrides Button#buildCSSClass to return the classes used on the button element.
|
||||||
|
*
|
||||||
|
* @param el {DOMElement}
|
||||||
|
* @see {@link http://docs.videojs.com/Button.html#buildCSSClass|Button#buildCSSClass}
|
||||||
|
*/
|
||||||
|
buildCSSClass() {
|
||||||
|
return 'vjs-chromecast-button ' +
|
||||||
|
(this._isChromecastConnected ? 'vjs-chromecast-casting-state ' : '') +
|
||||||
|
(this.options_.addCastLabelToButton ? 'vjs-chromecast-button-lg ' : '') +
|
||||||
|
ButtonComponent.prototype.buildCSSClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overrides Button#handleClick to handle button click events. Chromecast
|
||||||
|
* functionality is handled outside of this class, which should be limited
|
||||||
|
* to UI related logic. This function simply triggers an event on the player.
|
||||||
|
*
|
||||||
|
* @fires ChromecastButton#chromecastRequested
|
||||||
|
* @param el {DOMElement}
|
||||||
|
* @see {@link http://docs.videojs.com/Button.html#handleClick|Button#handleClick}
|
||||||
|
*/
|
||||||
|
handleClick() {
|
||||||
|
this.player().trigger('chromecastRequested');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles `chromecastConnected` player events.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_onChromecastConnected() {
|
||||||
|
this._isChromecastConnected = true;
|
||||||
|
this._reloadCSSClasses();
|
||||||
|
this._updateCastLabelText();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles `chromecastDisconnected` player events.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_onChromecastDisconnected() {
|
||||||
|
this._isChromecastConnected = false;
|
||||||
|
this._reloadCSSClasses();
|
||||||
|
this._updateCastLabelText();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles `chromecastDevicesAvailable` player events.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_onChromecastDevicesAvailable() {
|
||||||
|
this.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles `chromecastDevicesUnavailable` player events.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_onChromecastDevicesUnavailable() {
|
||||||
|
this.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Re-calculates which CSS classes the button needs and sets them on the buttons'
|
||||||
|
* DOMElement.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_reloadCSSClasses() {
|
||||||
|
if (!this.el_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.el_.className = this.buildCSSClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the optional cast label text based on whether the chromecast is connected
|
||||||
|
* or disconnected.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_updateCastLabelText() {
|
||||||
|
if (!this._labelEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._labelEl.textContent = this._isChromecastConnected ? this.localize('Disconnect Cast') : this.localize('Cast');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
videojs.registerComponent('chromecastButton', ChromecastButton);
|
||||||
};
|
};
|
||||||
|
|
465
node_modules/@silvermine/videojs-chromecast/src/js/tech/ChromecastTech.js
generated
vendored
465
node_modules/@silvermine/videojs-chromecast/src/js/tech/ChromecastTech.js
generated
vendored
|
@ -1,13 +1,29 @@
|
||||||
var ChromecastSessionManager = require('../chromecast/ChromecastSessionManager'),
|
var ChromecastSessionManager = require('../chromecast/ChromecastSessionManager'),
|
||||||
ChromecastTechUI = require('./ChromecastTechUI'),
|
ChromecastTechUI = require('./ChromecastTechUI');
|
||||||
SESSION_TIMEOUT = 10 * 1000, // milliseconds
|
|
||||||
ChromecastTech;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Registers the ChromecastTech Tech with Video.js. Calls {@link
|
||||||
|
* http://docs.videojs.com/Tech.html#.registerTech}, which will add a Tech called
|
||||||
|
* `chromecast` to the list of globally registered Video.js Tech implementations.
|
||||||
|
*
|
||||||
|
* [Video.js Tech](http://docs.videojs.com/Tech.html) are initialized and used
|
||||||
|
* automatically by Video.js Player instances. Whenever a new source is set on the player,
|
||||||
|
* the player iterates through the list of available Tech to determine which to use to
|
||||||
|
* play the source.
|
||||||
|
*
|
||||||
|
* @param videojs {object} A reference to
|
||||||
|
* {@link http://docs.videojs.com/module-videojs.html|Video.js}
|
||||||
|
* @see http://docs.videojs.com/Tech.html#.registerTech
|
||||||
|
*/
|
||||||
|
module.exports = function(videojs) {
|
||||||
|
var Tech = videojs.getComponent('Tech'),
|
||||||
|
SESSION_TIMEOUT = 10 * 1000; // milliseconds
|
||||||
|
|
||||||
|
/**
|
||||||
* @module ChomecastTech
|
* @module ChomecastTech
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Video.js Tech class is the base class for classes that provide media playback
|
* The Video.js Tech class is the base class for classes that provide media playback
|
||||||
* technology implementations to Video.js such as HTML5, Flash and HLS.
|
* technology implementations to Video.js such as HTML5, Flash and HLS.
|
||||||
*
|
*
|
||||||
|
@ -15,8 +31,8 @@ var ChromecastSessionManager = require('../chromecast/ChromecastSessionManager')
|
||||||
* @see {@link http://docs.videojs.com/Tech.html|Tech}
|
* @see {@link http://docs.videojs.com/Tech.html|Tech}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @lends ChromecastTech.prototype */
|
/** @lends ChromecastTech.prototype */
|
||||||
ChromecastTech = {
|
class ChromecastTech extends Tech {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implements Video.js playback {@link http://docs.videojs.com/tutorial-tech_.html|Tech}
|
* Implements Video.js playback {@link http://docs.videojs.com/tutorial-tech_.html|Tech}
|
||||||
|
@ -27,22 +43,29 @@ ChromecastTech = {
|
||||||
* @param options {object} The options to use for configuration
|
* @param options {object} The options to use for configuration
|
||||||
* @see {@link https://developers.google.com/cast/|Google Cast}
|
* @see {@link https://developers.google.com/cast/|Google Cast}
|
||||||
*/
|
*/
|
||||||
constructor: function(options) {
|
constructor(options) {
|
||||||
var subclass;
|
super(options);
|
||||||
|
|
||||||
|
this.featuresVolumeControl = true;
|
||||||
|
this.featuresPlaybackRate = false;
|
||||||
|
this.movingMediaElementInDOM = false;
|
||||||
|
this.featuresFullscreenResize = true;
|
||||||
|
this.featuresTimeupdateEvents = true;
|
||||||
|
this.featuresProgressEvents = false;
|
||||||
|
// Text tracks are not supported in this version
|
||||||
|
this.featuresNativeTextTracks = false;
|
||||||
|
this.featuresNativeAudioTracks = false;
|
||||||
|
this.featuresNativeVideoTracks = false;
|
||||||
|
|
||||||
|
// Give ChromecastTech class instances a reference to videojs
|
||||||
|
this.videojs = videojs;
|
||||||
this._eventListeners = [];
|
this._eventListeners = [];
|
||||||
|
|
||||||
this.videojsPlayer = this.videojs(options.playerId);
|
this.videojsPlayer = this.videojs(options.playerId);
|
||||||
this._chromecastSessionManager = this.videojsPlayer.chromecastSessionManager;
|
this._chromecastSessionManager = this.videojsPlayer.chromecastSessionManager;
|
||||||
|
|
||||||
// We have to initialize the UI here, before calling super.constructor
|
|
||||||
// because the constructor calls `createEl`, which references `this._ui`.
|
|
||||||
this._ui = new ChromecastTechUI();
|
|
||||||
this._ui.updatePoster(this.videojsPlayer.poster());
|
this._ui.updatePoster(this.videojsPlayer.poster());
|
||||||
|
|
||||||
// Call the super class' constructor function
|
|
||||||
subclass = this.constructor.super_.apply(this, arguments);
|
|
||||||
|
|
||||||
this._remotePlayer = this._chromecastSessionManager.getRemotePlayer();
|
this._remotePlayer = this._chromecastSessionManager.getRemotePlayer();
|
||||||
this._remotePlayerController = this._chromecastSessionManager.getRemotePlayerController();
|
this._remotePlayerController = this._chromecastSessionManager.getRemotePlayerController();
|
||||||
this._listenToPlayerControllerEvents();
|
this._listenToPlayerControllerEvents();
|
||||||
|
@ -59,9 +82,7 @@ ChromecastTech = {
|
||||||
this.ready(function() {
|
this.ready(function() {
|
||||||
this.setMuted(options.muted);
|
this.setMuted(options.muted);
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
|
}
|
||||||
return subclass;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a DOMElement that Video.js displays in its player UI while this Tech is
|
* Creates a DOMElement that Video.js displays in its player UI while this Tech is
|
||||||
|
@ -70,17 +91,21 @@ ChromecastTech = {
|
||||||
* @returns {DOMElement}
|
* @returns {DOMElement}
|
||||||
* @see {@link http://docs.videojs.com/Tech.html#createEl}
|
* @see {@link http://docs.videojs.com/Tech.html#createEl}
|
||||||
*/
|
*/
|
||||||
createEl: function() {
|
createEl() {
|
||||||
|
// We have to initialize the UI here, because the super.constructor
|
||||||
|
// calls `createEl`, which references `this._ui`.
|
||||||
|
this._ui = this._ui || new ChromecastTechUI();
|
||||||
|
|
||||||
return this._ui.getDOMElement();
|
return this._ui.getDOMElement();
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resumes playback if a media item is paused or restarts an item from its beginning if
|
* Resumes playback if a media item is paused or restarts an item from
|
||||||
* the item has played and ended.
|
* its beginning if the item has played and ended.
|
||||||
*
|
*
|
||||||
* @see {@link http://docs.videojs.com/Player.html#play}
|
* @see {@link http://docs.videojs.com/Player.html#play}
|
||||||
*/
|
*/
|
||||||
play: function() {
|
play() {
|
||||||
if (!this.paused()) {
|
if (!this.paused()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -90,7 +115,7 @@ ChromecastTech = {
|
||||||
} else {
|
} else {
|
||||||
this._remotePlayerController.playOrPause();
|
this._remotePlayerController.playOrPause();
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pauses playback if the player is not already paused and if the current media item
|
* Pauses playback if the player is not already paused and if the current media item
|
||||||
|
@ -98,22 +123,22 @@ ChromecastTech = {
|
||||||
*
|
*
|
||||||
* @see {@link http://docs.videojs.com/Player.html#pause}
|
* @see {@link http://docs.videojs.com/Player.html#pause}
|
||||||
*/
|
*/
|
||||||
pause: function() {
|
pause() {
|
||||||
if (!this.paused() && this._remotePlayer.canPause) {
|
if (!this.paused() && this._remotePlayer.canPause) {
|
||||||
this._remotePlayerController.playOrPause();
|
this._remotePlayerController.playOrPause();
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether or not the player is "paused". Video.js' definition of "paused" is
|
* Returns whether or not the player is "paused". Video.js'
|
||||||
* "playback paused" OR "not playing".
|
* definition of "paused" is "playback paused" OR "not playing".
|
||||||
*
|
*
|
||||||
* @returns {boolean} true if playback is paused
|
* @returns {boolean} true if playback is paused
|
||||||
* @see {@link http://docs.videojs.com/Player.html#paused}
|
* @see {@link http://docs.videojs.com/Player.html#paused}
|
||||||
*/
|
*/
|
||||||
paused: function() {
|
paused() {
|
||||||
return this._remotePlayer.isPaused || this.ended() || this._remotePlayer.playerState === null;
|
return this._remotePlayer.isPaused || this.ended() || this._remotePlayer.playerState === null;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stores the given source and begins playback, starting at the beginning
|
* Stores the given source and begins playback, starting at the beginning
|
||||||
|
@ -122,24 +147,26 @@ ChromecastTech = {
|
||||||
* @param source {object} the source to store and play
|
* @param source {object} the source to store and play
|
||||||
* @see {@link http://docs.videojs.com/Player.html#src}
|
* @see {@link http://docs.videojs.com/Player.html#src}
|
||||||
*/
|
*/
|
||||||
setSource: function(source) {
|
setSource(source) {
|
||||||
if (this._currentSource && this._currentSource.src === source.src && this._currentSource.type === source.type) {
|
if (this._currentSource && this._currentSource.src === source.src && this._currentSource.type === source.type) {
|
||||||
// Skip setting the source if the `source` argument is the same as what's already
|
// Skip setting the source if the `source` argument is the
|
||||||
// been set. This `setSource` function calls `this._playSource` which sends a
|
// same as what's already been set. This `setSource` function
|
||||||
// "load media" request to the Chromecast PlayerController. Because this function
|
// calls `this._playSource` which sends a "load media" request
|
||||||
|
// to the Chromecast PlayerController. Because this function
|
||||||
// may be called multiple times in rapid succession with the same `source`
|
// may be called multiple times in rapid succession with the same `source`
|
||||||
// argument, we need to de-duplicate calls with the same `source` argument to
|
// argument, we need to de-duplicate calls with the same `source` argument to
|
||||||
// prevent overwhelming the Chromecast PlayerController with expensive "load
|
// prevent overwhelming the Chromecast PlayerController with expensive "load
|
||||||
// media" requests, which it itself does not de-duplicate.
|
// media" requests, which it itself does not de-duplicate.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// We cannot use `this.videojsPlayer.currentSource()` because the value returned by
|
// We cannot use `this.videojsPlayer.currentSource()` because the
|
||||||
// that function is not the same as what's returned by the Video.js Player's
|
// value returned by that function is not the same as what's returned
|
||||||
// middleware after they are run. Also, simply using `this.videojsPlayer.src()`
|
// by the Video.js Player's middleware after they are run. Also, simply
|
||||||
// does not include mimetype information which we pass to the Chromecast player.
|
// using `this.videojsPlayer.src()` does not include mimetype information
|
||||||
|
// which we pass to the Chromecast player.
|
||||||
this._currentSource = source;
|
this._currentSource = source;
|
||||||
this._playSource(source, 0);
|
this._playSource(source, 0);
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Plays the given source, beginning at an optional starting time.
|
* Plays the given source, beginning at an optional starting time.
|
||||||
|
@ -149,11 +176,12 @@ ChromecastTech = {
|
||||||
* @param [startTime] The time to start playback at, in seconds
|
* @param [startTime] The time to start playback at, in seconds
|
||||||
* @see {@link http://docs.videojs.com/Player.html#src}
|
* @see {@link http://docs.videojs.com/Player.html#src}
|
||||||
*/
|
*/
|
||||||
_playSource: function(source, startTime) {
|
_playSource(source, startTime) {
|
||||||
var castSession = this._getCastSession(),
|
var castSession = this._getCastSession(),
|
||||||
mediaInfo = new chrome.cast.media.MediaInfo(source.src, source.type),
|
mediaInfo = new chrome.cast.media.MediaInfo(source.src, source.type),
|
||||||
title = this._requestTitle(source),
|
title = this._requestTitle(source),
|
||||||
subtitle = this._requestSubtitle(source),
|
subtitle = this._requestSubtitle(source),
|
||||||
|
poster = this.poster(),
|
||||||
customData = this._requestCustomData(source),
|
customData = this._requestCustomData(source),
|
||||||
request;
|
request;
|
||||||
|
|
||||||
|
@ -168,6 +196,9 @@ ChromecastTech = {
|
||||||
? chrome.cast.media.StreamType.LIVE
|
? chrome.cast.media.StreamType.LIVE
|
||||||
: chrome.cast.media.StreamType.BUFFERED;
|
: chrome.cast.media.StreamType.BUFFERED;
|
||||||
|
|
||||||
|
if (poster) {
|
||||||
|
mediaInfo.metadata.images = [ { url: poster } ];
|
||||||
|
}
|
||||||
if (customData) {
|
if (customData) {
|
||||||
mediaInfo.customData = customData;
|
mediaInfo.customData = customData;
|
||||||
}
|
}
|
||||||
|
@ -184,8 +215,8 @@ ChromecastTech = {
|
||||||
castSession.loadMedia(request)
|
castSession.loadMedia(request)
|
||||||
.then(function() {
|
.then(function() {
|
||||||
if (!this._hasPlayedAnyItem) {
|
if (!this._hasPlayedAnyItem) {
|
||||||
// `triggerReady` is required here to notify the Video.js player that the
|
// `triggerReady` is required here to notify the Video.js
|
||||||
// Tech has been initialized and is ready.
|
// player that the Tech has been initialized and is ready.
|
||||||
this.triggerReady();
|
this.triggerReady();
|
||||||
}
|
}
|
||||||
this.trigger('loadstart');
|
this.trigger('loadstart');
|
||||||
|
@ -196,17 +227,17 @@ ChromecastTech = {
|
||||||
this._isMediaLoading = false;
|
this._isMediaLoading = false;
|
||||||
this._getMediaSession().addUpdateListener(this._onMediaSessionStatusChanged.bind(this));
|
this._getMediaSession().addUpdateListener(this._onMediaSessionStatusChanged.bind(this));
|
||||||
}.bind(this), this._triggerErrorEvent.bind(this));
|
}.bind(this), this._triggerErrorEvent.bind(this));
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manually updates the current time. The playback position will jump to the given time
|
* Manually updates the current time. The playback position will jump to
|
||||||
* and continue playing if the item was playing when `setCurrentTime` was called, or
|
* the given time and continue playing if the item was playing when `setCurrentTime`
|
||||||
* remain paused if the item was paused.
|
* was called, or remain paused if the item was paused.
|
||||||
*
|
*
|
||||||
* @param time {number} the playback time position to jump to
|
* @param time {number} the playback time position to jump to
|
||||||
* @see {@link http://docs.videojs.com/Tech.html#setCurrentTime}
|
* @see {@link http://docs.videojs.com/Tech.html#setCurrentTime}
|
||||||
*/
|
*/
|
||||||
setCurrentTime: function(time) {
|
setCurrentTime(time) {
|
||||||
var duration = this.duration();
|
var duration = this.duration();
|
||||||
|
|
||||||
if (time > duration || !this._remotePlayer.canSeek) {
|
if (time > duration || !this._remotePlayer.canSeek) {
|
||||||
|
@ -218,7 +249,7 @@ ChromecastTech = {
|
||||||
this._remotePlayer.currentTime = Math.min(duration - 1, time);
|
this._remotePlayer.currentTime = Math.min(duration - 1, time);
|
||||||
this._remotePlayerController.seek();
|
this._remotePlayerController.seek();
|
||||||
this._triggerTimeUpdateEvent();
|
this._triggerTimeUpdateEvent();
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the current playback time position.
|
* Returns the current playback time position.
|
||||||
|
@ -226,50 +257,52 @@ ChromecastTech = {
|
||||||
* @returns {number} the current playback time position
|
* @returns {number} the current playback time position
|
||||||
* @see {@link http://docs.videojs.com/Player.html#currentTime}
|
* @see {@link http://docs.videojs.com/Player.html#currentTime}
|
||||||
*/
|
*/
|
||||||
currentTime: function() {
|
currentTime() {
|
||||||
// There is a brief period of time when Video.js has switched to the chromecast
|
// There is a brief period of time when Video.js has switched to the chromecast
|
||||||
// Tech, but chromecast has not yet loaded its first media item. During that time,
|
// Tech, but chromecast has not yet loaded its first media item. During
|
||||||
// Video.js calls this `currentTime` function to update its player UI. In that
|
// that time, Video.js calls this `currentTime` function to update
|
||||||
// period, `this._remotePlayer.currentTime` will be 0 because the media has not
|
// its player UI. In that period, `this._remotePlayer.currentTime`
|
||||||
// loaded yet. To prevent the UI from using a 0 second currentTime, we use the
|
// will be 0 because the media has not loaded yet. To prevent the
|
||||||
// currentTime passed in to the first media item that was provided to the Tech until
|
// UI from using a 0 second currentTime, we use the currentTime passed
|
||||||
|
// in to the first media item that was provided to the Tech until
|
||||||
// chromecast plays its first item.
|
// chromecast plays its first item.
|
||||||
if (!this._hasPlayedAnyItem) {
|
if (!this._hasPlayedAnyItem) {
|
||||||
return this._initialStartTime;
|
return this._initialStartTime;
|
||||||
}
|
}
|
||||||
return this._remotePlayer.currentTime;
|
return this._remotePlayer.currentTime;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the duration of the current media item, or `0` if the source is not set or
|
* Returns the duration of the current media item, or `0` if the source
|
||||||
* if the duration of the item is not available from the Chromecast API yet.
|
* is not set or if the duration of the item is not available from the
|
||||||
|
* Chromecast API yet.
|
||||||
*
|
*
|
||||||
* @returns {number} the duration of the current media item
|
* @returns {number} the duration of the current media item
|
||||||
* @see {@link http://docs.videojs.com/Player.html#duration}
|
* @see {@link http://docs.videojs.com/Player.html#duration}
|
||||||
*/
|
*/
|
||||||
duration: function() {
|
duration() {
|
||||||
// There is a brief period of time when Video.js has switched to the chromecast
|
// There is a brief period of time when Video.js has switched to the chromecast
|
||||||
// Tech, but chromecast has not yet loaded its first media item. During that time,
|
// Tech, but chromecast has not yet loaded its first media item.
|
||||||
// Video.js calls this `duration` function to update its player UI. In that period,
|
// During that time, Video.js calls this `duration` function to update its player
|
||||||
// `this._remotePlayer.duration` will be 0 because the media has not loaded yet. To
|
// UI. In that period, `this._remotePlayer.duration` will be 0 because the media
|
||||||
// prevent the UI from using a 0 second duration, we use the duration passed in to
|
// has not loaded yet. To prevent the UI from using a 0 second duration, we
|
||||||
// the first media item that was provided to the Tech until chromecast plays its
|
// use the duration passed in to the first media item that was provided to
|
||||||
// first item.
|
// the Tech until chromecast plays its first item.
|
||||||
if (!this._hasPlayedAnyItem) {
|
if (!this._hasPlayedAnyItem) {
|
||||||
return this.videojsPlayer.duration();
|
return this.videojsPlayer.duration();
|
||||||
}
|
}
|
||||||
return this._remotePlayer.duration;
|
return this._remotePlayer.duration;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether or not the current media item has finished playing. Returns `false`
|
* Returns whether or not the current media item has finished playing.
|
||||||
* if a media item has not been loaded, has not been played, or has not yet finished
|
* Returns `false` if a media item has not been loaded, has not been played,
|
||||||
* playing.
|
* or has not yet finished playing.
|
||||||
*
|
*
|
||||||
* @returns {boolean} true if the current media item has finished playing
|
* @returns {boolean} true if the current media item has finished playing
|
||||||
* @see {@link http://docs.videojs.com/Player.html#ended}
|
* @see {@link http://docs.videojs.com/Player.html#ended}
|
||||||
*/
|
*/
|
||||||
ended: function() {
|
ended() {
|
||||||
var mediaSession = this._getMediaSession();
|
var mediaSession = this._getMediaSession();
|
||||||
|
|
||||||
if (!mediaSession && this._hasMediaSessionEnded) {
|
if (!mediaSession && this._hasMediaSessionEnded) {
|
||||||
|
@ -277,7 +310,7 @@ ChromecastTech = {
|
||||||
}
|
}
|
||||||
|
|
||||||
return mediaSession ? (mediaSession.idleReason === chrome.cast.media.IdleReason.FINISHED) : false;
|
return mediaSession ? (mediaSession.idleReason === chrome.cast.media.IdleReason.FINISHED) : false;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the current volume level setting as a decimal number between `0` and `1`.
|
* Returns the current volume level setting as a decimal number between `0` and `1`.
|
||||||
|
@ -285,28 +318,28 @@ ChromecastTech = {
|
||||||
* @returns {number} the current volume level
|
* @returns {number} the current volume level
|
||||||
* @see {@link http://docs.videojs.com/Player.html#volume}
|
* @see {@link http://docs.videojs.com/Player.html#volume}
|
||||||
*/
|
*/
|
||||||
volume: function() {
|
volume() {
|
||||||
return this._remotePlayer.volumeLevel;
|
return this._remotePlayer.volumeLevel;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the current volume level. Volume level is a decimal number between `0` and `1`,
|
* Sets the current volume level. Volume level is a decimal number
|
||||||
* where `0` is muted and `1` is the loudest volume level.
|
* between `0` and `1`, where `0` is muted and `1` is the loudest volume level.
|
||||||
*
|
*
|
||||||
* @param volumeLevel {number}
|
* @param volumeLevel {number}
|
||||||
* @returns {number} the current volume level
|
* @returns {number} the current volume level
|
||||||
* @see {@link http://docs.videojs.com/Player.html#volume}
|
* @see {@link http://docs.videojs.com/Player.html#volume}
|
||||||
*/
|
*/
|
||||||
setVolume: function(volumeLevel) {
|
setVolume(volumeLevel) {
|
||||||
this._remotePlayer.volumeLevel = volumeLevel;
|
this._remotePlayer.volumeLevel = volumeLevel;
|
||||||
this._remotePlayerController.setVolumeLevel();
|
this._remotePlayerController.setVolumeLevel();
|
||||||
// This event is triggered by the listener on
|
// This event is triggered by the listener on
|
||||||
// `RemotePlayerEventType.VOLUME_LEVEL_CHANGED`, but waiting for that event to fire
|
// `RemotePlayerEventType.VOLUME_LEVEL_CHANGED`, but waiting for
|
||||||
// in response to calls to `setVolume` introduces noticeable lag in the updating of
|
// that event to fire in response to calls to `setVolume` introduces
|
||||||
// the player UI's volume slider bar, which makes user interaction with the volume
|
// noticeable lag in the updating of the player UI's volume slider bar,
|
||||||
// slider choppy.
|
// which makes user interaction with the volume slider choppy.
|
||||||
this._triggerVolumeChangeEvent();
|
this._triggerVolumeChangeEvent();
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether or not the player is currently muted.
|
* Returns whether or not the player is currently muted.
|
||||||
|
@ -314,22 +347,23 @@ ChromecastTech = {
|
||||||
* @returns {boolean} true if the player is currently muted
|
* @returns {boolean} true if the player is currently muted
|
||||||
* @see {@link http://docs.videojs.com/Player.html#muted}
|
* @see {@link http://docs.videojs.com/Player.html#muted}
|
||||||
*/
|
*/
|
||||||
muted: function() {
|
muted() {
|
||||||
return this._remotePlayer.isMuted;
|
return this._remotePlayer.isMuted;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mutes or un-mutes the player. Does nothing if the player is currently muted and the
|
* Mutes or un-mutes the player. Does nothing if the player is currently
|
||||||
* `isMuted` parameter is true or if the player is not muted and `isMuted` is false.
|
* muted and the `isMuted` parameter is true or if the player is not muted and
|
||||||
|
* `isMuted` is false.
|
||||||
*
|
*
|
||||||
* @param isMuted {boolean} whether or not the player should be muted
|
* @param isMuted {boolean} whether or not the player should be muted
|
||||||
* @see {@link http://docs.videojs.com/Html5.html#setMuted} for an example
|
* @see {@link http://docs.videojs.com/Html5.html#setMuted} for an example
|
||||||
*/
|
*/
|
||||||
setMuted: function(isMuted) {
|
setMuted(isMuted) {
|
||||||
if ((this._remotePlayer.isMuted && !isMuted) || (!this._remotePlayer.isMuted && isMuted)) {
|
if ((this._remotePlayer.isMuted && !isMuted) || (!this._remotePlayer.isMuted && isMuted)) {
|
||||||
this._remotePlayerController.muteOrUnmute();
|
this._remotePlayerController.muteOrUnmute();
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the URL to the current poster image.
|
* Gets the URL to the current poster image.
|
||||||
|
@ -337,65 +371,68 @@ ChromecastTech = {
|
||||||
* @returns {string} URL to the current poster image or `undefined` if none exists
|
* @returns {string} URL to the current poster image or `undefined` if none exists
|
||||||
* @see {@link http://docs.videojs.com/Player.html#poster}
|
* @see {@link http://docs.videojs.com/Player.html#poster}
|
||||||
*/
|
*/
|
||||||
poster: function() {
|
poster() {
|
||||||
return this._ui.getPoster();
|
return this._ui.getPoster();
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the URL to the current poster image. The poster image shown in the Chromecast
|
* Sets the URL to the current poster image. The poster image shown
|
||||||
* Tech UI view is updated with this new URL.
|
* in the Chromecast Tech UI view is updated with this new URL.
|
||||||
*
|
*
|
||||||
* @param poster {string} the URL to the new poster image
|
* @param poster {string} the URL to the new poster image
|
||||||
* @see {@link http://docs.videojs.com/Tech.html#setPoster}
|
* @see {@link http://docs.videojs.com/Tech.html#setPoster}
|
||||||
*/
|
*/
|
||||||
setPoster: function(poster) {
|
setPoster(poster) {
|
||||||
this._ui.updatePoster(poster);
|
this._ui.updatePoster(poster);
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function is "required" when implementing {@link external:Tech} and is supposed
|
* This function is "required" when implementing {@link external:Tech}
|
||||||
* to return a mock
|
* and is supposed to return a mock
|
||||||
* {@link https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges|TimeRanges}
|
* {@link https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges|TimeRanges}
|
||||||
* object that represents the portions of the current media item that have been
|
* object that represents the portions of the current media item that have been
|
||||||
* buffered. However, the Chromecast API does not currently provide a way to determine
|
* buffered. However, the Chromecast API does not currently provide a way
|
||||||
* how much the media item has buffered, so we always return `undefined`.
|
* to determine how much the media item has buffered, so we always
|
||||||
|
* return `undefined`.
|
||||||
*
|
*
|
||||||
* Returning `undefined` is safe: the player will simply not display the buffer amount
|
* Returning `undefined` is safe: the player will simply not display
|
||||||
* indicator in the scrubber UI.
|
* the buffer amount indicator in the scrubber UI.
|
||||||
*
|
*
|
||||||
* @returns {undefined} always returns `undefined`
|
* @returns {undefined} always returns `undefined`
|
||||||
* @see {@link http://docs.videojs.com/Player.html#buffered}
|
* @see {@link http://docs.videojs.com/Player.html#buffered}
|
||||||
*/
|
*/
|
||||||
buffered: function() {
|
buffered() {
|
||||||
return undefined;
|
return undefined;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function is "required" when implementing {@link external:Tech} and is supposed
|
* This function is "required" when implementing {@link external:Tech}
|
||||||
* to return a mock
|
* and is supposed to return a mock
|
||||||
* {@link https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges|TimeRanges}
|
* {@link https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges|TimeRanges}
|
||||||
* object that represents the portions of the current media item that has playable
|
* object that represents the portions of the current media item that has playable
|
||||||
* content. However, the Chromecast API does not currently provide a way to determine
|
* content. However, the Chromecast API does not currently provide a
|
||||||
* how much the media item has playable content, so we'll just assume the entire video
|
* way to determine how much the media item has playable content, so
|
||||||
* is an available seek target.
|
* we'll just assume the entire video is an available seek target.
|
||||||
*
|
*
|
||||||
* The risk here lies with live streaming, where there may exist a sliding window of
|
* The risk here lies with live streaming, where there may exist a sliding window of
|
||||||
* playable content and seeking is only possible within the last X number of minutes,
|
* playable content and seeking is only possible within the last X number of
|
||||||
* rather than for the entire video.
|
* minutes, rather than for the entire video.
|
||||||
*
|
*
|
||||||
* Unfortunately we have no way of detecting when this is the case. Returning anything
|
* Unfortunately we have no way of detecting when this is the case. Returning
|
||||||
* other than the full range of the video means that we lose the ability to seek during
|
* anything other than the full range of the video means that we lose the ability
|
||||||
* VOD.
|
* to seek during VOD.
|
||||||
*
|
*
|
||||||
* @returns {TimeRanges} always returns a `TimeRanges` object with one `TimeRange` that
|
* @returns {TimeRanges} always returns a `TimeRanges` object with one
|
||||||
* starts at `0` and ends at the `duration` of the current media item
|
* `TimeRange` that starts at `0` and ends at the `duration` of the
|
||||||
|
* current media item
|
||||||
* @see {@link http://docs.videojs.com/Player.html#seekable}
|
* @see {@link http://docs.videojs.com/Player.html#seekable}
|
||||||
*/
|
*/
|
||||||
seekable: function() {
|
seekable() {
|
||||||
// TODO Investigate if there's a way to detect if the source is live, so that we can
|
// TODO Investigate if there's a way to detect
|
||||||
|
// if the source is live, so that we can
|
||||||
// possibly adjust the seekable `TimeRanges` accordingly.
|
// possibly adjust the seekable `TimeRanges` accordingly.
|
||||||
return this.videojs.createTimeRange(0, this.duration());
|
return this.videojs.createTimeRange(0, this.duration());
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether the native media controls should be shown (`true`) or hidden
|
* Returns whether the native media controls should be shown (`true`) or hidden
|
||||||
|
@ -404,32 +441,32 @@ ChromecastTech = {
|
||||||
* @returns {boolean} always returns `false`
|
* @returns {boolean} always returns `false`
|
||||||
* @see {@link http://docs.videojs.com/Html5.html#controls} for an example
|
* @see {@link http://docs.videojs.com/Html5.html#controls} for an example
|
||||||
*/
|
*/
|
||||||
controls: function() {
|
controls() {
|
||||||
return false;
|
return false;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether or not the browser should show the player "inline" (non-fullscreen)
|
* Returns whether or not the browser should show the player
|
||||||
* by default. This function always returns true to tell the browser that non-
|
* "inline" (non-fullscreen) by default. This function always
|
||||||
* fullscreen playback is preferred.
|
* returns true to tell the browser that non-fullscreen playback is preferred.
|
||||||
*
|
*
|
||||||
* @returns {boolean} always returns `true`
|
* @returns {boolean} always returns `true`
|
||||||
* @see {@link http://docs.videojs.com/Html5.html#playsinline} for an example
|
* @see {@link http://docs.videojs.com/Html5.html#playsinline} for an example
|
||||||
*/
|
*/
|
||||||
playsinline: function() {
|
playsinline() {
|
||||||
return true;
|
return true;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether or not fullscreen is supported by this Tech. Always returns `true`
|
* Returns whether or not fullscreen is supported by this Tech.
|
||||||
* because fullscreen is always supported.
|
* Always returns `true` because fullscreen is always supported.
|
||||||
*
|
*
|
||||||
* @returns {boolean} always returns `true`
|
* @returns {boolean} always returns `true`
|
||||||
* @see {@link http://docs.videojs.com/Html5.html#supportsFullScreen} for an example
|
* @see {@link http://docs.videojs.com/Html5.html#supportsFullScreen} for an example
|
||||||
*/
|
*/
|
||||||
supportsFullScreen: function() {
|
supportsFullScreen() {
|
||||||
return true;
|
return true;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets a flag that determines whether or not the media should automatically begin
|
* Sets a flag that determines whether or not the media should automatically begin
|
||||||
|
@ -438,54 +475,54 @@ ChromecastTech = {
|
||||||
*
|
*
|
||||||
* @see {@link http://docs.videojs.com/Html5.html#setAutoplay} for an example
|
* @see {@link http://docs.videojs.com/Html5.html#setAutoplay} for an example
|
||||||
*/
|
*/
|
||||||
setAutoplay: function() {
|
setAutoplay() {
|
||||||
// Not supported
|
// Not supported
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns {number} the chromecast player's playback rate, if available. Otherwise,
|
* @returns {number} the chromecast player's playback rate, if available. Otherwise,
|
||||||
* the return value defaults to `1`.
|
* the return value defaults to `1`.
|
||||||
*/
|
*/
|
||||||
playbackRate: function() {
|
playbackRate() {
|
||||||
var mediaSession = this._getMediaSession();
|
var mediaSession = this._getMediaSession();
|
||||||
|
|
||||||
return mediaSession ? mediaSession.playbackRate : 1;
|
return mediaSession ? mediaSession.playbackRate : 1;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Does nothing. Changing the playback rate is not supported.
|
* Does nothing. Changing the playback rate is not supported.
|
||||||
*/
|
*/
|
||||||
setPlaybackRate: function() {
|
setPlaybackRate() {
|
||||||
// Not supported
|
// Not supported
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Does nothing. Satisfies calls to the missing preload method.
|
* Does nothing. Satisfies calls to the missing preload method.
|
||||||
*/
|
*/
|
||||||
preload: function() {
|
preload() {
|
||||||
// Not supported
|
// Not supported
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Causes the Tech to begin loading the current source. `load` is not supported in this
|
* Causes the Tech to begin loading the current source. `load`
|
||||||
* ChromecastTech because setting the source on the `Chromecast` automatically causes
|
* is not supported in this ChromecastTech because setting the
|
||||||
* it to begin loading.
|
* source on the `Chromecast` automatically causes it to begin loading.
|
||||||
*/
|
*/
|
||||||
load: function() {
|
load() {
|
||||||
// Not supported
|
// Not supported
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the Chromecast equivalent of HTML5 Media Element's `readyState`.
|
* Gets the Chromecast equivalent of HTML5 Media Element's `readyState`.
|
||||||
*
|
*
|
||||||
* @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState
|
||||||
*/
|
*/
|
||||||
readyState: function() {
|
readyState() {
|
||||||
if (this._remotePlayer.playerState === 'IDLE' || this._remotePlayer.playerState === 'BUFFERING') {
|
if (this._remotePlayer.playerState === 'IDLE' || this._remotePlayer.playerState === 'BUFFERING') {
|
||||||
return 0; // HAVE_NOTHING
|
return 0; // HAVE_NOTHING
|
||||||
}
|
}
|
||||||
return 4;
|
return 4;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wires up event listeners for
|
* Wires up event listeners for
|
||||||
|
@ -494,7 +531,7 @@ ChromecastTech = {
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
_listenToPlayerControllerEvents: function() {
|
_listenToPlayerControllerEvents() {
|
||||||
var eventTypes = cast.framework.RemotePlayerEventType;
|
var eventTypes = cast.framework.RemotePlayerEventType;
|
||||||
|
|
||||||
this._addEventListener(this._remotePlayerController, eventTypes.PLAYER_STATE_CHANGED, this._onPlayerStateChanged, this);
|
this._addEventListener(this._remotePlayerController, eventTypes.PLAYER_STATE_CHANGED, this._onPlayerStateChanged, this);
|
||||||
|
@ -502,24 +539,25 @@ ChromecastTech = {
|
||||||
this._addEventListener(this._remotePlayerController, eventTypes.IS_MUTED_CHANGED, this._triggerVolumeChangeEvent, this);
|
this._addEventListener(this._remotePlayerController, eventTypes.IS_MUTED_CHANGED, this._triggerVolumeChangeEvent, this);
|
||||||
this._addEventListener(this._remotePlayerController, eventTypes.CURRENT_TIME_CHANGED, this._triggerTimeUpdateEvent, this);
|
this._addEventListener(this._remotePlayerController, eventTypes.CURRENT_TIME_CHANGED, this._triggerTimeUpdateEvent, this);
|
||||||
this._addEventListener(this._remotePlayerController, eventTypes.DURATION_CHANGED, this._triggerDurationChangeEvent, this);
|
this._addEventListener(this._remotePlayerController, eventTypes.DURATION_CHANGED, this._triggerDurationChangeEvent, this);
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers an event listener on the given target object. Because many objects in the
|
* Registers an event listener on the given target object.
|
||||||
* Chromecast API are either singletons or must be shared between instances of
|
* Because many objects in the Chromecast API are either singletons
|
||||||
* `ChromecastTech` for the lifetime of the player, we must unbind the listeners when
|
* or must be shared between instances of `ChromecastTech` for the
|
||||||
* this Tech instance is destroyed to prevent memory leaks. To do that, we need to keep
|
* lifetime of the player, we must unbind the listeners when this Tech
|
||||||
* a reference to listeners that are added to global objects so that we can use those
|
* instance is destroyed to prevent memory leaks. To do that, we need to keep
|
||||||
* references to remove the listener when this Tech is destroyed.
|
* a reference to listeners that are added to global objects so that we can
|
||||||
|
* use those references to remove the listener when this Tech is destroyed.
|
||||||
*
|
*
|
||||||
* @param target {object} the object to register the event listener on
|
* @param target {object} the object to register the event listener on
|
||||||
* @param type {string} the name of the event
|
* @param type {string} the name of the event
|
||||||
* @param callback {Function} the listener's callback function that executes when the
|
* @param callback {Function} the listener's callback function that
|
||||||
* event is emitted
|
* executes when the event is emitted
|
||||||
* @param context {object} the `this` context to use when executing the `callback`
|
* @param context {object} the `this` context to use when executing the `callback`
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
_addEventListener: function(target, type, callback, context) {
|
_addEventListener(target, type, callback, context) {
|
||||||
var listener;
|
var listener;
|
||||||
|
|
||||||
listener = {
|
listener = {
|
||||||
|
@ -531,30 +569,30 @@ ChromecastTech = {
|
||||||
};
|
};
|
||||||
target.addEventListener(type, listener.listener);
|
target.addEventListener(type, listener.listener);
|
||||||
this._eventListeners.push(listener);
|
this._eventListeners.push(listener);
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes all event listeners that were registered with global objects during the
|
* Removes all event listeners that were registered with global objects during the
|
||||||
* lifetime of this Tech. See {@link _addEventListener} for more information about why
|
* lifetime of this Tech. See {@link _addEventListener} for more information
|
||||||
* this is necessary.
|
* about why this is necessary.
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
_removeAllEventListeners: function() {
|
_removeAllEventListeners() {
|
||||||
while (this._eventListeners.length > 0) {
|
while (this._eventListeners.length > 0) {
|
||||||
this._removeEventListener(this._eventListeners[0]);
|
this._removeEventListener(this._eventListeners[0]);
|
||||||
}
|
}
|
||||||
this._eventListeners = [];
|
this._eventListeners = [];
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes a single event listener that was registered with global objects during the
|
* Removes a single event listener that was registered with global objects
|
||||||
* lifetime of this Tech. See {@link _addEventListener} for more information about why
|
* during the lifetime of this Tech. See {@link _addEventListener} for
|
||||||
* this is necessary.
|
* more information about why this is necessary.
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
_removeEventListener: function(listener) {
|
_removeEventListener(listener) {
|
||||||
var index = -1,
|
var index = -1,
|
||||||
pass = false,
|
pass = false,
|
||||||
i;
|
i;
|
||||||
|
@ -576,7 +614,7 @@ ChromecastTech = {
|
||||||
if (index !== -1) {
|
if (index !== -1) {
|
||||||
this._eventListeners.splice(index, 1);
|
this._eventListeners.splice(index, 1);
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles Chromecast player state change events. The player may "change state" when
|
* Handles Chromecast player state change events. The player may "change state" when
|
||||||
|
@ -584,7 +622,7 @@ ChromecastTech = {
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
_onPlayerStateChanged: function() {
|
_onPlayerStateChanged() {
|
||||||
var states = chrome.cast.media.PlayerState,
|
var states = chrome.cast.media.PlayerState,
|
||||||
playerState = this._remotePlayer.playerState;
|
playerState = this._remotePlayer.playerState;
|
||||||
|
|
||||||
|
@ -602,33 +640,33 @@ ChromecastTech = {
|
||||||
} else if (playerState === states.BUFFERING) {
|
} else if (playerState === states.BUFFERING) {
|
||||||
this.trigger('waiting');
|
this.trigger('waiting');
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles Chromecast MediaSession state change events. The only property sent to this
|
* Handles Chromecast MediaSession state change events. The only property sent
|
||||||
* event is whether the session is alive. This is useful for determining if an item has
|
* to this event is whether the session is alive. This is useful for determining
|
||||||
* ended as the MediaSession will fire this event with `false` then be immediately
|
* if an item has ended as the MediaSession will fire this event with `false` then
|
||||||
* destroyed. This means that we cannot trust `idleReason` to show whether an item has
|
* be immediately destroyed. This means that we cannot trust `idleReason` to show
|
||||||
* ended since we may no longer have access to the MediaSession.
|
* whether an item has ended since we may no longer have access to the MediaSession.
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
_onMediaSessionStatusChanged: function(isAlive) {
|
_onMediaSessionStatusChanged(isAlive) {
|
||||||
this._hasMediaSessionEnded = !!isAlive;
|
this._hasMediaSessionEnded = !!isAlive;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ends the session after a certain number of seconds of inactivity.
|
* Ends the session after a certain number of seconds of inactivity.
|
||||||
*
|
*
|
||||||
* If the Chromecast player is in the "IDLE" state after an item has ended, and no
|
* If the Chromecast player is in the "IDLE" state after an item has ended, and no
|
||||||
* further items are queued up to play, the session is considered inactive. Once a
|
* further items are queued up to play, the session is considered inactive. Once a
|
||||||
* period of time (currently 10 seconds) has elapsed with no activity, we manually end
|
* period of time (currently 10 seconds) has elapsed with no activity, we manually
|
||||||
* the session to prevent long periods of a blank Chromecast screen that is shown at
|
* end the session to prevent long periods of a blank Chromecast screen that is
|
||||||
* the end of item playback.
|
* shown at the end of item playback.
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
_closeSessionOnTimeout: function() {
|
_closeSessionOnTimeout() {
|
||||||
// Ensure that there's never more than one session timeout active
|
// Ensure that there's never more than one session timeout active
|
||||||
this._clearSessionTimeout();
|
this._clearSessionTimeout();
|
||||||
this._sessionTimeoutID = setTimeout(function() {
|
this._sessionTimeoutID = setTimeout(function() {
|
||||||
|
@ -639,7 +677,7 @@ ChromecastTech = {
|
||||||
}
|
}
|
||||||
this._clearSessionTimeout();
|
this._clearSessionTimeout();
|
||||||
}.bind(this), SESSION_TIMEOUT);
|
}.bind(this), SESSION_TIMEOUT);
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stops the timeout that is waiting during a period of inactivity in order to close
|
* Stops the timeout that is waiting during a period of inactivity in order to close
|
||||||
|
@ -648,115 +686,86 @@ ChromecastTech = {
|
||||||
* @private
|
* @private
|
||||||
* @see _closeSessionOnTimeout
|
* @see _closeSessionOnTimeout
|
||||||
*/
|
*/
|
||||||
_clearSessionTimeout: function() {
|
_clearSessionTimeout() {
|
||||||
if (this._sessionTimeoutID) {
|
if (this._sessionTimeoutID) {
|
||||||
clearTimeout(this._sessionTimeoutID);
|
clearTimeout(this._sessionTimeoutID);
|
||||||
this._sessionTimeoutID = false;
|
this._sessionTimeoutID = false;
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* @return {object} the current CastContext, if one exists
|
* @return {object} the current CastContext, if one exists
|
||||||
*/
|
*/
|
||||||
_getCastContext: function() {
|
_getCastContext() {
|
||||||
return this._chromecastSessionManager.getCastContext();
|
return this._chromecastSessionManager.getCastContext();
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* @return {object} the current CastSession, if one exists
|
* @return {object} the current CastSession, if one exists
|
||||||
*/
|
*/
|
||||||
_getCastSession: function() {
|
_getCastSession() {
|
||||||
return this._getCastContext().getCurrentSession();
|
return this._getCastContext().getCurrentSession();
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* @return {object} the current MediaSession, if one exists
|
* @return {object} the current MediaSession, if one exists
|
||||||
* @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.Media
|
* @see https://developers.google.com/cast/docs/reference/chrome/chrome.cast.media.Media
|
||||||
*/
|
*/
|
||||||
_getMediaSession: function() {
|
_getMediaSession() {
|
||||||
var castSession = this._getCastSession();
|
var castSession = this._getCastSession();
|
||||||
|
|
||||||
return castSession ? castSession.getMediaSession() : null;
|
return castSession ? castSession.getMediaSession() : null;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Triggers a 'volumechange' event
|
* Triggers a 'volumechange' event
|
||||||
* @private
|
* @private
|
||||||
* @see http://docs.videojs.com/Player.html#event:volumechange
|
* @see http://docs.videojs.com/Player.html#event:volumechange
|
||||||
*/
|
*/
|
||||||
_triggerVolumeChangeEvent: function() {
|
_triggerVolumeChangeEvent() {
|
||||||
this.trigger('volumechange');
|
this.trigger('volumechange');
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Triggers a 'timeupdate' event
|
* Triggers a 'timeupdate' event
|
||||||
* @private
|
* @private
|
||||||
* @see http://docs.videojs.com/Player.html#event:timeupdate
|
* @see http://docs.videojs.com/Player.html#event:timeupdate
|
||||||
*/
|
*/
|
||||||
_triggerTimeUpdateEvent: function() {
|
_triggerTimeUpdateEvent() {
|
||||||
this.trigger('timeupdate');
|
this.trigger('timeupdate');
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Triggers a 'durationchange' event
|
* Triggers a 'durationchange' event
|
||||||
* @private
|
* @private
|
||||||
* @see http://docs.videojs.com/Player.html#event:durationchange
|
* @see http://docs.videojs.com/Player.html#event:durationchange
|
||||||
*/
|
*/
|
||||||
_triggerDurationChangeEvent: function() {
|
_triggerDurationChangeEvent() {
|
||||||
this.trigger('durationchange');
|
this.trigger('durationchange');
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Triggers an 'error' event
|
* Triggers an 'error' event
|
||||||
* @private
|
* @private
|
||||||
* @see http://docs.videojs.com/Player.html#event:error
|
* @see http://docs.videojs.com/Player.html#event:error
|
||||||
*/
|
*/
|
||||||
_triggerErrorEvent: function() {
|
_triggerErrorEvent() {
|
||||||
this.trigger('error');
|
this.trigger('error');
|
||||||
},
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers the ChromecastTech Tech with Video.js. Calls {@link
|
|
||||||
* http://docs.videojs.com/Tech.html#.registerTech}, which will add a Tech called
|
|
||||||
* `chromecast` to the list of globally registered Video.js Tech implementations.
|
|
||||||
*
|
|
||||||
* [Video.js Tech](http://docs.videojs.com/Tech.html) are initialized and used
|
|
||||||
* automatically by Video.js Player instances. Whenever a new source is set on the player,
|
|
||||||
* the player iterates through the list of available Tech to determine which to use to
|
|
||||||
* play the source.
|
|
||||||
*
|
|
||||||
* @param videojs {object} A reference to
|
|
||||||
* {@link http://docs.videojs.com/module-videojs.html|Video.js}
|
|
||||||
* @see http://docs.videojs.com/Tech.html#.registerTech
|
|
||||||
*/
|
|
||||||
module.exports = function(videojs) {
|
|
||||||
var Tech = videojs.getComponent('Tech'),
|
|
||||||
ChromecastTechImpl;
|
|
||||||
|
|
||||||
ChromecastTechImpl = videojs.extend(Tech, ChromecastTech);
|
|
||||||
|
|
||||||
// Required for Video.js Tech implementations.
|
// Required for Video.js Tech implementations.
|
||||||
// TODO Consider a more comprehensive check based on mimetype.
|
// TODO Consider a more comprehensive check based on mimetype.
|
||||||
ChromecastTechImpl.canPlaySource = () => { return ChromecastSessionManager.isChromecastConnected(); };
|
ChromecastTech.canPlaySource = () => {
|
||||||
ChromecastTechImpl.isSupported = () => { return ChromecastSessionManager.isChromecastConnected(); };
|
return ChromecastSessionManager.isChromecastConnected();
|
||||||
|
};
|
||||||
|
|
||||||
ChromecastTechImpl.prototype.featuresVolumeControl = true;
|
ChromecastTech.isSupported = () => {
|
||||||
ChromecastTechImpl.prototype.featuresPlaybackRate = false;
|
return ChromecastSessionManager.isChromecastConnected();
|
||||||
ChromecastTechImpl.prototype.movingMediaElementInDOM = false;
|
};
|
||||||
ChromecastTechImpl.prototype.featuresFullscreenResize = true;
|
|
||||||
ChromecastTechImpl.prototype.featuresTimeupdateEvents = true;
|
|
||||||
ChromecastTechImpl.prototype.featuresProgressEvents = false;
|
|
||||||
// Text tracks are not supported in this version
|
|
||||||
ChromecastTechImpl.prototype.featuresNativeTextTracks = false;
|
|
||||||
ChromecastTechImpl.prototype.featuresNativeAudioTracks = false;
|
|
||||||
ChromecastTechImpl.prototype.featuresNativeVideoTracks = false;
|
|
||||||
|
|
||||||
// Give ChromecastTech class instances a reference to videojs
|
videojs.registerTech('chromecast', ChromecastTech);
|
||||||
ChromecastTechImpl.prototype.videojs = videojs;
|
|
||||||
|
|
||||||
videojs.registerTech('chromecast', ChromecastTechImpl);
|
|
||||||
};
|
};
|
||||||
|
|
16
node_modules/@silvermine/videojs-chromecast/src/scss/_chromecastButton.scss
generated
vendored
16
node_modules/@silvermine/videojs-chromecast/src/scss/_chromecastButton.scss
generated
vendored
|
@ -6,6 +6,7 @@ $icon-chromecast-casting--hover: 'images/ic_cast_connected_white_24dp.png' !defa
|
||||||
|
|
||||||
// Sizes
|
// Sizes
|
||||||
$chromecast-icon-size: 12px !default;
|
$chromecast-icon-size: 12px !default;
|
||||||
|
$chromecast-button-spacing: 4px !default;
|
||||||
|
|
||||||
.vjs-chromecast-button {
|
.vjs-chromecast-button {
|
||||||
.vjs-icon-placeholder {
|
.vjs-icon-placeholder {
|
||||||
|
@ -30,3 +31,18 @@ $chromecast-icon-size: 12px !default;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.vjs-chromecast-button.vjs-chromecast-button-lg:not(.vjs-hidden) {
|
||||||
|
// Fits both the icon and the label on the same control
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
width: auto;
|
||||||
|
padding: 0 $chromecast-button-spacing;
|
||||||
|
.vjs-chromecast-button-label {
|
||||||
|
flex-grow: 1;
|
||||||
|
margin-left: $chromecast-button-spacing;
|
||||||
|
}
|
||||||
|
.vjs-icon-placeholder {
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
<a name="7.21.4"></a>
|
||||||
|
## [7.21.4](https://github.com/videojs/video.js/compare/v7.21.3...v7.21.4) (2023-03-15)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **lang:** updated Japanese translations ([#8194](https://github.com/videojs/video.js/issues/8194)) ([7eed745](https://github.com/videojs/video.js/commit/7eed745))
|
||||||
|
* replay button broken for native playback ([#8142](https://github.com/videojs/video.js/issues/8142)) ([#8183](https://github.com/videojs/video.js/issues/8183)) ([bda2b06](https://github.com/videojs/video.js/commit/bda2b06))
|
||||||
|
|
||||||
|
### Chores
|
||||||
|
|
||||||
|
* **documentation:** Update release flow in collaborator guide md ([#8166](https://github.com/videojs/video.js/issues/8166)) ([2e939e2](https://github.com/videojs/video.js/commit/2e939e2))
|
||||||
|
* use next-7 tag instead of next tag for 7x version during npm publish ([#8164](https://github.com/videojs/video.js/issues/8164)) ([852493d](https://github.com/videojs/video.js/commit/852493d))
|
||||||
|
|
||||||
<a name="7.21.3"></a>
|
<a name="7.21.3"></a>
|
||||||
## [7.21.3](https://github.com/videojs/video.js/compare/v7.21.2...v7.21.3) (2023-02-27)
|
## [7.21.3](https://github.com/videojs/video.js/compare/v7.21.2...v7.21.3) (2023-02-27)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -22,7 +22,7 @@ import vtt from 'videojs-vtt.js';
|
||||||
import _construct from '@babel/runtime/helpers/construct';
|
import _construct from '@babel/runtime/helpers/construct';
|
||||||
import _inherits from '@babel/runtime/helpers/inherits';
|
import _inherits from '@babel/runtime/helpers/inherits';
|
||||||
|
|
||||||
var version = "7.21.3";
|
var version = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -24467,7 +24467,8 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -24484,7 +24485,7 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24492,7 +24493,14 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -38,7 +38,7 @@ var vtt__default = /*#__PURE__*/_interopDefaultLegacy(vtt);
|
||||||
var _construct__default = /*#__PURE__*/_interopDefaultLegacy(_construct);
|
var _construct__default = /*#__PURE__*/_interopDefaultLegacy(_construct);
|
||||||
var _inherits__default = /*#__PURE__*/_interopDefaultLegacy(_inherits);
|
var _inherits__default = /*#__PURE__*/_interopDefaultLegacy(_inherits);
|
||||||
|
|
||||||
var version = "7.21.3";
|
var version = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -24483,7 +24483,8 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -24500,7 +24501,7 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24508,7 +24509,14 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
||||||
}(this, (function () { 'use strict';
|
}(this, (function () { 'use strict';
|
||||||
|
|
||||||
var version = "7.21.3";
|
var version = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -26968,7 +26968,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -26985,7 +26986,7 @@
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26993,7 +26994,14 @@
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
||||||
}(this, (function () { 'use strict';
|
}(this, (function () { 'use strict';
|
||||||
|
|
||||||
var version = "7.21.3";
|
var version = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -25095,7 +25095,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -25112,7 +25113,7 @@
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25120,7 +25121,14 @@
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
||||||
}(this, (function () { 'use strict';
|
}(this, (function () { 'use strict';
|
||||||
|
|
||||||
var version$5 = "7.21.3";
|
var version$5 = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -26968,7 +26968,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -26985,7 +26986,7 @@
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26993,7 +26994,14 @@
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
||||||
}(this, (function () { 'use strict';
|
}(this, (function () { 'use strict';
|
||||||
|
|
||||||
var version$5 = "7.21.3";
|
var version$5 = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -25095,7 +25095,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -25112,7 +25113,7 @@
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25120,7 +25121,14 @@
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -9,8 +9,8 @@ videojs.addLanguage('ja', {
|
||||||
"Remaining Time": "残りの時間",
|
"Remaining Time": "残りの時間",
|
||||||
"Stream Type": "ストリームの種類",
|
"Stream Type": "ストリームの種類",
|
||||||
"LIVE": "ライブ",
|
"LIVE": "ライブ",
|
||||||
"Seek to live, currently behind live": "ライブまでシーク、現在、ライブより遅れています",
|
"Seek to live, currently behind live": "ライブまで再生位置を指定、現在ライブが遅れています。",
|
||||||
"Seek to live, currently playing live": "ライブまでシーク、現在、ライブより遅れています",
|
"Seek to live, currently playing live": "ライブまで再生位置を指定、現在ライブ中。",
|
||||||
"Loaded": "ロード済み",
|
"Loaded": "ロード済み",
|
||||||
"Progress": "進行状況",
|
"Progress": "進行状況",
|
||||||
"Progress Bar": "シークバー",
|
"Progress Bar": "シークバー",
|
||||||
|
|
|
@ -9,8 +9,8 @@
|
||||||
"Remaining Time": "残りの時間",
|
"Remaining Time": "残りの時間",
|
||||||
"Stream Type": "ストリームの種類",
|
"Stream Type": "ストリームの種類",
|
||||||
"LIVE": "ライブ",
|
"LIVE": "ライブ",
|
||||||
"Seek to live, currently behind live": "ライブまでシーク、現在、ライブより遅れています",
|
"Seek to live, currently behind live": "ライブまで再生位置を指定、現在ライブが遅れています。",
|
||||||
"Seek to live, currently playing live": "ライブまでシーク、現在、ライブより遅れています",
|
"Seek to live, currently playing live": "ライブまで再生位置を指定、現在ライブ中。",
|
||||||
"Loaded": "ロード済み",
|
"Loaded": "ロード済み",
|
||||||
"Progress": "進行状況",
|
"Progress": "進行状況",
|
||||||
"Progress Bar": "シークバー",
|
"Progress Bar": "シークバー",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -52,7 +52,7 @@ var _resolveUrl__default = /*#__PURE__*/_interopDefaultLegacy(_resolveUrl);
|
||||||
var parseSidx__default = /*#__PURE__*/_interopDefaultLegacy(parseSidx);
|
var parseSidx__default = /*#__PURE__*/_interopDefaultLegacy(parseSidx);
|
||||||
var _wrapNativeSuper__default = /*#__PURE__*/_interopDefaultLegacy(_wrapNativeSuper);
|
var _wrapNativeSuper__default = /*#__PURE__*/_interopDefaultLegacy(_wrapNativeSuper);
|
||||||
|
|
||||||
var version$5 = "7.21.3";
|
var version$5 = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -24497,7 +24497,8 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -24514,7 +24515,7 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24522,7 +24523,14 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -33,7 +33,7 @@ import { detectContainerForBytes, isLikelyFmp4MediaSegment } from '@videojs/vhs-
|
||||||
import { ONE_SECOND_IN_TS } from 'mux.js/lib/utils/clock';
|
import { ONE_SECOND_IN_TS } from 'mux.js/lib/utils/clock';
|
||||||
import _wrapNativeSuper from '@babel/runtime/helpers/wrapNativeSuper';
|
import _wrapNativeSuper from '@babel/runtime/helpers/wrapNativeSuper';
|
||||||
|
|
||||||
var version$5 = "7.21.3";
|
var version$5 = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -24478,7 +24478,8 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -24495,7 +24496,7 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24503,7 +24504,14 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
||||||
}(this, (function () { 'use strict';
|
}(this, (function () { 'use strict';
|
||||||
|
|
||||||
var version$5 = "7.21.3";
|
var version$5 = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -26968,7 +26968,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -26985,7 +26986,7 @@
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26993,7 +26994,14 @@
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "video.js",
|
"name": "video.js",
|
||||||
"description": "An HTML5 video player that supports HLS and DASH with a common API and skin.",
|
"description": "An HTML5 video player that supports HLS and DASH with a common API and skin.",
|
||||||
"version": "7.21.3",
|
"version": "7.21.4",
|
||||||
"main": "./dist/video.cjs.js",
|
"main": "./dist/video.cjs.js",
|
||||||
"module": "./dist/video.es.js",
|
"module": "./dist/video.es.js",
|
||||||
"style": "./dist/video-js.css",
|
"style": "./dist/video-js.css",
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
<a name="7.21.4"></a>
|
||||||
|
## [7.21.4](https://github.com/videojs/video.js/compare/v7.21.3...v7.21.4) (2023-03-15)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **lang:** updated Japanese translations ([#8194](https://github.com/videojs/video.js/issues/8194)) ([7eed745](https://github.com/videojs/video.js/commit/7eed745))
|
||||||
|
* replay button broken for native playback ([#8142](https://github.com/videojs/video.js/issues/8142)) ([#8183](https://github.com/videojs/video.js/issues/8183)) ([bda2b06](https://github.com/videojs/video.js/commit/bda2b06))
|
||||||
|
|
||||||
|
### Chores
|
||||||
|
|
||||||
|
* **documentation:** Update release flow in collaborator guide md ([#8166](https://github.com/videojs/video.js/issues/8166)) ([2e939e2](https://github.com/videojs/video.js/commit/2e939e2))
|
||||||
|
* use next-7 tag instead of next tag for 7x version during npm publish ([#8164](https://github.com/videojs/video.js/issues/8164)) ([852493d](https://github.com/videojs/video.js/commit/852493d))
|
||||||
|
|
||||||
<a name="7.21.3"></a>
|
<a name="7.21.3"></a>
|
||||||
## [7.21.3](https://github.com/videojs/video.js/compare/v7.21.2...v7.21.3) (2023-02-27)
|
## [7.21.3](https://github.com/videojs/video.js/compare/v7.21.2...v7.21.3) (2023-02-27)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -22,7 +22,7 @@ import vtt from 'videojs-vtt.js';
|
||||||
import _construct from '@babel/runtime/helpers/construct';
|
import _construct from '@babel/runtime/helpers/construct';
|
||||||
import _inherits from '@babel/runtime/helpers/inherits';
|
import _inherits from '@babel/runtime/helpers/inherits';
|
||||||
|
|
||||||
var version = "7.21.3";
|
var version = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -24467,7 +24467,8 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -24484,7 +24485,7 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24492,7 +24493,14 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
18
node_modules/videojs-ima/node_modules/videojs-contrib-ads/node_modules/video.js/core.js
generated
vendored
18
node_modules/videojs-ima/node_modules/videojs-contrib-ads/node_modules/video.js/core.js
generated
vendored
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -38,7 +38,7 @@ var vtt__default = /*#__PURE__*/_interopDefaultLegacy(vtt);
|
||||||
var _construct__default = /*#__PURE__*/_interopDefaultLegacy(_construct);
|
var _construct__default = /*#__PURE__*/_interopDefaultLegacy(_construct);
|
||||||
var _inherits__default = /*#__PURE__*/_interopDefaultLegacy(_inherits);
|
var _inherits__default = /*#__PURE__*/_interopDefaultLegacy(_inherits);
|
||||||
|
|
||||||
var version = "7.21.3";
|
var version = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -24483,7 +24483,8 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -24500,7 +24501,7 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24508,7 +24509,14 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
||||||
}(this, (function () { 'use strict';
|
}(this, (function () { 'use strict';
|
||||||
|
|
||||||
var version = "7.21.3";
|
var version = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -26968,7 +26968,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -26985,7 +26986,7 @@
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26993,7 +26994,14 @@
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
||||||
}(this, (function () { 'use strict';
|
}(this, (function () { 'use strict';
|
||||||
|
|
||||||
var version = "7.21.3";
|
var version = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -25095,7 +25095,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -25112,7 +25113,7 @@
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25120,7 +25121,14 @@
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
||||||
}(this, (function () { 'use strict';
|
}(this, (function () { 'use strict';
|
||||||
|
|
||||||
var version$5 = "7.21.3";
|
var version$5 = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -26968,7 +26968,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -26985,7 +26986,7 @@
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26993,7 +26994,14 @@
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
||||||
}(this, (function () { 'use strict';
|
}(this, (function () { 'use strict';
|
||||||
|
|
||||||
var version$5 = "7.21.3";
|
var version$5 = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -25095,7 +25095,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -25112,7 +25113,7 @@
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25120,7 +25121,14 @@
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -9,8 +9,8 @@ videojs.addLanguage('ja', {
|
||||||
"Remaining Time": "残りの時間",
|
"Remaining Time": "残りの時間",
|
||||||
"Stream Type": "ストリームの種類",
|
"Stream Type": "ストリームの種類",
|
||||||
"LIVE": "ライブ",
|
"LIVE": "ライブ",
|
||||||
"Seek to live, currently behind live": "ライブまでシーク、現在、ライブより遅れています",
|
"Seek to live, currently behind live": "ライブまで再生位置を指定、現在ライブが遅れています。",
|
||||||
"Seek to live, currently playing live": "ライブまでシーク、現在、ライブより遅れています",
|
"Seek to live, currently playing live": "ライブまで再生位置を指定、現在ライブ中。",
|
||||||
"Loaded": "ロード済み",
|
"Loaded": "ロード済み",
|
||||||
"Progress": "進行状況",
|
"Progress": "進行状況",
|
||||||
"Progress Bar": "シークバー",
|
"Progress Bar": "シークバー",
|
||||||
|
|
|
@ -9,8 +9,8 @@
|
||||||
"Remaining Time": "残りの時間",
|
"Remaining Time": "残りの時間",
|
||||||
"Stream Type": "ストリームの種類",
|
"Stream Type": "ストリームの種類",
|
||||||
"LIVE": "ライブ",
|
"LIVE": "ライブ",
|
||||||
"Seek to live, currently behind live": "ライブまでシーク、現在、ライブより遅れています",
|
"Seek to live, currently behind live": "ライブまで再生位置を指定、現在ライブが遅れています。",
|
||||||
"Seek to live, currently playing live": "ライブまでシーク、現在、ライブより遅れています",
|
"Seek to live, currently playing live": "ライブまで再生位置を指定、現在ライブ中。",
|
||||||
"Loaded": "ロード済み",
|
"Loaded": "ロード済み",
|
||||||
"Progress": "進行状況",
|
"Progress": "進行状況",
|
||||||
"Progress Bar": "シークバー",
|
"Progress Bar": "シークバー",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -52,7 +52,7 @@ var _resolveUrl__default = /*#__PURE__*/_interopDefaultLegacy(_resolveUrl);
|
||||||
var parseSidx__default = /*#__PURE__*/_interopDefaultLegacy(parseSidx);
|
var parseSidx__default = /*#__PURE__*/_interopDefaultLegacy(parseSidx);
|
||||||
var _wrapNativeSuper__default = /*#__PURE__*/_interopDefaultLegacy(_wrapNativeSuper);
|
var _wrapNativeSuper__default = /*#__PURE__*/_interopDefaultLegacy(_wrapNativeSuper);
|
||||||
|
|
||||||
var version$5 = "7.21.3";
|
var version$5 = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -24497,7 +24497,8 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -24514,7 +24515,7 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24522,7 +24523,14 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -33,7 +33,7 @@ import { detectContainerForBytes, isLikelyFmp4MediaSegment } from '@videojs/vhs-
|
||||||
import { ONE_SECOND_IN_TS } from 'mux.js/lib/utils/clock';
|
import { ONE_SECOND_IN_TS } from 'mux.js/lib/utils/clock';
|
||||||
import _wrapNativeSuper from '@babel/runtime/helpers/wrapNativeSuper';
|
import _wrapNativeSuper from '@babel/runtime/helpers/wrapNativeSuper';
|
||||||
|
|
||||||
var version$5 = "7.21.3";
|
var version$5 = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -24478,7 +24478,8 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -24495,7 +24496,7 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24503,7 +24504,14 @@ var Player = /*#__PURE__*/function (_Component) {
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Video.js 7.21.3 <http://videojs.com/>
|
* Video.js 7.21.4 <http://videojs.com/>
|
||||||
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
* Copyright Brightcove, Inc. <https://www.brightcove.com/>
|
||||||
* Available under Apache License Version 2.0
|
* Available under Apache License Version 2.0
|
||||||
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
* <https://github.com/videojs/video.js/blob/main/LICENSE>
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.videojs = factory());
|
||||||
}(this, (function () { 'use strict';
|
}(this, (function () { 'use strict';
|
||||||
|
|
||||||
var version$5 = "7.21.3";
|
var version$5 = "7.21.4";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Object that contains lifecycle hooks as keys which point to an array
|
* An Object that contains lifecycle hooks as keys which point to an array
|
||||||
|
@ -26968,7 +26968,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.playCallbacks_.push(callback);
|
this.playCallbacks_.push(callback);
|
||||||
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc())); // treat calls to play_ somewhat like the `one` event function
|
var isSrcReady = Boolean(!this.changingSrc_ && (this.src() || this.currentSrc()));
|
||||||
|
var isSafariOrIOS = Boolean(IS_ANY_SAFARI || IS_IOS); // treat calls to play_ somewhat like the `one` event function
|
||||||
|
|
||||||
if (this.waitToPlay_) {
|
if (this.waitToPlay_) {
|
||||||
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
this.off(['ready', 'loadstart'], this.waitToPlay_);
|
||||||
|
@ -26985,7 +26986,7 @@
|
||||||
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
this.one(['ready', 'loadstart'], this.waitToPlay_); // if we are in Safari, there is a high chance that loadstart will trigger after the gesture timeperiod
|
||||||
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
// in that case, we need to prime the video element by calling load so it'll be ready in time
|
||||||
|
|
||||||
if (!isSrcReady && (IS_ANY_SAFARI || IS_IOS)) {
|
if (!isSrcReady && isSafariOrIOS) {
|
||||||
this.load();
|
this.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26993,7 +26994,14 @@
|
||||||
} // If the player/tech is ready and we have a source, we can attempt playback.
|
} // If the player/tech is ready and we have a source, we can attempt playback.
|
||||||
|
|
||||||
|
|
||||||
var val = this.techGet_('play'); // play was terminated if the returned value is null
|
var val = this.techGet_('play'); // For native playback, reset the progress bar if we get a play call from a replay.
|
||||||
|
|
||||||
|
var isNativeReplay = isSafariOrIOS && this.hasClass('vjs-ended');
|
||||||
|
|
||||||
|
if (isNativeReplay) {
|
||||||
|
this.resetProgressBar_();
|
||||||
|
} // play was terminated if the returned value is null
|
||||||
|
|
||||||
|
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
this.runPlayTerminatedQueue_();
|
this.runPlayTerminatedQueue_();
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "video.js",
|
"name": "video.js",
|
||||||
"description": "An HTML5 video player that supports HLS and DASH with a common API and skin.",
|
"description": "An HTML5 video player that supports HLS and DASH with a common API and skin.",
|
||||||
"version": "7.21.3",
|
"version": "7.21.4",
|
||||||
"main": "./dist/video.cjs.js",
|
"main": "./dist/video.cjs.js",
|
||||||
"module": "./dist/video.es.js",
|
"module": "./dist/video.es.js",
|
||||||
"style": "./dist/video-js.css",
|
"style": "./dist/video-js.css",
|
||||||
|
|
4
node_modules/wow.js/.npmignore
generated
vendored
4
node_modules/wow.js/.npmignore
generated
vendored
|
@ -1,4 +0,0 @@
|
||||||
.DS_Store
|
|
||||||
.grunt/
|
|
||||||
node_modules/
|
|
||||||
_SpecRunner.html
|
|
3
node_modules/wow.js/.travis.yml
generated
vendored
3
node_modules/wow.js/.travis.yml
generated
vendored
|
@ -1,3 +0,0 @@
|
||||||
language: node_js
|
|
||||||
node_js:
|
|
||||||
- 6
|
|
94
node_modules/wow.js/Gruntfile.js
generated
vendored
94
node_modules/wow.js/Gruntfile.js
generated
vendored
|
@ -1,94 +0,0 @@
|
||||||
/*global module:false*/
|
|
||||||
|
|
||||||
module.exports = function(grunt) {
|
|
||||||
require('load-grunt-tasks')(grunt);
|
|
||||||
mainTasks = [
|
|
||||||
'eslint', 'babel', 'coffee', 'growl:coffee', 'uglify', 'jasmine',
|
|
||||||
'growl:jasmine',
|
|
||||||
]
|
|
||||||
|
|
||||||
// Project configuration.
|
|
||||||
grunt.initConfig({
|
|
||||||
pkg: grunt.file.readJSON('package.json'),
|
|
||||||
eslint: {
|
|
||||||
target: ['src/WOW.js']
|
|
||||||
},
|
|
||||||
uglify: {
|
|
||||||
dist: {
|
|
||||||
files: {
|
|
||||||
'dist/wow.min.js': 'dist/wow.js'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
options: {
|
|
||||||
banner : '/*! <%= pkg.title %> wow.js - v<%= pkg.version %> - ' +
|
|
||||||
'<%= grunt.template.today("yyyy-mm-dd") %>\n' +
|
|
||||||
'<%= pkg.homepage ? "* " + pkg.homepage + "\\n" : "" %>' +
|
|
||||||
'* Copyright (c) <%= grunt.template.today("yyyy") %> Thomas Grainger;' +
|
|
||||||
' Licensed <%= pkg.license %> */',
|
|
||||||
report: 'gzip'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
babel : {
|
|
||||||
options : {
|
|
||||||
presets: ['es2015', 'stage-1'],
|
|
||||||
plugins: [
|
|
||||||
'add-module-exports',
|
|
||||||
"transform-es2015-modules-umd"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
dist: {
|
|
||||||
files: {
|
|
||||||
'dist/wow.js': 'src/WOW.js'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
coffee : {
|
|
||||||
specs : {
|
|
||||||
files: [{
|
|
||||||
expand: true,
|
|
||||||
cwd: 'spec/coffeescripts/',
|
|
||||||
src: '*.coffee',
|
|
||||||
dest: 'spec/javascripts/',
|
|
||||||
ext: '.js'
|
|
||||||
}]
|
|
||||||
},
|
|
||||||
helpers : {
|
|
||||||
files: [{
|
|
||||||
expand: true,
|
|
||||||
cwd: 'spec/coffeescripts/helpers/',
|
|
||||||
src: '*.coffee',
|
|
||||||
dest: 'spec/javascripts/helpers/',
|
|
||||||
ext: '.js'
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
jasmine : {
|
|
||||||
src : ['spec/javascripts/libs/*.js', 'dist/wow.min.js'],
|
|
||||||
options : {
|
|
||||||
specs : 'spec/javascripts/**/*.js',
|
|
||||||
helpers : 'spec/javascripts/helpers/**/*.js'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch : {
|
|
||||||
files: [
|
|
||||||
'src/*',
|
|
||||||
'spec/coffeescripts/**/*.coffee'
|
|
||||||
],
|
|
||||||
tasks: mainTasks
|
|
||||||
},
|
|
||||||
growl : {
|
|
||||||
coffee : {
|
|
||||||
title : 'CoffeeScript',
|
|
||||||
message : 'Compiled successfully'
|
|
||||||
},
|
|
||||||
jasmine : {
|
|
||||||
title : 'Jasmine',
|
|
||||||
message : 'Tests passed successfully'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
grunt.registerTask('default', mainTasks);
|
|
||||||
// Travis CI task.
|
|
||||||
grunt.registerTask('travis', ['eslint', 'babel', 'coffee', 'uglify', 'jasmine']);
|
|
||||||
};
|
|
34
node_modules/wow.js/LICENSE
generated
vendored
34
node_modules/wow.js/LICENSE
generated
vendored
|
@ -1,34 +0,0 @@
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2016 Thomas Grainger.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
|
|
||||||
Portions of this wow.js Software may utilize the following copyrighted material, the use of which is hereby acknowledged.
|
|
||||||
|
|
||||||
WOW: https://github.com/matthieua/WOW/tree/20848c410fe32d161c2330e1d261b59512094f81
|
|
||||||
|
|
||||||
Copyright (C) 2014; Matthieu Aussaguel
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
140
node_modules/wow.js/README.md
generated
vendored
140
node_modules/wow.js/README.md
generated
vendored
|
@ -1,140 +0,0 @@
|
||||||
# WOW.js [](http://travis-ci.org/graingert/WOW)
|
|
||||||
|
|
||||||
Reveal CSS animation as you scroll down a page.
|
|
||||||
By default, you can use it to trigger [animate.css](https://github.com/daneden/animate.css) animations.
|
|
||||||
But you can easily change the settings to your favorite animation library.
|
|
||||||
|
|
||||||
Advantages:
|
|
||||||
- 100% MIT Licensed, not GPL keep your code yours.
|
|
||||||
- Naturally Caffeine free
|
|
||||||
- Smaller than other JavaScript parallax plugins, like Scrollorama (they do fantastic things, but can be too heavy for simple needs)
|
|
||||||
- Super simple to install, and works with animate.css, so if you already use it, that will be very fast to setup
|
|
||||||
- Fast execution and lightweight code: the browser will like it ;-)
|
|
||||||
- You can change the settings - [see below](#advanced-usage)
|
|
||||||
|
|
||||||
### [LIVE DEMO ➫](https://graingert.co.uk/WOW/)
|
|
||||||
|
|
||||||
## Live examples
|
|
||||||
- [MaterialUp](http://www.materialup.com)
|
|
||||||
- [Fliplingo](https://www.fliplingo.com)
|
|
||||||
- [Streamline Icons](http://www.streamlineicons.com)
|
|
||||||
- [Microsoft Stories](http://www.microsoft.com/en-us/news/stories/garage/)
|
|
||||||
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
It just take seconds to install and use WOW.js!
|
|
||||||
[Read the documentation ➫](https://graingert.co.uk/WOW/docs.html)
|
|
||||||
|
|
||||||
### Dependencies
|
|
||||||
- [animate.css](https://github.com/daneden/animate.css)
|
|
||||||
|
|
||||||
### Installation
|
|
||||||
|
|
||||||
- Bower
|
|
||||||
|
|
||||||
```bash
|
|
||||||
bower install wow-mit
|
|
||||||
```
|
|
||||||
|
|
||||||
- NPM
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install wow.js
|
|
||||||
```
|
|
||||||
|
|
||||||
### Basic usage
|
|
||||||
|
|
||||||
- HTML
|
|
||||||
|
|
||||||
```html
|
|
||||||
<section class="wow slideInLeft"></section>
|
|
||||||
<section class="wow slideInRight"></section>
|
|
||||||
```
|
|
||||||
|
|
||||||
- JavaScript
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
new WOW().init();
|
|
||||||
```
|
|
||||||
|
|
||||||
### Advanced usage
|
|
||||||
|
|
||||||
- HTML
|
|
||||||
|
|
||||||
```html
|
|
||||||
<section class="wow slideInLeft" data-wow-duration="2s" data-wow-delay="5s"></section>
|
|
||||||
<section class="wow slideInRight" data-wow-offset="10" data-wow-iteration="10"></section>
|
|
||||||
```
|
|
||||||
|
|
||||||
- JavaScript
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var wow = new WOW(
|
|
||||||
{
|
|
||||||
boxClass: 'wow', // animated element css class (default is wow)
|
|
||||||
animateClass: 'animated', // animation css class (default is animated)
|
|
||||||
offset: 0, // distance to the element when triggering the animation (default is 0)
|
|
||||||
mobile: true, // trigger animations on mobile devices (default is true)
|
|
||||||
live: true, // act on asynchronously loaded content (default is true)
|
|
||||||
callback: function(box) {
|
|
||||||
// the callback is fired every time an animation is started
|
|
||||||
// the argument that is passed in is the DOM node being animated
|
|
||||||
},
|
|
||||||
scrollContainer: null // optional scroll container selector, otherwise use window
|
|
||||||
}
|
|
||||||
);
|
|
||||||
wow.init();
|
|
||||||
```
|
|
||||||
|
|
||||||
### Asynchronous content support
|
|
||||||
|
|
||||||
In IE 10+, Chrome 18+ and Firefox 14+, animations will be automatically
|
|
||||||
triggered for any DOM nodes you add after calling `wow.init()`. If you do not
|
|
||||||
like that, you can disable this by setting `live` to `false`.
|
|
||||||
|
|
||||||
If you want to support older browsers (e.g. IE9+), as a fallback, you can call
|
|
||||||
the `wow.sync()` method after you have added new DOM elements to animate (but
|
|
||||||
`live` should still be set to `true`). Calling `wow.sync()` has no side
|
|
||||||
effects.
|
|
||||||
|
|
||||||
|
|
||||||
## Contribute
|
|
||||||
|
|
||||||
The library is transpiled using Babel, please update `wow.js` file.
|
|
||||||
|
|
||||||
We use grunt to compile and minify the library:
|
|
||||||
|
|
||||||
Install needed libraries
|
|
||||||
|
|
||||||
```
|
|
||||||
npm install
|
|
||||||
```
|
|
||||||
|
|
||||||
Get the compilation running in the background
|
|
||||||
|
|
||||||
```
|
|
||||||
grunt watch
|
|
||||||
```
|
|
||||||
|
|
||||||
Enjoy!
|
|
||||||
|
|
||||||
## Bug tracker
|
|
||||||
|
|
||||||
If you find a bug, please report it [here on Github](https://github.com/graingert/WOW/issues)!
|
|
||||||
|
|
||||||
## Developer
|
|
||||||
|
|
||||||
Originally Developed by Matthieu Aussaguel, [mynameismatthieu.com](http://mynameismatthieu.com)
|
|
||||||
Forked to remain under the MIT license by Thomas Grainger, https://graingert.co.uk
|
|
||||||
|
|
||||||
+ [Github Profile](//github.com/graingert)
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
Thanks to everyone who has contributed to the project so far:
|
|
||||||
|
|
||||||
- Attila Oláh - [@attilaolah](//twitter.com/attilaolah) - [Github Profile](//github.com/attilaolah)
|
|
||||||
- [and many others](//github.com/graingert/WOW/graphs/contributors)
|
|
||||||
|
|
||||||
Initiated and designed by [Vincent Le Moign](//www.webalys.com/), [@webalys](//twitter.com/webalys)
|
|
25
node_modules/wow.js/bower.json
generated
vendored
25
node_modules/wow.js/bower.json
generated
vendored
|
@ -1,25 +0,0 @@
|
||||||
{
|
|
||||||
"name": "wow",
|
|
||||||
"homepage": "https://github.com/graingert/WOW",
|
|
||||||
"authors": [
|
|
||||||
"Matthieu Aussaguel <matthieu.aussaguel@gmail.com>"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
"Thomas Grainger <wow.js@graingert.co.uk>"
|
|
||||||
],
|
|
||||||
"description": "Reveal CSS animation as you scroll down a page.",
|
|
||||||
"main": "dist/wow.js",
|
|
||||||
"keywords": [
|
|
||||||
"scroll",
|
|
||||||
"animation",
|
|
||||||
"reveal"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"ignore": [
|
|
||||||
"**/.*",
|
|
||||||
"node_modules",
|
|
||||||
"bower_components",
|
|
||||||
"test",
|
|
||||||
"tests"
|
|
||||||
]
|
|
||||||
}
|
|
2744
node_modules/wow.js/css/libs/animate.css
generated
vendored
2744
node_modules/wow.js/css/libs/animate.css
generated
vendored
File diff suppressed because it is too large
Load diff
36
node_modules/wow.js/css/site.css
generated
vendored
36
node_modules/wow.js/css/site.css
generated
vendored
|
@ -1,36 +0,0 @@
|
||||||
h1 {
|
|
||||||
font-size: 72px;
|
|
||||||
line-height: 1.5;
|
|
||||||
color: #2c3e50;
|
|
||||||
font-weight: 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
#container {
|
|
||||||
width: 980px;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
section {
|
|
||||||
height: 300px;
|
|
||||||
margin: 60px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.section--purple {
|
|
||||||
background-color: #9b59b6;
|
|
||||||
}
|
|
||||||
|
|
||||||
.section--blue {
|
|
||||||
background-color: #3498db;
|
|
||||||
}
|
|
||||||
|
|
||||||
.section--green {
|
|
||||||
background-color: #2ecc71;
|
|
||||||
}
|
|
||||||
|
|
||||||
#main {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#more {
|
|
||||||
margin: 20px auto 48px;
|
|
||||||
}
|
|
52
node_modules/wow.js/demo.html
generated
vendored
52
node_modules/wow.js/demo.html
generated
vendored
|
@ -1,52 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>WOW</title>
|
|
||||||
<link rel="stylesheet" href="css/libs/animate.css">
|
|
||||||
<link rel="stylesheet" href="css/site.css">
|
|
||||||
<style>
|
|
||||||
.wow:first-child {
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<!--[if IE]>
|
|
||||||
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
||||||
<![endif]-->
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<div id="container">
|
|
||||||
<header>
|
|
||||||
<h1>WOW.js</h1>
|
|
||||||
</header>
|
|
||||||
<div id="main">
|
|
||||||
<section class="wow fadeInDown" style="background-color: #f1c40f;"></section>
|
|
||||||
<section class="wow pulse" style="background-color: #e74c3c;" data-wow-iteration="infinite" data-wow-duration="1500ms"></section>
|
|
||||||
<section class="section--purple wow slideInRight" data-wow-delay="2s"></section>
|
|
||||||
<section class="section--blue wow bounceInLeft" data-wow-offset="300"></section>
|
|
||||||
<section class="section--green wow slideInLeft" data-wow-duration="4s"></section>
|
|
||||||
<button id="moar">LOAD MOAR!!</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<script src="dist/wow.js"></script>
|
|
||||||
<script>
|
|
||||||
wow = new WOW(
|
|
||||||
{
|
|
||||||
animateClass: 'animated',
|
|
||||||
offset: 100,
|
|
||||||
callback: function(box) {
|
|
||||||
console.log("WOW: animating <" + box.tagName.toLowerCase() + ">")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
wow.init();
|
|
||||||
document.getElementById('moar').onclick = function() {
|
|
||||||
var section = document.createElement('section');
|
|
||||||
section.className = 'section--purple wow fadeInDown';
|
|
||||||
this.parentNode.insertBefore(section, this);
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
533
node_modules/wow.js/dist/wow.js
generated
vendored
533
node_modules/wow.js/dist/wow.js
generated
vendored
|
@ -1,533 +0,0 @@
|
||||||
(function (global, factory) {
|
|
||||||
if (typeof define === "function" && define.amd) {
|
|
||||||
define(['module', 'exports'], factory);
|
|
||||||
} else if (typeof exports !== "undefined") {
|
|
||||||
factory(module, exports);
|
|
||||||
} else {
|
|
||||||
var mod = {
|
|
||||||
exports: {}
|
|
||||||
};
|
|
||||||
factory(mod, mod.exports);
|
|
||||||
global.WOW = mod.exports;
|
|
||||||
}
|
|
||||||
})(this, function (module, exports) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
Object.defineProperty(exports, "__esModule", {
|
|
||||||
value: true
|
|
||||||
});
|
|
||||||
|
|
||||||
var _class, _temp;
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) {
|
|
||||||
if (!(instance instanceof Constructor)) {
|
|
||||||
throw new TypeError("Cannot call a class as a function");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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 isIn(needle, haystack) {
|
|
||||||
return haystack.indexOf(needle) >= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function extend(custom, defaults) {
|
|
||||||
for (var key in defaults) {
|
|
||||||
if (custom[key] == null) {
|
|
||||||
var value = defaults[key];
|
|
||||||
custom[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return custom;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isMobile(agent) {
|
|
||||||
return (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(agent)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function createEvent(event) {
|
|
||||||
var bubble = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];
|
|
||||||
var cancel = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];
|
|
||||||
var detail = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3];
|
|
||||||
|
|
||||||
var customEvent = void 0;
|
|
||||||
if (document.createEvent != null) {
|
|
||||||
// W3C DOM
|
|
||||||
customEvent = document.createEvent('CustomEvent');
|
|
||||||
customEvent.initCustomEvent(event, bubble, cancel, detail);
|
|
||||||
} else if (document.createEventObject != null) {
|
|
||||||
// IE DOM < 9
|
|
||||||
customEvent = document.createEventObject();
|
|
||||||
customEvent.eventType = event;
|
|
||||||
} else {
|
|
||||||
customEvent.eventName = event;
|
|
||||||
}
|
|
||||||
|
|
||||||
return customEvent;
|
|
||||||
}
|
|
||||||
|
|
||||||
function emitEvent(elem, event) {
|
|
||||||
if (elem.dispatchEvent != null) {
|
|
||||||
// W3C DOM
|
|
||||||
elem.dispatchEvent(event);
|
|
||||||
} else if (event in (elem != null)) {
|
|
||||||
elem[event]();
|
|
||||||
} else if ('on' + event in (elem != null)) {
|
|
||||||
elem['on' + event]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function addEvent(elem, event, fn) {
|
|
||||||
if (elem.addEventListener != null) {
|
|
||||||
// W3C DOM
|
|
||||||
elem.addEventListener(event, fn, false);
|
|
||||||
} else if (elem.attachEvent != null) {
|
|
||||||
// IE DOM
|
|
||||||
elem.attachEvent('on' + event, fn);
|
|
||||||
} else {
|
|
||||||
// fallback
|
|
||||||
elem[event] = fn;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeEvent(elem, event, fn) {
|
|
||||||
if (elem.removeEventListener != null) {
|
|
||||||
// W3C DOM
|
|
||||||
elem.removeEventListener(event, fn, false);
|
|
||||||
} else if (elem.detachEvent != null) {
|
|
||||||
// IE DOM
|
|
||||||
elem.detachEvent('on' + event, fn);
|
|
||||||
} else {
|
|
||||||
// fallback
|
|
||||||
delete elem[event];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getInnerHeight() {
|
|
||||||
if ('innerHeight' in window) {
|
|
||||||
return window.innerHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
return document.documentElement.clientHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Minimalistic WeakMap shim, just in case.
|
|
||||||
var WeakMap = window.WeakMap || window.MozWeakMap || function () {
|
|
||||||
function WeakMap() {
|
|
||||||
_classCallCheck(this, WeakMap);
|
|
||||||
|
|
||||||
this.keys = [];
|
|
||||||
this.values = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
_createClass(WeakMap, [{
|
|
||||||
key: 'get',
|
|
||||||
value: function get(key) {
|
|
||||||
for (var i = 0; i < this.keys.length; i++) {
|
|
||||||
var item = this.keys[i];
|
|
||||||
if (item === key) {
|
|
||||||
return this.values[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'set',
|
|
||||||
value: function set(key, value) {
|
|
||||||
for (var i = 0; i < this.keys.length; i++) {
|
|
||||||
var item = this.keys[i];
|
|
||||||
if (item === key) {
|
|
||||||
this.values[i] = value;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.keys.push(key);
|
|
||||||
this.values.push(value);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return WeakMap;
|
|
||||||
}();
|
|
||||||
|
|
||||||
// Dummy MutationObserver, to avoid raising exceptions.
|
|
||||||
var MutationObserver = window.MutationObserver || window.WebkitMutationObserver || window.MozMutationObserver || (_temp = _class = function () {
|
|
||||||
function MutationObserver() {
|
|
||||||
_classCallCheck(this, MutationObserver);
|
|
||||||
|
|
||||||
if (typeof console !== 'undefined' && console !== null) {
|
|
||||||
console.warn('MutationObserver is not supported by your browser.');
|
|
||||||
console.warn('WOW.js cannot detect dom mutations, please call .sync() after loading new content.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_createClass(MutationObserver, [{
|
|
||||||
key: 'observe',
|
|
||||||
value: function observe() {}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return MutationObserver;
|
|
||||||
}(), _class.notSupported = true, _temp);
|
|
||||||
|
|
||||||
// getComputedStyle shim, from http://stackoverflow.com/a/21797294
|
|
||||||
var getComputedStyle = window.getComputedStyle || function getComputedStyle(el) {
|
|
||||||
var getComputedStyleRX = /(\-([a-z]){1})/g;
|
|
||||||
return {
|
|
||||||
getPropertyValue: function getPropertyValue(prop) {
|
|
||||||
if (prop === 'float') {
|
|
||||||
prop = 'styleFloat';
|
|
||||||
}
|
|
||||||
if (getComputedStyleRX.test(prop)) {
|
|
||||||
prop.replace(getComputedStyleRX, function (_, _char) {
|
|
||||||
return _char.toUpperCase();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
var currentStyle = el.currentStyle;
|
|
||||||
|
|
||||||
return (currentStyle != null ? currentStyle[prop] : void 0) || null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
var WOW = function () {
|
|
||||||
function WOW() {
|
|
||||||
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
|
|
||||||
|
|
||||||
_classCallCheck(this, WOW);
|
|
||||||
|
|
||||||
this.defaults = {
|
|
||||||
boxClass: 'wow',
|
|
||||||
animateClass: 'animated',
|
|
||||||
offset: 0,
|
|
||||||
mobile: true,
|
|
||||||
live: true,
|
|
||||||
callback: null,
|
|
||||||
scrollContainer: null
|
|
||||||
};
|
|
||||||
|
|
||||||
this.animate = function animateFactory() {
|
|
||||||
if ('requestAnimationFrame' in window) {
|
|
||||||
return function (callback) {
|
|
||||||
return window.requestAnimationFrame(callback);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return function (callback) {
|
|
||||||
return callback();
|
|
||||||
};
|
|
||||||
}();
|
|
||||||
|
|
||||||
this.vendors = ['moz', 'webkit'];
|
|
||||||
|
|
||||||
this.start = this.start.bind(this);
|
|
||||||
this.resetAnimation = this.resetAnimation.bind(this);
|
|
||||||
this.scrollHandler = this.scrollHandler.bind(this);
|
|
||||||
this.scrollCallback = this.scrollCallback.bind(this);
|
|
||||||
this.scrolled = true;
|
|
||||||
this.config = extend(options, this.defaults);
|
|
||||||
if (options.scrollContainer != null) {
|
|
||||||
this.config.scrollContainer = document.querySelector(options.scrollContainer);
|
|
||||||
}
|
|
||||||
// Map of elements to animation names:
|
|
||||||
this.animationNameCache = new WeakMap();
|
|
||||||
this.wowEvent = createEvent(this.config.boxClass);
|
|
||||||
}
|
|
||||||
|
|
||||||
_createClass(WOW, [{
|
|
||||||
key: 'init',
|
|
||||||
value: function init() {
|
|
||||||
this.element = window.document.documentElement;
|
|
||||||
if (isIn(document.readyState, ['interactive', 'complete'])) {
|
|
||||||
this.start();
|
|
||||||
} else {
|
|
||||||
addEvent(document, 'DOMContentLoaded', this.start);
|
|
||||||
}
|
|
||||||
this.finished = [];
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'start',
|
|
||||||
value: function start() {
|
|
||||||
var _this = this;
|
|
||||||
|
|
||||||
this.stopped = false;
|
|
||||||
this.boxes = [].slice.call(this.element.querySelectorAll('.' + this.config.boxClass));
|
|
||||||
this.all = this.boxes.slice(0);
|
|
||||||
if (this.boxes.length) {
|
|
||||||
if (this.disabled()) {
|
|
||||||
this.resetStyle();
|
|
||||||
} else {
|
|
||||||
for (var i = 0; i < this.boxes.length; i++) {
|
|
||||||
var box = this.boxes[i];
|
|
||||||
this.applyStyle(box, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!this.disabled()) {
|
|
||||||
addEvent(this.config.scrollContainer || window, 'scroll', this.scrollHandler);
|
|
||||||
addEvent(window, 'resize', this.scrollHandler);
|
|
||||||
this.interval = setInterval(this.scrollCallback, 50);
|
|
||||||
}
|
|
||||||
if (this.config.live) {
|
|
||||||
var mut = new MutationObserver(function (records) {
|
|
||||||
for (var j = 0; j < records.length; j++) {
|
|
||||||
var record = records[j];
|
|
||||||
for (var k = 0; k < record.addedNodes.length; k++) {
|
|
||||||
var node = record.addedNodes[k];
|
|
||||||
_this.doSync(node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
});
|
|
||||||
mut.observe(document.body, {
|
|
||||||
childList: true,
|
|
||||||
subtree: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'stop',
|
|
||||||
value: function stop() {
|
|
||||||
this.stopped = true;
|
|
||||||
removeEvent(this.config.scrollContainer || window, 'scroll', this.scrollHandler);
|
|
||||||
removeEvent(window, 'resize', this.scrollHandler);
|
|
||||||
if (this.interval != null) {
|
|
||||||
clearInterval(this.interval);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'sync',
|
|
||||||
value: function sync() {
|
|
||||||
if (MutationObserver.notSupported) {
|
|
||||||
this.doSync(this.element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'doSync',
|
|
||||||
value: function doSync(element) {
|
|
||||||
if (typeof element === 'undefined' || element === null) {
|
|
||||||
element = this.element;
|
|
||||||
}
|
|
||||||
if (element.nodeType !== 1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
element = element.parentNode || element;
|
|
||||||
var iterable = element.querySelectorAll('.' + this.config.boxClass);
|
|
||||||
for (var i = 0; i < iterable.length; i++) {
|
|
||||||
var box = iterable[i];
|
|
||||||
if (!isIn(box, this.all)) {
|
|
||||||
this.boxes.push(box);
|
|
||||||
this.all.push(box);
|
|
||||||
if (this.stopped || this.disabled()) {
|
|
||||||
this.resetStyle();
|
|
||||||
} else {
|
|
||||||
this.applyStyle(box, true);
|
|
||||||
}
|
|
||||||
this.scrolled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'show',
|
|
||||||
value: function show(box) {
|
|
||||||
this.applyStyle(box);
|
|
||||||
box.className = box.className + ' ' + this.config.animateClass;
|
|
||||||
if (this.config.callback != null) {
|
|
||||||
this.config.callback(box);
|
|
||||||
}
|
|
||||||
emitEvent(box, this.wowEvent);
|
|
||||||
|
|
||||||
addEvent(box, 'animationend', this.resetAnimation);
|
|
||||||
addEvent(box, 'oanimationend', this.resetAnimation);
|
|
||||||
addEvent(box, 'webkitAnimationEnd', this.resetAnimation);
|
|
||||||
addEvent(box, 'MSAnimationEnd', this.resetAnimation);
|
|
||||||
|
|
||||||
return box;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'applyStyle',
|
|
||||||
value: function applyStyle(box, hidden) {
|
|
||||||
var _this2 = this;
|
|
||||||
|
|
||||||
var duration = box.getAttribute('data-wow-duration');
|
|
||||||
var delay = box.getAttribute('data-wow-delay');
|
|
||||||
var iteration = box.getAttribute('data-wow-iteration');
|
|
||||||
|
|
||||||
return this.animate(function () {
|
|
||||||
return _this2.customStyle(box, hidden, duration, delay, iteration);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'resetStyle',
|
|
||||||
value: function resetStyle() {
|
|
||||||
for (var i = 0; i < this.boxes.length; i++) {
|
|
||||||
var box = this.boxes[i];
|
|
||||||
box.style.visibility = 'visible';
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'resetAnimation',
|
|
||||||
value: function resetAnimation(event) {
|
|
||||||
if (event.type.toLowerCase().indexOf('animationend') >= 0) {
|
|
||||||
var target = event.target || event.srcElement;
|
|
||||||
target.className = target.className.replace(this.config.animateClass, '').trim();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'customStyle',
|
|
||||||
value: function customStyle(box, hidden, duration, delay, iteration) {
|
|
||||||
if (hidden) {
|
|
||||||
this.cacheAnimationName(box);
|
|
||||||
}
|
|
||||||
box.style.visibility = hidden ? 'hidden' : 'visible';
|
|
||||||
|
|
||||||
if (duration) {
|
|
||||||
this.vendorSet(box.style, { animationDuration: duration });
|
|
||||||
}
|
|
||||||
if (delay) {
|
|
||||||
this.vendorSet(box.style, { animationDelay: delay });
|
|
||||||
}
|
|
||||||
if (iteration) {
|
|
||||||
this.vendorSet(box.style, { animationIterationCount: iteration });
|
|
||||||
}
|
|
||||||
this.vendorSet(box.style, { animationName: hidden ? 'none' : this.cachedAnimationName(box) });
|
|
||||||
|
|
||||||
return box;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'vendorSet',
|
|
||||||
value: function vendorSet(elem, properties) {
|
|
||||||
for (var name in properties) {
|
|
||||||
if (properties.hasOwnProperty(name)) {
|
|
||||||
var value = properties[name];
|
|
||||||
elem['' + name] = value;
|
|
||||||
for (var i = 0; i < this.vendors.length; i++) {
|
|
||||||
var vendor = this.vendors[i];
|
|
||||||
elem['' + vendor + name.charAt(0).toUpperCase() + name.substr(1)] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'vendorCSS',
|
|
||||||
value: function vendorCSS(elem, property) {
|
|
||||||
var style = getComputedStyle(elem);
|
|
||||||
var result = style.getPropertyCSSValue(property);
|
|
||||||
for (var i = 0; i < this.vendors.length; i++) {
|
|
||||||
var vendor = this.vendors[i];
|
|
||||||
result = result || style.getPropertyCSSValue('-' + vendor + '-' + property);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'animationName',
|
|
||||||
value: function animationName(box) {
|
|
||||||
var aName = void 0;
|
|
||||||
try {
|
|
||||||
aName = this.vendorCSS(box, 'animation-name').cssText;
|
|
||||||
} catch (error) {
|
|
||||||
// Opera, fall back to plain property value
|
|
||||||
aName = getComputedStyle(box).getPropertyValue('animation-name');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aName === 'none') {
|
|
||||||
return ''; // SVG/Firefox, unable to get animation name?
|
|
||||||
}
|
|
||||||
|
|
||||||
return aName;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'cacheAnimationName',
|
|
||||||
value: function cacheAnimationName(box) {
|
|
||||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=921834
|
|
||||||
// box.dataset is not supported for SVG elements in Firefox
|
|
||||||
return this.animationNameCache.set(box, this.animationName(box));
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'cachedAnimationName',
|
|
||||||
value: function cachedAnimationName(box) {
|
|
||||||
return this.animationNameCache.get(box);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'scrollHandler',
|
|
||||||
value: function scrollHandler() {
|
|
||||||
this.scrolled = true;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'scrollCallback',
|
|
||||||
value: function scrollCallback() {
|
|
||||||
if (this.scrolled) {
|
|
||||||
this.scrolled = false;
|
|
||||||
var results = [];
|
|
||||||
for (var i = 0; i < this.boxes.length; i++) {
|
|
||||||
var box = this.boxes[i];
|
|
||||||
if (box) {
|
|
||||||
if (this.isVisible(box)) {
|
|
||||||
this.show(box);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
results.push(box);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.boxes = results;
|
|
||||||
if (!this.boxes.length && !this.config.live) {
|
|
||||||
this.stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'offsetTop',
|
|
||||||
value: function offsetTop(element) {
|
|
||||||
// SVG elements don't have an offsetTop in Firefox.
|
|
||||||
// This will use their nearest parent that has an offsetTop.
|
|
||||||
// Also, using ('offsetTop' of element) causes an exception in Firefox.
|
|
||||||
while (element.offsetTop === undefined) {
|
|
||||||
element = element.parentNode;
|
|
||||||
}
|
|
||||||
var top = element.offsetTop;
|
|
||||||
while (element.offsetParent) {
|
|
||||||
element = element.offsetParent;
|
|
||||||
top += element.offsetTop;
|
|
||||||
}
|
|
||||||
return top;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'isVisible',
|
|
||||||
value: function isVisible(box) {
|
|
||||||
var offset = box.getAttribute('data-wow-offset') || this.config.offset;
|
|
||||||
var viewTop = this.config.scrollContainer && this.config.scrollContainer.scrollTop || window.pageYOffset;
|
|
||||||
var viewBottom = viewTop + Math.min(this.element.clientHeight, getInnerHeight()) - offset;
|
|
||||||
var top = this.offsetTop(box);
|
|
||||||
var bottom = top + box.clientHeight;
|
|
||||||
|
|
||||||
return top <= viewBottom && bottom >= viewTop;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'disabled',
|
|
||||||
value: function disabled() {
|
|
||||||
return !this.config.mobile && isMobile(navigator.userAgent);
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return WOW;
|
|
||||||
}();
|
|
||||||
|
|
||||||
exports.default = WOW;
|
|
||||||
module.exports = exports['default'];
|
|
||||||
});
|
|
1
node_modules/wow.js/dist/wow.js.map
generated
vendored
1
node_modules/wow.js/dist/wow.js.map
generated
vendored
File diff suppressed because one or more lines are too long
3
node_modules/wow.js/dist/wow.min.js
generated
vendored
3
node_modules/wow.js/dist/wow.min.js
generated
vendored
File diff suppressed because one or more lines are too long
BIN
node_modules/wow.js/dist/wow.min.js.gz
generated
vendored
BIN
node_modules/wow.js/dist/wow.min.js.gz
generated
vendored
Binary file not shown.
51
node_modules/wow.js/package.json
generated
vendored
51
node_modules/wow.js/package.json
generated
vendored
|
@ -1,51 +0,0 @@
|
||||||
{
|
|
||||||
"name": "wow.js",
|
|
||||||
"title": "WOW",
|
|
||||||
"version": "1.2.2",
|
|
||||||
"main": "dist/wow.js",
|
|
||||||
"description": "",
|
|
||||||
"keywords": [],
|
|
||||||
"homepage": "https://wowjs.uk",
|
|
||||||
"contributors": [
|
|
||||||
{
|
|
||||||
"name": "Matthieu Aussaguel",
|
|
||||||
"email": "matthieu.aussaguel@gmail.com",
|
|
||||||
"url": "http://mynameismatthieu.com/"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Thomas Grainger",
|
|
||||||
"email": "wow.js@graingert.co.uk",
|
|
||||||
"url": "https://graingert.co.uk/"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git://github.com/graingert/WOW.git"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/graingert/WOW/issues"
|
|
||||||
},
|
|
||||||
"license": "MIT",
|
|
||||||
"devDependencies": {
|
|
||||||
"babel-eslint": "^6.0.4",
|
|
||||||
"babel-plugin-add-module-exports": "^0.2.0",
|
|
||||||
"babel-plugin-transform-es2015-modules-umd": "^6.8.0",
|
|
||||||
"babel-preset-es2015": "^6.6.0",
|
|
||||||
"babel-preset-stage-1": "^6.5.0",
|
|
||||||
"eslint-config-airbnb-base": "^3.0.0",
|
|
||||||
"eslint-plugin-import": "^1.7.0",
|
|
||||||
"grunt": "latest",
|
|
||||||
"grunt-babel": "^6.0.0",
|
|
||||||
"grunt-cli": "latest",
|
|
||||||
"grunt-contrib-coffee": "latest",
|
|
||||||
"grunt-contrib-jasmine": "latest",
|
|
||||||
"grunt-contrib-uglify": "latest",
|
|
||||||
"grunt-contrib-watch": "latest",
|
|
||||||
"grunt-eslint": "^18.1.0",
|
|
||||||
"grunt-growl": "latest",
|
|
||||||
"load-grunt-tasks": "^3.5.0"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"test": "grunt travis"
|
|
||||||
}
|
|
||||||
}
|
|
1
node_modules/wow.js/spec/coffeescripts/helpers/SpecHelper.coffee
generated
vendored
1
node_modules/wow.js/spec/coffeescripts/helpers/SpecHelper.coffee
generated
vendored
|
@ -1 +0,0 @@
|
||||||
beforeEach ->
|
|
334
node_modules/wow.js/spec/coffeescripts/wow-spec.coffee
generated
vendored
334
node_modules/wow.js/spec/coffeescripts/wow-spec.coffee
generated
vendored
|
@ -1,334 +0,0 @@
|
||||||
describe 'WOW', ->
|
|
||||||
|
|
||||||
# Supress warnings:
|
|
||||||
window.console =
|
|
||||||
warn: ->
|
|
||||||
|
|
||||||
# Time to wait after each scroll event:
|
|
||||||
# (This should be >= the interval used by the plugin.)
|
|
||||||
timeout = 100
|
|
||||||
|
|
||||||
# Height of the PhantomJS window:
|
|
||||||
winHeight = 300
|
|
||||||
|
|
||||||
describe 'smoke test', ->
|
|
||||||
|
|
||||||
it 'exists', ->
|
|
||||||
expect WOW
|
|
||||||
.toBeDefined()
|
|
||||||
|
|
||||||
it "has an 'init' method", ->
|
|
||||||
expect new WOW().init
|
|
||||||
.toBeDefined()
|
|
||||||
|
|
||||||
describe 'simple test environment', ->
|
|
||||||
|
|
||||||
beforeEach ->
|
|
||||||
loadFixtures 'simple.html'
|
|
||||||
|
|
||||||
it 'emulates window height', ->
|
|
||||||
expect document.documentElement.clientHeight
|
|
||||||
.toBe winHeight
|
|
||||||
|
|
||||||
it 'has boxes set up for testing', ->
|
|
||||||
boxHeight = 200
|
|
||||||
boxCount = $ '#simple'
|
|
||||||
.children().length
|
|
||||||
# Check each box height
|
|
||||||
expect $('#simple').height()
|
|
||||||
.toBe boxHeight*boxCount
|
|
||||||
expect $('#simple-1').height()
|
|
||||||
.toBe boxHeight
|
|
||||||
expect $('#simple-2').height()
|
|
||||||
.toBe boxHeight
|
|
||||||
expect $('#simple-3').height()
|
|
||||||
.toBe boxHeight
|
|
||||||
expect $('#simple-4').height()
|
|
||||||
.toBe boxHeight
|
|
||||||
expect $('#simple-5').height()
|
|
||||||
.toBe boxHeight
|
|
||||||
# Check each box offset
|
|
||||||
offset = $('#simple').offset().top
|
|
||||||
expect $('#simple-1').offset().top
|
|
||||||
.toBe offset + boxHeight*0
|
|
||||||
expect $('#simple-2').offset().top
|
|
||||||
.toBe offset + boxHeight*1
|
|
||||||
expect $('#simple-3').offset().top
|
|
||||||
.toBe offset + boxHeight*2
|
|
||||||
expect $('#simple-4').offset().top
|
|
||||||
.toBe offset + boxHeight*3
|
|
||||||
expect $('#simple-5').offset().top
|
|
||||||
.toBe offset + boxHeight*4
|
|
||||||
style = $('#simple-5')[0].style
|
|
||||||
expect style.background
|
|
||||||
.toBe 'yellow'
|
|
||||||
expect style.color
|
|
||||||
.toBe 'red'
|
|
||||||
|
|
||||||
describe 'library behaviour', ->
|
|
||||||
|
|
||||||
wow = null
|
|
||||||
|
|
||||||
beforeEach (done) ->
|
|
||||||
loadFixtures 'simple.html'
|
|
||||||
(wow = new WOW).init()
|
|
||||||
setTimeout ->
|
|
||||||
done()
|
|
||||||
, timeout
|
|
||||||
|
|
||||||
it 'animates elements that are fully visible on the page', ->
|
|
||||||
expect $ '#simple-1'
|
|
||||||
.toHaveClass 'animated'
|
|
||||||
expect $('#simple-1').css 'visibility'
|
|
||||||
.toBe 'visible'
|
|
||||||
|
|
||||||
it "does not touch elements that don't have the marker class", ->
|
|
||||||
expect $ '#simple-2'
|
|
||||||
.not.toHaveClass 'animated'
|
|
||||||
expect $('#simple-2').css 'visibility'
|
|
||||||
.toBe 'visible'
|
|
||||||
|
|
||||||
it 'does not animate elements not yet visible on the page', ->
|
|
||||||
expect $ '#simple-3'
|
|
||||||
.not.toHaveClass 'animated'
|
|
||||||
expect $('#simple-3').css 'visibility'
|
|
||||||
.not.toBe 'visible'
|
|
||||||
expect $ '#simple-4'
|
|
||||||
.not.toHaveClass 'animated'
|
|
||||||
expect $('#simple-4').css 'visibility'
|
|
||||||
.not.toBe 'visible'
|
|
||||||
|
|
||||||
it 'animates elements after scrolling down and they become visible', (done) ->
|
|
||||||
# Scroll down so that 150px of #simple-3 becomes visible.
|
|
||||||
window.scrollTo 0, $('#simple-3').offset().top - winHeight + 150
|
|
||||||
setTimeout ->
|
|
||||||
expect $ '#simple-3'
|
|
||||||
.toHaveClass 'animated'
|
|
||||||
expect $('#simple-3').css 'visibility'
|
|
||||||
.toBe 'visible'
|
|
||||||
expect $ '#simple-4'
|
|
||||||
.not.toHaveClass 'animated'
|
|
||||||
expect $('#simple-4').css 'visibility'
|
|
||||||
.not.toBe 'visible'
|
|
||||||
# Scroll down so that 150px of #simple-4 becomes visible.
|
|
||||||
window.scrollTo 0, $('#simple-4').offset().top - winHeight + 150
|
|
||||||
setTimeout ->
|
|
||||||
expect $ '#simple-4'
|
|
||||||
.toHaveClass 'animated'
|
|
||||||
expect $('#simple-4').css 'visibility'
|
|
||||||
.toBe 'visible'
|
|
||||||
done()
|
|
||||||
, timeout
|
|
||||||
, timeout
|
|
||||||
|
|
||||||
it 'does not tamper with the style attribute', (done) ->
|
|
||||||
# Scroll down so that 150px of #simple-5 becomes visible.
|
|
||||||
window.scrollTo 0, $('#simple-5').offset().top - winHeight + 150
|
|
||||||
setTimeout ->
|
|
||||||
expect $ '#simple-5'
|
|
||||||
.toHaveClass 'animated'
|
|
||||||
expect $('#simple-5').css 'visibility'
|
|
||||||
.toBe 'visible'
|
|
||||||
expect $('#simple-5')[0].style.background
|
|
||||||
.toBe 'yellow'
|
|
||||||
expect $('#simple-5')[0].style.color
|
|
||||||
.toBe 'red'
|
|
||||||
done()
|
|
||||||
, timeout
|
|
||||||
|
|
||||||
it 'works with asynchronously loaded content', (done) ->
|
|
||||||
$ '#simple'
|
|
||||||
.append $ '<div/>',
|
|
||||||
id: 'simple-6'
|
|
||||||
class: 'wow'
|
|
||||||
wow.sync()
|
|
||||||
# Scroll down so that 150px of #simple-6 becomes visible.
|
|
||||||
window.scrollTo 0, $('#simple-6').offset().top - winHeight + 150
|
|
||||||
setTimeout ->
|
|
||||||
expect $ '#simple-6'
|
|
||||||
.toHaveClass 'animated'
|
|
||||||
expect $('#simple-6').css 'visibility'
|
|
||||||
.toBe 'visible'
|
|
||||||
done()
|
|
||||||
, timeout
|
|
||||||
|
|
||||||
it 'works with asynchronously loaded nested content', (done) ->
|
|
||||||
$ '#simple'
|
|
||||||
.append $ '<div/>'
|
|
||||||
.children()
|
|
||||||
.first()
|
|
||||||
.append $ '<div/>',
|
|
||||||
id: 'simple-7'
|
|
||||||
class: 'wow'
|
|
||||||
wow.sync()
|
|
||||||
# Scroll down so that 150px of #simple-7 becomes visible.
|
|
||||||
window.scrollTo 0, $('#simple-7').offset().top - winHeight + 150
|
|
||||||
setTimeout ->
|
|
||||||
expect $ '#simple-7'
|
|
||||||
.toHaveClass 'animated'
|
|
||||||
expect $('#simple-7').css 'visibility'
|
|
||||||
.toBe 'visible'
|
|
||||||
done()
|
|
||||||
, timeout
|
|
||||||
|
|
||||||
describe 'custom test environment', ->
|
|
||||||
|
|
||||||
beforeEach ->
|
|
||||||
loadFixtures 'custom.html'
|
|
||||||
|
|
||||||
it 'emulates window height', ->
|
|
||||||
expect document.documentElement.clientHeight
|
|
||||||
.toBe winHeight
|
|
||||||
|
|
||||||
it 'has boxes set up for testing', ->
|
|
||||||
# Check each box height
|
|
||||||
expect $('#custom').height()
|
|
||||||
.toBe 800
|
|
||||||
expect $('#custom-1').height()
|
|
||||||
.toBe 200
|
|
||||||
expect $('#custom-2').height()
|
|
||||||
.toBe 200
|
|
||||||
expect $('#custom-3').height()
|
|
||||||
.toBe 200
|
|
||||||
expect $('#custom-4').height()
|
|
||||||
.toBe 200
|
|
||||||
# Check each box offset
|
|
||||||
offset = $('#custom').offset().top
|
|
||||||
expect $('#custom-1').offset().top
|
|
||||||
.toBe offset + 200*0
|
|
||||||
expect $('#custom-2').offset().top
|
|
||||||
.toBe offset + 200*1
|
|
||||||
expect $('#custom-3').offset().top
|
|
||||||
.toBe offset + 200*2
|
|
||||||
expect $('#custom-4').offset().top
|
|
||||||
.toBe offset + 200*3
|
|
||||||
|
|
||||||
describe 'library behaviour with custom settings', ->
|
|
||||||
|
|
||||||
called = false
|
|
||||||
|
|
||||||
beforeEach (done) ->
|
|
||||||
called = false
|
|
||||||
loadFixtures 'custom.html'
|
|
||||||
new WOW
|
|
||||||
boxClass: 'block'
|
|
||||||
animateClass: 'fancy'
|
|
||||||
offset: 10
|
|
||||||
callback: ->
|
|
||||||
called = true
|
|
||||||
.init()
|
|
||||||
|
|
||||||
# Trigger custom event on dom object, event name is boxClass value
|
|
||||||
$('.block').on 'block', ->
|
|
||||||
$(this).addClass('triggered')
|
|
||||||
|
|
||||||
setTimeout ->
|
|
||||||
done()
|
|
||||||
, timeout
|
|
||||||
|
|
||||||
it "creates two instances of the WOW.js with different configs", ->
|
|
||||||
wow1 = new WOW
|
|
||||||
boxClass: 'block1'
|
|
||||||
animateClass: 'fancy1'
|
|
||||||
offset: 10
|
|
||||||
wow2 = new WOW
|
|
||||||
boxClass: 'block2'
|
|
||||||
animateClass: 'fancy2'
|
|
||||||
offset: 20
|
|
||||||
|
|
||||||
expect wow1.config.boxClass
|
|
||||||
.toBe "block1"
|
|
||||||
expect wow1.config.animateClass
|
|
||||||
.toBe "fancy1"
|
|
||||||
expect wow1.config.offset
|
|
||||||
.toBe 10
|
|
||||||
|
|
||||||
it "does not touch elements that don't have the marker class", (done) ->
|
|
||||||
# Scroll down so that 15px of #custom-1 becomes visible.
|
|
||||||
window.scrollTo 0, $('#custom-1').offset().top - winHeight + 15
|
|
||||||
setTimeout ->
|
|
||||||
expect $ '#custom-1'
|
|
||||||
.not.toHaveClass 'fancy'
|
|
||||||
done()
|
|
||||||
, timeout
|
|
||||||
|
|
||||||
it "animates elements that are partially visible on the page based on the 'offset' config", (done) ->
|
|
||||||
setTimeout ->
|
|
||||||
# Scroll down so that 5px of #custom-2 becomes visible.
|
|
||||||
window.scrollTo 0, $('#custom-2').offset().top - winHeight + 5
|
|
||||||
expect $ '#custom-2'
|
|
||||||
.not.toHaveClass 'fancy'
|
|
||||||
window.scrollTo 0, $('#custom-2').offset().top - winHeight + 15
|
|
||||||
setTimeout ->
|
|
||||||
# Scroll down so that 15px of #custom-2 becomes visible.
|
|
||||||
expect $ '#custom-2'
|
|
||||||
.toHaveClass 'fancy'
|
|
||||||
expect $('#custom-2').css 'visibility'
|
|
||||||
.toBe 'visible'
|
|
||||||
done()
|
|
||||||
, timeout
|
|
||||||
, timeout
|
|
||||||
|
|
||||||
it 'does not animate elements not yet visible on the page', ->
|
|
||||||
expect $ '#custom-3'
|
|
||||||
.not.toHaveClass 'fancy'
|
|
||||||
expect $ '#custom-4'
|
|
||||||
.not.toHaveClass 'fancy'
|
|
||||||
|
|
||||||
it 'animates elements after scrolling down and they become visible', (done) ->
|
|
||||||
# Scroll down so that 150px of #custom-3 becomes visible.
|
|
||||||
window.scrollTo 0, $('#custom-3').offset().top - winHeight + 150
|
|
||||||
setTimeout ->
|
|
||||||
expect $ '#custom-3'
|
|
||||||
.toHaveClass 'fancy'
|
|
||||||
expect $('#custom-3').css 'visibility'
|
|
||||||
.toBe 'visible'
|
|
||||||
expect $('#custom-3')[0].style.webkitAnimationIterationCount
|
|
||||||
.toBe '2'
|
|
||||||
expect $ '#custom-4'
|
|
||||||
.not.toHaveClass 'fancy'
|
|
||||||
# Scroll down so that 150px of #custom-4 becomes visible.
|
|
||||||
window.scrollTo 0, $('#custom-4').offset().top - winHeight + 150
|
|
||||||
setTimeout ->
|
|
||||||
expect $ '#custom-4'
|
|
||||||
.toHaveClass 'fancy'
|
|
||||||
expect $('#custom-4').css 'visibility'
|
|
||||||
.toBe 'visible'
|
|
||||||
expect $('#custom-4')[0].style.webkitAnimationIterationCount
|
|
||||||
.toBe 'infinite'
|
|
||||||
expect $('#custom-4')[0].style.webkitAnimationDuration
|
|
||||||
.toBe '2s'
|
|
||||||
expect $('#custom-4')[0].style.webkitAnimationDelay
|
|
||||||
.toBe '1s'
|
|
||||||
done()
|
|
||||||
, timeout
|
|
||||||
, timeout
|
|
||||||
|
|
||||||
it "fires the callback", (done) ->
|
|
||||||
called = false # reset
|
|
||||||
# Scroll down so that 150px of #custom-3 becomes visible.
|
|
||||||
window.scrollTo 0, $('#custom-3').offset().top - winHeight + 150
|
|
||||||
setTimeout ->
|
|
||||||
expect called
|
|
||||||
.toBe true
|
|
||||||
done()
|
|
||||||
, timeout
|
|
||||||
|
|
||||||
it 'fires the callback on the visible element', (done) ->
|
|
||||||
# Scroll down so that 150px of #custom-3 becomes visible.
|
|
||||||
window.scrollTo 0, $('#custom-3').offset().top - winHeight + 150
|
|
||||||
setTimeout ->
|
|
||||||
expect $ '#custom-3'
|
|
||||||
.toHaveClass 'triggered'
|
|
||||||
expect $ '#custom-4'
|
|
||||||
.not.toHaveClass 'triggered'
|
|
||||||
# Scroll down so that 150px of #custom-4 becomes visible.
|
|
||||||
window.scrollTo 0, $('#custom-4').offset().top - winHeight + 150
|
|
||||||
setTimeout ->
|
|
||||||
expect $ '#custom-3'
|
|
||||||
.toHaveClass 'triggered'
|
|
||||||
expect $ '#custom-4'
|
|
||||||
.toHaveClass 'triggered'
|
|
||||||
done()
|
|
||||||
, timeout
|
|
||||||
, timeout
|
|
1
node_modules/wow.js/spec/javascripts/fixtures/custom.html
generated
vendored
1
node_modules/wow.js/spec/javascripts/fixtures/custom.html
generated
vendored
|
@ -1 +0,0 @@
|
||||||
<style scoped>
#custom {
position: relative;
top: 100px;
}
#custom > div {
height: 200px;
}
</style>
<div id="custom">
<div id="custom-1" class="wow">Test 1</div>
<div id="custom-2" class="block">Test 2</div>
<div id="custom-3" class="block" data-wow-iteration="2">Test 3</div>
<div id="custom-4" class="block" data-wow-iteration="infinite" data-wow-duration="2s" data-wow-delay="1s">Test 4</div>
</div>
|
|
1
node_modules/wow.js/spec/javascripts/fixtures/simple.html
generated
vendored
1
node_modules/wow.js/spec/javascripts/fixtures/simple.html
generated
vendored
|
@ -1 +0,0 @@
|
||||||
<style scoped>
#simple {
position: relative;
top: 100px;
}
#simple > div {
height: 200px;
}
.wow {
visibility: hidden;
}
</style>
<div id="simple">
<div id="simple-1" class="wow">Test 1</div>
<div id="simple-2">Test 2</div>
<div id="simple-3" class="wow">Test 3</div>
<div id="simple-4" class="wow">Test 4</div>
<div id="simple-5" class="wow" style="background: yellow; color: red;">Test 5</div>
</div>
|
|
4
node_modules/wow.js/spec/javascripts/helpers/SpecHelper.js
generated
vendored
4
node_modules/wow.js/spec/javascripts/helpers/SpecHelper.js
generated
vendored
|
@ -1,4 +0,0 @@
|
||||||
(function() {
|
|
||||||
beforeEach(function() {});
|
|
||||||
|
|
||||||
}).call(this);
|
|
812
node_modules/wow.js/spec/javascripts/libs/jasmine-jquery.js
generated
vendored
812
node_modules/wow.js/spec/javascripts/libs/jasmine-jquery.js
generated
vendored
|
@ -1,812 +0,0 @@
|
||||||
/*!
|
|
||||||
Jasmine-jQuery: a set of jQuery helpers for Jasmine tests.
|
|
||||||
|
|
||||||
Version 2.0.2
|
|
||||||
|
|
||||||
https://github.com/velesin/jasmine-jquery
|
|
||||||
|
|
||||||
Copyright (c) 2010-2014 Wojciech Zawistowski, Travis Jeffery
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
+function (window, jasmine, $) { "use strict";
|
|
||||||
|
|
||||||
jasmine.spiedEventsKey = function (selector, eventName) {
|
|
||||||
return [$(selector).selector, eventName].toString()
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.getFixtures = function () {
|
|
||||||
return jasmine.currentFixtures_ = jasmine.currentFixtures_ || new jasmine.Fixtures()
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.getStyleFixtures = function () {
|
|
||||||
return jasmine.currentStyleFixtures_ = jasmine.currentStyleFixtures_ || new jasmine.StyleFixtures()
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures = function () {
|
|
||||||
this.containerId = 'jasmine-fixtures'
|
|
||||||
this.fixturesCache_ = {}
|
|
||||||
this.fixturesPath = 'spec/javascripts/fixtures'
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures.prototype.set = function (html) {
|
|
||||||
this.cleanUp()
|
|
||||||
return this.createContainer_(html)
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures.prototype.appendSet= function (html) {
|
|
||||||
this.addToContainer_(html)
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures.prototype.preload = function () {
|
|
||||||
this.read.apply(this, arguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures.prototype.load = function () {
|
|
||||||
this.cleanUp()
|
|
||||||
this.createContainer_(this.read.apply(this, arguments))
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures.prototype.appendLoad = function () {
|
|
||||||
this.addToContainer_(this.read.apply(this, arguments))
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures.prototype.read = function () {
|
|
||||||
var htmlChunks = []
|
|
||||||
, fixtureUrls = arguments
|
|
||||||
|
|
||||||
for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
|
|
||||||
htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex]))
|
|
||||||
}
|
|
||||||
|
|
||||||
return htmlChunks.join('')
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures.prototype.clearCache = function () {
|
|
||||||
this.fixturesCache_ = {}
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures.prototype.cleanUp = function () {
|
|
||||||
$('#' + this.containerId).remove()
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures.prototype.sandbox = function (attributes) {
|
|
||||||
var attributesToSet = attributes || {}
|
|
||||||
return $('<div id="sandbox" />').attr(attributesToSet)
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures.prototype.createContainer_ = function (html) {
|
|
||||||
var container = $('<div>')
|
|
||||||
.attr('id', this.containerId)
|
|
||||||
.html(html)
|
|
||||||
|
|
||||||
$(document.body).append(container)
|
|
||||||
return container
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures.prototype.addToContainer_ = function (html){
|
|
||||||
var container = $(document.body).find('#'+this.containerId).append(html)
|
|
||||||
|
|
||||||
if (!container.length) {
|
|
||||||
this.createContainer_(html)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures.prototype.getFixtureHtml_ = function (url) {
|
|
||||||
if (typeof this.fixturesCache_[url] === 'undefined') {
|
|
||||||
this.loadFixtureIntoCache_(url)
|
|
||||||
}
|
|
||||||
return this.fixturesCache_[url]
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures.prototype.loadFixtureIntoCache_ = function (relativeUrl) {
|
|
||||||
var self = this
|
|
||||||
, url = this.makeFixtureUrl_(relativeUrl)
|
|
||||||
, htmlText = ''
|
|
||||||
, request = $.ajax({
|
|
||||||
async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded
|
|
||||||
cache: false,
|
|
||||||
url: url,
|
|
||||||
success: function (data, status, $xhr) {
|
|
||||||
htmlText = $xhr.responseText
|
|
||||||
}
|
|
||||||
}).fail(function () {
|
|
||||||
throw new Error('Fixture could not be loaded: ' + url + ' (status: ' + status + ', message: ' + errorThrown.message + ')')
|
|
||||||
})
|
|
||||||
|
|
||||||
var scripts = $($.parseHTML(htmlText, true)).find('script[src]') || [];
|
|
||||||
|
|
||||||
scripts.each(function(){
|
|
||||||
$.ajax({
|
|
||||||
async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded
|
|
||||||
cache: false,
|
|
||||||
dataType: 'script',
|
|
||||||
url: $(this).attr('src'),
|
|
||||||
success: function (data, status, $xhr) {
|
|
||||||
htmlText += '<script>' + $xhr.responseText + '</script>'
|
|
||||||
},
|
|
||||||
error: function (jqXHR, status, errorThrown) {
|
|
||||||
throw new Error('Script could not be loaded: ' + scriptSrc + ' (status: ' + status + ', message: ' + errorThrown.message + ')')
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})
|
|
||||||
|
|
||||||
self.fixturesCache_[relativeUrl] = htmlText;
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures.prototype.makeFixtureUrl_ = function (relativeUrl){
|
|
||||||
return this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.Fixtures.prototype.proxyCallTo_ = function (methodName, passedArguments) {
|
|
||||||
return this[methodName].apply(this, passedArguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
jasmine.StyleFixtures = function () {
|
|
||||||
this.fixturesCache_ = {}
|
|
||||||
this.fixturesNodes_ = []
|
|
||||||
this.fixturesPath = 'spec/javascripts/fixtures'
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.StyleFixtures.prototype.set = function (css) {
|
|
||||||
this.cleanUp()
|
|
||||||
this.createStyle_(css)
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.StyleFixtures.prototype.appendSet = function (css) {
|
|
||||||
this.createStyle_(css)
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.StyleFixtures.prototype.preload = function () {
|
|
||||||
this.read_.apply(this, arguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.StyleFixtures.prototype.load = function () {
|
|
||||||
this.cleanUp()
|
|
||||||
this.createStyle_(this.read_.apply(this, arguments))
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.StyleFixtures.prototype.appendLoad = function () {
|
|
||||||
this.createStyle_(this.read_.apply(this, arguments))
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.StyleFixtures.prototype.cleanUp = function () {
|
|
||||||
while(this.fixturesNodes_.length) {
|
|
||||||
this.fixturesNodes_.pop().remove()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.StyleFixtures.prototype.createStyle_ = function (html) {
|
|
||||||
var styleText = $('<div></div>').html(html).text()
|
|
||||||
, style = $('<style>' + styleText + '</style>')
|
|
||||||
|
|
||||||
this.fixturesNodes_.push(style)
|
|
||||||
$('head').append(style)
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.StyleFixtures.prototype.clearCache = jasmine.Fixtures.prototype.clearCache
|
|
||||||
jasmine.StyleFixtures.prototype.read_ = jasmine.Fixtures.prototype.read
|
|
||||||
jasmine.StyleFixtures.prototype.getFixtureHtml_ = jasmine.Fixtures.prototype.getFixtureHtml_
|
|
||||||
jasmine.StyleFixtures.prototype.loadFixtureIntoCache_ = jasmine.Fixtures.prototype.loadFixtureIntoCache_
|
|
||||||
jasmine.StyleFixtures.prototype.makeFixtureUrl_ = jasmine.Fixtures.prototype.makeFixtureUrl_
|
|
||||||
jasmine.StyleFixtures.prototype.proxyCallTo_ = jasmine.Fixtures.prototype.proxyCallTo_
|
|
||||||
|
|
||||||
jasmine.getJSONFixtures = function () {
|
|
||||||
return jasmine.currentJSONFixtures_ = jasmine.currentJSONFixtures_ || new jasmine.JSONFixtures()
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.JSONFixtures = function () {
|
|
||||||
this.fixturesCache_ = {}
|
|
||||||
this.fixturesPath = 'spec/javascripts/fixtures/json'
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.JSONFixtures.prototype.load = function () {
|
|
||||||
this.read.apply(this, arguments)
|
|
||||||
return this.fixturesCache_
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.JSONFixtures.prototype.read = function () {
|
|
||||||
var fixtureUrls = arguments
|
|
||||||
|
|
||||||
for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
|
|
||||||
this.getFixtureData_(fixtureUrls[urlIndex])
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.fixturesCache_
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.JSONFixtures.prototype.clearCache = function () {
|
|
||||||
this.fixturesCache_ = {}
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.JSONFixtures.prototype.getFixtureData_ = function (url) {
|
|
||||||
if (!this.fixturesCache_[url]) this.loadFixtureIntoCache_(url)
|
|
||||||
return this.fixturesCache_[url]
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.JSONFixtures.prototype.loadFixtureIntoCache_ = function (relativeUrl) {
|
|
||||||
var self = this
|
|
||||||
, url = this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded
|
|
||||||
cache: false,
|
|
||||||
dataType: 'json',
|
|
||||||
url: url,
|
|
||||||
success: function (data) {
|
|
||||||
self.fixturesCache_[relativeUrl] = data
|
|
||||||
},
|
|
||||||
error: function (jqXHR, status, errorThrown) {
|
|
||||||
throw new Error('JSONFixture could not be loaded: ' + url + ' (status: ' + status + ', message: ' + errorThrown.message + ')')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.JSONFixtures.prototype.proxyCallTo_ = function (methodName, passedArguments) {
|
|
||||||
return this[methodName].apply(this, passedArguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.jQuery = function () {}
|
|
||||||
|
|
||||||
jasmine.jQuery.browserTagCaseIndependentHtml = function (html) {
|
|
||||||
return $('<div/>').append(html).html()
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.jQuery.elementToString = function (element) {
|
|
||||||
return $(element).map(function () { return this.outerHTML; }).toArray().join(', ')
|
|
||||||
}
|
|
||||||
|
|
||||||
var data = {
|
|
||||||
spiedEvents: {}
|
|
||||||
, handlers: []
|
|
||||||
}
|
|
||||||
|
|
||||||
jasmine.jQuery.events = {
|
|
||||||
spyOn: function (selector, eventName) {
|
|
||||||
var handler = function (e) {
|
|
||||||
data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] = jasmine.util.argsToArray(arguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
$(selector).on(eventName, handler)
|
|
||||||
data.handlers.push(handler)
|
|
||||||
|
|
||||||
return {
|
|
||||||
selector: selector,
|
|
||||||
eventName: eventName,
|
|
||||||
handler: handler,
|
|
||||||
reset: function (){
|
|
||||||
delete data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
args: function (selector, eventName) {
|
|
||||||
var actualArgs = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)]
|
|
||||||
|
|
||||||
if (!actualArgs) {
|
|
||||||
throw "There is no spy for " + eventName + " on " + selector.toString() + ". Make sure to create a spy using spyOnEvent."
|
|
||||||
}
|
|
||||||
|
|
||||||
return actualArgs
|
|
||||||
},
|
|
||||||
|
|
||||||
wasTriggered: function (selector, eventName) {
|
|
||||||
return !!(data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)])
|
|
||||||
},
|
|
||||||
|
|
||||||
wasTriggeredWith: function (selector, eventName, expectedArgs, util, customEqualityTesters) {
|
|
||||||
var actualArgs = jasmine.jQuery.events.args(selector, eventName).slice(1)
|
|
||||||
|
|
||||||
if (Object.prototype.toString.call(expectedArgs) !== '[object Array]')
|
|
||||||
actualArgs = actualArgs[0]
|
|
||||||
|
|
||||||
return util.equals(expectedArgs, actualArgs, customEqualityTesters)
|
|
||||||
},
|
|
||||||
|
|
||||||
wasPrevented: function (selector, eventName) {
|
|
||||||
var args = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)]
|
|
||||||
, e = args ? args[0] : undefined
|
|
||||||
|
|
||||||
return e && e.isDefaultPrevented()
|
|
||||||
},
|
|
||||||
|
|
||||||
wasStopped: function (selector, eventName) {
|
|
||||||
var args = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)]
|
|
||||||
, e = args ? args[0] : undefined
|
|
||||||
return e && e.isPropagationStopped()
|
|
||||||
},
|
|
||||||
|
|
||||||
cleanUp: function () {
|
|
||||||
data.spiedEvents = {}
|
|
||||||
data.handlers = []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var hasProperty = function (actualValue, expectedValue) {
|
|
||||||
if (expectedValue === undefined)
|
|
||||||
return actualValue !== undefined
|
|
||||||
|
|
||||||
return actualValue === expectedValue
|
|
||||||
}
|
|
||||||
|
|
||||||
beforeEach(function () {
|
|
||||||
jasmine.addMatchers({
|
|
||||||
toHaveClass: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, className) {
|
|
||||||
return { pass: $(actual).hasClass(className) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveCss: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, css) {
|
|
||||||
for (var prop in css){
|
|
||||||
var value = css[prop]
|
|
||||||
// see issue #147 on gh
|
|
||||||
;if (value === 'auto' && $(actual).get(0).style[prop] === 'auto') continue
|
|
||||||
if ($(actual).css(prop) !== value) return { pass: false }
|
|
||||||
}
|
|
||||||
return { pass: true }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toBeVisible: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual) {
|
|
||||||
return { pass: $(actual).is(':visible') }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toBeHidden: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual) {
|
|
||||||
return { pass: $(actual).is(':hidden') }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toBeSelected: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual) {
|
|
||||||
return { pass: $(actual).is(':selected') }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toBeChecked: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual) {
|
|
||||||
return { pass: $(actual).is(':checked') }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toBeEmpty: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual) {
|
|
||||||
return { pass: $(actual).is(':empty') }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toBeInDOM: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual) {
|
|
||||||
return { pass: $.contains(document.documentElement, $(actual)[0]) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toExist: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual) {
|
|
||||||
return { pass: $(actual).length }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveLength: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, length) {
|
|
||||||
return { pass: $(actual).length === length }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveAttr: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, attributeName, expectedAttributeValue) {
|
|
||||||
return { pass: hasProperty($(actual).attr(attributeName), expectedAttributeValue) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveProp: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, propertyName, expectedPropertyValue) {
|
|
||||||
return { pass: hasProperty($(actual).prop(propertyName), expectedPropertyValue) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveId: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, id) {
|
|
||||||
return { pass: $(actual).attr('id') == id }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveHtml: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, html) {
|
|
||||||
return { pass: $(actual).html() == jasmine.jQuery.browserTagCaseIndependentHtml(html) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toContainHtml: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, html) {
|
|
||||||
var actualHtml = $(actual).html()
|
|
||||||
, expectedHtml = jasmine.jQuery.browserTagCaseIndependentHtml(html)
|
|
||||||
|
|
||||||
return { pass: (actualHtml.indexOf(expectedHtml) >= 0) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveText: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, text) {
|
|
||||||
var trimmedText = $.trim($(actual).text())
|
|
||||||
|
|
||||||
if (text && $.isFunction(text.test)) {
|
|
||||||
return { pass: text.test(trimmedText) }
|
|
||||||
} else {
|
|
||||||
return { pass: trimmedText == text }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toContainText: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, text) {
|
|
||||||
var trimmedText = $.trim($(actual).text())
|
|
||||||
|
|
||||||
if (text && $.isFunction(text.test)) {
|
|
||||||
return { pass: text.test(trimmedText) }
|
|
||||||
} else {
|
|
||||||
return { pass: trimmedText.indexOf(text) != -1 }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveValue: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, value) {
|
|
||||||
return { pass: $(actual).val() === value }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveData: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, key, expectedValue) {
|
|
||||||
return { pass: hasProperty($(actual).data(key), expectedValue) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toContainElement: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, selector) {
|
|
||||||
if (window.debug) debugger
|
|
||||||
return { pass: $(actual).find(selector).length }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toBeMatchedBy: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, selector) {
|
|
||||||
return { pass: $(actual).filter(selector).length }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toBeDisabled: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, selector) {
|
|
||||||
return { pass: $(actual).is(':disabled') }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toBeFocused: function (selector) {
|
|
||||||
return {
|
|
||||||
compare: function (actual, selector) {
|
|
||||||
return { pass: $(actual)[0] === $(actual)[0].ownerDocument.activeElement }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHandle: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, event) {
|
|
||||||
var events = $._data($(actual).get(0), "events")
|
|
||||||
|
|
||||||
if (!events || !event || typeof event !== "string") {
|
|
||||||
return { pass: false }
|
|
||||||
}
|
|
||||||
|
|
||||||
var namespaces = event.split(".")
|
|
||||||
, eventType = namespaces.shift()
|
|
||||||
, sortedNamespaces = namespaces.slice(0).sort()
|
|
||||||
, namespaceRegExp = new RegExp("(^|\\.)" + sortedNamespaces.join("\\.(?:.*\\.)?") + "(\\.|$)")
|
|
||||||
|
|
||||||
if (events[eventType] && namespaces.length) {
|
|
||||||
for (var i = 0; i < events[eventType].length; i++) {
|
|
||||||
var namespace = events[eventType][i].namespace
|
|
||||||
|
|
||||||
if (namespaceRegExp.test(namespace))
|
|
||||||
return { pass: true }
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return { pass: (events[eventType] && events[eventType].length > 0) }
|
|
||||||
}
|
|
||||||
|
|
||||||
return { pass: false }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHandleWith: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, eventName, eventHandler) {
|
|
||||||
var normalizedEventName = eventName.split('.')[0]
|
|
||||||
, stack = $._data($(actual).get(0), "events")[normalizedEventName]
|
|
||||||
|
|
||||||
for (var i = 0; i < stack.length; i++) {
|
|
||||||
if (stack[i].handler == eventHandler) return { pass: true }
|
|
||||||
}
|
|
||||||
|
|
||||||
return { pass: false }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveBeenTriggeredOn: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, selector) {
|
|
||||||
var result = { pass: jasmine.jQuery.events.wasTriggered(selector, actual) }
|
|
||||||
|
|
||||||
result.message = result.pass ?
|
|
||||||
"Expected event " + $(actual) + " not to have been triggered on " + selector :
|
|
||||||
"Expected event " + $(actual) + " to have been triggered on " + selector
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveBeenTriggered: function (){
|
|
||||||
return {
|
|
||||||
compare: function (actual) {
|
|
||||||
var eventName = actual.eventName
|
|
||||||
, selector = actual.selector
|
|
||||||
, result = { pass: jasmine.jQuery.events.wasTriggered(selector, eventName) }
|
|
||||||
|
|
||||||
result.message = result.pass ?
|
|
||||||
"Expected event " + eventName + " not to have been triggered on " + selector :
|
|
||||||
"Expected event " + eventName + " to have been triggered on " + selector
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveBeenTriggeredOnAndWith: function (j$, customEqualityTesters) {
|
|
||||||
return {
|
|
||||||
compare: function (actual, selector, expectedArgs) {
|
|
||||||
var wasTriggered = jasmine.jQuery.events.wasTriggered(selector, actual)
|
|
||||||
, result = { pass: wasTriggered && jasmine.jQuery.events.wasTriggeredWith(selector, actual, expectedArgs, j$, customEqualityTesters) }
|
|
||||||
|
|
||||||
if (wasTriggered) {
|
|
||||||
var actualArgs = jasmine.jQuery.events.args(selector, actual, expectedArgs)[1]
|
|
||||||
result.message = result.pass ?
|
|
||||||
"Expected event " + actual + " not to have been triggered with " + jasmine.pp(expectedArgs) + " but it was triggered with " + jasmine.pp(actualArgs) :
|
|
||||||
"Expected event " + actual + " to have been triggered with " + jasmine.pp(expectedArgs) + " but it was triggered with " + jasmine.pp(actualArgs)
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// todo check on this
|
|
||||||
result.message = result.pass ?
|
|
||||||
"Expected event " + actual + " not to have been triggered on " + selector :
|
|
||||||
"Expected event " + actual + " to have been triggered on " + selector
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveBeenPreventedOn: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, selector) {
|
|
||||||
var result = { pass: jasmine.jQuery.events.wasPrevented(selector, actual) }
|
|
||||||
|
|
||||||
result.message = result.pass ?
|
|
||||||
"Expected event " + actual + " not to have been prevented on " + selector :
|
|
||||||
"Expected event " + actual + " to have been prevented on " + selector
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveBeenPrevented: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual) {
|
|
||||||
var eventName = actual.eventName
|
|
||||||
, selector = actual.selector
|
|
||||||
, result = { pass: jasmine.jQuery.events.wasPrevented(selector, eventName) }
|
|
||||||
|
|
||||||
result.message = result.pass ?
|
|
||||||
"Expected event " + eventName + " not to have been prevented on " + selector :
|
|
||||||
"Expected event " + eventName + " to have been prevented on " + selector
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveBeenStoppedOn: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual, selector) {
|
|
||||||
var result = { pass: jasmine.jQuery.events.wasStopped(selector, actual) }
|
|
||||||
|
|
||||||
result.message = result.pass ?
|
|
||||||
"Expected event " + actual + " not to have been stopped on " + selector :
|
|
||||||
"Expected event " + actual + " to have been stopped on " + selector
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
toHaveBeenStopped: function () {
|
|
||||||
return {
|
|
||||||
compare: function (actual) {
|
|
||||||
var eventName = actual.eventName
|
|
||||||
, selector = actual.selector
|
|
||||||
, result = { pass: jasmine.jQuery.events.wasStopped(selector, eventName) }
|
|
||||||
|
|
||||||
result.message = result.pass ?
|
|
||||||
"Expected event " + eventName + " not to have been stopped on " + selector :
|
|
||||||
"Expected event " + eventName + " to have been stopped on " + selector
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
jasmine.getEnv().addCustomEqualityTester(function(a, b) {
|
|
||||||
if (a && b) {
|
|
||||||
if (a instanceof $ || jasmine.isDomNode(a)) {
|
|
||||||
var $a = $(a)
|
|
||||||
|
|
||||||
if (b instanceof $)
|
|
||||||
return $a.length == b.length && a.is(b)
|
|
||||||
|
|
||||||
return $a.is(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (b instanceof $ || jasmine.isDomNode(b)) {
|
|
||||||
var $b = $(b)
|
|
||||||
|
|
||||||
if (a instanceof jQuery)
|
|
||||||
return a.length == $b.length && $b.is(a)
|
|
||||||
|
|
||||||
return $(b).is(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
jasmine.getEnv().addCustomEqualityTester(function (a, b) {
|
|
||||||
if (a instanceof jQuery && b instanceof jQuery && a.size() == b.size())
|
|
||||||
return a.is(b)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
afterEach(function () {
|
|
||||||
jasmine.getFixtures().cleanUp()
|
|
||||||
jasmine.getStyleFixtures().cleanUp()
|
|
||||||
jasmine.jQuery.events.cleanUp()
|
|
||||||
})
|
|
||||||
|
|
||||||
window.readFixtures = function () {
|
|
||||||
return jasmine.getFixtures().proxyCallTo_('read', arguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
window.preloadFixtures = function () {
|
|
||||||
jasmine.getFixtures().proxyCallTo_('preload', arguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
window.loadFixtures = function () {
|
|
||||||
jasmine.getFixtures().proxyCallTo_('load', arguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
window.appendLoadFixtures = function () {
|
|
||||||
jasmine.getFixtures().proxyCallTo_('appendLoad', arguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
window.setFixtures = function (html) {
|
|
||||||
return jasmine.getFixtures().proxyCallTo_('set', arguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
window.appendSetFixtures = function () {
|
|
||||||
jasmine.getFixtures().proxyCallTo_('appendSet', arguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
window.sandbox = function (attributes) {
|
|
||||||
return jasmine.getFixtures().sandbox(attributes)
|
|
||||||
}
|
|
||||||
|
|
||||||
window.spyOnEvent = function (selector, eventName) {
|
|
||||||
return jasmine.jQuery.events.spyOn(selector, eventName)
|
|
||||||
}
|
|
||||||
|
|
||||||
window.preloadStyleFixtures = function () {
|
|
||||||
jasmine.getStyleFixtures().proxyCallTo_('preload', arguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
window.loadStyleFixtures = function () {
|
|
||||||
jasmine.getStyleFixtures().proxyCallTo_('load', arguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
window.appendLoadStyleFixtures = function () {
|
|
||||||
jasmine.getStyleFixtures().proxyCallTo_('appendLoad', arguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
window.setStyleFixtures = function (html) {
|
|
||||||
jasmine.getStyleFixtures().proxyCallTo_('set', arguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
window.appendSetStyleFixtures = function (html) {
|
|
||||||
jasmine.getStyleFixtures().proxyCallTo_('appendSet', arguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
window.loadJSONFixtures = function () {
|
|
||||||
return jasmine.getJSONFixtures().proxyCallTo_('load', arguments)
|
|
||||||
}
|
|
||||||
|
|
||||||
window.getJSONFixture = function (url) {
|
|
||||||
return jasmine.getJSONFixtures().proxyCallTo_('read', arguments)[url]
|
|
||||||
}
|
|
||||||
}(window, window.jasmine, window.jQuery);
|
|
9789
node_modules/wow.js/spec/javascripts/libs/jquery.js
generated
vendored
9789
node_modules/wow.js/spec/javascripts/libs/jquery.js
generated
vendored
File diff suppressed because it is too large
Load diff
244
node_modules/wow.js/spec/javascripts/wow-spec.js
generated
vendored
244
node_modules/wow.js/spec/javascripts/wow-spec.js
generated
vendored
|
@ -1,244 +0,0 @@
|
||||||
(function() {
|
|
||||||
describe('WOW', function() {
|
|
||||||
var timeout, winHeight;
|
|
||||||
window.console = {
|
|
||||||
warn: function() {}
|
|
||||||
};
|
|
||||||
timeout = 100;
|
|
||||||
winHeight = 300;
|
|
||||||
describe('smoke test', function() {
|
|
||||||
it('exists', function() {
|
|
||||||
return expect(WOW).toBeDefined();
|
|
||||||
});
|
|
||||||
return it("has an 'init' method", function() {
|
|
||||||
return expect(new WOW().init).toBeDefined();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
describe('simple test environment', function() {
|
|
||||||
beforeEach(function() {
|
|
||||||
return loadFixtures('simple.html');
|
|
||||||
});
|
|
||||||
it('emulates window height', function() {
|
|
||||||
return expect(document.documentElement.clientHeight).toBe(winHeight);
|
|
||||||
});
|
|
||||||
return it('has boxes set up for testing', function() {
|
|
||||||
var boxCount, boxHeight, offset, style;
|
|
||||||
boxHeight = 200;
|
|
||||||
boxCount = $('#simple').children().length;
|
|
||||||
expect($('#simple').height()).toBe(boxHeight * boxCount);
|
|
||||||
expect($('#simple-1').height()).toBe(boxHeight);
|
|
||||||
expect($('#simple-2').height()).toBe(boxHeight);
|
|
||||||
expect($('#simple-3').height()).toBe(boxHeight);
|
|
||||||
expect($('#simple-4').height()).toBe(boxHeight);
|
|
||||||
expect($('#simple-5').height()).toBe(boxHeight);
|
|
||||||
offset = $('#simple').offset().top;
|
|
||||||
expect($('#simple-1').offset().top).toBe(offset + boxHeight * 0);
|
|
||||||
expect($('#simple-2').offset().top).toBe(offset + boxHeight * 1);
|
|
||||||
expect($('#simple-3').offset().top).toBe(offset + boxHeight * 2);
|
|
||||||
expect($('#simple-4').offset().top).toBe(offset + boxHeight * 3);
|
|
||||||
expect($('#simple-5').offset().top).toBe(offset + boxHeight * 4);
|
|
||||||
style = $('#simple-5')[0].style;
|
|
||||||
expect(style.background).toBe('yellow');
|
|
||||||
return expect(style.color).toBe('red');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
describe('library behaviour', function() {
|
|
||||||
var wow;
|
|
||||||
wow = null;
|
|
||||||
beforeEach(function(done) {
|
|
||||||
loadFixtures('simple.html');
|
|
||||||
(wow = new WOW).init();
|
|
||||||
return setTimeout(function() {
|
|
||||||
return done();
|
|
||||||
}, timeout);
|
|
||||||
});
|
|
||||||
it('animates elements that are fully visible on the page', function() {
|
|
||||||
expect($('#simple-1')).toHaveClass('animated');
|
|
||||||
return expect($('#simple-1').css('visibility')).toBe('visible');
|
|
||||||
});
|
|
||||||
it("does not touch elements that don't have the marker class", function() {
|
|
||||||
expect($('#simple-2')).not.toHaveClass('animated');
|
|
||||||
return expect($('#simple-2').css('visibility')).toBe('visible');
|
|
||||||
});
|
|
||||||
it('does not animate elements not yet visible on the page', function() {
|
|
||||||
expect($('#simple-3')).not.toHaveClass('animated');
|
|
||||||
expect($('#simple-3').css('visibility')).not.toBe('visible');
|
|
||||||
expect($('#simple-4')).not.toHaveClass('animated');
|
|
||||||
return expect($('#simple-4').css('visibility')).not.toBe('visible');
|
|
||||||
});
|
|
||||||
it('animates elements after scrolling down and they become visible', function(done) {
|
|
||||||
window.scrollTo(0, $('#simple-3').offset().top - winHeight + 150);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect($('#simple-3')).toHaveClass('animated');
|
|
||||||
expect($('#simple-3').css('visibility')).toBe('visible');
|
|
||||||
expect($('#simple-4')).not.toHaveClass('animated');
|
|
||||||
expect($('#simple-4').css('visibility')).not.toBe('visible');
|
|
||||||
window.scrollTo(0, $('#simple-4').offset().top - winHeight + 150);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect($('#simple-4')).toHaveClass('animated');
|
|
||||||
expect($('#simple-4').css('visibility')).toBe('visible');
|
|
||||||
return done();
|
|
||||||
}, timeout);
|
|
||||||
}, timeout);
|
|
||||||
});
|
|
||||||
it('does not tamper with the style attribute', function(done) {
|
|
||||||
window.scrollTo(0, $('#simple-5').offset().top - winHeight + 150);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect($('#simple-5')).toHaveClass('animated');
|
|
||||||
expect($('#simple-5').css('visibility')).toBe('visible');
|
|
||||||
expect($('#simple-5')[0].style.background).toBe('yellow');
|
|
||||||
expect($('#simple-5')[0].style.color).toBe('red');
|
|
||||||
return done();
|
|
||||||
}, timeout);
|
|
||||||
});
|
|
||||||
it('works with asynchronously loaded content', function(done) {
|
|
||||||
$('#simple').append($('<div/>', {
|
|
||||||
id: 'simple-6',
|
|
||||||
"class": 'wow'
|
|
||||||
}));
|
|
||||||
wow.sync();
|
|
||||||
window.scrollTo(0, $('#simple-6').offset().top - winHeight + 150);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect($('#simple-6')).toHaveClass('animated');
|
|
||||||
expect($('#simple-6').css('visibility')).toBe('visible');
|
|
||||||
return done();
|
|
||||||
}, timeout);
|
|
||||||
});
|
|
||||||
return it('works with asynchronously loaded nested content', function(done) {
|
|
||||||
$('#simple').append($('<div/>')).children().first().append($('<div/>', {
|
|
||||||
id: 'simple-7',
|
|
||||||
"class": 'wow'
|
|
||||||
}));
|
|
||||||
wow.sync();
|
|
||||||
window.scrollTo(0, $('#simple-7').offset().top - winHeight + 150);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect($('#simple-7')).toHaveClass('animated');
|
|
||||||
expect($('#simple-7').css('visibility')).toBe('visible');
|
|
||||||
return done();
|
|
||||||
}, timeout);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
describe('custom test environment', function() {
|
|
||||||
beforeEach(function() {
|
|
||||||
return loadFixtures('custom.html');
|
|
||||||
});
|
|
||||||
it('emulates window height', function() {
|
|
||||||
return expect(document.documentElement.clientHeight).toBe(winHeight);
|
|
||||||
});
|
|
||||||
return it('has boxes set up for testing', function() {
|
|
||||||
var offset;
|
|
||||||
expect($('#custom').height()).toBe(800);
|
|
||||||
expect($('#custom-1').height()).toBe(200);
|
|
||||||
expect($('#custom-2').height()).toBe(200);
|
|
||||||
expect($('#custom-3').height()).toBe(200);
|
|
||||||
expect($('#custom-4').height()).toBe(200);
|
|
||||||
offset = $('#custom').offset().top;
|
|
||||||
expect($('#custom-1').offset().top).toBe(offset + 200 * 0);
|
|
||||||
expect($('#custom-2').offset().top).toBe(offset + 200 * 1);
|
|
||||||
expect($('#custom-3').offset().top).toBe(offset + 200 * 2);
|
|
||||||
return expect($('#custom-4').offset().top).toBe(offset + 200 * 3);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return describe('library behaviour with custom settings', function() {
|
|
||||||
var called;
|
|
||||||
called = false;
|
|
||||||
beforeEach(function(done) {
|
|
||||||
called = false;
|
|
||||||
loadFixtures('custom.html');
|
|
||||||
new WOW({
|
|
||||||
boxClass: 'block',
|
|
||||||
animateClass: 'fancy',
|
|
||||||
offset: 10,
|
|
||||||
callback: function() {
|
|
||||||
return called = true;
|
|
||||||
}
|
|
||||||
}).init();
|
|
||||||
$('.block').on('block', function() {
|
|
||||||
return $(this).addClass('triggered');
|
|
||||||
});
|
|
||||||
return setTimeout(function() {
|
|
||||||
return done();
|
|
||||||
}, timeout);
|
|
||||||
});
|
|
||||||
it("creates two instances of the WOW.js with different configs", function() {
|
|
||||||
var wow1, wow2;
|
|
||||||
wow1 = new WOW({
|
|
||||||
boxClass: 'block1',
|
|
||||||
animateClass: 'fancy1',
|
|
||||||
offset: 10
|
|
||||||
});
|
|
||||||
wow2 = new WOW({
|
|
||||||
boxClass: 'block2',
|
|
||||||
animateClass: 'fancy2',
|
|
||||||
offset: 20
|
|
||||||
});
|
|
||||||
expect(wow1.config.boxClass).toBe("block1");
|
|
||||||
expect(wow1.config.animateClass).toBe("fancy1");
|
|
||||||
return expect(wow1.config.offset).toBe(10);
|
|
||||||
});
|
|
||||||
it("does not touch elements that don't have the marker class", function(done) {
|
|
||||||
window.scrollTo(0, $('#custom-1').offset().top - winHeight + 15);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect($('#custom-1')).not.toHaveClass('fancy');
|
|
||||||
return done();
|
|
||||||
}, timeout);
|
|
||||||
});
|
|
||||||
it("animates elements that are partially visible on the page based on the 'offset' config", function(done) {
|
|
||||||
return setTimeout(function() {
|
|
||||||
window.scrollTo(0, $('#custom-2').offset().top - winHeight + 5);
|
|
||||||
expect($('#custom-2')).not.toHaveClass('fancy');
|
|
||||||
window.scrollTo(0, $('#custom-2').offset().top - winHeight + 15);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect($('#custom-2')).toHaveClass('fancy');
|
|
||||||
expect($('#custom-2').css('visibility')).toBe('visible');
|
|
||||||
return done();
|
|
||||||
}, timeout);
|
|
||||||
}, timeout);
|
|
||||||
});
|
|
||||||
it('does not animate elements not yet visible on the page', function() {
|
|
||||||
expect($('#custom-3')).not.toHaveClass('fancy');
|
|
||||||
return expect($('#custom-4')).not.toHaveClass('fancy');
|
|
||||||
});
|
|
||||||
it('animates elements after scrolling down and they become visible', function(done) {
|
|
||||||
window.scrollTo(0, $('#custom-3').offset().top - winHeight + 150);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect($('#custom-3')).toHaveClass('fancy');
|
|
||||||
expect($('#custom-3').css('visibility')).toBe('visible');
|
|
||||||
expect($('#custom-3')[0].style.webkitAnimationIterationCount).toBe('2');
|
|
||||||
expect($('#custom-4')).not.toHaveClass('fancy');
|
|
||||||
window.scrollTo(0, $('#custom-4').offset().top - winHeight + 150);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect($('#custom-4')).toHaveClass('fancy');
|
|
||||||
expect($('#custom-4').css('visibility')).toBe('visible');
|
|
||||||
expect($('#custom-4')[0].style.webkitAnimationIterationCount).toBe('infinite');
|
|
||||||
expect($('#custom-4')[0].style.webkitAnimationDuration).toBe('2s');
|
|
||||||
expect($('#custom-4')[0].style.webkitAnimationDelay).toBe('1s');
|
|
||||||
return done();
|
|
||||||
}, timeout);
|
|
||||||
}, timeout);
|
|
||||||
});
|
|
||||||
it("fires the callback", function(done) {
|
|
||||||
called = false;
|
|
||||||
window.scrollTo(0, $('#custom-3').offset().top - winHeight + 150);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect(called).toBe(true);
|
|
||||||
return done();
|
|
||||||
}, timeout);
|
|
||||||
});
|
|
||||||
return it('fires the callback on the visible element', function(done) {
|
|
||||||
window.scrollTo(0, $('#custom-3').offset().top - winHeight + 150);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect($('#custom-3')).toHaveClass('triggered');
|
|
||||||
expect($('#custom-4')).not.toHaveClass('triggered');
|
|
||||||
window.scrollTo(0, $('#custom-4').offset().top - winHeight + 150);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect($('#custom-3')).toHaveClass('triggered');
|
|
||||||
expect($('#custom-4')).toHaveClass('triggered');
|
|
||||||
return done();
|
|
||||||
}, timeout);
|
|
||||||
}, timeout);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
}).call(this);
|
|
15
node_modules/wow.js/src/.eslintrc.json
generated
vendored
15
node_modules/wow.js/src/.eslintrc.json
generated
vendored
|
@ -1,15 +0,0 @@
|
||||||
{
|
|
||||||
"parser": "babel-eslint",
|
|
||||||
"extends": "airbnb-base",
|
|
||||||
"rules": {
|
|
||||||
"arrow-parens": [2, "as-needed"],
|
|
||||||
"curly": [2, "all"],
|
|
||||||
"no-param-reassign": 0,
|
|
||||||
"no-restricted-syntax": [
|
|
||||||
2,
|
|
||||||
"DebuggerStatement",
|
|
||||||
"LabeledStatement",
|
|
||||||
"WithStatement"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
412
node_modules/wow.js/src/WOW.js
generated
vendored
412
node_modules/wow.js/src/WOW.js
generated
vendored
|
@ -1,412 +0,0 @@
|
||||||
function isIn(needle, haystack) {
|
|
||||||
return haystack.indexOf(needle) >= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function extend(custom, defaults) {
|
|
||||||
for (const key in defaults) {
|
|
||||||
if (custom[key] == null) {
|
|
||||||
const value = defaults[key];
|
|
||||||
custom[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return custom;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isMobile(agent) {
|
|
||||||
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(agent);
|
|
||||||
}
|
|
||||||
|
|
||||||
function createEvent(event, bubble = false, cancel = false, detail = null) {
|
|
||||||
let customEvent;
|
|
||||||
if (document.createEvent != null) { // W3C DOM
|
|
||||||
customEvent = document.createEvent('CustomEvent');
|
|
||||||
customEvent.initCustomEvent(event, bubble, cancel, detail);
|
|
||||||
} else if (document.createEventObject != null) { // IE DOM < 9
|
|
||||||
customEvent = document.createEventObject();
|
|
||||||
customEvent.eventType = event;
|
|
||||||
} else {
|
|
||||||
customEvent.eventName = event;
|
|
||||||
}
|
|
||||||
|
|
||||||
return customEvent;
|
|
||||||
}
|
|
||||||
|
|
||||||
function emitEvent(elem, event) {
|
|
||||||
if (elem.dispatchEvent != null) { // W3C DOM
|
|
||||||
elem.dispatchEvent(event);
|
|
||||||
} else if (event in (elem != null)) {
|
|
||||||
elem[event]();
|
|
||||||
} else if (`on${event}` in (elem != null)) {
|
|
||||||
elem[`on${event}`]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function addEvent(elem, event, fn) {
|
|
||||||
if (elem.addEventListener != null) { // W3C DOM
|
|
||||||
elem.addEventListener(event, fn, false);
|
|
||||||
} else if (elem.attachEvent != null) { // IE DOM
|
|
||||||
elem.attachEvent(`on${event}`, fn);
|
|
||||||
} else { // fallback
|
|
||||||
elem[event] = fn;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeEvent(elem, event, fn) {
|
|
||||||
if (elem.removeEventListener != null) { // W3C DOM
|
|
||||||
elem.removeEventListener(event, fn, false);
|
|
||||||
} else if (elem.detachEvent != null) { // IE DOM
|
|
||||||
elem.detachEvent(`on${event}`, fn);
|
|
||||||
} else { // fallback
|
|
||||||
delete elem[event];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getInnerHeight() {
|
|
||||||
if ('innerHeight' in window) {
|
|
||||||
return window.innerHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
return document.documentElement.clientHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Minimalistic WeakMap shim, just in case.
|
|
||||||
const WeakMap = window.WeakMap || window.MozWeakMap ||
|
|
||||||
class WeakMap {
|
|
||||||
constructor() {
|
|
||||||
this.keys = [];
|
|
||||||
this.values = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
get(key) {
|
|
||||||
for (let i = 0; i < this.keys.length; i++) {
|
|
||||||
const item = this.keys[i];
|
|
||||||
if (item === key) {
|
|
||||||
return this.values[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
set(key, value) {
|
|
||||||
for (let i = 0; i < this.keys.length; i++) {
|
|
||||||
const item = this.keys[i];
|
|
||||||
if (item === key) {
|
|
||||||
this.values[i] = value;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.keys.push(key);
|
|
||||||
this.values.push(value);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Dummy MutationObserver, to avoid raising exceptions.
|
|
||||||
const MutationObserver =
|
|
||||||
window.MutationObserver || window.WebkitMutationObserver ||
|
|
||||||
window.MozMutationObserver ||
|
|
||||||
class MutationObserver {
|
|
||||||
constructor() {
|
|
||||||
if (typeof console !== 'undefined' && console !== null) {
|
|
||||||
console.warn('MutationObserver is not supported by your browser.');
|
|
||||||
console.warn(
|
|
||||||
'WOW.js cannot detect dom mutations, please call .sync() after loading new content.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static notSupported = true;
|
|
||||||
|
|
||||||
observe() {}
|
|
||||||
};
|
|
||||||
|
|
||||||
// getComputedStyle shim, from http://stackoverflow.com/a/21797294
|
|
||||||
const getComputedStyle = window.getComputedStyle ||
|
|
||||||
function getComputedStyle(el) {
|
|
||||||
const getComputedStyleRX = /(\-([a-z]){1})/g;
|
|
||||||
return {
|
|
||||||
getPropertyValue(prop) {
|
|
||||||
if (prop === 'float') { prop = 'styleFloat'; }
|
|
||||||
if (getComputedStyleRX.test(prop)) {
|
|
||||||
prop.replace(getComputedStyleRX, (_, _char) => _char.toUpperCase());
|
|
||||||
}
|
|
||||||
const { currentStyle } = el;
|
|
||||||
return (currentStyle != null ? currentStyle[prop] : void 0) || null;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export default class WOW {
|
|
||||||
defaults = {
|
|
||||||
boxClass: 'wow',
|
|
||||||
animateClass: 'animated',
|
|
||||||
offset: 0,
|
|
||||||
mobile: true,
|
|
||||||
live: true,
|
|
||||||
callback: null,
|
|
||||||
scrollContainer: null,
|
|
||||||
};
|
|
||||||
|
|
||||||
constructor(options = {}) {
|
|
||||||
this.start = this.start.bind(this);
|
|
||||||
this.resetAnimation = this.resetAnimation.bind(this);
|
|
||||||
this.scrollHandler = this.scrollHandler.bind(this);
|
|
||||||
this.scrollCallback = this.scrollCallback.bind(this);
|
|
||||||
this.scrolled = true;
|
|
||||||
this.config = extend(options, this.defaults);
|
|
||||||
if (options.scrollContainer != null) {
|
|
||||||
this.config.scrollContainer = document.querySelector(options.scrollContainer);
|
|
||||||
}
|
|
||||||
// Map of elements to animation names:
|
|
||||||
this.animationNameCache = new WeakMap();
|
|
||||||
this.wowEvent = createEvent(this.config.boxClass);
|
|
||||||
}
|
|
||||||
|
|
||||||
init() {
|
|
||||||
this.element = window.document.documentElement;
|
|
||||||
if (isIn(document.readyState, ['interactive', 'complete'])) {
|
|
||||||
this.start();
|
|
||||||
} else {
|
|
||||||
addEvent(document, 'DOMContentLoaded', this.start);
|
|
||||||
}
|
|
||||||
this.finished = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
start() {
|
|
||||||
this.stopped = false;
|
|
||||||
this.boxes = [].slice.call(this.element.querySelectorAll(`.${this.config.boxClass}`));
|
|
||||||
this.all = this.boxes.slice(0);
|
|
||||||
if (this.boxes.length) {
|
|
||||||
if (this.disabled()) {
|
|
||||||
this.resetStyle();
|
|
||||||
} else {
|
|
||||||
for (let i = 0; i < this.boxes.length; i++) {
|
|
||||||
const box = this.boxes[i];
|
|
||||||
this.applyStyle(box, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!this.disabled()) {
|
|
||||||
addEvent(this.config.scrollContainer || window, 'scroll', this.scrollHandler);
|
|
||||||
addEvent(window, 'resize', this.scrollHandler);
|
|
||||||
this.interval = setInterval(this.scrollCallback, 50);
|
|
||||||
}
|
|
||||||
if (this.config.live) {
|
|
||||||
const mut = new MutationObserver(records => {
|
|
||||||
for (let j = 0; j < records.length; j++) {
|
|
||||||
const record = records[j];
|
|
||||||
for (let k = 0; k < record.addedNodes.length; k++) {
|
|
||||||
const node = record.addedNodes[k];
|
|
||||||
this.doSync(node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
});
|
|
||||||
mut.observe(document.body, {
|
|
||||||
childList: true,
|
|
||||||
subtree: true,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// unbind the scroll event
|
|
||||||
stop() {
|
|
||||||
this.stopped = true;
|
|
||||||
removeEvent(this.config.scrollContainer || window, 'scroll', this.scrollHandler);
|
|
||||||
removeEvent(window, 'resize', this.scrollHandler);
|
|
||||||
if (this.interval != null) {
|
|
||||||
clearInterval(this.interval);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sync() {
|
|
||||||
if (MutationObserver.notSupported) {
|
|
||||||
this.doSync(this.element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
doSync(element) {
|
|
||||||
if (typeof element === 'undefined' || element === null) { ({ element } = this); }
|
|
||||||
if (element.nodeType !== 1) { return; }
|
|
||||||
element = element.parentNode || element;
|
|
||||||
const iterable = element.querySelectorAll(`.${this.config.boxClass}`);
|
|
||||||
for (let i = 0; i < iterable.length; i++) {
|
|
||||||
const box = iterable[i];
|
|
||||||
if (!isIn(box, this.all)) {
|
|
||||||
this.boxes.push(box);
|
|
||||||
this.all.push(box);
|
|
||||||
if (this.stopped || this.disabled()) {
|
|
||||||
this.resetStyle();
|
|
||||||
} else {
|
|
||||||
this.applyStyle(box, true);
|
|
||||||
}
|
|
||||||
this.scrolled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// show box element
|
|
||||||
show(box) {
|
|
||||||
this.applyStyle(box);
|
|
||||||
box.className = `${box.className} ${this.config.animateClass}`;
|
|
||||||
if (this.config.callback != null) { this.config.callback(box); }
|
|
||||||
emitEvent(box, this.wowEvent);
|
|
||||||
|
|
||||||
addEvent(box, 'animationend', this.resetAnimation);
|
|
||||||
addEvent(box, 'oanimationend', this.resetAnimation);
|
|
||||||
addEvent(box, 'webkitAnimationEnd', this.resetAnimation);
|
|
||||||
addEvent(box, 'MSAnimationEnd', this.resetAnimation);
|
|
||||||
|
|
||||||
return box;
|
|
||||||
}
|
|
||||||
|
|
||||||
applyStyle(box, hidden) {
|
|
||||||
const duration = box.getAttribute('data-wow-duration');
|
|
||||||
const delay = box.getAttribute('data-wow-delay');
|
|
||||||
const iteration = box.getAttribute('data-wow-iteration');
|
|
||||||
|
|
||||||
return this.animate(() => this.customStyle(box, hidden, duration, delay, iteration));
|
|
||||||
}
|
|
||||||
|
|
||||||
animate = (function animateFactory() {
|
|
||||||
if ('requestAnimationFrame' in window) {
|
|
||||||
return callback => window.requestAnimationFrame(callback);
|
|
||||||
}
|
|
||||||
return callback => callback();
|
|
||||||
}());
|
|
||||||
|
|
||||||
resetStyle() {
|
|
||||||
for (let i = 0; i < this.boxes.length; i++) {
|
|
||||||
const box = this.boxes[i];
|
|
||||||
box.style.visibility = 'visible';
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
resetAnimation(event) {
|
|
||||||
if (event.type.toLowerCase().indexOf('animationend') >= 0) {
|
|
||||||
const target = event.target || event.srcElement;
|
|
||||||
target.className = target.className.replace(this.config.animateClass, '').trim();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
customStyle(box, hidden, duration, delay, iteration) {
|
|
||||||
if (hidden) { this.cacheAnimationName(box); }
|
|
||||||
box.style.visibility = hidden ? 'hidden' : 'visible';
|
|
||||||
|
|
||||||
if (duration) { this.vendorSet(box.style, { animationDuration: duration }); }
|
|
||||||
if (delay) { this.vendorSet(box.style, { animationDelay: delay }); }
|
|
||||||
if (iteration) { this.vendorSet(box.style, { animationIterationCount: iteration }); }
|
|
||||||
this.vendorSet(box.style, { animationName: hidden ? 'none' : this.cachedAnimationName(box) });
|
|
||||||
|
|
||||||
return box;
|
|
||||||
}
|
|
||||||
|
|
||||||
vendors = ['moz', 'webkit'];
|
|
||||||
vendorSet(elem, properties) {
|
|
||||||
for (const name in properties) {
|
|
||||||
if (properties.hasOwnProperty(name)) {
|
|
||||||
const value = properties[name];
|
|
||||||
elem[`${name}`] = value;
|
|
||||||
for (let i = 0; i < this.vendors.length; i++) {
|
|
||||||
const vendor = this.vendors[i];
|
|
||||||
elem[`${vendor}${name.charAt(0).toUpperCase()}${name.substr(1)}`] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
vendorCSS(elem, property) {
|
|
||||||
const style = getComputedStyle(elem);
|
|
||||||
let result = style.getPropertyCSSValue(property);
|
|
||||||
for (let i = 0; i < this.vendors.length; i++) {
|
|
||||||
const vendor = this.vendors[i];
|
|
||||||
result = result || style.getPropertyCSSValue(`-${vendor}-${property}`);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
animationName(box) {
|
|
||||||
let aName;
|
|
||||||
try {
|
|
||||||
aName = this.vendorCSS(box, 'animation-name').cssText;
|
|
||||||
} catch (error) { // Opera, fall back to plain property value
|
|
||||||
aName = getComputedStyle(box).getPropertyValue('animation-name');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aName === 'none') {
|
|
||||||
return ''; // SVG/Firefox, unable to get animation name?
|
|
||||||
}
|
|
||||||
|
|
||||||
return aName;
|
|
||||||
}
|
|
||||||
|
|
||||||
cacheAnimationName(box) {
|
|
||||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=921834
|
|
||||||
// box.dataset is not supported for SVG elements in Firefox
|
|
||||||
return this.animationNameCache.set(box, this.animationName(box));
|
|
||||||
}
|
|
||||||
cachedAnimationName(box) {
|
|
||||||
return this.animationNameCache.get(box);
|
|
||||||
}
|
|
||||||
|
|
||||||
// fast window.scroll callback
|
|
||||||
scrollHandler() {
|
|
||||||
this.scrolled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
scrollCallback() {
|
|
||||||
if (this.scrolled) {
|
|
||||||
this.scrolled = false;
|
|
||||||
const results = [];
|
|
||||||
for (let i = 0; i < this.boxes.length; i++) {
|
|
||||||
const box = this.boxes[i];
|
|
||||||
if (box) {
|
|
||||||
if (this.isVisible(box)) {
|
|
||||||
this.show(box);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
results.push(box);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.boxes = results;
|
|
||||||
if (!this.boxes.length && !this.config.live) {
|
|
||||||
this.stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Calculate element offset top
|
|
||||||
offsetTop(element) {
|
|
||||||
// SVG elements don't have an offsetTop in Firefox.
|
|
||||||
// This will use their nearest parent that has an offsetTop.
|
|
||||||
// Also, using ('offsetTop' of element) causes an exception in Firefox.
|
|
||||||
while (element.offsetTop === undefined) {
|
|
||||||
element = element.parentNode;
|
|
||||||
}
|
|
||||||
let top = element.offsetTop;
|
|
||||||
while (element.offsetParent) {
|
|
||||||
element = element.offsetParent;
|
|
||||||
top += element.offsetTop;
|
|
||||||
}
|
|
||||||
return top;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if box is visible
|
|
||||||
isVisible(box) {
|
|
||||||
const offset = box.getAttribute('data-wow-offset') || this.config.offset;
|
|
||||||
const viewTop = (
|
|
||||||
this.config.scrollContainer && this.config.scrollContainer.scrollTop
|
|
||||||
) || window.pageYOffset;
|
|
||||||
const viewBottom =
|
|
||||||
viewTop + Math.min(this.element.clientHeight, getInnerHeight()) - offset;
|
|
||||||
const top = this.offsetTop(box);
|
|
||||||
const bottom = top + box.clientHeight;
|
|
||||||
|
|
||||||
return top <= viewBottom && bottom >= viewTop;
|
|
||||||
}
|
|
||||||
|
|
||||||
disabled() {
|
|
||||||
return !this.config.mobile && isMobile(navigator.userAgent);
|
|
||||||
}
|
|
||||||
}
|
|
54
package-lock.json
generated
54
package-lock.json
generated
|
@ -5,7 +5,7 @@
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@silvermine/videojs-chromecast": "^1.3.4",
|
"@silvermine/videojs-chromecast": "^1.4.1",
|
||||||
"animate.css": "^4.1.1",
|
"animate.css": "^4.1.1",
|
||||||
"bootstrap": "^5.3.0",
|
"bootstrap": "^5.3.0",
|
||||||
"chart.js": "^4.3.0",
|
"chart.js": "^4.3.0",
|
||||||
|
@ -38,8 +38,7 @@
|
||||||
"videojs-font": "^4.1.0",
|
"videojs-font": "^4.1.0",
|
||||||
"videojs-ima": "^2.1.0",
|
"videojs-ima": "^2.1.0",
|
||||||
"videojs-landscape-fullscreen": "^11.1111.0",
|
"videojs-landscape-fullscreen": "^11.1111.0",
|
||||||
"videojs-seek-buttons": "^4.0.3",
|
"videojs-seek-buttons": "^4.0.3"
|
||||||
"wow.js": "^1.2.2"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/runtime": {
|
"node_modules/@babel/runtime": {
|
||||||
|
@ -190,14 +189,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@silvermine/videojs-chromecast": {
|
"node_modules/@silvermine/videojs-chromecast": {
|
||||||
"version": "1.3.4",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/@silvermine/videojs-chromecast/-/videojs-chromecast-1.3.4.tgz",
|
"resolved": "https://registry.npmjs.org/@silvermine/videojs-chromecast/-/videojs-chromecast-1.4.1.tgz",
|
||||||
"integrity": "sha512-4VC/WEXb18Iex2Tf679RRUR+oSJhNq7+SyMGIsawFglET0IebXnwYKtO6x4t+dVd3be/iN1p5Ny6/iUnny4ljA==",
|
"integrity": "sha512-tXeikkWoNC3WIl2WSkIag1CLMbGsgn+26LM4LoB4qx0TQ8mkg7pgpldCTkvXxLVaDluQ/uEm2uxrgrMmjOc6sw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"webcomponents.js": "git+https://git@github.com/webcomponents/webcomponentsjs.git#v0.7.24"
|
"webcomponents.js": "git+https://git@github.com/webcomponents/webcomponentsjs.git#v0.7.24"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"video.js": ">= 6 < 8"
|
"video.js": ">= 6 < 9"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@videojs/http-streaming": {
|
"node_modules/@videojs/http-streaming": {
|
||||||
|
@ -1954,9 +1953,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/videojs-ima/node_modules/@videojs/http-streaming/node_modules/video.js": {
|
"node_modules/videojs-ima/node_modules/@videojs/http-streaming/node_modules/video.js": {
|
||||||
"version": "7.21.3",
|
"version": "7.21.4",
|
||||||
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.3.tgz",
|
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.4.tgz",
|
||||||
"integrity": "sha512-fIboXbSDCT3P8eVzIEC3hnLDKC/y+6QftcHdFGUVGn5a7qmH62Mh0Bt/SrBAgdmKDQM1qdZXfXAxPg5+IaiIXQ==",
|
"integrity": "sha512-R5e57M/5uqxQMQpFpybNbd8GtiRwFJPqkHjrhv0QTJ2tqnesbjETbck5kU5dhFr1FevsJRFhjBG4hAnvRGnXbw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.12.5",
|
"@babel/runtime": "^7.12.5",
|
||||||
"@videojs/http-streaming": "2.16.2",
|
"@videojs/http-streaming": "2.16.2",
|
||||||
|
@ -2028,9 +2027,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/videojs-ima/node_modules/videojs-contrib-ads/node_modules/video.js": {
|
"node_modules/videojs-ima/node_modules/videojs-contrib-ads/node_modules/video.js": {
|
||||||
"version": "7.21.3",
|
"version": "7.21.4",
|
||||||
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.3.tgz",
|
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.4.tgz",
|
||||||
"integrity": "sha512-fIboXbSDCT3P8eVzIEC3hnLDKC/y+6QftcHdFGUVGn5a7qmH62Mh0Bt/SrBAgdmKDQM1qdZXfXAxPg5+IaiIXQ==",
|
"integrity": "sha512-R5e57M/5uqxQMQpFpybNbd8GtiRwFJPqkHjrhv0QTJ2tqnesbjETbck5kU5dhFr1FevsJRFhjBG4hAnvRGnXbw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.12.5",
|
"@babel/runtime": "^7.12.5",
|
||||||
"@videojs/http-streaming": "2.16.2",
|
"@videojs/http-streaming": "2.16.2",
|
||||||
|
@ -2115,12 +2114,6 @@
|
||||||
"webidl-conversions": "^3.0.0"
|
"webidl-conversions": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/wow.js": {
|
|
||||||
"version": "1.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/wow.js/-/wow.js-1.2.2.tgz",
|
|
||||||
"integrity": "sha512-YTW9eiZimHCJDWofsiz2507txaPteUiQD461I/D8533AiRAn3+Y68/1LDuQ3OTgPjagGZLPYKrpoSgjzeQrO6A==",
|
|
||||||
"deprecated": "deprecated in favour of aos (Animate On Scroll)"
|
|
||||||
},
|
|
||||||
"node_modules/wrappy": {
|
"node_modules/wrappy": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||||
|
@ -2301,9 +2294,9 @@
|
||||||
"peer": true
|
"peer": true
|
||||||
},
|
},
|
||||||
"@silvermine/videojs-chromecast": {
|
"@silvermine/videojs-chromecast": {
|
||||||
"version": "1.3.4",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/@silvermine/videojs-chromecast/-/videojs-chromecast-1.3.4.tgz",
|
"resolved": "https://registry.npmjs.org/@silvermine/videojs-chromecast/-/videojs-chromecast-1.4.1.tgz",
|
||||||
"integrity": "sha512-4VC/WEXb18Iex2Tf679RRUR+oSJhNq7+SyMGIsawFglET0IebXnwYKtO6x4t+dVd3be/iN1p5Ny6/iUnny4ljA==",
|
"integrity": "sha512-tXeikkWoNC3WIl2WSkIag1CLMbGsgn+26LM4LoB4qx0TQ8mkg7pgpldCTkvXxLVaDluQ/uEm2uxrgrMmjOc6sw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"webcomponents.js": "git+https://git@github.com/webcomponents/webcomponentsjs.git#v0.7.24"
|
"webcomponents.js": "git+https://git@github.com/webcomponents/webcomponentsjs.git#v0.7.24"
|
||||||
}
|
}
|
||||||
|
@ -3606,9 +3599,9 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"video.js": {
|
"video.js": {
|
||||||
"version": "7.21.3",
|
"version": "7.21.4",
|
||||||
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.3.tgz",
|
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.4.tgz",
|
||||||
"integrity": "sha512-fIboXbSDCT3P8eVzIEC3hnLDKC/y+6QftcHdFGUVGn5a7qmH62Mh0Bt/SrBAgdmKDQM1qdZXfXAxPg5+IaiIXQ==",
|
"integrity": "sha512-R5e57M/5uqxQMQpFpybNbd8GtiRwFJPqkHjrhv0QTJ2tqnesbjETbck5kU5dhFr1FevsJRFhjBG4hAnvRGnXbw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/runtime": "^7.12.5",
|
"@babel/runtime": "^7.12.5",
|
||||||
"@videojs/http-streaming": "2.16.2",
|
"@videojs/http-streaming": "2.16.2",
|
||||||
|
@ -3668,9 +3661,9 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"video.js": {
|
"video.js": {
|
||||||
"version": "7.21.3",
|
"version": "7.21.4",
|
||||||
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.3.tgz",
|
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.4.tgz",
|
||||||
"integrity": "sha512-fIboXbSDCT3P8eVzIEC3hnLDKC/y+6QftcHdFGUVGn5a7qmH62Mh0Bt/SrBAgdmKDQM1qdZXfXAxPg5+IaiIXQ==",
|
"integrity": "sha512-R5e57M/5uqxQMQpFpybNbd8GtiRwFJPqkHjrhv0QTJ2tqnesbjETbck5kU5dhFr1FevsJRFhjBG4hAnvRGnXbw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/runtime": "^7.12.5",
|
"@babel/runtime": "^7.12.5",
|
||||||
"@videojs/http-streaming": "2.16.2",
|
"@videojs/http-streaming": "2.16.2",
|
||||||
|
@ -3748,11 +3741,6 @@
|
||||||
"webidl-conversions": "^3.0.0"
|
"webidl-conversions": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"wow.js": {
|
|
||||||
"version": "1.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/wow.js/-/wow.js-1.2.2.tgz",
|
|
||||||
"integrity": "sha512-YTW9eiZimHCJDWofsiz2507txaPteUiQD461I/D8533AiRAn3+Y68/1LDuQ3OTgPjagGZLPYKrpoSgjzeQrO6A=="
|
|
||||||
},
|
|
||||||
"wrappy": {
|
"wrappy": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@silvermine/videojs-chromecast": "^1.3.4",
|
"@silvermine/videojs-chromecast": "^1.4.1",
|
||||||
"animate.css": "^4.1.1",
|
"animate.css": "^4.1.1",
|
||||||
"bootstrap": "^5.3.0",
|
"bootstrap": "^5.3.0",
|
||||||
"chart.js": "^4.3.0",
|
"chart.js": "^4.3.0",
|
||||||
|
@ -33,7 +33,6 @@
|
||||||
"videojs-font": "^4.1.0",
|
"videojs-font": "^4.1.0",
|
||||||
"videojs-ima": "^2.1.0",
|
"videojs-ima": "^2.1.0",
|
||||||
"videojs-landscape-fullscreen": "^11.1111.0",
|
"videojs-landscape-fullscreen": "^11.1111.0",
|
||||||
"videojs-seek-buttons": "^4.0.3",
|
"videojs-seek-buttons": "^4.0.3"
|
||||||
"wow.js": "^1.2.2"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue