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
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
Gary Katsevman
295889b36b
chore: remove unused popup classes (#4792)
In v6, we moved away from popup due to accessibility reasons. It was
only used in the old VolumeMenuButton.

Fixes #4725.
2017-12-11 16:28:24 -05:00
Charlie Ryan
1a588f71cf fix: Seek to 0 if attempt is made to seek to negative value (#4799)
Fixes #4501
2017-12-11 16:25:41 -05:00
Lorenzo Cinque
e582c3c843 fix: Remove listener used to test if passive listeners are supported (#4787)
Once you have successfully tested that passive listeners are supported you should remove the test listeners :)
2017-12-04 17:43:37 -05:00
Chuong
2337c1bf43 fix: cannot drag on progress bar in IE9 (#4783)
fix #4773
2017-12-04 17:43:21 -05:00
Brandon Casey
904989de62 fix: off text tracks should be set based on current state (#4775) 2017-12-04 17:42:23 -05:00
emkayy
0f1b2606a0 fix: null check closest.getAttribute (#4763)
If the HTML element doesn't have a lang attribute, Edge throws an exception when calling closest.getAttribute because tag.closest('[lang]') returns an empty object (which will be coerced to true) instead of null.
2017-12-04 17:41:29 -05:00
Chuong
7a776eeeea fix: being able to toggle playback with middle click (#4756)
Uses the new Dom.isSingleLeftClick method to do the check we were doing previously.
Also, refactor the player.handleTechClick_() method to follow the new style of code.

Fixes #4689
2017-11-17 15:09:45 -05:00
shahlabs
1fcd5ae4b1 fix: trigger timeupdate during seek (#4754)
If the player is paused, when we seek, the time displays don't update. So, we trigger a timeupdate manually to let components know that the time has updated.
2017-11-17 12:01:29 -05:00
Brandon Casey
bbea5cc7cb fix: only print element not in DOM warning on player creation (#4755) 2017-11-16 18:12:37 -05:00
Pat O'Neill
26b0d2cadd fix(Player#play): Wait for loadstart in play() when changing sources instead of just ready. (#4743)
The core goal here is to make sure the following works in light of some middleware process that makes setting the source more async than next tick:

```js
player.src('...');
player.ready(() => player.play());
```

In fact, given this change, we should even be able to do:

```js
player.src('...');
player.play();
```

Unlike #4665, which would have clarified/changed the meaning of "ready", it remains a reflection of the tech's state and we make better use of the ability to queue things on that state and on the middleware `setSource` process.
2017-11-16 16:41:01 -05:00
Chuong
6cbe3edae4 refactor: player.userActive() (#4716) 2017-11-16 11:49:54 -05:00
Chuong
eb909f0b34 refactor: player.usingNativeControls() (#4749) 2017-11-16 11:49:40 -05:00
Chuong
79b4355856 fix: only allow left click dragging on progress bar and volume control (#4613)
Previously, any mouse button interaction with the bars would cause a reaction but that's unexpected for right and middle mouse clicks. This PR makes it so right and middle mouse clicks are ignored for dragging and clicking.
2017-11-16 11:48:59 -05:00
Martin Bachwerk
dc588dd6c5 fix: Avoid empty but shown title attribute with menu items and clickable components (#4746) 2017-11-16 11:27:19 -05:00
Chuong
d447e9fe11 refactor: player.controls() (#4731) 2017-11-16 11:25:49 -05:00
Chuong
c16fedf26d refactor: player.listenForUserActivity_() (#4719) 2017-11-16 11:24:32 -05:00
Gary Katsevman
2da7af1137
perf: null out els on dispose to minimize detached els (#4745)
A we retained a lot of references to DOM elements in various components. Here we clear it up. Also, make sure that we remove unused listeners as they can retain objects as well.
Update evented mixin to null out the eventBusEl_ after the component is disposed.
Add a feature for components, to tell it not to auto-initialize the evented mixin.
Re-enable the tests that were removed in #4640.
2017-11-16 11:19:47 -05:00
Gary Katsevman
d8aadd5bee
feat: allow embeds via <video-js> element (#4640)
Add the ability to initialize Video.js with an element named video-js. This is because sometimes, seeing the native element is undesirable, plus, it's cool to have our own element.
Can be used just like the video embed.
IE9 is supported but only with dynamic sources as the source element can only be used inside of the video element.
2017-11-13 14:20:05 -05:00
Brandon Casey
acf4153963 feat: add a version method to all advanced plugin instances (#4714) 2017-11-07 15:48:24 -05:00
Vinay
acc641a8a2 fix: make the progress bar progress smoothly (#4591)
Update the position of the seek bar in a 30ms interval and then redraw inside of a requestAnimationFrame.
2017-11-07 15:43:50 -05:00
Ilya Piatrenka
6f713ca713 feat: add warning if the element given to Video.js is not in the DOM (#4698)
Addresses #4697.
2017-11-01 14:20:21 -04:00
Chuong
ad1b47bf84 refactor: player.dimension() (#4704) 2017-11-01 13:15:38 -04:00
Joe Forbes
9acbcd8410 fix: player.src() should return empty string if no source is set (#4711)
player.src() returns undefined for a new player but it should return '' like player.currentSrc() does and as the video element itself does.
2017-11-01 11:12:48 -04:00
Brandon Casey
9cf98006d5 fix: don't throttle duration change updates (#4635)
Right now the durationchange event is throttled with the other two events, timeupdate and loadedmetadata. This means that only one of those events will trigger an update if they all occur within 25ms of each other.

This functionality makes sense for timeupdate or loadedmetadata as those should not indicate a time update (even though they often do).

For durationchange however it will always indicate a change in the duration, and we want to always update the display when it happens. Here is a scenario of how we could show duration incorrectly right now:

User is playing a video that has a postroll ad at the end. After the postroll ad their will be a timeupdate, and then a durationchange to signify that we are back in content. Then ended will fire, and no more events will happen.

The player will still show the duration of the ad, as the durationchange was eaten by the timeupdate that happened at nearly the same time.

Also, fix a potential issue where if the page was translated using google translate, the time displays stopped updating.
2017-10-31 15:24:01 -04:00
Bo Link
855adf35a1 fix: aria-labelledby attribute has an extra space (#4708)
The aria-labelledby attribute on the fontPercent, edgeStyle, and
fontFamily select options inlcudes an extra space since there is
no ledgendId variable being set on the createElFont_() method. This
fix adds a check to see if the legendId value is set or not inside
the createElSelect_() method. This should keep the extra space
from appearing on the select tags created by the createElFont_()
method.

Fixes #4688
2017-10-31 15:20:15 -04:00
Brandon Casey
a3c254eeb8 feat: allow progress controls to be disabled (#4649)
Add `enable` and `disable` methods to the progress control. This disabled things like the mouse time display and the progress control continues updating for current time and loading but the user will not be able to interact with the control anymore.
2017-10-31 14:50:31 -04:00
Marc A. Modrow
bebca9ce0b fix: make parseUrl helper always have a protocl (#4673)
Fixes #3100.
2017-10-31 14:48:12 -04:00
Chuong
b40858bc49 refactor: component.ready() (#4693) 2017-10-31 12:04:07 -04:00
Chuong
a1748aa590 refactor: player.techGet_() (#4687) 2017-10-31 12:03:49 -04:00
Chuong
cde83351fb refactor: player.hasStarted() (#4680) 2017-10-31 12:03:33 -04:00
Brandon Casey
5e9655f4a0 feat: set the play progress seek bar to 100% on ended (#4648) 2017-10-31 12:02:53 -04:00
Marc A. Modrow
79639138ba fix: Events#off threw if Object.prototype had extra enumerable properties, don't remove all events if off receives a falsey value (#4669)
If Object.prototype was modified to have extra properties, the `off` method crashed because `data.handlers` would've been removed before getting to the extra property.

Also, this fixes an issue where if a falsey value was passed to off, the events system would remove all the events, i.e. `player.off('')`. Instead, we make sure that only if it is called as `player.off()` will they be removed.
2017-10-30 18:06:41 -04:00
Nicolas Levy
afea980174 fix: Don't enable player controls if they where disabled when ModalDialog closes. (#4690) 2017-10-30 18:00:14 -04:00
Chuong
43ddc72c80 fix(css): update user-select none (#4678) 2017-10-30 17:59:28 -04:00
Chuong
cb638d0ea7 chore: add comment about avoiding helvetica font (#4679)
See issue #376 for more information.
2017-10-30 17:57:11 -04:00
Pat O'Neill
85fe685696 feat: Add videojs.hookOnce method to allow single-run hooks. (#4672) 2017-10-30 17:56:21 -04:00
Pat O'Neill
0287f6e076 fix: Make sure we remove vjs-ended from the play toggle in all appropriate cases. (#4661) 2017-10-13 13:46:51 -04:00
Brandon Casey
b1de506b43 fix: a possible breaking change caused by the use of remainingTimeDisplay (#4655) 2017-10-10 11:35:46 -04:00
Pat O'Neill
4658c7bad6 fix: Fix a typo in current time display component. (#4647) 2017-10-04 10:31:10 -04:00
Pat O'Neill
20f7fe991f fix: Make sure time displays use correctly-formatted time. (#4643) 2017-10-03 12:52:58 -04:00
Brandon Casey
445eb26722 feat: Add remainingTimeDisplay method to Player (#4620) 2017-10-02 16:29:40 -04:00
Alex Barstow
1ac8065ea6 feat: Do not set focus in sub-menus to prevent undesirable scrolling behavior in iOS (#4607) 2017-10-02 15:29:34 -04:00
Brandon Casey
f51d36b053 feat: display currentTime as duration and remainingTime as 0 on ended (#4634) 2017-10-02 11:19:29 -04:00
Brandon Casey
fa6f884409 refactor: Create a base time display class, and use it (#4633) 2017-10-02 10:58:30 -04:00
Brandon Casey
335bcded98 fix: reset to a play/pause button when seeking after ended (#4614) 2017-09-20 13:45:47 -04:00
Matthew Boles
006fb3b705 docs: update to width and height doc comments (#4592) 2017-09-01 13:31:48 -04:00
Gary Katsevman
95c4ae0404 fix: rely on browser or tech to handle autoplay (#4582)
When setting the source, we were calling `play` if `autoplay` was set. We shouldn't do that and instead we should rely on the browser or tech (like Flash) to handle it properly.
2017-08-30 14:29:08 -04:00
Gary Katsevman
fe63992bd1 fix: use typeof for checking preload option (#4574) 2017-08-17 17:48:17 -04:00
Gary Katsevman
d668c4976b fix: make boolean attributes set and check both the associated property and the attribute (#4562)
Make boolean attributes like muted set the property video.muted = {{boolean}} and the attribute video.setAttribute('muted', 'muted') when changing the value.
Also, in html5's createEl, we were setting/updating attributes for various properties but we were only setting the attributes and not also the properties but also autoplay was happening first rather than last which caused autoplay to fail because muted and playsinline weren't necessary set by that time.

Fix #4351.
2017-08-15 17:02:07 -04:00
Rafael Gaspar
a6b8425f6b fix: playback rate default text (#4558)
Previously, the default text only said `1` now it says `1x` which matches the look after changing the playback rate.
2017-08-14 17:59:41 -04:00
Alex Barstow
0c337b3d67 Fix: issue where tracks are disabled and cuepoints are cleared in iOS native player (#4496)
In the HTML5 tech, when we go fullscreen to the native player, listen for change events and restore previous mode state for the metadata text tracks.
2017-08-14 16:36:36 -04:00
Kishan
cd2f5106ca fix: set width and height for vjs-button like the SubsCaps button (#4548)
Add a width and height property of 100% to `.vjs-control .vjs-button` selector.

Fixes #4547.
2017-08-10 15:19:59 -04:00
Gary Katsevman
ee014e2e04 fix: only change focus from BPB if not a mouse click (#4497) 2017-07-26 16:09:31 -04:00
Pat O'Neill
7579fc1800 docs: Fix Player#src API documentation. (#4454) 2017-07-14 14:20:00 -04:00
Gary Katsevman
4f43616160 fix(playback rate menu): cycling rates via click (#4486)
In 6.0, we changed the way that Menu Buttons were being created by
wrapping an actual button with a menu sibling in a container. The
playback rate menu also had a rate value display. In 6.x, this rate
value display ended up coming on top of the button itself and capturing
it's clicks. So, we want to remove pointer-events from the rate-value
display and resize the actual button to be the size of the control.
2017-07-14 14:18:23 -04:00
Gary Katsevman
82c8b80548 fix: auto-removal remote text tracks being removed when not supposed to (#4450)
We added a feature so that remote text tracks can auto-removed when a source changes. However, in 6.x we changed the source behavior to be asynchronous meaning that some text tracks were accidentally being removed when they weren't supposed to be.
For example:
```js
var player = videojs('my-player');
player.src({src: 'video.mp4', type: 'video/mp4'});
 // set second arg to false so that they get auto-removed on source change
player.addRemoteTextTrack({kind: 'captions', src: 'text.vtt', srclang: 'en'}, false);
```
Now when the player loads, this captions track is actually missing because it was removed.

Instead of adding auto-removal tracks immediately to the list, wait until we've selected a source before adding them in.


Fixes #4403 and #4315.
2017-06-28 16:38:29 +10:00
Alex Barstow
f5cc165cad fix: player.duration() should return NaN if duration is not known (#4443)
player.duration() currently returns 0 if the duration is not known, when it should return NaN. The problem is that if NaN is passed to player.duration() as an argument, we set the duration to 0. If player.cache_.duration was set to NaN by other means, player.duration() would still return 0.

Modify the player duration() method so that it will 1.) set the cached duration to NaN if it is passed in as an argument, and 2.) return the proper value when called without an argument.
2017-06-28 16:37:00 +10:00
mister-ben
b4dc4f85b0 fix: Use passive event listeners for touchstart/touchmove (#4440)
If passive event listening is supported, we should use it.

Fixes #4432.
2017-06-28 16:36:06 +10:00
mister-ben
b63666379d fix: Safari picture-in-picture triggers fullscreenchange (#4437)
When picture-in-picture mode is entered on Safari, `webkitbeginfullscreen` is triggered which results in a proxied `fullscreenchange` event and adding the fullscreen class to the player. That causes the tech element to collapse to zero height so that the "this video is playing in picture in picture" placeholder is not visible.
On `webkitbeginfullscreen` check whether the presentation mode is `picture-in-picture` before proxying `fullscreenchange` event.
2017-06-28 16:35:01 +10:00
Pat O'Neill
77ba3d13d9 perf: Various small performance improvements. (#4426)
These are a few performance improvements.

* Use textContent instead of innerHTML for text content.
* Construct TextTrackSettings content with HTML strings where possible because it's a bit faster than manual DOM construction.
* Do minimal DOM updates to time controls. This reduces our timeupdate footprint from ~2-2.5ms to ~1ms!
2017-06-28 16:32:58 +10:00
Jet Fontanilla
7f7ea70cb7 fix: IE10 issue for disableOthers when property access results in "permission denied" (#4395)
Fixes #4378
2017-06-28 16:32:04 +10:00
Pat O'Neill
cc6e82442f docs: Fix links in API docs for several Player events. (#4427) 2017-06-27 09:53:08 +10:00
ldayananda
9329e3ef8e docs: Fixing player.remoteTextTracks jsdoc (#4417)
Fixes the sidebar link on the docs site for remoteTextTracks.
2017-06-19 16:01:01 -04:00
Gary Katsevman
c31836c30c feat: Use Rollup to generate dist files (#4301) 2017-05-25 19:40:35 -04:00
ldayananda
188ead1c81 feat: Persist caption/description choice over source changes in emulated tracks (#4295) 2017-05-25 14:09:00 -04:00
Gary Katsevman
cb6005eca4 fix: only disable user-selection on sliders (#4354) 2017-05-15 12:04:42 -04:00
Alex Barstow
8d80a5846e feat: add 'playsinline' player option (#4348)
Video.js players can accept a number of standard <video> element options (autoplay, muted, loop, etc), but not currently playsinline, which is now part of the [HTML spec](https://html.spec.whatwg.org/multipage/embedded-content.html#attr-video-playsinline). We should add it to the list of <video> attributes that can be provided to the player as options.
2017-05-12 16:39:37 -04:00
Gary Katsevman
35df35143f feat: deprecate firstplay event (#4353) 2017-05-12 16:38:48 -04:00
Martin Bachwerk
3087830ed7 fix: Only update text track mode if changed (#4298) 2017-05-12 16:35:39 -04:00
Garrett
483e5a2ca5 feat: Add getVideoPlaybackQuality API (#4338)
Provides a tech getter for getVideoPlaybackQuality as specified by the W3C's Media Playback Quality API: https://wicg.github.io/media-playback-quality/.
2017-05-12 15:22:02 -04:00
Gary Katsevman
3dcfa9568a fix: TextTrackButton on Safari and iOS (#4350)
On Safari and iOS, we use native text tracks, so, during text track
button creation, textTracks() is populated. However, `this.kinds_` isn't
necessarily set and ends up throwing.

Instead, we want to move the fallback for `this.kinds_` from the
constructor and right above the usage of `this.kinds_`.
2017-05-12 14:51:12 -04:00
mister-ben
03bab83dde fix: prevent dupe events on enabled ClickableComponents (#4316)
Prevent ClickableComponents re-adding event listeners each time enabled() is called.

* Keeps track of enabled state (this.enabled_)
* enable() doesn't do anything if the component is enabled, so the event handlers are not re-added

Fixes #4312
2017-05-11 17:32:20 -04:00
mister-ben
ae423df4f5 feat: Add a version class to the player (#4320)
Adds `vjs-v6` class so you can target that version of Video.js.
2017-05-11 17:15:12 -04:00
Pat O'Neill
0a19cf0d6a feat: Add 'beforepluginsetup' event and named plugin setup events (e.g. 'pluginsetup:foo') (#4255)
This adds a beforepluginsetup event as well as beforepluginsetup:$name and pluginsetup:$name events.

The drive behind this is improving the ability for people to make cross-plugin dependencies in a more robust manner.
2017-05-11 17:13:22 -04:00
Stéphane Roucheray
da1d8613d7 chore: typo soruce -> source (#4307) 2017-05-11 17:00:59 -04:00
mister-ben
da0f1ee681 feat: remove playbackRate blacklist for recent Android Chrome (#4321)
Android Chrome now supports playbackRate properly, so removes the blacklist added in #3246 for newer Chrome versions.
Adds `browser.CHROME_VERSION` as a necessary evil.
No longer blacklists for Chrome 58+ -- this could possibly be fixed since 52, but 58 is all I've been able to test on and most users should keep Chrome up to date.
2017-05-11 16:59:22 -04:00
Brandon Casey
561d5ddf76 fix a comment typo (#4293) 2017-04-19 23:56:07 -04:00
Matthew Neil
1ea00419c9 fix: set IE_VERSION correctly for IE11 (#4281)
videojs.browser.IE_VERSION is null in IE11 because IE11 uses a different user agent string than other IE versions

Fixes #4278
2017-04-13 11:28:03 -04:00
Gary Katsevman
92e5d9fb5a fix: techOrder names can be camelCased. (#4277)
In the new middleware work, the way that new sources were loaded was refactored. We also recently made techs and components work either TitleCased or camelcased. There was one comparison that didn't do the proper check and cause the tech to be reloaded, even if the two techs were the same.
2017-04-12 17:17:33 -04:00
Gary Katsevman
e98c65d7a6 fix: remove focus ring from player itself (#4237) 2017-03-30 13:46:52 -04:00
Gary Katsevman
0908d914ac fix: silence play promise error (#4247) 2017-03-30 13:46:31 -04:00
Gary Katsevman
9274457e4c feat: Make text tracks settings more responsive (#4236) 2017-03-30 11:09:00 -04:00
Kevin Litchfield
16c1e0adc0 fix: keep minimum volume after unmuting above 0.1 (#4227)
If, when unmuting, the last volume is below 0.1, force it to be 0.1.

Fixes #4054.
2017-03-24 15:14:41 -04:00
greenkeeper[bot]
7d12c9ea85 chore(package): update videojs-vtt.js to version 0.12.3 (#4221) 2017-03-24 14:38:06 -04:00
Brandon Casey
f2b5a057fe fix: removeCue should work with native passed in cue (#4208) 2017-03-23 14:31:41 -04:00
Brandon Casey
dbfba28a10 fix: not showing default text tracks over video (#4216)
This allows default tracks or tracks with a `mode`of `showing` to be seen
when they are added (as we would expect). Rather than only being seen
after the first `modechange` event (aka a selection from the menu). This is done by watching for `loadstart` on Player.
2017-03-23 14:03:15 -04:00
Brandon Casey
61e20786a9 docs: fix links in generated docs (#4200) 2017-03-21 17:13:06 -04:00
Gary Katsevman
0fd7aad850 fix: make sure audio track hides with one item (#4202) 2017-03-15 11:27:52 -04:00
Alex Barstow
d79b8a7013 feat: time tooltips will not be added to a player on mobile devices (#4185)
Currently, the behavior of time tooltips is inconsistent across iOS and Android devices so we want to hide the tooltips on mobile devices for the time being.
2017-03-13 11:54:29 -04:00
Gary Katsevman
424fa51c28 fix: make load progress buffered regions height 100% (#4190) 2017-03-13 11:53:04 -04:00
Brandon Casey
90030d5e99 feat: Make pause on open optional for ModalDialog via options (#4186)
* The new option is called pauseOnOpen, and defaults to true
* default pauseOnOpen to false in the `ErrorDisplay`
2017-03-13 11:26:33 -04:00
Gary Katsevman
ddde644c78 fix(vttjs): wait till tech el in DOM before loading vttjs (#4177)
The issue is that in Flash, Flash.embed wraps the object element in a div but that object element is what is referenced by this.el(), so, parentNode isn't null but we aren't actually in the DOM. Instead, just check to see whether the tech element is in the DOM or not via node.contains().
2017-03-08 11:27:59 -05:00
Gary Katsevman
cb890a965c fix(ie8): various minor ie8 fixes (#4175)
This fixes a logging in the console regarding timetooltips which don't exist. Also, makes sure not to focus the menu button when the captions settings menu item is clicked since the caption settings is getting focused instead. In addition, it makes sure the legend text in the track settings is the foreground color.
2017-03-07 15:44:08 -05:00
Gary Katsevman
1770f00018 fix(icon-placeholder): align icons on ie8 properly (#4174)
Make sure that the button inside the menu button element isn't a
vjs-control but make sure that the icon-placeholder is sized properly.
2017-03-07 15:43:44 -05:00
Gary Katsevman
67634cf216 fix(tracks): allow forcing native text tracks on or off (#4172)
In addition, the track buttons need to update on the ready event because when the tech loads, it could run with support native captions, so, it needs to know whether to include the captions settings menu.
And all tracks should always be included in player.textTracks() and not just player.remoteTextTracks().
2017-03-07 13:53:57 -05:00
Gary Katsevman
88ee6af431 fix(subs-caps-button): add hide threshold to subs-caps button (#4171)
This is a followup from #4157 but for the subs-caps button.
2017-03-07 13:52:51 -05:00
Justin Anastos
c611f9f358 fix(MenuButton): Unify behavior of showing/hiding (#4157)
Implement a `hideThreshold` property that defaults to 1 so
descendants can override it if necessary. Right now the only
descendant that will override will be `CaptionsButton` because
video.js adds a "captions settings" for emulated text tracks.
2017-03-07 11:28:00 -05:00
Gary Katsevman
2ee133f6f8 fix(subs-caps-button): captions items should hide icon from SR (#4158)
Move the CC icon in the SubsCapsMenuItem into an icon-placeholder span. Also, include that information for the screen reader.
In addition, only apply default sizing to icon-placeholder if they're direct descendants of a vjs-control.
2017-03-07 11:26:09 -05:00
Owen Edwards
d9ec7bc1ba fix(audio-tracks-button): add wrapper CSS builder to audio tracks menu button (#4163) 2017-03-06 12:17:49 -05:00
Gary Katsevman
e5af0a5e21 fix(subs-caps-button): add wrapper CSS builder to subs caps button (#4156) 2017-03-02 17:53:57 -05:00
Gary Katsevman
db901c54d9 fix(text track settings): focus subs-caps button if exists over CC button (#4155) 2017-03-02 17:53:47 -05:00
mister-ben
74eb5d4772 feat: Combine captions and subtitles tracks control (#4028) 2017-03-02 15:23:41 -05:00
Gary Katsevman
61d427c7ee fix: add buildWrapperCSSClass methods to all menu buttons (#4147)
In #4034, we changed the way that menu buttons work slightly by introduction a wrapper element with a separate wrapper css builder. However, this broke, at least the playback-rate menu.
This PR adds a buildWrapperCSSClass to each of our menu buttons.
2017-03-02 15:04:35 -05:00
Gary Katsevman
a9f8fcb2a2 fix(playback rate menu): playback rate menu items should be selectable (#4149) 2017-03-02 14:55:36 -05:00
Brandon Casey
fb88ae2bfc fix(dom): getBoundingClientRect check that el is defined (#4139)
Verify that el is defined so that we don't throw if we get to this function with an undefined el
2017-03-02 14:51:19 -05:00
Brandon Casey
a2b1a33606 fix: cues at startTime 0 do not fire (#4152)
Previously timeupdate would fire before the video was playing, and the tech was not ready. This caused issues when preload was set to auto, because cuechange would fire before the video was even started for cues with a startTime of 0.

Wait for tech to be ready before watching for timeupdate
update unit tests to use TechFaker
Add a unit test to verify that we wait for Tech to be ready.
2017-03-02 14:35:45 -05:00
Pat O'Neill
326398d312 feat: don't throw when re-registering a plugin unless it's a player method (#4140) 2017-03-02 11:17:42 -05:00
Gary Katsevman
0f57341e38 fix(cues): only copy cue props that don't exist (#4145) 2017-03-02 11:16:12 -05:00
Gary Katsevman
3bbf0199e6 fix: early play should wait for player ready, even if source is available (#4134)
Fixes #4057
2017-03-02 11:15:06 -05:00
Gary Katsevman
96a387f723 feat: update videojs-vtt.js and wrap native cues in TextTrack (#4115)
Update videojs-vtt.js and don't auto-export its versions of VTTCue globally.
When our TextTrack object is given a cue, if it's a native cue, wrap it in our emulated vttjs.VTTCue.

Fixes #4093.
2017-02-27 13:52:01 -05:00
Brandon Casey
4388beae91 feat: add a controlText function to MenuButton (#4125) 2017-02-22 14:25:23 -05:00
Gary Katsevman
576ac19214 fix: addChild instance names should be toTitleCased (#4116) 2017-02-22 14:00:15 -05:00
Gary Katsevman
db0112053f feat: allow tokens in localize, localize progress bar time (#4060)
It allows you to use string as an key for the language files but have a default value that's different. In this case, we have a key of progress bar timing: currentTime={1} duration={2} which is used so that we have a descriptive key to what is happening. The default value matches that default value in en.json: {1} of {2}. The reason for the default value is so that the translation uses {1} of {2} for the actual localization without requiring en.json to be included in videojs by default.

Fix #4024.
2017-02-21 16:17:00 -05:00
Gary Katsevman
1f7a842348 fix: trap tab focus in modal when hitting s-tab (#4075)
Pretend that the modal dialog is equivalent to the first
focusable/tabbable element when hitting shift-tab.

Fix #4049
2017-02-21 16:07:22 -05:00
Gary Katsevman
0d0dea4da8 feat: fix accessibility of the captions setting dialog (#4050)
This fixes a lot of the issues from #2746 by making the dialog inherit from our actual ModalDialog which now has tab focus trapping.

The Captions Settings dialog has some accessibility issues:
- Field labels and fields are not explicitly associated
- Keyboard focus does not move into the dialog when it is opened
- Keyboard focus is not trapped inside the dialog while it is open
- Keyboard focus does not return to the control which opened the dialog when it is closed
- The extent (top and bottom) of the dialog is not indicated to screen readers
- The dialog cannot be closed with the Esc key
- The meaning of '---' in the select fields is not clear
- The control to close the dialog is labeled "Done" rather than "Close"
- The purpose of the "Defaults" button may not be obvious, and its effect may not be apparent to screen reader users
- Focus highlighting (outline) on the Default and Done buttons is *very* hard to see
- Pressing the Done button doesn’t seem to have the same effect as pressing the Close (x) button; does it trigger the same focus movement
- This requirement to move it back to the triggering element is tricky, since clicking on that item in the CC menu dismisses the CC menu. I need to think about this a little more - either the menu should open again, or the focus should go to the main CC Menu Button
- The focus outline on the whole dialog goes too far to the left (all the way to the edge of the video window, not just to the edge of the dialog)

Fixes #2746.
2017-02-21 15:58:04 -05:00
Kevin Litchfield
181a19f5fd fix: Muting with MuteToggle sets ARIA value of VolumeBar to 0 (#4099)
Currently, the ARIA value of VolumeBar tracks the value of volume. It should instead track the position of the slider on VolumeBar, which tracks volume except when the player is muted, in which case it's 0.

Fixes #4064.
2017-02-21 15:53:56 -05:00
mister-ben
1cb0a97b0b fix: Do not create element for MediaLoader (#4097)
MediaLoader has a div that's unnecessary. See #4070. Also, make sure that Component#dispose does a null check for the element.
2017-02-21 15:50:52 -05:00
Brandon Casey
127cd7827e fix: copy basic plugin properties onto the wrapper (#4100)
Copy basic plugin properties to prevent breaking older basic plugins.
2017-02-21 15:49:42 -05:00
mister-ben
405b29b8f1 fix: remove redundant Html5#play()
play() is defined twice in Html5. The promise handling in the earlier one was moved into Player#play().
2017-02-21 15:48:45 -05:00
Brandon Casey
e1b48042dd fix: synchronously shim vtt.js when possible (#4083) 2017-02-21 12:03:17 -05:00
Kevin Litchfield
a04f387a72 refactor: MuteToggle#update (#4058) 2017-02-17 12:34:51 -05:00
forbesjo
0da93249d3 fix: make mergeOptions behave the same across browsers (#4088)
* Make an object util function `keys` return an empty array for non objects
* Use that function in object utils instead of `Object.assign`
2017-02-16 16:55:54 -05:00
Brian Wells
caff93fbf0 fix(sass): import path has cwd once again (#4061) 2017-02-15 15:44:00 -05:00
Kevin Litchfield
3c1108c5dc fix: Set MuteButton controlText correctly (#4056) 2017-02-15 15:23:47 -05:00
mister-ben
17143fd9fe fix: Add lang attribute to player el, so that css :lang() is correct (#4046) 2017-02-15 15:22:10 -05:00
Gary Katsevman
0ac126935a fix: localize aria-labels (#4027)
Fixes #2728.
2017-02-08 17:29:32 -05:00
Gary Katsevman
eddc1d71a3 feat: modal dialog accessibility updates (#4025)
If the modal dialog was opened and the focus was preset inside the
player, move the focus to the modal dialog.
When the modal dialog is closed, move the focus back to the previously
active element.
When focus is inside the dialog, trap tab focus. This was inspired by https://github.com/gdkraus/accessible-modal-dialog and ally.js.
2017-02-08 17:29:05 -05:00
Owen Edwards
1b1ba04271 fix: fix the structure of elements in menus to comply with ARIA requirements (#4034)
Fix the structure of elements in menus so that actionable elements are not children of actionable elements, as required by ARIA.
Remove unnecessary aria-labels on menus.
2017-02-08 01:24:30 -05:00
Brandon Casey
6541467ad8 fix: support empty src in Player#src (#4030)
Remove some unnecessary code. Filter the input to remove empty objects and what not.
2017-02-06 15:48:38 -05:00
Pat O'Neill
be27f2aa6e fix: Progress holder gaps cause tooltips misalignment and time tooltip outlines (#4031)
* Address #3645 by using pixel margins
* Fix outlines

Fixes #3645
2017-02-03 16:43:56 -05:00
Gary Katsevman
5748c360af feat: wrap menu item text in a span (#4026)
Fix #4017
2017-02-03 16:35:30 -05:00
mister-ben
e176b56843 feat: Expose Tech#resize event as Player#resize (#3979)
Rename Component's resize event to `componentresize` and trigger the Html5 specced resize event on the player.
2017-02-03 16:32:41 -05:00
Gary Katsevman
516c9f9362 feat: toggle playback with space when focused on seekbar (#4005) 2017-02-03 16:31:03 -05:00
Gary Katsevman
4f79e1e299 fix: focus play toggle from Big Play Btn on play (#4018)
If the control bar and playtoggle exist, focus the playtoggle after
triggering play via the keyboard from the Big Play Button.
If the control bar isn't available, then focus the player element.
If play() returns a promise, wait until it resolves to focus,
otherwise, use a setTimeout.

Fixes #2729
2017-02-03 16:30:49 -05:00
Pat O'Neill
60bcc99302 fix: Disable all time tooltips in IE8, as they are broken (#4029) 2017-02-03 13:26:05 -05:00
Brandon Casey
da2a1e07f4 fix: accessibility bugs with the VolumeBar (#4023)
* Fixes #4021: drop the decimal places on aria-valuenow and aria-valuetext
* Fixes #4022: aria-valuenow and aria-valuetext not set initially
2017-02-02 15:17:15 -05:00
Owen Edwards
04f23c1a62 fix: disable title attribute on menu items (#4019)
Prevents a title attribute from being applied to MenuItems.
MenuItem indicates to ClickableComponent that the control is not just an icon, so it shouldn't have a title attribute.

Fixes #3699
2017-02-02 14:45:39 -05:00
Gary Katsevman
29c6141de9 feat: allow seeking in full height of progress control (#4004) 2017-02-02 14:42:34 -05:00
Brandon Casey
a8f2e43274 feat: videojs.getTech works with TitleCase or camelCase names (#4010)
* Fixes #3986 
* update `techOptions` to look for `TitleCase`/`camelCase` user tech options
* remove deprecated usage of Tech as Component
* add a unit test to verify that registerTech works
* change defaultTech_ to defaultTechOrder_
2017-02-02 14:34:33 -05:00
Gary Katsevman
6ad1e5c97b docs: fixup global jsdoc members (#4015) 2017-02-02 11:07:34 -05:00
Gary Katsevman
24d2e7ba33 fix: hide font-icons from assitive technology (#4006)
Wrap font-icons in a span with aria-hidden=true on it.

Fixes #3982.
2017-02-01 14:53:43 -05:00
Kevin Litchfield
cb42fcfb02 feat: unmute goes back to previously selected volume (#3942)
If a user changed the volume to zero either via the mouse or keyboard, clicking unmute will now restore the volume back to this last position. Previously, the mute and volume values were completely not linked.

Fixes #3909.
2017-01-31 15:29:07 -05:00
Gary Katsevman
f87ada1ee0 fix: allow changing volume in full height of volume control (#3987)
* allow changing volume in full height of volume control
* make volume control have pointer cursor
2017-01-31 15:11:26 -05:00
Gary Katsevman
19b429bddc fix(sass): import path no longer has cwd (#4001)
node-sass updated to remove the cwd from import paths.

Fix #3998
2017-01-31 15:10:31 -05:00
Gary Katsevman
22aade1b61 fix: updating time tooltips when player not in DOM (#3991)
If the time tooltips try to update when the player isn't in the DOM,
they error out because the bounding rects for the player will not be available.
This does a null check and exists early.
2017-01-30 11:43:14 -05:00
Gary Katsevman
e34335b012 fix: EventTarget is also evented (#3990)
If you try to delegate an to an EventTarget from an evented component, you'll end up failing because it didn't think that an EventTarget object worked. But it should and does. This adds a check for it in the isEvented function.
2017-01-30 11:41:46 -05:00
Brandon Casey
866a3f37d8 fix: remaining time display width on IE8 and IE9 (#3983)
vjs-no-flex environments like IE8 and IE9 don't work properly with width: auto.
2017-01-27 17:40:03 -05:00
Gary Katsevman
03529163b6 feat: Update MW to require a factory, add *-mw (#3969)
Middleware registration now only accept a factory method which takes a player reference and returns some object that represents the middleware with the various methods on it.
Also, add a use to register a middleware for all types.
2017-01-27 15:09:27 -05:00
Gary Katsevman
2e2ac6f870 refactor: move most volume panel functionality into css state (#3981) 2017-01-27 15:08:20 -05:00
Pat O'Neill
4979ea78d5 fix: Patch a memory leak caused by un-removed track listener(s). (#3976) 2017-01-27 14:56:43 -05:00
Brandon Casey
3585af0fe2 fix: Make Player#techCall_() synchronous again (#3988) 2017-01-27 14:35:00 -05:00
Pat O'Neill
d7d7cfeb9f feat: Stateful Components (#3960)
Advanced plugins introduced the concept of mixins and added two: evented and stateful.
This provides Components with the benefits of the stateful mixin
2017-01-26 22:04:34 -05:00
Pat O'Neill
4c3b60c3b6 refactor: Evented Components (#3959)
Advanced plugins introduced the concept of mixins and added two: evented and stateful.
This refactors Component to use the evented mixin, granting it event broadcast/handling capabilities.
2017-01-26 20:53:53 -05:00
Brandon Casey
c2545ddb6d feat: make registerTech add that tech to the default techOrder (#3985) 2017-01-26 17:13:27 -05:00
mister-ben
8e7d8cc959 feat: localize all strings in captions settings (#3974) 2017-01-25 13:54:21 -05:00
Gary Katsevman
34aab3f357 feat: middleware (#3788)
Add middleware support. Middleware can function as go-between between the player and the tech. For example, it can modify the duration that the tech returns to the player. In addition, middleware allow for supporting custom video sources and types.

Currently, middleware can only intercept timeline methods like duration, currentTime, and setCurrentTime.

For example,
```js
videojs.use('video/foo', {
  setSource(src, next) {
    next(null, {
      src: 'http://example.com/video.mp4',
      type: 'video/mp4'
    });
  }
});
```
Will allow you to set a source with type `video/foo` which will play back `video.mp4`.

This makes setting the source asynchronous, which aligns it with the spec a bit more. Methods like play can still be called synchronously on the player after setting the source and the player will play once the source has loaded.

`sourceOrder` option was removed as well and it will now always use source ordering.

BREAKING CHANGE: setting the source is now asynchronous. `sourceOrder` option removed and made the default.
2017-01-19 17:29:09 -05:00
Brandon Casey
b387437aed feat: remove flash tech (#3956)
Remove Flash Tech from core. Use videojs-flash if flash is needed.
Also, update DOM method names.

BREAKING CHANGE: remove flash tech from core.
2017-01-19 16:01:56 -05:00
Brandon Casey
524f868e31 feat(volume panel): accessibly volume control (#3957)
Internally uses the VolumeControl and MuteToggle components to create the VolumePanel component. Acts like the old VolumeMenuButton but does not have the screen reader issues of the older version.

BREAKING CHANGE: remove VolumeMenuButton, introduce a new default volume control: VolumePanel.
2017-01-19 15:54:47 -05:00
Pat O'Neill
1ba1f5aabd feat: Time Tooltips (#3836)
Switch to `keepTooltipsInside` by default and simplify DOM structure around the time tooltips and progress control.

BREAKING CHANGE: removal of `keepTooltipsInside` option.
2017-01-19 15:30:47 -05:00
Brandon Casey
49bed07039 refactor: unify all Track and TrackList APIs (#3783)
Unify all track-related usage internally.

BREAKING CHANGE: some externally accessibly functions for tracks are now private.
2017-01-19 15:16:28 -05:00
Gary Katsevman
7bafcc2a55 test: fix tests (#3953)
* Switch to es3 preset for babel so that it runs last. Plugins run before presets and presets run in reverse order. Also, we ran into a weird bug in babel that causes `default` not to be quoted in some cases (https://github.com/babel/babel/issues/4799) which we've worked around here.
* Restore the es-shims for tests and the ie8 fallback script.
* Do a null-check around `Player.players`.
* use more round fractions (like 0.5 and 1) to avoid rounding issues.
2017-01-19 11:17:46 -05:00
Brandon Casey
2037e18235 feat(player): add played(), defaultMuted(), defaultPlaybackRate() (#3845)
Add `played()`, `defaultMuted()` and `defaultPlaybackRate()` methods to the player.

Fixes #523.
2017-01-18 14:59:15 -05:00
Pat O'Neill
8d1653aebc feat: Advanced Class-based Plugins for 6.0 (#3690) 2017-01-18 01:52:23 -05:00
Brandon Casey
8f07f5d57c refactor: Remove method Chaining from videojs (#3860)
Remove method chaining from videojs. This helps keep the methods consistent especially since play() now returns a Promise in some cases. Also, it can add some performance benefits.

BREAKING CHANGE: player methods no longer return a player instance when called. Fixes #3704.
2017-01-18 01:50:22 -05:00
Brandon Casey
091bdf9261 feat: Return the native Promise from play() (#3907)
Return the native Promise from `play()` if it exists. `undefined` is returned otherwise.
This comes in as part of the greater effort to remove method chaining.

BREAKING CHANGE: `play()` no longer returns the player object but instead the native Promise or nothing.
2017-01-18 00:53:11 -05:00
Pat O'Neill
29ffbfbc87 feat: Restore all outlines for greater accessibility (#3829)
Restore all outlines on components that are focusable to increase accessibility of these components.

BREAKING CHANGE: restoring the outlines changes the skin slightly and potentially break users. Fixes #3200.
2017-01-18 00:49:12 -05:00
Pat O'Neill
57af15ce8b refactor: Make registerComponent only work with Components (#3802)
Prevent techs (and others) from being registered via registerComponent.
* `registerComponent` now throws if given an object that is not a subclass of Component (or Component itself).
* `registerComponent` now throws if given a non-empty string as its name argument.

BREAKING CHANGE: registerComponent now throws if no name or not a component is passed in.
2017-01-18 00:46:43 -05:00
mrocajr
ce6acc832a feat: Replay at ended (#3868)
Made the play button turn into a replay button at the end of the video.
Updated the translations needed docs with "replay".
2017-01-18 00:41:43 -05:00
Gary Katsevman
8622b2648e refactor: expose tech but warn without safety var (#3916)
`Player#tech` can now be called without passing an object into it. It no longer requires passing an object into it, so, current code will not break.
If nothing is passed in, a warning will be logged about knowing what you're doing. If anything is passed in, the warning is silenced.
2017-01-18 00:40:24 -05:00
Brandon Casey
73b6316f3b refactor: remove special loadstart handling (#3906)
This is both a change as well as a bug fix. We tried to have better awareness of when the underlying video element changed underneath us so we can dispose of the source handler but that broke some use cases of MSE. Given that we weren't able to fix it in a reasonable non-breaking and non-invasive solution, we're taking it out.

BREAKING CHANGE: remove the double loadstart handlers that dispose the tech/source handlers if a secondary loadstart event is heard.
2017-01-18 00:38:31 -05:00
Pat O'Neill
844e4f0107 feat: Log Levels (#3853)
Add a log levels and history api: `videojs.log.level()` and `videojs.log.history()`.
`.level()` will return the current level and you can also set it to be one of: `all`, `error`, `off`, or `warn`.
`.history()` will return a list of all things logged since videojs loaded. It can be disabled via `videojs.log.history.disable()` (and re-enabled with `enable()`) as well as cleared with `videojs.log.history.clear()`.
2017-01-18 00:35:42 -05:00
Brandon Casey
b07143d276 refactor: do not allow adding children with options passed in as a boolean (#3872)
This has been deprecated throughout 5.0 and being removed. To include a child, you must use an object  or false to exclude it. true will no longer be supported.

BREAKING CHANGE: remove ability to add children with options as a boolean.
2017-01-18 00:31:34 -05:00
Pat O'Neill
e12bedbb45 refactor: Remove TimeRanges without an index deprecation warning (#3827)
This aligns the methods with the spec.

BREAKING CHANGE: removing ability to use TimeRange methods without an index.
2017-01-18 00:29:27 -05:00
Pat O'Neill
c340dbcccd refactor: Buttons will always use a button element (#3828)
BREAKING CHANGE: button component will always use a button element.
2017-01-18 00:28:01 -05:00
Pat O'Neill
20141202c1 refactor: Remove custom UMD (#3826)
Only use `module.exports` for better compatibility between bundlers and module systems.
2017-01-18 00:27:00 -05:00
Pat O'Neill
5377ffc176 refactor: Remove unused defaultVolume option default (#3915) 2017-01-18 00:26:10 -05:00
Pat O'Neill
f8aed4dc32 refactor: Remove deprecated features of extend/Component#extend (#3825)
This removes the Component.extend() method entirely, which has been deprecated since 5.0. Additionally, it removes the deprecated support for an init method in videojs.extend().

BREAKING CHANGE: remove deprecated features.
2017-01-18 00:25:14 -05:00
Andrew Farmer
6578ed98ac docs: minor fix to currentTime() comment: "setting" not "getting" (#3944) 2017-01-13 14:30:13 -05:00
Gary Katsevman
305e5ea192 fix: showing custom poster with controls disabled (#3933)
We previously hid the poster image when controls were disabled because
the poster image had a click handler on it. However, this meant that in
the case of Flash, which doesn't have a native poster image ability, we
lost the poster.

Fixes #1625.
2017-01-11 16:26:35 -05:00
Gary Katsevman
94fd5c12c8 fix: give techs a name (#3934)
This helps with debugging to know what a component's name is.
We try to look up the tech's name via the constructor's name property,
otherwise, we set it to 'Unknown Tech'. Can be overridden by setting
`this.name_` after calling `super()` in the constructor.

Fixes #1786.
2017-01-11 16:26:24 -05:00
Mattias Buelens
2ceed0a4eb fix: Pause player before seeking in seek bar mousedown (#3921)
Previously, seek bar's mousedown handler would first seek the video,
then pause it. This can trigger a bug in Chrome 55 where seeking
backwards and then immediately pausing can break the video player.

Instead, call the super handler last so that we pause the video before
we start seeking.

Fixes #3839. This reverts commit e92db4f407 (#3886)
2017-01-11 15:03:04 -05:00
Michael Stramel
bbe82530aa fix: player el ingest when parent doesn't have hasAttribute method (#3929)
For elements which parent doesn't have `hasAttribute` it needs do another check to prevent erroring out. One case of this is when video.js is created inside a documentFragment, the parent node won't have a `hasAttribute` method.
2017-01-11 15:00:11 -05:00
Brandon Casey
d290db1765 refactor: require videojs-vtt.js via require rather than concat (#3919)
Using aliasify and require, we can generate the dist/video.js and dist/alt/video.novtt.js files each with and without vttjs while having the require-able version of video.js available to require vttjs and have it work with bundlers like browserify and webpack.
2017-01-11 14:56:07 -05:00
geibi
b5472145bf feat: Show big play button on pause if specified (#3892) 2017-01-03 15:32:06 -05:00
Pat O'Neill
26d4e7b0bf ignore: Prevent test failures in IE8 (#3891) 2016-12-23 14:03:58 -05:00
Pat O'Neill
ac0b03f2f7 fix: Support require()-ing video.js (#3889)
Introduce the Dom.isReal() function, which makes an educated assumption about the "realness" of the document object.
Wrap code here and there with checks against Dom.isReal() as well as other defensive code.

Fixes #3869.
2016-12-23 11:30:49 -05:00
Garrett
b7c384eb5b fix: extra warn logs on already initialized player references (#3888) 2016-12-23 11:29:23 -05:00
Darren Nolan
42507f8c11 fix: don't emit tap events on tech when using native controls (#3873)
If using nativeControlsForTouch, skip the emitTapEvents listeners from
being setup. This avoids taps being taken away from native video
elements and stopping controls being displayed.
2016-12-22 15:20:43 -05:00
Gary Katsevman
e92db4f407 fix(seeking): don't always pause in mouse down (#3886)
In chrome 55, something changed which introduced a bug in videojs where
if you seeked back, it wouldn't work. This is because we always paused
the video in the mousedown handler.

Instead, we should create a timer for pausing that is cleared in the
mouseup handler or in the mouse move handler. This is so that if someone
is seeking by clicking and waiting the video pauses. As soon as we start
moving and we get a mousemove event, we can know that it's safe to pause
as well.

Fixes #3839.
2016-12-22 15:19:35 -05:00
Brandon Casey
22cf3dd935 feat: deprecate the use of starttime in player.js (#3838) 2016-12-21 14:23:00 -05:00
Brandon Casey
642ad4b5cf docs: move examples out of code into docs 2016-12-20 18:20:31 -05:00
Gary Katsevman
74530d8b3a feat(player): ingest a player div for videojs (#3856)
If the videojs embed code (a video element) is wrapped in a div with the
'data-vjs-player' attribute on it, that element will be used for the
player div and a new one will not be created. In addition, on browsers
like iOS that don't support moving the media element inside the DOM, we
will not need to clone the element and we could continue to re-use the
same video element give to us in the embed code.

This could also be extended in the future to change our embed code to a
div-only approach if we so choose.
2016-12-19 11:51:42 -05:00
Gary Katsevman
a7ffa34b7b fix: remote text track deprecation warnings (#3864) 2016-12-15 15:48:19 -05:00
Gary Katsevman
3f724f9349 test(hooks): remove errors logged in tests (#3865) 2016-12-15 15:48:03 -05:00
Gary Katsevman
559297a376 fix(html5): (un)patchCanPlayType could set native canPlayType to null (#3863) 2016-12-15 14:57:58 -05:00
Gary Katsevman
83cbeec424 fix: remove vjs-seeking on src change (#3846)
If you're in a seeking state and the source changed, we should no longer
be in a seeking state.

Fixes #3765.
2016-12-14 13:21:35 -05:00
Pat O'Neill
014c6b89e6 fix(throttle): Fix error in Fn.throttle that broke MouseTimeDisplay (#3833)
We were not initializing `last` properly in the throttle function.
2016-12-05 16:14:03 -05:00
Gary Katsevman
881cfcb346 feat(texttracks): always use emulated text tracks (#3798)
Chrome has a bug where if you add a remote text track and try to use it programmatically, you won't get any cues displayed. So, just switch to always emulated mode.

Also, add IS_SAFARI and IS_ANY_SAFARI to the browsers.
2016-12-02 16:13:33 -05:00
Gary Katsevman
bed19be9cd revert: fix(events): ensure we attach events to objects we know how to (#3727)
This reverts commit bfcb9e2fb5.
2016-12-02 16:11:04 -05:00
Aaron Boushley
bfcb9e2fb5 fix(events): ensure we attach events to objects we know how to (#3727)
In addition log a warning if the listener isn't going to get added

Fixes #3272
2016-12-02 15:52:30 -05:00