diff options
56 files changed, 673 insertions, 517 deletions
diff --git a/components/compositing/Cargo.toml b/components/compositing/Cargo.toml index a24069ab946..ff8082bcf1f 100644 --- a/components/compositing/Cargo.toml +++ b/components/compositing/Cargo.toml @@ -25,6 +25,9 @@ path = "../net" [dependencies.profile] path = "../profile" +[dependencies.net_traits] +path = "../net_traits" + [dependencies.util] path = "../util" diff --git a/components/compositing/constellation.rs b/components/compositing/constellation.rs index f5cf8d1a0c8..7485f21e5bf 100644 --- a/components/compositing/constellation.rs +++ b/components/compositing/constellation.rs @@ -20,9 +20,10 @@ use msg::constellation_msg::{IFrameSandboxState, MozBrowserEvent, NavigationDire use msg::constellation_msg::{Key, KeyState, KeyModifiers, LoadData}; use msg::constellation_msg::{SubpageId, WindowSizeData}; use msg::constellation_msg::{self, ConstellationChan, Failure}; -use net::image_cache_task::{ImageCacheTask, ImageCacheTaskClient}; -use net::resource_task::{self, ResourceTask}; -use net::storage_task::{StorageTask, StorageTaskMsg}; +use net::image_cache_task::ImageCacheTaskClient; +use net_traits::{self, ResourceTask}; +use net_traits::image_cache_task::ImageCacheTask; +use net_traits::storage_task::{StorageTask, StorageTaskMsg}; use profile::mem; use profile::time; use script_traits::{CompositorEvent, ConstellationControlMsg}; @@ -392,7 +393,7 @@ impl<LTF: LayoutTaskFactory, STF: ScriptTaskFactory> Constellation<LTF, STF> { pipeline.exit(PipelineExitType::Complete); } self.image_cache_task.exit(); - self.resource_task.send(resource_task::ControlMsg::Exit).unwrap(); + self.resource_task.send(net_traits::ControlMsg::Exit).unwrap(); self.devtools_chan.as_ref().map(|chan| { chan.send(DevtoolsControlMsg::ServerExitMsg).unwrap(); }); diff --git a/components/compositing/lib.rs b/components/compositing/lib.rs index 52095f36422..23f8f76d0ba 100644 --- a/components/compositing/lib.rs +++ b/components/compositing/lib.rs @@ -23,6 +23,7 @@ extern crate script_traits; extern crate msg; extern crate net; extern crate profile; +extern crate net_traits; #[macro_use] extern crate util; extern crate gleam; diff --git a/components/compositing/pipeline.rs b/components/compositing/pipeline.rs index 2bd4f7dd1cf..3b3a5d0a4f6 100644 --- a/components/compositing/pipeline.rs +++ b/components/compositing/pipeline.rs @@ -16,11 +16,11 @@ use gfx::font_cache_task::FontCacheTask; use layers::geometry::DevicePixel; use msg::constellation_msg::{ConstellationChan, Failure, FrameId, PipelineId, SubpageId}; use msg::constellation_msg::{LoadData, WindowSizeData, PipelineExitType, MozBrowserEvent}; -use net::image_cache_task::ImageCacheTask; -use net::resource_task::ResourceTask; -use net::storage_task::StorageTask; use profile::mem; use profile::time; +use net_traits::ResourceTask; +use net_traits::image_cache_task::ImageCacheTask; +use net_traits::storage_task::StorageTask; use std::sync::mpsc::{Receiver, channel}; use url::Url; use util::geometry::{PagePx, ViewportPx}; diff --git a/components/gfx/Cargo.toml b/components/gfx/Cargo.toml index b012c92b6d8..c78bda489d1 100644 --- a/components/gfx/Cargo.toml +++ b/components/gfx/Cargo.toml @@ -11,8 +11,8 @@ path = "lib.rs" [dependencies.plugins] path = "../plugins" -[dependencies.net] -path = "../net" +[dependencies.net_traits] +path = "../net_traits" [dependencies.util] path = "../util" diff --git a/components/gfx/display_list/mod.rs b/components/gfx/display_list/mod.rs index 995d01f1ff9..55af5c98a81 100644 --- a/components/gfx/display_list/mod.rs +++ b/components/gfx/display_list/mod.rs @@ -33,7 +33,7 @@ use geom::num::Zero; use libc::uintptr_t; use paint_task::PaintLayer; use msg::compositor_msg::LayerId; -use net::image::base::Image; +use net_traits::image::base::Image; use util::cursor::Cursor; use util::linked_list::prepend_from; use util::geometry::{self, Au, MAX_RECT, ZERO_RECT}; diff --git a/components/gfx/font_cache_task.rs b/components/gfx/font_cache_task.rs index e22fe434f85..b3332e2a2e4 100644 --- a/components/gfx/font_cache_task.rs +++ b/components/gfx/font_cache_task.rs @@ -10,7 +10,7 @@ use platform::font_context::FontContextHandle; use collections::str::Str; use font_template::{FontTemplate, FontTemplateDescriptor}; -use net::resource_task::{ResourceTask, load_whole_resource}; +use net_traits::{ResourceTask, load_whole_resource}; use platform::font_template::FontTemplateData; use std::borrow::ToOwned; use std::collections::HashMap; diff --git a/components/gfx/lib.rs b/components/gfx/lib.rs index e1183753d5e..9b4338c86fb 100644 --- a/components/gfx/lib.rs +++ b/components/gfx/lib.rs @@ -31,7 +31,7 @@ extern crate profile; extern crate script_traits; extern crate "rustc-serialize" as rustc_serialize; extern crate unicode; -extern crate net; +extern crate net_traits; #[macro_use] extern crate util; extern crate msg; diff --git a/components/gfx/paint_context.rs b/components/gfx/paint_context.rs index da15dc6b2ae..53bbe369b1b 100644 --- a/components/gfx/paint_context.rs +++ b/components/gfx/paint_context.rs @@ -29,7 +29,7 @@ use geom::rect::Rect; use geom::side_offsets::SideOffsets2D; use geom::size::Size2D; use libc::types::common::c99::{uint16_t, uint32_t}; -use net::image::base::Image; +use net_traits::image::base::Image; use png::PixelsByColorType; use std::default::Default; use std::f32; diff --git a/components/layout/Cargo.toml b/components/layout/Cargo.toml index 88f28089a3f..62a0e16ee65 100644 --- a/components/layout/Cargo.toml +++ b/components/layout/Cargo.toml @@ -34,8 +34,8 @@ path = "../style" [dependencies.plugins] path = "../plugins" -[dependencies.net] -path = "../net" +[dependencies.net_traits] +path = "../net_traits" [dependencies.profile] path = "../profile" diff --git a/components/layout/context.rs b/components/layout/context.rs index ae1c75e89e6..4d8f161f642 100644 --- a/components/layout/context.rs +++ b/components/layout/context.rs @@ -13,9 +13,9 @@ use gfx::display_list::OpaqueNode; use gfx::font_cache_task::FontCacheTask; use gfx::font_context::FontContext; use msg::constellation_msg::ConstellationChan; -use net::local_image_cache::LocalImageCache; use script::layout_interface::{Animation, LayoutChan}; use script_traits::UntrustedNodeAddress; +use net_traits::local_image_cache::LocalImageCache; use std::boxed; use std::cell::Cell; use std::ptr; diff --git a/components/layout/display_list_builder.rs b/components/layout/display_list_builder.rs index 7b890392c03..edef3c31521 100644 --- a/components/layout/display_list_builder.rs +++ b/components/layout/display_list_builder.rs @@ -36,7 +36,7 @@ use png::{self, PixelsByColorType}; use msg::compositor_msg::ScrollPolicy; use msg::constellation_msg::Msg as ConstellationMsg; use msg::constellation_msg::ConstellationChan; -use net::image::holder::ImageHolder; +use net_traits::image::holder::ImageHolder; use util::cursor::Cursor; use util::geometry::{self, Au, ZERO_POINT, to_px, to_frac_px}; use util::logical_geometry::{LogicalPoint, LogicalRect, LogicalSize, WritingMode}; diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index b1f43a26c86..14265aed4bc 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -30,8 +30,8 @@ use gfx::text::text_run::{TextRun, TextRunSlice}; use script_traits::UntrustedNodeAddress; use rustc_serialize::{Encodable, Encoder}; use msg::constellation_msg::{ConstellationChan, Msg, PipelineId, SubpageId}; -use net::image::holder::ImageHolder; -use net::local_image_cache::LocalImageCache; +use net_traits::image::holder::ImageHolder; +use net_traits::local_image_cache::LocalImageCache; use util::geometry::{self, Au, ZERO_POINT}; use util::logical_geometry::{LogicalRect, LogicalSize, LogicalMargin, WritingMode}; use util::range::*; diff --git a/components/layout/layout_task.rs b/components/layout/layout_task.rs index 5360e2f2fdb..a2f7b7ca81e 100644 --- a/components/layout/layout_task.rs +++ b/components/layout/layout_task.rs @@ -41,12 +41,12 @@ use log; use msg::compositor_msg::ScrollPolicy; use msg::constellation_msg::Msg as ConstellationMsg; use msg::constellation_msg::{ConstellationChan, Failure, PipelineExitType, PipelineId}; -use net::image_cache_task::{ImageCacheTask, ImageResponseMsg}; -use net::local_image_cache::{ImageResponder, LocalImageCache}; -use net::resource_task::{ResourceTask, load_bytes_iter}; use profile::mem::{self, Report, ReportsChan}; use profile::time::{self, ProfilerMetadata, profile}; use profile::time::{TimerMetadataFrameType, TimerMetadataReflowType}; +use net_traits::{load_bytes_iter, ResourceTask}; +use net_traits::image_cache_task::{ImageCacheTask, ImageResponseMsg}; +use net_traits::local_image_cache::{ImageResponder, LocalImageCache}; use script::dom::bindings::js::LayoutJS; use script::dom::node::{LayoutData, Node}; use script::layout_interface::{Animation, ContentBoxResponse, ContentBoxesResponse}; diff --git a/components/layout/lib.rs b/components/layout/lib.rs index 631844dd67c..7fbbb2d3576 100644 --- a/components/layout/lib.rs +++ b/components/layout/lib.rs @@ -30,7 +30,7 @@ extern crate bitflags; #[macro_use] #[no_link] extern crate "plugins" as servo_plugins; - +extern crate net_traits; #[macro_use] extern crate profile; @@ -50,7 +50,6 @@ extern crate gfx; extern crate layout_traits; extern crate libc; extern crate msg; -extern crate net; extern crate png; extern crate script; extern crate script_traits; diff --git a/components/layout_traits/Cargo.toml b/components/layout_traits/Cargo.toml index c099a8b3541..02df09b7f2b 100644 --- a/components/layout_traits/Cargo.toml +++ b/components/layout_traits/Cargo.toml @@ -16,8 +16,8 @@ path = "../script_traits" [dependencies.msg] path = "../msg" -[dependencies.net] -path = "../net" +[dependencies.net_traits] +path = "../net_traits" [dependencies.profile] path = "../profile" diff --git a/components/layout_traits/lib.rs b/components/layout_traits/lib.rs index 2b3d4957303..af1c4e03cd4 100644 --- a/components/layout_traits/lib.rs +++ b/components/layout_traits/lib.rs @@ -5,8 +5,8 @@ extern crate gfx; extern crate script_traits; extern crate msg; -extern crate net; extern crate profile; +extern crate net_traits; extern crate url; extern crate util; @@ -18,13 +18,13 @@ extern crate util; use gfx::font_cache_task::FontCacheTask; use gfx::paint_task::PaintChan; use msg::constellation_msg::{ConstellationChan, Failure, PipelineId, PipelineExitType}; -use net::image_cache_task::ImageCacheTask; -use net::resource_task::ResourceTask; use profile::mem; use profile::time; +use net_traits::ResourceTask; +use net_traits::image_cache_task::ImageCacheTask; +use url::Url; use script_traits::{ScriptControlChan, OpaqueScriptLayoutChannel}; use std::sync::mpsc::{Sender, Receiver}; -use url::Url; /// Messages sent to the layout task from the constellation pub enum LayoutControlMsg { diff --git a/components/net/Cargo.toml b/components/net/Cargo.toml index f98ec042b44..2f33836598c 100644 --- a/components/net/Cargo.toml +++ b/components/net/Cargo.toml @@ -10,6 +10,9 @@ path = "lib.rs" [dependencies.profile] path = "../profile" +[dependencies.net_traits] +path = "../net_traits" + [dependencies.util] path = "../util" @@ -19,9 +22,6 @@ git = "https://github.com/servo/rust-geom" [dependencies.png] git = "https://github.com/servo/rust-png" -[dependencies.stb_image] -git = "https://github.com/servo/rust-stb-image" - [dependencies] url = "0.2.16" time = "0.1.17" diff --git a/components/net/about_loader.rs b/components/net/about_loader.rs index 06dea8c7659..7f3b93d293e 100644 --- a/components/net/about_loader.rs +++ b/components/net/about_loader.rs @@ -2,8 +2,9 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use resource_task::{TargetedLoadResponse, Metadata, LoadData, start_sending, ResponseSenders}; -use resource_task::ProgressMsg::Done; +use net_traits::{LoadData, Metadata}; +use net_traits::ProgressMsg::Done; +use resource_task::{TargetedLoadResponse, start_sending, ResponseSenders}; use file_loader; use url::Url; diff --git a/components/net/cookie.rs b/components/net/cookie.rs index 3c56fe8bac6..cce566785d4 100644 --- a/components/net/cookie.rs +++ b/components/net/cookie.rs @@ -5,7 +5,7 @@ //! Implementation of cookie creation and matching as specified by //! http://tools.ietf.org/html/rfc6265 -use cookie_storage::CookieSource; +use net_traits::CookieSource; use pub_domains::PUB_DOMAINS; use cookie_rs; @@ -196,7 +196,7 @@ fn test_default_path() { #[test] fn fn_cookie_constructor() { - use cookie_storage::CookieSource; + use net_traits::CookieSource; let url = &Url::parse("http://example.com/foo").unwrap(); diff --git a/components/net/cookie_storage.rs b/components/net/cookie_storage.rs index 88c88f1a773..6af661ee60c 100644 --- a/components/net/cookie_storage.rs +++ b/components/net/cookie_storage.rs @@ -5,19 +5,11 @@ //! Implementation of cookie storage as specified in //! http://tools.ietf.org/html/rfc6265 +use net_traits::CookieSource; use url::Url; use cookie::Cookie; use std::cmp::Ordering; -/// The creator of a given cookie -#[derive(PartialEq, Copy)] -pub enum CookieSource { - /// An HTTP API - HTTP, - /// A non-HTTP API - NonHTTP, -} - pub struct CookieStorage { cookies: Vec<Cookie> } diff --git a/components/net/data_loader.rs b/components/net/data_loader.rs index 2b75d238053..a758ce33550 100644 --- a/components/net/data_loader.rs +++ b/components/net/data_loader.rs @@ -2,8 +2,9 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use resource_task::{Metadata, LoadData, TargetedLoadResponse, start_sending, ResponseSenders}; -use resource_task::ProgressMsg::{Payload, Done}; +use net_traits::{LoadData, Metadata}; +use net_traits::ProgressMsg::{Payload, Done}; +use resource_task::{TargetedLoadResponse, start_sending, ResponseSenders}; use rustc_serialize::base64::FromBase64; diff --git a/components/net/file_loader.rs b/components/net/file_loader.rs index c85f23d2d14..636c14f60e5 100644 --- a/components/net/file_loader.rs +++ b/components/net/file_loader.rs @@ -2,8 +2,9 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use resource_task::{ProgressMsg, Metadata, LoadData, start_sending, TargetedLoadResponse, ResponseSenders}; -use resource_task::ProgressMsg::{Payload, Done}; +use net_traits::{LoadData, Metadata, ProgressMsg}; +use net_traits::ProgressMsg::{Payload, Done}; +use resource_task::{start_sending, TargetedLoadResponse, ResponseSenders}; use std::borrow::ToOwned; use std::io; diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs index 57e65a02b58..2dadcdfa3d9 100644 --- a/components/net/http_loader.rs +++ b/components/net/http_loader.rs @@ -2,10 +2,10 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use cookie_storage::CookieSource; -use resource_task::{Metadata, TargetedLoadResponse, LoadData, start_sending_opt, ResponseSenders, ProgressMsg}; -use resource_task::ControlMsg; -use resource_task::ProgressMsg::{Payload, Done}; +use net_traits::{ControlMsg, CookieSource, LoadData, Metadata}; +use net_traits::ProgressMsg; +use net_traits::ProgressMsg::{Payload, Done}; +use resource_task::{TargetedLoadResponse, start_sending_opt, ResponseSenders}; use log; use std::collections::HashSet; @@ -38,7 +38,7 @@ pub fn factory(cookies_chan: Sender<ControlMsg>) } fn send_error(url: Url, err: String, senders: ResponseSenders) { - let mut metadata = Metadata::default(url); + let mut metadata: Metadata = Metadata::default(url); metadata.status = None; match start_sending_opt(senders, metadata) { @@ -283,7 +283,7 @@ reason: \"certificate verify failed\" }]"; if viewing_source { adjusted_headers.set(ContentType(Mime(TopLevel::Text, SubLevel::Plain, vec![]))); } - let mut metadata = Metadata::default(url); + let mut metadata: Metadata = Metadata::default(url); metadata.set_content_type(match adjusted_headers.get() { Some(&ContentType(ref mime)) => Some(mime), None => None diff --git a/components/net/image_cache_task.rs b/components/net/image_cache_task.rs index e881e80dd41..03ee5c8a52e 100644 --- a/components/net/image_cache_task.rs +++ b/components/net/image_cache_task.rs @@ -2,82 +2,36 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use image::base::{Image, load_from_memory}; -use resource_task; -use resource_task::{LoadData, ResourceTask}; -use resource_task::ProgressMsg::{Payload, Done}; - +use net_traits::ResourceTask; +use net_traits::image::base::{Image, load_from_memory}; +use net_traits::image_cache_task::{ImageResponseMsg, ImageCacheTask, Msg}; +use net_traits::image_cache_task::{load_image_data}; use profile::time::{self, profile}; +use url::Url; + use std::borrow::ToOwned; use std::collections::HashMap; use std::collections::hash_map::Entry::{Occupied, Vacant}; use std::mem::replace; use std::sync::{Arc, Mutex}; use std::sync::mpsc::{channel, Receiver, Sender}; -use url::Url; use util::resource_files::resources_dir_path; use util::task::spawn_named; use util::taskpool::TaskPool; -pub enum Msg { - /// Tell the cache that we may need a particular image soon. Must be posted - /// before Decode - Prefetch(Url), - - /// Tell the cache to decode an image. Must be posted before GetImage/WaitForImage - Decode(Url), - - /// Request an Image object for a URL. If the image is not is not immediately - /// available then ImageNotReady is returned. - GetImage(Url, Sender<ImageResponseMsg>), - - /// Wait for an image to become available (or fail to load). - WaitForImage(Url, Sender<ImageResponseMsg>), - - /// Clients must wait for a response before shutting down the ResourceTask - Exit(Sender<()>), - - /// Used by the prefetch tasks to post back image binaries - StorePrefetchedImageData(Url, Result<Vec<u8>, ()>), - - /// Used by the decoder tasks to post decoded images back to the cache - StoreImage(Url, Option<Arc<Box<Image>>>), - - /// For testing - WaitForStore(Sender<()>), - - /// For testing - WaitForStorePrefetched(Sender<()>), -} - -#[derive(Clone)] -pub enum ImageResponseMsg { - ImageReady(Arc<Box<Image>>), - ImageNotReady, - ImageFailed -} - -impl PartialEq for ImageResponseMsg { - fn eq(&self, other: &ImageResponseMsg) -> bool { - match (self, other) { - (&ImageResponseMsg::ImageReady(..), &ImageResponseMsg::ImageReady(..)) => panic!("unimplemented comparison"), - (&ImageResponseMsg::ImageNotReady, &ImageResponseMsg::ImageNotReady) => true, - (&ImageResponseMsg::ImageFailed, &ImageResponseMsg::ImageFailed) => true, - - (&ImageResponseMsg::ImageReady(..), _) | (&ImageResponseMsg::ImageNotReady, _) | (&ImageResponseMsg::ImageFailed, _) => false - } - } -} - -#[derive(Clone)] -pub struct ImageCacheTask { - chan: Sender<Msg>, +pub trait ImageCacheTaskFactory { + fn new(resource_task: ResourceTask, task_pool: TaskPool, + time_profiler_chan: time::ProfilerChan, + load_placeholder: LoadPlaceholder) -> Self; + fn new_sync(resource_task: ResourceTask, task_pool: TaskPool, + time_profiler_chan: time::ProfilerChan, + load_placeholder: LoadPlaceholder) -> Self; } -impl ImageCacheTask { - pub fn new(resource_task: ResourceTask, task_pool: TaskPool, - time_profiler_chan: time::ProfilerChan, - load_placeholder: LoadPlaceholder) -> ImageCacheTask { +impl ImageCacheTaskFactory for ImageCacheTask { + fn new(resource_task: ResourceTask, task_pool: TaskPool, + time_profiler_chan: time::ProfilerChan, + load_placeholder: LoadPlaceholder) -> ImageCacheTask { let (chan, port) = channel(); let chan_clone = chan.clone(); @@ -101,14 +55,14 @@ impl ImageCacheTask { } } - pub fn new_sync(resource_task: ResourceTask, task_pool: TaskPool, - time_profiler_chan: time::ProfilerChan, - load_placeholder: LoadPlaceholder) -> ImageCacheTask { + fn new_sync(resource_task: ResourceTask, task_pool: TaskPool, + time_profiler_chan: time::ProfilerChan, + load_placeholder: LoadPlaceholder) -> ImageCacheTask { let (chan, port) = channel(); spawn_named("ImageCacheTask (sync)".to_owned(), move || { - let inner_cache = ImageCacheTask::new(resource_task, task_pool, - time_profiler_chan, load_placeholder); + let inner_cache: ImageCacheTask = ImageCacheTaskFactory::new(resource_task, task_pool, + time_profiler_chan, load_placeholder); loop { let msg: Msg = port.recv().unwrap(); @@ -387,7 +341,6 @@ impl ImageCache { panic!("incorrect state in store_image") } } - } fn purge_waiters<F>(&mut self, url: Url, f: F) where F: Fn() -> ImageResponseMsg { @@ -440,10 +393,8 @@ impl ImageCache { } } } - } - pub trait ImageCacheTaskClient { fn exit(&self); } @@ -456,61 +407,6 @@ impl ImageCacheTaskClient for ImageCacheTask { } } -impl ImageCacheTask { - pub fn send(&self, msg: Msg) { - self.chan.send(msg).unwrap(); - } - - #[cfg(test)] - fn wait_for_store(&self) -> Receiver<()> { - let (chan, port) = channel(); - self.send(Msg::WaitForStore(chan)); - port - } - - #[cfg(test)] - fn wait_for_store_prefetched(&self) -> Receiver<()> { - let (chan, port) = channel(); - self.send(Msg::WaitForStorePrefetched(chan)); - port - } -} - -fn load_image_data(url: Url, resource_task: ResourceTask, placeholder: &[u8]) -> Result<Vec<u8>, ()> { - let (response_chan, response_port) = channel(); - resource_task.send(resource_task::ControlMsg::Load(LoadData::new(url.clone(), response_chan))).unwrap(); - - let mut image_data = vec!(); - - let progress_port = response_port.recv().unwrap().progress_port; - loop { - match progress_port.recv().unwrap() { - Payload(data) => { - image_data.push_all(&data); - } - Done(Ok(..)) => { - return Ok(image_data); - } - Done(Err(..)) => { - // Failure to load the requested image will return the - // placeholder instead. In case it failed to load at init(), - // we still recover and return Err() but nothing will be drawn. - if placeholder.len() != 0 { - debug!("image_cache_task: failed to load {:?}, use placeholder instead.", url); - // Clean in case there was an error after started loading the image. - image_data.clear(); - image_data.push_all(&placeholder); - return Ok(image_data); - } else { - debug!("image_cache_task: invalid placeholder."); - return Err(()); - } - } - } - } -} - - pub fn spawn_listener<F, A>(f: F) -> Sender<A> where F: FnOnce(Receiver<A>) + Send + 'static, A: Send + 'static @@ -529,21 +425,46 @@ pub fn spawn_listener<F, A>(f: F) -> Sender<A> #[cfg(test)] mod tests { use super::*; - use super::ImageResponseMsg::*; - use super::Msg::*; + use net_traits::image_cache_task::ImageResponseMsg::*; + use net_traits::image_cache_task::Msg::*; - use resource_task; - use resource_task::{ResourceTask, Metadata, start_sending, ResponseSenders}; - use resource_task::ProgressMsg::{Payload, Done}; + use resource_task::{start_sending, ResponseSenders}; + use net_traits::{ControlMsg, Metadata, ProgressMsg, ResourceTask}; + use net_traits::image_cache_task::{ImageCacheTask, ImageResponseMsg, Msg}; + use net_traits::ProgressMsg::{Payload, Done}; use sniffer_task; - use image::base::test_image_bin; use profile::time; use std::sync::mpsc::{Sender, channel, Receiver}; use url::Url; use util::taskpool::TaskPool; + static TEST_IMAGE: &'static [u8] = include_bytes!("test.jpeg"); + + pub fn test_image_bin() -> Vec<u8> { + TEST_IMAGE.iter().map(|&x| x).collect() + } + + trait ImageCacheTaskHelper { + fn wait_for_store(&self) -> Receiver<()>; + fn wait_for_store_prefetched(&self) -> Receiver<()>; + } + + impl ImageCacheTaskHelper for ImageCacheTask { + fn wait_for_store(&self) -> Receiver<()> { + let (chan, port) = channel(); + self.send(Msg::WaitForStore(chan)); + port + } + + fn wait_for_store_prefetched(&self) -> Receiver<()> { + let (chan, port) = channel(); + self.send(Msg::WaitForStorePrefetched(chan)); + port + } + } + trait Closure { - fn invoke(&self, _response: Sender<resource_task::ProgressMsg>) { } + fn invoke(&self, _response: Sender<ProgressMsg>) { } } struct DoesNothing; impl Closure for DoesNothing { } @@ -552,7 +473,7 @@ mod tests { url_requested_chan: Sender<()>, } impl Closure for JustSendOK { - fn invoke(&self, response: Sender<resource_task::ProgressMsg>) { + fn invoke(&self, response: Sender<ProgressMsg>) { self.url_requested_chan.send(()); response.send(Done(Ok(()))); } @@ -560,7 +481,7 @@ mod tests { struct SendTestImage; impl Closure for SendTestImage { - fn invoke(&self, response: Sender<resource_task::ProgressMsg>) { + fn invoke(&self, response: Sender<ProgressMsg>) { response.send(Payload(test_image_bin())); response.send(Done(Ok(()))); } @@ -568,7 +489,7 @@ mod tests { struct SendBogusImage; impl Closure for SendBogusImage { - fn invoke(&self, response: Sender<resource_task::ProgressMsg>) { + fn invoke(&self, response: Sender<ProgressMsg>) { response.send(Payload(vec!())); response.send(Done(Ok(()))); } @@ -576,7 +497,7 @@ mod tests { struct SendTestImageErr; impl Closure for SendTestImageErr { - fn invoke(&self, response: Sender<resource_task::ProgressMsg>) { + fn invoke(&self, response: Sender<ProgressMsg>) { response.send(Payload(test_image_bin())); response.send(Done(Err("".to_string()))); } @@ -586,7 +507,7 @@ mod tests { wait_port: Receiver<()>, } impl Closure for WaitSendTestImage { - fn invoke(&self, response: Sender<resource_task::ProgressMsg>) { + fn invoke(&self, response: Sender<ProgressMsg>) { // Don't send the data until after the client requests // the image self.wait_port.recv().unwrap(); @@ -599,7 +520,7 @@ mod tests { wait_port: Receiver<()>, } impl Closure for WaitSendTestImageErr { - fn invoke(&self, response: Sender<resource_task::ProgressMsg>) { + fn invoke(&self, response: Sender<ProgressMsg>) { // Don't send the data until after the client requests // the image self.wait_port.recv().unwrap(); @@ -609,10 +530,10 @@ mod tests { } fn mock_resource_task<T: Closure + Send + 'static>(on_load: Box<T>) -> ResourceTask { - spawn_listener(move |port: Receiver<resource_task::ControlMsg>| { + spawn_listener(move |port: Receiver<ControlMsg>| { loop { match port.recv().unwrap() { - resource_task::ControlMsg::Load(response) => { + ControlMsg::Load(response) => { let sniffer_task = sniffer_task::new_sniffer_task(); let senders = ResponseSenders { immediate_consumer: sniffer_task, @@ -622,7 +543,7 @@ mod tests { Url::parse("file:///fake").unwrap())); on_load.invoke(chan); } - resource_task::ControlMsg::Exit => break, + ControlMsg::Exit => break, _ => {} } } @@ -637,10 +558,12 @@ mod tests { fn should_exit_on_request() { let mock_resource_task = mock_resource_task(box DoesNothing); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Ignore); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Ignore); image_cache_task.exit(); - mock_resource_task.send(resource_task::ControlMsg::Exit); + mock_resource_task.send(ControlMsg::Exit); } #[test] @@ -648,7 +571,9 @@ mod tests { fn should_panic_if_unprefetched_image_is_requested() { let mock_resource_task = mock_resource_task(box DoesNothing); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Preload); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Preload); let url = Url::parse("file:///").unwrap(); let (chan, port) = channel(); @@ -662,13 +587,15 @@ mod tests { let mock_resource_task = mock_resource_task(box JustSendOK { url_requested_chan: url_requested_chan}); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Preload); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Preload); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url)); url_requested.recv().unwrap(); image_cache_task.exit(); - mock_resource_task.send(resource_task::ControlMsg::Exit); + mock_resource_task.send(ControlMsg::Exit); } #[test] @@ -677,14 +604,16 @@ mod tests { let mock_resource_task = mock_resource_task(box JustSendOK { url_requested_chan: url_requested_chan}); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Ignore); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Ignore); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url.clone())); image_cache_task.send(Prefetch(url)); url_requested.recv().unwrap(); image_cache_task.exit(); - mock_resource_task.send(resource_task::ControlMsg::Exit); + mock_resource_task.send(ControlMsg::Exit); match url_requested.try_recv() { Err(_) => (), Ok(_) => panic!(), @@ -697,7 +626,9 @@ mod tests { let mock_resource_task = mock_resource_task(box WaitSendTestImage{wait_port: wait_port}); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Ignore); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Ignore); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url.clone())); @@ -707,14 +638,16 @@ mod tests { assert!(response_port.recv().unwrap() == ImageResponseMsg::ImageNotReady); wait_chan.send(()); image_cache_task.exit(); - mock_resource_task.send(resource_task::ControlMsg::Exit); + mock_resource_task.send(ControlMsg::Exit); } #[test] fn should_return_decoded_image_data_if_data_has_arrived() { let mock_resource_task = mock_resource_task(box SendTestImage); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Preload); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Preload); let url = Url::parse("file:///").unwrap(); let join_port = image_cache_task.wait_for_store(); @@ -733,14 +666,16 @@ mod tests { } image_cache_task.exit(); - mock_resource_task.send(resource_task::ControlMsg::Exit); + mock_resource_task.send(ControlMsg::Exit); } #[test] fn should_return_decoded_image_data_for_multiple_requests() { let mock_resource_task = mock_resource_task(box SendTestImage); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Preload); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Preload); let url = Url::parse("file:///").unwrap(); let join_port = image_cache_task.wait_for_store(); @@ -761,7 +696,7 @@ mod tests { } image_cache_task.exit(); - mock_resource_task.send(resource_task::ControlMsg::Exit); + mock_resource_task.send(ControlMsg::Exit); } #[test] @@ -770,10 +705,10 @@ mod tests { let (resource_task_exited_chan, resource_task_exited) = channel(); - let mock_resource_task = spawn_listener(move |port: Receiver<resource_task::ControlMsg>| { + let mock_resource_task = spawn_listener(move |port: Receiver<ControlMsg>| { loop { match port.recv().unwrap() { - resource_task::ControlMsg::Load(response) => { + ControlMsg::Load(response) => { let sniffer_task = sniffer_task::new_sniffer_task(); let senders = ResponseSenders { immediate_consumer: sniffer_task, @@ -785,7 +720,7 @@ mod tests { chan.send(Done(Ok(()))); image_bin_sent_chan.send(()); } - resource_task::ControlMsg::Exit => { + ControlMsg::Exit => { resource_task_exited_chan.send(()); break } @@ -794,7 +729,9 @@ mod tests { } }); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Ignore); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Ignore); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url.clone())); @@ -805,7 +742,7 @@ mod tests { image_cache_task.send(Prefetch(url.clone())); image_cache_task.exit(); - mock_resource_task.send(resource_task::ControlMsg::Exit); + mock_resource_task.send(ControlMsg::Exit); resource_task_exited.recv().unwrap(); @@ -822,10 +759,10 @@ mod tests { let (image_bin_sent_chan, image_bin_sent) = channel(); let (resource_task_exited_chan, resource_task_exited) = channel(); - let mock_resource_task = spawn_listener(move |port: Receiver<resource_task::ControlMsg>| { + let mock_resource_task = spawn_listener(move |port: Receiver<ControlMsg>| { loop { match port.recv().unwrap() { - resource_task::ControlMsg::Load(response) => { + ControlMsg::Load(response) => { let sniffer_task = sniffer_task::new_sniffer_task(); let senders = ResponseSenders { immediate_consumer: sniffer_task, @@ -837,7 +774,7 @@ mod tests { chan.send(Done(Err("".to_string()))); image_bin_sent_chan.send(()); } - resource_task::ControlMsg::Exit => { + ControlMsg::Exit => { resource_task_exited_chan.send(()); break } @@ -846,7 +783,9 @@ mod tests { } }); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Ignore); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Ignore); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url.clone())); @@ -859,7 +798,7 @@ mod tests { image_cache_task.send(Decode(url.clone())); image_cache_task.exit(); - mock_resource_task.send(resource_task::ControlMsg::Exit); + mock_resource_task.send(ControlMsg::Exit); resource_task_exited.recv().unwrap(); @@ -875,7 +814,9 @@ mod tests { fn should_return_failed_if_image_bin_cannot_be_fetched() { let mock_resource_task = mock_resource_task(box SendTestImageErr); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Preload); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Preload); let url = Url::parse("file:///").unwrap(); let join_port = image_cache_task.wait_for_store_prefetched(); @@ -894,14 +835,16 @@ mod tests { } image_cache_task.exit(); - mock_resource_task.send(resource_task::ControlMsg::Exit); + mock_resource_task.send(ControlMsg::Exit); } #[test] fn should_return_failed_for_multiple_get_image_requests_if_image_bin_cannot_be_fetched() { let mock_resource_task = mock_resource_task(box SendTestImageErr); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Preload); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Preload); let url = Url::parse("file:///").unwrap(); let join_port = image_cache_task.wait_for_store_prefetched(); @@ -928,14 +871,16 @@ mod tests { } image_cache_task.exit(); - mock_resource_task.send(resource_task::ControlMsg::Exit); + mock_resource_task.send(ControlMsg::Exit); } #[test] fn should_return_failed_if_image_decode_fails() { let mock_resource_task = mock_resource_task(box SendBogusImage); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Preload); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Preload); let url = Url::parse("file:///").unwrap(); let join_port = image_cache_task.wait_for_store(); @@ -956,14 +901,16 @@ mod tests { } image_cache_task.exit(); - mock_resource_task.send(resource_task::ControlMsg::Exit); + mock_resource_task.send(ControlMsg::Exit); } #[test] fn should_return_image_on_wait_if_image_is_already_loaded() { let mock_resource_task = mock_resource_task(box SendTestImage); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Preload); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Preload); let url = Url::parse("file:///").unwrap(); let join_port = image_cache_task.wait_for_store(); @@ -982,7 +929,7 @@ mod tests { } image_cache_task.exit(); - mock_resource_task.send(resource_task::ControlMsg::Exit); + mock_resource_task.send(ControlMsg::Exit); } #[test] @@ -991,7 +938,9 @@ mod tests { let mock_resource_task = mock_resource_task(box WaitSendTestImage {wait_port: wait_port}); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Ignore); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Ignore); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url.clone())); @@ -1008,7 +957,7 @@ mod tests { } image_cache_task.exit(); - mock_resource_task.send(resource_task::ControlMsg::Exit); + mock_resource_task.send(ControlMsg::Exit); } #[test] @@ -1017,7 +966,9 @@ mod tests { let mock_resource_task = mock_resource_task(box WaitSendTestImageErr{wait_port: wait_port}); - let image_cache_task = ImageCacheTask::new(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Ignore); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Ignore); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url.clone())); @@ -1034,14 +985,16 @@ mod tests { } image_cache_task.exit(); - mock_resource_task.send(resource_task::ControlMsg::Exit); + mock_resource_task.send(ControlMsg::Exit); } #[test] fn sync_cache_should_wait_for_images() { let mock_resource_task = mock_resource_task(box SendTestImage); - let image_cache_task = ImageCacheTask::new_sync(mock_resource_task.clone(), TaskPool::new(4), profiler(), LoadPlaceholder::Preload); + let image_cache_task: ImageCacheTask = ImageCacheTaskFactory::new_sync(mock_resource_task.clone(), + TaskPool::new(4), profiler(), + LoadPlaceholder::Preload); let url = Url::parse("file:///").unwrap(); image_cache_task.send(Prefetch(url.clone())); @@ -1055,6 +1008,6 @@ mod tests { } image_cache_task.exit(); - mock_resource_task.send(resource_task::ControlMsg::Exit); + mock_resource_task.send(ControlMsg::Exit); } } diff --git a/components/net/lib.rs b/components/net/lib.rs index 4ebb5ef092c..46b123630d8 100644 --- a/components/net/lib.rs +++ b/components/net/lib.rs @@ -18,6 +18,7 @@ #![plugin(regex_macros)] +extern crate net_traits; extern crate "cookie" as cookie_rs; extern crate collections; extern crate flate2; @@ -30,22 +31,11 @@ extern crate openssl; extern crate profile; extern crate "rustc-serialize" as rustc_serialize; extern crate util; -extern crate stb_image; extern crate time; extern crate url; extern crate regex; -/// Image handling. -/// -/// It may be surprising that this goes in the network crate as opposed to the graphics crate. -/// However, image handling is generally very integrated with the network stack (especially where -/// caching is involved) and as a result it must live in here. -pub mod image { - pub mod base; - pub mod holder; -} - pub mod about_loader; pub mod file_loader; pub mod http_loader; @@ -53,7 +43,6 @@ pub mod data_loader; pub mod cookie; pub mod cookie_storage; pub mod image_cache_task; -pub mod local_image_cache; pub mod pub_domains; pub mod resource_task; pub mod storage_task; diff --git a/components/net/resource_task.rs b/components/net/resource_task.rs index 8266bca3fea..2865a03f657 100644 --- a/components/net/resource_task.rs +++ b/components/net/resource_task.rs @@ -10,19 +10,20 @@ use file_loader; use http_loader; use sniffer_task; use sniffer_task::SnifferTask; -use cookie_storage::{CookieStorage, CookieSource}; +use cookie_storage::CookieStorage; use cookie; +use net_traits::{ControlMsg, LoadData, LoadResponse}; +use net_traits::{Metadata, ProgressMsg, ResourceTask}; +use net_traits::ProgressMsg::Done; use util::task::spawn_named; use hyper::header::UserAgent; -use hyper::header::{Headers, Header, SetCookie}; -use hyper::http::RawStatus; -use hyper::method::Method; -use hyper::mime::{Mime, Attr}; +use hyper::header::{Header, SetCookie}; +#[cfg(test)] use url::Url; -use std::borrow::{ToOwned, IntoCow}; +use std::borrow::ToOwned; use std::boxed; use std::collections::HashMap; use std::env; @@ -57,110 +58,6 @@ pub fn global_init() { } } -pub enum ControlMsg { - /// Request the data associated with a particular URL - Load(LoadData), - /// Store a set of cookies for a given originating URL - SetCookiesForUrl(Url, String, CookieSource), - /// Retrieve the stored cookies for a given URL - GetCookiesForUrl(Url, Sender<Option<String>>, CookieSource), - Exit -} - -#[derive(Clone)] -pub struct LoadData { - pub url: Url, - pub method: Method, - /// Headers that will apply to the initial request only - pub headers: Headers, - /// Headers that will apply to the initial request and any redirects - pub preserved_headers: Headers, - pub data: Option<Vec<u8>>, - pub cors: Option<ResourceCORSData>, - pub consumer: Sender<LoadResponse>, -} - -impl LoadData { - pub fn new(url: Url, consumer: Sender<LoadResponse>) -> LoadData { - LoadData { - url: url, - method: Method::Get, - headers: Headers::new(), - preserved_headers: Headers::new(), - data: None, - cors: None, - consumer: consumer, - } - } -} - -#[derive(Clone)] -pub struct ResourceCORSData { - /// CORS Preflight flag - pub preflight: bool, - /// Origin of CORS Request - pub origin: Url -} - -/// Metadata about a loaded resource, such as is obtained from HTTP headers. -#[derive(Clone)] -pub struct Metadata { - /// Final URL after redirects. - pub final_url: Url, - - /// MIME type / subtype. - pub content_type: Option<(String, String)>, - - /// Character set. - pub charset: Option<String>, - - /// Headers - pub headers: Option<Headers>, - - /// HTTP Status - pub status: Option<RawStatus>, -} - -impl Metadata { - /// Metadata with defaults for everything optional. - pub fn default(url: Url) -> Metadata { - Metadata { - final_url: url, - content_type: None, - charset: None, - headers: None, - // http://fetch.spec.whatwg.org/#concept-response-status-message - status: Some(RawStatus(200, "OK".into_cow())), - } - } - - /// Extract the parts of a Mime that we care about. - pub fn set_content_type(&mut self, content_type: Option<&Mime>) { - match content_type { - None => (), - Some(&Mime(ref type_, ref subtype, ref parameters)) => { - self.content_type = Some((type_.to_string(), subtype.to_string())); - for &(ref k, ref v) in parameters.iter() { - if &Attr::Charset == k { - self.charset = Some(v.to_string()); - } - } - } - } - } -} - -/// Message sent in response to `Load`. Contains metadata, and a port -/// for receiving the data. -/// -/// Even if loading fails immediately, we send one of these and the -/// progress_port will provide the error. -pub struct LoadResponse { - /// Metadata, such as from HTTP headers. - pub metadata: Metadata, - /// Port for reading data. - pub progress_port: Receiver<ProgressMsg>, -} /// A LoadResponse directed at a particular consumer pub struct TargetedLoadResponse { pub load_response: LoadResponse, @@ -173,15 +70,6 @@ pub struct ResponseSenders { pub eventual_consumer: Sender<LoadResponse>, } -/// Messages sent in response to a `Load` message -#[derive(PartialEq,Debug)] -pub enum ProgressMsg { - /// Binary data - there may be multiple of these - Payload(Vec<u8>), - /// Indicates loading is complete, either successfully or not - Done(Result<(), String>) -} - /// For use by loaders in responding to a Load message. pub fn start_sending(senders: ResponseSenders, metadata: Metadata) -> Sender<ProgressMsg> { start_sending_opt(senders, metadata).ok().unwrap() @@ -203,26 +91,6 @@ pub fn start_sending_opt(senders: ResponseSenders, metadata: Metadata) -> Result } } -/// Convenience function for synchronously loading a whole resource. -pub fn load_whole_resource(resource_task: &ResourceTask, url: Url) - -> Result<(Metadata, Vec<u8>), String> { - let (start_chan, start_port) = channel(); - resource_task.send(ControlMsg::Load(LoadData::new(url, start_chan))).unwrap(); - let response = start_port.recv().unwrap(); - - let mut buf = vec!(); - loop { - match response.progress_port.recv().unwrap() { - ProgressMsg::Payload(data) => buf.push_all(&data), - ProgressMsg::Done(Ok(())) => return Ok((response.metadata, buf)), - ProgressMsg::Done(Err(e)) => return Err(e) - } - } -} - -/// Handle to a resource task -pub type ResourceTask = Sender<ControlMsg>; - /// Create a ResourceTask pub fn new_resource_task(user_agent: Option<String>) -> ResourceTask { let (setup_chan, setup_port) = channel(); @@ -355,36 +223,6 @@ impl ResourceManager { } } -/// Load a URL asynchronously and iterate over chunks of bytes from the response. -pub fn load_bytes_iter(resource_task: &ResourceTask, url: Url) -> (Metadata, ProgressMsgPortIterator) { - let (input_chan, input_port) = channel(); - resource_task.send(ControlMsg::Load(LoadData::new(url, input_chan))).unwrap(); - - let response = input_port.recv().unwrap(); - let iter = ProgressMsgPortIterator { progress_port: response.progress_port }; - (response.metadata, iter) -} - -/// Iterator that reads chunks of bytes from a ProgressMsg port -pub struct ProgressMsgPortIterator { - progress_port: Receiver<ProgressMsg> -} - -impl Iterator for ProgressMsgPortIterator { - type Item = Vec<u8>; - - fn next(&mut self) -> Option<Vec<u8>> { - match self.progress_port.recv().unwrap() { - ProgressMsg::Payload(data) => Some(data), - ProgressMsg::Done(Ok(())) => None, - ProgressMsg::Done(Err(e)) => { - error!("error receiving bytes: {}", e); - None - } - } - } -} - #[test] fn test_exit() { let resource_task = new_resource_task(None); diff --git a/components/net/storage_task.rs b/components/net/storage_task.rs index 4533a364f6a..215d451a9ab 100644 --- a/components/net/storage_task.rs +++ b/components/net/storage_task.rs @@ -3,48 +3,15 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use std::borrow::ToOwned; -use std::collections::HashMap; use std::collections::BTreeMap; +use std::collections::HashMap; use std::sync::mpsc::{channel, Receiver, Sender}; use url::Url; +use net_traits::storage_task::{StorageTask, StorageTaskMsg, StorageType}; use util::str::DOMString; use util::task::spawn_named; -#[derive(Copy)] -pub enum StorageType { - Session, - Local -} - -/// Request operations on the storage data associated with a particular url -pub enum StorageTaskMsg { - /// gets the number of key/value pairs present in the associated storage data - Length(Sender<u32>, Url, StorageType), - - /// gets the name of the key at the specified index in the associated storage data - Key(Sender<Option<DOMString>>, Url, StorageType, u32), - - /// gets the value associated with the given key in the associated storage data - GetItem(Sender<Option<DOMString>>, Url, StorageType, DOMString), - - /// sets the value of the given key in the associated storage data - /// TODO throw QuotaExceededError in case of error - SetItem(Sender<(bool, Option<DOMString>)>, Url, StorageType, DOMString, DOMString), - - /// removes the key/value pair for the given key in the associated storage data - RemoveItem(Sender<Option<DOMString>>, Url, StorageType, DOMString), - - /// clears the associated storage data by removing all the key/value pairs - Clear(Sender<bool>, Url, StorageType), - - /// shut down this task - Exit -} - -/// Handle to a storage task -pub type StorageTask = Sender<StorageTaskMsg>; - pub trait StorageTaskFactory { fn new() -> Self; } diff --git a/components/net/image/test.jpeg b/components/net/test.jpeg Binary files differindex 1a0bdb7acd1..1a0bdb7acd1 100644 --- a/components/net/image/test.jpeg +++ b/components/net/test.jpeg diff --git a/components/net_traits/Cargo.toml b/components/net_traits/Cargo.toml new file mode 100644 index 00000000000..f75b04eff49 --- /dev/null +++ b/components/net_traits/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "net_traits" +version = "0.0.1" +authors = ["The Servo Project Developers"] + +[lib] +name = "net_traits" +path = "lib.rs" + +[dependencies.geom] +git = "https://github.com/servo/rust-geom" + +[dependencies.png] +git = "https://github.com/servo/rust-png" + +[dependencies.profile] +path = "../profile" + +[dependencies.util] +path = "../util" + +[dependencies.stb_image] +git = "https://github.com/servo/rust-stb-image" + +[dependencies] +url = "0.2.16" +hyper = "0.3" diff --git a/components/net/image/base.rs b/components/net_traits/image/base.rs index 46436ef8406..ba86b94d2ff 100644 --- a/components/net/image/base.rs +++ b/components/net_traits/image/base.rs @@ -2,22 +2,15 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use std::iter::range_step; -use stb_image::image as stb_image; use png; +use stb_image::image as stb_image2; +use std::iter::range_step; use util::vec::byte_swap; // FIXME: Images must not be copied every frame. Instead we should atomically // reference count them. pub type Image = png::Image; - -static TEST_IMAGE: &'static [u8] = include_bytes!("test.jpeg"); - -pub fn test_image_bin() -> Vec<u8> { - TEST_IMAGE.iter().map(|&x| x).collect() -} - // TODO(pcwalton): Speed up with SIMD, or better yet, find some way to not do this. fn byte_swap_and_premultiply(data: &mut [u8]) { let length = data.len(); @@ -56,8 +49,8 @@ pub fn load_from_memory(buffer: &[u8]) -> Option<Image> { // Can't remember why we do this. Maybe it's what cairo wants static FORCE_DEPTH: uint = 4; - match stb_image::load_from_memory_with_depth(buffer, FORCE_DEPTH, true) { - stb_image::LoadResult::ImageU8(mut image) => { + match stb_image2::load_from_memory_with_depth(buffer, FORCE_DEPTH, true) { + stb_image2::LoadResult::ImageU8(mut image) => { assert!(image.depth == 4); // handle gif separately because the alpha-channel has to be premultiplied if is_gif(buffer) { @@ -71,11 +64,11 @@ pub fn load_from_memory(buffer: &[u8]) -> Option<Image> { pixels: png::PixelsByColorType::RGBA8(image.data) }) } - stb_image::LoadResult::ImageF32(_image) => { + stb_image2::LoadResult::ImageF32(_image) => { error!("HDR images not implemented"); None } - stb_image::LoadResult::Error(e) => { + stb_image2::LoadResult::Error(e) => { error!("stb_image failed: {}", e); None } @@ -89,3 +82,5 @@ fn is_gif(buffer: &[u8]) -> bool { _ => false } } + + diff --git a/components/net/image/holder.rs b/components/net_traits/image/holder.rs index 80b5ab5ea14..80b5ab5ea14 100644 --- a/components/net/image/holder.rs +++ b/components/net_traits/image/holder.rs diff --git a/components/net_traits/image_cache_task.rs b/components/net_traits/image_cache_task.rs new file mode 100644 index 00000000000..2ce4d78dbf4 --- /dev/null +++ b/components/net_traits/image_cache_task.rs @@ -0,0 +1,106 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use image::base::Image; +use {ControlMsg, LoadData, ProgressMsg, ResourceTask}; +use url::Url; + +use std::sync::Arc; +use std::sync::mpsc::{channel, Sender}; + +pub enum Msg { + /// Tell the cache that we may need a particular image soon. Must be posted + /// before Decode + Prefetch(Url), + + /// Tell the cache to decode an image. Must be posted before GetImage/WaitForImage + Decode(Url), + + /// Request an Image object for a URL. If the image is not is not immediately + /// available then ImageNotReady is returned. + GetImage(Url, Sender<ImageResponseMsg>), + + /// Wait for an image to become available (or fail to load). + WaitForImage(Url, Sender<ImageResponseMsg>), + + /// Clients must wait for a response before shutting down the ResourceTask + Exit(Sender<()>), + + /// Used by the prefetch tasks to post back image binaries + StorePrefetchedImageData(Url, Result<Vec<u8>, ()>), + + /// Used by the decoder tasks to post decoded images back to the cache + StoreImage(Url, Option<Arc<Box<Image>>>), + + /// For testing + WaitForStore(Sender<()>), + + /// For testing + WaitForStorePrefetched(Sender<()>), +} + +#[derive(Clone)] +pub enum ImageResponseMsg { + ImageReady(Arc<Box<Image>>), + ImageNotReady, + ImageFailed +} + +impl PartialEq for ImageResponseMsg { + fn eq(&self, other: &ImageResponseMsg) -> bool { + match (self, other) { + (&ImageResponseMsg::ImageReady(..), &ImageResponseMsg::ImageReady(..)) => panic!("unimplemented comparison"), + (&ImageResponseMsg::ImageNotReady, &ImageResponseMsg::ImageNotReady) => true, + (&ImageResponseMsg::ImageFailed, &ImageResponseMsg::ImageFailed) => true, + + (&ImageResponseMsg::ImageReady(..), _) | (&ImageResponseMsg::ImageNotReady, _) | (&ImageResponseMsg::ImageFailed, _) => false + } + } +} + +#[derive(Clone)] +pub struct ImageCacheTask { + pub chan: Sender<Msg>, +} + +impl ImageCacheTask { + pub fn send(&self, msg: Msg) { + self.chan.send(msg).unwrap(); + } +} + +pub fn load_image_data(url: Url, resource_task: ResourceTask, placeholder: &[u8]) -> Result<Vec<u8>, ()> { + let (response_chan, response_port) = channel(); + resource_task.send(ControlMsg::Load(LoadData::new(url.clone(), response_chan))).unwrap(); + + let mut image_data = vec!(); + + let progress_port = response_port.recv().unwrap().progress_port; + loop { + match progress_port.recv().unwrap() { + ProgressMsg::Payload(data) => { + image_data.push_all(&data); + } + ProgressMsg::Done(Ok(..)) => { + return Ok(image_data); + } + ProgressMsg::Done(Err(..)) => { + // Failure to load the requested image will return the + // placeholder instead. In case it failed to load at init(), + // we still recover and return Err() but nothing will be drawn. + if placeholder.len() != 0 { + debug!("image_cache_task: failed to load {:?}, use placeholder instead.", url); + // Clean in case there was an error after started loading the image. + image_data.clear(); + image_data.push_all(&placeholder); + return Ok(image_data); + } else { + debug!("image_cache_task: invalid placeholder."); + return Err(()); + } + } + } + } +} + diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs new file mode 100644 index 00000000000..abf084f2270 --- /dev/null +++ b/components/net_traits/lib.rs @@ -0,0 +1,218 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#![feature(box_syntax)] +#![feature(collections)] +#![feature(core)] +#![feature(int_uint)] +#![feature(rustc_private)] +#![feature(std_misc)] + +extern crate geom; +extern crate hyper; +#[macro_use] +extern crate log; +extern crate png; +extern crate profile; +extern crate stb_image; +extern crate url; +extern crate util; + +use hyper::header::Headers; +use hyper::http::RawStatus; +use hyper::method::Method; +use hyper::mime::{Mime, Attr}; +use url::Url; + +use std::borrow::IntoCow; +use std::sync::mpsc::{channel, Receiver, Sender}; + +pub mod image_cache_task; +pub mod local_image_cache; +pub mod storage_task; + +/// Image handling. +/// +/// It may be surprising that this goes in the network crate as opposed to the graphics crate. +/// However, image handling is generally very integrated with the network stack (especially where +/// caching is involved) and as a result it must live in here. +pub mod image { + pub mod base; + pub mod holder; +} + +#[derive(Clone)] +pub struct LoadData { + pub url: Url, + pub method: Method, + /// Headers that will apply to the initial request only + pub headers: Headers, + /// Headers that will apply to the initial request and any redirects + pub preserved_headers: Headers, + pub data: Option<Vec<u8>>, + pub cors: Option<ResourceCORSData>, + pub consumer: Sender<LoadResponse>, +} + +impl LoadData { + pub fn new(url: Url, consumer: Sender<LoadResponse>) -> LoadData { + LoadData { + url: url, + method: Method::Get, + headers: Headers::new(), + preserved_headers: Headers::new(), + data: None, + cors: None, + consumer: consumer, + } + } +} + +/// Handle to a resource task +pub type ResourceTask = Sender<ControlMsg>; + +pub enum ControlMsg { + /// Request the data associated with a particular URL + Load(LoadData), + /// Store a set of cookies for a given originating URL + SetCookiesForUrl(Url, String, CookieSource), + /// Retrieve the stored cookies for a given URL + GetCookiesForUrl(Url, Sender<Option<String>>, CookieSource), + Exit +} + +/// Message sent in response to `Load`. Contains metadata, and a port +/// for receiving the data. +/// +/// Even if loading fails immediately, we send one of these and the +/// progress_port will provide the error. +pub struct LoadResponse { + /// Metadata, such as from HTTP headers. + pub metadata: Metadata, + /// Port for reading data. + pub progress_port: Receiver<ProgressMsg>, +} + +#[derive(Clone)] +pub struct ResourceCORSData { + /// CORS Preflight flag + pub preflight: bool, + /// Origin of CORS Request + pub origin: Url +} + +/// Metadata about a loaded resource, such as is obtained from HTTP headers. +#[derive(Clone)] +pub struct Metadata { + /// Final URL after redirects. + pub final_url: Url, + + /// MIME type / subtype. + pub content_type: Option<(String, String)>, + + /// Character set. + pub charset: Option<String>, + + /// Headers + pub headers: Option<Headers>, + + /// HTTP Status + pub status: Option<RawStatus>, +} + +impl Metadata { + /// Metadata with defaults for everything optional. + pub fn default(url: Url) -> Self { + Metadata { + final_url: url, + content_type: None, + charset: None, + headers: None, + // http://fetch.spec.whatwg.org/#concept-response-status-message + status: Some(RawStatus(200, "OK".into_cow())), + } + } + + /// Extract the parts of a Mime that we care about. + pub fn set_content_type(&mut self, content_type: Option<&Mime>) { + match content_type { + None => (), + Some(&Mime(ref type_, ref subtype, ref parameters)) => { + self.content_type = Some((type_.to_string(), subtype.to_string())); + for &(ref k, ref v) in parameters.iter() { + if &Attr::Charset == k { + self.charset = Some(v.to_string()); + } + } + } + } + } +} + +/// The creator of a given cookie +#[derive(PartialEq, Copy)] +pub enum CookieSource { + /// An HTTP API + HTTP, + /// A non-HTTP API + NonHTTP, +} + +/// Messages sent in response to a `Load` message +#[derive(PartialEq,Debug)] +pub enum ProgressMsg { + /// Binary data - there may be multiple of these + Payload(Vec<u8>), + /// Indicates loading is complete, either successfully or not + Done(Result<(), String>) +} + +/// Convenience function for synchronously loading a whole resource. +pub fn load_whole_resource(resource_task: &ResourceTask, url: Url) + -> Result<(Metadata, Vec<u8>), String> { + let (start_chan, start_port) = channel(); + resource_task.send(ControlMsg::Load(LoadData::new(url, start_chan))).unwrap(); + let response = start_port.recv().unwrap(); + + let mut buf = vec!(); + loop { + match response.progress_port.recv().unwrap() { + ProgressMsg::Payload(data) => buf.push_all(&data), + ProgressMsg::Done(Ok(())) => return Ok((response.metadata, buf)), + ProgressMsg::Done(Err(e)) => return Err(e) + } + } +} + +/// Load a URL asynchronously and iterate over chunks of bytes from the response. +pub fn load_bytes_iter(resource_task: &ResourceTask, url: Url) -> (Metadata, ProgressMsgPortIterator) { + let (input_chan, input_port) = channel(); + resource_task.send(ControlMsg::Load(LoadData::new(url, input_chan))).unwrap(); + + let response = input_port.recv().unwrap(); + let iter = ProgressMsgPortIterator { progress_port: response.progress_port }; + (response.metadata, iter) +} + +/// Iterator that reads chunks of bytes from a ProgressMsg port +pub struct ProgressMsgPortIterator { + progress_port: Receiver<ProgressMsg> +} + +impl Iterator for ProgressMsgPortIterator { + type Item = Vec<u8>; + + fn next(&mut self) -> Option<Vec<u8>> { + match self.progress_port.recv().unwrap() { + ProgressMsg::Payload(data) => Some(data), + ProgressMsg::Done(Ok(())) => None, + ProgressMsg::Done(Err(e)) => { + error!("error receiving bytes: {}", e); + None + } + } + } +} + + diff --git a/components/net/local_image_cache.rs b/components/net_traits/local_image_cache.rs index 61ef5869372..cf57d168605 100644 --- a/components/net/local_image_cache.rs +++ b/components/net_traits/local_image_cache.rs @@ -8,14 +8,14 @@ extra message traffic, it also avoids waiting on the same image multiple times and thus triggering reflows multiple times. */ -use image_cache_task::{ImageCacheTask, ImageResponseMsg, Msg}; +use image_cache_task::{ImageResponseMsg, ImageCacheTask, Msg}; +use url::Url; use std::borrow::ToOwned; use std::collections::HashMap; use std::collections::hash_map::Entry::{Occupied, Vacant}; -use std::sync::mpsc::{Receiver, channel}; +use std::sync::mpsc::{channel, Receiver}; use util::task::spawn_named; -use url::Url; pub trait ImageResponder<NodeAddress: Send> { fn respond(&self) -> Box<Fn(ImageResponseMsg, NodeAddress)+Send>; @@ -166,3 +166,5 @@ impl<NodeAddress: Send + 'static> LocalImageCache<NodeAddress> { } } } + + diff --git a/components/net_traits/storage_task.rs b/components/net_traits/storage_task.rs new file mode 100644 index 00000000000..cedc98bf480 --- /dev/null +++ b/components/net_traits/storage_task.rs @@ -0,0 +1,44 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use std::sync::mpsc::Sender; +use url::Url; + +use util::str::DOMString; + +#[derive(Copy)] +pub enum StorageType { + Session, + Local +} + +/// Request operations on the storage data associated with a particular url +pub enum StorageTaskMsg { + /// gets the number of key/value pairs present in the associated storage data + Length(Sender<u32>, Url, StorageType), + + /// gets the name of the key at the specified index in the associated storage data + Key(Sender<Option<DOMString>>, Url, StorageType, u32), + + /// gets the value associated with the given key in the associated storage data + GetItem(Sender<Option<DOMString>>, Url, StorageType, DOMString), + + /// sets the value of the given key in the associated storage data + /// TODO throw QuotaExceededError in case of error + SetItem(Sender<(bool, Option<DOMString>)>, Url, StorageType, DOMString, DOMString), + + /// removes the key/value pair for the given key in the associated storage data + RemoveItem(Sender<Option<DOMString>>, Url, StorageType, DOMString), + + /// clears the associated storage data by removing all the key/value pairs + Clear(Sender<bool>, Url, StorageType), + + /// shut down this task + Exit +} + +/// Handle to a storage task +pub type StorageTask = Sender<StorageTaskMsg>; + + diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index ac910ecb32a..9e7db847a86 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -21,8 +21,8 @@ path = "../util" [dependencies.msg] path = "../msg" -[dependencies.net] -path = "../net" +[dependencies.net_traits] +path = "../net_traits" [dependencies.profile] path = "../profile" diff --git a/components/script/dom/bindings/global.rs b/components/script/dom/bindings/global.rs index 25c4cf99d05..ec5d87f63db 100644 --- a/components/script/dom/bindings/global.rs +++ b/components/script/dom/bindings/global.rs @@ -15,8 +15,7 @@ use dom::window::{self, WindowHelpers}; use script_task::ScriptChan; use msg::constellation_msg::WorkerId; - -use net::resource_task::ResourceTask; +use net_traits::ResourceTask; use js::{JSCLASS_IS_GLOBAL, JSCLASS_IS_DOMJSCLASS}; use js::glue::{GetGlobalForObjectCrossCompartment}; diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 0dbe3bd4c78..c95152787ad 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -48,8 +48,8 @@ use js::rust::{Cx, rt}; use layout_interface::{LayoutRPC, LayoutChan}; use libc; use msg::constellation_msg::{PipelineId, SubpageId, WindowSizeData, WorkerId}; -use net::image_cache_task::ImageCacheTask; -use net::storage_task::StorageType; +use net_traits::image_cache_task::ImageCacheTask; +use net_traits::storage_task::StorageType; use script_traits::ScriptControlChan; use script_traits::UntrustedNodeAddress; use msg::compositor_msg::ScriptListener; diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index fa72ae297ff..c61e870c57c 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -24,7 +24,7 @@ use dom::workerglobalscope::WorkerGlobalScopeTypeId; use script_task::{ScriptTask, ScriptChan, ScriptMsg, TimerSource}; use script_task::StackRootTLS; -use net::resource_task::{ResourceTask, load_whole_resource}; +use net_traits::{load_whole_resource, ResourceTask}; use util::task::spawn_named; use util::task_state; use util::task_state::{SCRIPT, IN_WORKER}; diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index ca3f7539501..315e67efbf5 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -63,8 +63,8 @@ use msg::compositor_msg::ScriptListener; use msg::constellation_msg::Msg as ConstellationMsg; use msg::constellation_msg::{ConstellationChan, Key, KeyState, KeyModifiers, MozBrowserEvent}; use msg::constellation_msg::{SUPER, ALT, SHIFT, CONTROL}; -use net::resource_task::ControlMsg::{SetCookiesForUrl, GetCookiesForUrl}; -use net::cookie_storage::CookieSource::NonHTTP; +use net_traits::CookieSource::NonHTTP; +use net_traits::ControlMsg::{SetCookiesForUrl, GetCookiesForUrl}; use script_task::Runnable; use script_traits::{MouseButton, UntrustedNodeAddress}; use util::{opts, namespace}; diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index ea58f1e87c1..dadcd776238 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -18,7 +18,7 @@ use dom::htmlelement::{HTMLElement, HTMLElementTypeId}; use dom::node::{Node, NodeTypeId, NodeHelpers, NodeDamage, window_from_node}; use dom::virtualmethods::VirtualMethods; use dom::window::WindowHelpers; -use net::image_cache_task; +use net_traits::image_cache_task; use util::geometry::to_px; use util::str::DOMString; use string_cache::Atom; diff --git a/components/script/dom/htmlobjectelement.rs b/components/script/dom/htmlobjectelement.rs index 83bed53af88..88bf53a1365 100644 --- a/components/script/dom/htmlobjectelement.rs +++ b/components/script/dom/htmlobjectelement.rs @@ -20,8 +20,7 @@ use dom::node::{Node, NodeTypeId, NodeHelpers, window_from_node}; use dom::validitystate::ValidityState; use dom::virtualmethods::VirtualMethods; -use net::image_cache_task; -use net::image_cache_task::ImageCacheTask; +use net_traits::image_cache_task::{self, ImageCacheTask}; use util::str::DOMString; use string_cache::Atom; diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index 6e274712543..5357c146ae5 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -33,7 +33,7 @@ use script_task::{ScriptMsg, Runnable}; use encoding::all::UTF_8; use encoding::label::encoding_from_whatwg_label; use encoding::types::{Encoding, EncodingRef, DecoderTrap}; -use net::resource_task::{load_whole_resource, Metadata}; +use net_traits::{load_whole_resource, Metadata}; use util::str::{DOMString, HTML_SPACE_CHARACTERS, StaticStringVec}; use std::borrow::ToOwned; use std::cell::Cell; diff --git a/components/script/dom/storage.rs b/components/script/dom/storage.rs index 191482c39c1..7868e53f21c 100644 --- a/components/script/dom/storage.rs +++ b/components/script/dom/storage.rs @@ -15,10 +15,8 @@ use dom::storageevent::StorageEvent; use dom::urlhelper::UrlHelper; use dom::window::WindowHelpers; use util::str::DOMString; -use net::storage_task::StorageTask; -use net::storage_task::StorageType; -use net::storage_task::StorageTaskMsg; use page::IterablePage; +use net_traits::storage_task::{StorageTask, StorageTaskMsg, StorageType}; use std::sync::mpsc::channel; use url::Url; diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index c13296cb565..9fe135eb53f 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -37,9 +37,9 @@ use timers::{IsInterval, TimerId, TimerManager, TimerCallback}; use devtools_traits::DevtoolsControlChan; use msg::compositor_msg::ScriptListener; use msg::constellation_msg::{LoadData, PipelineId, SubpageId, ConstellationChan, WindowSizeData, WorkerId}; -use net::image_cache_task::ImageCacheTask; -use net::resource_task::ResourceTask; -use net::storage_task::{StorageTask, StorageType}; +use net_traits::ResourceTask; +use net_traits::image_cache_task::ImageCacheTask; +use net_traits::storage_task::{StorageTask, StorageType}; use util::geometry::{self, Au, MAX_RECT}; use util::opts; use util::str::{DOMString,HTML_SPACE_CHARACTERS}; diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index c24edd5ce36..3f50c2b18ee 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -20,8 +20,7 @@ use script_task::{ScriptChan, TimerSource}; use timers::{IsInterval, TimerId, TimerManager, TimerCallback}; use msg::constellation_msg::WorkerId; - -use net::resource_task::{ResourceTask, load_whole_resource}; +use net_traits::{load_whole_resource, ResourceTask}; use util::str::DOMString; use js::jsapi::JSContext; diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index a973d1e970a..36354a7bfa7 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -42,9 +42,9 @@ use js::jsapi::{JS_ParseJSON, JSContext}; use js::jsapi::JS_ClearPendingException; use js::jsval::{JSVal, NullValue, UndefinedValue}; -use net::resource_task::{ResourceTask, ResourceCORSData, LoadData, LoadResponse}; -use net::resource_task::ControlMsg::Load; -use net::resource_task::ProgressMsg::{Payload, Done}; +use net_traits::ControlMsg::Load; +use net_traits::ProgressMsg::{Payload, Done}; +use net_traits::{ResourceTask, ResourceCORSData, LoadData, LoadResponse}; use cors::{allow_cross_origin_request, CORSRequest, RequestMode}; use util::str::DOMString; use util::task::spawn_named; diff --git a/components/script/lib.rs b/components/script/lib.rs index 44ac6f1856c..d7b39848322 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -39,7 +39,7 @@ extern crate hyper; extern crate js; extern crate libc; extern crate msg; -extern crate net; +extern crate net_traits; extern crate "rustc-serialize" as rustc_serialize; extern crate time; extern crate canvas; diff --git a/components/script/parse/html.rs b/components/script/parse/html.rs index 82d021298ac..794c6824ba8 100644 --- a/components/script/parse/html.rs +++ b/components/script/parse/html.rs @@ -26,7 +26,7 @@ use parse::Parser; use encoding::all::UTF_8; use encoding::types::{Encoding, DecoderTrap}; -use net::resource_task::{ProgressMsg, LoadResponse}; +use net_traits::{ProgressMsg, LoadResponse}; use util::task_state; use util::task_state::IN_HTML_PARSER; use std::ascii::AsciiExt; diff --git a/components/script/script_task.rs b/components/script/script_task.rs index ff69fabe760..dbb73117857 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -60,10 +60,10 @@ use msg::constellation_msg::{ConstellationChan}; use msg::constellation_msg::{LoadData, PipelineId, SubpageId, MozBrowserEvent, WorkerId}; use msg::constellation_msg::{Failure, WindowSizeData, PipelineExitType}; use msg::constellation_msg::Msg as ConstellationMsg; -use net::image_cache_task::ImageCacheTask; -use net::resource_task::{ResourceTask, ControlMsg, LoadResponse}; -use net::resource_task::LoadData as NetLoadData; -use net::storage_task::StorageTask; +use net_traits::{ResourceTask, ControlMsg, LoadResponse}; +use net_traits::LoadData as NetLoadData; +use net_traits::image_cache_task::ImageCacheTask; +use net_traits::storage_task::StorageTask; use string_cache::Atom; use util::geometry::to_frac_px; use util::smallvec::SmallVec; diff --git a/components/script_traits/Cargo.toml b/components/script_traits/Cargo.toml index f8de04e4a69..d33e0ff6b98 100644 --- a/components/script_traits/Cargo.toml +++ b/components/script_traits/Cargo.toml @@ -10,8 +10,8 @@ path = "lib.rs" [dependencies.msg] path = "../msg" -[dependencies.net] -path = "../net" +[dependencies.net_traits] +path = "../net_traits" [dependencies.util] path = "../util" diff --git a/components/script_traits/lib.rs b/components/script_traits/lib.rs index 97131a8bb90..57ceb73f2b3 100644 --- a/components/script_traits/lib.rs +++ b/components/script_traits/lib.rs @@ -6,7 +6,7 @@ extern crate devtools_traits; extern crate geom; extern crate libc; extern crate msg; -extern crate net; +extern crate net_traits; extern crate util; extern crate url; @@ -21,9 +21,9 @@ use msg::constellation_msg::{ConstellationChan, PipelineId, Failure, WindowSizeD use msg::constellation_msg::{LoadData, SubpageId, Key, KeyState, KeyModifiers}; use msg::constellation_msg::{MozBrowserEvent, PipelineExitType}; use msg::compositor_msg::ScriptListener; -use net::image_cache_task::ImageCacheTask; -use net::resource_task::ResourceTask; -use net::storage_task::StorageTask; +use net_traits::ResourceTask; +use net_traits::image_cache_task::ImageCacheTask; +use net_traits::storage_task::StorageTask; use util::smallvec::SmallVec1; use std::any::Any; use std::sync::mpsc::{Sender, Receiver}; diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 7bad5e11a28..7c2bde4d86c 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -11,6 +11,7 @@ dependencies = [ "layout 0.0.1", "msg 0.0.1", "net 0.0.1", + "net_traits 0.0.1", "png 0.1.0 (git+https://github.com/servo/rust-png)", "profile 0.0.1", "script 0.0.1", @@ -98,6 +99,7 @@ dependencies = [ "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "msg 0.0.1", "net 0.0.1", + "net_traits 0.0.1", "png 0.1.0 (git+https://github.com/servo/rust-png)", "profile 0.0.1", "script_traits 0.0.1", @@ -321,7 +323,7 @@ dependencies = [ "layers 0.1.0 (git+https://github.com/servo/rust-layers)", "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "msg 0.0.1", - "net 0.0.1", + "net_traits 0.0.1", "plugins 0.0.1", "png 0.1.0 (git+https://github.com/servo/rust-png)", "profile 0.0.1", @@ -527,7 +529,7 @@ dependencies = [ "layout_traits 0.0.1", "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "msg 0.0.1", - "net 0.0.1", + "net_traits 0.0.1", "plugins 0.0.1", "png 0.1.0 (git+https://github.com/servo/rust-png)", "profile 0.0.1", @@ -548,7 +550,7 @@ version = "0.0.1" dependencies = [ "gfx 0.0.1", "msg 0.0.1", - "net 0.0.1", + "net_traits 0.0.1", "profile 0.0.1", "script_traits 0.0.1", "url 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", @@ -639,19 +641,32 @@ dependencies = [ "flate2 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "geom 0.1.0 (git+https://github.com/servo/rust-geom)", "hyper 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "net_traits 0.0.1", "openssl 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "png 0.1.0 (git+https://github.com/servo/rust-png)", "profile 0.0.1", "regex 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", "regex_macros 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "stb_image 0.1.0 (git+https://github.com/servo/rust-stb-image)", "time 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", ] [[package]] +name = "net_traits" +version = "0.0.1" +dependencies = [ + "geom 0.1.0 (git+https://github.com/servo/rust-geom)", + "hyper 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "png 0.1.0 (git+https://github.com/servo/rust-png)", + "profile 0.0.1", + "stb_image 0.1.0 (git+https://github.com/servo/rust-stb-image)", + "url 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", + "util 0.0.1", +] + +[[package]] name = "openssl" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -785,7 +800,7 @@ dependencies = [ "js 0.1.0 (git+https://github.com/servo/rust-mozjs)", "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "msg 0.0.1", - "net 0.0.1", + "net_traits 0.0.1", "plugins 0.0.1", "profile 0.0.1", "rustc-serialize 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -808,7 +823,7 @@ dependencies = [ "geom 0.1.0 (git+https://github.com/servo/rust-geom)", "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "msg 0.0.1", - "net 0.0.1", + "net_traits 0.0.1", "url 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", ] diff --git a/components/servo/Cargo.toml b/components/servo/Cargo.toml index 64e7f060773..8a243e58b8f 100644 --- a/components/servo/Cargo.toml +++ b/components/servo/Cargo.toml @@ -48,6 +48,9 @@ path = "../compositing" [dependencies.net] path = "../net" +[dependencies.net_traits] +path = "../net_traits" + [dependencies.msg] path = "../msg" diff --git a/components/servo/lib.rs b/components/servo/lib.rs index b197ad30e6f..4871d9d14cf 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#![feature(libc, path, rustc_private, thread_local)] +#![feature(libc, rustc_private, thread_local)] #[macro_use] extern crate log; @@ -10,6 +10,7 @@ extern crate log; extern crate compositing; extern crate devtools; extern crate net; +extern crate net_traits; extern crate msg; extern crate profile; #[macro_use] @@ -33,11 +34,15 @@ use msg::constellation_msg::ConstellationChan; use script::dom::bindings::codegen::RegisterBindings; #[cfg(not(test))] -use net::image_cache_task::{ImageCacheTask, LoadPlaceholder}; +use net::image_cache_task::{ImageCacheTaskFactory, LoadPlaceholder}; +#[cfg(not(test))] +use net::storage_task::StorageTaskFactory; #[cfg(not(test))] use net::resource_task::new_resource_task; #[cfg(not(test))] -use net::storage_task::{StorageTaskFactory, StorageTask}; +use net_traits::image_cache_task::ImageCacheTask; +#[cfg(not(test))] +use net_traits::storage_task::StorageTask; #[cfg(not(test))] use gfx::font_cache_task::FontCacheTask; #[cfg(not(test))] @@ -82,12 +87,12 @@ impl Browser { // If we are emitting an output file, then we need to block on // image load or we risk emitting an output file missing the // image. - let image_cache_task = if opts.output_file.is_some() { - ImageCacheTask::new_sync(resource_task.clone(), shared_task_pool, - time_profiler_chan.clone(), LoadPlaceholder::Preload) + let image_cache_task: ImageCacheTask = if opts.output_file.is_some() { + ImageCacheTaskFactory::new_sync(resource_task.clone(), shared_task_pool, + time_profiler_chan.clone(), LoadPlaceholder::Preload) } else { - ImageCacheTask::new(resource_task.clone(), shared_task_pool, - time_profiler_chan.clone(), LoadPlaceholder::Preload) + ImageCacheTaskFactory::new(resource_task.clone(), shared_task_pool, + time_profiler_chan.clone(), LoadPlaceholder::Preload) }; let font_cache_task = FontCacheTask::new(resource_task.clone()); |