Commit Graph

1808 Commits

Author SHA1 Message Date
Jacob Trimble f130dffcef Enable eslint indentation rule.
This is a fully automated change.  The linter will fail because the
extra indentation caused line-length errors.  These won't be fixed
automatically.  They are fixed in a follow-up to make this one fully
automated.

Change-Id: I4d8cf9c998985add2bcd24a81c8d65495668c4f3
2019-05-13 22:31:09 +00:00
Joey Parrish 615b46d70c Fix initial bandwidth estimate on Chrome
The Network Information API gives us an initial bandwidth estimate on
Chrome and Opera (and others, some day).  But the API changed slightly
in a way that broke our detection of it.  This restores the
functionality so that our initial bandwidth estimate is closer to what
we will converge on during playback.

Change-Id: Iaff9224c98127e6fcad1f188d73d243a45f36cd7
2019-05-13 22:29:02 +00:00
Jacob Trimble 0dd64074b9 Only allow one statement per line.
With the new style rule, we cannot have two statements on the same line.
So we can no longer have an "if" on a single line and we cannot have
an arrow function with a body on the same line as when it is used.
This is mostly a manual change.

Change-Id: I2285202dd5ecbad764308bc725e6d317ff2ee7f0
2019-05-13 22:11:50 +00:00
Michelle Zhuo c3cf3f1b87 Use async/await in Dash parser
Closes #1402

Change-Id: I4e11dd7976bb5ad9be528b251ef41f2a07aa4afc
2019-05-09 22:40:23 +00:00
Theodore Abshire 273698d607 Fix exception on network retry.
The numBytesRemainingObj parameter in |NetworkingEngine.send_| was
optional, but in some circumstances we were assuming that it was set.
This just changes the parameter to be non-optional.
In fact, the parameter now being non-optional revealed an error that
caused the numBytesRemainingObj to be lost on network retry.

Fixes #1930

Change-Id: I74f24309f859f975f51e20455739b806ed3f4ecd
2019-05-09 22:19:56 +00:00
Jacob Trimble f225c047f6 Reorder eslint rules and add some more.
This reorders the rules so they mostly are ordered the same as the
eslint documentation.  The exception is the few at the top, most of
which should be removed.  This also removes some rules that appear in
the recommended or the Google set.  Lastly this adds some more rules:

- Require parenthesis when using "new".
- Disallow confusing regex (e.g. /=/).
- Disallow some confusing coercions (e.g. +foo).
- Disallow some Unicode characters in a regex.
- Disallow using "async" in a Promise constructor.

Change-Id: I597b472bdaee5b4cb92354f057e7ae6aeb96eefa
2019-05-09 22:14:18 +00:00
Jacob Trimble 381274fbbd Enforce a consistent dot location.
Change-Id: Ic3b86c4c113023206bc37a117e96f672f351121b
2019-05-09 21:09:30 +00:00
Jacob Trimble ded2b84313 Require consistent return values.
This enables the eslint rule that requires all functions to consistently
either return a value or not return a value.

Change-Id: I98b579f3689c3b6c74968116824231bb792bd9dd
2019-05-09 20:34:47 +00:00
Joey Parrish ab6f9cfd3d Allow short-form config for UI and offline
With this change, offline and UI config can use the same two-argument
short form that the Player config interface offers.

