aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020/flow/root.rs
blob: 08a2339750621034ff44df882f3a99fe7f481729 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */

use super::*;

// FIXME
// impl crate::dom::Document {
//     pub(crate) fn layout(
//         &self,
//         viewport: crate::geom::Size<crate::geom::CssPx>,
//     ) -> Vec<Fragment> {
//         BoxTreeRoot::construct(self).layout(viewport)
//     }
// }

struct BoxTreeRoot(BlockFormattingContext);

// FIXME
// impl BoxTreeRoot {
//     pub fn construct(document: &dom::Document) -> Self {
//         let author_styles = &document.parse_stylesheets();
//         let context = Context {
//             document,
//             author_styles,
//         };
//         let root_element = document.root_element();
//         let style = style_for_element(context.author_styles, context.document, root_element, None);
//         let (contains_floats, boxes) = construct_for_root_element(&context, root_element, style);
//         Self(BlockFormattingContext {
//             contains_floats: contains_floats == ContainsFloats::Yes,
//             contents: BlockContainer::BlockLevelBoxes(boxes),
//         })
//     }
// }

// fn construct_for_root_element(
//     context: &Context,
//     root_element: dom::NodeId,
//     style: Arc<ComputedValues>,
// ) -> (ContainsFloats, Vec<Arc<BlockLevelBox>>) {
//     let replaced = ReplacedContent::for_element(root_element, context);

//     let display_inside = match style.box_.display {
//         Display::None => return (ContainsFloats::No, Vec::new()),
//         Display::Contents if replaced.is_some() => {
//             // 'display: contents' computes to 'none' for replaced elements
//             return (ContainsFloats::No, Vec::new());
//         }
//         // https://drafts.csswg.org/css-display-3/#transformations
//         Display::Contents => DisplayInside::Flow,
//         // The root element is blockified, ignore DisplayOutside
//         Display::GeneratingBox(DisplayGeneratingBox::OutsideInside { inside, .. }) => inside,
//     };

//     if let Some(replaced) = replaced {
//         let _box = match replaced {};
//         #[allow(unreachable_code)]
//         {
//             return (ContainsFloats::No, vec![Arc::new(_box)]);
//         }
//     }

//     let contents = IndependentFormattingContext::construct(
//         context,
//         &style,
//         display_inside,
//         Contents::OfElement(root_element),
//     );
//     if style.box_.position.is_absolutely_positioned() {
//         (
//             ContainsFloats::No,
//             vec![Arc::new(BlockLevelBox::OutOfFlowAbsolutelyPositionedBox(
//                 AbsolutelyPositionedBox { style, contents },
//             ))],
//         )
//     } else if style.box_.float.is_floating() {
//         (
//             ContainsFloats::Yes,
//             vec![Arc::new(BlockLevelBox::OutOfFlowFloatBox(FloatBox {
//                 contents,
//                 style,
//             }))],
//         )
//     } else {
//         (
//             ContainsFloats::No,
//             vec![Arc::new(BlockLevelBox::Independent { style, contents })],
//         )
//     }
// }

// impl BoxTreeRoot {
//     fn layout(&self, viewport: crate::geom::Size<crate::geom::CssPx>) -> Vec<Fragment> {
//         let initial_containing_block_size = Vec2 {
//             inline: Length { px: viewport.width },
//             block: Length {
//                 px: viewport.height,
//             },
//         };

//         let initial_containing_block = ContainingBlock {
//             inline_size: initial_containing_block_size.inline,
//             block_size: LengthOrAuto::Length(initial_containing_block_size.block),
//             // FIXME: use the document’s mode:
//             // https://drafts.csswg.org/css-writing-modes/#principal-flow
//             mode: (WritingMode::HorizontalTb, Direction::Ltr),
//         };
//         let dummy_tree_rank = 0;
//         let mut absolutely_positioned_fragments = vec![];
//         let mut fragments = self.0.layout(
//             &initial_containing_block,
//             &mut absolutely_positioned_fragments,
//             dummy_tree_rank,
//             &mut PlacementState::root(),
//         );

//         let initial_containing_block = DefiniteContainingBlock {
//             size: initial_containing_block_size,
//             mode: initial_containing_block.mode,
//         };
//         fragments.par_extend(
//             absolutely_positioned_fragments
//                 .par_iter()
//                 .map(|a| a.layout(&initial_containing_block)),
//         );
//         fragments
//     }
// }