diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2017-09-15 09:41:21 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2017-09-19 14:26:07 +0200 |
commit | e8d7eaf8a3a5302e861624b7c1c78f7eae86bcc3 (patch) | |
tree | e6882dc41de95e3f84e85f9ab93319c816f674d3 /components/script/dom | |
parent | 5352697558a0ee4241067edfb483ff3f8f036c24 (diff) | |
download | servo-e8d7eaf8a3a5302e861624b7c1c78f7eae86bcc3.tar.gz servo-e8d7eaf8a3a5302e861624b7c1c78f7eae86bcc3.zip |
Clean up code of the resource fetch algorithm
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/htmlmediaelement.rs | 141 |
1 files changed, 81 insertions, 60 deletions
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 7be4b56e1cc..3358e74e862 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -12,6 +12,8 @@ use dom::bindings::codegen::Bindings::HTMLMediaElementBinding::HTMLMediaElementC use dom::bindings::codegen::Bindings::HTMLMediaElementBinding::HTMLMediaElementMethods; use dom::bindings::codegen::Bindings::MediaErrorBinding::MediaErrorConstants::*; use dom::bindings::codegen::Bindings::MediaErrorBinding::MediaErrorMethods; +use dom::bindings::codegen::InheritTypes::{ElementTypeId, HTMLElementTypeId}; +use dom::bindings::codegen::InheritTypes::{HTMLMediaElementTypeId, NodeTypeId}; use dom::bindings::inheritance::Castable; use dom::bindings::js::{MutNullableJS, Root}; use dom::bindings::refcounted::Trusted; @@ -20,10 +22,8 @@ use dom::bindings::str::DOMString; use dom::document::Document; use dom::element::{Element, AttributeMutation}; use dom::eventtarget::EventTarget; -use dom::htmlaudioelement::HTMLAudioElement; use dom::htmlelement::HTMLElement; use dom::htmlsourceelement::HTMLSourceElement; -use dom::htmlvideoelement::HTMLVideoElement; use dom::mediaerror::MediaError; use dom::node::{window_from_node, document_from_node, Node, UnbindContext}; use dom::virtualmethods::VirtualMethods; @@ -123,6 +123,17 @@ impl HTMLMediaElement { } } + fn media_type_id(&self) -> HTMLMediaElementTypeId { + match self.upcast::<Node>().type_id() { + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLMediaElement(media_type_id), + )) => { + media_type_id + }, + _ => unreachable!(), + } + } + /// https://html.spec.whatwg.org/multipage/#internal-pause-steps fn internal_pause_steps(&self) { // Step 1. @@ -397,71 +408,81 @@ impl HTMLMediaElement { // https://html.spec.whatwg.org/multipage/#concept-media-load-resource fn resource_fetch_algorithm(&self, resource: Resource) { - // TODO step 3 (remove text tracks) - - // Step 4 - if let Resource::Url(url) = resource { - // 4.1 - if self.Preload() == "none" && !self.autoplaying.get() { - // 4.1.1 - self.network_state.set(NetworkState::Idle); - - // 4.1.2 - let window = window_from_node(self); - window.dom_manipulation_task_source().queue_simple_event( - self.upcast(), - atom!("suspend"), - &window, - ); + // Steps 1-2. + // Unapplicable, the `resource` variable already conveys which mode + // is in use. - // TODO 4.1.3 (delay load flag) - - // TODO 4.1.5-7 (state for load that initiates later) - return; - } + // Step 3. + // FIXME(nox): Remove all media-resource-specific text tracks. - // 4.2 - let context = Arc::new(Mutex::new(HTMLMediaElementContext::new(self, url.clone()))); - let (action_sender, action_receiver) = ipc::channel().unwrap(); - let window = window_from_node(self); - let listener = NetworkListener { - context: context, - task_source: window.networking_task_source(), - canceller: Some(window.task_canceller()) - }; + // Step 4. + match resource { + Resource::Url(url) => { + // Step 4.remote.1. + if self.Preload() == "none" && !self.autoplaying.get() { + // Step 4.remote.1.1. + self.network_state.set(NetworkState::Idle); + + // Step 4.remote.1.2. + let window = window_from_node(self); + window.dom_manipulation_task_source().queue_simple_event( + self.upcast(), + atom!("suspend"), + &window, + ); - ROUTER.add_route(action_receiver.to_opaque(), box move |message| { - listener.notify_fetch(message.to().unwrap()); - }); + // Step 4.remote.1.3. + // FIXME(nox): Queue a task to set the delaying-the-load-event + // flag to false. - // FIXME: we're supposed to block the load event much earlier than now - let document = document_from_node(self); + // Steps 4.remote.1.4. + // FIXME(nox): Somehow we should wait for the task from previous + // step to be ran before continuing. - let ty = if self.is::<HTMLAudioElement>() { - RequestType::Audio - } else if self.is::<HTMLVideoElement>() { - RequestType::Video - } else { - unreachable!("Unexpected HTMLMediaElement") - }; + // Steps 4.remote.1.5-4.remote.1.7. + // FIXME(nox): Wait for an implementation-defined event and + // then continue with the normal set of steps instead of just + // returning. + return; + } - let request = RequestInit { - url: url.clone(), - type_: ty, - destination: Destination::Media, - credentials_mode: CredentialsMode::Include, - use_url_credentials: true, - origin: document.origin().immutable().clone(), - pipeline_id: Some(self.global().pipeline_id()), - referrer_url: Some(document.url()), - referrer_policy: document.get_referrer_policy(), - .. RequestInit::default() - }; + // Step 4.remote.2. + // FIXME(nox): Handle CORS setting from crossorigin attribute. + let document = document_from_node(self); + let type_ = match self.media_type_id() { + HTMLMediaElementTypeId::HTMLAudioElement => RequestType::Audio, + HTMLMediaElementTypeId::HTMLVideoElement => RequestType::Video, + }; + let request = RequestInit { + url: url.clone(), + type_, + destination: Destination::Media, + credentials_mode: CredentialsMode::Include, + use_url_credentials: true, + origin: document.origin().immutable().clone(), + pipeline_id: Some(self.global().pipeline_id()), + referrer_url: Some(document.url()), + referrer_policy: document.get_referrer_policy(), + .. RequestInit::default() + }; - document.fetch_async(LoadType::Media(url), request, action_sender); - } else { - // TODO local resource fetch - self.queue_dedicated_media_source_failure_steps(); + let context = Arc::new(Mutex::new(HTMLMediaElementContext::new(self, url.clone()))); + let (action_sender, action_receiver) = ipc::channel().unwrap(); + let window = window_from_node(self); + let listener = NetworkListener { + context: context, + task_source: window.networking_task_source(), + canceller: Some(window.task_canceller()) + }; + ROUTER.add_route(action_receiver.to_opaque(), box move |message| { + listener.notify_fetch(message.to().unwrap()); + }); + document.fetch_async(LoadType::Media(url), request, action_sender); + }, + Resource::Object => { + // FIXME(nox): Use the current media resource. + self.queue_dedicated_media_source_failure_steps(); + }, } } |