mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
Convert usages of Box
in type identifiers to Fragment
This commit is contained in:
parent
a578943b3c
commit
c5fced4390
13 changed files with 364 additions and 369 deletions
|
@ -12,7 +12,7 @@
|
|||
//!
|
||||
//! CB: Containing Block of the current flow.
|
||||
|
||||
use layout::box_::{Box, ImageBox, ScannedTextBox};
|
||||
use layout::box_::{Fragment, ImageFragment, ScannedTextFragment};
|
||||
use layout::construct::FlowConstructor;
|
||||
use layout::context::LayoutContext;
|
||||
use layout::floats::{ClearBoth, ClearLeft, ClearRight, FloatKind, Floats, PlacementInfo};
|
||||
|
@ -41,7 +41,6 @@ use servo_util::geometry;
|
|||
use std::fmt;
|
||||
use std::mem;
|
||||
use std::num::Zero;
|
||||
use std::owned;
|
||||
use style::computed_values::{LPA_Auto, LPA_Length, LPA_Percentage, LPN_Length, LPN_None};
|
||||
use style::computed_values::{LPN_Percentage, LP_Length, LP_Percentage, display, float, overflow};
|
||||
use sync::Arc;
|
||||
|
@ -490,7 +489,7 @@ pub struct BlockFlow {
|
|||
pub base: BaseFlow,
|
||||
|
||||
/// The associated box.
|
||||
pub box_: Box,
|
||||
pub box_: Fragment,
|
||||
|
||||
/// TODO: is_root should be a bit field to conserve memory.
|
||||
/// Whether this block flow is the root flow.
|
||||
|
@ -504,14 +503,14 @@ pub struct BlockFlow {
|
|||
previous_float_width: Option<Au>,
|
||||
|
||||
/// Additional floating flow members.
|
||||
pub float: Option<owned::Box<FloatedBlockInfo>>
|
||||
pub float: Option<Box<FloatedBlockInfo>>
|
||||
}
|
||||
|
||||
impl BlockFlow {
|
||||
pub fn from_node(constructor: &mut FlowConstructor, node: &ThreadSafeLayoutNode) -> BlockFlow {
|
||||
BlockFlow {
|
||||
base: BaseFlow::new((*node).clone()),
|
||||
box_: Box::new(constructor, node),
|
||||
box_: Fragment::new(constructor, node),
|
||||
is_root: false,
|
||||
static_y_offset: Au::new(0),
|
||||
previous_float_width: None,
|
||||
|
@ -519,7 +518,7 @@ impl BlockFlow {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn from_node_and_box(node: &ThreadSafeLayoutNode, box_: Box) -> BlockFlow {
|
||||
pub fn from_node_and_box(node: &ThreadSafeLayoutNode, box_: Fragment) -> BlockFlow {
|
||||
BlockFlow {
|
||||
base: BaseFlow::new((*node).clone()),
|
||||
box_: box_,
|
||||
|
@ -536,7 +535,7 @@ impl BlockFlow {
|
|||
-> BlockFlow {
|
||||
BlockFlow {
|
||||
base: BaseFlow::new((*node).clone()),
|
||||
box_: Box::new(constructor, node),
|
||||
box_: Fragment::new(constructor, node),
|
||||
is_root: false,
|
||||
static_y_offset: Au::new(0),
|
||||
previous_float_width: None,
|
||||
|
@ -602,7 +601,7 @@ impl BlockFlow {
|
|||
}
|
||||
|
||||
/// Return this flow's box.
|
||||
pub fn box_<'a>(&'a mut self) -> &'a mut Box {
|
||||
pub fn box_<'a>(&'a mut self) -> &'a mut Fragment {
|
||||
&mut self.box_
|
||||
}
|
||||
|
||||
|
@ -705,7 +704,7 @@ impl BlockFlow {
|
|||
/// image boxes.
|
||||
fn is_replaced_content(&self) -> bool {
|
||||
match self.box_.specific {
|
||||
ScannedTextBox(_) | ImageBox(_) => true,
|
||||
ScannedTextFragment(_) | ImageFragment(_) => true,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
@ -1203,11 +1202,11 @@ impl BlockFlow {
|
|||
let available_height = containing_block_height - self.box_.border_padding.vertical();
|
||||
if self.is_replaced_content() {
|
||||
// Calculate used value of height just like we do for inline replaced elements.
|
||||
// TODO: Pass in the containing block height when Box's
|
||||
// TODO: Pass in the containing block height when Fragment's
|
||||
// assign-height can handle it correctly.
|
||||
self.box_.assign_replaced_height_if_necessary();
|
||||
// TODO: Right now, this content height value includes the
|
||||
// margin because of erroneous height calculation in Box_.
|
||||
// margin because of erroneous height calculation in box_.
|
||||
// Check this when that has been fixed.
|
||||
let height_used_val = self.box_.border_box.size.height;
|
||||
solution = Some(HeightConstraintSolution::solve_vertical_constraints_abs_replaced(
|
||||
|
@ -1289,7 +1288,7 @@ impl BlockFlow {
|
|||
self.base.layers.push_back(new_layer)
|
||||
}
|
||||
|
||||
/// Return the top outer edge of the Hypothetical Box for an absolute flow.
|
||||
/// Return the top outer edge of the Hypothetical Fragment for an absolute flow.
|
||||
///
|
||||
/// This is wrt its parent flow box.
|
||||
///
|
||||
|
@ -1404,7 +1403,7 @@ impl BlockFlow {
|
|||
display::table_cell | display::table_caption | display::inline_block => {
|
||||
OtherFormattingContext
|
||||
}
|
||||
_ if style.get_box().position == position::static_ &&
|
||||
_ if style.get_box().position == position::static_ &&
|
||||
style.get_box().overflow != overflow::visible => {
|
||||
BlockFormattingContext
|
||||
}
|
||||
|
|
|
@ -44,7 +44,6 @@ use std::from_str::FromStr;
|
|||
use std::iter::AdditiveIterator;
|
||||
use std::mem;
|
||||
use std::num::Zero;
|
||||
use std::owned;
|
||||
use style::{ComputedValues, TElement, TNode, cascade_anonymous};
|
||||
use style::computed_values::{LengthOrPercentageOrAuto, overflow, LPA_Auto, background_attachment};
|
||||
use style::computed_values::{background_repeat, border_style, clear, position, text_align};
|
||||
|
@ -64,7 +63,7 @@ use url::Url;
|
|||
/// positioned as if it were a block box, but its children are positioned according to inline
|
||||
/// flow.
|
||||
///
|
||||
/// A `GenericBox` is an empty box that contributes only borders, margins, padding, and
|
||||
/// A `GenericFragment` is an empty box that contributes only borders, margins, padding, and
|
||||
/// backgrounds. It is analogous to a CSS nonreplaced content box.
|
||||
///
|
||||
/// A box's type influences how its styles are interpreted during layout. For example, replaced
|
||||
|
@ -73,8 +72,8 @@ use url::Url;
|
|||
///
|
||||
/// FIXME(#2260, pcwalton): This can be slimmed down some.
|
||||
#[deriving(Clone)]
|
||||
pub struct Box {
|
||||
/// An opaque reference to the DOM node that this `Box` originates from.
|
||||
pub struct Fragment {
|
||||
/// An opaque reference to the DOM node that this `Fragment` originates from.
|
||||
pub node: OpaqueNode,
|
||||
|
||||
/// The CSS style of this box.
|
||||
|
@ -92,7 +91,7 @@ pub struct Box {
|
|||
pub margin: SideOffsets2D<Au>,
|
||||
|
||||
/// Info specific to the kind of box. Keep this enum small.
|
||||
pub specific: SpecificBoxInfo,
|
||||
pub specific: SpecificFragmentInfo,
|
||||
|
||||
/// New-line chracter(\n)'s positions(relative, not absolute)
|
||||
///
|
||||
|
@ -102,22 +101,22 @@ pub struct Box {
|
|||
|
||||
/// Info specific to the kind of box. Keep this enum small.
|
||||
#[deriving(Clone)]
|
||||
pub enum SpecificBoxInfo {
|
||||
GenericBox,
|
||||
ImageBox(ImageBoxInfo),
|
||||
IframeBox(IframeBoxInfo),
|
||||
ScannedTextBox(ScannedTextBoxInfo),
|
||||
TableBox,
|
||||
TableCellBox,
|
||||
TableColumnBox(TableColumnBoxInfo),
|
||||
TableRowBox,
|
||||
TableWrapperBox,
|
||||
UnscannedTextBox(UnscannedTextBoxInfo),
|
||||
pub enum SpecificFragmentInfo {
|
||||
GenericFragment,
|
||||
ImageFragment(ImageFragmentInfo),
|
||||
IframeFragment(IframeFragmentInfo),
|
||||
ScannedTextFragment(ScannedTextFragmentInfo),
|
||||
TableFragment,
|
||||
TableCellFragment,
|
||||
TableColumnFragment(TableColumnFragmentInfo),
|
||||
TableRowFragment,
|
||||
TableWrapperFragment,
|
||||
UnscannedTextFragment(UnscannedTextFragmentInfo),
|
||||
}
|
||||
|
||||
/// A box that represents a replaced content image and its accompanying borders, shadows, etc.
|
||||
#[deriving(Clone)]
|
||||
pub struct ImageBoxInfo {
|
||||
pub struct ImageFragmentInfo {
|
||||
/// The image held within this box.
|
||||
pub image: ImageHolder,
|
||||
pub computed_width: Option<Au>,
|
||||
|
@ -126,7 +125,7 @@ pub struct ImageBoxInfo {
|
|||
pub dom_height: Option<Au>,
|
||||
}
|
||||
|
||||
impl ImageBoxInfo {
|
||||
impl ImageFragmentInfo {
|
||||
/// Creates a new image box from the given URL and local image cache.
|
||||
///
|
||||
/// FIXME(pcwalton): The fact that image boxes store the cache in the box makes little sense to
|
||||
|
@ -134,7 +133,7 @@ impl ImageBoxInfo {
|
|||
pub fn new(node: &ThreadSafeLayoutNode,
|
||||
image_url: Url,
|
||||
local_image_cache: LocalImageCacheHandle)
|
||||
-> ImageBoxInfo {
|
||||
-> ImageFragmentInfo {
|
||||
fn convert_length(node: &ThreadSafeLayoutNode, name: &str) -> Option<Au> {
|
||||
let element = node.as_element();
|
||||
element.get_attr(&namespace::Null, name).and_then(|string| {
|
||||
|
@ -143,7 +142,7 @@ impl ImageBoxInfo {
|
|||
}).and_then(|pixels| Some(Au::from_px(pixels)))
|
||||
}
|
||||
|
||||
ImageBoxInfo {
|
||||
ImageFragmentInfo {
|
||||
image: ImageHolder::new(image_url, local_image_cache),
|
||||
computed_width: None,
|
||||
computed_height: None,
|
||||
|
@ -200,18 +199,18 @@ impl ImageBoxInfo {
|
|||
/// A box that represents an inline frame (iframe). This stores the pipeline ID so that the size
|
||||
/// of this iframe can be communicated via the constellation to the iframe's own layout task.
|
||||
#[deriving(Clone)]
|
||||
pub struct IframeBoxInfo {
|
||||
pub struct IframeFragmentInfo {
|
||||
/// The pipeline ID of this iframe.
|
||||
pub pipeline_id: PipelineId,
|
||||
/// The subpage ID of this iframe.
|
||||
pub subpage_id: SubpageId,
|
||||
}
|
||||
|
||||
impl IframeBoxInfo {
|
||||
impl IframeFragmentInfo {
|
||||
/// Creates the information specific to an iframe box.
|
||||
pub fn new(node: &ThreadSafeLayoutNode) -> IframeBoxInfo {
|
||||
pub fn new(node: &ThreadSafeLayoutNode) -> IframeFragmentInfo {
|
||||
let (pipeline_id, subpage_id) = node.iframe_pipeline_and_subpage_ids();
|
||||
IframeBoxInfo {
|
||||
IframeFragmentInfo {
|
||||
pipeline_id: pipeline_id,
|
||||
subpage_id: subpage_id,
|
||||
}
|
||||
|
@ -223,18 +222,18 @@ impl IframeBoxInfo {
|
|||
/// DOM text node. Split text boxes are implemented by referring to subsets of a single `TextRun`
|
||||
/// object.
|
||||
#[deriving(Clone)]
|
||||
pub struct ScannedTextBoxInfo {
|
||||
pub struct ScannedTextFragmentInfo {
|
||||
/// The text run that this represents.
|
||||
pub run: Arc<owned::Box<TextRun>>,
|
||||
pub run: Arc<Box<TextRun>>,
|
||||
|
||||
/// The range within the above text run that this represents.
|
||||
pub range: Range<CharIndex>,
|
||||
}
|
||||
|
||||
impl ScannedTextBoxInfo {
|
||||
impl ScannedTextFragmentInfo {
|
||||
/// Creates the information specific to a scanned text box from a range and a text run.
|
||||
pub fn new(run: Arc<owned::Box<TextRun>>, range: Range<CharIndex>) -> ScannedTextBoxInfo {
|
||||
ScannedTextBoxInfo {
|
||||
pub fn new(run: Arc<Box<TextRun>>, range: Range<CharIndex>) -> ScannedTextFragmentInfo {
|
||||
ScannedTextFragmentInfo {
|
||||
run: run,
|
||||
range: range,
|
||||
}
|
||||
|
@ -250,7 +249,7 @@ pub struct SplitInfo {
|
|||
}
|
||||
|
||||
impl SplitInfo {
|
||||
fn new(range: Range<CharIndex>, info: &ScannedTextBoxInfo) -> SplitInfo {
|
||||
fn new(range: Range<CharIndex>, info: &ScannedTextFragmentInfo) -> SplitInfo {
|
||||
SplitInfo {
|
||||
range: range,
|
||||
width: info.run.advance_for_range(&range),
|
||||
|
@ -261,24 +260,24 @@ impl SplitInfo {
|
|||
/// Data for an unscanned text box. Unscanned text boxes are the results of flow construction that
|
||||
/// have not yet had their width determined.
|
||||
#[deriving(Clone)]
|
||||
pub struct UnscannedTextBoxInfo {
|
||||
pub struct UnscannedTextFragmentInfo {
|
||||
/// The text inside the box.
|
||||
pub text: ~str,
|
||||
}
|
||||
|
||||
impl UnscannedTextBoxInfo {
|
||||
/// Creates a new instance of `UnscannedTextBoxInfo` from the given DOM node.
|
||||
pub fn new(node: &ThreadSafeLayoutNode) -> UnscannedTextBoxInfo {
|
||||
impl UnscannedTextFragmentInfo {
|
||||
/// Creates a new instance of `UnscannedTextFragmentInfo` from the given DOM node.
|
||||
pub fn new(node: &ThreadSafeLayoutNode) -> UnscannedTextFragmentInfo {
|
||||
// FIXME(pcwalton): Don't copy text; atomically reference count it instead.
|
||||
UnscannedTextBoxInfo {
|
||||
UnscannedTextFragmentInfo {
|
||||
text: node.text(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Creates a new instance of `UnscannedTextBoxInfo` from the given text.
|
||||
/// Creates a new instance of `UnscannedTextFragmentInfo` from the given text.
|
||||
#[inline]
|
||||
pub fn from_text(text: ~str) -> UnscannedTextBoxInfo {
|
||||
UnscannedTextBoxInfo {
|
||||
pub fn from_text(text: ~str) -> UnscannedTextFragmentInfo {
|
||||
UnscannedTextFragmentInfo {
|
||||
text: text,
|
||||
}
|
||||
}
|
||||
|
@ -286,14 +285,14 @@ impl UnscannedTextBoxInfo {
|
|||
|
||||
/// A box that represents a table column.
|
||||
#[deriving(Clone)]
|
||||
pub struct TableColumnBoxInfo {
|
||||
pub struct TableColumnFragmentInfo {
|
||||
/// the number of columns a <col> element should span
|
||||
pub span: Option<int>,
|
||||
}
|
||||
|
||||
impl TableColumnBoxInfo {
|
||||
impl TableColumnFragmentInfo {
|
||||
/// Create the information specific to an table column box.
|
||||
pub fn new(node: &ThreadSafeLayoutNode) -> TableColumnBoxInfo {
|
||||
pub fn new(node: &ThreadSafeLayoutNode) -> TableColumnFragmentInfo {
|
||||
let span = {
|
||||
let element = node.as_element();
|
||||
element.get_attr(&namespace::Null, "span").and_then(|string| {
|
||||
|
@ -301,22 +300,22 @@ impl TableColumnBoxInfo {
|
|||
n
|
||||
})
|
||||
};
|
||||
TableColumnBoxInfo {
|
||||
TableColumnFragmentInfo {
|
||||
span: span,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Box {
|
||||
/// Constructs a new `Box` instance for the given node.
|
||||
impl Fragment {
|
||||
/// Constructs a new `Fragment` instance for the given node.
|
||||
///
|
||||
/// Arguments:
|
||||
///
|
||||
/// * `constructor`: The flow constructor.
|
||||
///
|
||||
/// * `node`: The node to create a box for.
|
||||
pub fn new(constructor: &mut FlowConstructor, node: &ThreadSafeLayoutNode) -> Box {
|
||||
Box {
|
||||
pub fn new(constructor: &mut FlowConstructor, node: &ThreadSafeLayoutNode) -> Fragment {
|
||||
Fragment {
|
||||
node: OpaqueNodeMethods::from_thread_safe_layout_node(node),
|
||||
style: node.style().clone(),
|
||||
border_box: Rect::zero(),
|
||||
|
@ -327,9 +326,9 @@ impl Box {
|
|||
}
|
||||
}
|
||||
|
||||
/// Constructs a new `Box` instance from a specific info.
|
||||
pub fn new_from_specific_info(node: &ThreadSafeLayoutNode, specific: SpecificBoxInfo) -> Box {
|
||||
Box {
|
||||
/// Constructs a new `Fragment` instance from a specific info.
|
||||
pub fn new_from_specific_info(node: &ThreadSafeLayoutNode, specific: SpecificFragmentInfo) -> Fragment {
|
||||
Fragment {
|
||||
node: OpaqueNodeMethods::from_thread_safe_layout_node(node),
|
||||
style: node.style().clone(),
|
||||
border_box: Rect::zero(),
|
||||
|
@ -340,8 +339,8 @@ impl Box {
|
|||
}
|
||||
}
|
||||
|
||||
/// Constructs a new `Box` instance for an anonymous table object.
|
||||
pub fn new_anonymous_table_box(node: &ThreadSafeLayoutNode, specific: SpecificBoxInfo) -> Box {
|
||||
/// Constructs a new `Fragment` instance for an anonymous table object.
|
||||
pub fn new_anonymous_table_box(node: &ThreadSafeLayoutNode, specific: SpecificFragmentInfo) -> Fragment {
|
||||
// CSS 2.1 § 17.2.1 This is for non-inherited properties on anonymous table boxes
|
||||
// example:
|
||||
//
|
||||
|
@ -349,10 +348,10 @@ impl Box {
|
|||
// Foo
|
||||
// </div>
|
||||
//
|
||||
// Anonymous table boxes, TableRowBox and TableCellBox, are generated around `Foo`, but it shouldn't inherit the border.
|
||||
// Anonymous table boxes, TableRowFragment and TableCellFragment, are generated around `Foo`, but it shouldn't inherit the border.
|
||||
|
||||
let node_style = cascade_anonymous(&**node.style());
|
||||
Box {
|
||||
Fragment {
|
||||
node: OpaqueNodeMethods::from_thread_safe_layout_node(node),
|
||||
style: Arc::new(node_style),
|
||||
border_box: Rect::zero(),
|
||||
|
@ -363,12 +362,12 @@ impl Box {
|
|||
}
|
||||
}
|
||||
|
||||
/// Constructs a new `Box` instance from an opaque node.
|
||||
/// Constructs a new `Fragment` instance from an opaque node.
|
||||
pub fn from_opaque_node_and_style(node: OpaqueNode,
|
||||
style: Arc<ComputedValues>,
|
||||
specific: SpecificBoxInfo)
|
||||
-> Box {
|
||||
Box {
|
||||
specific: SpecificFragmentInfo)
|
||||
-> Fragment {
|
||||
Fragment {
|
||||
node: node,
|
||||
style: style,
|
||||
border_box: Rect::zero(),
|
||||
|
@ -389,8 +388,8 @@ impl Box {
|
|||
|
||||
/// Transforms this box into another box of the given type, with the given size, preserving all
|
||||
/// the other data.
|
||||
pub fn transform(&self, size: Size2D<Au>, specific: SpecificBoxInfo) -> Box {
|
||||
Box {
|
||||
pub fn transform(&self, size: Size2D<Au>, specific: SpecificFragmentInfo) -> Fragment {
|
||||
Fragment {
|
||||
node: self.node,
|
||||
style: self.style.clone(),
|
||||
border_box: Rect(self.border_box.origin, size),
|
||||
|
@ -405,11 +404,11 @@ impl Box {
|
|||
/// replaced elements.
|
||||
fn style_specified_intrinsic_width(&self) -> IntrinsicWidths {
|
||||
let (use_margins, use_padding) = match self.specific {
|
||||
GenericBox | IframeBox(_) | ImageBox(_) => (true, true),
|
||||
TableBox | TableCellBox => (false, true),
|
||||
TableWrapperBox => (true, false),
|
||||
TableRowBox => (false, false),
|
||||
ScannedTextBox(_) | TableColumnBox(_) | UnscannedTextBox(_) => {
|
||||
GenericFragment | IframeFragment(_) | ImageFragment(_) => (true, true),
|
||||
TableFragment | TableCellFragment => (false, true),
|
||||
TableWrapperFragment => (true, false),
|
||||
TableRowFragment => (false, false),
|
||||
ScannedTextFragment(_) | TableColumnFragment(_) | UnscannedTextFragment(_) => {
|
||||
// Styles are irrelevant for these kinds of boxes.
|
||||
return IntrinsicWidths::new()
|
||||
}
|
||||
|
@ -471,7 +470,7 @@ impl Box {
|
|||
// Compute vertical margins. Note that this value will be ignored by layout if the style
|
||||
// specifies `auto`.
|
||||
match self.specific {
|
||||
TableBox | TableCellBox | TableRowBox | TableColumnBox(_) => {
|
||||
TableFragment | TableCellFragment | TableRowFragment | TableColumnFragment(_) => {
|
||||
self.margin.top = Au(0);
|
||||
self.margin.bottom = Au(0)
|
||||
}
|
||||
|
@ -496,7 +495,7 @@ impl Box {
|
|||
|
||||
// Compute padding.
|
||||
let padding = match self.specific {
|
||||
TableColumnBox(_) | TableRowBox | TableWrapperBox => Zero::zero(),
|
||||
TableColumnFragment(_) | TableRowFragment | TableWrapperFragment => Zero::zero(),
|
||||
_ => {
|
||||
match inline_fragment_context {
|
||||
None => model::padding_from_style(self.style(), containing_block_width),
|
||||
|
@ -621,9 +620,9 @@ impl Box {
|
|||
/// inlines.
|
||||
pub fn left_offset(&self) -> Au {
|
||||
match self.specific {
|
||||
TableWrapperBox => self.margin.left,
|
||||
TableBox | TableCellBox | TableRowBox => self.border_padding.left,
|
||||
TableColumnBox(_) => Au(0),
|
||||
TableWrapperFragment => self.margin.left,
|
||||
TableFragment | TableCellFragment | TableRowFragment => self.border_padding.left,
|
||||
TableColumnFragment(_) => Au(0),
|
||||
_ => self.margin.left + self.border_padding.left,
|
||||
}
|
||||
}
|
||||
|
@ -631,7 +630,7 @@ impl Box {
|
|||
/// Returns true if this element can be split. This is true for text boxes.
|
||||
pub fn can_split(&self) -> bool {
|
||||
match self.specific {
|
||||
ScannedTextBox(..) => true,
|
||||
ScannedTextFragment(..) => true,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
@ -782,7 +781,7 @@ impl Box {
|
|||
fn build_debug_borders_around_text_boxes(&self,
|
||||
display_list: &mut DisplayList,
|
||||
flow_origin: Point2D<Au>,
|
||||
text_box: &ScannedTextBoxInfo) {
|
||||
text_box: &ScannedTextFragmentInfo) {
|
||||
let box_bounds = self.border_box;
|
||||
let absolute_box_bounds = box_bounds.translate(&flow_origin);
|
||||
|
||||
|
@ -844,14 +843,14 @@ impl Box {
|
|||
background_and_border_level: BackgroundAndBorderLevel,
|
||||
inline_fragment_context: Option<InlineFragmentContext>)
|
||||
-> ChildDisplayListAccumulator {
|
||||
// Box position wrt to the owning flow.
|
||||
// Fragment position wrt to the owning flow.
|
||||
let box_bounds = self.border_box;
|
||||
let absolute_box_bounds = box_bounds.translate(&flow_origin);
|
||||
debug!("Box::build_display_list at rel={}, abs={}: {}",
|
||||
debug!("Fragment::build_display_list at rel={}, abs={}: {}",
|
||||
box_bounds,
|
||||
absolute_box_bounds,
|
||||
self);
|
||||
debug!("Box::build_display_list: dirty={}, flow_origin={}",
|
||||
debug!("Fragment::build_display_list: dirty={}, flow_origin={}",
|
||||
layout_context.dirty,
|
||||
flow_origin);
|
||||
|
||||
|
@ -864,11 +863,11 @@ impl Box {
|
|||
}
|
||||
|
||||
if !absolute_box_bounds.intersects(&layout_context.dirty) {
|
||||
debug!("Box::build_display_list: Did not intersect...");
|
||||
debug!("Fragment::build_display_list: Did not intersect...");
|
||||
return accumulator
|
||||
}
|
||||
|
||||
debug!("Box::build_display_list: intersected. Adding display item...");
|
||||
debug!("Fragment::build_display_list: intersected. Adding display item...");
|
||||
|
||||
{
|
||||
let level =
|
||||
|
@ -895,9 +894,9 @@ impl Box {
|
|||
|
||||
// Add a clip, if applicable.
|
||||
match self.specific {
|
||||
UnscannedTextBox(_) => fail!("Shouldn't see unscanned boxes here."),
|
||||
TableColumnBox(_) => fail!("Shouldn't see table column boxes here."),
|
||||
ScannedTextBox(ref text_box) => {
|
||||
UnscannedTextFragment(_) => fail!("Shouldn't see unscanned boxes here."),
|
||||
TableColumnFragment(_) => fail!("Shouldn't see table column boxes here."),
|
||||
ScannedTextFragment(ref text_box) => {
|
||||
// Compute text color.
|
||||
let text_color = self.style().get_color().color.to_gfx_color();
|
||||
|
||||
|
@ -934,13 +933,13 @@ impl Box {
|
|||
flow_origin,
|
||||
text_box))
|
||||
},
|
||||
GenericBox | IframeBox(..) | TableBox | TableCellBox | TableRowBox |
|
||||
TableWrapperBox => {
|
||||
GenericFragment | IframeFragment(..) | TableFragment | TableCellFragment | TableRowFragment |
|
||||
TableWrapperFragment => {
|
||||
// FIXME(pcwalton): This is a bit of an abuse of the logging infrastructure. We
|
||||
// should have a real `SERVO_DEBUG` system.
|
||||
debug!("{:?}", self.build_debug_borders_around_box(display_list, flow_origin))
|
||||
},
|
||||
ImageBox(_) => {
|
||||
ImageFragment(_) => {
|
||||
let mut bounds = absolute_box_bounds.clone();
|
||||
bounds.origin.x = bounds.origin.x + self.border_padding.left;
|
||||
bounds.origin.y = bounds.origin.y + self.border_padding.top;
|
||||
|
@ -948,7 +947,7 @@ impl Box {
|
|||
bounds.size.height = bounds.size.height - self.border_padding.vertical();
|
||||
|
||||
match self.specific {
|
||||
ImageBox(ref image_box) => {
|
||||
ImageFragment(ref image_box) => {
|
||||
let image_ref = &image_box.image;
|
||||
match image_ref.get_image_if_present() {
|
||||
Some(image) => {
|
||||
|
@ -993,7 +992,7 @@ impl Box {
|
|||
// layout for the iframe only needs to know size, and origin is only relevant if the
|
||||
// iframe is actually going to be displayed.
|
||||
match self.specific {
|
||||
IframeBox(ref iframe_box) => {
|
||||
IframeFragment(ref iframe_box) => {
|
||||
self.finalize_position_and_size_of_iframe(iframe_box, flow_origin, layout_context)
|
||||
}
|
||||
_ => {}
|
||||
|
@ -1008,14 +1007,14 @@ impl Box {
|
|||
let mut result = self.style_specified_intrinsic_width();
|
||||
|
||||
match self.specific {
|
||||
GenericBox | IframeBox(_) | TableBox | TableCellBox | TableColumnBox(_) | TableRowBox |
|
||||
TableWrapperBox => {}
|
||||
ImageBox(ref mut image_box_info) => {
|
||||
GenericFragment | IframeFragment(_) | TableFragment | TableCellFragment | TableColumnFragment(_) | TableRowFragment |
|
||||
TableWrapperFragment => {}
|
||||
ImageFragment(ref mut image_box_info) => {
|
||||
let image_width = image_box_info.image_width();
|
||||
result.minimum_width = geometry::max(result.minimum_width, image_width);
|
||||
result.preferred_width = geometry::max(result.preferred_width, image_width);
|
||||
}
|
||||
ScannedTextBox(ref text_box_info) => {
|
||||
ScannedTextFragment(ref text_box_info) => {
|
||||
let range = &text_box_info.range;
|
||||
let min_line_width = text_box_info.run.min_width_for_range(range);
|
||||
|
||||
|
@ -1028,7 +1027,7 @@ impl Box {
|
|||
result.minimum_width = geometry::max(result.minimum_width, min_line_width);
|
||||
result.preferred_width = geometry::max(result.preferred_width, max_line_width);
|
||||
}
|
||||
UnscannedTextBox(..) => fail!("Unscanned text boxes should have been scanned by now!"),
|
||||
UnscannedTextFragment(..) => fail!("Unscanned text boxes should have been scanned by now!"),
|
||||
}
|
||||
|
||||
// Take borders and padding for parent inline boxes into account, if necessary.
|
||||
|
@ -1048,33 +1047,33 @@ impl Box {
|
|||
}
|
||||
|
||||
|
||||
/// TODO: What exactly does this function return? Why is it Au(0) for GenericBox?
|
||||
/// TODO: What exactly does this function return? Why is it Au(0) for GenericFragment?
|
||||
pub fn content_width(&self) -> Au {
|
||||
match self.specific {
|
||||
GenericBox | IframeBox(_) | TableBox | TableCellBox | TableRowBox |
|
||||
TableWrapperBox => Au(0),
|
||||
ImageBox(ref image_box_info) => {
|
||||
GenericFragment | IframeFragment(_) | TableFragment | TableCellFragment | TableRowFragment |
|
||||
TableWrapperFragment => Au(0),
|
||||
ImageFragment(ref image_box_info) => {
|
||||
image_box_info.computed_width()
|
||||
}
|
||||
ScannedTextBox(ref text_box_info) => {
|
||||
ScannedTextFragment(ref text_box_info) => {
|
||||
let (range, run) = (&text_box_info.range, &text_box_info.run);
|
||||
let text_bounds = run.metrics_for_range(range).bounding_box;
|
||||
text_bounds.size.width
|
||||
}
|
||||
TableColumnBox(_) => fail!("Table column boxes do not have width"),
|
||||
UnscannedTextBox(_) => fail!("Unscanned text boxes should have been scanned by now!"),
|
||||
TableColumnFragment(_) => fail!("Table column boxes do not have width"),
|
||||
UnscannedTextFragment(_) => fail!("Unscanned text boxes should have been scanned by now!"),
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns, and computes, the height of this box.
|
||||
pub fn content_height(&self) -> Au {
|
||||
match self.specific {
|
||||
GenericBox | IframeBox(_) | TableBox | TableCellBox | TableRowBox |
|
||||
TableWrapperBox => Au(0),
|
||||
ImageBox(ref image_box_info) => {
|
||||
GenericFragment | IframeFragment(_) | TableFragment | TableCellFragment | TableRowFragment |
|
||||
TableWrapperFragment => Au(0),
|
||||
ImageFragment(ref image_box_info) => {
|
||||
image_box_info.computed_height()
|
||||
}
|
||||
ScannedTextBox(ref text_box_info) => {
|
||||
ScannedTextFragment(ref text_box_info) => {
|
||||
// Compute the height based on the line-height and font size.
|
||||
//
|
||||
// FIXME(pcwalton): Shouldn't we use the value of the `font-size` property below
|
||||
|
@ -1084,8 +1083,8 @@ impl Box {
|
|||
let em_size = text_bounds.size.height;
|
||||
self.calculate_line_height(em_size)
|
||||
}
|
||||
TableColumnBox(_) => fail!("Table column boxes do not have height"),
|
||||
UnscannedTextBox(_) => fail!("Unscanned text boxes should have been scanned by now!"),
|
||||
TableColumnFragment(_) => fail!("Table column boxes do not have height"),
|
||||
UnscannedTextFragment(_) => fail!("Unscanned text boxes should have been scanned by now!"),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1112,13 +1111,13 @@ impl Box {
|
|||
// TODO(bjz): The text run should be removed in the future, but it is currently needed for
|
||||
// the current method of box splitting in the `inline::try_append_*` functions.
|
||||
pub fn find_split_info_by_new_line(&self)
|
||||
-> Option<(SplitInfo, Option<SplitInfo>, Arc<owned::Box<TextRun>> /* TODO(bjz): remove */)> {
|
||||
-> Option<(SplitInfo, Option<SplitInfo>, Arc<Box<TextRun>> /* TODO(bjz): remove */)> {
|
||||
match self.specific {
|
||||
GenericBox | IframeBox(_) | ImageBox(_) | TableBox | TableCellBox |
|
||||
TableRowBox | TableWrapperBox => None,
|
||||
TableColumnBox(_) => fail!("Table column boxes do not need to split"),
|
||||
UnscannedTextBox(_) => fail!("Unscanned text boxes should have been scanned by now!"),
|
||||
ScannedTextBox(ref text_box_info) => {
|
||||
GenericFragment | IframeFragment(_) | ImageFragment(_) | TableFragment | TableCellFragment |
|
||||
TableRowFragment | TableWrapperFragment => None,
|
||||
TableColumnFragment(_) => fail!("Table column boxes do not need to split"),
|
||||
UnscannedTextFragment(_) => fail!("Unscanned text boxes should have been scanned by now!"),
|
||||
ScannedTextFragment(ref text_box_info) => {
|
||||
let mut new_line_pos = self.new_line_pos.clone();
|
||||
let cur_new_line_pos = new_line_pos.shift().unwrap();
|
||||
|
||||
|
@ -1152,13 +1151,13 @@ impl Box {
|
|||
// TODO(bjz): The text run should be removed in the future, but it is currently needed for
|
||||
// the current method of box splitting in the `inline::try_append_*` functions.
|
||||
pub fn find_split_info_for_width(&self, start: CharIndex, max_width: Au, starts_line: bool)
|
||||
-> Option<(Option<SplitInfo>, Option<SplitInfo>, Arc<owned::Box<TextRun>> /* TODO(bjz): remove */)> {
|
||||
-> Option<(Option<SplitInfo>, Option<SplitInfo>, Arc<Box<TextRun>> /* TODO(bjz): remove */)> {
|
||||
match self.specific {
|
||||
GenericBox | IframeBox(_) | ImageBox(_) | TableBox | TableCellBox |
|
||||
TableRowBox | TableWrapperBox => None,
|
||||
TableColumnBox(_) => fail!("Table column boxes do not have width"),
|
||||
UnscannedTextBox(_) => fail!("Unscanned text boxes should have been scanned by now!"),
|
||||
ScannedTextBox(ref text_box_info) => {
|
||||
GenericFragment | IframeFragment(_) | ImageFragment(_) | TableFragment | TableCellFragment |
|
||||
TableRowFragment | TableWrapperFragment => None,
|
||||
TableColumnFragment(_) => fail!("Table column boxes do not have width"),
|
||||
UnscannedTextFragment(_) => fail!("Unscanned text boxes should have been scanned by now!"),
|
||||
ScannedTextFragment(ref text_box_info) => {
|
||||
let mut pieces_processed_count: uint = 0;
|
||||
let mut remaining_width: Au = max_width;
|
||||
let mut left_range = Range::new(text_box_info.range.begin() + start, CharIndex(0));
|
||||
|
@ -1249,7 +1248,7 @@ impl Box {
|
|||
/// Returns true if this box is an unscanned text box that consists entirely of whitespace.
|
||||
pub fn is_whitespace_only(&self) -> bool {
|
||||
match self.specific {
|
||||
UnscannedTextBox(ref text_box_info) => is_whitespace(text_box_info.text),
|
||||
UnscannedTextFragment(ref text_box_info) => is_whitespace(text_box_info.text),
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
@ -1261,11 +1260,11 @@ impl Box {
|
|||
inline_fragment_context:
|
||||
Option<InlineFragmentContext>) {
|
||||
match self.specific {
|
||||
GenericBox | IframeBox(_) | TableBox | TableCellBox | TableRowBox |
|
||||
TableWrapperBox => return,
|
||||
TableColumnBox(_) => fail!("Table column boxes do not have width"),
|
||||
UnscannedTextBox(_) => fail!("Unscanned text boxes should have been scanned by now!"),
|
||||
ImageBox(_) | ScannedTextBox(_) => {}
|
||||
GenericFragment | IframeFragment(_) | TableFragment | TableCellFragment | TableRowFragment |
|
||||
TableWrapperFragment => return,
|
||||
TableColumnFragment(_) => fail!("Table column boxes do not have width"),
|
||||
UnscannedTextFragment(_) => fail!("Unscanned text boxes should have been scanned by now!"),
|
||||
ImageFragment(_) | ScannedTextFragment(_) => {}
|
||||
};
|
||||
|
||||
self.compute_border_padding_margins(container_width, inline_fragment_context);
|
||||
|
@ -1275,17 +1274,17 @@ impl Box {
|
|||
let noncontent_width = self.border_padding.horizontal();
|
||||
|
||||
match self.specific {
|
||||
ScannedTextBox(_) => {
|
||||
ScannedTextFragment(_) => {
|
||||
// Scanned text boxes will have already had their content widths assigned by this
|
||||
// point.
|
||||
self.border_box.size.width = self.border_box.size.width + noncontent_width
|
||||
}
|
||||
ImageBox(ref mut image_box_info) => {
|
||||
ImageFragment(ref mut image_box_info) => {
|
||||
// TODO(ksh8281): compute border,margin
|
||||
let width = ImageBoxInfo::style_length(style_width,
|
||||
let width = ImageFragmentInfo::style_length(style_width,
|
||||
image_box_info.dom_width,
|
||||
container_width);
|
||||
let height = ImageBoxInfo::style_length(style_height,
|
||||
let height = ImageFragmentInfo::style_length(style_height,
|
||||
image_box_info.dom_height,
|
||||
Au(0));
|
||||
|
||||
|
@ -1312,11 +1311,11 @@ impl Box {
|
|||
/// Ideally, this should follow CSS 2.1 § 10.6.2.
|
||||
pub fn assign_replaced_height_if_necessary(&mut self) {
|
||||
match self.specific {
|
||||
GenericBox | IframeBox(_) | TableBox | TableCellBox | TableRowBox |
|
||||
TableWrapperBox => return,
|
||||
TableColumnBox(_) => fail!("Table column boxes do not have height"),
|
||||
UnscannedTextBox(_) => fail!("Unscanned text boxes should have been scanned by now!"),
|
||||
ImageBox(_) | ScannedTextBox(_) => {}
|
||||
GenericFragment | IframeFragment(_) | TableFragment | TableCellFragment | TableRowFragment |
|
||||
TableWrapperFragment => return,
|
||||
TableColumnFragment(_) => fail!("Table column boxes do not have height"),
|
||||
UnscannedTextFragment(_) => fail!("Unscanned text boxes should have been scanned by now!"),
|
||||
ImageFragment(_) | ScannedTextFragment(_) => {}
|
||||
}
|
||||
|
||||
let style_width = self.style().get_box().width;
|
||||
|
@ -1324,12 +1323,12 @@ impl Box {
|
|||
let noncontent_height = self.border_padding.vertical();
|
||||
|
||||
match self.specific {
|
||||
ImageBox(ref mut image_box_info) => {
|
||||
ImageFragment(ref mut image_box_info) => {
|
||||
// TODO(ksh8281): compute border,margin,padding
|
||||
let width = image_box_info.computed_width();
|
||||
// FIXME(ksh8281): we shouldn't assign height this way
|
||||
// we don't know about size of parent's height
|
||||
let height = ImageBoxInfo::style_length(style_height,
|
||||
let height = ImageFragmentInfo::style_length(style_height,
|
||||
image_box_info.dom_height,
|
||||
Au(0));
|
||||
|
||||
|
@ -1350,7 +1349,7 @@ impl Box {
|
|||
image_box_info.computed_height = Some(height);
|
||||
self.border_box.size.height = height + noncontent_height
|
||||
}
|
||||
ScannedTextBox(_) => {
|
||||
ScannedTextFragment(_) => {
|
||||
// Scanned text boxes' content heights are calculated by the text run scanner
|
||||
// during flow construction.
|
||||
self.border_box.size.height = self.border_box.size.height + noncontent_height
|
||||
|
@ -1363,7 +1362,7 @@ impl Box {
|
|||
/// used in an inline formatting context. See CSS 2.1 § 10.8.1.
|
||||
pub fn inline_metrics(&self) -> InlineMetrics {
|
||||
match self.specific {
|
||||
ImageBox(ref image_box_info) => {
|
||||
ImageFragment(ref image_box_info) => {
|
||||
let computed_height = image_box_info.computed_height();
|
||||
InlineMetrics {
|
||||
height_above_baseline: computed_height + self.border_padding.vertical(),
|
||||
|
@ -1371,7 +1370,7 @@ impl Box {
|
|||
ascent: computed_height + self.border_padding.bottom,
|
||||
}
|
||||
}
|
||||
ScannedTextBox(ref text_box) => {
|
||||
ScannedTextFragment(ref text_box) => {
|
||||
// See CSS 2.1 § 10.8.1.
|
||||
let font_size = self.style().get_font().font_size;
|
||||
let line_height = self.calculate_line_height(font_size);
|
||||
|
@ -1388,9 +1387,9 @@ impl Box {
|
|||
}
|
||||
|
||||
/// Returns true if this box can merge with another adjacent box or false otherwise.
|
||||
pub fn can_merge_with_box(&self, other: &Box) -> bool {
|
||||
pub fn can_merge_with_box(&self, other: &Fragment) -> bool {
|
||||
match (&self.specific, &other.specific) {
|
||||
(&UnscannedTextBox(_), &UnscannedTextBox(_)) => {
|
||||
(&UnscannedTextFragment(_), &UnscannedTextFragment(_)) => {
|
||||
self.font_style() == other.font_style() &&
|
||||
self.text_decoration() == other.text_decoration()
|
||||
}
|
||||
|
@ -1424,7 +1423,7 @@ impl Box {
|
|||
/// guide inlining.
|
||||
#[inline(never)]
|
||||
fn finalize_position_and_size_of_iframe(&self,
|
||||
iframe_box: &IframeBoxInfo,
|
||||
iframe_box: &IframeFragmentInfo,
|
||||
offset: Point2D<Au>,
|
||||
layout_context: &LayoutContext) {
|
||||
let left = offset.x + self.margin.left + self.border_padding.left;
|
||||
|
@ -1444,21 +1443,21 @@ impl Box {
|
|||
}
|
||||
}
|
||||
|
||||
impl fmt::Show for Box {
|
||||
impl fmt::Show for Fragment {
|
||||
/// Outputs a debugging string describing this box.
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
try!(write!(f.buf, "({} ",
|
||||
match self.specific {
|
||||
GenericBox => "GenericBox",
|
||||
IframeBox(_) => "IframeBox",
|
||||
ImageBox(_) => "ImageBox",
|
||||
ScannedTextBox(_) => "ScannedTextBox",
|
||||
TableBox => "TableBox",
|
||||
TableCellBox => "TableCellBox",
|
||||
TableColumnBox(_) => "TableColumnBox",
|
||||
TableRowBox => "TableRowBox",
|
||||
TableWrapperBox => "TableWrapperBox",
|
||||
UnscannedTextBox(_) => "UnscannedTextBox",
|
||||
GenericFragment => "GenericFragment",
|
||||
IframeFragment(_) => "IframeFragment",
|
||||
ImageFragment(_) => "ImageFragment",
|
||||
ScannedTextFragment(_) => "ScannedTextFragment",
|
||||
TableFragment => "TableFragment",
|
||||
TableCellFragment => "TableCellFragment",
|
||||
TableColumnFragment(_) => "TableColumnFragment",
|
||||
TableRowFragment => "TableRowFragment",
|
||||
TableWrapperFragment => "TableWrapperFragment",
|
||||
UnscannedTextFragment(_) => "UnscannedTextFragment",
|
||||
}));
|
||||
try!(self.side_offsets_debug_fmt("bp", self.border_padding, f));
|
||||
try!(write!(f.buf, " "));
|
||||
|
@ -1469,7 +1468,7 @@ impl fmt::Show for Box {
|
|||
|
||||
/// An object that accumulates display lists of child flows, applying a clipping rect if necessary.
|
||||
pub struct ChildDisplayListAccumulator {
|
||||
clip_display_item: Option<owned::Box<ClipDisplayItem>>,
|
||||
clip_display_item: Option<Box<ClipDisplayItem>>,
|
||||
}
|
||||
|
||||
impl ChildDisplayListAccumulator {
|
||||
|
|
|
@ -22,15 +22,15 @@
|
|||
|
||||
use css::node_style::StyledNode;
|
||||
use layout::block::BlockFlow;
|
||||
use layout::box_::{Box, GenericBox, IframeBox, IframeBoxInfo, ImageBox, ImageBoxInfo};
|
||||
use layout::box_::{SpecificBoxInfo, TableBox, TableCellBox, TableColumnBox, TableColumnBoxInfo};
|
||||
use layout::box_::{TableRowBox, TableWrapperBox, UnscannedTextBox, UnscannedTextBoxInfo};
|
||||
use layout::box_::{Fragment, GenericFragment, IframeFragment, IframeFragmentInfo, ImageFragment, ImageFragmentInfo};
|
||||
use layout::box_::{SpecificFragmentInfo, TableFragment, TableCellFragment, TableColumnFragment, TableColumnFragmentInfo};
|
||||
use layout::box_::{TableRowFragment, TableWrapperFragment, UnscannedTextFragment, UnscannedTextFragmentInfo};
|
||||
use layout::context::LayoutContext;
|
||||
use layout::floats::FloatKind;
|
||||
use layout::flow::{Flow, ImmutableFlowUtils, MutableOwnedFlowUtils};
|
||||
use layout::flow::{Descendants, AbsDescendants};
|
||||
use layout::flow_list::{Rawlink};
|
||||
use layout::inline::{FragmentIndex, InlineBoxes, InlineFlow};
|
||||
use layout::inline::{FragmentIndex, InlineFragments, InlineFlow};
|
||||
use layout::table_wrapper::TableWrapperFlow;
|
||||
use layout::table::TableFlow;
|
||||
use layout::table_caption::TableCaptionFlow;
|
||||
|
@ -60,7 +60,6 @@ use servo_util::range::Range;
|
|||
use servo_util::str::is_whitespace;
|
||||
use servo_util::url::{is_image_data, parse_url};
|
||||
use std::mem;
|
||||
use std::owned;
|
||||
use style::ComputedValues;
|
||||
use style::computed_values::{display, position, float, white_space};
|
||||
use sync::Arc;
|
||||
|
@ -75,7 +74,7 @@ pub enum ConstructionResult {
|
|||
/// This node contributed a flow at the proper position in the tree.
|
||||
/// Nothing more needs to be done for this node. It has bubbled up fixed
|
||||
/// and absolute descendant flows that have a CB above it.
|
||||
FlowConstructionResult(owned::Box<Flow:Share>, AbsDescendants),
|
||||
FlowConstructionResult(Box<Flow:Share>, AbsDescendants),
|
||||
|
||||
/// This node contributed some object or objects that will be needed to construct a proper flow
|
||||
/// later up the tree, but these objects have not yet found their home.
|
||||
|
@ -97,34 +96,34 @@ impl ConstructionResult {
|
|||
/// attached to.
|
||||
pub enum ConstructionItem {
|
||||
/// Inline boxes and associated {ib} splits that have not yet found flows.
|
||||
InlineBoxesConstructionItem(InlineBoxesConstructionResult),
|
||||
InlineFragmentsConstructionItem(InlineFragmentsConstructionResult),
|
||||
/// Potentially ignorable whitespace.
|
||||
WhitespaceConstructionItem(OpaqueNode, Arc<ComputedValues>),
|
||||
/// TableColumn Box
|
||||
TableColumnBoxConstructionItem(Box),
|
||||
/// TableColumn Fragment
|
||||
TableColumnFragmentConstructionItem(Fragment),
|
||||
}
|
||||
|
||||
impl ConstructionItem {
|
||||
fn destroy(&mut self) {
|
||||
match *self {
|
||||
InlineBoxesConstructionItem(ref mut result) => {
|
||||
InlineFragmentsConstructionItem(ref mut result) => {
|
||||
for split in result.splits.mut_iter() {
|
||||
split.destroy()
|
||||
}
|
||||
}
|
||||
WhitespaceConstructionItem(..) => {}
|
||||
TableColumnBoxConstructionItem(_) => {}
|
||||
TableColumnFragmentConstructionItem(_) => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Represents inline boxes and {ib} splits that are bubbling up from an inline.
|
||||
pub struct InlineBoxesConstructionResult {
|
||||
pub struct InlineFragmentsConstructionResult {
|
||||
/// Any {ib} splits that we're bubbling up.
|
||||
pub splits: Vec<InlineBlockSplit>,
|
||||
|
||||
/// Any boxes that succeed the {ib} splits.
|
||||
pub boxes: InlineBoxes,
|
||||
pub boxes: InlineFragments,
|
||||
|
||||
/// Any absolute descendants that we're bubbling up.
|
||||
pub abs_descendants: AbsDescendants,
|
||||
|
@ -141,7 +140,7 @@ pub struct InlineBoxesConstructionResult {
|
|||
///
|
||||
/// The resulting `ConstructionItem` for the outer `span` will be:
|
||||
///
|
||||
/// InlineBoxesConstructionItem(Some(~[
|
||||
/// InlineFragmentsConstructionItem(Some(~[
|
||||
/// InlineBlockSplit {
|
||||
/// predecessor_boxes: ~[
|
||||
/// A
|
||||
|
@ -154,10 +153,10 @@ pub struct InlineBoxesConstructionResult {
|
|||
/// ])
|
||||
pub struct InlineBlockSplit {
|
||||
/// The inline boxes that precede the flow.
|
||||
pub predecessors: InlineBoxes,
|
||||
pub predecessors: InlineFragments,
|
||||
|
||||
/// The flow that caused this {ib} split.
|
||||
pub flow: owned::Box<Flow:Share>,
|
||||
pub flow: Box<Flow:Share>,
|
||||
}
|
||||
|
||||
impl InlineBlockSplit {
|
||||
|
@ -167,34 +166,34 @@ impl InlineBlockSplit {
|
|||
}
|
||||
|
||||
/// Holds inline boxes that we're gathering for children of an inline node.
|
||||
struct InlineBoxAccumulator {
|
||||
struct InlineFragmentsAccumulator {
|
||||
/// The list of boxes.
|
||||
boxes: InlineBoxes,
|
||||
boxes: InlineFragments,
|
||||
|
||||
/// Whether we've created a range to enclose all the boxes. This will be true if the outer node
|
||||
/// is an inline and false otherwise.
|
||||
has_enclosing_range: bool,
|
||||
}
|
||||
|
||||
impl InlineBoxAccumulator {
|
||||
fn new() -> InlineBoxAccumulator {
|
||||
InlineBoxAccumulator {
|
||||
boxes: InlineBoxes::new(),
|
||||
impl InlineFragmentsAccumulator {
|
||||
fn new() -> InlineFragmentsAccumulator {
|
||||
InlineFragmentsAccumulator {
|
||||
boxes: InlineFragments::new(),
|
||||
has_enclosing_range: false,
|
||||
}
|
||||
}
|
||||
|
||||
fn from_inline_node(node: &ThreadSafeLayoutNode) -> InlineBoxAccumulator {
|
||||
let mut boxes = InlineBoxes::new();
|
||||
fn from_inline_node(node: &ThreadSafeLayoutNode) -> InlineFragmentsAccumulator {
|
||||
let mut boxes = InlineFragments::new();
|
||||
boxes.map.push(node.style().clone(), Range::empty());
|
||||
InlineBoxAccumulator {
|
||||
InlineFragmentsAccumulator {
|
||||
boxes: boxes,
|
||||
has_enclosing_range: true,
|
||||
}
|
||||
}
|
||||
|
||||
fn finish(self) -> InlineBoxes {
|
||||
let InlineBoxAccumulator {
|
||||
fn finish(self) -> InlineFragments {
|
||||
let InlineFragmentsAccumulator {
|
||||
boxes: mut boxes,
|
||||
has_enclosing_range
|
||||
} = self;
|
||||
|
@ -223,12 +222,12 @@ pub struct FlowConstructor<'a> {
|
|||
///
|
||||
/// FIXME(pcwalton): This is pretty bogus and is basically just a workaround for libgreen
|
||||
/// having slow TLS.
|
||||
pub font_context: Option<owned::Box<FontContext>>,
|
||||
pub font_context: Option<Box<FontContext>>,
|
||||
}
|
||||
|
||||
impl<'a> FlowConstructor<'a> {
|
||||
/// Creates a new flow constructor.
|
||||
pub fn new(layout_context: &'a mut LayoutContext, font_context: Option<owned::Box<FontContext>>)
|
||||
pub fn new(layout_context: &'a mut LayoutContext, font_context: Option<Box<FontContext>>)
|
||||
-> FlowConstructor<'a> {
|
||||
FlowConstructor {
|
||||
layout_context: layout_context,
|
||||
|
@ -247,7 +246,7 @@ impl<'a> FlowConstructor<'a> {
|
|||
}
|
||||
|
||||
/// Destroys this flow constructor and retrieves the font context.
|
||||
pub fn unwrap_font_context(self) -> Option<owned::Box<FontContext>> {
|
||||
pub fn unwrap_font_context(self) -> Option<Box<FontContext>> {
|
||||
let FlowConstructor {
|
||||
font_context,
|
||||
..
|
||||
|
@ -255,43 +254,43 @@ impl<'a> FlowConstructor<'a> {
|
|||
font_context
|
||||
}
|
||||
|
||||
/// Builds the `ImageBoxInfo` for the given image. This is out of line to guide inlining.
|
||||
/// Builds the `ImageFragmentInfo` for the given image. This is out of line to guide inlining.
|
||||
fn build_box_info_for_image(&mut self, node: &ThreadSafeLayoutNode, url: Option<Url>)
|
||||
-> SpecificBoxInfo {
|
||||
-> SpecificFragmentInfo {
|
||||
match url {
|
||||
None => GenericBox,
|
||||
None => GenericFragment,
|
||||
Some(url) => {
|
||||
// FIXME(pcwalton): The fact that image boxes store the cache within them makes
|
||||
// little sense to me.
|
||||
ImageBox(ImageBoxInfo::new(node, url, self.layout_context.image_cache.clone()))
|
||||
ImageFragment(ImageFragmentInfo::new(node, url, self.layout_context.image_cache.clone()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Builds specific `Box` info for the given node.
|
||||
/// Builds specific `Fragment` info for the given node.
|
||||
pub fn build_specific_box_info_for_node(&mut self, node: &ThreadSafeLayoutNode)
|
||||
-> SpecificBoxInfo {
|
||||
-> SpecificFragmentInfo {
|
||||
match node.type_id() {
|
||||
Some(ElementNodeTypeId(HTMLImageElementTypeId)) => {
|
||||
self.build_box_info_for_image(node, node.image_url())
|
||||
}
|
||||
Some(ElementNodeTypeId(HTMLIFrameElementTypeId)) => {
|
||||
IframeBox(IframeBoxInfo::new(node))
|
||||
IframeFragment(IframeFragmentInfo::new(node))
|
||||
}
|
||||
Some(ElementNodeTypeId(HTMLObjectElementTypeId)) => {
|
||||
let data = node.get_object_data(&self.layout_context.url);
|
||||
self.build_box_info_for_image(node, data)
|
||||
}
|
||||
Some(ElementNodeTypeId(HTMLTableElementTypeId)) => TableWrapperBox,
|
||||
Some(ElementNodeTypeId(HTMLTableElementTypeId)) => TableWrapperFragment,
|
||||
Some(ElementNodeTypeId(HTMLTableColElementTypeId)) => {
|
||||
TableColumnBox(TableColumnBoxInfo::new(node))
|
||||
TableColumnFragment(TableColumnFragmentInfo::new(node))
|
||||
}
|
||||
Some(ElementNodeTypeId(HTMLTableDataCellElementTypeId)) |
|
||||
Some(ElementNodeTypeId(HTMLTableHeaderCellElementTypeId)) => TableCellBox,
|
||||
Some(ElementNodeTypeId(HTMLTableHeaderCellElementTypeId)) => TableCellFragment,
|
||||
Some(ElementNodeTypeId(HTMLTableRowElementTypeId)) |
|
||||
Some(ElementNodeTypeId(HTMLTableSectionElementTypeId)) => TableRowBox,
|
||||
None | Some(TextNodeTypeId) => UnscannedTextBox(UnscannedTextBoxInfo::new(node)),
|
||||
_ => GenericBox,
|
||||
Some(ElementNodeTypeId(HTMLTableSectionElementTypeId)) => TableRowFragment,
|
||||
None | Some(TextNodeTypeId) => UnscannedTextFragment(UnscannedTextFragmentInfo::new(node)),
|
||||
_ => GenericFragment,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -302,9 +301,9 @@ impl<'a> FlowConstructor<'a> {
|
|||
/// otherwise.
|
||||
#[inline(always)]
|
||||
fn flush_inline_boxes_to_flow_or_list(&mut self,
|
||||
box_accumulator: InlineBoxAccumulator,
|
||||
flow: &mut owned::Box<Flow:Share>,
|
||||
flow_list: &mut Vec<owned::Box<Flow:Share>>,
|
||||
box_accumulator: InlineFragmentsAccumulator,
|
||||
flow: &mut Box<Flow:Share>,
|
||||
flow_list: &mut Vec<Box<Flow:Share>>,
|
||||
whitespace_stripping: WhitespaceStrippingMode,
|
||||
node: &ThreadSafeLayoutNode) {
|
||||
let mut boxes = box_accumulator.finish();
|
||||
|
@ -330,7 +329,7 @@ impl<'a> FlowConstructor<'a> {
|
|||
|
||||
let mut inline_flow = box InlineFlow::from_boxes((*node).clone(), boxes);
|
||||
inline_flow.compute_minimum_ascent_and_descent(self.font_context(), &**node.style());
|
||||
let mut inline_flow = inline_flow as owned::Box<Flow:Share>;
|
||||
let mut inline_flow = inline_flow as Box<Flow:Share>;
|
||||
TextRunScanner::new().scan_for_runs(self.font_context(), inline_flow);
|
||||
inline_flow.finish(self.layout_context);
|
||||
|
||||
|
@ -342,13 +341,13 @@ impl<'a> FlowConstructor<'a> {
|
|||
}
|
||||
|
||||
fn build_block_flow_using_children_construction_result(&mut self,
|
||||
flow: &mut owned::Box<Flow:Share>,
|
||||
flow: &mut Box<Flow:Share>,
|
||||
consecutive_siblings:
|
||||
&mut Vec<owned::Box<Flow:Share>>,
|
||||
&mut Vec<Box<Flow:Share>>,
|
||||
node: &ThreadSafeLayoutNode,
|
||||
kid: ThreadSafeLayoutNode,
|
||||
inline_box_accumulator:
|
||||
&mut InlineBoxAccumulator,
|
||||
&mut InlineFragmentsAccumulator,
|
||||
abs_descendants: &mut Descendants,
|
||||
first_box: &mut bool) {
|
||||
match kid.swap_out_construction_result() {
|
||||
|
@ -377,7 +376,7 @@ impl<'a> FlowConstructor<'a> {
|
|||
debug!("flushing {} inline box(es) to flow A",
|
||||
inline_box_accumulator.boxes.len());
|
||||
self.flush_inline_boxes_to_flow_or_list(
|
||||
mem::replace(inline_box_accumulator, InlineBoxAccumulator::new()),
|
||||
mem::replace(inline_box_accumulator, InlineFragmentsAccumulator::new()),
|
||||
flow,
|
||||
consecutive_siblings,
|
||||
whitespace_stripping,
|
||||
|
@ -392,8 +391,8 @@ impl<'a> FlowConstructor<'a> {
|
|||
}
|
||||
abs_descendants.push_descendants(kid_abs_descendants);
|
||||
}
|
||||
ConstructionItemConstructionResult(InlineBoxesConstructionItem(
|
||||
InlineBoxesConstructionResult {
|
||||
ConstructionItemConstructionResult(InlineFragmentsConstructionItem(
|
||||
InlineFragmentsConstructionResult {
|
||||
splits: splits,
|
||||
boxes: successor_boxes,
|
||||
abs_descendants: kid_abs_descendants,
|
||||
|
@ -422,7 +421,7 @@ impl<'a> FlowConstructor<'a> {
|
|||
inline_box_accumulator.boxes.len());
|
||||
self.flush_inline_boxes_to_flow_or_list(
|
||||
mem::replace(inline_box_accumulator,
|
||||
InlineBoxAccumulator::new()),
|
||||
InlineFragmentsAccumulator::new()),
|
||||
flow,
|
||||
consecutive_siblings,
|
||||
whitespace_stripping,
|
||||
|
@ -444,7 +443,7 @@ impl<'a> FlowConstructor<'a> {
|
|||
ConstructionItemConstructionResult(WhitespaceConstructionItem(..)) => {
|
||||
// Nothing to do here.
|
||||
}
|
||||
ConstructionItemConstructionResult(TableColumnBoxConstructionItem(_)) => {
|
||||
ConstructionItemConstructionResult(TableColumnFragmentConstructionItem(_)) => {
|
||||
// TODO: Implement anonymous table objects for missing parents
|
||||
// CSS 2.1 § 17.2.1, step 3-2
|
||||
}
|
||||
|
@ -459,11 +458,11 @@ impl<'a> FlowConstructor<'a> {
|
|||
/// Also, deal with the absolute and fixed descendants bubbled up by
|
||||
/// children nodes.
|
||||
fn build_flow_using_children(&mut self,
|
||||
mut flow: owned::Box<Flow:Share>,
|
||||
mut flow: Box<Flow:Share>,
|
||||
node: &ThreadSafeLayoutNode)
|
||||
-> ConstructionResult {
|
||||
// Gather up boxes for the inline flows we might need to create.
|
||||
let mut inline_box_accumulator = InlineBoxAccumulator::new();
|
||||
let mut inline_box_accumulator = InlineFragmentsAccumulator::new();
|
||||
let mut consecutive_siblings = vec!();
|
||||
let mut first_box = true;
|
||||
|
||||
|
@ -517,7 +516,7 @@ impl<'a> FlowConstructor<'a> {
|
|||
/// other `BlockFlow`s or `InlineFlow`s underneath it, depending on whether {ib} splits needed
|
||||
/// to happen.
|
||||
fn build_flow_for_block(&mut self, node: &ThreadSafeLayoutNode) -> ConstructionResult {
|
||||
let flow = box BlockFlow::from_node(self, node) as owned::Box<Flow:Share>;
|
||||
let flow = box BlockFlow::from_node(self, node) as Box<Flow:Share>;
|
||||
self.build_flow_using_children(flow, node)
|
||||
}
|
||||
|
||||
|
@ -525,17 +524,17 @@ impl<'a> FlowConstructor<'a> {
|
|||
/// a `BlockFlow` underneath it.
|
||||
fn build_flow_for_floated_block(&mut self, node: &ThreadSafeLayoutNode, float_kind: FloatKind)
|
||||
-> ConstructionResult {
|
||||
let flow = box BlockFlow::float_from_node(self, node, float_kind) as owned::Box<Flow:Share>;
|
||||
let flow = box BlockFlow::float_from_node(self, node, float_kind) as Box<Flow:Share>;
|
||||
self.build_flow_using_children(flow, node)
|
||||
}
|
||||
|
||||
/// Concatenates the boxes of kids, adding in our own borders/padding/margins if necessary.
|
||||
/// Returns the `InlineBoxesConstructionResult`, if any. There will be no
|
||||
/// `InlineBoxesConstructionResult` if this node consisted entirely of ignorable whitespace.
|
||||
/// Returns the `InlineFragmentsConstructionResult`, if any. There will be no
|
||||
/// `InlineFragmentsConstructionResult` if this node consisted entirely of ignorable whitespace.
|
||||
fn build_boxes_for_nonreplaced_inline_content(&mut self, node: &ThreadSafeLayoutNode)
|
||||
-> ConstructionResult {
|
||||
let mut opt_inline_block_splits: Vec<InlineBlockSplit> = Vec::new();
|
||||
let mut box_accumulator = InlineBoxAccumulator::from_inline_node(node);
|
||||
let mut box_accumulator = InlineFragmentsAccumulator::from_inline_node(node);
|
||||
let mut abs_descendants = Descendants::new();
|
||||
|
||||
// Concatenate all the boxes of our kids, creating {ib} splits as necessary.
|
||||
|
@ -551,14 +550,14 @@ impl<'a> FlowConstructor<'a> {
|
|||
let split = InlineBlockSplit {
|
||||
predecessors:
|
||||
mem::replace(&mut box_accumulator,
|
||||
InlineBoxAccumulator::from_inline_node(node)).finish(),
|
||||
InlineFragmentsAccumulator::from_inline_node(node)).finish(),
|
||||
flow: flow,
|
||||
};
|
||||
opt_inline_block_splits.push(split);
|
||||
abs_descendants.push_descendants(kid_abs_descendants);
|
||||
}
|
||||
ConstructionItemConstructionResult(InlineBoxesConstructionItem(
|
||||
InlineBoxesConstructionResult {
|
||||
ConstructionItemConstructionResult(InlineFragmentsConstructionItem(
|
||||
InlineFragmentsConstructionResult {
|
||||
splits: splits,
|
||||
boxes: successors,
|
||||
abs_descendants: kid_abs_descendants,
|
||||
|
@ -575,7 +574,7 @@ impl<'a> FlowConstructor<'a> {
|
|||
let split = InlineBlockSplit {
|
||||
predecessors:
|
||||
mem::replace(&mut box_accumulator,
|
||||
InlineBoxAccumulator::from_inline_node(node))
|
||||
InlineFragmentsAccumulator::from_inline_node(node))
|
||||
.finish(),
|
||||
flow: kid_flow,
|
||||
};
|
||||
|
@ -590,13 +589,13 @@ impl<'a> FlowConstructor<'a> {
|
|||
whitespace_style))
|
||||
=> {
|
||||
// Instantiate the whitespace box.
|
||||
let box_info = UnscannedTextBox(UnscannedTextBoxInfo::from_text(" ".to_owned()));
|
||||
let fragment = Box::from_opaque_node_and_style(whitespace_node,
|
||||
let box_info = UnscannedTextFragment(UnscannedTextFragmentInfo::from_text(" ".to_owned()));
|
||||
let fragment = Fragment::from_opaque_node_and_style(whitespace_node,
|
||||
whitespace_style.clone(),
|
||||
box_info);
|
||||
box_accumulator.boxes.push(fragment, whitespace_style)
|
||||
}
|
||||
ConstructionItemConstructionResult(TableColumnBoxConstructionItem(_)) => {
|
||||
ConstructionItemConstructionResult(TableColumnFragmentConstructionItem(_)) => {
|
||||
// TODO: Implement anonymous table objects for missing parents
|
||||
// CSS 2.1 § 17.2.1, step 3-2
|
||||
}
|
||||
|
@ -606,7 +605,7 @@ impl<'a> FlowConstructor<'a> {
|
|||
// Finally, make a new construction result.
|
||||
if opt_inline_block_splits.len() > 0 || box_accumulator.boxes.len() > 0
|
||||
|| abs_descendants.len() > 0 {
|
||||
let construction_item = InlineBoxesConstructionItem(InlineBoxesConstructionResult {
|
||||
let construction_item = InlineFragmentsConstructionItem(InlineFragmentsConstructionResult {
|
||||
splits: opt_inline_block_splits,
|
||||
boxes: box_accumulator.finish(),
|
||||
abs_descendants: abs_descendants,
|
||||
|
@ -617,8 +616,8 @@ impl<'a> FlowConstructor<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
/// Creates an `InlineBoxesConstructionResult` for replaced content. Replaced content doesn't
|
||||
/// render its children, so this just nukes a child's boxes and creates a `Box`.
|
||||
/// Creates an `InlineFragmentsConstructionResult` for replaced content. Replaced content doesn't
|
||||
/// render its children, so this just nukes a child's boxes and creates a `Fragment`.
|
||||
fn build_boxes_for_replaced_inline_content(&mut self, node: &ThreadSafeLayoutNode)
|
||||
-> ConstructionResult {
|
||||
for kid in node.children() {
|
||||
|
@ -635,10 +634,10 @@ impl<'a> FlowConstructor<'a> {
|
|||
node.style().clone()))
|
||||
}
|
||||
|
||||
let mut boxes = InlineBoxes::new();
|
||||
boxes.push(Box::new(self, node), node.style().clone());
|
||||
let mut boxes = InlineFragments::new();
|
||||
boxes.push(Fragment::new(self, node), node.style().clone());
|
||||
|
||||
let construction_item = InlineBoxesConstructionItem(InlineBoxesConstructionResult {
|
||||
let construction_item = InlineFragmentsConstructionItem(InlineFragmentsConstructionResult {
|
||||
splits: Vec::new(),
|
||||
boxes: boxes,
|
||||
abs_descendants: Descendants::new(),
|
||||
|
@ -647,7 +646,7 @@ impl<'a> FlowConstructor<'a> {
|
|||
}
|
||||
|
||||
/// Builds one or more boxes for a node with `display: inline`. This yields an
|
||||
/// `InlineBoxesConstructionResult`.
|
||||
/// `InlineFragmentsConstructionResult`.
|
||||
fn build_boxes_for_inline(&mut self, node: &ThreadSafeLayoutNode) -> ConstructionResult {
|
||||
// Is this node replaced content?
|
||||
if !node.is_replaced_content() {
|
||||
|
@ -661,7 +660,7 @@ impl<'a> FlowConstructor<'a> {
|
|||
|
||||
/// TableCaptionFlow is populated underneath TableWrapperFlow
|
||||
fn place_table_caption_under_table_wrapper(&mut self,
|
||||
table_wrapper_flow: &mut owned::Box<Flow:Share>,
|
||||
table_wrapper_flow: &mut Box<Flow:Share>,
|
||||
node: &ThreadSafeLayoutNode) {
|
||||
for kid in node.children() {
|
||||
match kid.swap_out_construction_result() {
|
||||
|
@ -678,8 +677,8 @@ impl<'a> FlowConstructor<'a> {
|
|||
/// Generates an anonymous table flow according to CSS 2.1 § 17.2.1, step 2.
|
||||
/// If necessary, generate recursively another anonymous table flow.
|
||||
fn generate_anonymous_missing_child(&mut self,
|
||||
child_flows: Vec<owned::Box<Flow:Share>>,
|
||||
flow: &mut owned::Box<Flow:Share>,
|
||||
child_flows: Vec<Box<Flow:Share>>,
|
||||
flow: &mut Box<Flow:Share>,
|
||||
node: &ThreadSafeLayoutNode) {
|
||||
let mut anonymous_flow = flow.generate_missing_child_flow(node);
|
||||
let mut consecutive_siblings = vec!();
|
||||
|
@ -705,11 +704,11 @@ impl<'a> FlowConstructor<'a> {
|
|||
/// Builds a flow for a node with `display: table`. This yields a `TableWrapperFlow` with possibly
|
||||
/// other `TableCaptionFlow`s or `TableFlow`s underneath it.
|
||||
fn build_flow_for_table_wrapper(&mut self, node: &ThreadSafeLayoutNode) -> ConstructionResult {
|
||||
let box_ = Box::new_from_specific_info(node, TableWrapperBox);
|
||||
let mut wrapper_flow = box TableWrapperFlow::from_node_and_box(node, box_) as owned::Box<Flow:Share>;
|
||||
let box_ = Fragment::new_from_specific_info(node, TableWrapperFragment);
|
||||
let mut wrapper_flow = box TableWrapperFlow::from_node_and_box(node, box_) as Box<Flow:Share>;
|
||||
|
||||
let table_box_ = Box::new_from_specific_info(node, TableBox);
|
||||
let table_flow = box TableFlow::from_node_and_box(node, table_box_) as owned::Box<Flow:Share>;
|
||||
let table_box_ = Fragment::new_from_specific_info(node, TableFragment);
|
||||
let table_flow = box TableFlow::from_node_and_box(node, table_box_) as Box<Flow:Share>;
|
||||
|
||||
// We first populate the TableFlow with other flows than TableCaptionFlow.
|
||||
// We then populate the TableWrapperFlow with TableCaptionFlow, and attach
|
||||
|
@ -755,31 +754,31 @@ impl<'a> FlowConstructor<'a> {
|
|||
/// Builds a flow for a node with `display: table-caption`. This yields a `TableCaptionFlow`
|
||||
/// with possibly other `BlockFlow`s or `InlineFlow`s underneath it.
|
||||
fn build_flow_for_table_caption(&mut self, node: &ThreadSafeLayoutNode) -> ConstructionResult {
|
||||
let flow = box TableCaptionFlow::from_node(self, node) as owned::Box<Flow:Share>;
|
||||
let flow = box TableCaptionFlow::from_node(self, node) as Box<Flow:Share>;
|
||||
self.build_flow_using_children(flow, node)
|
||||
}
|
||||
|
||||
/// Builds a flow for a node with `display: table-row-group`. This yields a `TableRowGroupFlow`
|
||||
/// with possibly other `TableRowFlow`s underneath it.
|
||||
fn build_flow_for_table_rowgroup(&mut self, node: &ThreadSafeLayoutNode) -> ConstructionResult {
|
||||
let box_ = Box::new_from_specific_info(node, TableRowBox);
|
||||
let flow = box TableRowGroupFlow::from_node_and_box(node, box_) as owned::Box<Flow:Share>;
|
||||
let box_ = Fragment::new_from_specific_info(node, TableRowFragment);
|
||||
let flow = box TableRowGroupFlow::from_node_and_box(node, box_) as Box<Flow:Share>;
|
||||
self.build_flow_using_children(flow, node)
|
||||
}
|
||||
|
||||
/// Builds a flow for a node with `display: table-row`. This yields a `TableRowFlow` with
|
||||
/// possibly other `TableCellFlow`s underneath it.
|
||||
fn build_flow_for_table_row(&mut self, node: &ThreadSafeLayoutNode) -> ConstructionResult {
|
||||
let box_ = Box::new_from_specific_info(node, TableRowBox);
|
||||
let flow = box TableRowFlow::from_node_and_box(node, box_) as owned::Box<Flow:Share>;
|
||||
let box_ = Fragment::new_from_specific_info(node, TableRowFragment);
|
||||
let flow = box TableRowFlow::from_node_and_box(node, box_) as Box<Flow:Share>;
|
||||
self.build_flow_using_children(flow, node)
|
||||
}
|
||||
|
||||
/// Builds a flow for a node with `display: table-cell`. This yields a `TableCellFlow` with
|
||||
/// possibly other `BlockFlow`s or `InlineFlow`s underneath it.
|
||||
fn build_flow_for_table_cell(&mut self, node: &ThreadSafeLayoutNode) -> ConstructionResult {
|
||||
let box_ = Box::new_from_specific_info(node, TableCellBox);
|
||||
let flow = box TableCellFlow::from_node_and_box(node, box_) as owned::Box<Flow:Share>;
|
||||
let box_ = Fragment::new_from_specific_info(node, TableCellFragment);
|
||||
let flow = box TableCellFlow::from_node_and_box(node, box_) as Box<Flow:Share>;
|
||||
self.build_flow_using_children(flow, node)
|
||||
}
|
||||
|
||||
|
@ -790,9 +789,9 @@ impl<'a> FlowConstructor<'a> {
|
|||
kid.set_flow_construction_result(NoConstructionResult)
|
||||
}
|
||||
|
||||
let specific = TableColumnBox(TableColumnBoxInfo::new(node));
|
||||
let construction_item = TableColumnBoxConstructionItem(
|
||||
Box::new_from_specific_info(node, specific)
|
||||
let specific = TableColumnFragment(TableColumnFragmentInfo::new(node));
|
||||
let construction_item = TableColumnFragmentConstructionItem(
|
||||
Fragment::new_from_specific_info(node, specific)
|
||||
);
|
||||
ConstructionItemConstructionResult(construction_item)
|
||||
}
|
||||
|
@ -800,26 +799,25 @@ impl<'a> FlowConstructor<'a> {
|
|||
/// Builds a flow for a node with `display: table-column-group`.
|
||||
/// This yields a `TableColGroupFlow`.
|
||||
fn build_flow_for_table_colgroup(&mut self, node: &ThreadSafeLayoutNode) -> ConstructionResult {
|
||||
let box_ = Box::new_from_specific_info(node,
|
||||
TableColumnBox(TableColumnBoxInfo::new(node)));
|
||||
let box_ = Fragment::new_from_specific_info(node,
|
||||
TableColumnFragment(TableColumnFragmentInfo::new(node)));
|
||||
let mut col_boxes = vec!();
|
||||
for kid in node.children() {
|
||||
// CSS 2.1 § 17.2.1. Treat all non-column child boxes of `table-column-group`
|
||||
// as `display: none`.
|
||||
match kid.swap_out_construction_result() {
|
||||
ConstructionItemConstructionResult(TableColumnBoxConstructionItem(box_)) => {
|
||||
ConstructionItemConstructionResult(TableColumnFragmentConstructionItem(box_)) => {
|
||||
col_boxes.push(box_);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
if col_boxes.is_empty() {
|
||||
debug!("add TableColumnBox for empty colgroup");
|
||||
let specific = TableColumnBox(TableColumnBoxInfo::new(node));
|
||||
col_boxes.push( Box::new_from_specific_info(node, specific) );
|
||||
debug!("add TableColumnFragment for empty colgroup");
|
||||
let specific = TableColumnFragment(TableColumnFragmentInfo::new(node));
|
||||
col_boxes.push(Fragment::new_from_specific_info(node, specific));
|
||||
}
|
||||
let mut flow = box TableColGroupFlow::from_node_and_boxes(node, box_, col_boxes) as
|
||||
owned::Box<Flow:Share>;
|
||||
let mut flow = box TableColGroupFlow::from_node_and_boxes(node, box_, col_boxes) as Box<Flow:Share>;
|
||||
flow.finish(self.layout_context);
|
||||
|
||||
FlowConstructionResult(flow, Descendants::new())
|
||||
|
@ -1087,15 +1085,15 @@ impl<'ln> ObjectElement for ThreadSafeLayoutNode<'ln> {
|
|||
}
|
||||
|
||||
/// Strips ignorable whitespace from the start of a list of boxes.
|
||||
fn strip_ignorable_whitespace_from_start(boxes: &mut InlineBoxes) {
|
||||
fn strip_ignorable_whitespace_from_start(boxes: &mut InlineFragments) {
|
||||
if boxes.len() == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
let InlineBoxes {
|
||||
let InlineFragments {
|
||||
boxes: old_boxes,
|
||||
map: mut map
|
||||
} = mem::replace(boxes, InlineBoxes::new());
|
||||
} = mem::replace(boxes, InlineFragments::new());
|
||||
|
||||
// FIXME(#2264, pcwalton): This is slow because vector shift is broken. :(
|
||||
let mut found_nonwhitespace = false;
|
||||
|
@ -1111,22 +1109,22 @@ fn strip_ignorable_whitespace_from_start(boxes: &mut InlineBoxes) {
|
|||
}
|
||||
|
||||
map.fixup(old_boxes.as_slice(), new_boxes.as_slice());
|
||||
*boxes = InlineBoxes {
|
||||
*boxes = InlineFragments {
|
||||
boxes: new_boxes,
|
||||
map: map,
|
||||
}
|
||||
}
|
||||
|
||||
/// Strips ignorable whitespace from the end of a list of boxes.
|
||||
fn strip_ignorable_whitespace_from_end(boxes: &mut InlineBoxes) {
|
||||
fn strip_ignorable_whitespace_from_end(boxes: &mut InlineFragments) {
|
||||
if boxes.len() == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
let InlineBoxes {
|
||||
let InlineFragments {
|
||||
boxes: old_boxes,
|
||||
map: mut map
|
||||
} = mem::replace(boxes, InlineBoxes::new());
|
||||
} = mem::replace(boxes, InlineFragments::new());
|
||||
|
||||
let mut new_boxes = old_boxes.clone();
|
||||
while new_boxes.len() > 0 && new_boxes.as_slice().last().get_ref().is_whitespace_only() {
|
||||
|
@ -1135,7 +1133,7 @@ fn strip_ignorable_whitespace_from_end(boxes: &mut InlineBoxes) {
|
|||
}
|
||||
|
||||
map.fixup(old_boxes.as_slice(), new_boxes.as_slice());
|
||||
*boxes = InlineBoxes {
|
||||
*boxes = InlineFragments {
|
||||
boxes: new_boxes,
|
||||
map: map,
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
//! Servo's experimental layout system builds a tree of `Flow` and `Box` objects and solves
|
||||
//! Servo's experimental layout system builds a tree of `Flow` and `Fragment` objects and solves
|
||||
//! layout constraints to obtain positions and display attributes of tree nodes. Positions are
|
||||
//! computed in several tree traversals driven by the fundamental data dependencies required by
|
||||
/// inline and block layout.
|
||||
|
@ -27,7 +27,7 @@
|
|||
|
||||
use css::node_style::StyledNode;
|
||||
use layout::block::BlockFlow;
|
||||
use layout::box_::{Box, TableRowBox, TableCellBox};
|
||||
use layout::box_::{Fragment, TableRowFragment, TableCellFragment};
|
||||
use layout::context::LayoutContext;
|
||||
use layout::floats::Floats;
|
||||
use layout::flow_list::{FlowList, Link, Rawlink, FlowListIterator, MutFlowListIterator};
|
||||
|
@ -58,7 +58,6 @@ use std::cast;
|
|||
use std::fmt;
|
||||
use std::iter::Zip;
|
||||
use std::num::Zero;
|
||||
use std::owned;
|
||||
use std::sync::atomics::Relaxed;
|
||||
use std::slice::MutItems;
|
||||
use style::computed_values::{clear, position, text_align};
|
||||
|
@ -338,7 +337,7 @@ pub trait ImmutableFlowUtils {
|
|||
fn need_anonymous_flow(self, child: &Flow) -> bool;
|
||||
|
||||
/// Generates missing child flow of this flow.
|
||||
fn generate_missing_child_flow(self, node: &ThreadSafeLayoutNode) -> owned::Box<Flow:Share>;
|
||||
fn generate_missing_child_flow(self, node: &ThreadSafeLayoutNode) -> Box<Flow:Share>;
|
||||
|
||||
/// Returns true if this flow has no children.
|
||||
fn is_leaf(self) -> bool;
|
||||
|
@ -392,7 +391,7 @@ pub trait MutableFlowUtils {
|
|||
pub trait MutableOwnedFlowUtils {
|
||||
/// Adds a new flow as a child of this flow. Removes the flow from the given leaf set if
|
||||
/// it's present.
|
||||
fn add_new_child(&mut self, new_child: owned::Box<Flow:Share>);
|
||||
fn add_new_child(&mut self, new_child: Box<Flow:Share>);
|
||||
|
||||
/// Finishes a flow. Once a flow is finished, no more child flows or boxes may be added to it.
|
||||
/// This will normally run the bubble-widths (minimum and preferred -- i.e. intrinsic -- width)
|
||||
|
@ -842,15 +841,15 @@ impl<'a> ImmutableFlowUtils for &'a Flow {
|
|||
}
|
||||
|
||||
/// Generates missing child flow of this flow.
|
||||
fn generate_missing_child_flow(self, node: &ThreadSafeLayoutNode) -> owned::Box<Flow:Share> {
|
||||
fn generate_missing_child_flow(self, node: &ThreadSafeLayoutNode) -> Box<Flow:Share> {
|
||||
match self.class() {
|
||||
TableFlowClass | TableRowGroupFlowClass => {
|
||||
let box_ = Box::new_anonymous_table_box(node, TableRowBox);
|
||||
box TableRowFlow::from_node_and_box(node, box_) as owned::Box<Flow:Share>
|
||||
let box_ = Fragment::new_anonymous_table_box(node, TableRowFragment);
|
||||
box TableRowFlow::from_node_and_box(node, box_) as Box<Flow:Share>
|
||||
},
|
||||
TableRowFlowClass => {
|
||||
let box_ = Box::new_anonymous_table_box(node, TableCellBox);
|
||||
box TableCellFlow::from_node_and_box(node, box_) as owned::Box<Flow:Share>
|
||||
let box_ = Fragment::new_anonymous_table_box(node, TableCellFragment);
|
||||
box TableCellFlow::from_node_and_box(node, box_) as Box<Flow:Share>
|
||||
},
|
||||
_ => {
|
||||
fail!("no need to generate a missing child")
|
||||
|
@ -1052,9 +1051,9 @@ impl<'a> MutableFlowUtils for &'a mut Flow {
|
|||
}
|
||||
}
|
||||
|
||||
impl MutableOwnedFlowUtils for owned::Box<Flow:Share> {
|
||||
impl MutableOwnedFlowUtils for Box<Flow:Share> {
|
||||
/// Adds a new flow as a child of this flow. Fails if this flow is marked as a leaf.
|
||||
fn add_new_child(&mut self, mut new_child: owned::Box<Flow:Share>) {
|
||||
fn add_new_child(&mut self, mut new_child: Box<Flow:Share>) {
|
||||
{
|
||||
let kid_base = mut_base(new_child);
|
||||
kid_base.parallel.parent = parallel::mut_owned_flow_to_unsafe_flow(self);
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use css::node_style::StyledNode;
|
||||
use layout::box_::{Box, ScannedTextBox, ScannedTextBoxInfo, SplitInfo};
|
||||
use layout::box_::{Fragment, ScannedTextFragment, ScannedTextFragmentInfo, SplitInfo};
|
||||
use layout::context::LayoutContext;
|
||||
use layout::floats::{FloatLeft, Floats, PlacementInfo};
|
||||
use layout::flow::{BaseFlow, FlowClass, Flow, InlineFlowClass};
|
||||
|
@ -36,7 +36,7 @@ use sync::Arc;
|
|||
/// Lineboxes are represented as offsets into the child list, rather than
|
||||
/// as an object that "owns" boxes. Choosing a different set of line
|
||||
/// breaks requires a new list of offsets, and possibly some splitting and
|
||||
/// merging of TextBoxes.
|
||||
/// merging of TextFragments.
|
||||
///
|
||||
/// A similar list will keep track of the mapping between CSS boxes and
|
||||
/// the corresponding boxes in the inline flow.
|
||||
|
@ -201,8 +201,8 @@ pub fn each_char_index(range: &Range<LineIndices>) -> EachIndex<int, CharIndex>
|
|||
|
||||
struct LineboxScanner {
|
||||
pub floats: Floats,
|
||||
pub new_boxes: Vec<Box>,
|
||||
pub work_list: RingBuf<Box>,
|
||||
pub new_boxes: Vec<Fragment>,
|
||||
pub work_list: RingBuf<Fragment>,
|
||||
pub pending_line: LineBox,
|
||||
pub lines: Vec<LineBox>,
|
||||
pub cur_y: Au,
|
||||
|
@ -246,10 +246,10 @@ impl LineboxScanner {
|
|||
self.reset_scanner();
|
||||
|
||||
// Swap out temporarily.
|
||||
let InlineBoxes {
|
||||
let InlineFragments {
|
||||
boxes: old_boxes,
|
||||
map: mut map
|
||||
} = mem::replace(&mut flow.boxes, InlineBoxes::new());
|
||||
} = mem::replace(&mut flow.boxes, InlineFragments::new());
|
||||
|
||||
let mut old_box_iter = old_boxes.iter();
|
||||
loop {
|
||||
|
@ -276,7 +276,7 @@ impl LineboxScanner {
|
|||
};
|
||||
|
||||
if !box_was_appended {
|
||||
debug!("LineboxScanner: Box wasn't appended, because line {:u} was full.",
|
||||
debug!("LineboxScanner: Fragment wasn't appended, because line {:u} was full.",
|
||||
self.lines.len());
|
||||
self.flush_current_line();
|
||||
} else {
|
||||
|
@ -291,7 +291,7 @@ impl LineboxScanner {
|
|||
}
|
||||
|
||||
map.fixup(old_boxes.as_slice(), self.new_boxes.as_slice());
|
||||
flow.boxes = InlineBoxes {
|
||||
flow.boxes = InlineFragments {
|
||||
boxes: mem::replace(&mut self.new_boxes, Vec::new()),
|
||||
map: map,
|
||||
};
|
||||
|
@ -312,7 +312,7 @@ impl LineboxScanner {
|
|||
|
||||
// FIXME(eatkinson): this assumes that the tallest box in the line determines the line height
|
||||
// This might not be the case with some weird text fonts.
|
||||
fn new_height_for_line(&self, new_box: &Box) -> Au {
|
||||
fn new_height_for_line(&self, new_box: &Fragment) -> Au {
|
||||
let box_height = new_box.content_height();
|
||||
if box_height > self.pending_line.bounds.size.height {
|
||||
box_height
|
||||
|
@ -324,7 +324,7 @@ impl LineboxScanner {
|
|||
/// Computes the position of a line that has only the provided box. Returns the bounding rect
|
||||
/// of the line's green zone (whose origin coincides with the line's origin) and the actual
|
||||
/// width of the first box after splitting.
|
||||
fn initial_line_placement(&self, first_box: &Box, ceiling: Au, flow: &mut InlineFlow)
|
||||
fn initial_line_placement(&self, first_box: &Fragment, ceiling: Au, flow: &mut InlineFlow)
|
||||
-> (Rect<Au>, Au) {
|
||||
debug!("LineboxScanner: Trying to place first box of line {}", self.lines.len());
|
||||
|
||||
|
@ -386,7 +386,7 @@ impl LineboxScanner {
|
|||
///
|
||||
/// Returns false if and only if we should break the line.
|
||||
fn avoid_floats(&mut self,
|
||||
in_box: Box,
|
||||
in_box: Fragment,
|
||||
flow: &mut InlineFlow,
|
||||
new_height: Au,
|
||||
line_is_empty: bool)
|
||||
|
@ -417,7 +417,7 @@ impl LineboxScanner {
|
|||
false
|
||||
}
|
||||
|
||||
fn try_append_to_line_by_new_line(&mut self, in_box: Box) -> bool {
|
||||
fn try_append_to_line_by_new_line(&mut self, in_box: Fragment) -> bool {
|
||||
if in_box.new_line_pos.len() == 0 {
|
||||
debug!("LineboxScanner: Did not find a new-line character, so pushing the box to \
|
||||
the line without splitting.");
|
||||
|
@ -429,8 +429,8 @@ impl LineboxScanner {
|
|||
Some((left, right, run)) => {
|
||||
// TODO(bjz): Remove box splitting
|
||||
let split_box = |split: SplitInfo| {
|
||||
let info = ScannedTextBoxInfo::new(run.clone(), split.range);
|
||||
let specific = ScannedTextBox(info);
|
||||
let info = ScannedTextFragmentInfo::new(run.clone(), split.range);
|
||||
let specific = ScannedTextFragment(info);
|
||||
let size = Size2D(split.width, in_box.border_box.size.height);
|
||||
in_box.transform(size, specific)
|
||||
};
|
||||
|
@ -459,7 +459,7 @@ impl LineboxScanner {
|
|||
|
||||
/// Tries to append the given box to the line, splitting it if necessary. Returns false only if
|
||||
/// we should break the line.
|
||||
fn try_append_to_line(&mut self, in_box: Box, flow: &mut InlineFlow) -> bool {
|
||||
fn try_append_to_line(&mut self, in_box: Fragment, flow: &mut InlineFlow) -> bool {
|
||||
let line_is_empty = self.pending_line.range.length() == num::zero();
|
||||
if line_is_empty {
|
||||
let (line_bounds, _) = self.initial_line_placement(&in_box, self.cur_y, flow);
|
||||
|
@ -513,8 +513,8 @@ impl LineboxScanner {
|
|||
match split.map(|(left, right, run)| {
|
||||
// TODO(bjz): Remove box splitting
|
||||
let split_box = |split: SplitInfo| {
|
||||
let info = ScannedTextBoxInfo::new(run.clone(), split.range);
|
||||
let specific = ScannedTextBox(info);
|
||||
let info = ScannedTextFragmentInfo::new(run.clone(), split.range);
|
||||
let specific = ScannedTextFragment(info);
|
||||
let size = Size2D(split.width, in_box.border_box.size.height);
|
||||
in_box.transform(size, specific)
|
||||
};
|
||||
|
@ -553,7 +553,7 @@ impl LineboxScanner {
|
|||
}
|
||||
|
||||
// An unconditional push
|
||||
fn push_box_to_line(&mut self, box_: Box) {
|
||||
fn push_box_to_line(&mut self, box_: Fragment) {
|
||||
debug!("LineboxScanner: Pushing box {} to line {:u}", box_.debug_id(), self.lines.len());
|
||||
|
||||
if self.pending_line.range.length() == num::zero() {
|
||||
|
@ -579,14 +579,14 @@ impl LineboxScanner {
|
|||
}
|
||||
|
||||
/// Iterator over boxes.
|
||||
pub struct BoxIterator<'a> {
|
||||
iter: Enumerate<Items<'a,Box>>,
|
||||
pub struct FragmentIterator<'a> {
|
||||
iter: Enumerate<Items<'a,Fragment>>,
|
||||
map: &'a InlineFragmentMap,
|
||||
}
|
||||
|
||||
impl<'a> Iterator<(&'a Box, InlineFragmentContext<'a>)> for BoxIterator<'a> {
|
||||
impl<'a> Iterator<(&'a Fragment, InlineFragmentContext<'a>)> for FragmentIterator<'a> {
|
||||
#[inline]
|
||||
fn next(&mut self) -> Option<(&'a Box, InlineFragmentContext<'a>)> {
|
||||
fn next(&mut self) -> Option<(&'a Fragment, InlineFragmentContext<'a>)> {
|
||||
match self.iter.next() {
|
||||
None => None,
|
||||
Some((i, fragment)) => Some((
|
||||
|
@ -598,14 +598,14 @@ impl<'a> Iterator<(&'a Box, InlineFragmentContext<'a>)> for BoxIterator<'a> {
|
|||
}
|
||||
|
||||
/// Mutable iterator over boxes.
|
||||
pub struct MutBoxIterator<'a> {
|
||||
iter: Enumerate<MutItems<'a,Box>>,
|
||||
pub struct MutFragmentIterator<'a> {
|
||||
iter: Enumerate<MutItems<'a,Fragment>>,
|
||||
map: &'a InlineFragmentMap,
|
||||
}
|
||||
|
||||
impl<'a> Iterator<(&'a mut Box, InlineFragmentContext<'a>)> for MutBoxIterator<'a> {
|
||||
impl<'a> Iterator<(&'a mut Fragment, InlineFragmentContext<'a>)> for MutFragmentIterator<'a> {
|
||||
#[inline]
|
||||
fn next(&mut self) -> Option<(&'a mut Box, InlineFragmentContext<'a>)> {
|
||||
fn next(&mut self) -> Option<(&'a mut Fragment, InlineFragmentContext<'a>)> {
|
||||
match self.iter.next() {
|
||||
None => None,
|
||||
Some((i, fragment)) => Some((
|
||||
|
@ -617,17 +617,17 @@ impl<'a> Iterator<(&'a mut Box, InlineFragmentContext<'a>)> for MutBoxIterator<'
|
|||
}
|
||||
|
||||
/// Represents a list of inline boxes, including element ranges.
|
||||
pub struct InlineBoxes {
|
||||
pub struct InlineFragments {
|
||||
/// The boxes themselves.
|
||||
pub boxes: Vec<Box>,
|
||||
pub boxes: Vec<Fragment>,
|
||||
/// Tracks the elements that made up the boxes above.
|
||||
pub map: InlineFragmentMap,
|
||||
}
|
||||
|
||||
impl InlineBoxes {
|
||||
impl InlineFragments {
|
||||
/// Creates an empty set of inline boxes.
|
||||
pub fn new() -> InlineBoxes {
|
||||
InlineBoxes {
|
||||
pub fn new() -> InlineFragments {
|
||||
InlineFragments {
|
||||
boxes: Vec::new(),
|
||||
map: InlineFragmentMap::new(),
|
||||
}
|
||||
|
@ -644,14 +644,14 @@ impl InlineBoxes {
|
|||
}
|
||||
|
||||
/// Pushes a new inline box.
|
||||
pub fn push(&mut self, fragment: Box, style: Arc<ComputedValues>) {
|
||||
pub fn push(&mut self, fragment: Fragment, style: Arc<ComputedValues>) {
|
||||
self.map.push(style, Range::new(FragmentIndex(self.boxes.len() as int), FragmentIndex(1)));
|
||||
self.boxes.push(fragment)
|
||||
}
|
||||
|
||||
/// Merges another set of inline boxes with this one.
|
||||
pub fn push_all(&mut self, other: InlineBoxes) {
|
||||
let InlineBoxes {
|
||||
pub fn push_all(&mut self, other: InlineFragments) {
|
||||
let InlineFragments {
|
||||
boxes: other_boxes,
|
||||
map: other_map
|
||||
} = other;
|
||||
|
@ -661,8 +661,8 @@ impl InlineBoxes {
|
|||
}
|
||||
|
||||
/// Returns an iterator that iterates over all boxes along with the appropriate context.
|
||||
pub fn iter<'a>(&'a self) -> BoxIterator<'a> {
|
||||
BoxIterator {
|
||||
pub fn iter<'a>(&'a self) -> FragmentIterator<'a> {
|
||||
FragmentIterator {
|
||||
iter: self.boxes.as_slice().iter().enumerate(),
|
||||
map: &self.map,
|
||||
}
|
||||
|
@ -670,20 +670,20 @@ impl InlineBoxes {
|
|||
|
||||
/// Returns an iterator that iterates over all boxes along with the appropriate context and
|
||||
/// allows those boxes to be mutated.
|
||||
pub fn mut_iter<'a>(&'a mut self) -> MutBoxIterator<'a> {
|
||||
MutBoxIterator {
|
||||
pub fn mut_iter<'a>(&'a mut self) -> MutFragmentIterator<'a> {
|
||||
MutFragmentIterator {
|
||||
iter: self.boxes.as_mut_slice().mut_iter().enumerate(),
|
||||
map: &self.map,
|
||||
}
|
||||
}
|
||||
|
||||
/// A convenience function to return the box at a given index.
|
||||
pub fn get<'a>(&'a self, index: uint) -> &'a Box {
|
||||
pub fn get<'a>(&'a self, index: uint) -> &'a Fragment {
|
||||
self.boxes.get(index)
|
||||
}
|
||||
|
||||
/// A convenience function to return a mutable reference to the box at a given index.
|
||||
pub fn get_mut<'a>(&'a mut self, index: uint) -> &'a mut Box {
|
||||
pub fn get_mut<'a>(&'a mut self, index: uint) -> &'a mut Fragment {
|
||||
self.boxes.get_mut(index)
|
||||
}
|
||||
}
|
||||
|
@ -694,7 +694,7 @@ pub struct InlineFlow {
|
|||
pub base: BaseFlow,
|
||||
|
||||
/// A vector of all inline fragments. Several fragments may correspond to one node/element.
|
||||
pub boxes: InlineBoxes,
|
||||
pub boxes: InlineFragments,
|
||||
|
||||
/// A vector of ranges into boxes that represents line positions. These ranges are disjoint and
|
||||
/// are the result of inline layout. This also includes some metadata used for positioning
|
||||
|
@ -711,7 +711,7 @@ pub struct InlineFlow {
|
|||
}
|
||||
|
||||
impl InlineFlow {
|
||||
pub fn from_boxes(node: ThreadSafeLayoutNode, boxes: InlineBoxes) -> InlineFlow {
|
||||
pub fn from_boxes(node: ThreadSafeLayoutNode, boxes: InlineFragments) -> InlineFlow {
|
||||
InlineFlow {
|
||||
base: BaseFlow::new(node),
|
||||
boxes: boxes,
|
||||
|
@ -755,7 +755,7 @@ impl InlineFlow {
|
|||
///
|
||||
/// The extra boolean is set if and only if `biggest_top` and/or `biggest_bottom` were updated.
|
||||
/// That is, if the box has a `top` or `bottom` value, true is returned.
|
||||
fn distance_from_baseline(fragment: &Box,
|
||||
fn distance_from_baseline(fragment: &Fragment,
|
||||
ascent: Au,
|
||||
parent_text_top: Au,
|
||||
parent_text_bottom: Au,
|
||||
|
@ -822,7 +822,7 @@ impl InlineFlow {
|
|||
}
|
||||
|
||||
/// Sets box X positions based on alignment for one line.
|
||||
fn set_horizontal_box_positions(boxes: &mut InlineBoxes,
|
||||
fn set_horizontal_box_positions(boxes: &mut InlineFragments,
|
||||
line: &LineBox,
|
||||
linebox_align: text_align::T) {
|
||||
// Figure out how much width we have.
|
||||
|
@ -901,7 +901,7 @@ impl Flow for InlineFlow {
|
|||
fn assign_widths(&mut self, _: &mut LayoutContext) {
|
||||
// Initialize content box widths if they haven't been initialized already.
|
||||
//
|
||||
// TODO: Combine this with `LineboxScanner`'s walk in the box list, or put this into `Box`.
|
||||
// TODO: Combine this with `LineboxScanner`'s walk in the box list, or put this into `Fragment`.
|
||||
|
||||
debug!("InlineFlow::assign_widths: floats in: {:?}", self.base.floats);
|
||||
|
||||
|
@ -919,7 +919,7 @@ impl Flow for InlineFlow {
|
|||
// There are no child contexts, so stop here.
|
||||
|
||||
// TODO(Issue #225): once there are 'inline-block' elements, this won't be
|
||||
// true. In that case, set the InlineBlockBox's width to the
|
||||
// true. In that case, set the InlineBlockFragment's width to the
|
||||
// shrink-to-fit width, perform inline flow, and set the block
|
||||
// flow context's width as the assigned width of the
|
||||
// 'inline-block' box that created this flow before recursing.
|
||||
|
@ -1226,7 +1226,7 @@ impl InlineFragmentMap {
|
|||
/// i.e. if `old_boxes` contained less info than the entire range of boxes. See
|
||||
/// `layout::construct::strip_ignorable_whitespace_from_start` for an example of some code that
|
||||
/// needlessly has to clone boxes.
|
||||
pub fn fixup(&mut self, old_fragments: &[Box], new_fragments: &[Box]) {
|
||||
pub fn fixup(&mut self, old_fragments: &[Fragment], new_fragments: &[Fragment]) {
|
||||
// TODO(pcwalton): Post Rust upgrade, use `with_capacity` here.
|
||||
let old_list = mem::replace(&mut self.list, Vec::new());
|
||||
let mut worklist = Vec::new(); // FIXME(#2269, pcwalton): was smallvec4
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
//! Borders, padding, and margins.
|
||||
|
||||
use layout::box_::Box;
|
||||
use layout::box_::Fragment;
|
||||
|
||||
use computed = style::computed_values;
|
||||
use geom::SideOffsets2D;
|
||||
|
@ -98,7 +98,7 @@ impl MarginCollapseInfo {
|
|||
}
|
||||
|
||||
pub fn initialize_top_margin(&mut self,
|
||||
fragment: &Box,
|
||||
fragment: &Fragment,
|
||||
can_collapse_top_margin_with_kids: bool) {
|
||||
if !can_collapse_top_margin_with_kids {
|
||||
self.state = AccumulatingMarginIn
|
||||
|
@ -108,7 +108,7 @@ impl MarginCollapseInfo {
|
|||
}
|
||||
|
||||
pub fn finish_and_compute_collapsible_margins(mut self,
|
||||
fragment: &Box,
|
||||
fragment: &Fragment,
|
||||
can_collapse_bottom_margin_with_kids: bool)
|
||||
-> (CollapsibleMargins, Au) {
|
||||
let state = match self.state {
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
//! CSS table formatting contexts.
|
||||
|
||||
use layout::box_::Box;
|
||||
use layout::box_::Fragment;
|
||||
use layout::block::{BlockFlow, MarginsMayNotCollapse, WidthAndMarginsComputer};
|
||||
use layout::block::{WidthConstraintInput, WidthConstraintSolution};
|
||||
use layout::construct::FlowConstructor;
|
||||
|
@ -40,7 +40,7 @@ pub struct TableFlow {
|
|||
|
||||
impl TableFlow {
|
||||
pub fn from_node_and_box(node: &ThreadSafeLayoutNode,
|
||||
box_: Box)
|
||||
box_: Fragment)
|
||||
-> TableFlow {
|
||||
let mut block_flow = BlockFlow::from_node_and_box(node, box_);
|
||||
let table_layout = if block_flow.box_().style().get_table().table_layout ==
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
//! CSS table formatting contexts.
|
||||
|
||||
use layout::box_::Box;
|
||||
use layout::box_::Fragment;
|
||||
use layout::block::{BlockFlow, MarginsMayNotCollapse, WidthAndMarginsComputer};
|
||||
use layout::context::LayoutContext;
|
||||
use layout::flow::{TableCellFlowClass, FlowClass, Flow};
|
||||
|
@ -22,17 +22,17 @@ pub struct TableCellFlow {
|
|||
}
|
||||
|
||||
impl TableCellFlow {
|
||||
pub fn from_node_and_box(node: &ThreadSafeLayoutNode, box_: Box) -> TableCellFlow {
|
||||
pub fn from_node_and_box(node: &ThreadSafeLayoutNode, box_: Fragment) -> TableCellFlow {
|
||||
TableCellFlow {
|
||||
block_flow: BlockFlow::from_node_and_box(node, box_)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn box_<'a>(&'a mut self) -> &'a Box {
|
||||
pub fn box_<'a>(&'a mut self) -> &'a Fragment {
|
||||
&self.block_flow.box_
|
||||
}
|
||||
|
||||
pub fn mut_box<'a>(&'a mut self) -> &'a mut Box {
|
||||
pub fn mut_box<'a>(&'a mut self) -> &'a mut Fragment {
|
||||
&mut self.block_flow.box_
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
//! CSS table formatting contexts.
|
||||
|
||||
use layout::box_::{Box, TableColumnBox};
|
||||
use layout::box_::{Fragment, TableColumnFragment};
|
||||
use layout::context::LayoutContext;
|
||||
use layout::flow::{BaseFlow, TableColGroupFlowClass, FlowClass, Flow};
|
||||
use layout::model::{MaybeAuto};
|
||||
|
@ -19,10 +19,10 @@ pub struct TableColGroupFlow {
|
|||
pub base: BaseFlow,
|
||||
|
||||
/// The associated box.
|
||||
pub box_: Option<Box>,
|
||||
pub box_: Option<Fragment>,
|
||||
|
||||
/// The table column boxes
|
||||
pub cols: Vec<Box>,
|
||||
pub cols: Vec<Fragment>,
|
||||
|
||||
/// The specified widths of table columns
|
||||
pub widths: Vec<Au>,
|
||||
|
@ -30,8 +30,8 @@ pub struct TableColGroupFlow {
|
|||
|
||||
impl TableColGroupFlow {
|
||||
pub fn from_node_and_boxes(node: &ThreadSafeLayoutNode,
|
||||
box_: Box,
|
||||
boxes: Vec<Box>) -> TableColGroupFlow {
|
||||
box_: Fragment,
|
||||
boxes: Vec<Fragment>) -> TableColGroupFlow {
|
||||
TableColGroupFlow {
|
||||
base: BaseFlow::new((*node).clone()),
|
||||
box_: Some(box_),
|
||||
|
@ -57,7 +57,7 @@ impl Flow for TableColGroupFlow {
|
|||
Au::new(0)).specified_or_zero();
|
||||
|
||||
let span: int = match box_.specific {
|
||||
TableColumnBox(col_box) => col_box.span.unwrap_or(1),
|
||||
TableColumnFragment(col_box) => col_box.span.unwrap_or(1),
|
||||
_ => fail!("Other box come out in TableColGroupFlow. {:?}", box_.specific)
|
||||
};
|
||||
for _ in range(0, span) {
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
//! CSS table formatting contexts.
|
||||
|
||||
use layout::box_::Box;
|
||||
use layout::box_::Fragment;
|
||||
use layout::block::BlockFlow;
|
||||
use layout::block::WidthAndMarginsComputer;
|
||||
use layout::construct::FlowConstructor;
|
||||
|
@ -35,7 +35,7 @@ pub struct TableRowFlow {
|
|||
|
||||
impl TableRowFlow {
|
||||
pub fn from_node_and_box(node: &ThreadSafeLayoutNode,
|
||||
box_: Box)
|
||||
box_: Fragment)
|
||||
-> TableRowFlow {
|
||||
TableRowFlow {
|
||||
block_flow: BlockFlow::from_node_and_box(node, box_),
|
||||
|
@ -56,7 +56,7 @@ impl TableRowFlow {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn box_<'a>(&'a mut self) -> &'a Box {
|
||||
pub fn box_<'a>(&'a mut self) -> &'a Fragment {
|
||||
&self.block_flow.box_
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
//! CSS table formatting contexts.
|
||||
|
||||
use layout::box_::Box;
|
||||
use layout::box_::Fragment;
|
||||
use layout::block::BlockFlow;
|
||||
use layout::block::WidthAndMarginsComputer;
|
||||
use layout::construct::FlowConstructor;
|
||||
|
@ -34,7 +34,7 @@ pub struct TableRowGroupFlow {
|
|||
|
||||
impl TableRowGroupFlow {
|
||||
pub fn from_node_and_box(node: &ThreadSafeLayoutNode,
|
||||
box_: Box)
|
||||
box_: Fragment)
|
||||
-> TableRowGroupFlow {
|
||||
TableRowGroupFlow {
|
||||
block_flow: BlockFlow::from_node_and_box(node, box_),
|
||||
|
@ -55,7 +55,7 @@ impl TableRowGroupFlow {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn box_<'a>(&'a mut self) -> &'a Box {
|
||||
pub fn box_<'a>(&'a mut self) -> &'a Fragment {
|
||||
&self.block_flow.box_
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
//! CSS table formatting contexts.
|
||||
|
||||
use layout::box_::Box;
|
||||
use layout::box_::Fragment;
|
||||
use layout::block::{BlockFlow, MarginsMayNotCollapse, WidthAndMarginsComputer};
|
||||
use layout::block::{WidthConstraintInput, WidthConstraintSolution};
|
||||
use layout::construct::FlowConstructor;
|
||||
|
@ -37,7 +37,7 @@ pub struct TableWrapperFlow {
|
|||
|
||||
impl TableWrapperFlow {
|
||||
pub fn from_node_and_box(node: &ThreadSafeLayoutNode,
|
||||
box_: Box)
|
||||
box_: Fragment)
|
||||
-> TableWrapperFlow {
|
||||
let mut block_flow = BlockFlow::from_node_and_box(node, box_);
|
||||
let table_layout = if block_flow.box_().style().get_table().table_layout ==
|
||||
|
|
|
@ -4,9 +4,9 @@
|
|||
|
||||
//! Text layout.
|
||||
|
||||
use layout::box_::{Box, ScannedTextBox, ScannedTextBoxInfo, UnscannedTextBox};
|
||||
use layout::box_::{Fragment, ScannedTextFragment, ScannedTextFragmentInfo, UnscannedTextFragment};
|
||||
use layout::flow::Flow;
|
||||
use layout::inline::InlineBoxes;
|
||||
use layout::inline::InlineFragments;
|
||||
|
||||
use gfx::font::{FontMetrics, FontStyle};
|
||||
use gfx::font_context::FontContext;
|
||||
|
@ -25,12 +25,12 @@ struct NewLinePositions {
|
|||
}
|
||||
|
||||
// A helper function.
|
||||
fn can_coalesce_text_nodes(boxes: &[Box], left_i: uint, right_i: uint) -> bool {
|
||||
fn can_coalesce_text_nodes(boxes: &[Fragment], left_i: uint, right_i: uint) -> bool {
|
||||
assert!(left_i != right_i);
|
||||
boxes[left_i].can_merge_with_box(&boxes[right_i])
|
||||
}
|
||||
|
||||
/// A stack-allocated object for scanning an inline flow into `TextRun`-containing `TextBox`es.
|
||||
/// A stack-allocated object for scanning an inline flow into `TextRun`-containing `TextFragment`es.
|
||||
pub struct TextRunScanner {
|
||||
pub clump: Range<CharIndex>,
|
||||
}
|
||||
|
@ -48,10 +48,10 @@ impl TextRunScanner {
|
|||
debug!("TextRunScanner: scanning {:u} boxes for text runs...", inline.boxes.len());
|
||||
}
|
||||
|
||||
let InlineBoxes {
|
||||
let InlineFragments {
|
||||
boxes: old_boxes,
|
||||
map: mut map
|
||||
} = mem::replace(&mut flow.as_inline().boxes, InlineBoxes::new());
|
||||
} = mem::replace(&mut flow.as_inline().boxes, InlineFragments::new());
|
||||
|
||||
let mut last_whitespace = true;
|
||||
let mut new_boxes = Vec::new();
|
||||
|
@ -79,7 +79,7 @@ impl TextRunScanner {
|
|||
|
||||
// Swap out the old and new box list of the flow.
|
||||
map.fixup(old_boxes.as_slice(), new_boxes.as_slice());
|
||||
flow.as_inline().boxes = InlineBoxes {
|
||||
flow.as_inline().boxes = InlineFragments {
|
||||
boxes: new_boxes,
|
||||
map: map,
|
||||
}
|
||||
|
@ -96,8 +96,8 @@ impl TextRunScanner {
|
|||
/// with some smaller stub.
|
||||
pub fn flush_clump_to_list(&mut self,
|
||||
font_context: &mut FontContext,
|
||||
in_boxes: &[Box],
|
||||
out_boxes: &mut Vec<Box>,
|
||||
in_boxes: &[Fragment],
|
||||
out_boxes: &mut Vec<Fragment>,
|
||||
last_whitespace: bool)
|
||||
-> bool {
|
||||
assert!(self.clump.length() > CharIndex(0));
|
||||
|
@ -106,7 +106,7 @@ impl TextRunScanner {
|
|||
let is_singleton = self.clump.length() == CharIndex(1);
|
||||
|
||||
let is_text_clump = match in_boxes[self.clump.begin().to_uint()].specific {
|
||||
UnscannedTextBox(_) => true,
|
||||
UnscannedTextFragment(_) => true,
|
||||
_ => false,
|
||||
};
|
||||
|
||||
|
@ -124,7 +124,7 @@ impl TextRunScanner {
|
|||
(true, true) => {
|
||||
let old_box = &in_boxes[self.clump.begin().to_uint()];
|
||||
let text = match old_box.specific {
|
||||
UnscannedTextBox(ref text_box_info) => &text_box_info.text,
|
||||
UnscannedTextFragment(ref text_box_info) => &text_box_info.text,
|
||||
_ => fail!("Expected an unscanned text box!"),
|
||||
};
|
||||
|
||||
|
@ -159,9 +159,9 @@ impl TextRunScanner {
|
|||
*text);
|
||||
let range = Range::new(CharIndex(0), run.char_len());
|
||||
let new_metrics = run.metrics_for_range(&range);
|
||||
let new_text_box_info = ScannedTextBoxInfo::new(Arc::new(run), range);
|
||||
let new_text_box_info = ScannedTextFragmentInfo::new(Arc::new(run), range);
|
||||
let mut new_box = old_box.transform(new_metrics.bounding_box.size,
|
||||
ScannedTextBox(new_text_box_info));
|
||||
ScannedTextFragment(new_text_box_info));
|
||||
new_box.new_line_pos = new_line_pos;
|
||||
out_boxes.push(new_box)
|
||||
}
|
||||
|
@ -191,7 +191,7 @@ impl TextRunScanner {
|
|||
// be compressed correctly with respect to the text run.
|
||||
let idx = CharIndex(i as int) + self.clump.begin();
|
||||
let in_box = match in_boxes[idx.to_uint()].specific {
|
||||
UnscannedTextBox(ref text_box_info) => &text_box_info.text,
|
||||
UnscannedTextFragment(ref text_box_info) => &text_box_info.text,
|
||||
_ => fail!("Expected an unscanned text box!"),
|
||||
};
|
||||
|
||||
|
@ -243,10 +243,10 @@ impl TextRunScanner {
|
|||
continue
|
||||
}
|
||||
|
||||
let new_text_box_info = ScannedTextBoxInfo::new(run.get_ref().clone(), *range);
|
||||
let new_text_box_info = ScannedTextFragmentInfo::new(run.get_ref().clone(), *range);
|
||||
let new_metrics = new_text_box_info.run.metrics_for_range(range);
|
||||
let mut new_box = in_boxes[i.to_uint()].transform(new_metrics.bounding_box.size,
|
||||
ScannedTextBox(new_text_box_info));
|
||||
ScannedTextFragment(new_text_box_info));
|
||||
new_box.new_line_pos = new_line_positions.get(logical_offset.to_uint()).new_line_pos.clone();
|
||||
out_boxes.push(new_box)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue