Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/layout/generic/nsQueryFrame.h
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#ifndef nsQueryFrame_h
8
#define nsQueryFrame_h
9
10
#include "nscore.h"
11
#include "mozilla/Assertions.h"
12
#include "mozilla/TypeTraits.h"
13
14
// NOTE: the long lines in this file are intentional to make compiler error
15
// messages more readable.
16
17
#define NS_DECL_QUERYFRAME_TARGET(classname)                    \
18
  static const nsQueryFrame::FrameIID kFrameIID = nsQueryFrame::classname##_id; \
19
  typedef classname Has_NS_DECL_QUERYFRAME_TARGET;
20
21
#define NS_DECL_QUERYFRAME                                      \
22
  void* QueryFrame(FrameIID id) override;
23
24
#define NS_QUERYFRAME_HEAD(class)                               \
25
0
  void* class::QueryFrame(FrameIID id) { switch (id) {
26
27
#define NS_QUERYFRAME_ENTRY(class)                              \
28
0
  case class::kFrameIID: {                                      \
29
0
    static_assert(mozilla::IsSame<class, class::Has_NS_DECL_QUERYFRAME_TARGET>::value, \
30
0
                  #class " must declare itself as a queryframe target"); \
31
0
    return static_cast<class*>(this);                           \
32
0
  }
33
34
#define NS_QUERYFRAME_ENTRY_CONDITIONAL(class, condition)       \
35
  case class::kFrameIID:                                        \
36
  if (condition) {                                              \
37
    static_assert(mozilla::IsSame<class, class::Has_NS_DECL_QUERYFRAME_TARGET>::value, \
38
                  #class " must declare itself as a queryframe target"); \
39
    return static_cast<class*>(this);                           \
40
  }                                                             \
41
  break;
42
43
#define NS_QUERYFRAME_TAIL_INHERITING(class)                    \
44
0
  default: break;                                               \
45
0
  }                                                             \
46
0
  return class::QueryFrame(id);                                 \
47
0
}
48
49
#define NS_QUERYFRAME_TAIL_INHERITANCE_ROOT                     \
50
0
  default: break;                                               \
51
0
  }                                                             \
52
0
  MOZ_ASSERT(id != GetFrameId(),                                \
53
0
    "A frame failed to QueryFrame to its *own type*. "          \
54
0
    "It may be missing NS_DECL_QUERYFRAME, or a "               \
55
0
    "NS_QUERYFRAME_ENTRY() line with its own type name");       \
56
0
  return nullptr;                                               \
57
0
}
58
59
class nsQueryFrame
60
{
61
public:
62
  enum FrameIID {
63
#define FRAME_ID(classname, ...) classname##_id,
64
#define ABSTRACT_FRAME_ID(classname) classname##_id,
65
#include "nsFrameIdList.h"
66
#undef FRAME_ID
67
#undef ABSTRACT_FRAME_ID
68
69
    // This marker allows mozilla::ArenaObjectID to "extend" this enum
70
    // with additional sequential values for use in nsPresArena and
71
    // nsIPresShell::{Allocate,Free}ByObjectId
72
    NON_FRAME_MARKER
73
  };
74
75
  // A strict subset of FrameIID above for frame classes that we instantiate.
76
  enum class ClassID : uint8_t {
77
#define FRAME_ID(classname, ...) classname##_id,
78
#define ABSTRACT_FRAME_ID(classname)
79
#include "nsFrameIdList.h"
80
#undef FRAME_ID
81
#undef ABSTRACT_FRAME_ID
82
  };
83
84
  virtual void* QueryFrame(FrameIID id) = 0;
85
};
86
87
class nsIFrame;
88
89
template<class Source>
90
class do_QueryFrameHelper
91
{
92
public:
93
0
  explicit do_QueryFrameHelper(Source* s) : mRawPtr(s) { }
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::do_QueryFrameHelper(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIPageSequenceFrame>::do_QueryFrameHelper(nsIPageSequenceFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIScrollbarMediator>::do_QueryFrameHelper(nsIScrollbarMediator*)
Unexecuted instantiation: do_QueryFrameHelper<nsFrame>::do_QueryFrameHelper(nsFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsScrollbarFrame>::do_QueryFrameHelper(nsScrollbarFrame*)
94
95
  // The return and argument types here are arbitrarily selected so no
96
  // corresponding member function exists.
97
  typedef void (do_QueryFrameHelper::* MatchNullptr)(double, float);
98
  // Implicit constructor for nullptr, trick borrowed from already_AddRefed.
99
  MOZ_IMPLICIT do_QueryFrameHelper(MatchNullptr aRawPtr) : mRawPtr(nullptr) {}
100
101
  template<class Dest>
102
0
  operator Dest*() {
103
0
    static_assert(mozilla::IsSame<Dest, typename Dest::Has_NS_DECL_QUERYFRAME_TARGET>::value,
104
0
                  "Dest must declare itself as a queryframe target");
105
0
    if (!mRawPtr) {
106
0
      return nullptr;
107
0
    }
108
0
    if (Dest* f = FastQueryFrame<Source, Dest>::QueryFrame(mRawPtr)) {
109
0
      MOZ_ASSERT(f ==
110
0
                 reinterpret_cast<Dest*>(mRawPtr->QueryFrame(Dest::kFrameIID)),
111
0
                 "fast and slow paths should give the same result");
112
0
      return f;
113
0
    }
114
0
    return reinterpret_cast<Dest*>(mRawPtr->QueryFrame(Dest::kFrameIID));
115
0
  }
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsIScrollableFrame*<nsIScrollableFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsIAnonymousContentCreator*<nsIAnonymousContentCreator>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsImageFrame*<nsImageFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsSVGImageFrame*<nsSVGImageFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsIObjectFrame*<nsIObjectFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsMenuFrame*<nsMenuFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsMenuBarFrame*<nsMenuBarFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::operator nsMenuFrame*<nsMenuFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsProgressFrame*<nsProgressFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsMeterFrame*<nsMeterFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsIPageSequenceFrame*<nsIPageSequenceFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsCanvasFrame*<nsCanvasFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator mozilla::ViewportFrame*<mozilla::ViewportFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::operator nsFirstLetterFrame*<nsFirstLetterFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsInlineFrame*<nsInlineFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsContainerFrame*<nsContainerFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::operator nsIListControlFrame*<nsIListControlFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsTableCellFrame*<nsTableCellFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIPageSequenceFrame>::operator nsIFrame*<nsIFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsIStatefulFrame*<nsIStatefulFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsBlockFrame*<nsBlockFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::operator nsBlockFrame*<nsBlockFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIScrollbarMediator>::operator nsIFrame*<nsIFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::operator nsIScrollableFrame*<nsIScrollableFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsDeckFrame*<nsDeckFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsFrame>::operator nsContainerFrame*<nsContainerFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsSliderFrame*<nsSliderFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsHTMLFramesetFrame*<nsHTMLFramesetFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::operator nsHTMLFramesetFrame*<nsHTMLFramesetFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsScrollbarFrame*<nsScrollbarFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::operator nsIScrollbarMediator*<nsIScrollbarMediator>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsGridContainerFrame*<nsGridContainerFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsTableRowGroupFrame*<nsTableRowGroupFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsTableRowFrame*<nsTableRowFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::operator nsMenuPopupFrame*<nsMenuPopupFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::operator nsMenuBarFrame*<nsMenuBarFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIScrollbarMediator>::operator nsIScrollableFrame*<nsIScrollableFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsIPopupContainer*<nsIPopupContainer>()
Unexecuted instantiation: do_QueryFrameHelper<nsScrollbarFrame>::operator nsIFrame*<nsIFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::operator nsIMathMLFrame*<nsIMathMLFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsMathMLContainerFrame*<nsMathMLContainerFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsMathMLmathBlockFrame*<nsMathMLmathBlockFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsMathMLmtableFrame*<nsMathMLmtableFrame>()
116
117
private:
118
  // For non-nsIFrame types there is no fast-path.
119
  template<class Src, class Dst, typename = void, typename = void>
120
  struct FastQueryFrame
121
  {
122
0
    static Dst* QueryFrame(Src* aFrame) { return nullptr; }
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsIScrollableFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsIAnonymousContentCreator, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsIObjectFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsIPageSequenceFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::FastQueryFrame<nsContainerFrame, nsIListControlFrame, void, void>::QueryFrame(nsContainerFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIPageSequenceFrame>::FastQueryFrame<nsIPageSequenceFrame, nsIFrame, void, void>::QueryFrame(nsIPageSequenceFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsIStatefulFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIScrollbarMediator>::FastQueryFrame<nsIScrollbarMediator, nsIFrame, void, void>::QueryFrame(nsIScrollbarMediator*)
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::FastQueryFrame<nsContainerFrame, nsIScrollableFrame, void, void>::QueryFrame(nsContainerFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::FastQueryFrame<nsContainerFrame, nsIScrollbarMediator, void, void>::QueryFrame(nsContainerFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIScrollbarMediator>::FastQueryFrame<nsIScrollbarMediator, nsIScrollableFrame, void, void>::QueryFrame(nsIScrollbarMediator*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsIPopupContainer, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::FastQueryFrame<nsContainerFrame, nsIMathMLFrame, void, void>::QueryFrame(nsContainerFrame*)
123
  };
124
125
  // Specialization for any nsIFrame type to any nsIFrame type -- if the source
126
  // instance's mClass matches kFrameIID of the destination type then
127
  // downcasting is safe.
128
  template<class Src, class Dst>
129
  struct FastQueryFrame<Src, Dst,
130
    typename mozilla::EnableIf<mozilla::IsBaseOf<nsIFrame, Src>::value>::Type,
131
    typename mozilla::EnableIf<mozilla::IsBaseOf<nsIFrame, Dst>::value>::Type>
132
  {
133
0
    static Dst* QueryFrame(Src* aFrame) {
134
0
      return nsQueryFrame::FrameIID(aFrame->mClass) == Dst::kFrameIID ?
135
0
        reinterpret_cast<Dst*>(aFrame) : nullptr;
136
0
    }
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsImageFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsSVGImageFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsMenuFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsMenuBarFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::FastQueryFrame<nsContainerFrame, nsMenuFrame, void, void>::QueryFrame(nsContainerFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsProgressFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsMeterFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsCanvasFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, mozilla::ViewportFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::FastQueryFrame<nsContainerFrame, nsFirstLetterFrame, void, void>::QueryFrame(nsContainerFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsInlineFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsContainerFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsTableCellFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsBlockFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::FastQueryFrame<nsContainerFrame, nsBlockFrame, void, void>::QueryFrame(nsContainerFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsDeckFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsFrame>::FastQueryFrame<nsFrame, nsContainerFrame, void, void>::QueryFrame(nsFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsSliderFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsHTMLFramesetFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::FastQueryFrame<nsContainerFrame, nsHTMLFramesetFrame, void, void>::QueryFrame(nsContainerFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsScrollbarFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsGridContainerFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsTableRowGroupFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsTableRowFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::FastQueryFrame<nsContainerFrame, nsMenuPopupFrame, void, void>::QueryFrame(nsContainerFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::FastQueryFrame<nsContainerFrame, nsMenuBarFrame, void, void>::QueryFrame(nsContainerFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsScrollbarFrame>::FastQueryFrame<nsScrollbarFrame, nsIFrame, void, void>::QueryFrame(nsScrollbarFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsMathMLContainerFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsMathMLmathBlockFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsMathMLmtableFrame, void, void>::QueryFrame(nsIFrame*)
137
  };
138
139
  Source* mRawPtr;
140
};
141
142
template<class T>
143
inline do_QueryFrameHelper<T>
144
do_QueryFrame(T* s)
145
0
{
146
0
  return do_QueryFrameHelper<T>(s);
147
0
}
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame> do_QueryFrame<nsIFrame>(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIPageSequenceFrame> do_QueryFrame<nsIPageSequenceFrame>(nsIPageSequenceFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIScrollbarMediator> do_QueryFrame<nsIScrollbarMediator>(nsIScrollbarMediator*)
Unexecuted instantiation: do_QueryFrameHelper<nsFrame> do_QueryFrame<nsFrame>(nsFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsScrollbarFrame> do_QueryFrame<nsScrollbarFrame>(nsScrollbarFrame*)
148
149
#endif // nsQueryFrame_h