diff options
Diffstat (limited to 'components/script/layout_image.rs')
-rw-r--r-- | components/script/layout_image.rs | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/components/script/layout_image.rs b/components/script/layout_image.rs index 59dac86e784..e47218cffda 100644 --- a/components/script/layout_image.rs +++ b/components/script/layout_image.rs @@ -7,20 +7,28 @@ //! no guarantee that the responsible nodes will still exist in the future if the //! layout thread holds on to them during asynchronous operations. +use crate::dom::bindings::refcounted::Trusted; use crate::dom::bindings::reflector::DomObject; +use crate::dom::bindings::root::DomRoot; +use crate::dom::document::Document; +use crate::dom::globalscope::GlobalScope; use crate::dom::node::{document_from_node, Node}; -use crate::network_listener::{NetworkListener, PreInvoke}; +use crate::dom::performanceresourcetiming::InitiatorType; +use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener}; use ipc_channel::ipc; use ipc_channel::router::ROUTER; use net_traits::image_cache::{ImageCache, PendingImageId}; use net_traits::request::{Destination, RequestInit as FetchRequestInit}; use net_traits::{FetchMetadata, FetchResponseListener, FetchResponseMsg, NetworkError}; +use net_traits::{ResourceFetchTiming, ResourceTimingType}; use servo_url::ServoUrl; use std::sync::{Arc, Mutex}; struct LayoutImageContext { id: PendingImageId, cache: Arc<dyn ImageCache>, + resource_timing: ResourceFetchTiming, + doc: Trusted<Document>, } impl FetchResponseListener for LayoutImageContext { @@ -36,10 +44,35 @@ impl FetchResponseListener for LayoutImageContext { .notify_pending_response(self.id, FetchResponseMsg::ProcessResponseChunk(payload)); } - fn process_response_eof(&mut self, response: Result<(), NetworkError>) { + fn process_response_eof(&mut self, response: Result<ResourceFetchTiming, NetworkError>) { self.cache .notify_pending_response(self.id, FetchResponseMsg::ProcessResponseEOF(response)); } + + fn resource_timing_mut(&mut self) -> &mut ResourceFetchTiming { + &mut self.resource_timing + } + + fn resource_timing(&self) -> &ResourceFetchTiming { + &self.resource_timing + } + + fn submit_resource_timing(&mut self) { + network_listener::submit_timing(self) + } +} + +impl ResourceTimingListener for LayoutImageContext { + fn resource_timing_information(&self) -> (InitiatorType, ServoUrl) { + ( + InitiatorType::Other, + self.resource_timing_global().get_url().clone(), + ) + } + + fn resource_timing_global(&self) -> DomRoot<GlobalScope> { + self.doc.root().global() + } } impl PreInvoke for LayoutImageContext {} @@ -50,9 +83,13 @@ pub fn fetch_image_for_layout( id: PendingImageId, cache: Arc<dyn ImageCache>, ) { + let document = document_from_node(node); + let context = Arc::new(Mutex::new(LayoutImageContext { id: id, cache: cache, + resource_timing: ResourceFetchTiming::new(ResourceTimingType::Resource), + doc: Trusted::new(&document), })); let document = document_from_node(node); |