1
0
mirror of https://github.com/videojs/video.js.git synced 2025-01-10 23:30:03 +02:00
Commit Graph

1702 Commits

Author SHA1 Message Date
Tsachi Shlidor
df3c14a0e3 fix(sass): import path has cwd once again (#6326) 2019-12-02 14:14:18 -05:00
Gary Katsevman
ca84448026
fix: turn on strict mode again (#6334)
We had to turn off strict mode (#4551) in Video.js due to a change in vtt.js. That has now been fixed in videojs/vtt.js#40 and released as part of 0.15.2 which will be available via #6333.

Fixes videojs/vtt.js#15
2019-12-02 14:13:36 -05:00
Gary Katsevman
25d15d4b14
fix(extend): super_ should be available for backwards compatibility (#6329)
Fixes #6328
2019-11-22 12:32:18 -05:00
Alex Barstow
b3c2343f98 fix: DRMed content goes black in IE/Edge when video element focused (#6318)
Any programmatic call to focus when playing back DRMed content on IE/Edge causes the video element to turn black. Instead, don't call focus() in those cases.

Fixes #6270.
2019-11-19 14:42:45 -05:00
Marco Del Toro Barragan
a11f3fa574 fix: detect iPadOS as IS_IPAD (#6319)
iPadOS defaults to desktop mode unless Safari is opened in split screen mode. The only way to detect it is to assume that Safari with Touch enabled is iPad. This is good enough until and if a better way to detect it is made available.
2019-11-19 13:40:35 -05:00
Grzegorz Blaszczyk
ccca846da8 feat: resets pastSeekEnd_ variable. (#6249)
* feat: resets pastSeekEnd_ when its value is much higher than seeking increment.

* fixes unit tests
2019-11-15 13:44:34 -05:00
mister-ben
f7b3772e27 fix: ensure components added with an index are added in the correct location (#6297) 2019-11-14 15:22:42 -05:00
Gary Katsevman
680e7d78d7 fix: bring back Android 4.x support (#6289)
Use a WeakMap and Set shams for browsers that don't support it.
2019-11-07 17:21:53 -05:00
Pat O'Neill
29638b7969 fix: ensure the default ID of the first player is 'vjs_video_3' as some people have relied on this (#6216)
When a player is created without an id on the embed code, Video.js automatically assigns it one based on an auto-incrementing number (a.k.a. a GUID). For the longest time, this has happened to result in the default id of the first player being vjs_video_3.

It was never intended for users to rely on this value being consistent, but users do strange and inadvisable things.

PR #6103 had an unintended side effect in that it changed the default id to vjs_video_2, which we worry could affect some users of Video.js.
2019-11-07 17:21:52 -05:00
Brion Vibber
0e37fbf02c feat: option to load text tracks on demand vs preload (#6043)
Reimplementation of https://github.com/videojs/video.js/pull/2192
on current code. Seems to work but has not been carefully tested,
especially on conditions such as slow networks and complex tracks.

For https://github.com/videojs/video.js/issues/5252

A `preloadTextTracks` tech option is added, set to true by default,
to keep current behavior intact. Alternate behavior can be enabled
by setting this to false.

This delays loading of the VTT cue files until they are selected.
For sites like Wikipedia that tend to have large numbers of
crowdsourced subtitles and can show many files together on one
page, this saves a lot of unnecessary network transfer and API
hits.

Does mean there may be dropped cues while switching to a track
that requires on-demand loading.

Example usage:

videojs(element, {
  html5: {
    preloadTextTracks: false
  }
};
2019-11-04 15:13:24 -05:00
mister-ben
260cfcd247 fix: Make suppressing no source error compatible with videojs-errors (#6217) 2019-10-04 13:34:54 -04:00
Marco Del Toro Barragan
c791cd8c4e fix(iOS): pause player on suspend or stalled if extra buffer is available (#6199)
On iOS, when disconnecting the headphones, we may receive a stalled or suspend event. In those case, we may actually still have buffer available for us to play through rather than actually having stalled or suspended. In those cases, we should pause the player to prevent playback issues.
2019-10-04 13:31:41 -04:00
Brandon Casey
4134a9734b test: run tests via rollup (#5601) 2019-08-30 14:56:41 -04:00
Brandon Casey
bd58039c78 perf: Save 3740 bytes gizpped by getting rid of xhr deps (#6164)
Switch to @videojs/xhr and setup babel runtime helpers properly.
2019-08-30 11:13:45 -04:00
Pat O'Neill
064fcafd44 feat: add isDisposed method to components (#6099) 2019-08-29 18:42:15 -04:00
Brandon Casey
5fa4257b91 feat: cap log history at 1000 items (#6192) 2019-08-29 17:32:34 -04:00
Brandon Casey
99b610bd92 perf: only update ui on change, wrap things in requestAnimationFrame (#6155) 2019-08-29 17:02:56 -04:00
mister-ben
f7185bad9e feat: allow a click handler to be specified in clickable component's options (#6140) 2019-08-29 16:46:49 -04:00
Brandon Casey
22782b8425 perf: Another 5ms of startup time improvements (#6145) 2019-08-29 16:44:06 -04:00
Grzegorz Blaszczyk
f324d1f23c Allows middleware to handle muted setter/getter (#6177) 2019-08-29 16:42:42 -04:00
Kevin Lee
8129f03f18 fix: allow player dimension method to accept 'auto' (#6185) 2019-08-29 16:42:22 -04:00
Grzegorz Blaszczyk
714aba0ca8 fix: make live UI button more consistent (#6201)
Use a simple moving average for setting the seekableIncrement value, which is used to determine whether we're at the live edge of nor.
2019-08-28 13:41:32 -04:00
Grzegorz Blaszczyk
3c1dd8ff44 fix: adds space between vjs-live-display and vjs-volume-control controls. (#6200)
Closes #5815
2019-08-27 15:39:52 -04:00
Grzegorz Blaszczyk
62465b841e fix: make 'Esc' works for a vertical volume bar and menus (#6046)
Improve player accessibility by adding 'Esc' functionality to the volume panel and menu popups.

Fixes #6004.
2019-08-21 14:24:35 -04:00
Pat O'Neill
51b9861d5b fix: do not handle hotkeys in contenteditable elements (#6182)
Exclude elements where `el.isContentEditable == true;` for hotkeys.
2019-08-19 14:57:15 -04:00
Brandon Casey
549552ed43 fix: remove deprecated tsml dependency (#6174) 2019-08-19 14:56:16 -04:00
Brandon Casey
5ee247762e perf: Do not add/remove listeners for each timer (#6144) 2019-08-07 16:11:24 -04:00
Brandon Casey
266cb151fa perf: Improve performance of toTitleCase, register with lower and TitleCase (#6148) 2019-08-07 16:05:41 -04:00
Brandon Casey
8610f99673 perf: Use WeakMap for dom data (#6103) 2019-08-01 14:26:59 -04:00
Brandon Casey
6a93c8afac perf: throttle more timers and use native bind (#6142) 2019-07-30 16:01:00 -04:00
Bruno
20cae21ff7 fix(component): use safe computedStyle in currentDimension (#6073)
This will prevent a null exception when a video.js is implemented in a 'display:none' iframe on Firefox (<62).

This is a fix in continuation of the PR #3664 regarding a bug in Firefox https://bugzilla.mozilla.org/show_bug.cgi?id=548397
2019-07-29 18:17:02 -04:00
Grzegorz Blaszczyk
f2aedb72ec fix: Improves isSingleLeftClick() to handle mousemove (#6138)
Fixes #6132
2019-07-29 17:45:40 -04:00
Brandon Casey
3c932c5f8e refactor: use the new any event function (#6080) 2019-07-29 17:21:42 -04:00
Brandon Casey
2e495dd5f5 perf: save ~10ms on player.src call (#6141)
Don't use a case-insensitive regex for getting the extname. Don't try to guess the type if we're provided with one.
2019-07-29 16:40:29 -04:00
Gary Katsevman
3afa7d1ce4
fix(pip): hide PiP button in browsers not support the WICG spec (#6131) 2019-07-26 11:33:25 -04:00
Gary Katsevman
15ff8f7242
revert: "fix(play-toggle): call event.stopPropagation in the click handler (#5803)" (#6128)
PR #5083 introduces a fix to #5624, an issue with click events when
Polymer's tap gesture is being used. However, this causes an issue where
`player.on('click')` no longer triggers from the play toggle. Thus, we
revert the change. In addition, looking at Polymer 2 and 3, they
recommend against using the tap gesture.

Fixes #6092
2019-07-24 15:58:38 -04:00
Gary Katsevman
10ed08a15a
refactor(pip): rely only on WICG spec events (#6064)
The WICG spec calls out only two events, enterpictureinpicture and
leavepictureinpicture. We should try and only use those.
If pictureinpicturechange is still necessary, it can be re-added at a
later date.
2019-06-20 15:11:21 -04:00
mister-ben
5a538c3caf feat: add option to suppress initial error for non-playable sources (#6057)
Video.js checks whether sources are playable and both displays a message to the user and logs an error to the console. In Google's mobile friendly test and related tools, this message and error is triggered because their test browser's video element does not support any video formats. Some Video.js users are concerned about the æsthetics of the rendered preview within the tools and whether this might have an SEO impact.

Adds a suppressNotSupportedError option, defaulting to false. If set to true, if no sources are playable the error is deferred to the first human interaction (click or touchstart) but cleared if a loadstart occurs.
2019-06-20 14:00:12 -04:00
Pat O'Neill
70ba84eb6a fix(liveui): do not seek to live on first seek when autoplaying a live stream (#6062)
Before listening for the play/timeupdate combination when starting the LiveTracker, check if the player has already started playback.
2019-06-20 13:56:00 -04:00
Gary Katsevman
9d941c0087
fix: undeprecate options() (#6056)
Fixes #6048
2019-06-18 18:10:28 -04:00
François Beaufort
116d84af75 feat: add built-in Picture-in-Picture button (#6002)
Adds a new PictureInPictureToggle component in the controls bar of the player. It depends on videojs-font 3.2.0 (videojs/font#41) for icons.

Final spec piece from #5824.
2019-06-18 16:42:02 -04:00
Dave Kiss
204ff4619a feat: add write method to time tooltips (#6021)
This splits up the `update` method into two methods: `update` and `write`. The new write method is only responsible for updating the text content of the tooltips. This is useful if you wan't to be able to override the behavior in some way but still wanted all the behavior in `update` and not take a double dom modification hit.
2019-06-18 16:25:24 -04:00
Grzegorz Blaszczyk
f5fd94f610 fix: handle esc key properly inside of the CloseButton (#6050) 2019-06-18 16:23:26 -04:00
Gary Katsevman
ca7b63324c
fix: always pass event object to click handler (#6059) 2019-06-18 16:22:33 -04:00
Thomas
c61f3d3e49 feat: allow displaying of multiple text tracks at once (#5817)
This allows the user to display multiple tracks when
`allowMultipleShowingTracks` is passed to the `TextTrackDisplay`.
Currently, multiple tracks must be shown programmatically and cannot be
done via the subtitles menus.

In addition, this adds two new classes to cue elements:
`vjs-text-track-cue` and `vjs-text-track-cue-${track.language}`. This
allows easier targetting with CSS.

Example usage:
```js
var player = videojs('example-video', {
  textTrackDisplay: {
    allowMultipleShowingTracks: true
  }
});
```

Fixes #5798.
2019-06-18 15:42:39 -04:00
Mike
2c7644f91e fix(play-toggle): call event.stopPropagation in the click handler (#5803)
The play button stops working when recent versions of Google's Polymer is in use on the page because of the way Polymer synthesizes 'tap' events on non-touch devices. The Polymer tap code thinks the click event was ignored unless the DOM event's stopPropagation method is
called.

In chrome 70 the small play/pause control doesn't work with Polymer 1.x Gestures tap is used on document. Demo of issue: https://codepen.io/mscalora/pen/mQzQmp

Fixes #5624.
2019-06-18 15:37:43 -04:00
Gary Katsevman
3e105719ba
chore: switch to dart-sass (#6055)
This is a rebased and updated PR of #5841.

We wanted to use the sass package as that's what the docs recommend. We also wanted to disable source maps that CDN-linked code won't try to download it.

Fixes #5841, fixes #5826.
2019-06-17 17:31:32 -04:00
Gary Katsevman
2977d52592
refactor: switch to fullscreen.options (#6054) 2019-06-17 16:51:28 -04:00
Austin Morton
631ac3b68d feat(fs): support FullscreenOptions (#5856)
On browsers that implement the Unprefixed Fullscreen API, pass a FullscreenOptions dictionary to requestFullscreen.

Add `fullscreenOptions` option with default value of `{navigationUI: 'hide'}` to player.
See https://fullscreen.spec.whatwg.org/#dictdef-fullscreenoptions
2019-06-17 14:05:22 -04:00
Brandon Casey
2878c1d0d4 feat(events): add any function (#5977)
This new events function allows you to listen to a list of events and know that only one handler will ever be called for the group. With just one event, it'll function similarly to `.one`.
Examples:
Single event
```
const player = videojs('some-player-id');

player.any('a', (e) => console.log(e.type + ' triggered');

player.trigger('a');
// logs 'a triggered'

player.trigger('a');
// logs nothing as the listener has been removed.
```
Multiple Events
```
const player = videojs('some-player-id');

player.any(['a', 'b', 'c', 'd'], (e) => console.log(e.type + ' triggered');

player.trigger('d');
// logs 'd triggered'

player.trigger('a');
player.trigger('b');
player.trigger('c');
player.trigger('d');
// all triggers above log nothing as the listener is removed after the first 'd' trigger.
```
2019-06-17 14:04:25 -04:00
Gary Katsevman
c2bea31830
chore: fixup merge issue with #6001 (#6053) 2019-06-17 13:21:54 -04:00
François Beaufort
83541dceeb feat: add Picture-in-Picture API methods (#6001)
Following #5824, this PR adds support for some Picture-in-Picture methods described in the spec and article. It also makes sure that we can listen to the enterpictureinpicture and leavepictureinpicture events on the player.
2019-06-11 13:21:02 -04:00
Pat O'Neill
79eadac252 fix: make sure hotkeys are not triggered outside the player or in form fields within the player (#5969) 2019-06-10 16:15:24 -04:00
Alex Barstow
5a7fe48b07 fix: group subtitles and captions when switching tracks (#6008)
This fixes a regression created by #5741.
2019-06-10 16:15:23 -04:00
Gary Katsevman
fded30f8f8 fix(fs): feature detect el.matches() for IE11 (#6007) 2019-06-10 16:15:23 -04:00
Grzegorz Blaszczyk
075a5043b9 fix: change 'mousedown' to the 'mouseup' event in the player (#5992)
This player behavior is very useful for accessibility because the user can cancel the action by clicking outside the button area. It is recommended by the WCAG 2.1 "2.5.2 Pointer Cancellation" spec.
2019-05-21 11:51:37 -04:00
Grzegorz Blaszczyk
0f501f9fa1 feat: add 'audio/mp4' mimetype for m4a files (#5982) 2019-05-17 16:17:24 -04:00
Gary Katsevman
4585c08bdb
fix(player): silence rejected fullscreen promise (#5970)
The fullscreen API now returns a promise. If the player is inside an
iframe that doesn't allow fullscreen, the promise will reject and cause
an error to be logged. Instead, we should silence this promise.

Fixes #5918
2019-04-29 15:13:56 -04:00
Thijs Triemstra
629594ece5 fix: use performance.now() when possible (#5870) 2019-04-24 11:29:22 -04:00
Owen Edwards
f4154b9de0 Add role='application' to the video element on Chrome on Windows, to work around a JAWS screen reader bug (#5863) 2019-04-23 13:45:27 -04:00
Owen Edwards
322dae44b5 feat(middleware): allow middleware to handle volume setter and getter (#5906)
Allow middleware to handle volume setter and getter. This supports things like ducking the playback volume programmatically, without affecting the player's UI volume control.
2019-04-23 13:42:52 -04:00
Evan Farina
5973a62f67 fix: call reset if we are paused or no promises, otherwise wait for play promise to resolve (#5876)
Calling video.load while the video is trying to play (that is between play and playing event) throws an error. Instead, just wait for playback to happen before resetting.

Fixes #5875
2019-04-11 15:53:31 -04:00
Brandon Casey
ad53b80b8a fix: correctly resolve play promise when terminated via middleware (#5895) 2019-04-11 14:29:27 -04:00
Thomas
1844482bf5 fix: fix bug preventing control bar from hiding on mobile (#5836) 2019-04-11 13:57:56 -04:00
Richard Bushell
22d0514257 fix: fix fullscreen detection when player is nested within document fullscreen (#5912) 2019-04-11 13:57:19 -04:00
Pat O'Neill
458a5ead44
fix: explicitly remove all document-level listeners on player dispose (#5929) 2019-04-11 13:52:36 -04:00
Pat O'Neill
55b37524a3
fix: hide the progress control and show the subs-caps button when using Live UI at extra small size (#5915) 2019-04-11 13:35:57 -04:00
Pat O'Neill
c85bc00df2
fix: always show the mute button by default in responsive mode (#5914) 2019-04-11 12:37:52 -04:00
mister-ben
b2eae7bdbf docs(ModalDialog): add missing documentation for pauseOnOpen (#5908) 2019-04-03 11:46:58 -04:00
Brandon Casey
511f729b7a perf(live-tracker): disable live tracker on IE11 when document is hidden (#5896)
Disable the live tracker on IE11 when the document is hidden to fix the slow down and eventual crashing of web pages on IE11.

After #5879 was completed, we noticed that live streams still have an issue. This is because the live tracker we have also uses setInterval. Unfortunately, just disabling setInterval in the live tracker was not enough. Instead, we decided the best course of action is to just disable the live tracker altogether.
2019-03-28 18:19:07 -04:00
Brandon Casey
3dc6fbf6e7 fix: fix audio and video track selection (#5890)
Fixes #5887
2019-03-25 12:02:33 -04:00
Brandon Casey
142cc678cb perf: Fix memory leaks in safari, edge, and ie (#5880)
1. We were not always able to clean up `resize` on the `ResizeManager`, as the iframe
contentWindow can disappear before dispose
2. Native Tracks on Safari do not have an `off` so we have to deal with
event listeners manually

Fixes #5878
2019-03-22 12:03:52 -04:00
Gary Katsevman
894dd9eb74
perf(seek-bar): don't update play progress when document is hidden (#5879)
The seek bar updates on a 30ms interval to have a nice, smooth transition as time ticks forward. Unfortunately, IE11 has some performance issues with interval when the document is hidden. This doesn't appear to be an issue when using setTimeout but using a setTimeout was causing the play progress to appear very jerky in comparison.
Instead, we should just not update the play progress when the document is hidden. Besides solving the issue in IE11, it makes sense to do as no one could be seeing the progress bar. In addition, update() is now a no-op if the seek-bar element isn't visible.

Fixes #5575
2019-03-22 10:47:26 -04:00
Brandon Casey
6e173b017f test: check dom-data to verify we aren't leaking memory and event handlers (#5862) 2019-03-19 15:05:48 -04:00
marguinbc
d07f97dc94 fix: do a null check for tech when checking if we can toggle mute (#5857)
If the mute toggle checks whether mute can be set before the tech is ready, it may throw an error and cause issues. Instead, add a null check.
2019-03-18 16:35:09 -04:00
Brandon Casey
c632b24364 perf(player): turn off all track list listeners on dispose (#5867) 2019-03-18 15:54:55 -04:00
Chuck Wilson
92c66ad77e chore(text-track): fix it's/its typo (#5868) 2019-03-18 15:53:11 -04:00
Brandon Casey
f01d6f4e23 perf: fix more memory leaks (#5860) 2019-03-18 15:44:44 -04:00
Brandon Casey
20bf42d8b9 perf: fix an event target memory leak (#5855) 2019-03-18 15:40:55 -04:00
Brandon Casey
6eb9fd3dfb fix(resize-manager): call super.dispose() in dispose method (#5853) 2019-03-18 15:33:51 -04:00
Brandon Casey
a2431ce74c perf: Remove playerEvent and extra timeupdate handler in SeekBar (#5852) 2019-03-18 15:32:08 -04:00
Gary Katsevman
4169ddd9b7
fix: use ownerDocument.body.contains for IE11 (#5872)
Issue #5831 made the not-in-DOM warning work with elements from other
documents. This works in modern browsers but IE11 doesn't include a
contains method on the document. Instead, we should check to see if the
body contains the element.
2019-03-18 15:15:15 -04:00
Evan Farina
e248286fb6 fix: ensure that durationDisplay and remainingTimeDisplay exist before calling their 'updateContent' method during reset() (#5839)
The resetProgressBar_ method was calling 'updateContent' on the durationDisplay and remainingTimeDisplay controls without checking to make sure they exist

Fixes #5838
2019-03-18 14:54:14 -04:00
Richard Bushell
3fbc4f501b fix: update fullscreen detection when player is nested within another fullscreen element (#5830) 2019-03-18 14:48:40 -04:00
Kevin Brogan
237b68b561 fix: warn on element not in DOM even when from another document (#5831) 2019-03-18 14:42:38 -04:00
Gary Katsevman
f8b7dd4ed3
fix: if play is delayed till loadstart, call load (#5822)
In Safari, if we call play early and we are going to be waiting till
loadstart, it's possible this will take too long for the user activition
flag to still be available. In this case, we should call load() on the
player to prime the video element so for when loadstart happens.
2019-03-18 14:33:55 -04:00
Grzegorz Blaszczyk
d5a3234082 fix: change max height of menus based on responsive classes. (#5806)
Fixes #5524
2019-03-18 14:32:25 -04:00
Samuel Burbano Ramos
a72d861a95 fix: add inactivityTimeout to reset cache method (#5788) 2019-02-12 10:10:09 -05:00
Grzegorz Blaszczyk
65beb5a79c docs: fixes the return value type of the loop method. (#5789) 2019-02-11 14:07:34 -05:00
Vladimir
a359b6a462 fix icon pos (#5785) 2019-02-11 14:04:17 -05:00
Liu Ruen-shen
259ce71ee7 fix: remove event handlers when menu item is removed (#5748) 2019-01-25 14:26:36 -05:00
Owen Edwards
e8909231bd feat(player): add option to disable or override double-click handling. (#5611)
`userActions.doubleClick` can be set to false to disable double click to fullscreen. Can be set to a function to override behavior.

Fixes #5604.
2019-01-25 14:18:33 -05:00
Owen Edwards
61053bf674 feat: add hotkeys support ("m", "f", "k", and Space) (#5571)
Extend keyboard support for the SeekBar, and pass unhandled keydown events from components back to the player.
Switch from raw keycodes to the keycode module.

Using `userActions.hotkeys`, which can either be a function to match the hotkeys plugin, or an object with properties like `fullscreenKey`, see the documentation for more info.

This is currently off by default, we will consider turning it on by default in the future, see #5765.

Fixes #4048, fixes #3022.
2019-01-25 14:10:29 -05:00
Evan Farina
d94771f9bd fix(resize-manager): Prevent tabbing into RM and hide from Screen Readers (#5754)
The ResizeManager's iframe element is able to be focused via tabbing, which results in a bad user experience for users that rely on a screen reader to navigate the video and its sibling elements. The fix is to set the tabIndex to "-1", and the aria-hidden property to true for good measure.
2019-01-22 16:36:20 -05:00
Gary Katsevman
1c0fa32b3a
fix(fs): fix double fullscreenchange event (#5756)
This reverts the previous fix (2bc90a1)
and also simplifies handling. Seems like this works a lot better while
also ensuring that the vjs-fullscreen class is still on the player.

Fixes #5685, fixes #5745
2019-01-22 16:34:26 -05:00
chrisboustead
2f0834f43f fix(menu-button): make menu button title a component (#5722)
Fixes #3612, fixes #5759
2019-01-18 14:56:58 -05:00
Pat O'Neill
b27f71347e fix: TextTrackMenuItem components should not disable text tracks of different kind(s). (#5741) 2019-01-10 14:24:15 -05:00
Henrique Lima
175f773253 feat: reset player ui on Player#reset (#5684)
Fixes #4683
2019-01-08 14:15:51 -05:00
dustin71728
dd63cf94d5 fix: remove child from old parent when moving to new parent via addChild (#5702)
A child component may have been assigned to another
parent before assigning that child component to the
new parent via "addChild" method. In this case, the
original parent should remove the child then it can
be safely added back to the new parent. This commit
will keep the parent's "children_" and its DOM
element's child nodes in the consistent state.
2019-01-08 14:14:46 -05:00
Gary Katsevman
f02fb1b801
fix(seekbar): don't disable if live tracker's seekable is infinity (#5721)
This was done to make the behavior on Android with HLS live streams better but the it's opening us up to too many potential issues, like a user not being able to properly disable the control bar, that we should just back it out.
2019-01-08 14:13:50 -05:00
Gary Katsevman
544ed9df34
fix(player): remove vjs-ended class on seeked (#5728)
Whenever we seek after the video has ended, we are no longer ended and
therefore we should remove the vjs-ended class.

Fixes #5654.
2019-01-08 11:28:44 -05:00
Gary Katsevman
2f00a68a51
fix(fs): make sure there's only one fullscreenchange event (#5686)
Before the fullscreen API was un-prefixed, we listened to triggered a
`fullscreenchange` event on the player manually. This worked fine
because a prefixed `fullscreenchange` event was triggered on the player
element itself. But when it was unprefixed, we ended up with two events
now, the unprefixed event and the one we triggered.

Instead, we should listen the event the browser supports and re-trigger
it as the unprefixed event as necessary.

We also make sure that the handler gets calls when the document level
fullscreenchange handler gets called so that it is cancelled properly.

Fixes #5685.
2019-01-07 16:38:47 -05:00
Beatriz Mendes
9a8376e1f4 fix(remaining-time-display): make the '-' be visual and not readable by screen readers (#5671)
Fixes #5168
2019-01-04 18:15:25 -05:00
Pat O'Neill
4c9e09d460 fix: make sure sources, volume, and playback rate are reset along with the player (#5676)
Clear out the player cache_ on reset.

Fixes #5675
2019-01-03 15:14:54 -05:00
Tiago Fragoso
b02181b9fc feat: Add vjs-touch-enabled class for touch supporting devices (#5663)
Fixes #2999
2019-01-03 13:50:48 -05:00
Pat O'Neill
874cc21a4e feat: Add loadMedia and getMedia methods (#5652)
`loadMedia` accepts a MediaObject and an optional ready handler. It'll reset the player -- including text tracks, poster, and source -- before setting the new provided media, which include sources, poster, text tracks.
`getMedia` will return either the provided media object or the currently set values for sources, text tracks, and poster.

Fixes #4342
2019-01-03 13:49:34 -05:00
Luis
0e69ce96c3 fix: css animation shorthand property order (#5687) 2018-12-26 13:04:16 -05:00
JoaoAlves
6ebc7727ef fix: Control-bar autohide when cursor placed over it #5258 (#5692)
Listen to 'mouseenter' and 'mouseleave' events when triggered in the control-bar and temporarily sets inactivity timeout to zero before restoring it.

Closes #5258
2018-12-26 13:03:36 -05:00
Brandon Casey
165c120db0 fix(a11y): make seek-to-live better announce itself to screen reader users (#5651)
To make the seek-to-live component more accessible, we hide the text that says "LIVE" from screen readers and make it be purely for sighted users. Then set the control text to be either "Seek to live, currently playing live" or "Seek to live, currently behind live" to indicate what this control does and be informative around whether we are at edge or not. Then use aria-disabled on control if we are at edge.
2018-12-11 16:40:56 -05:00
Brandon Casey
13b42ad05d test: verify null-checks with player and control bar children set to false (#5670) 2018-12-11 14:23:13 -05:00
Owen Edwards
70a71ae81e fix(a11y): fix hidden Control Text in Progress bar (Fixes #5251) (#5655)
- Update the Control Text in the load-progress-bar during loading, remove unnecessary Control Text from the play-progress-bar, and hide the time-tooltip feature from Assistive Technology using ARIA.
- Add a span around the vjs-control-text-loaded-percentage in load-progress-bar, and use that for the text to update.
- Hide the time-tooltip feature from Assistive Technology using ARIA

Fixes #5251
2018-12-11 11:26:12 -05:00
Alex Barstow
893261186b fix(a11y): current time and duration display accessibility with VoiceOver (#5653)
The desired behavior when navigating any of the TimeDisplay components (current time, duration, remaining time) with the arrow keys with a screen reader is for the singular parent div to receive focus, and the reader should announce the text of each child span in order, ex. "Current Time 0:17" and "Duration 1:10". This is how it works when using JAWS. However, with VoiceOver each individual child span element receives focus and the contents are announced separately.

According to the ARIA spec (see [here](https://www.w3.org/TR/html-aam-1.0/#details-id-124) and [example 8](https://www.w3.org/TR/wai-aria-1.1/#presentation)), there is no implicit role for span elements, so the contents should be exposed but the elements themselves should be invisible to screen readers. In other words, <span> Sample Content </span> should be the same as <span role="presentation"> Sample Content </span>. But this is not the case with VoiceOver. As far as I can tell, the desired behavior is only achieved with VoiceOver if each child span is explicitly made presentational, either by assigning each of them the presentation role, or by assigning the parent div a role that makes its children presentational (although there doesn't seem to be a role whose semantics fit the purpose of that div)

The first ARIA doc link above shows the Mac OS X Accessibility Protocol mapping for span elements is to the group role. I don't know enough about accessibility API mapping to confidently draw conclusions about root cause, but this seems like a possible explanation.

Changes:
* add role="presentation" to each of the two span elements inside TimeDisplay divs
* add aria-hidden="true to the TimeDivider (tangential improvement)
* fix inaccurate description of the TimeDisplay component (tangential improvement)
2018-12-11 11:08:28 -05:00
Brandon Casey
dce4a2c7d4 fix(liveui): make edge detection less strict, add docs for option (#5661)
Use double the seekable increment for live edge detection.
Add liveui option.
2018-12-10 14:13:56 -05:00
Brandon Casey
831961b373 fix(liveui): seek to live should be immediate and other tweaks (#5650)
- Make sure that we seek to live playback on the first timeupdate
- Do not report that we are not live before playback has started (a timeupdate has been seen)
- Prevent negative seekable increments
- We can seek past the seekable value in the video element, so we use that to seek to live, rather than waiting for a seekable end change.
2018-12-06 15:15:18 -05:00
Brandon Casey
2974ad3db7 feat: support seeking during live playback via liveui option (#5511)
When liveui is enabled, allow seeking during the live window, add button that allows you to seek to the live edge and that indicates whether you are at the live edge or not.
2018-12-03 15:31:23 -05:00
Grzegorz Blaszczyk
e5e1e290fd feat: make menu background respect :focus-visible (#5558) 2018-11-30 10:47:25 -05:00
Alex Barstow
8329e64e6f fix: default subtitles not enabled (#5608)
This is a follow-up to this fix in VHS, after which default in-manifest subtitles were still not being correctly enabled. The reason is because Video.js's text track preselection logic was running before the media groups were set up in VHS.

Text track preselection should happen on `loadedmetadata` instead of `loadstart`. According to the HTML spec, text track data is available on `loadedmetadata`, so we should be waiting until then to make preselection decisions.
2018-11-29 14:03:51 -05:00
Gary Katsevman
b5e6bdcf7a
chore(player): fix linting for a comment (#5588) 2018-11-14 13:15:39 -05:00
Brandon Casey
b67fe271ba feat: responsive caption settings (#5534)
When responsive mode is set, make the caption settings dialog be more responsive to the size of the player.
Make whitespace and sizing a bit more consistent across elements.
2018-11-14 12:12:34 -05:00
fketchakeu
ab0e29a431 fix: duration reset and allow duration NaN or 0 for duration display (#5348)
This allows the duration NaN or 0 to update the duration display.
This also resets the duration display when a new media item is loaded with `preload` set to 'none'.

Fixes #5347
2018-11-14 12:09:55 -05:00
Bartlomiej Tyrpien
441f0e17a6 docs(media-error): Correct error type documentation (#5566) 2018-11-09 10:57:03 -05:00
Gary Katsevman
c1cbce386d
fix(tracks): don't select tracks based on user pref if no langauge is set (#5556)
When preselecting a new track based on user preference, make sure that the language is actually set and that the track we're testing is either a captions or a subtitles track.

Fixes #5553
2018-11-06 16:36:15 -05:00
gstrat88
0e5442f98e feat(player): add playerreset event (#5335) 2018-11-05 14:44:54 -05:00
Grzegorz Blaszczyk
7d127c8e01 fix: not inline volume slider showing up after mouse hovering on it (#5503)
Adjust the initial/hidden position of the slider to be off screen.

Fixes #5502, fixes #5505
2018-11-05 13:54:56 -05:00
Grzegorz Blaszczyk
58f638e99d fix: vjs-lock-showing class gets removed from menu when no longer hovering on menu-button. (#5465)
Fixes #1690
2018-11-02 16:51:42 -04:00
Grzegorz Blaszczyk
aed337a9ad fix: add correct cursor pointer for the play toggle (#5463) 2018-11-02 16:51:10 -04:00
Grzegorz Blaszczyk
f1784587f6 feat: add 'replay' option to the PlayToggle component. (#5531)
The `PlayToggle` has one option `replay` which can show or hide replay icon. This can be set by passing `{replay: false}` as the default behavior replay icon is shown after video end playback.

Example of how to hide a replay icon
 ```js
let player = videojs('myplayer', {
  controlBar: {
    playToggle: {
      replay: false
    }
  }
});
```

Fixes #4802
2018-11-02 16:47:52 -04:00
Garrett Singer
0060747d5a fix: Don't remove vjs-waiting until time changes (#5533)
Sometimes the vjs-waiting class is removed prematurely after the player gets into a waiting state. This removes the graphic waiting spinner while the player is still waiting. Instead, we should make sure that the currentTime has updated before removing the spinner.
2018-11-02 16:43:32 -04:00
Brandon Casey
8bf42064f3 fix: blob urls being ignored as valid sources (#5525)
Instead of checking for blob urls in the generic updateSourceCaches method, check for blob urls inside of handleTechSourceset before updating the source cache.

Fixes #5504.
2018-10-25 18:56:56 -04:00
Grzegorz Blaszczyk
b8fe624f9e fix: add support for :focus-visible selector (#5483)
Add support for focus-visible so that mouse-users don't need to see focus outlines but keyboard and Screen Reader users still do. It includes both the standard selector and the selector intended to work with the polyfill: https://github.com/WICG/focus-visible.
The polyfill is *not* included in Video.js and must be included on the page separately.

Fixes #5474.
2018-10-25 15:23:13 -04:00
Brandon Casey
4827110bba fix: Prevent ResizeManager from being clicked on safari, fix playerresize on firefox (#5522)
Move the ResizeManager behind the video element with negative z-index and remove visibility: hidden. This fixes issue where right click event wasn't triggered on the correct element and resize was not happening on firefox.
2018-10-25 11:16:38 -04:00
Chris Ng
f66692ed08 docs(player): make reset() method more clear (#5501) 2018-10-22 11:57:59 -07:00
Michael Nowack
dfcfa45be1 fix(TextTrackSetting): Do not use default button type. (#5512)
The default button type is "submit" which triggers a form submit. Thus
if videojs is embedded in a form element the button triggers a form
submit.

This is the same problem with same solution as discussed in https://github.com/videojs/video.js/issues/2470
2018-10-22 11:56:50 -07:00
Pat O'Neill
6df3ac78d4 feat: Add responsive option, which enables breakpoints support. (#5496)
Follow-up for #5471

This makes the breakpoints option and `breakpoints()` method clearer and introduces the responsive option and `responsive()` method, which will turn on the breakpoints.

The return value of `currentBreakpoint()` was simplified to only ever return a string (empty if none).

Also, added convenience methods: `responsive()`, `getBreakpointClass()`, and `currentBreakpointClass()`.
2018-10-11 17:03:33 -04:00
Pat O'Neill
51bd49f4bc feat: Add breakpoints option to support toggling classes based on player width. (#5471)
This adds a breakpoints option. By default, this option is false meaning this is an opt-in feature.

When passing true, it will use a default set of breakpoints. Or custom breakpoints can be passed if users do not like our breakpoints (or previously-existing style decisions).

- Add breakpoints option.
- Adds some new (currently unused) classes: vjs-layout-medium, vjs-layout-large, vjs-layout-x-large, and vjs-layout-huge.
- Add updateCurrentBreakpoint and currentBreakpoint methods to the player.
- Update css/components/_adaptive.scss
- Add sandbox/responsive.html.example

Closes videojs/video.js#4371
2018-10-10 15:30:20 -04:00
Gary Katsevman
ca09968b7d
feat(fill): make vjs-fill a player mode (#5478)
Like fluid mode, you can enable it with the class or by calling the fill
method. Calling fill() will turn off fluid mode and calling fluid() will
turn off fill mode.

Fluid mode takes precedence over fill mode.
2018-10-05 14:28:09 -04:00
Gary Katsevman
966eb56c02
feat: createLogger for easier logging in individual modules (#5418)
Create a new createLogger module for better debugging. Each logger has its own log level and its own createLogger that will nest logs underneath them. `player.log` is also included, which logs the player id as part of the log statement. The history API also got a filter method.

For example:
```js
var log = videojs.log.createLogger('foo');
log('hello');
// > VIDEOJS: foo: hello
```
2018-09-28 16:52:58 -04:00
Pat O'Neill
ebf8d6671c docs: Update JSDoc comments, so core API docs for the videojs function are accurate. (#5385) 2018-09-28 16:21:18 -04:00
Gary Katsevman
6bff3ce779
fix(vjsstandard): update to 8.0.2 and fixup linting (#5413) 2018-09-28 14:58:15 -04:00
Gary Katsevman
e69842ce2e
fix(text track display): update on playerresize and orientationchange (#5447)
On mobile devices, when changing orientation, or if the player gets resized, the captions won't update to reflect the new orientation or player size. However, they do get updated the next time they are redrawn. Instead, we should redraw the captions whenever `orientationchange` and `playerresize` get triggered.
2018-09-25 14:43:41 -04:00
Gary Katsevman
15df4e16b4
fix(text-tracks): cuechange handler not triggering correctly (#5446)
We were only triggering cuechange events if a metadata track started out as not disabled or only when setting the mode to 'showing'

Fixes #5308
2018-09-25 14:42:58 -04:00
Brandon Casey
235b18853e fix(ResizeManager): fixup the null check (#5427) 2018-09-11 11:26:15 -04:00
Gary Katsevman
b25f024a04
fix: make sure all attributes are updated before applying to tag (#5416)
Fixes #5309
2018-09-07 08:56:11 -07:00
Alexander
6d6bfd1420 fix: use consistent id for tech, no matter how it is loaded (#5415)
Change the constant used in the techId prop to the camelCased version, this will result on consistent id when loadTech_() is executed.

Fixes #5411
2018-09-07 08:55:02 -07:00
Brandon Casey
3744df1680
test: fix travis ci issues with resize-manager tests (#5390) 2018-08-28 16:24:26 -04:00
Gary Katsevman
8e9d92cc98
fix: add debounced.cancel and use it in ResizeManager (#5378)
It's possible that ResizeManager will trigger its debounce handler but
then get disposed before the handler runs. This can cause tests to fail,
so, instead, we should cancel the debounce when ResizeManager is
disposed.
2018-08-13 16:39:50 -04:00
Brandon Casey
58405fdf78 fix: always return a promise from play, if supported (#5227)
If Promise is available or if Promise is polyfilled, then we'll return a new Promise from `play()` that will get fulfilled with the value returned from the `play()` method. This means that on IE11, this promise will get resolved when we call `play()` even if play doesn't succeed. We will have a follow-on PR to polyfill this behavior and resolve or reject the promise for browsers like IE11 that don't return a promise from `play()`.
2018-08-10 16:27:05 -04:00
Brandon Casey
6f072d8e2f fix: call component dispose in resize manager to fix leak (#5369)
Because we add Touch Activity in the parent class and those don't actually get removed in Resize Manager we leak on every dispose. Calling super.dispose() cleans them up because we remove our list of handlers via a call to DomData.removeData

Fixes #5339
2018-08-10 16:21:13 -04:00
Gary Katsevman
9cb1ba5ae9
fix(sourceset): ignore blob urls when updating source cache (#5371)
It's possible for us to get a blob url for sourceset, but when we do, we
shouldn't update the source caches with that information.

blob urls can arise when playback is done via Media Source Extension (MSE) such as m3u8 sources with @videojs/http-streaming (VHS).
2018-08-10 15:13:21 -04:00
Ahmed Romih
4b666f9c42 fix: change time tooltips to be absolutely positioned (#5355)
Fixes #5351
2018-07-31 16:40:38 -04:00
Chocobozzz
5e21ebbd2b fix: subtitles/captions freeze when using uglify (#5346)
Angular CLI, and potentially other projects, may use the "pure_getters" compression option of uglify which will end up removing the getter line we use for side-effects to update the active cues. This update makes sure that the line doesn't get removed.

Fixes #5131
2018-07-26 14:16:03 -04:00
Gary Katsevman
8c92cbfb3e
feat: async change events in TextTrackList with EventTarget#queueTrigger (#5332)
Trigger the change event on the next tick. This means that multiple changes to a track's mode will only result in a single change event on its associated TextTrackList rather than 3 events as it may be currently.

Fixes #5159
2018-07-25 17:33:30 -04:00
Brandon Casey
31a0bac823 feat(plugins): allow plugin deregistration from videojs (#5273)
This exposes `deregisterPlugin` on the videojs alongside `registerPlugin`.
2018-07-24 16:26:07 -04:00
gstrat88
fd4c6e12d6 feat(player): remove text tracks on Player#reset (#5327)
Closes #5140
2018-07-24 16:08:44 -04:00
Mike Reinstein
d773cd4feb docs: remove duplicate @deprecated which throws error when minifying via google closure compiler (#5342) 2018-07-24 15:57:29 -04:00
Gary Katsevman
781a6d87c6
feat(middleware): make setSource be optional (#5295)
setSource is useful if you care to be fiddling with the source or doing some work depending on what source is set. However, sometimes, you don't need a setSource and want the middleware to always be selected.
Now, if setSource is missing, it will implicitly be included in the middleware chain.
2018-07-06 14:16:16 -04:00
Gary Katsevman
361dc76e12
revert: "fix: Allow evented objects, such as components and plugins, to listen to the window object in addition to DOM objects. (#5255)" (#5301)
This reverts commit 7fd29b4f18.

With this change, playing back HLS content via VHS caused an infinite
event loop to be printed out. See issue #5281
2018-07-06 13:51:22 -04:00
Gary Katsevman
d7f27b7112
perf: setTimeout and requestAnimationFrame memory leak (#5294)
Our setTimeout and requestAnimationFrame methods added dispose handlers so that they get cancelled if the component is disposed before they get a chance to run. However, we were only clearing out these dispose handlers if we cleared the timeout or the rAF manually. Instead make sure that we remove the dispose handler when it is no longer needed.

Fixes #5199.
2018-07-05 16:29:03 -04:00
DoomTay
444b271afe feat(fullscreen-toggle): disable fs button if fullcreen is unavailable (#5296)
Fixes #5290.
2018-07-05 16:28:37 -04:00
Yamamori Akihiro
c9d1e8a3d1 fix: autoplay throws 'undefined promise' error on some browsers. (#5283)
If the source is not loaded, `player.play();` returns `undefined` on Firefox and Edge, which causes exception.
With this fix, player will not make exception and the fallback (`player.play()` execution after loading video) will be enabled.
2018-07-03 12:06:24 -04:00
Stefano Fedeli
e683891183 fix(browser): TOUCH_ENABLED detection with Win10 (#5286)
Fixes #3306
2018-07-03 12:03:46 -04:00
Darius Oleskevicius
1b9bd42a1c feat: add double-click handler to toggle fullscreen (#5148)
Fixes #4948.
2018-07-03 12:02:19 -04:00
Darius Oleskevicius
b430461335 feat(browser): include iOS Chrome UA pattern when detecting Google Chrome (#5262)
Make IS_CHROME return true and IS_ANY_SAFARI return false for iOS Chrome.
2018-06-26 14:36:33 -04:00
Brandon Casey
ceed382222 refactor: removed old bug work-around code (#5200)
This removes some old workarounds for Chrome 15 and Safari 5.
2018-06-25 14:05:07 -04:00
Owen Edwards
53c62aca58 feat: Add an Audio Description icon to an audio track name in the track menu if it is "main-desc" kind. (#4599) 2018-06-21 14:34:16 -04:00
Darius Oleskevicius
237041698c feat: show mute toggle button if the tech supports muting volume (#5052)
Currently, VideoJS combines volume control with muted support, and these actions aren't actually the same. Muting/unmuting volume work independently from the volume control. For example, iOS doesn't support controlling volume programmatically but allows muting/unmuting volume.

This change will display the volume control panel and mute toggle button if the tech supports muting volume. The volume slider will continue to be hidden if the platform doesn't allow programmatically control volume. If neither muting nor control volume is supported, volume panel will not be displayed.

Fixes #4478.
2018-06-21 14:33:08 -04:00
Brandon Casey
e8e4fe2745 feat(autoplay): extend autoplay option for greater good (#5209)
This PR extends the `autoplay` to the player with a few options that should hopefully make working with browsers that disable unmuted autoplay by default easier.
The current boolean option will match current behavior and any unknown option will be treated as it does now. The new options are the string values `muted`, `play`, and `any`.

- `muted` will mute the element and call `play()` on `loadstart`,
- `play` will call `play()` on `loadstart()`, this is similar to the `autoplay` attribute
- `any` will call `play()` on `loadstart()` but if it fails it will try muting the video and calling `play()` again.
2018-06-21 14:32:07 -04:00
Phil Richman
e92f177ce2 feat(text-track-display): Extend the constructColor function to handle 6 digit hex codes (#5238)
When providing the TextTrackDisplay component with track settings overrides, currently colour codes with only three digits are supported. This updates it so that 6 digit hex codes are also accepted.
2018-06-21 14:20:12 -04:00
Pat O'Neill
7fd29b4f18 fix: Allow evented objects, such as components and plugins, to listen to the window object in addition to DOM objects. (#5255)
the bug is that objects using the new-ish evented mixin cannot listen to the window object, preventing things like:

```
component.on(window, 'scroll', throttledListener);
```

This fixes that so anything that's a native EventTarget works.
2018-06-20 17:05:33 -04:00
Chuck Wilson
9504a93643 fix: make sure source options are passed through (#5241)
The changes to source caching in #5156 introduced a regression where the source options were no longer available to plugins. This PR makes sure the cached source object retains any source options passed along.
2018-06-11 13:47:36 -04:00
Darius Oleskevicius
002d7011c5 fix: menu sizing when using longer caption labels (#5228)
Currently, if longer captions labels are used the SubsCaps menu gets all messed up in IE11/Edge. This occurs due to the menu size is not adjusted correctly not taking into consideration the CC icon. This, as a result, causes the captions items not to fit in the menu and because they end up too wide and the menu has overflow: auto style, the horizontal scrollbars show up and cause the menu not to render correctly. Therefore, don't position the caption label absolutely.

Fix #4758.
2018-06-11 13:39:47 -04:00
Darius Oleskevicius
59869b9d49 fix(slider): suppress console warnings in Chrome for Android when scrubbing (#5219)
Instead of calling preventDefault() on touchstart in Chrome, set touch-action: none style on progress control to prevent unintended scrolling.

Fixes #4650.
2018-06-05 13:32:38 -04:00
Robel Tezera
a29156ca7b fix: silence play promise in a few more places (#5213)
Silence the play promise in the Big Play Button, click-to-play, and the poster image.
2018-06-04 15:25:51 -04:00
Thijs Triemstra
a3fd06a1a8 docs(component): fix typo (#5226) 2018-06-04 15:24:13 -04:00
Owen Edwards
f3d7ac2524
fix(menus): change ARIA role of menu items for better screen reader support (#5171)
Change most menu items to an ARIA role of "menuitemradio" when only one item can be selected (i.e. in the Captions, Subtitles, Descriptions, Chapters, Audio Tracks, and Rate menus).

Fixes #5136
2018-05-23 12:47:37 -07:00
Owen Edwards
2bc810decb
fix(player): ensure that JAWS+IE announces the BPB and play button (#5173)
Freedom Scientific's recommended workaround for JAWS + IE not announcing the first button after a video element which doesn't have its own native controls (See https://github.com/FreedomScientific/VFO-standards-support/issues/78).

Fixes #4583
2018-05-23 12:43:44 -07:00
Gary Katsevman
954f3d979f
fix(player): video-js embed missing video-js class (#5194)
When having a video-js embed with a class attribute, as part of the
changes to remove old IE support (#5041), we overwrote our addition of
the video-js class when it was missing. Instead, we want to make sure
that we don't override the class names again since they are already set
up correctly.

Fixes videojs/http-streaming#100
2018-05-22 21:44:35 -04:00
Brandon Casey
22fd327076
tests: do not throw on tech/player dispose (#5179) 2018-05-16 12:02:41 -04:00
Brandon Casey
59c6261cb5
fix: check for el before resetSourceSet (#5176) 2018-05-16 11:19:45 -04:00
Owen Edwards
0aa827fac5 fix(time-display): restore hidden label text for screen readers. (#5157)
Restore hidden label text for screen readers that describes what the button control does.

Renames the Duration Time language item to Duration.

Deprecate controlText_ property.

Fix a typo in translations-needed.md.

Add a space in the hidden label for live-display, so that it doesn't run together with the visible "LIVE" indication.

Fixes #5135
2018-05-11 14:34:33 -04:00
Owen Edwards
dc0d2bc187 fix: Remove spaces from element IDs and ARIA attributes in the Captions Settings Dialog (#5153)
Fixes #4688 and #4884; supercedes 855adf3.
2018-05-11 14:31:28 -04:00
Owen Edwards
8a08957835 fix: Remove unnecessary ARIA role on the Control Bar. (#5154)
There doesn't seem to be any point in indicating the Control Bar as a separate object - it's all just part of the video player. Perhaps in the future, if there's content which isn't part of the control bar that needs to be clearly distinguishable from the control bar, then it would make sense, but right now you don't interact with the control bar and it doesn't convey any concept of grouping.

Fixes #5134
2018-05-11 14:31:28 -04:00
Owen Edwards
1c74e4fa0b fix: Reduce the multiple-announcement by screen readers of the new name of a button when its text label changes. (#5158)
Move the aria-live attribute to the control text element within buttons, rather than on the whole button, so it is not affected by the change of the title attribute, only by the change of the control text.

It seems like having aria-live on the button itself means that JAWS and NVDA announce the button both when the button text changes and when the title attribute changes. NVDA speaks the new label more times because it announces the button text as the label and the title as the description, so it says, for example, "pause button pause". JAWS doesn't appear to do this, so it doesn't repeat it as many times.

Partially addresses #5023
2018-05-11 14:31:28 -04:00
Monica Olinescu
ad1bb9db5e fix(seek-bar): ensure aria-valuenow attribute in seek-bar is not NaN (#5164)
Updated the getPercent function to return 0 instead of NaN. This is in accordance with the return value in the function's jsdocs.

Fixes #4960.
2018-05-11 14:09:15 -04:00
axten
d44682849e feat: add 'autoSetup' option (#5123)
this must be set globally with videojs.options.autoSetup = false in the same tick as videojs source is loaded to take effect

fixes #5094
2018-05-11 13:53:46 -04:00
Brandon Casey
c6617b24f7
feat: copy properties from <video-js> to the media el (#5039) 2018-05-09 15:55:29 -04:00
Brandon Casey
6147e5f7aa
fix: sourceset and browser behavior inconsistencies (#5054)
* We now trigger `sourceset` any time a `<source>` element is appended to a mediaEl with no source.
  * `load` should always fire a `sourceset`
  * `sourceset` should always be the absolute url.
2018-05-09 15:51:47 -04:00
Brandon Casey
ba2ae7868b
feat: update the players source cache on sourceset (#5040) 2018-05-08 17:46:46 -04:00
Gary Katsevman
4a34dd78b1
feat(modal): remove old IE box sizing (#5113) 2018-04-20 16:33:31 -04:00
Oshin Karamian
083a86c363 feat: split overrideNative method into separate methods (#5107)
Split overrideNative method into one for Audio and Video. Fixes issues with differing track support in IE11.
2018-04-19 20:11:11 -04:00
axten
b10b9f960c fix: options.id is now applied correctly to the player dom element (#5090)
Fixes #5088
2018-04-19 13:22:15 -04:00
Oshin Karamian
22bbbc948c feat: add tech method to allow override native audio and video (#5074) 2018-04-19 13:16:01 -04:00
Gerard L. Petersen
1069e7f033 refactor: move seekbar event handler bindings into a function (#5097)
Makes it easier to extend the seekbar and change the default event handlers. If you extend the seekbar component you can choose to override setEventHandlers_ or keep it default. If you do override setEventHandlers_ and call super() in the constructor, you get your own event handlers + the functionality provided by Slider.
2018-04-19 12:00:33 -04:00
axten
d0b03a3a0f fix: wait till play event to listen for user activity (#5093)
There is no need to listen for user activity until a play is requested on the player and it just adds an extra timer for a player that hasn't started playing yet. Instead, just wait till the first `play` event.

Closes #5076.
2018-04-19 11:57:32 -04:00
Chuck Wilson
a2851fe4bd feat: Queue playback events when the playback rate is zero and we are seeking (#5024)
SourceHandlers that use MSE have a problem: if they push a segment into a SourceBuffer and then seek close to the end, playback will stall and/or there will be a massive downswitch in quality. The general approach to fixing this that was discussed on slack was by setting the playback rate of the player to zero, buffering all that was required, and then restoring the previous playback rate. In my implementation, I've done this in the source handler (see: videojs/videojs-contrib-hls#1374).

From the video.js perspective, it should ensure that the UI reflects the buffering status and that the player API behaves like you'd expect -- that is to say, that it will fire seeking immediately after a call to currentTime, and it will fire seeked, canplay, canplaythrough, and playing when everything is buffered.
2018-04-17 15:28:35 -04:00
greenkeeper[bot]
66d7545538 fix(package): update videojs-vtt.js to version 0.14.1 🚀 (#5085) 2018-04-11 11:39:05 -04:00
Mayde
064c1be2ba docs: fix some misspellings (#5082) 2018-04-10 10:34:20 -04:00
Mayde
7da77661fc docs: fix more misspellings (#5067) 2018-04-04 15:50:55 -04:00
Brandon Casey
9eb5de7ec7 fix: fire sourceset on initial source append (#5038)
In Chrome/Firefox/Safari appending a <source> element when the media element has no source, causes what we think of as a `sourceset`. These changes make our code actual fire that event.
2018-04-02 16:06:47 -04:00
Brandon Casey
fdcae1b469 fix: let the tech preload auto on its own (#4861)
This was found due to the work done in #4660. Basically we reload the video element twice on every source with preload set to auto. This can potentially cause the same data to be downloaded twice.
2018-04-02 14:30:22 -04:00
Joe Forbes
d1b4768b05 feat: built-in HLS playback support (#5057)
This PR is to add HLS playback support built into video.js for 7.0 via videojs-http-streaming (shorthand VHS). VHS is the next major version of videojs-contrib-hls that removes HLS Flash playback and includes some experimental DASH support (hence the rename). The purpose is to improve the out-of-the-box experience for video.js and allow cross browser HLS compatibility.

The proposed changes are to have the standard video.js browser and module scripts contain VHS and provide an alternate video.js browser script that does not contain VHS.

A video.js/core export is provided for importing without VHS.
2018-03-30 14:01:16 -04:00
Gerard L. Petersen
228484befc fix(time-display): Use formatTime for a consistent default instead of hardcoded string (#5055)
This is especially useful if a custom format time is being used.
2018-03-29 17:14:27 -04:00
Mayde
96987f8d0a docs(tech): fix misspellings (#5059) 2018-03-29 15:28:36 -04:00
Mayde
4d3331e3be docs(text-track): fix misspellings (#5058) 2018-03-29 15:27:36 -04:00
Mayde
378d98ee87 docs(time-ranges): fix misspellings (#5046) 2018-03-26 10:58:07 -04:00
Brandon Casey
1cb67ab9c9
refactor: move sourceset code out of tech (#5037) 2018-03-23 13:51:47 -04:00
Gary Katsevman
bc2da7c67b
refactor: remove IE8 specific changes (#5041)
BREAKING CHANGE: remove IE8, IE9, and IE10 specific JavaScript and CSS code. Remove Android 2.3 workaround.
2018-03-23 13:25:12 -04:00
Gary Katsevman
1b3c827d5e
feat: require enableSourceset option for event (#5031)
While sourceset is experimental, require the option `enableSourceset`.
This can easily be reversed in a minor update.
2018-03-19 13:47:45 -04:00
Mayde
d7f45bab89 docs(time-ranges): fix wrong comment for getRange function (#5026) 2018-03-16 10:58:37 -04:00
Mayde
bd6b31c48b docs(time-ranges): fix misspellings (#5025) 2018-03-16 10:57:07 -04:00
Gary Katsevman
46d8b37385
fix(sourceset): set evt.src to empty string or src attr from load (#5016)
If .load() is called, we don't know what the new source will be because of the asynchronous nature of the resource selection algorithm. However, we can know if the src attribute is set on the video element because that's what will be chosen. So, set the src property on the event object to be the src attribute or be the empty string. This matches how currentSrc works where it is an empty string when no source is set. So, when sourceset is triggered and src is "" in the event object, it means that the source is changing.
In addition, we're going to be releasing sourceset as an experimental feature so we could improve the API and make changes in minor releases.
2018-03-15 15:05:41 -04:00
Mayde
ebbe86812b docs(component): fix misspelllings (#5019) 2018-03-15 10:18:48 -04:00
Mayde
1532df32fb docs(component): fix misspellings (#5017) 2018-03-15 10:18:22 -04:00
Gary Katsevman
8d86afdb75
revert: Revert "fix: force autoplay in Chrome (#4804)" (#5009)
This reverts commit 6fe7a9a.

The PR #4804, which fixes #4720, causes a regression #5005. When testing for the regression, the original issue is no longer reproducible so the fix should be backed out. If someone is still using the old version of chrome and seeing the behavior of #4720, they can continue using the versions of Video.js that contain the fixed made in #4804: 6.5.2, 6.6x, 6.7.x.

Fixes #5005.
2018-03-13 16:01:18 -04:00
Kevin Reynolds
d2f63ad364 feat: Use CSS grid for Caption Settings dialog to begin making it more responsive (#4997)
If CSS Grid is available, the Captions Settings Dialog will use it for the layout to begin making it more responsive.
It will fallback to the current layout method if CSS Grid isn't available.
2018-03-13 15:17:18 -04:00
Mayde
e833d3e3de chore(dom.js): Fix misspellings (#5008) 2018-03-13 12:04:18 -04:00
Viktor S
ba6a71eb01 fix: don't add captions settings menu item when TextTrackSettings is disabled (#5002)
Removes the CaptionsSettingsMenuItem when TextTrackSettings is not included.

Fixes #4996
2018-03-13 12:03:39 -04:00
twosmalltrees
2f96914b8e feat(format time): add setFormatTime for overriding the time format (#4962)
Add setFormatTime for Video.js to allow users to change the time format. Example usage:

```js
videojs.setFormatTime((seconds, guide) => `${seconds}, ${guide}`));
```

Add resetFormatTime to reset the time format to the default.

Fixes #2931
2018-03-07 14:37:10 -05:00
David GG
62ff3f66a5 feat: add mimetype type to source object when possible (#4469) (#4947)
File mimetype is filled when the file extension is known and type is not provided.

Fixes #4469, improves #4851.
2018-03-07 14:34:16 -05:00
Michael Vogel
8706941573 feat: Allow techs to change poster if player option techCanOverridePoster is set (#4921)
The option for the player techCanOverridePoster is introduced in this commit. It allows techs to update the post whenever they like. isPosterFromTech_ is introduced as a private player field in order to track when a poster was set by a tech. This allows us to clear the poster whenever the tech is disposed of by the player.

Additionally, attempting to set the same poster more than once will have no effect / no changes will be made, since the poster is the same. This was done in order to stop triggering multiple posterchange events when calling player.poster(aPoster) with techCanOverridePoster set to true.

When a tech is disposed and a poster was set by it, unset the poster.

Pass a `canOverridePoster` option to techs to know whether techCanOverridePoster was set.

Fixes #4910.
2018-03-07 14:31:50 -05:00
Brandon Casey
df96a74f6b feat: sourceset event (#4660)
Trigger a sourceset event whenever the source is set in the Html5 tech, including initial source. We override the video element's src and setAttribute methods so that we can trigger the sourceset event when people change the src with both the video element and our API methods.
The event object for sourceset will contain the src string that was provided at the time the sourceset was triggered. This is mostly important if a source is being set while a tech is changing.
A Tech has a featuresSourceset option that it can set to for sourceset handling. It can then call the helper triggerSourceset(src) to trigger the sourceset.
2018-03-07 14:28:37 -05:00
ookami125
7facc44893 fix(text-tracks): keep showing captions even if the text track settings were disabled (#4974)
If a user disabled the text track setting component, trying to play emulated captions would crash. Add a null check before applying the text track settings.

Fixes #4964.
2018-03-05 17:11:51 -05:00
Gary Katsevman
9c4ded8899
fix(events): triggering with an object had incorrect target property on event object (#4993)
Currently, trigger an event with an object rather than a string will have the document as a target on the event object rather than the element.
2018-03-05 16:42:06 -05:00
Pat O'Neill
5b5cc50608 fix: Fix an issue where disabling the progress control would throw an error. (#4986) 2018-03-05 14:44:34 -05:00
Pat O'Neill
50831e3381 fix: Add alternate text to the loading spinner. (#4916)
This is a first in a few changes related to #4902. This just adds a text alternative to the loading spinner. In future PRs, we would make it alert to screen readers and potentially have a generic alerting mechanism.
2018-02-22 16:19:35 -05:00
Gary Katsevman
0ace2a5449
fix: regression for getting a player via the tech's id (#4969)
As part of https://github.com/videojs/video.js/pull/4836, this piece of code was removed because it was thought it was not needed as everything else covers it. Turns out it's needed.

f6eaa5e2ae/src/js/video.js (L103-L107)
2018-02-22 14:22:12 -05:00
Ivan Čerjan
de9069fc5d fix(text-track-settings): fix track settings font class name (#4956)
Changed  className: 'vjs-track-settings-font">' to className: 'vjs-track-settings-font'

Fixes #4950, fixes #4879.
2018-02-14 13:41:15 -05:00
Ku Lok Sun
a1cef809b3 fix(progress control): Fix the video continuing to play when the user scrubs outside of seekbar (#4918)
Scrubbing inside the seekbar paused the player properly but scrubbing inside the progress control outside the seekbar, the player never paused. This meant that when you scrubbed, if you kept the mouse down but lingered for a moment, the player would continue playing until the mouse moved again.

This fixes it so that the seekbar mousedown and mouseup handlers are called when the progress control mousedown and mouseup handlers are triggered.
2018-02-12 17:34:44 -05:00
Gary Katsevman
29a8ee1d60
fix: cache middleware instances per player (#4939)
Middleware factories currently get run each time a source is set. Because middleware are assocated with a player, the factories should only run once per player.

This PR fixes it so that we associate a middleware instance with a middleware factory per player.
Each time a player is disposed, we will clear the cache of the middleware instances for that player.

Fixes #4677.
2018-02-12 17:30:27 -05:00
Alex Barstow
6189baac3c fix: Only select TextTrackMenuItem if unselected (#4920)
These changes address an issue where screen readers may repeatedly and redundantly read TextTrackMenuItem's control text on every texttrackchange event in some browsers.

The source of the problem is in the handleTracksChange() method of TextTrackMenuItem and its subclass OffTextTrackMenuItem, in which this.selected(true/false) gets called even if the selected state has not changed since its previous invocation.
2018-02-09 14:54:47 -05:00
Gary Katsevman
7670db63cd
fix(middleware): do a null check in mediator methods (#4913) 2018-01-31 10:46:58 -05:00
Gary Katsevman
9ceb4e4fe0
feat: playerresize event in all cases (#4864)
Use ResizeObserver when available for better and more performant resizing information, otherwise, fall back to a throttled resize event on an iframe that's the size of the player.
Allows a video.js user to disable this by setting resizeManager: false as an option since the component will not be initialized.

Add a debounce util.

This reverts #4800 (e0ed0b5) because we end up getting two playerresize events with the dimension methods now.
2018-01-30 13:26:21 -05:00
Pat O'Neill
6a0057716b feat: Add videojs.getAllPlayers to get an array of players. (#4842) 2018-01-30 11:43:47 -05:00
ldayananda
bf3eb45a37 feat: add mediator middleware type for play() (#4868)
This will allow middleware to interact with calls to play() from the tech. This will require a method of indicating to middleware previously run that a middleware down the chain has terminated or stopped execution.

* Adds middleware mediator method that runs middleware from the player to the tech and a second time back up to the player. This category was created because play is both a setter(changes the playback state) and a getter(gets a native play promise if available). This also has the ability to tell whether a middleware has terminated before reaching the tech.
* Adds a middleware.TERMINATOR sentinel value that is available on the videojs object
* Adds play to the allowedMediators
* Adds paused to the allowedGetters
* Adds a sandbox example of a play mediator middleware
2018-01-30 11:30:42 -05:00
mister-ben
f03ac5e9b5 fix: do not patch canplaytype on android chrome (#4885)
Patching canPlayType on Android shouldn't be necessary on Android Chrome since it reports its ability to player HLS correctly.
2018-01-30 11:20:33 -05:00
Pat O'Neill
a15e616a45 feat: Add getPlayer method to Video.js. (#4836) 2018-01-30 11:19:06 -05:00
mrdtron
e628ccd555 fix: hide volume slider when the slider is not active and mute toggle button is in focus (#4866) 2018-01-24 13:51:44 -05:00
ldayananda
673c231684
docs: add middleware guide (#4877)
* adding guide content

* fix link

* CR comments

* fixing a typo

* fixing example
2018-01-23 15:36:49 -05:00
Thijs Triemstra
83880b0f0b docs: fix some typos (#4880) 2018-01-22 17:07:05 -05:00
Calvin Correli
baf0982515 fix: silence unhandled promise rejection in Safari when seeking (#4860)
Fix #4853.
2018-01-05 15:29:34 -05:00
Rishabh Singh
98212c4af0 fix: progress bar time tooltips bug by adding word-break css reset (#4859)
Fixes #2964.
2018-01-05 14:44:40 -05:00
Joe Forbes
4eb0047ad1 fix: wrap audio change handler rather than bind so a player dispose doesn't affect other players (#4847) 2018-01-03 16:58:23 -05:00
Pat O'Neill
a6f444443c fix: Fix an issue where hookOnce failed for the 'beforesetup' hook. (#4841) 2018-01-03 16:57:17 -05:00
cotne nazarashvili
98fe49feac fix: replace &nbsp; with \u00a0 (#4825)
Fixes #4309
2018-01-03 16:52:05 -05:00
Anton Gorbylev
f47a083d70 feat(css): add a delay before showing loading spinner (#4806) 2017-12-14 17:33:59 -05:00
sivapalan
e0ed0b5cd7 feat: playerresize event on Player dimension API calls (#4800)
Trigger a `playerresize` event when `width()`, `height()`, or `dimensions()` is called.

First part of #4629.
2017-12-14 17:33:29 -05:00
Garrett Singer
ba0f20ec35 feat: add support for debug logging (#4780)
Adds support for `debug` as an available logging method under `videojs.log`
Changes the default log level from `all` to `info`
2017-12-14 17:31:51 -05:00
Michael Fairchild
51ed400d7c fix: use correct logic for menu focus (#4823)
This was resulting in the menu not being focused for all browsers/devices (if the player was in a frame), but it should target only IOS.

Fixes #4821
2017-12-14 13:32:43 -05:00
Gary Katsevman
6fe7a9a3dd
fix: force autoplay in Chrome (#4804)
Chrome has started pausing autoplaying video elements when they are
moved in the DOM. Here we need to make sure that if the video started
autoplaying, after we move the element in the DOM we call play again.

Fixes #4720.
2017-12-14 11:24:48 -05:00
Gary Katsevman
409a13e1f6
fix(html5): loop video el attributes in order (#4805)
Due to historical issues, we loops the settings attributes like muted
and autoplay in reverse order but we want to loop them in order.
2017-12-13 14:49:02 -05:00