mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 21:14:59 +00:00

No functional impact intended. This is just a more complicated way of writing what we have now. The goal of this commit is so that we are able to store the 'name' of a pseudo element for use in serializing 'unknown -webkit- pseudo-elements', see: https://www.w3.org/TR/selectors-4/#compat This is quite awkward, as in pretty much all cases just the selector type enum is enough, but we will need to cache the name for serializing these unknown selectors. I can't figure out any reason why we would need this name anywhere else in the engine, so pretty much everywhere is still just passing around this raw enum. But this change will allow us to easily store the name inside of this new struct for when it is needed for serialization, once those webkit unknown elements are supported by our engine.
60 lines
1.7 KiB
C++
60 lines
1.7 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/RefPtr.h>
|
|
#include <LibJS/Heap/GCPtr.h>
|
|
#include <LibWeb/CSS/Display.h>
|
|
#include <LibWeb/CSS/Selector.h>
|
|
#include <LibWeb/Forward.h>
|
|
|
|
namespace Web::Layout {
|
|
|
|
class TreeBuilder {
|
|
public:
|
|
TreeBuilder();
|
|
|
|
JS::GCPtr<Layout::Node> build(DOM::Node&);
|
|
|
|
private:
|
|
struct Context {
|
|
bool has_svg_root = false;
|
|
};
|
|
|
|
i32 calculate_list_item_index(DOM::Node&);
|
|
|
|
ErrorOr<void> create_layout_tree(DOM::Node&, Context&);
|
|
|
|
void push_parent(Layout::NodeWithStyle& node) { m_ancestor_stack.append(node); }
|
|
void pop_parent() { m_ancestor_stack.take_last(); }
|
|
|
|
template<CSS::DisplayInternal, typename Callback>
|
|
void for_each_in_tree_with_internal_display(NodeWithStyle& root, Callback);
|
|
|
|
template<CSS::DisplayInside, typename Callback>
|
|
void for_each_in_tree_with_inside_display(NodeWithStyle& root, Callback);
|
|
|
|
void fixup_tables(NodeWithStyle& root);
|
|
void remove_irrelevant_boxes(NodeWithStyle& root);
|
|
void generate_missing_child_wrappers(NodeWithStyle& root);
|
|
Vector<JS::Handle<Box>> generate_missing_parents(NodeWithStyle& root);
|
|
void missing_cells_fixup(Vector<JS::Handle<Box>> const&);
|
|
|
|
enum class AppendOrPrepend {
|
|
Append,
|
|
Prepend,
|
|
};
|
|
void insert_node_into_inline_or_block_ancestor(Layout::Node&, CSS::Display, AppendOrPrepend);
|
|
ErrorOr<void> create_pseudo_element_if_needed(DOM::Element&, CSS::Selector::PseudoElement::Type, AppendOrPrepend);
|
|
|
|
JS::GCPtr<Layout::Node> m_layout_root;
|
|
Vector<JS::NonnullGCPtr<Layout::NodeWithStyle>> m_ancestor_stack;
|
|
|
|
u32 m_quote_nesting_level { 0 };
|
|
};
|
|
|
|
}
|