Since IE/Edge returns the header with a leading new line('\n'), we need
to remove it from the response.
Closes#1172.
Change-Id: I133f9cfbada6486edc438f3dcbc37c7c78dbf36c
This adds the ability to supply an isCanceled() callback when making a
backoff object. If the callback is provided, the backoff will break the
timeout into a series of 200 MS timeouts, and check isCanceled() between
every segment.
This changes makes it so that, when canceling a load, you can quickly end
the current backoff. This will making canceling a load significantly faster,
especially if the player is on a late retry.
This still does not quite fix issue #1084 to my satisfaction; if the
manifest is currently downloading, the cancel will need to wait on that.
Canceling an in-progress manifest download will be yet another followup CL.
Issue #1084
Change-Id: I0a53310a9b521de375f2e128f63eaa133547c340
If the parser is failing to load a manifest, perhaps due to being offline,
and the player is destroyed mid-load, it will wait for all of the retries to
run out before canceling. This causes a significant wait time on destroy.
This change adds an optional isCanceled callback to the request method in
NetworkingEngine, allowing requests to be made that can be canceled via a
provided callback. This is then used to quickly skip past all of the
retries, when destroying the parser.
This doesn't stop any backoff in progress, so there still might be a delay of
a second or two (depending on networking settings, of course) if you destroy
during a backoff period. That will be changed in a followup CL.
Issue #1084
Change-Id: I0b99616ed4d5be078161122532ea271e84613170
This modified the networking engine to store every plugin it is given
for a scheme, and adds a priority system to pick which of the plugins
to use.
Issue #829
Change-Id: I21a8a534383f2be898160d609d77efecfc2b684b
ArrayBuffer.slice isn't supported with two arguments on Tizen 2016.
This is a temporary fix that can be cherry-picked to v2.2. A better
fix will be handled in a follow-up change.
Issue #1022
Change-Id: Iae6a0b2ef0cf17843f42f22f0ea0962a56e8be68
Instead of calling the failure callback right away, use the delay and
backoff algorithm first. This way, applications do not need to
implement their own delay, and should behave more responsibly toward
servers in case of failures.
Closes#976
Change-Id: Id896365a5ed0ffdd288ef1f59e8637d1e4e55b5b
This extracts the delay, backoff, and fuzzing code from
NetworkingEngine in a way that can be used by other classes that need
this same backoff/retry behavior.
Issue #976
Change-Id: I2a370fc996e6f8f507768559c44cf7855e16abe1
This adds a severity field to Error objects. This can be used to
detect whether an error is recoverable. All the same errors are still
reported so the field can be ignored.
There are two possible values:
* RECOVERABLE means that the Player will try to recover from the error
* CRITICAL means the Player will be unable to continue and must call
load() again
Closes#564
Change-Id: Ie2c5468340c13e7a288b99690ab65b7ecc0a6b29
Widevine HLS manifests have a data URI that needs to be parsed to
generate DrmInfo. Rather than write another parser, factor the data
URI networking plugin to expose the parser to other classes.
Issue #279
Change-Id: I71f174b86cc3b0ae0e8dbc31701ea9d36cd157ee
This allows network responses to have an X-Shaka-From-Cache header to
indicate that the response was somehow from a cache and should be
ignored for bandwidth calculations. For example, this can be from a
service worker intercepting the request.
Change-Id: I4dfdf4211921b7205febb58f1e80967f0c4841cd
This adds a field to the network response that will indicate that the
response was from a cache and should be ignored for bandwidth
estimation.
Change-Id: I6b02e9d4fb3be02731bdf0a2a46bc5ce5f11e302
By exporting StringUtils and Uint8ArrayUtils, we can simplify the
process of wrapping, unwrapping, and parsing requests and responses
in NetworkingEngine filters.
This makes it easier to write filters that deal with text-based
data, as it is no longer the job of the application developer to
deal with subtle conversions between string and ArrayBuffer.
We will also fill in requests with defaults if needed. This allows
developers to omit fields when initiating extra requests at the
application level.
Closes#667
Change-Id: Ie6a0f23b4d46e7e458d996759eac6cd85a36b741
In some cases, the networking engine could have attempted to
remove a pending request that did not exist, thus removing other
requests.
Change-Id: I08fb9c11c3dd153af7a148fcb591fe5c0c3634a1
This allows the networking plugins to pass the duration it took for
the request. For example, if a plugin were pre-fetching the segment,
this allows the plugin to tell NetworkingEngine about how long it
really took to download.
Closes#621
Change-Id: Ie67e3f99389cf02d5b4a345bde06ccc418b6e91c
The test flake was caused by a leaked instance of Playhead interfering
with NetworkingEngine unit tests. The quickest way to reproduce a
failure on the networking tests was to focus the unit tests for
Playhead and NetworkingEngine and run the suite on IE11.
Playhead tests tear down the Playhead object after each test.
However, one test created two Playheads, effectively leaking one.
That leaked Playhead would continue to poll the fake video element
after the test was complete. Polling used setTimeout.
The NetworkingEngine unit tests would mock setTimeout and show that
the engine was calling it appropriately. However, the leaked Playhead
would also call setTimeout during the NetworkingEngine test, which
would cause an expectation on the number of calls to fail.
The Playhead tests should clean up after themselves, but the
NetworkingEngine tests should not have to mock global setTimeout in
the first place. This change not only fixes the Playhead tests, but
isolates NetworkingEngine's use of setTimeout to a private method
which can be mocked without affecting global state.
Change-Id: I94dd7f6c39c25f81c7e4122895ab5fae0feef2cb
This exports all plugins from the library, to make delegating and
subclassing easier for applications.
This also fixes a couple of issues with the generated documentation.
Closes#551
Change-Id: I23798f6117e1944d7ffc67bcb50ae36f3943710a
An upcoming compiler release will allow us to generate externs from
exports. Because of that, we are adding some extra exports which are
otherwise not needed at runtime.
- Export properties which implement an interface
- Export classes which are referenced in external APIs
- Export base classes of other exported classes
Change-Id: I78b3a4569b4b82b0a9d8993978faf268c2a791d9
If an external project wants to reference the filter or scheme plugin
typedefs, these should be in shakaExtern.
Change-Id: I7bf70d2efbf741c8b07a7b8502b3f52eff49dd9d
jsdoc was getting confused and generating, for example, a file called
"shaka.media.html#VttTextParser". Moving the @namespace annotation to
the method itself fixes it.
Change-Id: If26cac698b19d1305c270e519b7ed50ed81492fe
Without @namespace annotations, static classes do not show up in the
generated API docs. Although I stumbled over one instance while
writing tutorials, the rest were discovered programmatically by:
for x in $(find lib/ -name '*.js'); do
grep -Eq '@(constructor|interface|namespace)' $x || echo $x
done
Change-Id: I97dd2bb4bf3faad5ac8d952a28837fa1f594deb9
Still missing custom controls for live, but otherwise functional.
UI design and CSS based on work by Sam Dutton.
Change-Id: I0ee41254fb3b145822b018dff87aa583d6bef179
Using goog.asserts will work with the compiler. So rather than
simply casting a nullable value when passing to a method, we can use
an assert which will correct the type and print a log if it somehow
is null.
This is not the same goog.asserts found in closure library, this
simply calls console.assert, but it is not required to do anything
for the compiler help.
Change-Id: I2548e39e772f0aa7ec41437cf9f5a2be383e0fbd
Before there were two style to indent comments after an annotation,
using 2 and 4 spaces. Now this only uses 2 spaces.
Change-Id: Id06415d7193cc154a2768fb3932aff7a06b7ed32
Before, we simply converted each byte from an ArrayBuffer into a
character; however, this is only valid for ASCII characters. This
changes it to fully support UTF-8 encoded network responses.
Change-Id: I9c49f29b09960501d345b98aa7af1bb711972abf
Some failure scenarios resulted in success on Edge 12.
It seems that calling reject() followed by resolve() in a Promise
constructor was resulting in a resolved Promise on Edge 12.
Change-Id: I353d37f34be59c4535a11eb6c181bfa3d320c52d
Uses location to determine what the scheme should be if unspecified.
This is important because it allows us to use URIs that work for
either HTTP or HTTPS hosted apps without mixed content warnings.
Some special sauce was needed to make it testable, since we generally
can't mock location in tests.
Change-Id: I294ac532f1bba80977597e11addd7f585d1e9b79
The optional arguments in this convenience function really only help
in the tests. To avoid some component in the library accidentally
making a request with default retry parameters instead of those
configured by the user, I'm making the retry parameters required.
The optional argument for method is only used once. To avoid the
temptation to add more positional arguments for other seldom-used
fields, I'm dropping the method argument completely.
Change-Id: Ib0afb5766f68c5505f11372e3b004fc8eaca1223
This adds some utility functions to NetworkingEngine for common
actions. This also cleans up the related unit tests.
Change-Id: I1105b77b6dac3637d566c1a4e2f77004ad705e8b