Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dist/include/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
  default: break;                                               \
51
  }                                                             \
52
  MOZ_ASSERT(id != GetFrameId(),                                \
53
    "A frame failed to QueryFrame to its *own type*. "          \
54
    "It may be missing NS_DECL_QUERYFRAME, or a "               \
55
    "NS_QUERYFRAME_ENTRY() line with its own type name");       \
56
  return nullptr;                                               \
57
}
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<nsIScrollableFrame>::do_QueryFrameHelper(nsIScrollableFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::do_QueryFrameHelper(nsContainerFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFormControlFrame>::do_QueryFrameHelper(nsIFormControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsISelectControlFrame>::do_QueryFrameHelper(nsISelectControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIListControlFrame>::do_QueryFrameHelper(nsIListControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIComboboxControlFrame>::do_QueryFrameHelper(nsIComboboxControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsSVGDisplayableFrame>::do_QueryFrameHelper(nsSVGDisplayableFrame*)
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<nsIScrollableFrame>::operator nsIFrame*<nsIFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIScrollableFrame>::operator nsIScrollbarMediator*<nsIScrollbarMediator>()
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::operator nsITextControlFrame*<nsITextControlFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsTextFrame*<nsTextFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsITextControlFrame*<nsITextControlFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsNumberControlFrame*<nsNumberControlFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsMenuPopupFrame*<nsMenuPopupFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsSubDocumentFrame*<nsSubDocumentFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsPluginFrame*<nsPluginFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsIComboboxControlFrame*<nsIComboboxControlFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsTreeBodyFrame*<nsTreeBodyFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsIScrollbarMediator*<nsIScrollbarMediator>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFormControlFrame>::operator nsIFrame*<nsIFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsDateTimeControlFrame*<nsDateTimeControlFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsRangeFrame*<nsRangeFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsColorControlFrame*<nsColorControlFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsISelectControlFrame>::operator nsIFrame*<nsIFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFormControlFrame>::operator nsISelectControlFrame*<nsISelectControlFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFormControlFrame>::operator nsIComboboxControlFrame*<nsIComboboxControlFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFormControlFrame>::operator nsIListControlFrame*<nsIListControlFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsVideoFrame*<nsVideoFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsIFormControlFrame*<nsIFormControlFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsISVGSVGFrame*<nsISVGSVGFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsSVGDisplayableFrame*<nsSVGDisplayableFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsITableCellLayout*<nsITableCellLayout>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsTableWrapperFrame*<nsTableWrapperFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsHTMLCanvasFrame*<nsHTMLCanvasFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsIMathMLFrame*<nsIMathMLFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIListControlFrame>::operator nsIScrollableFrame*<nsIScrollableFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsIListControlFrame*<nsIListControlFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsISelectControlFrame*<nsISelectControlFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIListControlFrame>::operator nsISelectControlFrame*<nsISelectControlFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIComboboxControlFrame>::operator nsIFrame*<nsIFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsSVGDisplayableFrame>::operator mozilla::SVGGeometryFrame*<mozilla::SVGGeometryFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsSVGDisplayableFrame>::operator nsIFrame*<nsIFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsSVGContainerFrame*<nsSVGContainerFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsIFrame*<nsIFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsRubyTextContainerFrame*<nsRubyTextContainerFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::operator nsDeckFrame*<nsDeckFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator mozilla::SVGGeometryFrame*<mozilla::SVGGeometryFrame>()
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::operator nsTextBoxFrame*<nsTextBoxFrame>()
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<nsIScrollableFrame>::FastQueryFrame<nsIScrollableFrame, nsIFrame, void, void>::QueryFrame(nsIScrollableFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIScrollableFrame>::FastQueryFrame<nsIScrollableFrame, nsIScrollbarMediator, void, void>::QueryFrame(nsIScrollableFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::FastQueryFrame<nsContainerFrame, nsITextControlFrame, void, void>::QueryFrame(nsContainerFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsITextControlFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsIComboboxControlFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsIScrollbarMediator, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFormControlFrame>::FastQueryFrame<nsIFormControlFrame, nsIFrame, void, void>::QueryFrame(nsIFormControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsISelectControlFrame>::FastQueryFrame<nsISelectControlFrame, nsIFrame, void, void>::QueryFrame(nsISelectControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFormControlFrame>::FastQueryFrame<nsIFormControlFrame, nsISelectControlFrame, void, void>::QueryFrame(nsIFormControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFormControlFrame>::FastQueryFrame<nsIFormControlFrame, nsIComboboxControlFrame, void, void>::QueryFrame(nsIFormControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFormControlFrame>::FastQueryFrame<nsIFormControlFrame, nsIListControlFrame, void, void>::QueryFrame(nsIFormControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsIFormControlFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsISVGSVGFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsSVGDisplayableFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsITableCellLayout, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsIMathMLFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIListControlFrame>::FastQueryFrame<nsIListControlFrame, nsIScrollableFrame, void, void>::QueryFrame(nsIListControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsIListControlFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsISelectControlFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIListControlFrame>::FastQueryFrame<nsIListControlFrame, nsISelectControlFrame, void, void>::QueryFrame(nsIListControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIComboboxControlFrame>::FastQueryFrame<nsIComboboxControlFrame, nsIFrame, void, void>::QueryFrame(nsIComboboxControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsSVGDisplayableFrame>::FastQueryFrame<nsSVGDisplayableFrame, mozilla::SVGGeometryFrame, void, void>::QueryFrame(nsSVGDisplayableFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsSVGDisplayableFrame>::FastQueryFrame<nsSVGDisplayableFrame, nsIFrame, void, void>::QueryFrame(nsSVGDisplayableFrame*)
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, nsTextFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsNumberControlFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsMenuPopupFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsSubDocumentFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsPluginFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsTreeBodyFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsDateTimeControlFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsRangeFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsColorControlFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsVideoFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsTableWrapperFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsHTMLCanvasFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsSVGContainerFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsIFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsRubyTextContainerFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame>::FastQueryFrame<nsContainerFrame, nsDeckFrame, void, void>::QueryFrame(nsContainerFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, mozilla::SVGGeometryFrame, void, void>::QueryFrame(nsIFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFrame>::FastQueryFrame<nsIFrame, nsTextBoxFrame, 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<nsIScrollableFrame> do_QueryFrame<nsIScrollableFrame>(nsIScrollableFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsContainerFrame> do_QueryFrame<nsContainerFrame>(nsContainerFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIFormControlFrame> do_QueryFrame<nsIFormControlFrame>(nsIFormControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsISelectControlFrame> do_QueryFrame<nsISelectControlFrame>(nsISelectControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIListControlFrame> do_QueryFrame<nsIListControlFrame>(nsIListControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsIComboboxControlFrame> do_QueryFrame<nsIComboboxControlFrame>(nsIComboboxControlFrame*)
Unexecuted instantiation: do_QueryFrameHelper<nsSVGDisplayableFrame> do_QueryFrame<nsSVGDisplayableFrame>(nsSVGDisplayableFrame*)
148
149
#endif // nsQueryFrame_h