mirror of
https://github.com/servo/servo.git
synced 2025-07-23 07:13:52 +01:00
Auto merge of #21219 - paavininanda:Update_the_image_data, r=jdm
Complete remaining algo update_the_image_data <!-- Please describe your changes on the following line: --> --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix #11416. <!-- Either: --> - [x] These changes do not require tests <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/21219) <!-- Reviewable:end -->
This commit is contained in:
commit
b539ae7fe5
1 changed files with 26 additions and 8 deletions
|
@ -131,6 +131,7 @@ struct ImageRequest {
|
||||||
image: Option<Arc<Image>>,
|
image: Option<Arc<Image>>,
|
||||||
metadata: Option<ImageMetadata>,
|
metadata: Option<ImageMetadata>,
|
||||||
final_url: Option<ServoUrl>,
|
final_url: Option<ServoUrl>,
|
||||||
|
current_pixel_density: Option<f64>,
|
||||||
}
|
}
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct HTMLImageElement {
|
pub struct HTMLImageElement {
|
||||||
|
@ -142,6 +143,7 @@ pub struct HTMLImageElement {
|
||||||
generation: Cell<u32>,
|
generation: Cell<u32>,
|
||||||
#[ignore_malloc_size_of = "SourceSet"]
|
#[ignore_malloc_size_of = "SourceSet"]
|
||||||
source_set: DomRefCell<SourceSet>,
|
source_set: DomRefCell<SourceSet>,
|
||||||
|
last_selected_source: DomRefCell<Option<DOMString>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HTMLImageElement {
|
impl HTMLImageElement {
|
||||||
|
@ -807,26 +809,39 @@ impl HTMLImageElement {
|
||||||
// Step 2 abort if user-agent does not supports images
|
// Step 2 abort if user-agent does not supports images
|
||||||
// NOTE: Servo only supports images, skipping this step
|
// NOTE: Servo only supports images, skipping this step
|
||||||
|
|
||||||
// step 3, 4
|
// Step 3, 4
|
||||||
// TODO: take srcset and parent images into account
|
let mut selected_source = None;
|
||||||
if !src.is_empty() {
|
let mut pixel_density = None;
|
||||||
// TODO: take pixel density into account
|
let src_set = elem.get_string_attribute(&local_name!("srcset"));
|
||||||
|
let is_parent_picture = elem.upcast::<Node>().GetParentElement()
|
||||||
|
.map_or(false, |p| p.is::<HTMLPictureElement>());
|
||||||
|
if src_set.is_empty() && !is_parent_picture && !src.is_empty() {
|
||||||
|
selected_source = Some(src.clone());
|
||||||
|
pixel_density = Some(1 as f64);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Step 5
|
||||||
|
*self.last_selected_source.borrow_mut() = selected_source.clone();
|
||||||
|
|
||||||
|
// Step 6, check the list of available images
|
||||||
|
if !selected_source.as_ref().map_or(false, |source| source.is_empty()) {
|
||||||
if let Ok(img_url) = base_url.join(&src) {
|
if let Ok(img_url) = base_url.join(&src) {
|
||||||
// step 5, check the list of available images
|
|
||||||
let image_cache = window.image_cache();
|
let image_cache = window.image_cache();
|
||||||
let response = image_cache.find_image_or_metadata(img_url.clone().into(),
|
let response = image_cache.find_image_or_metadata(img_url.clone().into(),
|
||||||
UsePlaceholder::No,
|
UsePlaceholder::No,
|
||||||
CanRequestImages::No);
|
CanRequestImages::No);
|
||||||
if let Ok(ImageOrMetadataAvailable::ImageAvailable(image, url)) = response {
|
if let Ok(ImageOrMetadataAvailable::ImageAvailable(image, url)) = response {
|
||||||
// Step 5.3
|
// Step 6.3
|
||||||
let metadata = ImageMetadata { height: image.height, width: image.width };
|
let metadata = ImageMetadata { height: image.height, width: image.width };
|
||||||
// Step 5.3.2 abort requests
|
// Step 6.3.2 abort requests
|
||||||
self.abort_request(State::CompletelyAvailable, ImageRequestPhase::Current);
|
self.abort_request(State::CompletelyAvailable, ImageRequestPhase::Current);
|
||||||
self.abort_request(State::CompletelyAvailable, ImageRequestPhase::Pending);
|
self.abort_request(State::CompletelyAvailable, ImageRequestPhase::Pending);
|
||||||
let mut current_request = self.current_request.borrow_mut();
|
let mut current_request = self.current_request.borrow_mut();
|
||||||
current_request.final_url = Some(url);
|
current_request.final_url = Some(url);
|
||||||
current_request.image = Some(image.clone());
|
current_request.image = Some(image.clone());
|
||||||
current_request.metadata = Some(metadata);
|
current_request.metadata = Some(metadata);
|
||||||
|
// Step 6.3.6
|
||||||
|
current_request.current_pixel_density = pixel_density;
|
||||||
let this = Trusted::new(self);
|
let this = Trusted::new(self);
|
||||||
let src = String::from(src);
|
let src = String::from(src);
|
||||||
let _ = window.dom_manipulation_task_source().queue(
|
let _ = window.dom_manipulation_task_source().queue(
|
||||||
|
@ -847,7 +862,7 @@ impl HTMLImageElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// step 6, await a stable state.
|
// step 7, await a stable state.
|
||||||
self.generation.set(self.generation.get() + 1);
|
self.generation.set(self.generation.get() + 1);
|
||||||
let task = ImageElementMicrotask::StableStateUpdateImageDataTask {
|
let task = ImageElementMicrotask::StableStateUpdateImageDataTask {
|
||||||
elem: DomRoot::from_ref(self),
|
elem: DomRoot::from_ref(self),
|
||||||
|
@ -868,6 +883,7 @@ impl HTMLImageElement {
|
||||||
metadata: None,
|
metadata: None,
|
||||||
blocker: None,
|
blocker: None,
|
||||||
final_url: None,
|
final_url: None,
|
||||||
|
current_pixel_density: None,
|
||||||
}),
|
}),
|
||||||
pending_request: DomRefCell::new(ImageRequest {
|
pending_request: DomRefCell::new(ImageRequest {
|
||||||
state: State::Unavailable,
|
state: State::Unavailable,
|
||||||
|
@ -877,10 +893,12 @@ impl HTMLImageElement {
|
||||||
metadata: None,
|
metadata: None,
|
||||||
blocker: None,
|
blocker: None,
|
||||||
final_url: None,
|
final_url: None,
|
||||||
|
current_pixel_density: None,
|
||||||
}),
|
}),
|
||||||
form_owner: Default::default(),
|
form_owner: Default::default(),
|
||||||
generation: Default::default(),
|
generation: Default::default(),
|
||||||
source_set: DomRefCell::new(SourceSet::new()),
|
source_set: DomRefCell::new(SourceSet::new()),
|
||||||
|
last_selected_source: DomRefCell::new(None),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue