mirror of
https://github.com/servo/servo.git
synced 2025-08-13 17:35:36 +01:00
layout: Add support for <object>
with image data URLs (#32069)
This is enough support for `<object>` to get Acid2 working. Co-authored-by: Oriol Brufau <obrufau@igalia.com>
This commit is contained in:
parent
a77c15ee16
commit
f379041597
8 changed files with 76 additions and 9 deletions
|
@ -6,10 +6,15 @@ use std::marker::PhantomData;
|
|||
use std::sync::{Arc, Mutex};
|
||||
|
||||
use atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut};
|
||||
use html5ever::{local_name, namespace_url, ns};
|
||||
use msg::constellation_msg::{BrowsingContextId, PipelineId};
|
||||
use net_traits::image::base::Image as NetImage;
|
||||
use script_layout_interface::wrapper_traits::{LayoutDataTrait, LayoutNode, ThreadSafeLayoutNode};
|
||||
use script_layout_interface::HTMLCanvasDataSource;
|
||||
use script_layout_interface::wrapper_traits::{
|
||||
LayoutDataTrait, LayoutNode, ThreadSafeLayoutElement, ThreadSafeLayoutNode,
|
||||
};
|
||||
use script_layout_interface::{
|
||||
HTMLCanvasDataSource, LayoutElementType, LayoutNodeType as ScriptLayoutNodeType,
|
||||
};
|
||||
use servo_arc::Arc as ServoArc;
|
||||
use style::properties::ComputedValues;
|
||||
|
||||
|
@ -95,6 +100,7 @@ pub(crate) trait NodeExt<'dom>: 'dom + LayoutNode<'dom> {
|
|||
fn as_canvas(self) -> Option<(CanvasInfo, PhysicalSize<f64>)>;
|
||||
fn as_iframe(self) -> Option<(PipelineId, BrowsingContextId)>;
|
||||
fn as_video(self) -> Option<(webrender_api::ImageKey, PhysicalSize<f64>)>;
|
||||
fn as_typeless_object_with_data_attribute(self) -> Option<String>;
|
||||
fn style(self, context: &LayoutContext) -> ServoArc<ComputedValues>;
|
||||
|
||||
fn layout_data_mut(self) -> AtomicRefMut<'dom, InnerDOMLayoutData>;
|
||||
|
@ -163,6 +169,25 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
fn as_typeless_object_with_data_attribute(self) -> Option<String> {
|
||||
if self.type_id() != ScriptLayoutNodeType::Element(LayoutElementType::HTMLObjectElement) {
|
||||
return None;
|
||||
}
|
||||
let Some(element) = self.to_threadsafe().as_element() else {
|
||||
return None;
|
||||
};
|
||||
|
||||
// TODO: This is the what the legacy layout system does, but really if Servo
|
||||
// supports any `<object>` that's an image, it should support those with URLs
|
||||
// and `type` attributes with image mime types.
|
||||
if element.get_attr(&ns!(), &local_name!("type")).is_some() {
|
||||
return None;
|
||||
}
|
||||
element
|
||||
.get_attr(&ns!(), &local_name!("data"))
|
||||
.map(|string| string.to_owned())
|
||||
}
|
||||
|
||||
fn style(self, context: &LayoutContext) -> ServoArc<ComputedValues> {
|
||||
self.to_threadsafe().style(context.shared_context())
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue