/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 |