Blame dom/base/nsWindowSizes.h

Packit f0b94e
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
Packit f0b94e
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
Packit f0b94e
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit f0b94e
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
Packit f0b94e
#ifndef nsWindowSizes_h
Packit f0b94e
#define nsWindowSizes_h
Packit f0b94e
Packit f0b94e
#include "mozilla/Assertions.h"
Packit f0b94e
#include "mozilla/PodOperations.h"
Packit f0b94e
#include "mozilla/SizeOfState.h"
Packit f0b94e
Packit f0b94e
class nsTabSizes {
Packit f0b94e
 public:
Packit f0b94e
  enum Kind {
Packit f0b94e
    DOM,    // DOM stuff.
Packit f0b94e
    Style,  // Style stuff.
Packit f0b94e
    Other   // Everything else.
Packit f0b94e
  };
Packit f0b94e
Packit f0b94e
  nsTabSizes() : mDom(0), mStyle(0), mOther(0) {}
Packit f0b94e
Packit f0b94e
  void add(Kind kind, size_t n) {
Packit f0b94e
    switch (kind) {
Packit f0b94e
      case DOM:
Packit f0b94e
        mDom += n;
Packit f0b94e
        break;
Packit f0b94e
      case Style:
Packit f0b94e
        mStyle += n;
Packit f0b94e
        break;
Packit f0b94e
      case Other:
Packit f0b94e
        mOther += n;
Packit f0b94e
        break;
Packit f0b94e
      default:
Packit f0b94e
        MOZ_CRASH("bad nsTabSizes kind");
Packit f0b94e
    }
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  size_t mDom;
Packit f0b94e
  size_t mStyle;
Packit f0b94e
  size_t mOther;
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
#define ZERO_SIZE(kind, mSize) mSize(0),
Packit f0b94e
#define ADD_TO_TAB_SIZES(kind, mSize) aSizes->add(nsTabSizes::kind, mSize);
Packit f0b94e
#define ADD_TO_TOTAL_SIZE(kind, mSize) total += mSize;
Packit f0b94e
#define DECL_SIZE(kind, mSize) size_t mSize;
Packit f0b94e
Packit f0b94e
#define NS_STYLE_SIZES_FIELD(name_) mStyle##name_
Packit f0b94e
Packit f0b94e
struct nsStyleSizes {
Packit f0b94e
  nsStyleSizes()
Packit f0b94e
      :
Packit f0b94e
#define STYLE_STRUCT(name_, cb_) NS_STYLE_SIZES_FIELD(name_)(0),
Packit f0b94e
#define STYLE_STRUCT_LIST_IGNORE_VARIABLES
Packit f0b94e
#include "nsStyleStructList.h"
Packit f0b94e
#undef STYLE_STRUCT
Packit f0b94e
#undef STYLE_STRUCT_LIST_IGNORE_VARIABLES
Packit f0b94e
Packit f0b94e
        dummy() {
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  void addToTabSizes(nsTabSizes* aSizes) const {
Packit f0b94e
#define STYLE_STRUCT(name_, cb_) \
Packit f0b94e
  aSizes->add(nsTabSizes::Style, NS_STYLE_SIZES_FIELD(name_));
Packit f0b94e
#define STYLE_STRUCT_LIST_IGNORE_VARIABLES
Packit f0b94e
#include "nsStyleStructList.h"
Packit f0b94e
#undef STYLE_STRUCT
Packit f0b94e
#undef STYLE_STRUCT_LIST_IGNORE_VARIABLES
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  size_t getTotalSize() const {
Packit f0b94e
    size_t total = 0;
Packit f0b94e
Packit f0b94e
#define STYLE_STRUCT(name_, cb_) total += NS_STYLE_SIZES_FIELD(name_);
Packit f0b94e
#define STYLE_STRUCT_LIST_IGNORE_VARIABLES
Packit f0b94e
#include "nsStyleStructList.h"
Packit f0b94e
#undef STYLE_STRUCT
Packit f0b94e
#undef STYLE_STRUCT_LIST_IGNORE_VARIABLES
Packit f0b94e
Packit f0b94e
    return total;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
#define STYLE_STRUCT(name_, cb_) size_t NS_STYLE_SIZES_FIELD(name_);
Packit f0b94e
#define STYLE_STRUCT_LIST_IGNORE_VARIABLES
Packit f0b94e
#include "nsStyleStructList.h"
Packit f0b94e
#undef STYLE_STRUCT
Packit f0b94e
#undef STYLE_STRUCT_LIST_IGNORE_VARIABLES
Packit f0b94e
Packit f0b94e
  // Present just to absorb the trailing comma in the constructor.
Packit f0b94e
  int dummy;
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
#define NS_ARENA_SIZES_FIELD(classname) mArena##classname
Packit f0b94e
Packit f0b94e
struct nsArenaSizes {
Packit f0b94e
#define FOR_EACH_SIZE(MACRO) \
Packit f0b94e
  MACRO(Other, mLineBoxes)   \
Packit f0b94e
  MACRO(Style, mRuleNodes)   \
Packit f0b94e
  MACRO(Style, mStyleContexts)
Packit f0b94e
Packit f0b94e
  nsArenaSizes()
Packit f0b94e
      : FOR_EACH_SIZE(ZERO_SIZE)
Packit f0b94e
#define FRAME_ID(classname, ...) NS_ARENA_SIZES_FIELD(classname)(0),
Packit f0b94e
#define ABSTRACT_FRAME_ID(...)
Packit f0b94e
#include "nsFrameIdList.h"
Packit f0b94e
#undef FRAME_ID
Packit f0b94e
#undef ABSTRACT_FRAME_ID
Packit f0b94e
Packit f0b94e
            mGeckoStyleSizes() {
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  void addToTabSizes(nsTabSizes* aSizes) const {
Packit f0b94e
    FOR_EACH_SIZE(ADD_TO_TAB_SIZES)
Packit f0b94e
Packit f0b94e
#define FRAME_ID(classname, ...) \
Packit f0b94e
  aSizes->add(nsTabSizes::Other, NS_ARENA_SIZES_FIELD(classname));
Packit f0b94e
#define ABSTRACT_FRAME_ID(...)
Packit f0b94e
#include "nsFrameIdList.h"
Packit f0b94e
#undef FRAME_ID
Packit f0b94e
#undef ABSTRACT_FRAME_ID
Packit f0b94e
Packit f0b94e
    mGeckoStyleSizes.addToTabSizes(aSizes);
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  size_t getTotalSize() const {
Packit f0b94e
    size_t total = 0;
Packit f0b94e
Packit f0b94e
    FOR_EACH_SIZE(ADD_TO_TOTAL_SIZE)
Packit f0b94e
Packit f0b94e
#define FRAME_ID(classname, ...) total += NS_ARENA_SIZES_FIELD(classname);
Packit f0b94e
#define ABSTRACT_FRAME_ID(...)
Packit f0b94e
#include "nsFrameIdList.h"
Packit f0b94e
#undef FRAME_ID
Packit f0b94e
#undef ABSTRACT_FRAME_ID
Packit f0b94e
Packit f0b94e
    total += mGeckoStyleSizes.getTotalSize();
Packit f0b94e
Packit f0b94e
    return total;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  FOR_EACH_SIZE(DECL_SIZE)
Packit f0b94e
Packit f0b94e
#define FRAME_ID(classname, ...) size_t NS_ARENA_SIZES_FIELD(classname);
Packit f0b94e
#define ABSTRACT_FRAME_ID(...)
Packit f0b94e
#include "nsFrameIdList.h"
Packit f0b94e
#undef FRAME_ID
Packit f0b94e
#undef ABSTRACT_FRAME_ID
Packit f0b94e
Packit f0b94e
  // This is Gecko-only because in Stylo these style structs are stored outside
Packit f0b94e
  // the nsPresArena, and so measured elsewhere.
Packit f0b94e
  nsStyleSizes mGeckoStyleSizes;
Packit f0b94e
Packit f0b94e
#undef FOR_EACH_SIZE
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
class nsWindowSizes {
Packit f0b94e
#define FOR_EACH_SIZE(MACRO)                                      \
Packit f0b94e
  MACRO(DOM, mDOMElementNodesSize)                                \
Packit f0b94e
  MACRO(DOM, mDOMTextNodesSize)                                   \
Packit f0b94e
  MACRO(DOM, mDOMCDATANodesSize)                                  \
Packit f0b94e
  MACRO(DOM, mDOMCommentNodesSize)                                \
Packit f0b94e
  MACRO(DOM, mDOMEventTargetsSize)                                \
Packit f0b94e
  MACRO(DOM, mDOMPerformanceUserEntries)                          \
Packit f0b94e
  MACRO(DOM, mDOMPerformanceResourceEntries)                      \
Packit f0b94e
  MACRO(DOM, mDOMOtherSize)                                       \
Packit f0b94e
  MACRO(Style, mLayoutStyleSheetsSize)                            \
Packit f0b94e
  MACRO(Other, mLayoutPresShellSize)                              \
Packit f0b94e
  MACRO(Style, mLayoutGeckoStyleSets)                             \
Packit f0b94e
  MACRO(Style, mLayoutServoStyleSetsStylistRuleTree)              \
Packit f0b94e
  MACRO(Style, mLayoutServoStyleSetsStylistElementAndPseudosMaps) \
Packit f0b94e
  MACRO(Style, mLayoutServoStyleSetsStylistInvalidationMap)       \
Packit f0b94e
  MACRO(Style, mLayoutServoStyleSetsStylistRevalidationSelectors) \
Packit f0b94e
  MACRO(Style, mLayoutServoStyleSetsStylistOther)                 \
Packit f0b94e
  MACRO(Style, mLayoutServoStyleSetsOther)                        \
Packit f0b94e
  MACRO(Style, mLayoutServoElementDataObjects)                    \
Packit f0b94e
  MACRO(Other, mLayoutTextRunsSize)                               \
Packit f0b94e
  MACRO(Other, mLayoutPresContextSize)                            \
Packit f0b94e
  MACRO(Other, mLayoutFramePropertiesSize)                        \
Packit f0b94e
  MACRO(Style, mLayoutComputedValuesDom)                          \
Packit f0b94e
  MACRO(Style, mLayoutComputedValuesNonDom)                       \
Packit f0b94e
  MACRO(Style, mLayoutComputedValuesVisited)                      \
Packit f0b94e
  MACRO(Style, mLayoutComputedValuesStale)                        \
Packit f0b94e
  MACRO(Other, mPropertyTablesSize)                               \
Packit f0b94e
  MACRO(Other, mBindingsSize)
Packit f0b94e
Packit f0b94e
 public:
Packit f0b94e
  explicit nsWindowSizes(mozilla::SizeOfState& aState)
Packit f0b94e
      : FOR_EACH_SIZE(ZERO_SIZE) mDOMEventTargetsCount(0),
Packit f0b94e
        mDOMEventListenersCount(0),
Packit f0b94e
        mArenaSizes(),
Packit f0b94e
        mServoStyleSizes(),
Packit f0b94e
        mState(aState) {}
Packit f0b94e
Packit f0b94e
  void addToTabSizes(nsTabSizes* aSizes) const {
Packit f0b94e
    FOR_EACH_SIZE(ADD_TO_TAB_SIZES)
Packit f0b94e
    mArenaSizes.addToTabSizes(aSizes);
Packit f0b94e
    mServoStyleSizes.addToTabSizes(aSizes);
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  size_t getTotalSize() const {
Packit f0b94e
    size_t total = 0;
Packit f0b94e
Packit f0b94e
    FOR_EACH_SIZE(ADD_TO_TOTAL_SIZE)
Packit f0b94e
    total += mArenaSizes.getTotalSize();
Packit f0b94e
    total += mServoStyleSizes.getTotalSize();
Packit f0b94e
Packit f0b94e
    return total;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  FOR_EACH_SIZE(DECL_SIZE);
Packit f0b94e
Packit f0b94e
  uint32_t mDOMEventTargetsCount;
Packit f0b94e
  uint32_t mDOMEventListenersCount;
Packit f0b94e
Packit f0b94e
  nsArenaSizes mArenaSizes;
Packit f0b94e
Packit f0b94e
  // This is Stylo-only because in Gecko these style structs are stored in the
Packit f0b94e
  // nsPresArena, and so are measured as part of that.
Packit f0b94e
  nsStyleSizes mServoStyleSizes;
Packit f0b94e
Packit f0b94e
  mozilla::SizeOfState& mState;
Packit f0b94e
Packit f0b94e
#undef FOR_EACH_SIZE
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
#undef ZERO_SIZE
Packit f0b94e
#undef ADD_TO_TAB_SIZES
Packit f0b94e
#undef ADD_TO_TOTAL_SIZE
Packit f0b94e
#undef DECL_SIZE
Packit f0b94e
Packit f0b94e
#endif  // nsWindowSizes_h