mirror of
https://github.com/servo/servo.git
synced 2025-09-27 15:20:09 +01:00
layout: allow only repaint when css background and border image loaded (#39201)
This change allows that only new display list is built when css background and border image loaded. Testing: This change should not change any behaviors so covered by existing WPT tests. Signed-off-by: sharpshooter_pt <ibluegalaxy_taoj@163.com>
This commit is contained in:
parent
e00bfb525b
commit
30d3706a2b
5 changed files with 68 additions and 13 deletions
|
@ -10,7 +10,8 @@ use fnv::FnvHashMap;
|
|||
use fonts::FontContext;
|
||||
use layout_api::wrapper_traits::ThreadSafeLayoutNode;
|
||||
use layout_api::{
|
||||
IFrameSizes, ImageAnimationState, PendingImage, PendingImageState, PendingRasterizationImage,
|
||||
IFrameSizes, ImageAnimationState, LayoutImageDestination, PendingImage, PendingImageState,
|
||||
PendingRasterizationImage,
|
||||
};
|
||||
use net_traits::image_cache::{
|
||||
Image as CachedImage, ImageCache, ImageCacheResult, ImageOrMetadataAvailable, PendingImageId,
|
||||
|
@ -128,6 +129,7 @@ impl ImageResolver {
|
|||
node: OpaqueNode,
|
||||
url: ServoUrl,
|
||||
use_placeholder: UsePlaceholder,
|
||||
destination: LayoutImageDestination,
|
||||
) -> LayoutImageCacheResult {
|
||||
// Check for available image or start tracking.
|
||||
let cache_result = self.image_cache.get_cached_image_status(
|
||||
|
@ -149,6 +151,7 @@ impl ImageResolver {
|
|||
node: node.into(),
|
||||
id,
|
||||
origin: self.origin.clone(),
|
||||
destination,
|
||||
};
|
||||
self.pending_images.lock().push(image);
|
||||
LayoutImageCacheResult::Pending
|
||||
|
@ -160,6 +163,7 @@ impl ImageResolver {
|
|||
node: node.into(),
|
||||
id,
|
||||
origin: self.origin.clone(),
|
||||
destination,
|
||||
};
|
||||
self.pending_images.lock().push(image);
|
||||
LayoutImageCacheResult::Pending
|
||||
|
@ -192,6 +196,7 @@ impl ImageResolver {
|
|||
node: OpaqueNode,
|
||||
url: ServoUrl,
|
||||
use_placeholder: UsePlaceholder,
|
||||
destination: LayoutImageDestination,
|
||||
) -> Result<CachedImage, ResolveImageError> {
|
||||
if let Some(cached_image) = self
|
||||
.resolved_images_cache
|
||||
|
@ -201,7 +206,8 @@ impl ImageResolver {
|
|||
return cached_image.clone();
|
||||
}
|
||||
|
||||
let result = self.get_or_request_image_or_meta(node, url.clone(), use_placeholder);
|
||||
let result =
|
||||
self.get_or_request_image_or_meta(node, url.clone(), use_placeholder, destination);
|
||||
match result {
|
||||
LayoutImageCacheResult::DataAvailable(img_or_meta) => match img_or_meta {
|
||||
ImageOrMetadataAvailable::ImageAvailable { image, .. } => {
|
||||
|
@ -280,6 +286,7 @@ impl ImageResolver {
|
|||
node,
|
||||
image_url.clone().into(),
|
||||
UsePlaceholder::No,
|
||||
LayoutImageDestination::DisplayListBuilding,
|
||||
)?;
|
||||
let metadata = image.metadata();
|
||||
let size = Size2D::new(metadata.width, metadata.height).to_f32();
|
||||
|
|
|
@ -539,6 +539,10 @@ impl Layout for LayoutThread {
|
|||
self.need_new_display_list.get()
|
||||
}
|
||||
|
||||
fn set_needs_new_display_list(&self) {
|
||||
self.need_new_display_list.set(true);
|
||||
}
|
||||
|
||||
/// <https://drafts.css-houdini.org/css-properties-values-api-1/#the-registerproperty-function>
|
||||
fn register_custom_property(
|
||||
&mut self,
|
||||
|
|
|
@ -7,8 +7,8 @@ use base::id::{BrowsingContextId, PipelineId};
|
|||
use data_url::DataUrl;
|
||||
use embedder_traits::ViewportDetails;
|
||||
use euclid::{Scale, Size2D};
|
||||
use layout_api::IFrameSize;
|
||||
use layout_api::wrapper_traits::ThreadSafeLayoutNode;
|
||||
use layout_api::{IFrameSize, LayoutImageDestination};
|
||||
use malloc_size_of_derive::MallocSizeOf;
|
||||
use net_traits::image_cache::{Image, ImageOrMetadataAvailable, UsePlaceholder, VectorImage};
|
||||
use script::layout_dom::ServoThreadSafeLayoutNode;
|
||||
|
@ -189,7 +189,12 @@ impl ReplacedContents {
|
|||
|
||||
let result = context
|
||||
.image_resolver
|
||||
.get_cached_image_for_url(node.opaque(), svg_source, UsePlaceholder::No)
|
||||
.get_cached_image_for_url(
|
||||
node.opaque(),
|
||||
svg_source,
|
||||
UsePlaceholder::No,
|
||||
LayoutImageDestination::BoxTreeConstruction,
|
||||
)
|
||||
.ok();
|
||||
|
||||
let vector_image = result.map(|result| match result {
|
||||
|
@ -230,6 +235,7 @@ impl ReplacedContents {
|
|||
node.opaque(),
|
||||
image_url.clone().into(),
|
||||
UsePlaceholder::No,
|
||||
LayoutImageDestination::BoxTreeConstruction,
|
||||
) {
|
||||
LayoutImageCacheResult::DataAvailable(img_or_meta) => match img_or_meta {
|
||||
ImageOrMetadataAvailable::ImageAvailable { image, .. } => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue