Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(824)

Unified Diff: third_party/WebKit/Source/core/layout/ng/ng_box.cc

Issue 2284983002: [layoutng] Implement state machine for async layout (Closed)
Patch Set: NOTREACHED, also fix the windows compile error Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/ng/ng_box.cc
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_box.cc b/third_party/WebKit/Source/core/layout/ng/ng_box.cc
index f96a7a49c8128192cbab420754744ef88fb3ee20..43e9b9ae24ea941ed5836b6f448af7288892b55f 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_box.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_box.cc
@@ -7,7 +7,6 @@
#include "core/layout/LayoutObject.h"
#include "core/layout/ng/layout_ng_block_flow.h"
#include "core/layout/ng/ng_block_layout_algorithm.h"
-#include "core/layout/ng/ng_box_iterator.h"
#include "core/layout/ng/ng_constraint_space.h"
#include "core/layout/ng/ng_fragment.h"
#include "core/layout/ng/ng_fragment_builder.h"
@@ -16,6 +15,10 @@
#include "core/layout/LayoutBox.h"
namespace blink {
+NGBox::NGBox(LayoutObject* layout_object)
+ : layout_box_(toLayoutBox(layout_object)) {
+ DCHECK(layout_box_);
+}
bool NGBox::Layout(const NGConstraintSpace* constraint_space,
NGFragment** out) {
@@ -23,71 +26,71 @@ bool NGBox::Layout(const NGConstraintSpace* constraint_space,
// resulting size to the LayoutObject, or use the old layout code and
// synthesize a fragment.
NGFragment* fragment = nullptr;
- if (canUseNewLayout()) {
- NGBlockLayoutAlgorithm algorithm(style(), childIterator());
-
+ if (CanUseNewLayout()) {
+ if (!algorithm_)
+ algorithm_ = new NGBlockLayoutAlgorithm(Style(), FirstChild());
// Change the coordinate system of the constraint space.
NGConstraintSpace* child_constraint_space = new NGConstraintSpace(
- FromPlatformWritingMode(style()->getWritingMode()), constraint_space);
+ FromPlatformWritingMode(Style()->getWritingMode()), constraint_space);
- if (!algorithm.Layout(child_constraint_space, &fragment))
+ if (!algorithm_->Layout(child_constraint_space, &fragment))
return false;
- m_layoutBox->setLogicalWidth(fragment->InlineSize());
- m_layoutBox->setLogicalHeight(fragment->BlockSize());
- if (m_layoutBox->isLayoutBlock())
- toLayoutBlock(m_layoutBox)->layoutPositionedObjects(true);
- m_layoutBox->clearNeedsLayout();
+ layout_box_->setLogicalWidth(fragment->InlineSize());
+ layout_box_->setLogicalHeight(fragment->BlockSize());
+ if (layout_box_->isLayoutBlock())
+ toLayoutBlock(layout_box_)->layoutPositionedObjects(true);
+ layout_box_->clearNeedsLayout();
} else {
// TODO(layout-ng): If fixedSize is true, set the override width/height too
NGLogicalSize container_size = constraint_space->ContainerSize();
- m_layoutBox->setOverrideContainingBlockContentLogicalWidth(
+ layout_box_->setOverrideContainingBlockContentLogicalWidth(
container_size.inline_size);
- m_layoutBox->setOverrideContainingBlockContentLogicalHeight(
+ layout_box_->setOverrideContainingBlockContentLogicalHeight(
container_size.block_size);
- if (m_layoutBox->isLayoutNGBlockFlow() && m_layoutBox->needsLayout()) {
- toLayoutNGBlockFlow(m_layoutBox)->LayoutBlockFlow::layoutBlock(true);
+ if (layout_box_->isLayoutNGBlockFlow() && layout_box_->needsLayout()) {
+ toLayoutNGBlockFlow(layout_box_)->LayoutBlockFlow::layoutBlock(true);
} else {
- m_layoutBox->layoutIfNeeded();
+ layout_box_->layoutIfNeeded();
}
- LayoutRect overflow = m_layoutBox->layoutOverflowRect();
+ LayoutRect overflow = layout_box_->layoutOverflowRect();
// TODO(layout-ng): This does not handle writing modes correctly (for
// overflow & the enums)
NGFragmentBuilder builder(NGFragmentBase::FragmentBox);
- builder.SetInlineSize(m_layoutBox->logicalWidth())
- .SetBlockSize(m_layoutBox->logicalHeight())
+ builder.SetInlineSize(layout_box_->logicalWidth())
+ .SetBlockSize(layout_box_->logicalHeight())
.SetInlineOverflow(overflow.width())
.SetBlockOverflow(overflow.height());
fragment = builder.ToFragment();
}
*out = fragment;
+ // Reset algorithm for future use
+ algorithm_ = nullptr;
return true;
}
-const ComputedStyle* NGBox::style() const {
- return m_layoutBox->style();
-}
-
-NGBoxIterator NGBox::childIterator() {
- return NGBoxIterator(firstChild());
+const ComputedStyle* NGBox::Style() const {
+ return layout_box_->style();
}
-NGBox NGBox::nextSibling() const {
- return m_layoutBox ? NGBox(m_layoutBox->nextSibling()) : NGBox();
+NGBox* NGBox::NextSibling() const {
+ LayoutObject* next_sibling = layout_box_->nextSibling();
+ return next_sibling ? new NGBox(next_sibling) : nullptr;
}
-NGBox NGBox::firstChild() const {
- return m_layoutBox ? NGBox(m_layoutBox->slowFirstChild()) : NGBox();
+NGBox* NGBox::FirstChild() const {
+ LayoutObject* child = layout_box_->slowFirstChild();
+ return child ? new NGBox(child) : nullptr;
}
-void NGBox::positionUpdated(const NGFragment& fragment) {
- m_layoutBox->setLogicalLeft(fragment.InlineOffset());
- m_layoutBox->setLogicalTop(fragment.BlockOffset());
+void NGBox::PositionUpdated(const NGFragment& fragment) {
+ layout_box_->setLogicalLeft(fragment.InlineOffset());
+ layout_box_->setLogicalTop(fragment.BlockOffset());
}
-bool NGBox::canUseNewLayout() {
- if (!m_layoutBox)
+bool NGBox::CanUseNewLayout() {
+ if (!layout_box_)
return true;
- if (m_layoutBox->isLayoutBlockFlow() && !m_layoutBox->childrenInline())
+ if (layout_box_->isLayoutBlockFlow() && !layout_box_->childrenInline())
return true;
return false;
}

Powered by Google App Engine
This is Rietveld 408576698