mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
Auto merge of #14246 - emilio:servo-url, r=SimonSapin
Urlmageddon <!-- Please describe your changes on the following line: --> Still needs a bunch of code in net to be converted in order to get more advantage of this for images and stuff, but meanwhile this should help quite a bit with #13778. Still wanted to get this in. r? @SimonSapin <!-- 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/14246) <!-- Reviewable:end -->
This commit is contained in:
commit
22aebdf5d4
161 changed files with 1044 additions and 718 deletions
|
@ -39,12 +39,12 @@ serde = "0.8"
|
|||
serde_derive = "0.8"
|
||||
serde_json = "0.8"
|
||||
servo_atoms = {path = "../atoms"}
|
||||
servo_url = {path = "../url"}
|
||||
smallvec = "0.1"
|
||||
style = {path = "../style"}
|
||||
style_traits = {path = "../style_traits"}
|
||||
unicode-bidi = "0.2"
|
||||
unicode-script = {version = "0.1", features = ["harfbuzz"]}
|
||||
url = {version = "1.2", features = ["heap_size"]}
|
||||
util = {path = "../util"}
|
||||
|
||||
[dependencies.webrender_traits]
|
||||
|
|
|
@ -38,6 +38,7 @@ use multicol::{MulticolColumnFlow, MulticolFlow};
|
|||
use parallel;
|
||||
use script_layout_interface::{LayoutElementType, LayoutNodeType, is_image_data};
|
||||
use script_layout_interface::wrapper_traits::{PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode};
|
||||
use servo_url::ServoUrl;
|
||||
use std::borrow::ToOwned;
|
||||
use std::collections::LinkedList;
|
||||
use std::marker::PhantomData;
|
||||
|
@ -62,7 +63,6 @@ use table_rowgroup::TableRowGroupFlow;
|
|||
use table_wrapper::TableWrapperFlow;
|
||||
use text::TextRunScanner;
|
||||
use traversal::PostorderNodeMutTraversal;
|
||||
use url::Url;
|
||||
use util::opts;
|
||||
use wrapper::{LayoutNodeLayoutData, TextContent, ThreadSafeLayoutNodeHelpers};
|
||||
|
||||
|
@ -1207,7 +1207,7 @@ impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode>
|
|||
let marker_fragments = match node.style(self.style_context()).get_list().list_style_image {
|
||||
list_style_image::T::Url(ref url_value) => {
|
||||
let image_info = box ImageFragmentInfo::new(node,
|
||||
url_value.url().map(|u| (**u).clone()),
|
||||
url_value.url().map(|u| u.clone()),
|
||||
&self.layout_context.shared);
|
||||
vec![Fragment::new(node, SpecificFragmentInfo::Image(image_info), self.layout_context)]
|
||||
}
|
||||
|
@ -1675,7 +1675,7 @@ trait ObjectElement {
|
|||
fn has_object_data(&self) -> bool;
|
||||
|
||||
/// Returns the "data" attribute value parsed as a URL
|
||||
fn object_data(&self) -> Option<Url>;
|
||||
fn object_data(&self) -> Option<ServoUrl>;
|
||||
}
|
||||
|
||||
impl<N> ObjectElement for N where N: ThreadSafeLayoutNode {
|
||||
|
@ -1691,14 +1691,14 @@ impl<N> ObjectElement for N where N: ThreadSafeLayoutNode {
|
|||
}
|
||||
}
|
||||
|
||||
fn object_data(&self) -> Option<Url> {
|
||||
fn object_data(&self) -> Option<ServoUrl> {
|
||||
let elem = self.as_element().unwrap();
|
||||
let type_and_data = (
|
||||
elem.get_attr(&ns!(), &local_name!("type")),
|
||||
elem.get_attr(&ns!(), &local_name!("data")),
|
||||
);
|
||||
match type_and_data {
|
||||
(None, Some(uri)) if is_image_data(uri) => Url::parse(uri).ok(),
|
||||
(None, Some(uri)) if is_image_data(uri) => ServoUrl::parse(uri).ok(),
|
||||
_ => None
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,13 +17,13 @@ use net_traits::image::base::Image;
|
|||
use net_traits::image_cache_thread::{ImageCacheChan, ImageCacheThread, ImageResponse, ImageState};
|
||||
use net_traits::image_cache_thread::{ImageOrMetadataAvailable, UsePlaceholder};
|
||||
use parking_lot::RwLock;
|
||||
use servo_url::ServoUrl;
|
||||
use std::cell::{RefCell, RefMut};
|
||||
use std::collections::HashMap;
|
||||
use std::hash::BuildHasherDefault;
|
||||
use std::rc::Rc;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use style::context::{LocalStyleContext, StyleContext, SharedStyleContext};
|
||||
use url::Url;
|
||||
use util::opts;
|
||||
|
||||
struct LocalLayoutContext {
|
||||
|
@ -83,7 +83,7 @@ pub struct SharedLayoutContext {
|
|||
pub font_cache_thread: Mutex<FontCacheThread>,
|
||||
|
||||
/// A cache of WebRender image info.
|
||||
pub webrender_image_cache: Arc<RwLock<HashMap<(Url, UsePlaceholder),
|
||||
pub webrender_image_cache: Arc<RwLock<HashMap<(ServoUrl, UsePlaceholder),
|
||||
WebRenderImageInfo,
|
||||
BuildHasherDefault<FnvHasher>>>>,
|
||||
}
|
||||
|
@ -125,7 +125,7 @@ impl<'a> LayoutContext<'a> {
|
|||
}
|
||||
|
||||
impl SharedLayoutContext {
|
||||
fn get_or_request_image_synchronously(&self, url: Url, use_placeholder: UsePlaceholder)
|
||||
fn get_or_request_image_synchronously(&self, url: ServoUrl, use_placeholder: UsePlaceholder)
|
||||
-> Option<Arc<Image>> {
|
||||
debug_assert!(opts::get().output_file.is_some() || opts::get().exit_after_load);
|
||||
|
||||
|
@ -161,7 +161,7 @@ impl SharedLayoutContext {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn get_or_request_image_or_meta(&self, url: Url, use_placeholder: UsePlaceholder)
|
||||
pub fn get_or_request_image_or_meta(&self, url: ServoUrl, use_placeholder: UsePlaceholder)
|
||||
-> Option<ImageOrMetadataAvailable> {
|
||||
// If we are emitting an output file, load the image synchronously.
|
||||
if opts::get().output_file.is_some() || opts::get().exit_after_load {
|
||||
|
@ -190,23 +190,23 @@ impl SharedLayoutContext {
|
|||
}
|
||||
|
||||
pub fn get_webrender_image_for_url(&self,
|
||||
url: &Url,
|
||||
url: ServoUrl,
|
||||
use_placeholder: UsePlaceholder)
|
||||
-> Option<WebRenderImageInfo> {
|
||||
if let Some(existing_webrender_image) = self.webrender_image_cache
|
||||
.read()
|
||||
.get(&((*url).clone(), use_placeholder)) {
|
||||
.get(&(url.clone(), use_placeholder)) {
|
||||
return Some((*existing_webrender_image).clone())
|
||||
}
|
||||
|
||||
match self.get_or_request_image_or_meta((*url).clone(), use_placeholder) {
|
||||
match self.get_or_request_image_or_meta(url.clone(), use_placeholder) {
|
||||
Some(ImageOrMetadataAvailable::ImageAvailable(image)) => {
|
||||
let image_info = WebRenderImageInfo::from_image(&*image);
|
||||
if image_info.key.is_none() {
|
||||
Some(image_info)
|
||||
} else {
|
||||
let mut webrender_image_cache = self.webrender_image_cache.write();
|
||||
webrender_image_cache.insert(((*url).clone(), use_placeholder),
|
||||
webrender_image_cache.insert((url, use_placeholder),
|
||||
image_info);
|
||||
Some(image_info)
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@ use model::{self, MaybeAuto, ToGfxMatrix};
|
|||
use net_traits::image::base::PixelFormat;
|
||||
use net_traits::image_cache_thread::UsePlaceholder;
|
||||
use range::Range;
|
||||
use servo_url::ServoUrl;
|
||||
use std::{cmp, f32};
|
||||
use std::collections::HashMap;
|
||||
use std::default::Default;
|
||||
|
@ -57,7 +58,6 @@ use style::values::computed::{Gradient, GradientKind, LengthOrPercentage, Length
|
|||
use style::values::specified::{AngleOrCorner, HorizontalDirection, VerticalDirection};
|
||||
use style_traits::cursor::Cursor;
|
||||
use table_cell::CollapsedBordersForCell;
|
||||
use url::Url;
|
||||
use util::opts;
|
||||
use webrender_traits::{ColorF, GradientStop};
|
||||
|
||||
|
@ -360,7 +360,7 @@ pub trait FragmentDisplayListBuilding {
|
|||
display_list_section: DisplayListSection,
|
||||
absolute_bounds: &Rect<Au>,
|
||||
clip: &ClippingRegion,
|
||||
image_url: &Url,
|
||||
image_url: &ServoUrl,
|
||||
background_index: usize);
|
||||
|
||||
/// Adds the display items necessary to paint the background linear gradient of this fragment
|
||||
|
@ -692,11 +692,11 @@ impl FragmentDisplayListBuilding for Fragment {
|
|||
display_list_section: DisplayListSection,
|
||||
absolute_bounds: &Rect<Au>,
|
||||
clip: &ClippingRegion,
|
||||
image_url: &Url,
|
||||
image_url: &ServoUrl,
|
||||
index: usize) {
|
||||
let background = style.get_background();
|
||||
let webrender_image = state.shared_layout_context
|
||||
.get_webrender_image_for_url(image_url,
|
||||
.get_webrender_image_for_url(image_url.clone(),
|
||||
UsePlaceholder::No);
|
||||
|
||||
if let Some(webrender_image) = webrender_image {
|
||||
|
|
|
@ -32,6 +32,7 @@ use script_layout_interface::HTMLCanvasData;
|
|||
use script_layout_interface::SVGSVGData;
|
||||
use script_layout_interface::wrapper_traits::{PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode};
|
||||
use serde::{Serialize, Serializer};
|
||||
use servo_url::ServoUrl;
|
||||
use std::borrow::ToOwned;
|
||||
use std::cmp::{max, min};
|
||||
use std::collections::LinkedList;
|
||||
|
@ -54,7 +55,6 @@ use style::values::computed::{LengthOrPercentage, LengthOrPercentageOrAuto};
|
|||
use style::values::computed::LengthOrPercentageOrNone;
|
||||
use text;
|
||||
use text::TextRunScanner;
|
||||
use url::Url;
|
||||
|
||||
// From gfxFontConstants.h in Firefox.
|
||||
static FONT_SUBSCRIPT_OFFSET_RATIO: f32 = 0.20;
|
||||
|
@ -419,7 +419,7 @@ impl ImageFragmentInfo {
|
|||
///
|
||||
/// FIXME(pcwalton): The fact that image fragments store the cache in the fragment makes little
|
||||
/// sense to me.
|
||||
pub fn new<N: ThreadSafeLayoutNode>(node: &N, url: Option<Url>,
|
||||
pub fn new<N: ThreadSafeLayoutNode>(node: &N, url: Option<ServoUrl>,
|
||||
shared_layout_context: &SharedLayoutContext)
|
||||
-> ImageFragmentInfo {
|
||||
let image_or_metadata = url.and_then(|url| {
|
||||
|
|
|
@ -52,12 +52,12 @@ extern crate serde;
|
|||
extern crate serde_derive;
|
||||
extern crate serde_json;
|
||||
#[macro_use] extern crate servo_atoms;
|
||||
extern crate servo_url;
|
||||
extern crate smallvec;
|
||||
extern crate style;
|
||||
extern crate style_traits;
|
||||
extern crate unicode_bidi;
|
||||
extern crate unicode_script;
|
||||
extern crate url;
|
||||
extern crate util;
|
||||
extern crate webrender_traits;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue