diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2019-07-23 05:00:01 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-23 05:00:01 -0400 |
commit | fdbb317d7a241928d08e40dfd5b0ae3003ecba51 (patch) | |
tree | 5417885b98e2fd30f33655db80d50c5cc950c7c7 /components/script/dom/htmlmediaelement.rs | |
parent | e2903bcebf2f201ffa63dd4b867627bd7dd0e68e (diff) | |
parent | dc1121949619c4d04be001220059d9b5f0e70e8e (diff) | |
download | servo-fdbb317d7a241928d08e40dfd5b0ae3003ecba51.tar.gz servo-fdbb317d7a241928d08e40dfd5b0ae3003ecba51.zip |
Auto merge of #23774 - sreeise:media_fragment_parser, r=ferjm
Media fragment parser
<!-- Please describe your changes on the following line: -->
Media fragment parser for audio and video.
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #22366 (GitHub issue number if applicable)
<!-- Either: -->
- [X] There are tests for these changes OR
- [ ] These changes do not require tests because ___
<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/23774)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/htmlmediaelement.rs')
-rw-r--r-- | components/script/dom/htmlmediaelement.rs | 49 |
1 files changed, 40 insertions, 9 deletions
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 1b6f8ab1e3c..8eaa9c2b552 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -44,6 +44,7 @@ use crate::dom::htmlsourceelement::HTMLSourceElement; use crate::dom::htmlstyleelement::HTMLStyleElement; use crate::dom::htmlvideoelement::HTMLVideoElement; use crate::dom::mediaerror::MediaError; +use crate::dom::mediafragmentparser::MediaFragmentParser; use crate::dom::mediastream::MediaStream; use crate::dom::node::{document_from_node, window_from_node, Node, NodeDamage, UnbindContext}; use crate::dom::performanceresourcetiming::InitiatorType; @@ -1522,8 +1523,20 @@ impl HTMLMediaElement { self.AudioTracks().add(&audio_track); // Step 4 - // https://www.w3.org/TR/media-frags/#media-fragment-syntax - // https://github.com/servo/servo/issues/22366 + if let Some(servo_url) = self.resource_url.borrow().as_ref() { + let fragment = MediaFragmentParser::from(servo_url); + if let Some(id) = fragment.id() { + if audio_track.id() == id { + self.AudioTracks() + .set_enabled(self.AudioTracks().len() - 1, true); + } + } + + if fragment.tracks().contains(&audio_track.kind()) { + self.AudioTracks() + .set_enabled(self.AudioTracks().len() - 1, true); + } + } // Step 5. & 6, if self.AudioTracks().enabled_index().is_none() { @@ -1565,8 +1578,18 @@ impl HTMLMediaElement { self.VideoTracks().add(&video_track); // Step 4. - // https://www.w3.org/TR/media-frags/#media-fragment-syntax - // https://github.com/servo/servo/issues/22366 + if let Some(track) = self.VideoTracks().item(0) { + if let Some(servo_url) = self.resource_url.borrow().as_ref() { + let fragment = MediaFragmentParser::from(servo_url); + if let Some(id) = fragment.id() { + if track.id() == id { + self.VideoTracks().set_selected(0, true); + } + } else if fragment.tracks().contains(&track.kind()) { + self.VideoTracks().set_selected(0, true); + } + } + } // Step 5. & 6. if self.VideoTracks().selected_index().is_none() { @@ -1628,7 +1651,7 @@ impl HTMLMediaElement { self.change_ready_state(ReadyState::HaveMetadata); // Step 7. - let mut _jumped = false; + let mut jumped = false; // Step 8. if self.default_playback_start_position.get() > 0. { @@ -1636,16 +1659,24 @@ impl HTMLMediaElement { self.default_playback_start_position.get(), /* approximate_for_speed*/ false, ); - _jumped = true; + jumped = true; } // Step 9. self.default_playback_start_position.set(0.); // Steps 10 and 11. - // XXX(ferjm) Implement parser for - // https://www.w3.org/TR/media-frags/#media-fragment-syntax - // https://github.com/servo/media/issues/156 + if let Some(servo_url) = self.resource_url.borrow().as_ref() { + let fragment = MediaFragmentParser::from(servo_url); + if let Some(start) = fragment.start() { + if start > 0. && start < self.duration.get() { + self.playback_position.set(start); + if !jumped { + self.seek(self.playback_position.get(), false) + } + } + } + } // Step 12 & 13 are already handled by the earlier media track processing. |