From c83be39af50107cd11ebe2852880b7dc08402dfe Mon Sep 17 00:00:00 2001 From: Sagar Muchhal Date: Wed, 20 Apr 2016 21:07:03 -0400 Subject: [PATCH 01/10] Added Command to ImageCache Task --- components/net/image_cache_thread.rs | 16 ++++++++++++++++ components/net_traits/image_cache_thread.rs | 13 +++++++++++++ 2 files changed, 29 insertions(+) diff --git a/components/net/image_cache_thread.rs b/components/net/image_cache_thread.rs index 660ba87cb4e5..733cf92a5df9 100644 --- a/components/net/image_cache_thread.rs +++ b/components/net/image_cache_thread.rs @@ -394,6 +394,9 @@ impl ImageCache { let result = self.get_image_or_meta_if_available(url, use_placeholder); consumer.send(result).unwrap(); } + ImageCacheCommand::StoreDecodeImage(url, image_vector) => { + let result = self.store_decode_image(url, image_vector); + } }; None @@ -588,6 +591,19 @@ impl ImageCache { } } } + + fn store_decode_image(&mut self, + ref_url: Url, + loaded_bytes: Vec) { + let (cache_result, load_key, mut pending_load) = self.pending_loads.get_cached(Arc::new(ref_url.clone())); + + let progress_sender = self.progress_sender.clone(); + let action: ResponseAction = ResponseAction::DataAvailable(loaded_bytes); + progress_sender.send(ResourceLoadInfo { + action: action, + key: load_key, + }); + } } /// Create a new image cache. diff --git a/components/net_traits/image_cache_thread.rs b/components/net_traits/image_cache_thread.rs index 0011cab8e9f5..d96b5b119b96 100644 --- a/components/net_traits/image_cache_thread.rs +++ b/components/net_traits/image_cache_thread.rs @@ -92,6 +92,10 @@ pub enum ImageCacheCommand { /// state and but its metadata has been made available, it will be sent as a response. GetImageOrMetadataIfAvailable(Url, UsePlaceholder, IpcSender>), + /// Instruct the cache to store this data as a newly-complete network request and continue + /// decoding the result into pixel data + StoreDecodeImage(Url, Vec), + /// Clients must wait for a response before shutting down the ResourceThread Exit(IpcSender<()>), } @@ -157,6 +161,15 @@ impl ImageCacheThread { receiver.recv().unwrap() } + /// Get the vector of bytess .... + /// See ImageCacheCommand::StoreDecodeImage. + pub fn find_store_decode_image(&self, + url: Url, + image_data: Vec) { + let msg = ImageCacheCommand::StoreDecodeImage(url, image_data); + self.chan.send(msg).unwrap(); + } + /// Shutdown the image cache thread. pub fn exit(&self) { let (response_chan, response_port) = ipc::channel().unwrap(); From de736fb75100bb591e70c982e6ff9c5103a33874 Mon Sep 17 00:00:00 2001 From: Sagar Muchhal Date: Sat, 23 Apr 2016 02:28:58 -0400 Subject: [PATCH 02/10] Addressed reviews --- components/net/image_cache_thread.rs | 11 +++++------ components/net_traits/image_cache_thread.rs | 5 ++--- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/components/net/image_cache_thread.rs b/components/net/image_cache_thread.rs index 733cf92a5df9..c70352037055 100644 --- a/components/net/image_cache_thread.rs +++ b/components/net/image_cache_thread.rs @@ -395,7 +395,7 @@ impl ImageCache { consumer.send(result).unwrap(); } ImageCacheCommand::StoreDecodeImage(url, image_vector) => { - let result = self.store_decode_image(url, image_vector); + self.store_decode_image(url, image_vector); } }; @@ -595,11 +595,10 @@ impl ImageCache { fn store_decode_image(&mut self, ref_url: Url, loaded_bytes: Vec) { - let (cache_result, load_key, mut pending_load) = self.pending_loads.get_cached(Arc::new(ref_url.clone())); - - let progress_sender = self.progress_sender.clone(); - let action: ResponseAction = ResponseAction::DataAvailable(loaded_bytes); - progress_sender.send(ResourceLoadInfo { + let (cache_result, load_key, pending_load) = self.pending_loads.get_cached(Arc::new(ref_url)); + assert!(cache_result == CacheResult::Miss); + let action: ResponseAction = ResponseAction::ResponseComplete(Ok(())); + self.progress_sender.send(ResourceLoadInfo { action: action, key: load_key, }); diff --git a/components/net_traits/image_cache_thread.rs b/components/net_traits/image_cache_thread.rs index d96b5b119b96..2f0eb9a794bb 100644 --- a/components/net_traits/image_cache_thread.rs +++ b/components/net_traits/image_cache_thread.rs @@ -161,9 +161,8 @@ impl ImageCacheThread { receiver.recv().unwrap() } - /// Get the vector of bytess .... - /// See ImageCacheCommand::StoreDecodeImage. - pub fn find_store_decode_image(&self, + /// Decode the given image bytes and cache the result for the given URL. + pub fn store_complete_image_bytes(&self, url: Url, image_data: Vec) { let msg = ImageCacheCommand::StoreDecodeImage(url, image_data); From c850f5c4c41f02baf33726f0d629e10057429187 Mon Sep 17 00:00:00 2001 From: Ahmad Saad Khan Date: Sun, 24 Apr 2016 17:50:44 -0400 Subject: [PATCH 03/10] implementing parse srcset algo --- components/script/dom/htmlimageelement.rs | 10 ++++++++++ components/script/dom/webidls/HTMLImageElement.webidl | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index c0a9e9603857..7085b1fb6874 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -247,6 +247,11 @@ impl HTMLImageElementMethods for HTMLImageElement { // https://html.spec.whatwg.org/multipage/#dom-img-src make_setter!(SetSrc, "src"); + // https://html.spec.whatwg.org/multipage/#dom-img-srcset + //make_getter!(Srcset, "srcset"); + // https://html.spec.whatwg.org/multipage/#dom-img-srcset + //make_setter!(SetsrcSet, "srcset"); + // https://html.spec.whatwg.org/multipage/#dom-img-crossOrigin make_enumerated_getter!(CrossOrigin, "crossorigin", "anonymous", ("use-credentials")); // https://html.spec.whatwg.org/multipage/#dom-img-crossOrigin @@ -398,3 +403,8 @@ fn image_dimension_setter(element: &Element, attr: Atom, value: u32) { let value = AttrValue::Dimension(DOMString::from(value.to_string()), dim); element.set_attribute(&attr, value); } + +fn parse_a_srcset_attribute(input: String){ + let position = &input; + +} \ No newline at end of file diff --git a/components/script/dom/webidls/HTMLImageElement.webidl b/components/script/dom/webidls/HTMLImageElement.webidl index 69bd2f7d4c1e..a10718a0690f 100644 --- a/components/script/dom/webidls/HTMLImageElement.webidl +++ b/components/script/dom/webidls/HTMLImageElement.webidl @@ -8,7 +8,7 @@ interface HTMLImageElement : HTMLElement { attribute DOMString alt; attribute DOMString src; - // attribute DOMString srcset; + // attribute DOMString srcset; attribute DOMString crossOrigin; attribute DOMString useMap; attribute boolean isMap; From a771e58cd4f4988df880dbd6c399f9fb62bbabea Mon Sep 17 00:00:00 2001 From: Ahmad Saad Khan Date: Sun, 24 Apr 2016 20:19:10 -0400 Subject: [PATCH 04/10] added imagesrc struct --- components/script/dom/htmlimageelement.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 7085b1fb6874..d1d920cec1ef 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -403,8 +403,13 @@ fn image_dimension_setter(element: &Element, attr: Atom, value: u32) { let value = AttrValue::Dimension(DOMString::from(value.to_string()), dim); element.set_attribute(&attr, value); } + +struct ImageSource { + candidates: String, +} -fn parse_a_srcset_attribute(input: String){ - let position = &input; - -} \ No newline at end of file +impl ImageSource{ + fn parse_a_srcset_attribute(&self, input: String) -> ImageSource { + let position = &input; + } +} From e6aceebdcd17b7f528f44dafaf0e0b700de7bd68 Mon Sep 17 00:00:00 2001 From: Ahmad Saad Khan Date: Mon, 25 Apr 2016 17:35:32 -0400 Subject: [PATCH 05/10] implementing collecte sequence of chars --- components/script/dom/htmlimageelement.rs | 29 +++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index d1d920cec1ef..933c20eab563 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -33,6 +33,7 @@ use std::sync::Arc; use string_cache::Atom; use url::Url; use util::str::{DOMString, LengthOrPercentageOrAuto}; +use style::values::specified::Length; #[derive(JSTraceable, HeapSizeOf)] #[allow(dead_code)] @@ -404,12 +405,36 @@ fn image_dimension_setter(element: &Element, attr: Atom, value: u32) { element.set_attribute(&attr, value); } + struct ImageSource { - candidates: String, + candidate: String, + length: Length, +} + +fn collect_sequence_characters<'a, P>(s: &'a str, predicate: P) + -> (&'a str, &'a str) + where P: Fn(char) -> bool { + for (i, c) in s.chars().enumerate() { + if !predicate(c) { + return (&s[0..i], &s[i..]); + } + } + return (s, ""); } impl ImageSource{ - fn parse_a_srcset_attribute(&self, input: String) -> ImageSource { + fn parse_a_srcset_attribute(input: String) -> Vec { let position = &input; + let candidate: Vec = Vec::new(); + //let position1 = &s; + let(spaces, position) = collect_sequence_characters(position, |c| c ==',' || c == ' '); + println!("{} {}", spaces, position); + let x = spaces.find(','); + match x { + Some(val) => println!("{}", val), // can do assert here + None => println!("Parse error"), + } + candidate + } } From 13a665d103fce0d78ad88433a73f96fe9669c8aa Mon Sep 17 00:00:00 2001 From: Ahmad Saad Khan Date: Mon, 2 May 2016 22:31:09 -0400 Subject: [PATCH 06/10] Till descriptor --- components/script/dom/htmlimageelement.rs | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 933c20eab563..11c4147ef904 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -34,6 +34,7 @@ use string_cache::Atom; use url::Url; use util::str::{DOMString, LengthOrPercentageOrAuto}; use style::values::specified::Length; +use std::collections::LinkedList; #[derive(JSTraceable, HeapSizeOf)] #[allow(dead_code)] @@ -422,19 +423,24 @@ fn collect_sequence_characters<'a, P>(s: &'a str, predicate: P) return (s, ""); } -impl ImageSource{ - fn parse_a_srcset_attribute(input: String) -> Vec { +fn parse_a_srcset_attribute(input: String) -> Vec { let position = &input; let candidate: Vec = Vec::new(); - //let position1 = &s; let(spaces, position) = collect_sequence_characters(position, |c| c ==',' || c == ' '); println!("{} {}", spaces, position); let x = spaces.find(','); match x { - Some(val) => println!("{}", val), // can do assert here - None => println!("Parse error"), + Some(val) => println!("Parse Error"), + None => println!("No commas"), } - candidate + if position == "" { + //Does something need to be asserted here? The algorithm says abort the steps is this condition exists + return candidate; + } + let (url, spaces) = collect_sequence_characters(position, |c| c != ' '); + let mut descriptor = LinkedList::::new(); + return candidate; - } -} +} + + \ No newline at end of file From bb26ef10ee47f306d583b8b957964f9d86f660ce Mon Sep 17 00:00:00 2001 From: aneesh87 Date: Tue, 3 May 2016 18:32:20 -0400 Subject: [PATCH 07/10] Further Steps Parseset --- components/script/dom/htmlimageelement.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 11c4147ef904..3046d04ee09a 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -45,6 +45,13 @@ enum State { Broken, } #[derive(JSTraceable, HeapSizeOf)] +#[allow(dead_code)] +enum ParseState { + InDescriptor, + InParens, + AfterDescriptor, +} +#[derive(JSTraceable, HeapSizeOf)] struct ImageRequest { state: State, url: Option, @@ -438,7 +445,15 @@ fn parse_a_srcset_attribute(input: String) -> Vec { return candidate; } let (url, spaces) = collect_sequence_characters(position, |c| c != ' '); + + let comma_count = url.chars().rev().take_while(|c| *c==',').count(); + let url: String = url.chars().take(url.chars().count() - comma_count).collect(); + if comma_count > 1 { + println!("Parse Error (trailing commas)") + } + let mut descriptor = LinkedList::::new(); + let mut state = ParseState::InDescriptor; return candidate; } From 246d980ed31c5e1ba9df5bccc7a9c66e7aa6a2c7 Mon Sep 17 00:00:00 2001 From: aneesh87 Date: Tue, 3 May 2016 20:01:30 -0400 Subject: [PATCH 08/10] Further steps --- components/script/dom/htmlimageelement.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 3046d04ee09a..0a6ca92d663a 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -35,6 +35,7 @@ use url::Url; use util::str::{DOMString, LengthOrPercentageOrAuto}; use style::values::specified::Length; use std::collections::LinkedList; +use util; #[derive(JSTraceable, HeapSizeOf)] #[allow(dead_code)] @@ -433,7 +434,7 @@ fn collect_sequence_characters<'a, P>(s: &'a str, predicate: P) fn parse_a_srcset_attribute(input: String) -> Vec { let position = &input; let candidate: Vec = Vec::new(); - let(spaces, position) = collect_sequence_characters(position, |c| c ==',' || c == ' '); + let(spaces, position) = collect_sequence_characters(position, |c| c ==',' || util::str::char_is_whitespace(c)); println!("{} {}", spaces, position); let x = spaces.find(','); match x { @@ -444,7 +445,7 @@ fn parse_a_srcset_attribute(input: String) -> Vec { //Does something need to be asserted here? The algorithm says abort the steps is this condition exists return candidate; } - let (url, spaces) = collect_sequence_characters(position, |c| c != ' '); + let (url, spaces) = collect_sequence_characters(position, |c| !util::str::char_is_whitespace(c)); let comma_count = url.chars().rev().take_while(|c| *c==',').count(); let url: String = url.chars().take(url.chars().count() - comma_count).collect(); @@ -453,7 +454,12 @@ fn parse_a_srcset_attribute(input: String) -> Vec { } let mut descriptor = LinkedList::::new(); + // Descriptor Tokeniser: whitespace + let (space, position) = collect_sequence_characters(position, |c| util::str::char_is_whitespace(c)); + + let current_descriptor = String::new(); let mut state = ParseState::InDescriptor; + return candidate; } From 30acbd0214830b7ea9bf1bffdb893061f90f83da Mon Sep 17 00:00:00 2001 From: Ahmad Saad Khan Date: Tue, 3 May 2016 22:13:35 -0400 Subject: [PATCH 09/10] further moved --- components/script/dom/htmlimageelement.rs | 38 +++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 0a6ca92d663a..5553ce59cd64 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -457,9 +457,43 @@ fn parse_a_srcset_attribute(input: String) -> Vec { // Descriptor Tokeniser: whitespace let (space, position) = collect_sequence_characters(position, |c| util::str::char_is_whitespace(c)); - let current_descriptor = String::new(); + let mut current_descriptor = String::new(); let mut state = ParseState::InDescriptor; - + + for (i,c) in position.chars().enumerate() { + match c { + ' ' => { + if current_descriptor != "" { + descriptor.push_back(current_descriptor.clone()); + state = ParseState::AfterDescriptor; + } + }, + ',' => { position.chars().enumerate(); + if current_descriptor != "" { + descriptor.push_back(current_descriptor.clone()); + state = ParseState::AfterDescriptor; + } + } + '(' => { + current_descriptor.push(c); + state = ParseState::InParens; + } + //Matching EOF + /*'' => { if current_descriptor != "" { + descriptor.push_back(current_descriptor.clone()); + state = ParseState::AfterDescriptor; + } + } + */ + _ => { + current_descriptor.push(c); + } + + + } + } + + return candidate; } From f8d3cca40a2428f4264e0f6b731c6f0116228cf5 Mon Sep 17 00:00:00 2001 From: Ahmad Saad Khan Date: Wed, 4 May 2016 00:39:28 -0400 Subject: [PATCH 10/10] test tidy works --- components/net_traits/image_cache_thread.rs | 6 +- components/script/dom/htmlimageelement.rs | 114 ++++++++++++-------- 2 files changed, 75 insertions(+), 45 deletions(-) diff --git a/components/net_traits/image_cache_thread.rs b/components/net_traits/image_cache_thread.rs index 2f0eb9a794bb..623c44ccb43c 100644 --- a/components/net_traits/image_cache_thread.rs +++ b/components/net_traits/image_cache_thread.rs @@ -92,7 +92,7 @@ pub enum ImageCacheCommand { /// state and but its metadata has been made available, it will be sent as a response. GetImageOrMetadataIfAvailable(Url, UsePlaceholder, IpcSender>), - /// Instruct the cache to store this data as a newly-complete network request and continue + /// Instruct the cache to store this data as a newly-complete network request and continue /// decoding the result into pixel data StoreDecodeImage(Url, Vec), @@ -162,8 +162,8 @@ impl ImageCacheThread { } /// Decode the given image bytes and cache the result for the given URL. - pub fn store_complete_image_bytes(&self, - url: Url, + pub fn store_complete_image_bytes(&self, + url: Url, image_data: Vec) { let msg = ImageCacheCommand::StoreDecodeImage(url, image_data); self.chan.send(msg).unwrap(); diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 5553ce59cd64..0397d5f2dede 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -29,13 +29,13 @@ use net_traits::image_cache_thread::{ImageResponder, ImageResponse}; use script_runtime::ScriptThreadEventCategory::UpdateReplacedElement; use script_runtime::{CommonScriptMsg, ScriptChan}; use script_thread::Runnable; +use std::collections::LinkedList; use std::sync::Arc; use string_cache::Atom; -use url::Url; -use util::str::{DOMString, LengthOrPercentageOrAuto}; use style::values::specified::Length; -use std::collections::LinkedList; +use url::Url; use util; +use util::str::{DOMString, LengthOrPercentageOrAuto}; #[derive(JSTraceable, HeapSizeOf)] #[allow(dead_code)] @@ -413,7 +413,7 @@ fn image_dimension_setter(element: &Element, attr: Atom, value: u32) { let value = AttrValue::Dimension(DOMString::from(value.to_string()), dim); element.set_attribute(&attr, value); } - + struct ImageSource { candidate: String, @@ -439,15 +439,14 @@ fn parse_a_srcset_attribute(input: String) -> Vec { let x = spaces.find(','); match x { Some(val) => println!("Parse Error"), - None => println!("No commas"), + None => println!("No commas"), } if position == "" { //Does something need to be asserted here? The algorithm says abort the steps is this condition exists return candidate; } let (url, spaces) = collect_sequence_characters(position, |c| !util::str::char_is_whitespace(c)); - - let comma_count = url.chars().rev().take_while(|c| *c==',').count(); + let comma_count = url.chars().rev().take_while(|c| *c == ',').count(); let url: String = url.chars().take(url.chars().count() - comma_count).collect(); if comma_count > 1 { println!("Parse Error (trailing commas)") @@ -456,46 +455,77 @@ fn parse_a_srcset_attribute(input: String) -> Vec { let mut descriptor = LinkedList::::new(); // Descriptor Tokeniser: whitespace let (space, position) = collect_sequence_characters(position, |c| util::str::char_is_whitespace(c)); - let mut current_descriptor = String::new(); let mut state = ParseState::InDescriptor; - - for (i,c) in position.chars().enumerate() { - match c { - ' ' => { - if current_descriptor != "" { - descriptor.push_back(current_descriptor.clone()); - state = ParseState::AfterDescriptor; - } - }, - ',' => { position.chars().enumerate(); - if current_descriptor != "" { - descriptor.push_back(current_descriptor.clone()); - state = ParseState::AfterDescriptor; - } + for (i, c) in position.chars().enumerate() { + match state { + ParseState::InDescriptor => { + match c { + ' ' => { + if current_descriptor != "" { + descriptor.push_back(current_descriptor.clone()); + state = ParseState::AfterDescriptor; + } + }, + ',' => { position.chars().enumerate(); + if current_descriptor != "" { + descriptor.push_back(current_descriptor.clone()); + state = ParseState::AfterDescriptor; + } + } + '(' => { + current_descriptor.push(c); + state = ParseState::InParens; + } + //Matching EOF + /*'' => { if current_descriptor != "" { + descriptor.push_back(current_descriptor.clone()); + state = ParseState::AfterDescriptor; + } + } + */ + _ => { + current_descriptor.push(c); + } } - '(' => { - current_descriptor.push(c); - state = ParseState::InParens; + } + ParseState::InParens =>{ + match c { + '(' => { + current_descriptor.push(c); + state = ParseState::InDescriptor; + } + //Matching EOF + /*'' => { if current_descriptor != "" { + descriptor.push_back(current_descriptor.clone()); + state = ParseState::AfterDescriptor; + } + } + */ + _ => { + current_descriptor.push(c); + } } - //Matching EOF - /*'' => { if current_descriptor != "" { - descriptor.push_back(current_descriptor.clone()); - state = ParseState::AfterDescriptor; + } + ParseState::AfterDescriptor => { + match c { + ' ' => { + state = ParseState::AfterDescriptor; + } + //Matching EOF + /*'' => { if current_descriptor != "" { + descriptor.push_back(current_descriptor.clone()); + state = ParseState::AfterDescriptor; + } + } + */ + _ => { + state = ParseState::InDescriptor; + } } - } - */ - _ => { - current_descriptor.push(c); - } - - - } + } + } } - - return candidate; - -} +} - \ No newline at end of file