Change-Id: I5f40ef58da76f3aab1d7178fe7d6e82097352b9a
2019-05-09 19:34:01 +00:00
bcupac b8f032a05e Use standard base64 encoding in FairPlay license request (#1932)
Closes #1915
2019-05-09 09:55:38 -07:00
Jacob Trimble 47daf49f31 Use arrow functions for callbacks.
This is an automated change to convert use of "function" functions
to arrow functions.  This doesn't change all uses of bind() that
could be converted.  This also doesn't remove all "function" functions.

Change-Id: I40ac7d086bcef947a1be083359c8fd1d4499a9c3
2019-05-09 16:40:46 +00:00
Joey Parrish 189902bdb3 Eliminate free calls of static methods
This was caught by a newer compiler release.  These were missed in the
last audit we did before releasing v2.5.0.

Change-Id: I4abd29e965c95b56eb83c61294f8a7dbaacae990
2019-05-08 15:01:02 -07:00
Jacob Trimble cea3161ce9 Misc fixes for arrow functions.
A follow-up commit will convert "function" functions to arrow functions.
This caused some errors with the compiler, which this change fixes
beforehand.

Change-Id: Iff85b1e1f56b63a38b09f8db9947ed5daf02ddf4
2019-05-08 20:43:20 +00:00
Jacob Trimble b87a066832 Add some additional style rules.
- Disallow mixing different types of some operators (e.g. && ||).
- Disallow useless constructors.
- Require a newline between class members.
- Require spacing around arrow functions.
- Require using the compound assignment when possible (e.g. +=).
- Check for possible errors in assignments involving "await".

Change-Id: Ib48167aea61a62b33f0b76bb869abe18398ee5b7
2019-05-08 20:43:07 +00:00
Jacob Trimble c81389741f Prefer const over let.
A coming update to the Google eslint config will require using "const"
over "let".  This makes that one change to isolate the big changes.

Change-Id: I7d0974c3ae15c53cc45a6b07bf9f6586e2d34aca
2019-05-08 09:22:10 -07:00
Jacob Trimble a453095412 Misc fixes for const.
This prepares some changes for the conversion from "let" to "const".
This ensures the follow-up is just an automated change with minimal
intervention.

Change-Id: I19b24dc67f20038dffd36b8903547f6ee4f00c25
2019-05-08 16:17:58 +00:00
Joey Parrish 8002b278e6 Add missing variantchange event
This was preventing the UI from seeing audio language changes in
native HLS on Safari.

Closes #1910

Change-Id: Ifc539528293fa30e28e09b67c2a83a23df9793ed
2019-05-08 02:49:19 +00:00
Theodore Abshire f036c94802 Fix video reloading on audio language change.
Previously, on seek, if any stream was unbuffered, it was considered an
unbuffered seek and every stream was cleared. This was to account for
the possibility that the streams would end up in different periods, and
therefore cause a hang.
However, this meant that changing the audio stream caused the video
stream to be flushed and reloaded pointlessly.
This changes the code to only clear all buffers if a stream has moved
into a different period; if one hasn't, it clears them on a case-by-case
basis.

Closes #1714

Change-Id: I6385e24266834bfc0c6dd2678facc5559affb941
2019-05-08 02:40:48 +00:00
Theodore Abshire 0ddff4f7ea Add support for multiple concurrent downloads.
At the moment, the storage manager does not support multiple concurrent
downloads. This modifies the demo to create a new storage instance every
time a storage operation is desired, then dispose of that instance after
the operation is complete.
This also refactors out the shaka-main-offline-changed event, which was
no longer necessary after allowing asset cards to re-load their buttons.

Issue #1432

Change-Id: I1312cf74a92f877279adb461e423a38e93bcfa0f
2019-05-07 16:31:15 -07:00
Joey Parrish 3ef441c602 Update changelog for v2.5.0
Change-Id: I515572a11da07c3b153f2e55941606eb799c86fa
2019-05-07 22:32:52 +00:00
Joey Parrish 683d17f57e Hide volume button on mobile
Fixes b/131924038

Change-Id: I4c86cb14c240c8e795e18fdf54e8bee11a3cec61
2019-05-07 22:28:56 +00:00
Joey Parrish 33f3c07fba Minor style fix in NetworkingEngine
Change-Id: I18afa94204a2f784203fba74c69e8b4c812596fc
2019-05-07 19:36:40 +00:00
Joey Parrish 662d6e6533 Un-export IReleaseable
No exported classes implement this, so we do not need to export it.

Change-Id: I9d91e486d598a05f02c3056a5aaa8afae14a32e8
2019-05-07 19:10:46 +00:00
Joey Parrish 9108431359 Simplify Webkit PiP polyfill
By listening to events on document in the capturing phase, we can
avoid complex event shims on HTMLVideoElement.  By monitoring
global PiP state on the document, we can get rid of the getter and
setter for the document's PiP element, as well.

Follow-up on PR #1902

Change-Id: Ib5f5d0c7c735124a438901c5bb15e034ab10b996
2019-05-07 18:39:24 +00:00
Jacob Trimble 8ec9e19c4a Add tests for progress events and aborts.
Closes #1051

Change-Id: I6d194751c9c248927688783805efe0335fffe312
2019-05-07 18:29:20 +00:00
Joey Parrish 02b06415ec Add missing player events
If changes are deferred because of StreamingEngine state, the Player
should still fire variantchanged and textchanged events after the
changes are applied.

Also, clean up Player event firing patterns.  The texttrackvisibility
and abrstatuschanged events should be fired asynchronously, just as
other state change events are.

The onEvent_ method was one line and only called from one place, so
it was inlined and removed.

The corresponding pattern of waiting on these events in the UI tests
was also changed.

b/131909906

Change-Id: I7f7d3b25ee336dbfe79c3214854722e1955acb6a
2019-05-06 22:30:38 +00:00
Sandra Lokshina 65768a3d41 Hide fullscreen button on platforms that don't support it.
Safari on iOS does not support HTML5 fullscreen API. There
seems to be a (separate) way for a video element to enter
fullscreen mode. I will see if we can adopt it in a different CL.
For now, just hide the button if fullscreen API is not supported.

Issue #1909
Issue b/131923216
Change-Id: Ia30660c7a68fd626051fdf5abce59dbe993b2de2
2019-05-06 22:25:41 +00:00
Joey Parrish cbfe4f82a4 Fix warnings found by a newer compiler version
This is only some of the warnings produced.  These were not errors,
but we should fix them anyway so that we can adopt stricter settings
in future.

Change-Id: Ifd12f0e7c69f8f4b3d0d78b11794da2569a06d77
2019-05-06 22:25:12 +00:00
Joey Parrish 61735055a9 Ban storage on non-MSE browsers
Without MediaSource, we can't play back stored content.

Issue #1911

Change-Id: Ifb01b8ca3f837e923f5afd6aefae2e0687743cf4
2019-05-06 16:13:43 +00:00
Jacob Trimble cc838ff23f Fix uncaught Promise rejection errors when aborting.
We get an error from ReadableStream when we abort a request.  This
causes uncaught rejection error logs in Chrome.  This ignores the
error and stops the logs.

Change-Id: I0f339e73564ac42b28ea8b7d0bf12ffb8c2ec9cc
2019-05-03 23:02:42 +00:00
Joey Parrish e3b49573a2 Rename PiP polyfill to PiPWebkit
Follow-up to #1902

Change-Id: I760d0006c4cbd7c3aad2ce96801259b578269195
2019-05-03 21:30:17 +00:00
Joey Parrish 6ee4579407 Fix isAudioOnly race with native HLS
With native HLS, we have a better, more accurate, and more timely way
to detect audio-only content.  Use that whenever possible.  This fixes
the audio-only poster and PiP element state with native HLS content.

Issue #997

Change-Id: Iee9f03deae6e56e7cfc140ed12278270eb667a41
2019-05-03 20:51:08 +00:00
Joey Parrish 685e9d57cf Eliminate free calls of static methods
It is type-safe to alias a class, but not one of its static methods.
Aliasing the method without the class makes it a "free call" to invoke
the aliased method.

A "free call" is when you call a method without the context of its
instance of class.  There were several cases of this with static
methods.

This will be enforced by a future release of the compiler, which I
believe will lead into compiler support for "this" in static ES6
methods.  In ES6, you can use "this" in static methods to refer to the
class and call other static methods.  Closure compiler doesn't support
static "this" yet, but we will start using it as soon as it is
supported.

Change-Id: I4249db8b6dda9231ebba60ee0d4ad734a692c2fe
2019-05-03 18:43:35 +00:00
Joey Parrish c0c203cf2d Fix compiler errors found by a newer compiler
Change-Id: I83d81bcdc955331dc7afcc25c45802e77b7b7c02
2019-05-03 18:43:35 +00:00
Álvaro Velad Galván caa34ca90d Add PiP pollyfill for Safari (#1902) 2019-05-03 10:50:37 -07:00
Joey Parrish 9a4b73df7c Fix runtime errors in the new demo on IE 11
- Polyfill navigator.languages, which is missing on IE
 - Add missing handler for uncaught exceptions (doesn't work on IE,
   but is a good idea to have for debugging the demo app)
 - Avoid offline setup if it's not supported (as on IE)
 - Fix bad reference to uncompiled link (wrong ID)
 - Log any caught errors to the console
 - Wrap the init functions to catch and log any errors during init

Fixes b/131863587
Fixes #1911 (similar storage error on iOS)

Change-Id: Ib2a53392d5632c71825af17dd3e955cd54279e98
2019-05-03 17:26:44 +00:00
Jacob Trimble 9ae237cc3c Fix captions being displayed initially.
When the audio and text languages differ, we should display the captions
by default.  This also happens if the app calls setTextTrackVisibility
before calling load.  What happened is the text media state was being
created, but an update wasn't being scheduled.  This meant the text
segments never got appended.  This changes when the update gets
schedules.  This also removes an unnecessary call to set the initial
state during startup.

Issue #1696
Closes #1879

Change-Id: If3a1b9e2889fc0e487da0e7276ca837636bf2e54
2019-05-03 15:58:08 +00:00
Joey Parrish e246a6cb77 Fix major HLS variant creation bug
The wrong loop index was used, which caused us to create bogus and
non-unique keys for a map, which in turn caused us to skip certain
variants that should have been created.

Fixes #1908

Change-Id: I6475acad16cd76acb81cd562ef033724c7c4ebaf
2019-05-02 22:28:23 +00:00
Joey Parrish d27d8180e0 Only use configured license servers if provided
If the application developer specifies license servers, only those
should be used.  Before this, a manifest-specified license server
for a certain key system could still be used if the application didn't
provide one.

Now, if there are _any_ license servers specified by the app, _no_
license servers will be used from the manifest.  This is important
because it allows the application a clear way to indicate which DRM
systems should be used on platforms with multiple DRM systems.

The new order of preference for drmInfo:
1. Clear Key config, used for debugging, should override everything else.
   (The application can still specify a clearkey license server.)
2. Application-configured servers, if any are present, should override
   anything from the manifest.  Nuance: if key system A is in the manifest
   and key system B is in the player config, only B will be used, not A.
3. Manifest-provided license servers are only used if nothing else is
   specified.

Introduced in #1644 to solve #484
Internal issue b/131264101
Closes #1905

Change-Id: I1a36a70044dc7bcc22681e3e4246d0a43d58e413
2019-05-02 20:30:54 +00:00
Michelle Zhuo 40f9113bb2 Abort requests when network downgrading
When the network becomes slow, we check if stopping the current request
and download the content with lower resolution is faster. If so, abort
the current request and start a new one.

Issue #1051

Change-Id: I588e524469432e362361d1cfbde6cd45c2009959
2019-05-01 20:18:16 +00:00
Theodore Abshire efc2ed3df1 Added new demo page.
This is a complete replacement for the old demo page, made to be more
modern-looking and easier to maintain. It contains new features such as
remembering the URIs you provide for custom assets, and searching through
the default assets by feature.
This demo page is not quite ready for release yet, but it's getting close.

Change-Id: Iad01d1fc02c3cd238d73b9b9e02dbb4301cb6f2a
2019-05-01 19:58:18 +00:00
Joey Parrish b513a48418 Fix range header regression
Range headers should not be sent when requesting the entire resource.
This fixes compatibility with Microsoft IIS web server.

Introduced in work on issue #1788

Change-Id: I151a2f15d4f5e95531e16d5372ee9a051135f12f
2019-05-01 17:02:53 +00:00
Joey Parrish 1d4efe6f35 Prefer prefixed EME on Apple devices
The unprefixed EME launched with macOS 10.14 (Mojave) rejects requests
for the key system IDs we know how to use.  So until the bug we filed
against Apple is resolved, prefer the prefixed API.

Issue #382

Change-Id: I71313be2102af2da66a6389a9e9afdebd8ae033d
2019-04-30 21:15:11 +00:00
Joey Parrish a121733a11 Add FairPlay EME polyfill and DrmEngine support
This adds a polyfill for Apple's prefixed EME implementation.  This
will be used on all macOS versions prior to 10.14 (Mojave) and on
Safari versions prior to 12.1.

This also adds support for FairPlay license protocol eccentricities
in DrmEngine, so that the proper formatting is used for requests and
responses.

Issue #382

Change-Id: If1274d2f018a475f56c09df97645694f13acbde9
2019-04-30 21:15:11 +00:00
Joey Parrish 8391fe1684 Extend Player track methods to cover native HLS
Track methods are now implemented for native HLS and other src=
playbacks.  This will allow the UI to select text and audio languages.

This change adds best-effort methods to get track information for src=
playbacks, including native HLS on Safari.  In many cases, it relies
on the audioTracks and videoTracks members of HTMLVideoElement which
are only implemented on Safari.  They are in the spec, though, so
there's no harm in using them when they exist.

This is fully parallel to the manifest-based paradigm for MSE-based
playbacks.  Each of these top-level methods in Player has an "if" to
decide which way to supply the requested info, except for the language
methods, which now delegate to the track methods.

With this, Safari's native HLS can supply audio and text language
information to the UI/app, and the UI/app can have some control over
those things through the tracks API.  I believe this is important to
the success of our new iOS support.

Issue #997
Issue #382

Change-Id: Icc44a932927fafedda1b62a9d4c6e2ed3dc7db30
2019-04-30 21:15:00 +00:00
Joey Parrish 831dfa6168 Consider src= fully loaded only after first frame
This fixes the definition of load() to wait for a frame before
resolving the load() Promise for src= playbacks.  Now methods like
isAudioOnly can be trusted as soon as load() resolves.

This also allows load() to fail for src= playbacks if an error event
fires from the media element.

Issue #816
Issue #997

Change-Id: I0f6120d1334bbebcb78efdbbca65c7981f3ef265
2019-04-30 12:03:01 -07:00
Joey Parrish 8178e918c0 Implement isAudioOnly for src=
This is a generic implementation that doesn't rely on the audioTracks
and videoTracks members currently only available on Safari.

Issue #997

Change-Id: I849845513efb2ee51205dcdca8568c889f1f7cdb
2019-04-30 18:33:26 +00:00
Joey Parrish 0e65a4543e Fix EventManager listenOnce with multiple listeners
When listening to the same event on the same object from two places,
it's important that both listeners get called back.

This fixes EventManager's listenOnce() so that the unlisten() call
within listenOnce() doesn't remove both listeners at once.  Now each
listener will be called before it is removed.

This bug is over two years old!

Change-Id: Id99f3a8e5ab80819921b30e28aa66d8a08b29e86
2019-04-30 18:33:26 +00:00
Joey Parrish 91c57e1663 Drop periodreadyforstreaming event
This event was added just for the sake of the UI tests, but the video
element's canplaythrough event works in its place.

Change-Id: I6774fdfdfbd2b197cc93eae743829510b61bb0fa
2019-04-30 17:07:08 +00:00
Sandra Lokshina 7a15c1e94f UI: Dynamic layout construction.
Fixes #1674

Change-Id: I338917bbd43a6ddc837388fdc8beea9e3f7b0778
2019-04-29 21:17:39 +00:00