blob: 6444c0edfca343bd9c8465ef36e605f15581c20f [file] [log] [blame]
/*
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef COBALT_LAYOUT_INLINE_CONTAINER_BOX_H_
#define COBALT_LAYOUT_INLINE_CONTAINER_BOX_H_
#include "cobalt/dom/font_list.h"
#include "cobalt/layout/container_box.h"
namespace cobalt {
namespace layout {
// The CSS 2.1 specification defines an inline box as an inline-level box whose
// contents participate in its containing inline formatting context. In fact,
// this definition matches two different types of boxes:
// - a text box;
// - an inline-level container box that contains other inline-level boxes
// (including text boxes).
// This class implements the latter.
//
// Note that "inline box" and "inline-level box" are two different concepts.
// Inline-level boxes that are not inline boxes (such as inline-block elements)
// are called atomic inline-level boxes because they participate in their inline
// formatting context as a single opaque box.
// https://www.w3.org/TR/CSS21/visuren.html#inline-boxes
class InlineContainerBox : public ContainerBox {
public:
InlineContainerBox(const scoped_refptr<cssom::CSSComputedStyleDeclaration>&
css_computed_style_declaration,
UsedStyleProvider* used_style_provider,
LayoutStatTracker* layout_stat_tracker);
~InlineContainerBox() OVERRIDE;
// From |Box|.
Level GetLevel() const OVERRIDE;
void UpdateContentSizeAndMargins(const LayoutParams& layout_params) OVERRIDE;
WrapResult TryWrapAt(WrapAtPolicy wrap_at_policy,
WrapOpportunityPolicy wrap_opportunity_policy,
bool is_line_existence_justified,
LayoutUnit available_width,
bool should_collapse_trailing_white_space) OVERRIDE;
Box* GetSplitSibling() const OVERRIDE;
bool DoesFulfillEllipsisPlacementRequirement() const OVERRIDE;
void DoPreEllipsisPlacementProcessing() OVERRIDE;
void DoPostEllipsisPlacementProcessing() OVERRIDE;
bool TrySplitAtSecondBidiLevelRun() OVERRIDE;
base::optional<int> GetBidiLevel() const OVERRIDE;
void SetShouldCollapseLeadingWhiteSpace(
bool should_collapse_leading_white_space) OVERRIDE;
void SetShouldCollapseTrailingWhiteSpace(
bool should_collapse_trailing_white_space) OVERRIDE;
bool HasLeadingWhiteSpace() const OVERRIDE;
bool HasTrailingWhiteSpace() const OVERRIDE;
bool IsCollapsed() const OVERRIDE;
bool JustifiesLineExistence() const OVERRIDE;
bool HasTrailingLineBreak() const OVERRIDE;
bool AffectsBaselineInBlockFormattingContext() const OVERRIDE;
LayoutUnit GetBaselineOffsetFromTopMarginEdge() const OVERRIDE;
LayoutUnit GetInlineLevelBoxHeight() const OVERRIDE;
LayoutUnit GetInlineLevelTopMargin() const OVERRIDE;
// From |ContainerBox|.
bool TryAddChild(const scoped_refptr<Box>& child_box) OVERRIDE;
scoped_refptr<ContainerBox> TrySplitAtEnd() OVERRIDE;
protected:
// From |Box|.
bool IsTransformable() const OVERRIDE;
#ifdef COBALT_BOX_DUMP_ENABLED
void DumpClassName(std::ostream* stream) const OVERRIDE;
void DumpProperties(std::ostream* stream) const OVERRIDE;
#endif // COBALT_BOX_DUMP_ENABLED
private:
// From |Box|.
void DoPlaceEllipsisOrProcessPlacedEllipsis(
BaseDirection base_direction, LayoutUnit desired_offset,
bool* is_placement_requirement_met, bool* is_placed,
LayoutUnit* placed_offset) OVERRIDE;
WrapResult TryWrapAtBefore(WrapOpportunityPolicy wrap_opportunity_policy,
bool is_line_requirement_met,
LayoutUnit available_width,
bool should_collapse_trailing_white_space);
WrapResult TryWrapAtLastOpportunityWithinWidth(
WrapOpportunityPolicy wrap_opportunity_policy,
bool is_line_requirement_met, LayoutUnit available_width,
bool should_collapse_trailing_white_space);
WrapResult TryWrapAtLastOpportunityBeforeIndex(
size_t index, WrapOpportunityPolicy wrap_opportunity_policy,
bool is_line_requirement_met, LayoutUnit available_width,
bool should_collapse_trailing_white_space);
WrapResult TryWrapAtFirstOpportunity(
WrapOpportunityPolicy wrap_opportunity_policy,
bool is_line_requirement_met, LayoutUnit available_width,
bool should_collapse_trailing_white_space);
WrapResult TryWrapAtIndex(size_t wrap_index, WrapAtPolicy wrap_at_policy,
WrapOpportunityPolicy wrap_opportunity_policy,
bool is_line_requirement_met,
LayoutUnit available_width,
bool should_collapse_trailing_white_space);
void SplitAtIterator(Boxes::const_iterator child_split_iterator);
bool should_collapse_leading_white_space_;
bool should_collapse_trailing_white_space_;
bool has_leading_white_space_;
bool has_trailing_white_space_;
bool is_collapsed_;
bool justifies_line_existence_;
size_t first_box_justifying_line_existence_index_;
LayoutUnit baseline_offset_from_margin_box_top_;
LayoutUnit line_height_;
LayoutUnit inline_top_margin_;
// A font used for text width and line height calculations.
const scoped_refptr<dom::FontList> used_font_;
// A reference to the next inline container box in a linked list of inline
// container boxes produced from splits of the initial text box. This enables
// HTMLElement to retain access to all of its layout boxes after they are
// split.
scoped_refptr<InlineContainerBox> split_sibling_;
DISALLOW_COPY_AND_ASSIGN(InlineContainerBox);
};
} // namespace layout
} // namespace cobalt
#endif // COBALT_LAYOUT_INLINE_CONTAINER_BOX_H_