blob: cda9ffb1d4e6233ddfa3498469862980df6aa906 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LayoutAnalyzer_h
#define LayoutAnalyzer_h
#include "platform/LayoutUnit.h"
#include "wtf/Allocator.h"
#include "wtf/Noncopyable.h"
#include <memory>
namespace blink {
class LayoutBlock;
class LayoutObject;
class TracedValue;
// Observes the performance of layout and reports statistics via a TracedValue.
// Usage:
// LayoutAnalyzer::Scope analyzer(*this);
class LayoutAnalyzer {
USING_FAST_MALLOC(LayoutAnalyzer);
WTF_MAKE_NONCOPYABLE(LayoutAnalyzer);
public:
enum Counter {
LayoutBlockWidthChanged,
LayoutBlockHeightChanged,
LayoutBlockSizeChanged,
LayoutBlockSizeDidNotChange,
LayoutObjectsThatSpecifyColumns,
LayoutAnalyzerStackMaximumDepth,
LayoutObjectsThatAreFloating,
LayoutObjectsThatHaveALayer,
LayoutInlineObjectsThatAlwaysCreateLineBoxes,
LayoutObjectsThatHadNeverHadLayout,
LayoutObjectsThatAreOutOfFlowPositioned,
LayoutObjectsThatNeedPositionedMovementLayout,
PerformLayoutRootLayoutObjects,
LayoutObjectsThatNeedLayoutForThemselves,
LayoutObjectsThatNeedSimplifiedLayout,
LayoutObjectsThatAreTableCells,
LayoutObjectsThatAreTextAndCanNotUseTheSimpleFontCodePath,
CharactersInLayoutObjectsThatAreTextAndCanNotUseTheSimpleFontCodePath,
LayoutObjectsThatAreTextAndCanUseTheSimpleFontCodePath,
CharactersInLayoutObjectsThatAreTextAndCanUseTheSimpleFontCodePath,
TotalLayoutObjectsThatWereLaidOut,
};
static const size_t NumCounters = 21;
class Scope {
STACK_ALLOCATED();
public:
explicit Scope(const LayoutObject&);
~Scope();
private:
const LayoutObject& m_layoutObject;
LayoutAnalyzer* m_analyzer;
};
class BlockScope {
STACK_ALLOCATED();
public:
explicit BlockScope(const LayoutBlock&);
~BlockScope();
private:
const LayoutBlock& m_block;
LayoutUnit m_width;
LayoutUnit m_height;
};
LayoutAnalyzer() { }
void reset();
void push(const LayoutObject&);
void pop(const LayoutObject&);
void increment(Counter counter, unsigned delta = 1)
{
m_counters[counter] += delta;
}
std::unique_ptr<TracedValue> toTracedValue();
private:
const char* nameForCounter(Counter) const;
double m_startMs;
unsigned m_depth;
unsigned m_counters[NumCounters];
};
} // namespace blink
#endif // LayoutAnalyzer_h