/src/mozilla-central/layout/generic/nsIFrame.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 | | /* interface for all rendering objects */ |
8 | | |
9 | | #ifndef nsIFrame_h___ |
10 | | #define nsIFrame_h___ |
11 | | |
12 | | #ifndef MOZILLA_INTERNAL_API |
13 | | #error This header/class should only be used within Mozilla code. It should not be used by extensions. |
14 | | #endif |
15 | | |
16 | 0 | #define MAX_REFLOW_DEPTH 200 |
17 | | |
18 | | /* nsIFrame is in the process of being deCOMtaminated, i.e., this file is eventually |
19 | | going to be eliminated, and all callers will use nsFrame instead. At the moment |
20 | | we're midway through this process, so you will see inlined functions and member |
21 | | variables in this file. -dwh */ |
22 | | |
23 | | #include <algorithm> |
24 | | #include <stdio.h> |
25 | | |
26 | | #include "CaretAssociationHint.h" |
27 | | #include "FrameProperties.h" |
28 | | #include "LayoutConstants.h" |
29 | | #include "mozilla/layout/FrameChildList.h" |
30 | | #include "mozilla/Maybe.h" |
31 | | #include "mozilla/SmallPointerArray.h" |
32 | | #include "mozilla/WritingModes.h" |
33 | | #include "nsDirection.h" |
34 | | #include "nsFrameList.h" |
35 | | #include "nsFrameState.h" |
36 | | #include "mozilla/ReflowOutput.h" |
37 | | #include "nsITheme.h" |
38 | | #include "nsLayoutUtils.h" |
39 | | #include "nsQueryFrame.h" |
40 | | #include "nsString.h" |
41 | | #include "mozilla/ComputedStyle.h" |
42 | | #include "nsStyleStruct.h" |
43 | | #include "Visibility.h" |
44 | | #include "nsChangeHint.h" |
45 | | #include "mozilla/ComputedStyleInlines.h" |
46 | | #include "mozilla/gfx/CompositorHitTestInfo.h" |
47 | | #include "mozilla/gfx/MatrixFwd.h" |
48 | | #include "nsDisplayItemTypes.h" |
49 | | |
50 | | #ifdef ACCESSIBILITY |
51 | | #include "mozilla/a11y/AccTypes.h" |
52 | | #endif |
53 | | |
54 | | /** |
55 | | * New rules of reflow: |
56 | | * 1. you get a WillReflow() followed by a Reflow() followed by a DidReflow() in order |
57 | | * (no separate pass over the tree) |
58 | | * 2. it's the parent frame's responsibility to size/position the child's view (not |
59 | | * the child frame's responsibility as it is today) during reflow (and before |
60 | | * sending the DidReflow() notification) |
61 | | * 3. positioning of child frames (and their views) is done on the way down the tree, |
62 | | * and sizing of child frames (and their views) on the way back up |
63 | | * 4. if you move a frame (outside of the reflow process, or after reflowing it), |
64 | | * then you must make sure that its view (or its child frame's views) are re-positioned |
65 | | * as well. It's reasonable to not position the view until after all reflowing the |
66 | | * entire line, for example, but the frame should still be positioned and sized (and |
67 | | * the view sized) during the reflow (i.e., before sending the DidReflow() notification) |
68 | | * 5. the view system handles moving of widgets, i.e., it's not our problem |
69 | | */ |
70 | | |
71 | | class nsAtom; |
72 | | class nsPresContext; |
73 | | class nsIPresShell; |
74 | | class nsView; |
75 | | class nsIWidget; |
76 | | class nsISelectionController; |
77 | | class nsBoxLayoutState; |
78 | | class nsBoxLayout; |
79 | | class nsILineIterator; |
80 | | class nsDisplayItem; |
81 | | class nsDisplayListBuilder; |
82 | | class nsDisplayListSet; |
83 | | class nsDisplayList; |
84 | | class gfxSkipChars; |
85 | | class gfxSkipCharsIterator; |
86 | | class gfxContext; |
87 | | class nsLineList_iterator; |
88 | | class nsAbsoluteContainingBlock; |
89 | | class nsIContent; |
90 | | class nsContainerFrame; |
91 | | class nsPlaceholderFrame; |
92 | | class nsStyleChangeList; |
93 | | class nsWindowSizes; |
94 | | |
95 | | struct nsPeekOffsetStruct; |
96 | | struct nsPoint; |
97 | | struct nsRect; |
98 | | struct nsSize; |
99 | | struct nsMargin; |
100 | | struct CharacterDataChangeInfo; |
101 | | |
102 | | namespace mozilla { |
103 | | |
104 | | enum class CSSPseudoElementType : uint8_t; |
105 | | class EventStates; |
106 | | struct ReflowInput; |
107 | | class ReflowOutput; |
108 | | class ServoRestyleState; |
109 | | class DisplayItemData; |
110 | | class EffectSet; |
111 | | |
112 | | namespace layers { |
113 | | class Layer; |
114 | | class LayerManager; |
115 | | } // namespace layers |
116 | | |
117 | | namespace dom { |
118 | | class Selection; |
119 | | } // namespace dom |
120 | | |
121 | | } // namespace mozilla |
122 | | |
123 | | /** |
124 | | * Indication of how the frame can be split. This is used when doing runaround |
125 | | * of floats, and when pulling up child frames from a next-in-flow. |
126 | | * |
127 | | * The choices are splittable, not splittable at all, and splittable in |
128 | | * a non-rectangular fashion. This last type only applies to block-level |
129 | | * elements, and indicates whether splitting can be used when doing runaround. |
130 | | * If you can split across page boundaries, but you expect each continuing |
131 | | * frame to be the same width then return frSplittable and not |
132 | | * frSplittableNonRectangular. |
133 | | * |
134 | | * @see #GetSplittableType() |
135 | | */ |
136 | | typedef uint32_t nsSplittableType; |
137 | | |
138 | 0 | #define NS_FRAME_NOT_SPLITTABLE 0 // Note: not a bit! |
139 | 0 | #define NS_FRAME_SPLITTABLE 0x1 |
140 | 0 | #define NS_FRAME_SPLITTABLE_NON_RECTANGULAR 0x3 |
141 | | |
142 | | #define NS_FRAME_IS_SPLITTABLE(type)\ |
143 | | (0 != ((type) & NS_FRAME_SPLITTABLE)) |
144 | | |
145 | | #define NS_FRAME_IS_NOT_SPLITTABLE(type)\ |
146 | | (0 == ((type) & NS_FRAME_SPLITTABLE)) |
147 | | |
148 | | //---------------------------------------------------------------------- |
149 | | |
150 | | #define NS_SUBTREE_DIRTY(_frame) \ |
151 | 0 | (((_frame)->GetStateBits() & \ |
152 | 0 | (NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) != 0) |
153 | | |
154 | | // 1 million CSS pixels less than our max app unit measure. |
155 | | // For reflowing with an "infinite" available inline space per [css-sizing]. |
156 | | // (reflowing with an NS_UNCONSTRAINEDSIZE available inline size isn't allowed |
157 | | // and leads to assertions) |
158 | 0 | #define INFINITE_ISIZE_COORD nscoord(NS_MAXSIZE - (1000000*60)) |
159 | | |
160 | | //---------------------------------------------------------------------- |
161 | | |
162 | | namespace mozilla { |
163 | | |
164 | | enum class LayoutFrameType : uint8_t { |
165 | | #define FRAME_TYPE(ty_) ty_, |
166 | | #include "mozilla/FrameTypeList.h" |
167 | | #undef FRAME_TYPE |
168 | | }; |
169 | | |
170 | | } // namespace mozilla |
171 | | |
172 | | enum nsSelectionAmount { |
173 | | eSelectCharacter = 0, // a single Unicode character; |
174 | | // do not use this (prefer Cluster) unless you |
175 | | // are really sure it's what you want |
176 | | eSelectCluster = 1, // a grapheme cluster: this is usually the right |
177 | | // choice for movement or selection by "character" |
178 | | // as perceived by the user |
179 | | eSelectWord = 2, |
180 | | eSelectWordNoSpace = 3, // select a "word" without selecting the following |
181 | | // space, no matter what the default platform |
182 | | // behavior is |
183 | | eSelectLine = 4, // previous drawn line in flow. |
184 | | // NOTE that selection code depends on the ordering of the above values, |
185 | | // allowing simple <= tests to check categories of caret movement. |
186 | | // Don't rearrange without checking the usage in nsSelection.cpp! |
187 | | |
188 | | eSelectBeginLine = 5, |
189 | | eSelectEndLine = 6, |
190 | | eSelectNoAmount = 7, // just bounce back current offset. |
191 | | eSelectParagraph = 8 // select a "paragraph" |
192 | | }; |
193 | | |
194 | | enum nsSpread { |
195 | | eSpreadNone = 0, |
196 | | eSpreadAcross = 1, |
197 | | eSpreadDown = 2 |
198 | | }; |
199 | | |
200 | | // Carried out margin flags |
201 | | #define NS_CARRIED_TOP_MARGIN_IS_AUTO 0x1 |
202 | | #define NS_CARRIED_BOTTOM_MARGIN_IS_AUTO 0x2 |
203 | | |
204 | | //---------------------------------------------------------------------- |
205 | | // Reflow status returned by the Reflow() methods. |
206 | | class nsReflowStatus final { |
207 | | using StyleClear = mozilla::StyleClear; |
208 | | |
209 | | public: |
210 | | nsReflowStatus() |
211 | | : mBreakType(StyleClear::None) |
212 | | , mInlineBreak(InlineBreak::None) |
213 | | , mCompletion(Completion::FullyComplete) |
214 | | , mNextInFlowNeedsReflow(false) |
215 | | , mTruncated(false) |
216 | | , mFirstLetterComplete(false) |
217 | 0 | {} |
218 | | |
219 | | // Reset all the member variables. |
220 | 0 | void Reset() { |
221 | 0 | mBreakType = StyleClear::None; |
222 | 0 | mInlineBreak = InlineBreak::None; |
223 | 0 | mCompletion = Completion::FullyComplete; |
224 | 0 | mNextInFlowNeedsReflow = false; |
225 | 0 | mTruncated = false; |
226 | 0 | mFirstLetterComplete = false; |
227 | 0 | } |
228 | | |
229 | | // Return true if all member variables have their default values. |
230 | 0 | bool IsEmpty() const { |
231 | 0 | return (IsFullyComplete() && |
232 | 0 | !IsInlineBreak() && |
233 | 0 | !mNextInFlowNeedsReflow && |
234 | 0 | !mTruncated && |
235 | 0 | !mFirstLetterComplete); |
236 | 0 | } |
237 | | |
238 | | // There are three possible completion statuses, represented by |
239 | | // mCompletion. |
240 | | // |
241 | | // Incomplete means the frame does *not* map all its content, and the |
242 | | // parent frame should create a continuing frame. |
243 | | // |
244 | | // OverflowIncomplete means that the frame has an overflow that is not |
245 | | // complete, but its own box is complete. (This happens when the content |
246 | | // overflows a fixed-height box.) The reflower should place and size the |
247 | | // frame and continue its reflow, but it needs to create an overflow |
248 | | // container as a continuation for this frame. See "Overflow containers" |
249 | | // documentation in nsContainerFrame.h for more information. |
250 | | // |
251 | | // FullyComplete means the frame is neither Incomplete nor |
252 | | // OverflowIncomplete. This is the default state for a nsReflowStatus. |
253 | | // |
254 | | enum class Completion : uint8_t { |
255 | | // The order of the enum values is important, which represents the |
256 | | // precedence when merging. |
257 | | FullyComplete, |
258 | | OverflowIncomplete, |
259 | | Incomplete, |
260 | | }; |
261 | | |
262 | 0 | bool IsIncomplete() const { return mCompletion == Completion::Incomplete; } |
263 | 0 | bool IsOverflowIncomplete() const { |
264 | 0 | return mCompletion == Completion::OverflowIncomplete; |
265 | 0 | } |
266 | 0 | bool IsFullyComplete() const { |
267 | 0 | return mCompletion == Completion::FullyComplete; |
268 | 0 | } |
269 | | // Just for convenience; not a distinct state. |
270 | 0 | bool IsComplete() const { return !IsIncomplete(); } |
271 | | |
272 | 0 | void SetIncomplete() { |
273 | 0 | mCompletion = Completion::Incomplete; |
274 | 0 | } |
275 | 0 | void SetOverflowIncomplete() { |
276 | 0 | mCompletion = Completion::OverflowIncomplete; |
277 | 0 | } |
278 | | |
279 | | // mNextInFlowNeedsReflow bit flag means that the next-in-flow is dirty, |
280 | | // and also needs to be reflowed. This status only makes sense for a frame |
281 | | // that is not complete, i.e. you wouldn't set mNextInFlowNeedsReflow when |
282 | | // IsComplete() is true. |
283 | 0 | bool NextInFlowNeedsReflow() const { return mNextInFlowNeedsReflow; } |
284 | 0 | void SetNextInFlowNeedsReflow() { mNextInFlowNeedsReflow = true; } |
285 | | |
286 | | // mTruncated bit flag means that the part of the frame before the first |
287 | | // possible break point was unable to fit in the available space. |
288 | | // Therefore, the entire frame should be moved to the next continuation of |
289 | | // the parent frame. A frame that begins at the top of the page must never |
290 | | // be truncated. Doing so would likely cause an infinite loop. |
291 | 0 | bool IsTruncated() const { return mTruncated; } |
292 | | void UpdateTruncated(const mozilla::ReflowInput& aReflowInput, |
293 | | const mozilla::ReflowOutput& aMetrics); |
294 | | |
295 | | // Merge the frame completion status bits from aStatus into this. |
296 | | void MergeCompletionStatusFrom(const nsReflowStatus& aStatus) |
297 | 0 | { |
298 | 0 | if (mCompletion < aStatus.mCompletion) { |
299 | 0 | mCompletion = aStatus.mCompletion; |
300 | 0 | } |
301 | 0 |
|
302 | 0 | // These asserts ensure that the mCompletion merging works as we expect. |
303 | 0 | // (Incomplete beats OverflowIncomplete, which beats FullyComplete.) |
304 | 0 | static_assert(Completion::Incomplete > Completion::OverflowIncomplete && |
305 | 0 | Completion::OverflowIncomplete > Completion::FullyComplete, |
306 | 0 | "mCompletion merging won't work without this!"); |
307 | 0 |
|
308 | 0 | mNextInFlowNeedsReflow |= aStatus.mNextInFlowNeedsReflow; |
309 | 0 | mTruncated |= aStatus.mTruncated; |
310 | 0 | } |
311 | | |
312 | | // There are three possible inline-break statuses, represented by |
313 | | // mInlineBreak. |
314 | | // |
315 | | // "None" means no break is requested. |
316 | | // "Before" means the break should occur before the frame. |
317 | | // "After" means the break should occur after the frame. |
318 | | // (Here, "the frame" is the frame whose reflow results are being reported by |
319 | | // this nsReflowStatus.) |
320 | | // |
321 | | enum class InlineBreak : uint8_t { |
322 | | None, |
323 | | Before, |
324 | | After, |
325 | | }; |
326 | | |
327 | 0 | bool IsInlineBreak() const { return mInlineBreak != InlineBreak::None; } |
328 | 0 | bool IsInlineBreakBefore() const { |
329 | 0 | return mInlineBreak == InlineBreak::Before; |
330 | 0 | } |
331 | 0 | bool IsInlineBreakAfter() const { |
332 | 0 | return mInlineBreak == InlineBreak::After; |
333 | 0 | } |
334 | 0 | StyleClear BreakType() const { return mBreakType; } |
335 | | |
336 | | // Set the inline line-break-before status, and reset other bit flags. The |
337 | | // break type is StyleClear::Line. Note that other frame completion status |
338 | | // isn't expected to matter after calling this method. |
339 | 0 | void SetInlineLineBreakBeforeAndReset() { |
340 | 0 | Reset(); |
341 | 0 | mBreakType = StyleClear::Line; |
342 | 0 | mInlineBreak = InlineBreak::Before; |
343 | 0 | } |
344 | | |
345 | | // Set the inline line-break-after status. The break type can be changed |
346 | | // via the optional aBreakType param. |
347 | 0 | void SetInlineLineBreakAfter(StyleClear aBreakType = StyleClear::Line) { |
348 | 0 | MOZ_ASSERT(aBreakType != StyleClear::None, |
349 | 0 | "Break-after with StyleClear::None is meaningless!"); |
350 | 0 | mBreakType = aBreakType; |
351 | 0 | mInlineBreak = InlineBreak::After; |
352 | 0 | } |
353 | | |
354 | | // mFirstLetterComplete bit flag means the break was induced by |
355 | | // completion of a first-letter. |
356 | 0 | bool FirstLetterComplete() const { return mFirstLetterComplete; } |
357 | 0 | void SetFirstLetterComplete() { mFirstLetterComplete = true; } |
358 | | |
359 | | private: |
360 | | StyleClear mBreakType; |
361 | | InlineBreak mInlineBreak; |
362 | | Completion mCompletion; |
363 | | bool mNextInFlowNeedsReflow : 1; |
364 | | bool mTruncated : 1; |
365 | | bool mFirstLetterComplete : 1; |
366 | | }; |
367 | | |
368 | | #define NS_FRAME_SET_TRUNCATION(aStatus, aReflowInput, aMetrics) \ |
369 | 0 | aStatus.UpdateTruncated(aReflowInput, aMetrics); |
370 | | |
371 | | #ifdef DEBUG |
372 | | // Convert nsReflowStatus to a human-readable string. |
373 | | std::ostream& |
374 | | operator<<(std::ostream& aStream, const nsReflowStatus& aStatus); |
375 | | #endif |
376 | | |
377 | | //---------------------------------------------------------------------- |
378 | | |
379 | | /** |
380 | | * When there is no scrollable overflow rect, the visual overflow rect |
381 | | * may be stored as four 1-byte deltas each strictly LESS THAN 0xff, for |
382 | | * the four edges of the rectangle, or the four bytes may be read as a |
383 | | * single 32-bit "overflow-rect type" value including at least one 0xff |
384 | | * byte as an indicator that the value does NOT represent four deltas. |
385 | | * If all four deltas are zero, this means that no overflow rect has |
386 | | * actually been set (this is the initial state of newly-created frames). |
387 | | */ |
388 | 0 | #define NS_FRAME_OVERFLOW_DELTA_MAX 0xfe // max delta we can store |
389 | | |
390 | 0 | #define NS_FRAME_OVERFLOW_NONE 0x00000000 // there are no overflow rects; |
391 | | // code relies on this being |
392 | | // the all-zero value |
393 | | |
394 | 0 | #define NS_FRAME_OVERFLOW_LARGE 0x000000ff // overflow is stored as a |
395 | | // separate rect property |
396 | | |
397 | | /** |
398 | | * nsBidiLevel is the type of the level values in our Unicode Bidi |
399 | | * implementation. |
400 | | * It holds an embedding level and indicates the visual direction |
401 | | * by its bit 0 (even/odd value).<p> |
402 | | * |
403 | | * <li><code>aParaLevel</code> can be set to the |
404 | | * pseudo-level values <code>NSBIDI_DEFAULT_LTR</code> |
405 | | * and <code>NSBIDI_DEFAULT_RTL</code>.</li></ul> |
406 | | * |
407 | | * @see nsBidi::SetPara |
408 | | * |
409 | | * <p>The related constants are not real, valid level values. |
410 | | * <code>NSBIDI_DEFAULT_XXX</code> can be used to specify |
411 | | * a default for the paragraph level for |
412 | | * when the <code>SetPara</code> function |
413 | | * shall determine it but there is no |
414 | | * strongly typed character in the input.<p> |
415 | | * |
416 | | * Note that the value for <code>NSBIDI_DEFAULT_LTR</code> is even |
417 | | * and the one for <code>NSBIDI_DEFAULT_RTL</code> is odd, |
418 | | * just like with normal LTR and RTL level values - |
419 | | * these special values are designed that way. Also, the implementation |
420 | | * assumes that NSBIDI_MAX_EXPLICIT_LEVEL is odd. |
421 | | * |
422 | | * @see NSBIDI_DEFAULT_LTR |
423 | | * @see NSBIDI_DEFAULT_RTL |
424 | | * @see NSBIDI_LEVEL_OVERRIDE |
425 | | * @see NSBIDI_MAX_EXPLICIT_LEVEL |
426 | | */ |
427 | | typedef uint8_t nsBidiLevel; |
428 | | |
429 | | /** Paragraph level setting. |
430 | | * If there is no strong character, then set the paragraph level to 0 (left-to-right). |
431 | | */ |
432 | 0 | #define NSBIDI_DEFAULT_LTR 0xfe |
433 | | |
434 | | /** Paragraph level setting. |
435 | | * If there is no strong character, then set the paragraph level to 1 (right-to-left). |
436 | | */ |
437 | 0 | #define NSBIDI_DEFAULT_RTL 0xff |
438 | | |
439 | | /** |
440 | | * Maximum explicit embedding level. |
441 | | * (The maximum resolved level can be up to <code>NSBIDI_MAX_EXPLICIT_LEVEL+1</code>). |
442 | | * |
443 | | */ |
444 | | #define NSBIDI_MAX_EXPLICIT_LEVEL 125 |
445 | | |
446 | | /** Bit flag for level input. |
447 | | * Overrides directional properties. |
448 | | */ |
449 | | #define NSBIDI_LEVEL_OVERRIDE 0x80 |
450 | | |
451 | | /** |
452 | | * <code>nsBidiDirection</code> values indicate the text direction. |
453 | | */ |
454 | | enum nsBidiDirection { |
455 | | /** All left-to-right text This is a 0 value. */ |
456 | | NSBIDI_LTR, |
457 | | /** All right-to-left text This is a 1 value. */ |
458 | | NSBIDI_RTL, |
459 | | /** Mixed-directional text. */ |
460 | | NSBIDI_MIXED |
461 | | }; |
462 | | |
463 | | namespace mozilla { |
464 | | |
465 | | // https://drafts.csswg.org/css-align-3/#baseline-sharing-group |
466 | | enum BaselineSharingGroup |
467 | | { |
468 | | // NOTE Used as an array index so must be 0 and 1. |
469 | | eFirst = 0, |
470 | | eLast = 1, |
471 | | }; |
472 | | |
473 | | // Loosely: https://drafts.csswg.org/css-align-3/#shared-alignment-context |
474 | | enum class AlignmentContext |
475 | | { |
476 | | eInline, |
477 | | eTable, |
478 | | eFlexbox, |
479 | | eGrid, |
480 | | }; |
481 | | |
482 | | /* |
483 | | * For replaced elements only. Gets the intrinsic dimensions of this element. |
484 | | * The dimensions may only be one of the following two types: |
485 | | * |
486 | | * eStyleUnit_Coord - a length in app units |
487 | | * eStyleUnit_None - the element has no intrinsic size in this dimension |
488 | | */ |
489 | | struct IntrinsicSize { |
490 | | nsStyleCoord width, height; |
491 | | |
492 | | IntrinsicSize() |
493 | | : width(eStyleUnit_None), height(eStyleUnit_None) |
494 | 0 | {} |
495 | | IntrinsicSize(const IntrinsicSize& rhs) |
496 | | : width(rhs.width), height(rhs.height) |
497 | 0 | {} |
498 | 0 | IntrinsicSize& operator=(const IntrinsicSize& rhs) { |
499 | 0 | width = rhs.width; height = rhs.height; return *this; |
500 | 0 | } |
501 | 0 | bool operator==(const IntrinsicSize& rhs) { |
502 | 0 | return width == rhs.width && height == rhs.height; |
503 | 0 | } |
504 | 0 | bool operator!=(const IntrinsicSize& rhs) { |
505 | 0 | return !(*this == rhs); |
506 | 0 | } |
507 | | }; |
508 | | |
509 | | // Pseudo bidi embedding level indicating nonexistence. |
510 | | static const nsBidiLevel kBidiLevelNone = 0xff; |
511 | | |
512 | | struct FrameBidiData |
513 | | { |
514 | | nsBidiLevel baseLevel; |
515 | | nsBidiLevel embeddingLevel; |
516 | | // The embedding level of virtual bidi formatting character before |
517 | | // this frame if any. kBidiLevelNone is used to indicate nonexistence |
518 | | // or unnecessity of such virtual character. |
519 | | nsBidiLevel precedingControl; |
520 | | }; |
521 | | |
522 | | } // namespace mozilla |
523 | | |
524 | | /// Generic destructor for frame properties. Calls delete. |
525 | | template<typename T> |
526 | | static void DeleteValue(T* aPropertyValue) |
527 | 0 | { |
528 | 0 | delete aPropertyValue; |
529 | 0 | } Unexecuted instantiation: ImageContainer.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: ImageContainer.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: ImageContainer.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: ImageContainer.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: ImageContainer.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: PersistentBufferProvider.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: PersistentBufferProvider.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: PersistentBufferProvider.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: PersistentBufferProvider.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: PersistentBufferProvider.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: TextureClientX11.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: TextureClientX11.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: TextureClientX11.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: TextureClientX11.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: TextureClientX11.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: X11BasicCompositor.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: X11BasicCompositor.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: X11BasicCompositor.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: X11BasicCompositor.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: X11BasicCompositor.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: X11TextureSourceBasic.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: X11TextureSourceBasic.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: X11TextureSourceBasic.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: X11TextureSourceBasic.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: X11TextureSourceBasic.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: X11TextureHost.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: X11TextureHost.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: X11TextureHost.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: X11TextureHost.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: X11TextureHost.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: ShadowLayerUtilsX11.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: ShadowLayerUtilsX11.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: ShadowLayerUtilsX11.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: ShadowLayerUtilsX11.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: ShadowLayerUtilsX11.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: X11TextureSourceOGL.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: X11TextureSourceOGL.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: X11TextureSourceOGL.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: X11TextureSourceOGL.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: X11TextureSourceOGL.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: WebRenderTextureHost.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: WebRenderTextureHost.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: WebRenderTextureHost.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: WebRenderTextureHost.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: WebRenderTextureHost.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_gfx_layers10.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_gfx_layers10.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_gfx_layers10.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_gfx_layers10.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_gfx_layers10.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: DOMIntersectionObserver.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: DOMIntersectionObserver.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: DOMIntersectionObserver.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: DOMIntersectionObserver.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: DOMIntersectionObserver.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: nsFrameMessageManager.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: nsFrameMessageManager.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: nsFrameMessageManager.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: nsFrameMessageManager.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: nsFrameMessageManager.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_base0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_base0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_base0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_base0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_base0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_base1.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_base1.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_base1.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_base1.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_base1.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void DeleteValue<mozilla::ComputedGridTrackInfo>(mozilla::ComputedGridTrackInfo*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void DeleteValue<mozilla::ComputedGridLineInfo>(mozilla::ComputedGridLineInfo*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void DeleteValue<nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea> >(nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea>*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void DeleteValue<nsTArray<mozilla::css::GridNamedArea> >(nsTArray<mozilla::css::GridNamedArea>*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void DeleteValue<ComputedFlexContainerInfo>(ComputedFlexContainerInfo*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void DeleteValue<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver>*) Unexecuted instantiation: Unified_cpp_dom_base3.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_base3.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_base3.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_base3.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_base3.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_base5.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_base5.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_base5.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_base5.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_base5.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_base6.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_base6.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_base6.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_base6.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_base6.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_base9.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_base9.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_base9.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_base9.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_base9.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: RegisterBindings.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: RegisterBindings.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: RegisterBindings.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: RegisterBindings.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: RegisterBindings.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: UnifiedBindings11.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: UnifiedBindings11.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: UnifiedBindings11.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: UnifiedBindings11.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: UnifiedBindings11.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: UnifiedBindings16.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: UnifiedBindings16.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: UnifiedBindings16.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: UnifiedBindings16.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: UnifiedBindings16.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: UnifiedBindings18.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: UnifiedBindings18.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: UnifiedBindings18.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: UnifiedBindings18.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: UnifiedBindings18.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: UnifiedBindings19.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: UnifiedBindings19.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: UnifiedBindings19.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: UnifiedBindings19.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: UnifiedBindings19.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: UnifiedBindings22.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: UnifiedBindings22.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: UnifiedBindings22.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: UnifiedBindings22.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: UnifiedBindings22.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: UnifiedBindings23.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: UnifiedBindings23.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: UnifiedBindings23.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: UnifiedBindings23.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: UnifiedBindings23.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: UnifiedBindings5.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: UnifiedBindings5.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: UnifiedBindings5.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: UnifiedBindings5.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: UnifiedBindings5.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: UnifiedBindings6.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: UnifiedBindings6.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: UnifiedBindings6.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: UnifiedBindings6.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: UnifiedBindings6.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: UnifiedBindings6.cpp:void DeleteValue<mozilla::ComputedGridTrackInfo>(mozilla::ComputedGridTrackInfo*) Unexecuted instantiation: UnifiedBindings6.cpp:void DeleteValue<mozilla::ComputedGridLineInfo>(mozilla::ComputedGridLineInfo*) Unexecuted instantiation: UnifiedBindings6.cpp:void DeleteValue<nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea> >(nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea>*) Unexecuted instantiation: UnifiedBindings6.cpp:void DeleteValue<nsTArray<mozilla::css::GridNamedArea> >(nsTArray<mozilla::css::GridNamedArea>*) Unexecuted instantiation: UnifiedBindings7.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: UnifiedBindings7.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: UnifiedBindings7.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: UnifiedBindings7.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: UnifiedBindings7.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: UnifiedBindings8.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: UnifiedBindings8.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: UnifiedBindings8.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: UnifiedBindings8.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: UnifiedBindings8.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_bindings0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_bindings0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_bindings0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_bindings0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_bindings0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:void DeleteValue<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver>*) Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:void DeleteValue<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver>*) Unexecuted instantiation: Unified_cpp_dom_flex0.cpp:void DeleteValue<ComputedFlexContainerInfo>(ComputedFlexContainerInfo*) Unexecuted instantiation: Unified_cpp_dom_flex0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_flex0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_flex0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_flex0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_flex0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_grid0.cpp:void DeleteValue<nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea> >(nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea>*) Unexecuted instantiation: Unified_cpp_dom_grid0.cpp:void DeleteValue<nsTArray<mozilla::css::GridNamedArea> >(nsTArray<mozilla::css::GridNamedArea>*) Unexecuted instantiation: Unified_cpp_dom_grid0.cpp:void DeleteValue<mozilla::ComputedGridTrackInfo>(mozilla::ComputedGridTrackInfo*) Unexecuted instantiation: Unified_cpp_dom_grid0.cpp:void DeleteValue<mozilla::ComputedGridLineInfo>(mozilla::ComputedGridLineInfo*) Unexecuted instantiation: Unified_cpp_dom_grid0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_grid0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_grid0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_grid0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_grid0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: PluginDocument.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: PluginDocument.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: PluginDocument.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: PluginDocument.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: PluginDocument.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_html2.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_html2.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_html2.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_html2.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_html2.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_html2.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_dom_html2.cpp:void DeleteValue<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver>*) Unexecuted instantiation: Unified_cpp_dom_html2.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_dom_html2.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_dom_html3.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_html3.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_html3.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_html3.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_html3.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_media2.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_media2.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_media2.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_media2.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_media2.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_media5.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_media5.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_media5.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_media5.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_media5.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_media6.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_media6.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_media6.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_media6.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_media6.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_svg0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_svg0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_svg0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_svg0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_svg0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_svg1.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_svg1.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_svg1.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_svg1.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_svg1.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_svg2.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_svg2.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_svg2.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_svg2.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_svg2.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_svg2.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_dom_svg3.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_svg3.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_svg3.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_svg3.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_svg3.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_svg3.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_dom_svg3.cpp:void DeleteValue<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver>*) Unexecuted instantiation: Unified_cpp_dom_svg4.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_svg4.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_svg4.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_svg4.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_svg4.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_svg4.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_dom_svg6.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_svg6.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_svg6.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_svg6.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_svg6.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_svg6.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_dom_svg7.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_svg7.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_svg7.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_svg7.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_svg7.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_svg7.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_dom_svg7.cpp:void DeleteValue<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver>*) Unexecuted instantiation: Unified_cpp_dom_svg8.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_svg8.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_svg8.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_svg8.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_svg8.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_svg8.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: nsNPAPIPlugin.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: nsNPAPIPlugin.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: nsNPAPIPlugin.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: nsNPAPIPlugin.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: nsNPAPIPlugin.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: nsPluginHost.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: nsPluginHost.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: nsPluginHost.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: nsPluginHost.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: nsPluginHost.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_dom_xul0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_dom_xul0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_dom_xul0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_dom_xul0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_dom_xul0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: nsBaseDragService.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: nsBaseDragService.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: nsBaseDragService.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: nsBaseDragService.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: nsBaseDragService.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: nsBaseDragService.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: nsBaseDragService.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: nsBaseWidget.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: nsBaseWidget.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: nsBaseWidget.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: nsBaseWidget.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: nsBaseWidget.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: nsBaseWidget.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: nsBaseWidget.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_widget0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_widget0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_widget0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_widget0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_widget0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_widget0.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_widget0.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_widget1.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_widget1.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_widget1.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_widget1.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_widget1.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_style0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_style0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_style0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_style0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_style0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_style2.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_style2.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_style2.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_style2.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_style2.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: nsRefreshDriver.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: nsRefreshDriver.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: nsRefreshDriver.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: nsRefreshDriver.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: nsRefreshDriver.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: nsRefreshDriver.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: nsRefreshDriver.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_base0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_base0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_base0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_base0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_base0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_base0.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_base0.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_base0.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_layout_base0.cpp:void DeleteValue<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver>*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<RetainedDisplayListBuilder>(RetainedDisplayListBuilder*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<nsTArray<nsIFrame*> >(nsTArray<nsIFrame*>*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<ComputedFlexContainerInfo>(ComputedFlexContainerInfo*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<mozilla::ComputedGridTrackInfo>(mozilla::ComputedGridTrackInfo*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<mozilla::ComputedGridLineInfo>(mozilla::ComputedGridLineInfo*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea> >(nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea>*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<nsTArray<mozilla::css::GridNamedArea> >(nsTArray<mozilla::css::GridNamedArea>*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<mozilla::LogicalSize>(mozilla::LogicalSize*) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void DeleteValue<RetainedDisplayListData>(RetainedDisplayListData*) Unexecuted instantiation: nsPluginFrame.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: nsPluginFrame.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: nsPluginFrame.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: nsPluginFrame.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: nsPluginFrame.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: nsPluginFrame.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: nsPluginFrame.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_generic0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_generic0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_generic0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_generic0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_generic0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_generic0.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_generic0.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_generic0.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_layout_generic0.cpp:void DeleteValue<nsTArray<nsIFrame*> >(nsTArray<nsIFrame*>*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<mozilla::StickyScrollContainer>(mozilla::StickyScrollContainer*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<nsFlexContainerFrame::CachedMeasuringReflowResult>(nsFlexContainerFrame::CachedMeasuringReflowResult*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<ComputedFlexContainerInfo>(ComputedFlexContainerInfo*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<nsFontInflationData>(nsFontInflationData*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<nsAbsoluteContainingBlock>(nsAbsoluteContainingBlock*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<nsBoxLayoutMetrics>(nsBoxLayoutMetrics*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<mozilla::ComputedGridTrackInfo>(mozilla::ComputedGridTrackInfo*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<mozilla::ComputedGridLineInfo>(mozilla::ComputedGridLineInfo*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea> >(nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea>*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<nsTArray<mozilla::css::GridNamedArea> >(nsTArray<mozilla::css::GridNamedArea>*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<nsTArray<nsIFrame*> >(nsTArray<nsIFrame*>*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<mozilla::LogicalSize>(mozilla::LogicalSize*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver>*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<RetainedDisplayListData>(RetainedDisplayListData*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void DeleteValue<RetainedDisplayListBuilder>(RetainedDisplayListBuilder*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea> >(nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea>*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<mozilla::LogicalSize>(mozilla::LogicalSize*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<mozilla::ComputedGridTrackInfo>(mozilla::ComputedGridTrackInfo*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<mozilla::ComputedGridLineInfo>(mozilla::ComputedGridLineInfo*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<nsTArray<mozilla::css::GridNamedArea> >(nsTArray<mozilla::css::GridNamedArea>*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<nsGridContainerFrame::SharedGridData>(nsGridContainerFrame::SharedGridData*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<nsTArray<nsIFrame*> >(nsTArray<nsIFrame*>*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:void DeleteValue<ComputedFlexContainerInfo>(ComputedFlexContainerInfo*) Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:void DeleteValue<RetainedDisplayListBuilder>(RetainedDisplayListBuilder*) Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:void DeleteValue<TabWidthStore>(TabWidthStore*) Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:void DeleteValue<EmphasisMarkInfo>(EmphasisMarkInfo*) Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:void DeleteValue<RetainedDisplayListData>(RetainedDisplayListData*) Unexecuted instantiation: Unified_cpp_layout_forms1.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_forms1.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_forms1.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_forms1.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_forms1.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_forms1.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_forms1.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:void DeleteValue<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver>*) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:void DeleteValue<mozilla::TextNodeCorrespondence>(mozilla::TextNodeCorrespondence*) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:void DeleteValue<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver>*) Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:void DeleteValue<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver>*) Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_xul0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_xul0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_xul0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_xul0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_xul0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_xul0.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_xul0.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_xul1.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_xul1.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_xul1.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_xul1.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_xul1.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_xul1.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_xul1.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_xul_tree0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_xul_tree0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_xul_tree0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_xul_tree0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_xul_tree0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_xul_tree0.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_xul_tree0.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_xul_grid0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_xul_grid0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_xul_grid0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_xul_grid0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_xul_grid0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: VsyncParent.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: VsyncParent.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: VsyncParent.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: VsyncParent.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: VsyncParent.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_mathml0.cpp:void DeleteValue<mozilla::ReflowOutput>(mozilla::ReflowOutput*) Unexecuted instantiation: Unified_cpp_layout_mathml0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_mathml0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_mathml0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_mathml0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_mathml0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_mathml0.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_mathml0.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:void DeleteValue<nsTArray<signed char> >(nsTArray<signed char>*) Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:void DeleteValue<nsTArray<nsIFrame*> >(nsTArray<nsIFrame*>*) Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:void DeleteValue<mozilla::LogicalSize>(mozilla::LogicalSize*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void DeleteValue<mozilla::LayerActivity>(mozilla::LayerActivity*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void DeleteValue<RetainedDisplayListData>(RetainedDisplayListData*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void DeleteValue<RetainedDisplayListBuilder>(RetainedDisplayListBuilder*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void DeleteValue<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver>*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void DeleteValue<nsTArray<nsIFrame*> >(nsTArray<nsIFrame*>*) Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:void DeleteValue<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver>*) Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:void DeleteValue<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double>*) Unexecuted instantiation: Unified_cpp_docshell_base0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_docshell_base0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_docshell_base0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_docshell_base0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_docshell_base0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_accessible_html0.cpp:void DeleteValue<nsPoint>(nsPoint*) Unexecuted instantiation: Unified_cpp_accessible_html0.cpp:void DeleteValue<nsMargin>(nsMargin*) Unexecuted instantiation: Unified_cpp_accessible_html0.cpp:void DeleteValue<nsRect>(nsRect*) Unexecuted instantiation: Unified_cpp_accessible_html0.cpp:void DeleteValue<nsOverflowAreas>(nsOverflowAreas*) Unexecuted instantiation: Unified_cpp_accessible_html0.cpp:void DeleteValue<AutoTArray<nsDisplayItem*, 4ul> >(AutoTArray<nsDisplayItem*, 4ul>*) Unexecuted instantiation: Unified_cpp_accessible_html0.cpp:void DeleteValue<nsDisplayListBuilder::OutOfFlowDisplayData>(nsDisplayListBuilder::OutOfFlowDisplayData*) Unexecuted instantiation: Unified_cpp_accessible_html0.cpp:void DeleteValue<nsDisplayListBuilder::DisplayListBuildingData>(nsDisplayListBuilder::DisplayListBuildingData*) Unexecuted instantiation: Unified_cpp_accessible_html0.cpp:void DeleteValue<nsTArray<nsIFrame*> >(nsTArray<nsIFrame*>*) Unexecuted instantiation: Unified_cpp_accessible_html0.cpp:void DeleteValue<mozilla::LogicalSize>(mozilla::LogicalSize*) |
530 | | |
531 | | /// Generic destructor for frame properties. Calls Release(). |
532 | | template<typename T> |
533 | | static void ReleaseValue(T* aPropertyValue) |
534 | 0 | { |
535 | 0 | aPropertyValue->Release(); |
536 | 0 | } Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void ReleaseValue<mozilla::SVGTemplateElementObserver>(mozilla::SVGTemplateElementObserver*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void ReleaseValue<mozilla::SVGMaskObserverList>(mozilla::SVGMaskObserverList*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void ReleaseValue<mozilla::nsSVGPaintingProperty>(mozilla::nsSVGPaintingProperty*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void ReleaseValue<mozilla::SVGMarkerObserver>(mozilla::SVGMarkerObserver*) Unexecuted instantiation: Unified_cpp_dom_base2.cpp:void ReleaseValue<mozilla::SVGTextPathObserver>(mozilla::SVGTextPathObserver*) Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:void ReleaseValue<mozilla::SVGTemplateElementObserver>(mozilla::SVGTemplateElementObserver*) Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:void ReleaseValue<mozilla::SVGMaskObserverList>(mozilla::SVGMaskObserverList*) Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:void ReleaseValue<mozilla::nsSVGPaintingProperty>(mozilla::nsSVGPaintingProperty*) Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:void ReleaseValue<mozilla::SVGMarkerObserver>(mozilla::SVGMarkerObserver*) Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:void ReleaseValue<mozilla::SVGTextPathObserver>(mozilla::SVGTextPathObserver*) Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:void ReleaseValue<mozilla::SVGTemplateElementObserver>(mozilla::SVGTemplateElementObserver*) Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:void ReleaseValue<mozilla::SVGMaskObserverList>(mozilla::SVGMaskObserverList*) Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:void ReleaseValue<mozilla::nsSVGPaintingProperty>(mozilla::nsSVGPaintingProperty*) Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:void ReleaseValue<mozilla::SVGMarkerObserver>(mozilla::SVGMarkerObserver*) Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:void ReleaseValue<mozilla::SVGTextPathObserver>(mozilla::SVGTextPathObserver*) Unexecuted instantiation: Unified_cpp_dom_html2.cpp:void ReleaseValue<mozilla::SVGTemplateElementObserver>(mozilla::SVGTemplateElementObserver*) Unexecuted instantiation: Unified_cpp_dom_html2.cpp:void ReleaseValue<mozilla::SVGMaskObserverList>(mozilla::SVGMaskObserverList*) Unexecuted instantiation: Unified_cpp_dom_html2.cpp:void ReleaseValue<mozilla::nsSVGPaintingProperty>(mozilla::nsSVGPaintingProperty*) Unexecuted instantiation: Unified_cpp_dom_html2.cpp:void ReleaseValue<mozilla::SVGMarkerObserver>(mozilla::SVGMarkerObserver*) Unexecuted instantiation: Unified_cpp_dom_html2.cpp:void ReleaseValue<mozilla::SVGTextPathObserver>(mozilla::SVGTextPathObserver*) Unexecuted instantiation: Unified_cpp_dom_svg3.cpp:void ReleaseValue<mozilla::SVGTemplateElementObserver>(mozilla::SVGTemplateElementObserver*) Unexecuted instantiation: Unified_cpp_dom_svg3.cpp:void ReleaseValue<mozilla::SVGMaskObserverList>(mozilla::SVGMaskObserverList*) Unexecuted instantiation: Unified_cpp_dom_svg3.cpp:void ReleaseValue<mozilla::nsSVGPaintingProperty>(mozilla::nsSVGPaintingProperty*) Unexecuted instantiation: Unified_cpp_dom_svg3.cpp:void ReleaseValue<mozilla::SVGMarkerObserver>(mozilla::SVGMarkerObserver*) Unexecuted instantiation: Unified_cpp_dom_svg3.cpp:void ReleaseValue<mozilla::SVGTextPathObserver>(mozilla::SVGTextPathObserver*) Unexecuted instantiation: Unified_cpp_dom_svg7.cpp:void ReleaseValue<mozilla::SVGTemplateElementObserver>(mozilla::SVGTemplateElementObserver*) Unexecuted instantiation: Unified_cpp_dom_svg7.cpp:void ReleaseValue<mozilla::SVGMaskObserverList>(mozilla::SVGMaskObserverList*) Unexecuted instantiation: Unified_cpp_dom_svg7.cpp:void ReleaseValue<mozilla::nsSVGPaintingProperty>(mozilla::nsSVGPaintingProperty*) Unexecuted instantiation: Unified_cpp_dom_svg7.cpp:void ReleaseValue<mozilla::SVGMarkerObserver>(mozilla::SVGMarkerObserver*) Unexecuted instantiation: Unified_cpp_dom_svg7.cpp:void ReleaseValue<mozilla::SVGTextPathObserver>(mozilla::SVGTextPathObserver*) Unexecuted instantiation: Unified_cpp_layout_base0.cpp:void ReleaseValue<mozilla::SVGTemplateElementObserver>(mozilla::SVGTemplateElementObserver*) Unexecuted instantiation: Unified_cpp_layout_base0.cpp:void ReleaseValue<mozilla::SVGMaskObserverList>(mozilla::SVGMaskObserverList*) Unexecuted instantiation: Unified_cpp_layout_base0.cpp:void ReleaseValue<mozilla::nsSVGPaintingProperty>(mozilla::nsSVGPaintingProperty*) Unexecuted instantiation: Unified_cpp_layout_base0.cpp:void ReleaseValue<mozilla::SVGMarkerObserver>(mozilla::SVGMarkerObserver*) Unexecuted instantiation: Unified_cpp_layout_base0.cpp:void ReleaseValue<mozilla::SVGTextPathObserver>(mozilla::SVGTextPathObserver*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void ReleaseValue<mozilla::SVGTemplateElementObserver>(mozilla::SVGTemplateElementObserver*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void ReleaseValue<mozilla::SVGMaskObserverList>(mozilla::SVGMaskObserverList*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void ReleaseValue<mozilla::nsSVGPaintingProperty>(mozilla::nsSVGPaintingProperty*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void ReleaseValue<mozilla::SVGMarkerObserver>(mozilla::SVGMarkerObserver*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:void ReleaseValue<mozilla::SVGTextPathObserver>(mozilla::SVGTextPathObserver*) Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:void ReleaseValue<gfxTextRun>(gfxTextRun*) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:void ReleaseValue<mozilla::SVGMarkerObserver>(mozilla::SVGMarkerObserver*) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:void ReleaseValue<mozilla::SVGTextPathObserver>(mozilla::SVGTextPathObserver*) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:void ReleaseValue<mozilla::nsSVGPaintingProperty>(mozilla::nsSVGPaintingProperty*) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:void ReleaseValue<mozilla::SVGMaskObserverList>(mozilla::SVGMaskObserverList*) Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:void ReleaseValue<mozilla::SVGTemplateElementObserver>(mozilla::SVGTemplateElementObserver*) Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:void ReleaseValue<mozilla::SVGTemplateElementObserver>(mozilla::SVGTemplateElementObserver*) Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:void ReleaseValue<mozilla::SVGMaskObserverList>(mozilla::SVGMaskObserverList*) Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:void ReleaseValue<mozilla::nsSVGPaintingProperty>(mozilla::nsSVGPaintingProperty*) Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:void ReleaseValue<mozilla::SVGMarkerObserver>(mozilla::SVGMarkerObserver*) Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:void ReleaseValue<mozilla::SVGTextPathObserver>(mozilla::SVGTextPathObserver*) Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:void ReleaseValue<mozilla::SVGTemplateElementObserver>(mozilla::SVGTemplateElementObserver*) Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:void ReleaseValue<mozilla::SVGMaskObserverList>(mozilla::SVGMaskObserverList*) Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:void ReleaseValue<mozilla::nsSVGPaintingProperty>(mozilla::nsSVGPaintingProperty*) Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:void ReleaseValue<mozilla::SVGMarkerObserver>(mozilla::SVGMarkerObserver*) Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:void ReleaseValue<mozilla::SVGTextPathObserver>(mozilla::SVGTextPathObserver*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void ReleaseValue<mozilla::SVGTemplateElementObserver>(mozilla::SVGTemplateElementObserver*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void ReleaseValue<mozilla::SVGMaskObserverList>(mozilla::SVGMaskObserverList*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void ReleaseValue<mozilla::nsSVGPaintingProperty>(mozilla::nsSVGPaintingProperty*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void ReleaseValue<mozilla::SVGMarkerObserver>(mozilla::SVGMarkerObserver*) Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:void ReleaseValue<mozilla::SVGTextPathObserver>(mozilla::SVGTextPathObserver*) Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:void ReleaseValue<mozilla::SVGTemplateElementObserver>(mozilla::SVGTemplateElementObserver*) Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:void ReleaseValue<mozilla::SVGMaskObserverList>(mozilla::SVGMaskObserverList*) Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:void ReleaseValue<mozilla::nsSVGPaintingProperty>(mozilla::nsSVGPaintingProperty*) Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:void ReleaseValue<mozilla::SVGMarkerObserver>(mozilla::SVGMarkerObserver*) Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:void ReleaseValue<mozilla::SVGTextPathObserver>(mozilla::SVGTextPathObserver*) |
537 | | |
538 | | //---------------------------------------------------------------------- |
539 | | |
540 | | /** |
541 | | * A frame in the layout model. This interface is supported by all frame |
542 | | * objects. |
543 | | * |
544 | | * Frames can have multiple child lists: the default child list |
545 | | * (referred to as the <i>principal</i> child list, and additional named |
546 | | * child lists. There is an ordering of frames within a child list, but |
547 | | * there is no order defined between frames in different child lists of |
548 | | * the same parent frame. |
549 | | * |
550 | | * Frames are NOT reference counted. Use the Destroy() member function |
551 | | * to destroy a frame. The lifetime of the frame hierarchy is bounded by the |
552 | | * lifetime of the presentation shell which owns the frames. |
553 | | * |
554 | | * nsIFrame is a private Gecko interface. If you are not Gecko then you |
555 | | * should not use it. If you're not in layout, then you won't be able to |
556 | | * link to many of the functions defined here. Too bad. |
557 | | * |
558 | | * If you're not in layout but you must call functions in here, at least |
559 | | * restrict yourself to calling virtual methods, which won't hurt you as badly. |
560 | | */ |
561 | | class nsIFrame : public nsQueryFrame |
562 | | { |
563 | | public: |
564 | | using AlignmentContext = mozilla::AlignmentContext; |
565 | | using BaselineSharingGroup = mozilla::BaselineSharingGroup; |
566 | | template <typename T> using Maybe = mozilla::Maybe<T>; |
567 | | using Nothing = mozilla::Nothing; |
568 | | using OnNonvisible = mozilla::OnNonvisible; |
569 | | template<typename T=void> |
570 | | using PropertyDescriptor = const mozilla::FramePropertyDescriptor<T>*; |
571 | | using ReflowInput = mozilla::ReflowInput; |
572 | | using ReflowOutput = mozilla::ReflowOutput; |
573 | | using Visibility = mozilla::Visibility; |
574 | | |
575 | | typedef mozilla::ComputedStyle ComputedStyle; |
576 | | typedef mozilla::FrameProperties FrameProperties; |
577 | | typedef mozilla::layers::Layer Layer; |
578 | | typedef mozilla::layers::LayerManager LayerManager; |
579 | | typedef mozilla::layout::FrameChildList ChildList; |
580 | | typedef mozilla::layout::FrameChildListID ChildListID; |
581 | | typedef mozilla::layout::FrameChildListIDs ChildListIDs; |
582 | | typedef mozilla::layout::FrameChildListIterator ChildListIterator; |
583 | | typedef mozilla::layout::FrameChildListArrayIterator ChildListArrayIterator; |
584 | | typedef mozilla::gfx::DrawTarget DrawTarget; |
585 | | typedef mozilla::gfx::Matrix Matrix; |
586 | | typedef mozilla::gfx::Matrix4x4 Matrix4x4; |
587 | | typedef mozilla::gfx::Matrix4x4Flagged Matrix4x4Flagged; |
588 | | typedef mozilla::Sides Sides; |
589 | | typedef mozilla::LogicalSides LogicalSides; |
590 | | typedef mozilla::SmallPointerArray<mozilla::DisplayItemData> DisplayItemDataArray; |
591 | | typedef nsQueryFrame::ClassID ClassID; |
592 | | |
593 | | NS_DECL_QUERYFRAME_TARGET(nsIFrame) |
594 | | |
595 | | explicit nsIFrame(ClassID aID) |
596 | | : mRect() |
597 | | , mContent(nullptr) |
598 | | , mComputedStyle(nullptr) |
599 | | , mParent(nullptr) |
600 | | , mNextSibling(nullptr) |
601 | | , mPrevSibling(nullptr) |
602 | | , mState(NS_FRAME_FIRST_REFLOW | NS_FRAME_IS_DIRTY) |
603 | | , mClass(aID) |
604 | | , mMayHaveRoundedCorners(false) |
605 | | , mHasImageRequest(false) |
606 | | , mHasFirstLetterChild(false) |
607 | | , mParentIsWrapperAnonBox(false) |
608 | | , mIsWrapperBoxNeedingRestyle(false) |
609 | | , mReflowRequestedForCharDataChange(false) |
610 | | , mForceDescendIntoIfVisible(false) |
611 | | , mBuiltDisplayList(false) |
612 | | , mFrameIsModified(false) |
613 | | , mHasOverrideDirtyRegion(false) |
614 | | , mMayHaveWillChangeBudget(false) |
615 | | , mIsPrimaryFrame(false) |
616 | | , mMayHaveTransformAnimation(false) |
617 | | , mMayHaveOpacityAnimation(false) |
618 | | , mAllDescendantsAreInvisible(false) |
619 | 0 | { |
620 | 0 | mozilla::PodZero(&mOverflow); |
621 | 0 | } |
622 | | |
623 | | nsPresContext* PresContext() const { |
624 | | return Style()->PresContextForFrame(); |
625 | | } |
626 | | |
627 | | nsIPresShell* PresShell() const { |
628 | | return PresContext()->PresShell(); |
629 | | } |
630 | | |
631 | | /** |
632 | | * Called to initialize the frame. This is called immediately after creating |
633 | | * the frame. |
634 | | * |
635 | | * If the frame is a continuing frame, then aPrevInFlow indicates the previous |
636 | | * frame (the frame that was split). |
637 | | * |
638 | | * Each subclass that need a view should override this method and call |
639 | | * CreateView() after calling its base class Init(). |
640 | | * |
641 | | * @param aContent the content object associated with the frame |
642 | | * @param aParent the parent frame |
643 | | * @param aPrevInFlow the prev-in-flow frame |
644 | | */ |
645 | | virtual void Init(nsIContent* aContent, |
646 | | nsContainerFrame* aParent, |
647 | | nsIFrame* aPrevInFlow) = 0; |
648 | | |
649 | | using PostDestroyData = mozilla::layout::PostFrameDestroyData; |
650 | | struct MOZ_RAII AutoPostDestroyData |
651 | | { |
652 | | explicit AutoPostDestroyData(nsPresContext* aPresContext) |
653 | 0 | : mPresContext(aPresContext) {} |
654 | 0 | ~AutoPostDestroyData() { |
655 | 0 | for (auto& content : mozilla::Reversed(mData.mAnonymousContent)) { |
656 | 0 | nsIFrame::DestroyAnonymousContent(mPresContext, content.forget()); |
657 | 0 | } |
658 | 0 | } |
659 | | nsPresContext* mPresContext; |
660 | | PostDestroyData mData; |
661 | | }; |
662 | | /** |
663 | | * Destroys this frame and each of its child frames (recursively calls |
664 | | * Destroy() for each child). If this frame is a first-continuation, this |
665 | | * also removes the frame from the primary frame map and clears undisplayed |
666 | | * content for its content node. |
667 | | * If the frame is a placeholder, it also ensures the out-of-flow frame's |
668 | | * removal and destruction. |
669 | | */ |
670 | 0 | void Destroy() { |
671 | 0 | AutoPostDestroyData data(PresContext()); |
672 | 0 | DestroyFrom(this, data.mData); |
673 | 0 | // Note that |this| is deleted at this point. |
674 | 0 | } |
675 | | |
676 | | /** Flags for PeekOffsetCharacter, PeekOffsetNoAmount, PeekOffsetWord return values. |
677 | | */ |
678 | | enum FrameSearchResult { |
679 | | // Peek found a appropriate offset within frame. |
680 | | FOUND = 0x00, |
681 | | // try next frame for offset. |
682 | | CONTINUE = 0x1, |
683 | | // offset not found because the frame was empty of text. |
684 | | CONTINUE_EMPTY = 0x2 | CONTINUE, |
685 | | // offset not found because the frame didn't contain any text that could be selected. |
686 | | CONTINUE_UNSELECTABLE = 0x4 | CONTINUE, |
687 | | }; |
688 | | |
689 | | /** |
690 | | * Options for PeekOffsetCharacter(). |
691 | | */ |
692 | | struct MOZ_STACK_CLASS PeekOffsetCharacterOptions |
693 | | { |
694 | | // Whether to restrict result to valid cursor locations (between grapheme |
695 | | // clusters) - if this is included, maintains "normal" behavior, otherwise, |
696 | | // used for selection by "code unit" (instead of "character") |
697 | | bool mRespectClusters; |
698 | | // Whether to check user-select style value - if this is included, checks |
699 | | // if user-select is all, then, it may return CONTINUE_UNSELECTABLE. |
700 | | bool mIgnoreUserStyleAll; |
701 | | |
702 | | PeekOffsetCharacterOptions() |
703 | | : mRespectClusters(true) |
704 | | , mIgnoreUserStyleAll(false) |
705 | | { |
706 | | } |
707 | | }; |
708 | | |
709 | | protected: |
710 | | friend class nsBlockFrame; // for access to DestroyFrom |
711 | | |
712 | | /** |
713 | | * Return true if the frame is part of a Selection. |
714 | | * Helper method to implement the public IsSelected() API. |
715 | | */ |
716 | | virtual bool IsFrameSelected() const; |
717 | | |
718 | | /** |
719 | | * Implements Destroy(). Do not call this directly except from within a |
720 | | * DestroyFrom() implementation. |
721 | | * |
722 | | * @note This will always be called, so it is not necessary to override |
723 | | * Destroy() in subclasses of nsFrame, just DestroyFrom(). |
724 | | * |
725 | | * @param aDestructRoot is the root of the subtree being destroyed |
726 | | */ |
727 | | virtual void DestroyFrom(nsIFrame* aDestructRoot, PostDestroyData& aPostDestroyData) = 0; |
728 | | friend class nsFrameList; // needed to pass aDestructRoot through to children |
729 | | friend class nsLineBox; // needed to pass aDestructRoot through to children |
730 | | friend class nsContainerFrame; // needed to pass aDestructRoot through to children |
731 | | friend class nsFrame; // need to assign mParent |
732 | | template<class Source> friend class do_QueryFrameHelper; // to read mClass |
733 | | public: |
734 | | |
735 | | /** |
736 | | * Get the content object associated with this frame. Does not add a reference. |
737 | | */ |
738 | | nsIContent* GetContent() const { return mContent; } |
739 | | |
740 | | /** |
741 | | * Get the frame that should be the parent for the frames of child elements |
742 | | * May return nullptr during reflow |
743 | | */ |
744 | 0 | virtual nsContainerFrame* GetContentInsertionFrame() { return nullptr; } |
745 | | |
746 | | /** |
747 | | * Move any frames on our overflow list to the end of our principal list. |
748 | | * @return true if there were any overflow frames |
749 | | */ |
750 | 0 | virtual bool DrainSelfOverflowList() { return false; } |
751 | | |
752 | | /** |
753 | | * Get the frame that should be scrolled if the content associated |
754 | | * with this frame is targeted for scrolling. For frames implementing |
755 | | * nsIScrollableFrame this will return the frame itself. For frames |
756 | | * like nsTextControlFrame that contain a scrollframe, will return |
757 | | * that scrollframe. |
758 | | */ |
759 | 0 | virtual nsIScrollableFrame* GetScrollTargetFrame() { return nullptr; } |
760 | | |
761 | | /** |
762 | | * Get the offsets of the frame. most will be 0,0 |
763 | | * |
764 | | */ |
765 | | virtual nsresult GetOffsets(int32_t &start, int32_t &end) const = 0; |
766 | | |
767 | | /** |
768 | | * Reset the offsets when splitting frames during Bidi reordering |
769 | | * |
770 | | */ |
771 | 0 | virtual void AdjustOffsetsForBidi(int32_t aStart, int32_t aEnd) {} |
772 | | |
773 | | /** |
774 | | * Get the style associated with this frame. |
775 | | */ |
776 | | ComputedStyle* Style() const { return mComputedStyle; } |
777 | | void SetComputedStyle(ComputedStyle* aStyle) |
778 | 0 | { |
779 | 0 | if (aStyle != mComputedStyle) { |
780 | 0 | MOZ_DIAGNOSTIC_ASSERT(PresShell() == aStyle->PresContextForFrame()->PresShell()); |
781 | 0 | RefPtr<ComputedStyle> oldComputedStyle = mComputedStyle.forget(); |
782 | 0 | mComputedStyle = aStyle; |
783 | 0 | DidSetComputedStyle(oldComputedStyle); |
784 | 0 | } |
785 | 0 | } |
786 | | |
787 | | /** |
788 | | * SetComputedStyleWithoutNotification is for changes to the style |
789 | | * context that should suppress style change processing, in other |
790 | | * words, those that aren't really changes. This generally means only |
791 | | * changes that happen during frame construction. |
792 | | */ |
793 | | void SetComputedStyleWithoutNotification(ComputedStyle* aStyle) |
794 | 0 | { |
795 | 0 | if (aStyle != mComputedStyle) { |
796 | 0 | MOZ_DIAGNOSTIC_ASSERT(PresShell() == aStyle->PresContextForFrame()->PresShell()); |
797 | 0 | mComputedStyle = aStyle; |
798 | 0 | } |
799 | 0 | } |
800 | | |
801 | | // Style post processing hook |
802 | | // Attention: the old style is the one we're forgetting, |
803 | | // and hence possibly completely bogus for GetStyle* purposes. |
804 | | // Use PeekStyleData instead. |
805 | | virtual void DidSetComputedStyle(ComputedStyle* aOldComputedStyle) = 0; |
806 | | |
807 | | /** |
808 | | * Define typesafe getter functions for each style struct by |
809 | | * preprocessing the list of style structs. These functions are the |
810 | | * preferred way to get style data. The macro creates functions like: |
811 | | * const nsStyleBorder* StyleBorder(); |
812 | | * const nsStyleColor* StyleColor(); |
813 | | * |
814 | | * Callers outside of libxul should use nsIDOMWindow::GetComputedStyle() |
815 | | * instead of these accessors. |
816 | | * |
817 | | * Callers can use Style*WithOptionalParam if they're in a function that |
818 | | * accepts an *optional* pointer the style struct. |
819 | | */ |
820 | | #define STYLE_STRUCT(name_) \ |
821 | 0 | const nsStyle##name_ * Style##name_ () const MOZ_NONNULL_RETURN { \ |
822 | 0 | NS_ASSERTION(mComputedStyle, "No style found!"); \ |
823 | 0 | return mComputedStyle->Style##name_ (); \ |
824 | 0 | } \ Unexecuted instantiation: nsIFrame::StyleColor() const Unexecuted instantiation: nsIFrame::StyleList() const Unexecuted instantiation: nsIFrame::StyleTableBorder() const Unexecuted instantiation: nsIFrame::StyleSVG() const Unexecuted instantiation: nsIFrame::StyleBackground() const Unexecuted instantiation: nsIFrame::StyleTextReset() const Unexecuted instantiation: nsIFrame::StyleContent() const Unexecuted instantiation: nsIFrame::StyleMargin() const Unexecuted instantiation: nsIFrame::StylePadding() const Unexecuted instantiation: nsIFrame::StyleOutline() const Unexecuted instantiation: nsIFrame::StyleXUL() const Unexecuted instantiation: nsIFrame::StyleSVGReset() const Unexecuted instantiation: nsIFrame::StyleColumn() const Unexecuted instantiation: nsIFrame::StyleEffects() const |
825 | | const nsStyle##name_ * Style##name_##WithOptionalParam( \ |
826 | | const nsStyle##name_ * aStyleStruct) const MOZ_NONNULL_RETURN { \ |
827 | | if (aStyleStruct) { \ |
828 | | MOZ_ASSERT(aStyleStruct == Style##name_()); \ |
829 | | return aStyleStruct; \ |
830 | | } \ |
831 | | return Style##name_(); \ |
832 | | } |
833 | | #include "nsStyleStructList.h" |
834 | | #undef STYLE_STRUCT |
835 | | |
836 | | /** Also forward GetVisitedDependentColor to the style */ |
837 | | template<typename T, typename S> |
838 | | nscolor GetVisitedDependentColor(T S::* aField) |
839 | 0 | { return mComputedStyle->GetVisitedDependentColor(aField); } Unexecuted instantiation: unsigned int nsIFrame::GetVisitedDependentColor<mozilla::StyleComplexColor, nsStyleBackground>(mozilla::StyleComplexColor nsStyleBackground::*) Unexecuted instantiation: unsigned int nsIFrame::GetVisitedDependentColor<mozilla::StyleComplexColor, nsStyleText>(mozilla::StyleComplexColor nsStyleText::*) Unexecuted instantiation: unsigned int nsIFrame::GetVisitedDependentColor<unsigned int, nsStyleColor>(unsigned int nsStyleColor::*) Unexecuted instantiation: unsigned int nsIFrame::GetVisitedDependentColor<mozilla::StyleComplexColor, nsStyleColumn>(mozilla::StyleComplexColor nsStyleColumn::*) Unexecuted instantiation: unsigned int nsIFrame::GetVisitedDependentColor<mozilla::StyleComplexColor, nsStyleUI>(mozilla::StyleComplexColor nsStyleUI::*) Unexecuted instantiation: unsigned int nsIFrame::GetVisitedDependentColor<nsStyleSVGPaint, nsStyleSVG>(nsStyleSVGPaint nsStyleSVG::*) Unexecuted instantiation: unsigned int nsIFrame::GetVisitedDependentColor<mozilla::StyleComplexColor, nsStyleTextReset>(mozilla::StyleComplexColor nsStyleTextReset::*) |
840 | | |
841 | | /** |
842 | | * These methods are to access any additional ComputedStyles that |
843 | | * the frame may be holding. |
844 | | * |
845 | | * These are styles that are children of the frame's primary style and are NOT |
846 | | * used as styles for any child frames. |
847 | | * |
848 | | * These contexts also MUST NOT have any child styles whatsoever. If you need |
849 | | * to insert styles into the style tree, then you should create pseudo element |
850 | | * frames to own them. |
851 | | * |
852 | | * The indicies must be consecutive and implementations MUST return null if |
853 | | * asked for an index that is out of range. |
854 | | */ |
855 | | virtual ComputedStyle* GetAdditionalComputedStyle(int32_t aIndex) const = 0; |
856 | | |
857 | | virtual void SetAdditionalComputedStyle(int32_t aIndex, |
858 | | ComputedStyle* aComputedStyle) = 0; |
859 | | |
860 | | already_AddRefed<ComputedStyle> ComputeSelectionStyle() const; |
861 | | |
862 | | /** |
863 | | * Accessor functions for geometric parent. |
864 | | */ |
865 | | nsContainerFrame* GetParent() const { return mParent; } |
866 | | |
867 | | /** |
868 | | * Gets the parent of a frame, using the parent of the placeholder for |
869 | | * out-of-flow frames. |
870 | | */ |
871 | | inline nsContainerFrame* GetInFlowParent() const; |
872 | | |
873 | | /** |
874 | | * Gets the primary frame of the closest flattened tree ancestor that has a |
875 | | * frame (flattened tree ancestors may not have frames in presence of display: |
876 | | * contents). |
877 | | */ |
878 | | inline nsIFrame* GetClosestFlattenedTreeAncestorPrimaryFrame() const; |
879 | | |
880 | | /** |
881 | | * Return the placeholder for this frame (which must be out-of-flow). |
882 | | * @note this will only return non-null if |this| is the first-in-flow |
883 | | * although we don't assert that here for legacy reasons. |
884 | | */ |
885 | 0 | inline nsPlaceholderFrame* GetPlaceholderFrame() const { |
886 | 0 | MOZ_ASSERT(HasAnyStateBits(NS_FRAME_OUT_OF_FLOW)); |
887 | 0 | return GetProperty(PlaceholderFrameProperty()); |
888 | 0 | } |
889 | | |
890 | | /** |
891 | | * Set this frame's parent to aParent. |
892 | | * If the frame may have moved into or out of a scrollframe's |
893 | | * frame subtree, StickyScrollContainer::NotifyReparentedFrameAcrossScrollFrameBoundary |
894 | | * must also be called. |
895 | | */ |
896 | | void SetParent(nsContainerFrame* aParent); |
897 | | |
898 | | /** |
899 | | * The frame's writing-mode, used for logical layout computations. |
900 | | * It's usually the 'writing-mode' computed value, but there are exceptions: |
901 | | * * inner table frames copy the value from the table frame |
902 | | * (@see nsTableRowGroupFrame::Init, nsTableRowFrame::Init etc) |
903 | | * * the root element frame propagates its value to its ancestors |
904 | | * (@see nsCanvasFrame::MaybePropagateRootElementWritingMode) |
905 | | * * a scrolled frame propagates its value to its ancestor scroll frame |
906 | | * (@see nsHTMLScrollFrame::ReloadChildFrames) |
907 | | */ |
908 | | mozilla::WritingMode GetWritingMode() const { return mWritingMode; } |
909 | | |
910 | | /** |
911 | | * Construct a writing mode for line layout in this frame. This is |
912 | | * the writing mode of this frame, except that if this frame is styled with |
913 | | * unicode-bidi:plaintext, we reset the direction to the resolved paragraph |
914 | | * level of the given subframe (typically the first frame on the line), |
915 | | * because the container frame could be split by hard line breaks into |
916 | | * multiple paragraphs with different base direction. |
917 | | * @param aSelfWM the WM of 'this' |
918 | | */ |
919 | | mozilla::WritingMode WritingModeForLine(mozilla::WritingMode aSelfWM, |
920 | | nsIFrame* aSubFrame) const; |
921 | | |
922 | | /** |
923 | | * Bounding rect of the frame. |
924 | | * |
925 | | * For frames that are laid out according to CSS box model rules the values |
926 | | * are in app units, and the origin is relative to the upper-left of the |
927 | | * geometric parent. The size includes the content area, borders, and |
928 | | * padding. |
929 | | * |
930 | | * Frames that are laid out according to SVG's coordinate space based rules |
931 | | * (frames with the NS_FRAME_SVG_LAYOUT bit set, which *excludes* |
932 | | * nsSVGOuterSVGFrame) are different. Many frames of this type do not set or |
933 | | * use mRect, in which case the frame rect is undefined. The exceptions are: |
934 | | * |
935 | | * - nsSVGInnerSVGFrame |
936 | | * - SVGGeometryFrame (used for <path>, <circle>, etc.) |
937 | | * - nsSVGImageFrame |
938 | | * - nsSVGForeignObjectFrame |
939 | | * |
940 | | * For these frames the frame rect contains the frame's element's userspace |
941 | | * bounds including fill, stroke and markers, but converted to app units |
942 | | * rather than being in user units (CSS px). In the SVG code "userspace" is |
943 | | * defined to be the coordinate system for the attributes that define an |
944 | | * element's geometry (such as the 'cx' attribute for <circle>). For more |
945 | | * precise details see these frames' implementations of the ReflowSVG method |
946 | | * where mRect is set. |
947 | | * |
948 | | * Note: moving or sizing the frame does not affect the view's size or |
949 | | * position. |
950 | | */ |
951 | | nsRect GetRect() const { return mRect; } |
952 | | nsPoint GetPosition() const { return mRect.TopLeft(); } |
953 | 0 | nsSize GetSize() const { return mRect.Size(); } |
954 | 0 | nsRect GetRectRelativeToSelf() const { |
955 | 0 | return nsRect(nsPoint(0, 0), mRect.Size()); |
956 | 0 | } |
957 | | /** |
958 | | * Dimensions and position in logical coordinates in the frame's writing mode |
959 | | * or another writing mode |
960 | | */ |
961 | 0 | mozilla::LogicalRect GetLogicalRect(const nsSize& aContainerSize) const { |
962 | 0 | return GetLogicalRect(GetWritingMode(), aContainerSize); |
963 | 0 | } |
964 | 0 | mozilla::LogicalPoint GetLogicalPosition(const nsSize& aContainerSize) const { |
965 | 0 | return GetLogicalPosition(GetWritingMode(), aContainerSize); |
966 | 0 | } |
967 | 0 | mozilla::LogicalSize GetLogicalSize() const { |
968 | 0 | return GetLogicalSize(GetWritingMode()); |
969 | 0 | } |
970 | | mozilla::LogicalRect GetLogicalRect(mozilla::WritingMode aWritingMode, |
971 | 0 | const nsSize& aContainerSize) const { |
972 | 0 | return mozilla::LogicalRect(aWritingMode, GetRect(), aContainerSize); |
973 | 0 | } |
974 | | mozilla::LogicalPoint GetLogicalPosition(mozilla::WritingMode aWritingMode, |
975 | 0 | const nsSize& aContainerSize) const { |
976 | 0 | return GetLogicalRect(aWritingMode, aContainerSize).Origin(aWritingMode); |
977 | 0 | } |
978 | 0 | mozilla::LogicalSize GetLogicalSize(mozilla::WritingMode aWritingMode) const { |
979 | 0 | return mozilla::LogicalSize(aWritingMode, GetSize()); |
980 | 0 | } |
981 | | nscoord IStart(const nsSize& aContainerSize) const { |
982 | | return IStart(GetWritingMode(), aContainerSize); |
983 | | } |
984 | | nscoord IStart(mozilla::WritingMode aWritingMode, |
985 | | const nsSize& aContainerSize) const { |
986 | | return GetLogicalPosition(aWritingMode, aContainerSize).I(aWritingMode); |
987 | | } |
988 | | nscoord BStart(const nsSize& aContainerSize) const { |
989 | | return BStart(GetWritingMode(), aContainerSize); |
990 | | } |
991 | | nscoord BStart(mozilla::WritingMode aWritingMode, |
992 | | const nsSize& aContainerSize) const { |
993 | | return GetLogicalPosition(aWritingMode, aContainerSize).B(aWritingMode); |
994 | | } |
995 | 0 | nscoord ISize() const { return ISize(GetWritingMode()); } |
996 | 0 | nscoord ISize(mozilla::WritingMode aWritingMode) const { |
997 | 0 | return GetLogicalSize(aWritingMode).ISize(aWritingMode); |
998 | 0 | } |
999 | 0 | nscoord BSize() const { return BSize(GetWritingMode()); } |
1000 | 0 | nscoord BSize(mozilla::WritingMode aWritingMode) const { |
1001 | 0 | return GetLogicalSize(aWritingMode).BSize(aWritingMode); |
1002 | 0 | } |
1003 | | nscoord ContentBSize() const { return ContentBSize(GetWritingMode()); } |
1004 | 0 | nscoord ContentBSize(mozilla::WritingMode aWritingMode) const { |
1005 | 0 | auto bp = GetLogicalUsedBorderAndPadding(aWritingMode); |
1006 | 0 | bp.ApplySkipSides(GetLogicalSkipSides()); |
1007 | 0 | return std::max(0, BSize(aWritingMode) - bp.BStartEnd(aWritingMode)); |
1008 | 0 | } |
1009 | | |
1010 | | /** |
1011 | | * When we change the size of the frame's border-box rect, we may need to |
1012 | | * reset the overflow rect if it was previously stored as deltas. |
1013 | | * (If it is currently a "large" overflow and could be re-packed as deltas, |
1014 | | * we don't bother as the cost of the allocation has already been paid.) |
1015 | | * @param aRebuildDisplayItems If true, then adds this frame to the |
1016 | | * list of modified frames for display list building if the rect has changed. |
1017 | | * Only pass false if you're sure that the relevant display items will be rebuilt |
1018 | | * already (possibly by an ancestor being in the modified list), or if this is |
1019 | | * a temporary change. |
1020 | | */ |
1021 | 0 | void SetRect(const nsRect& aRect, bool aRebuildDisplayItems = true) { |
1022 | 0 | if (aRect == mRect) { |
1023 | 0 | return; |
1024 | 0 | } |
1025 | 0 | if (mOverflow.mType != NS_FRAME_OVERFLOW_LARGE && |
1026 | 0 | mOverflow.mType != NS_FRAME_OVERFLOW_NONE) { |
1027 | 0 | nsOverflowAreas overflow = GetOverflowAreas(); |
1028 | 0 | mRect = aRect; |
1029 | 0 | SetOverflowAreas(overflow); |
1030 | 0 | } else { |
1031 | 0 | mRect = aRect; |
1032 | 0 | } |
1033 | 0 | if (aRebuildDisplayItems) { |
1034 | 0 | MarkNeedsDisplayItemRebuild(); |
1035 | 0 | } |
1036 | 0 | } |
1037 | | /** |
1038 | | * Set this frame's rect from a logical rect in its own writing direction |
1039 | | */ |
1040 | | void SetRect(const mozilla::LogicalRect& aRect, |
1041 | | const nsSize& aContainerSize) { |
1042 | | SetRect(GetWritingMode(), aRect, aContainerSize); |
1043 | | } |
1044 | | /** |
1045 | | * Set this frame's rect from a logical rect in a different writing direction |
1046 | | * (GetPhysicalRect will assert if the writing mode doesn't match) |
1047 | | */ |
1048 | | void SetRect(mozilla::WritingMode aWritingMode, |
1049 | | const mozilla::LogicalRect& aRect, |
1050 | 0 | const nsSize& aContainerSize) { |
1051 | 0 | SetRect(aRect.GetPhysicalRect(aWritingMode, aContainerSize)); |
1052 | 0 | } |
1053 | | |
1054 | | /** |
1055 | | * Set this frame's size from a logical size in its own writing direction. |
1056 | | * This leaves the frame's logical position unchanged, which means its |
1057 | | * physical position may change (for right-to-left modes). |
1058 | | */ |
1059 | 0 | void SetSize(const mozilla::LogicalSize& aSize) { |
1060 | 0 | SetSize(GetWritingMode(), aSize); |
1061 | 0 | } |
1062 | | /* |
1063 | | * Set this frame's size from a logical size in a different writing direction. |
1064 | | * This leaves the frame's logical position in the given mode unchanged, |
1065 | | * which means its physical position may change (for right-to-left modes). |
1066 | | */ |
1067 | | void SetSize(mozilla::WritingMode aWritingMode, |
1068 | | const mozilla::LogicalSize& aSize) |
1069 | 0 | { |
1070 | 0 | if ((!aWritingMode.IsVertical() && !aWritingMode.IsBidiLTR()) || |
1071 | 0 | aWritingMode.IsVerticalRL()) { |
1072 | 0 | nscoord oldWidth = mRect.Width(); |
1073 | 0 | SetSize(aSize.GetPhysicalSize(aWritingMode)); |
1074 | 0 | mRect.x -= mRect.Width() - oldWidth; |
1075 | 0 | } else { |
1076 | 0 | SetSize(aSize.GetPhysicalSize(aWritingMode)); |
1077 | 0 | } |
1078 | 0 | } |
1079 | | |
1080 | | /** |
1081 | | * Set this frame's physical size. This leaves the frame's physical position |
1082 | | * (topLeft) unchanged. |
1083 | | * @param aRebuildDisplayItems If true, then adds this frame to the |
1084 | | * list of modified frames for display list building if the size has changed. |
1085 | | * Only pass false if you're sure that the relevant display items will be rebuilt |
1086 | | * already (possibly by an ancestor being in the modified list), or if this is |
1087 | | * a temporary change. |
1088 | | */ |
1089 | 0 | void SetSize(const nsSize& aSize, bool aRebuildDisplayItems = true) { |
1090 | 0 | SetRect(nsRect(mRect.TopLeft(), aSize), aRebuildDisplayItems); |
1091 | 0 | } |
1092 | | |
1093 | 0 | void SetPosition(const nsPoint& aPt) { |
1094 | 0 | if (mRect.TopLeft() == aPt) { |
1095 | 0 | return; |
1096 | 0 | } |
1097 | 0 | mRect.MoveTo(aPt); |
1098 | 0 | MarkNeedsDisplayItemRebuild(); |
1099 | 0 | } |
1100 | | void SetPosition(mozilla::WritingMode aWritingMode, |
1101 | | const mozilla::LogicalPoint& aPt, |
1102 | 0 | const nsSize& aContainerSize) { |
1103 | 0 | // We subtract mRect.Size() from the container size to account for |
1104 | 0 | // the fact that logical origins in RTL coordinate systems are at |
1105 | 0 | // the top right of the frame instead of the top left. |
1106 | 0 | SetPosition(aPt.GetPhysicalPoint(aWritingMode, |
1107 | 0 | aContainerSize - mRect.Size())); |
1108 | 0 | } |
1109 | | |
1110 | | /** |
1111 | | * Move the frame, accounting for relative positioning. Use this when |
1112 | | * adjusting the frame's position by a known amount, to properly update its |
1113 | | * saved normal position (see GetNormalPosition below). |
1114 | | * |
1115 | | * This must be used only when moving a frame *after* |
1116 | | * ReflowInput::ApplyRelativePositioning is called. When moving |
1117 | | * a frame during the reflow process prior to calling |
1118 | | * ReflowInput::ApplyRelativePositioning, the position should |
1119 | | * simply be adjusted directly (e.g., using SetPosition()). |
1120 | | */ |
1121 | | void MovePositionBy(const nsPoint& aTranslation); |
1122 | | |
1123 | | /** |
1124 | | * As above, using a logical-point delta in a given writing mode. |
1125 | | */ |
1126 | | void MovePositionBy(mozilla::WritingMode aWritingMode, |
1127 | | const mozilla::LogicalPoint& aTranslation) |
1128 | 0 | { |
1129 | 0 | // The LogicalPoint represents a vector rather than a point within a |
1130 | 0 | // rectangular coordinate space, so we use a null containerSize when |
1131 | 0 | // converting logical to physical. |
1132 | 0 | const nsSize nullContainerSize; |
1133 | 0 | MovePositionBy(aTranslation.GetPhysicalPoint(aWritingMode, |
1134 | 0 | nullContainerSize)); |
1135 | 0 | } |
1136 | | |
1137 | | /** |
1138 | | * Return frame's rect without relative positioning |
1139 | | */ |
1140 | | nsRect GetNormalRect() const; |
1141 | | |
1142 | | /** |
1143 | | * Return frame's position without relative positioning. |
1144 | | * If aHasProperty is provided, returns whether the normal position |
1145 | | * was stored in a frame property. |
1146 | | */ |
1147 | | inline nsPoint GetNormalPosition(bool* aHasProperty = nullptr) const; |
1148 | | |
1149 | | mozilla::LogicalPoint |
1150 | | GetLogicalNormalPosition(mozilla::WritingMode aWritingMode, |
1151 | | const nsSize& aContainerSize) const |
1152 | 0 | { |
1153 | 0 | // Subtract the size of this frame from the container size to get |
1154 | 0 | // the correct position in rtl frames where the origin is on the |
1155 | 0 | // right instead of the left |
1156 | 0 | return mozilla::LogicalPoint(aWritingMode, |
1157 | 0 | GetNormalPosition(), |
1158 | 0 | aContainerSize - mRect.Size()); |
1159 | 0 | } |
1160 | | |
1161 | | virtual nsPoint GetPositionOfChildIgnoringScrolling(const nsIFrame* aChild) |
1162 | 0 | { return aChild->GetPosition(); } |
1163 | | |
1164 | | nsPoint GetPositionIgnoringScrolling() const; |
1165 | | |
1166 | | typedef AutoTArray<nsDisplayItem*, 4> DisplayItemArray; |
1167 | | |
1168 | | #define NS_DECLARE_FRAME_PROPERTY_WITH_DTOR(prop, type, dtor) \ |
1169 | 0 | static const mozilla::FramePropertyDescriptor<type>* prop() { \ |
1170 | 0 | /* Use of constexpr caused startup crashes with MSVC2015u1 PGO. */ \ |
1171 | 0 | static const auto descriptor = \ |
1172 | 0 | mozilla::FramePropertyDescriptor<type>::NewWithDestructor<dtor>(); \ |
1173 | 0 | return &descriptor; \ |
1174 | 0 | } Unexecuted instantiation: nsIFrame::NormalPositionProperty() Unexecuted instantiation: nsIFrame::ComputedOffsetProperty() Unexecuted instantiation: nsIFrame::OutlineInnerRectProperty() Unexecuted instantiation: nsIFrame::PreEffectsBBoxProperty() Unexecuted instantiation: nsIFrame::PreTransformOverflowAreasProperty() Unexecuted instantiation: nsIFrame::OverflowAreasProperty() Unexecuted instantiation: nsIFrame::InitialOverflowProperty() Unexecuted instantiation: nsIFrame::UsedMarginProperty() Unexecuted instantiation: nsIFrame::UsedPaddingProperty() Unexecuted instantiation: nsIFrame::UsedBorderProperty() Unexecuted instantiation: nsIFrame::InvalidationRect() Unexecuted instantiation: nsIFrame::DisplayItems() Unexecuted instantiation: nsContainerFrame::OverflowProperty() Unexecuted instantiation: nsContainerFrame::OverflowContainersProperty() Unexecuted instantiation: nsContainerFrame::ExcessOverflowContainersProperty() Unexecuted instantiation: nsContainerFrame::BackdropProperty() Unexecuted instantiation: AnimatedGeometryRoot::AnimatedGeometryRootCache() Unexecuted instantiation: mozilla::ActiveScrolledRoot::ActiveScrolledRootCache() Unexecuted instantiation: nsDisplayListBuilder::OutOfFlowDisplayDataProperty() Unexecuted instantiation: nsDisplayListBuilder::DisplayListBuildingRect() Unexecuted instantiation: nsDisplayListBuilder::DisplayListBuildingDisplayPortRect() Unexecuted instantiation: nsSVGUtils::ObjectBoundingBoxProperty() Unexecuted instantiation: mozilla::SVGObserverUtils::HrefToTemplateProperty() Unexecuted instantiation: mozilla::SVGObserverUtils::FilterProperty() Unexecuted instantiation: mozilla::SVGObserverUtils::MaskProperty() Unexecuted instantiation: mozilla::SVGObserverUtils::ClipPathProperty() Unexecuted instantiation: mozilla::SVGObserverUtils::MarkerStartProperty() Unexecuted instantiation: mozilla::SVGObserverUtils::MarkerMidProperty() Unexecuted instantiation: mozilla::SVGObserverUtils::MarkerEndProperty() Unexecuted instantiation: mozilla::SVGObserverUtils::FillProperty() Unexecuted instantiation: mozilla::SVGObserverUtils::StrokeProperty() Unexecuted instantiation: mozilla::SVGObserverUtils::HrefAsTextPathProperty() Unexecuted instantiation: mozilla::SVGObserverUtils::BackgroundImageProperty() Unexecuted instantiation: nsGridContainerFrame::GridItemContainingBlockRect() Unexecuted instantiation: nsGridContainerFrame::GridColTrackInfo() Unexecuted instantiation: nsGridContainerFrame::GridRowTrackInfo() Unexecuted instantiation: nsGridContainerFrame::GridColumnLineInfo() Unexecuted instantiation: nsGridContainerFrame::GridRowLineInfo() Unexecuted instantiation: nsGridContainerFrame::ImplicitNamedAreasProperty() Unexecuted instantiation: nsGridContainerFrame::ExplicitNamedAreasProperty() Unexecuted instantiation: nsFlexContainerFrame::FlexContainerInfo() Unexecuted instantiation: nsTableWrapperFrame::GridItemCBSizeProperty() Unexecuted instantiation: nsTextControlFrame::ContentScrollPos() Unexecuted instantiation: nsTextControlFrame::TextControlInitializer() Unexecuted instantiation: RetainedDisplayListBuilder::Cached() Unexecuted instantiation: RetainedDisplayListData::DisplayListData() Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:mozilla::StickyScrollContainerProperty() Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:PushedFloatProperty() Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:OverflowOutOfFlowsProperty() Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:OutsideBulletProperty() Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:OverflowLinesProperty() Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:CachedFlexMeasuringReflow() Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:FloatRegionProperty() Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:FontInflationDataProperty() Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:AbsoluteContainingBlockProperty() Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:BoxMetricsProperty() Unexecuted instantiation: nsGridContainerFrame::SharedGridData::Prop() Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:TabWidthProperty() Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:UninflatedTextRunProperty() Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:EmphasisMarkProperty() Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:mozilla::TextNodeCorrespondenceProperty() Unexecuted instantiation: Unified_cpp_layout_xul0.cpp:PopupListProperty() Unexecuted instantiation: Unified_cpp_layout_mathml0.cpp:HTMLReflowOutputProperty() Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:RowLinesProperty() Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:ColumnLinesProperty() Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:RowAlignProperty() Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:ColumnAlignProperty() Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:mozilla::LayerActivityProperty() |
1175 | | |
1176 | | // Don't use this unless you really know what you're doing! |
1177 | | #define NS_DECLARE_FRAME_PROPERTY_WITH_FRAME_IN_DTOR(prop, type, dtor) \ |
1178 | | static const mozilla::FramePropertyDescriptor<type>* prop() { \ |
1179 | | /* Use of constexpr caused startup crashes with MSVC2015u1 PGO. */ \ |
1180 | | static const auto descriptor = mozilla:: \ |
1181 | | FramePropertyDescriptor<type>::NewWithDestructorWithFrame<dtor>(); \ |
1182 | | return &descriptor; \ |
1183 | | } |
1184 | | |
1185 | | #define NS_DECLARE_FRAME_PROPERTY_WITHOUT_DTOR(prop, type) \ |
1186 | 0 | static const mozilla::FramePropertyDescriptor<type>* prop() { \ |
1187 | 0 | /* Use of constexpr caused startup crashes with MSVC2015u1 PGO. */ \ |
1188 | 0 | static const auto descriptor = \ |
1189 | 0 | mozilla::FramePropertyDescriptor<type>::NewWithoutDestructor(); \ |
1190 | 0 | return &descriptor; \ |
1191 | 0 | } Unexecuted instantiation: nsIFrame::IBSplitSibling() Unexecuted instantiation: nsIFrame::IBSplitPrevSibling() Unexecuted instantiation: nsIFrame::LineBaselineOffset() Unexecuted instantiation: nsIFrame::FlexItemMainSizeOverride() Unexecuted instantiation: nsIFrame::FragStretchBSizeProperty() Unexecuted instantiation: nsIFrame::BClampMarginBoxMinSizeProperty() Unexecuted instantiation: nsIFrame::IBaselinePadProperty() Unexecuted instantiation: nsIFrame::BBaselinePadProperty() Unexecuted instantiation: nsIFrame::VisibilityStateProperty() Unexecuted instantiation: nsContainerFrame::FirstLetterProperty() Unexecuted instantiation: nsBlockFrame::LineCursorProperty() Unexecuted instantiation: Unified_cpp_layout_generic0.cpp:ReservedISize() Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:BlockEndEdgeOfChildrenProperty() Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:InsideBulletProperty() Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:FontSizeInflationProperty() Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:OffsetToFrameProperty() Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:FontSizeInflationProperty() Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:TextCombineScaleFactorProperty() Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:JustificationAssignmentProperty() |
1192 | | |
1193 | | #define NS_DECLARE_FRAME_PROPERTY_DELETABLE(prop, type) \ |
1194 | | NS_DECLARE_FRAME_PROPERTY_WITH_DTOR(prop, type, DeleteValue) |
1195 | | |
1196 | | #define NS_DECLARE_FRAME_PROPERTY_RELEASABLE(prop, type) \ |
1197 | | NS_DECLARE_FRAME_PROPERTY_WITH_DTOR(prop, type, ReleaseValue) |
1198 | | |
1199 | | #define NS_DECLARE_FRAME_PROPERTY_WITH_DTOR_NEVER_CALLED(prop, type) \ |
1200 | 0 | static void AssertOnDestroyingProperty##prop(type*) { \ |
1201 | 0 | MOZ_ASSERT_UNREACHABLE("Frame property " #prop " should never " \ |
1202 | 0 | "be destroyed by the FrameProperties class"); \ |
1203 | 0 | } \ Unexecuted instantiation: nsContainerFrame::AssertOnDestroyingPropertyOverflowProperty(nsFrameList*) Unexecuted instantiation: nsContainerFrame::AssertOnDestroyingPropertyOverflowContainersProperty(nsFrameList*) Unexecuted instantiation: nsContainerFrame::AssertOnDestroyingPropertyExcessOverflowContainersProperty(nsFrameList*) Unexecuted instantiation: nsContainerFrame::AssertOnDestroyingPropertyBackdropProperty(nsFrameList*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:AssertOnDestroyingPropertyPushedFloatProperty(nsFrameList*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:AssertOnDestroyingPropertyOverflowOutOfFlowsProperty(nsFrameList*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:AssertOnDestroyingPropertyOutsideBulletProperty(nsFrameList*) Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:AssertOnDestroyingPropertyOverflowLinesProperty(nsBlockFrame::FrameLines*) Unexecuted instantiation: Unified_cpp_layout_xul0.cpp:AssertOnDestroyingPropertyPopupListProperty(nsFrameList*) |
1204 | | NS_DECLARE_FRAME_PROPERTY_WITH_DTOR(prop, type, \ |
1205 | | AssertOnDestroyingProperty##prop) |
1206 | | |
1207 | | #define NS_DECLARE_FRAME_PROPERTY_SMALL_VALUE(prop, type) \ |
1208 | | NS_DECLARE_FRAME_PROPERTY_WITHOUT_DTOR(prop, mozilla::SmallValueHolder<type>) |
1209 | | |
1210 | | NS_DECLARE_FRAME_PROPERTY_WITHOUT_DTOR(IBSplitSibling, nsContainerFrame) |
1211 | | NS_DECLARE_FRAME_PROPERTY_WITHOUT_DTOR(IBSplitPrevSibling, nsContainerFrame) |
1212 | | |
1213 | | NS_DECLARE_FRAME_PROPERTY_DELETABLE(NormalPositionProperty, nsPoint) |
1214 | | NS_DECLARE_FRAME_PROPERTY_DELETABLE(ComputedOffsetProperty, nsMargin) |
1215 | | |
1216 | | NS_DECLARE_FRAME_PROPERTY_DELETABLE(OutlineInnerRectProperty, nsRect) |
1217 | | NS_DECLARE_FRAME_PROPERTY_DELETABLE(PreEffectsBBoxProperty, nsRect) |
1218 | | NS_DECLARE_FRAME_PROPERTY_DELETABLE(PreTransformOverflowAreasProperty, |
1219 | | nsOverflowAreas) |
1220 | | |
1221 | | NS_DECLARE_FRAME_PROPERTY_DELETABLE(OverflowAreasProperty, nsOverflowAreas) |
1222 | | |
1223 | | // The initial overflow area passed to FinishAndStoreOverflow. This is only set |
1224 | | // on frames that Preserve3D() or HasPerspective() or IsTransformed(), and |
1225 | | // when at least one of the overflow areas differs from the frame bound rect. |
1226 | | NS_DECLARE_FRAME_PROPERTY_DELETABLE(InitialOverflowProperty, nsOverflowAreas) |
1227 | | |
1228 | | #ifdef DEBUG |
1229 | | // InitialOverflowPropertyDebug is added to the frame to indicate that either |
1230 | | // the InitialOverflowProperty has been stored or the InitialOverflowProperty |
1231 | | // has been suppressed due to being set to the default value (frame bounds) |
1232 | | NS_DECLARE_FRAME_PROPERTY_SMALL_VALUE(DebugInitialOverflowPropertyApplied, bool) |
1233 | | #endif |
1234 | | |
1235 | | NS_DECLARE_FRAME_PROPERTY_DELETABLE(UsedMarginProperty, nsMargin) |
1236 | | NS_DECLARE_FRAME_PROPERTY_DELETABLE(UsedPaddingProperty, nsMargin) |
1237 | | NS_DECLARE_FRAME_PROPERTY_DELETABLE(UsedBorderProperty, nsMargin) |
1238 | | |
1239 | | NS_DECLARE_FRAME_PROPERTY_SMALL_VALUE(LineBaselineOffset, nscoord) |
1240 | | |
1241 | | // Temporary override for a flex item's main-size property (either width |
1242 | | // or height), imposed by its flex container. |
1243 | | NS_DECLARE_FRAME_PROPERTY_SMALL_VALUE(FlexItemMainSizeOverride, nscoord) |
1244 | | |
1245 | | NS_DECLARE_FRAME_PROPERTY_DELETABLE(InvalidationRect, nsRect) |
1246 | | |
1247 | | NS_DECLARE_FRAME_PROPERTY_SMALL_VALUE(RefusedAsyncAnimationProperty, bool) |
1248 | | |
1249 | | NS_DECLARE_FRAME_PROPERTY_SMALL_VALUE(FragStretchBSizeProperty, nscoord) |
1250 | | |
1251 | | // The block-axis margin-box size associated with eBClampMarginBoxMinSize. |
1252 | | NS_DECLARE_FRAME_PROPERTY_SMALL_VALUE(BClampMarginBoxMinSizeProperty, nscoord) |
1253 | | |
1254 | | NS_DECLARE_FRAME_PROPERTY_SMALL_VALUE(IBaselinePadProperty, nscoord) |
1255 | | NS_DECLARE_FRAME_PROPERTY_SMALL_VALUE(BBaselinePadProperty, nscoord) |
1256 | | |
1257 | | NS_DECLARE_FRAME_PROPERTY_DELETABLE(DisplayItems, DisplayItemArray) |
1258 | | |
1259 | | NS_DECLARE_FRAME_PROPERTY_SMALL_VALUE(BidiDataProperty, mozilla::FrameBidiData) |
1260 | | |
1261 | | NS_DECLARE_FRAME_PROPERTY_WITHOUT_DTOR(PlaceholderFrameProperty, nsPlaceholderFrame) |
1262 | | |
1263 | | mozilla::FrameBidiData GetBidiData() const |
1264 | | { |
1265 | | bool exists; |
1266 | | mozilla::FrameBidiData bidiData = GetProperty(BidiDataProperty(), &exists); |
1267 | | if (!exists) { |
1268 | | bidiData.precedingControl = mozilla::kBidiLevelNone; |
1269 | | } |
1270 | | return bidiData; |
1271 | | } |
1272 | | |
1273 | | nsBidiLevel GetBaseLevel() const |
1274 | 0 | { |
1275 | 0 | return GetBidiData().baseLevel; |
1276 | 0 | } |
1277 | | |
1278 | | nsBidiLevel GetEmbeddingLevel() const |
1279 | | { |
1280 | | return GetBidiData().embeddingLevel; |
1281 | | } |
1282 | | |
1283 | | /** |
1284 | | * Return the distance between the border edge of the frame and the |
1285 | | * margin edge of the frame. Like GetRect(), returns the dimensions |
1286 | | * as of the most recent reflow. |
1287 | | * |
1288 | | * This doesn't include any margin collapsing that may have occurred. |
1289 | | * |
1290 | | * It also treats 'auto' margins as zero, and treats any margins that |
1291 | | * should have been turned into 'auto' because of overconstraint as |
1292 | | * having their original values. |
1293 | | */ |
1294 | | virtual nsMargin GetUsedMargin() const; |
1295 | | virtual mozilla::LogicalMargin |
1296 | 0 | GetLogicalUsedMargin(mozilla::WritingMode aWritingMode) const { |
1297 | 0 | return mozilla::LogicalMargin(aWritingMode, GetUsedMargin()); |
1298 | 0 | } |
1299 | | |
1300 | | /** |
1301 | | * Return the distance between the border edge of the frame (which is |
1302 | | * its rect) and the padding edge of the frame. Like GetRect(), returns |
1303 | | * the dimensions as of the most recent reflow. |
1304 | | * |
1305 | | * Note that this differs from StyleBorder()->GetComputedBorder() in |
1306 | | * that this describes a region of the frame's box, and |
1307 | | * StyleBorder()->GetComputedBorder() describes a border. They differ |
1308 | | * for tables (particularly border-collapse tables) and themed |
1309 | | * elements. |
1310 | | */ |
1311 | | virtual nsMargin GetUsedBorder() const; |
1312 | | virtual mozilla::LogicalMargin |
1313 | 0 | GetLogicalUsedBorder(mozilla::WritingMode aWritingMode) const { |
1314 | 0 | return mozilla::LogicalMargin(aWritingMode, GetUsedBorder()); |
1315 | 0 | } |
1316 | | |
1317 | | /** |
1318 | | * Return the distance between the padding edge of the frame and the |
1319 | | * content edge of the frame. Like GetRect(), returns the dimensions |
1320 | | * as of the most recent reflow. |
1321 | | */ |
1322 | | virtual nsMargin GetUsedPadding() const; |
1323 | | virtual mozilla::LogicalMargin |
1324 | 0 | GetLogicalUsedPadding(mozilla::WritingMode aWritingMode) const { |
1325 | 0 | return mozilla::LogicalMargin(aWritingMode, GetUsedPadding()); |
1326 | 0 | } |
1327 | | |
1328 | | nsMargin GetUsedBorderAndPadding() const { |
1329 | | return GetUsedBorder() + GetUsedPadding(); |
1330 | | } |
1331 | | mozilla::LogicalMargin |
1332 | 0 | GetLogicalUsedBorderAndPadding(mozilla::WritingMode aWritingMode) const { |
1333 | 0 | return mozilla::LogicalMargin(aWritingMode, GetUsedBorderAndPadding()); |
1334 | 0 | } |
1335 | | |
1336 | | /** |
1337 | | * Like the frame's rect (see |GetRect|), which is the border rect, |
1338 | | * other rectangles of the frame, in app units, relative to the parent. |
1339 | | */ |
1340 | | nsRect GetPaddingRect() const; |
1341 | | nsRect GetPaddingRectRelativeToSelf() const; |
1342 | | nsRect GetContentRect() const; |
1343 | | nsRect GetContentRectRelativeToSelf() const; |
1344 | | nsRect GetMarginRectRelativeToSelf() const; |
1345 | | |
1346 | | /** |
1347 | | * The area to paint box-shadows around. The default is the border rect. |
1348 | | * (nsFieldSetFrame overrides this). |
1349 | | */ |
1350 | 0 | virtual nsRect VisualBorderRectRelativeToSelf() const { |
1351 | 0 | return nsRect(0, 0, mRect.Width(), mRect.Height()); |
1352 | 0 | } |
1353 | | |
1354 | | /** |
1355 | | * Get the size, in app units, of the border radii. It returns FALSE iff all |
1356 | | * returned radii == 0 (so no border radii), TRUE otherwise. |
1357 | | * For the aRadii indexes, use the enum HalfCorner constants in gfx/2d/Types.h |
1358 | | * If a side is skipped via aSkipSides, its corners are forced to 0. |
1359 | | * |
1360 | | * All corner radii are then adjusted so they do not require more |
1361 | | * space than aBorderArea, according to the algorithm in css3-background. |
1362 | | * |
1363 | | * aFrameSize is used as the basis for percentage widths and heights. |
1364 | | * aBorderArea is used for the adjustment of radii that might be too |
1365 | | * large. |
1366 | | * FIXME: In the long run, we can probably get away with only one of |
1367 | | * these, especially if we change the way we handle outline-radius (by |
1368 | | * removing it and inflating the border radius) |
1369 | | * |
1370 | | * Return whether any radii are nonzero. |
1371 | | */ |
1372 | | static bool ComputeBorderRadii(const nsStyleCorners& aBorderRadius, |
1373 | | const nsSize& aFrameSize, |
1374 | | const nsSize& aBorderArea, |
1375 | | Sides aSkipSides, |
1376 | | nscoord aRadii[8]); |
1377 | | |
1378 | | /* |
1379 | | * Given a set of border radii for one box (e.g., border box), convert |
1380 | | * it to the equivalent set of radii for another box (e.g., in to |
1381 | | * padding box, out to outline box) by reducing radii or increasing |
1382 | | * nonzero radii as appropriate. |
1383 | | * |
1384 | | * Indices into aRadii are the enum HalfCorner constants in gfx/2d/Types.h |
1385 | | * |
1386 | | * Note that InsetBorderRadii is lossy, since it can turn nonzero |
1387 | | * radii into zero, and OutsetBorderRadii does not inflate zero radii. |
1388 | | * Therefore, callers should always inset or outset directly from the |
1389 | | * original value coming from style. |
1390 | | */ |
1391 | | static void InsetBorderRadii(nscoord aRadii[8], const nsMargin &aOffsets); |
1392 | | static void OutsetBorderRadii(nscoord aRadii[8], const nsMargin &aOffsets); |
1393 | | |
1394 | | /** |
1395 | | * Fill in border radii for this frame. Return whether any are nonzero. |
1396 | | * Indices into aRadii are the enum HalfCorner constants in gfx/2d/Types.h |
1397 | | * aSkipSides is a union of eSideBitsLeft/Right/Top/Bottom bits that says |
1398 | | * which side(s) to skip. |
1399 | | * |
1400 | | * Note: GetMarginBoxBorderRadii() and GetShapeBoxBorderRadii() work only |
1401 | | * on frames that establish block formatting contexts since they don't |
1402 | | * participate in margin-collapsing. |
1403 | | */ |
1404 | | virtual bool GetBorderRadii(const nsSize& aFrameSize, |
1405 | | const nsSize& aBorderArea, |
1406 | | Sides aSkipSides, |
1407 | | nscoord aRadii[8]) const; |
1408 | | bool GetBorderRadii(nscoord aRadii[8]) const; |
1409 | | bool GetMarginBoxBorderRadii(nscoord aRadii[8]) const; |
1410 | | bool GetPaddingBoxBorderRadii(nscoord aRadii[8]) const; |
1411 | | bool GetContentBoxBorderRadii(nscoord aRadii[8]) const; |
1412 | | bool GetBoxBorderRadii(nscoord aRadii[8], nsMargin aOffset, bool aIsOutset) const; |
1413 | | bool GetShapeBoxBorderRadii(nscoord aRadii[8]) const; |
1414 | | |
1415 | | /** |
1416 | | * XXX: this method will likely be replaced by GetVerticalAlignBaseline |
1417 | | * Get the position of the frame's baseline, relative to the top of |
1418 | | * the frame (its top border edge). Only valid when Reflow is not |
1419 | | * needed. |
1420 | | * @note You should only call this on frames with a WM that's parallel to aWM. |
1421 | | * @param aWM the writing-mode of the alignment context, with the ltr/rtl |
1422 | | * direction tweak done by nsIFrame::GetWritingMode(nsIFrame*) in inline |
1423 | | * contexts (see that method). |
1424 | | */ |
1425 | | virtual nscoord GetLogicalBaseline(mozilla::WritingMode aWM) const = 0; |
1426 | | |
1427 | | /** |
1428 | | * Synthesize a first(last) inline-axis baseline from our margin-box. |
1429 | | * An alphabetical baseline is at the start(end) edge and a central baseline |
1430 | | * is at the center of our block-axis margin-box (aWM tells which to use). |
1431 | | * https://drafts.csswg.org/css-align-3/#synthesize-baselines |
1432 | | * @note You should only call this on frames with a WM that's parallel to aWM. |
1433 | | * @param aWM the writing-mode of the alignment context |
1434 | | * @return an offset from our border-box block-axis start(end) edge for |
1435 | | * a first(last) baseline respectively |
1436 | | * (implemented in nsIFrameInlines.h) |
1437 | | */ |
1438 | | inline nscoord SynthesizeBaselineBOffsetFromMarginBox( |
1439 | | mozilla::WritingMode aWM, |
1440 | | BaselineSharingGroup aGroup) const; |
1441 | | |
1442 | | /** |
1443 | | * Synthesize a first(last) inline-axis baseline from our border-box. |
1444 | | * An alphabetical baseline is at the start(end) edge and a central baseline |
1445 | | * is at the center of our block-axis border-box (aWM tells which to use). |
1446 | | * https://drafts.csswg.org/css-align-3/#synthesize-baselines |
1447 | | * @note The returned value is only valid when reflow is not needed. |
1448 | | * @note You should only call this on frames with a WM that's parallel to aWM. |
1449 | | * @param aWM the writing-mode of the alignment context |
1450 | | * @return an offset from our border-box block-axis start(end) edge for |
1451 | | * a first(last) baseline respectively |
1452 | | * (implemented in nsIFrameInlines.h) |
1453 | | */ |
1454 | | inline nscoord SynthesizeBaselineBOffsetFromBorderBox( |
1455 | | mozilla::WritingMode aWM, |
1456 | | BaselineSharingGroup aGroup) const; |
1457 | | |
1458 | | /** |
1459 | | * Return the position of the frame's inline-axis baseline, or synthesize one |
1460 | | * for the given alignment context. The returned baseline is the distance from |
1461 | | * the block-axis border-box start(end) edge for aBaselineGroup eFirst(eLast). |
1462 | | * @note The returned value is only valid when reflow is not needed. |
1463 | | * @note You should only call this on frames with a WM that's parallel to aWM. |
1464 | | * @param aWM the writing-mode of the alignment context |
1465 | | * @param aBaselineOffset out-param, only valid if the method returns true |
1466 | | * (implemented in nsIFrameInlines.h) |
1467 | | */ |
1468 | | inline nscoord BaselineBOffset(mozilla::WritingMode aWM, |
1469 | | BaselineSharingGroup aBaselineGroup, |
1470 | | AlignmentContext aAlignmentContext) const; |
1471 | | |
1472 | | /** |
1473 | | * XXX: this method is taking over the role that GetLogicalBaseline has. |
1474 | | * Return true if the frame has a CSS2 'vertical-align' baseline. |
1475 | | * If it has, then the returned baseline is the distance from the block- |
1476 | | * axis border-box start edge. |
1477 | | * @note This method should only be used in AlignmentContext::eInline contexts. |
1478 | | * @note The returned value is only valid when reflow is not needed. |
1479 | | * @note You should only call this on frames with a WM that's parallel to aWM. |
1480 | | * @param aWM the writing-mode of the alignment context |
1481 | | * @param aBaseline the baseline offset, only valid if the method returns true |
1482 | | */ |
1483 | | virtual bool GetVerticalAlignBaseline(mozilla::WritingMode aWM, |
1484 | 0 | nscoord* aBaseline) const { |
1485 | 0 | return false; |
1486 | 0 | } |
1487 | | |
1488 | | /** |
1489 | | * Return true if the frame has a first(last) inline-axis natural baseline per |
1490 | | * CSS Box Alignment. If so, then the returned baseline is the distance from |
1491 | | * the block-axis border-box start(end) edge for aBaselineGroup eFirst(eLast). |
1492 | | * https://drafts.csswg.org/css-align-3/#natural-baseline |
1493 | | * @note The returned value is only valid when reflow is not needed. |
1494 | | * @note You should only call this on frames with a WM that's parallel to aWM. |
1495 | | * @param aWM the writing-mode of the alignment context |
1496 | | * @param aBaseline the baseline offset, only valid if the method returns true |
1497 | | */ |
1498 | | virtual bool GetNaturalBaselineBOffset(mozilla::WritingMode aWM, |
1499 | | BaselineSharingGroup aBaselineGroup, |
1500 | 0 | nscoord* aBaseline) const { |
1501 | 0 | return false; |
1502 | 0 | } |
1503 | | |
1504 | | /** |
1505 | | * Get the position of the baseline on which the caret needs to be placed, |
1506 | | * relative to the top of the frame. This is mostly needed for frames |
1507 | | * which return a baseline from GetBaseline which is not useful for |
1508 | | * caret positioning. |
1509 | | */ |
1510 | 0 | virtual nscoord GetCaretBaseline() const { |
1511 | 0 | return GetLogicalBaseline(GetWritingMode()); |
1512 | 0 | } |
1513 | | |
1514 | | /////////////////////////////////////////////////////////////////////////////// |
1515 | | // The public visibility API. |
1516 | | /////////////////////////////////////////////////////////////////////////////// |
1517 | | |
1518 | | /// @return true if we're tracking visibility for this frame. |
1519 | | bool TrackingVisibility() const |
1520 | 0 | { |
1521 | 0 | return bool(GetStateBits() & NS_FRAME_VISIBILITY_IS_TRACKED); |
1522 | 0 | } |
1523 | | |
1524 | | /// @return the visibility state of this frame. See the Visibility enum |
1525 | | /// for the possible return values and their meanings. |
1526 | | Visibility GetVisibility() const; |
1527 | | |
1528 | | /// Update the visibility state of this frame synchronously. |
1529 | | /// XXX(seth): Avoid using this method; we should be relying on the refresh |
1530 | | /// driver for visibility updates. This method, which replaces |
1531 | | /// nsLayoutUtils::UpdateApproximateFrameVisibility(), exists purely as a |
1532 | | /// temporary measure to avoid changing behavior during the transition from |
1533 | | /// the old image visibility code. |
1534 | | void UpdateVisibilitySynchronously(); |
1535 | | |
1536 | | // A frame property which stores the visibility state of this frame. Right |
1537 | | // now that consists of an approximate visibility counter represented as a |
1538 | | // uint32_t. When the visibility of this frame is not being tracked, this |
1539 | | // property is absent. |
1540 | | NS_DECLARE_FRAME_PROPERTY_SMALL_VALUE(VisibilityStateProperty, uint32_t); |
1541 | | |
1542 | | protected: |
1543 | | |
1544 | | /** |
1545 | | * Subclasses can call this method to enable visibility tracking for this frame. |
1546 | | * |
1547 | | * If visibility tracking was previously disabled, this will schedule an |
1548 | | * update an asynchronous update of visibility. |
1549 | | */ |
1550 | | void EnableVisibilityTracking(); |
1551 | | |
1552 | | /** |
1553 | | * Subclasses can call this method to disable visibility tracking for this frame. |
1554 | | * |
1555 | | * Note that if visibility tracking was previously enabled, disabling visibility |
1556 | | * tracking will cause a synchronous call to OnVisibilityChange(). |
1557 | | */ |
1558 | | void DisableVisibilityTracking(); |
1559 | | |
1560 | | /** |
1561 | | * Called when a frame transitions between visibility states (for example, |
1562 | | * from nonvisible to visible, or from visible to nonvisible). |
1563 | | * |
1564 | | * @param aNewVisibility The new visibility state. |
1565 | | * @param aNonvisibleAction A requested action if the frame has become |
1566 | | * nonvisible. If Nothing(), no action is |
1567 | | * requested. If DISCARD_IMAGES is specified, the |
1568 | | * frame is requested to ask any images it's |
1569 | | * associated with to discard their surfaces if |
1570 | | * possible. |
1571 | | * |
1572 | | * Subclasses which override this method should call their parent class's |
1573 | | * implementation. |
1574 | | */ |
1575 | | virtual void OnVisibilityChange(Visibility aNewVisibility, |
1576 | | const Maybe<OnNonvisible>& aNonvisibleAction = Nothing()); |
1577 | | |
1578 | | public: |
1579 | | |
1580 | | /////////////////////////////////////////////////////////////////////////////// |
1581 | | // Internal implementation for the approximate frame visibility API. |
1582 | | /////////////////////////////////////////////////////////////////////////////// |
1583 | | |
1584 | | /** |
1585 | | * We track the approximate visibility of frames using a counter; if it's |
1586 | | * non-zero, then the frame is considered visible. Using a counter allows us |
1587 | | * to account for situations where the frame may be visible in more than one |
1588 | | * place (for example, via -moz-element), and it simplifies the |
1589 | | * implementation of our approximate visibility tracking algorithms. |
1590 | | * |
1591 | | * @param aNonvisibleAction A requested action if the frame has become |
1592 | | * nonvisible. If Nothing(), no action is |
1593 | | * requested. If DISCARD_IMAGES is specified, the |
1594 | | * frame is requested to ask any images it's |
1595 | | * associated with to discard their surfaces if |
1596 | | * possible. |
1597 | | */ |
1598 | | void DecApproximateVisibleCount(const Maybe<OnNonvisible>& aNonvisibleAction = Nothing()); |
1599 | | void IncApproximateVisibleCount(); |
1600 | | |
1601 | | |
1602 | | /** |
1603 | | * Get the specified child list. |
1604 | | * |
1605 | | * @param aListID identifies the requested child list. |
1606 | | * @return the child list. If the requested list is unsupported by this |
1607 | | * frame type, an empty list will be returned. |
1608 | | */ |
1609 | | virtual const nsFrameList& GetChildList(ChildListID aListID) const = 0; |
1610 | | const nsFrameList& PrincipalChildList() const { return GetChildList(kPrincipalList); } |
1611 | | virtual void GetChildLists(nsTArray<ChildList>* aLists) const = 0; |
1612 | | |
1613 | | /** |
1614 | | * Gets the child lists for this frame, including |
1615 | | * ones belong to a child document. |
1616 | | */ |
1617 | | void GetCrossDocChildLists(nsTArray<ChildList>* aLists); |
1618 | | |
1619 | | // The individual concrete child lists. |
1620 | | static const ChildListID kPrincipalList = mozilla::layout::kPrincipalList; |
1621 | | static const ChildListID kAbsoluteList = mozilla::layout::kAbsoluteList; |
1622 | | static const ChildListID kBulletList = mozilla::layout::kBulletList; |
1623 | | static const ChildListID kCaptionList = mozilla::layout::kCaptionList; |
1624 | | static const ChildListID kColGroupList = mozilla::layout::kColGroupList; |
1625 | | static const ChildListID kExcessOverflowContainersList = mozilla::layout::kExcessOverflowContainersList; |
1626 | | static const ChildListID kFixedList = mozilla::layout::kFixedList; |
1627 | | static const ChildListID kFloatList = mozilla::layout::kFloatList; |
1628 | | static const ChildListID kOverflowContainersList = mozilla::layout::kOverflowContainersList; |
1629 | | static const ChildListID kOverflowList = mozilla::layout::kOverflowList; |
1630 | | static const ChildListID kOverflowOutOfFlowList = mozilla::layout::kOverflowOutOfFlowList; |
1631 | | static const ChildListID kPopupList = mozilla::layout::kPopupList; |
1632 | | static const ChildListID kPushedFloatsList = mozilla::layout::kPushedFloatsList; |
1633 | | static const ChildListID kSelectPopupList = mozilla::layout::kSelectPopupList; |
1634 | | static const ChildListID kBackdropList = mozilla::layout::kBackdropList; |
1635 | | // A special alias for kPrincipalList that do not request reflow. |
1636 | | static const ChildListID kNoReflowPrincipalList = mozilla::layout::kNoReflowPrincipalList; |
1637 | | |
1638 | | /** |
1639 | | * Child frames are linked together in a doubly-linked list |
1640 | | */ |
1641 | | nsIFrame* GetNextSibling() const { return mNextSibling; } |
1642 | 0 | void SetNextSibling(nsIFrame* aNextSibling) { |
1643 | 0 | NS_ASSERTION(this != aNextSibling, "Creating a circular frame list, this is very bad."); |
1644 | 0 | if (mNextSibling && mNextSibling->GetPrevSibling() == this) { |
1645 | 0 | mNextSibling->mPrevSibling = nullptr; |
1646 | 0 | } |
1647 | 0 | mNextSibling = aNextSibling; |
1648 | 0 | if (mNextSibling) { |
1649 | 0 | mNextSibling->mPrevSibling = this; |
1650 | 0 | } |
1651 | 0 | } |
1652 | | |
1653 | | nsIFrame* GetPrevSibling() const { return mPrevSibling; } |
1654 | | |
1655 | | /** |
1656 | | * Builds the display lists for the content represented by this frame |
1657 | | * and its descendants. The background+borders of this element must |
1658 | | * be added first, before any other content. |
1659 | | * |
1660 | | * This should only be called by methods in nsFrame. Instead of calling this |
1661 | | * directly, call either BuildDisplayListForStackingContext or |
1662 | | * BuildDisplayListForChild. |
1663 | | * |
1664 | | * See nsDisplayList.h for more information about display lists. |
1665 | | */ |
1666 | | virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, |
1667 | 0 | const nsDisplayListSet& aLists) {} |
1668 | | /** |
1669 | | * Displays the caret onto the given display list builder. The caret is |
1670 | | * painted on top of the rest of the display list items. |
1671 | | */ |
1672 | | void DisplayCaret(nsDisplayListBuilder* aBuilder, |
1673 | | nsDisplayList* aList); |
1674 | | |
1675 | | /** |
1676 | | * Get the preferred caret color at the offset. |
1677 | | * |
1678 | | * @param aOffset is offset of the content. |
1679 | | */ |
1680 | | virtual nscolor GetCaretColorAt(int32_t aOffset); |
1681 | | |
1682 | | |
1683 | | bool IsThemed(nsITheme::Transparency* aTransparencyState = nullptr) const { |
1684 | | return IsThemed(StyleDisplay(), aTransparencyState); |
1685 | | } |
1686 | | bool IsThemed(const nsStyleDisplay* aDisp, |
1687 | | nsITheme::Transparency* aTransparencyState = nullptr) const { |
1688 | | if (!aDisp->HasAppearance()) { |
1689 | | return false; |
1690 | | } |
1691 | | nsIFrame* mutable_this = const_cast<nsIFrame*>(this); |
1692 | | nsPresContext* pc = PresContext(); |
1693 | | nsITheme* theme = pc->GetTheme(); |
1694 | | if(!theme || |
1695 | | !theme->ThemeSupportsWidget(pc, mutable_this, aDisp->mAppearance)) |
1696 | | return false; |
1697 | | if (aTransparencyState) { |
1698 | | *aTransparencyState = |
1699 | | theme->GetWidgetTransparency(mutable_this, aDisp->mAppearance); |
1700 | | } |
1701 | | return true; |
1702 | | } |
1703 | | |
1704 | | /** |
1705 | | * Builds a display list for the content represented by this frame, |
1706 | | * treating this frame as the root of a stacking context. |
1707 | | * Optionally sets aCreatedContainerItem to true if we created a |
1708 | | * single container display item for the stacking context, and no |
1709 | | * other wrapping items are needed. |
1710 | | */ |
1711 | | void BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, |
1712 | | nsDisplayList* aList, |
1713 | | bool* aCreatedContainerItem = nullptr); |
1714 | | |
1715 | | enum { |
1716 | | DISPLAY_CHILD_FORCE_PSEUDO_STACKING_CONTEXT = 0x01, |
1717 | | DISPLAY_CHILD_FORCE_STACKING_CONTEXT = 0x02, |
1718 | | DISPLAY_CHILD_INLINE = 0x04 |
1719 | | }; |
1720 | | /** |
1721 | | * Adjusts aDirtyRect for the child's offset, checks that the dirty rect |
1722 | | * actually intersects the child (or its descendants), calls BuildDisplayList |
1723 | | * on the child if necessary, and puts things in the right lists if the child |
1724 | | * is positioned. |
1725 | | * |
1726 | | * @param aFlags combination of DISPLAY_CHILD_FORCE_PSEUDO_STACKING_CONTEXT, |
1727 | | * DISPLAY_CHILD_FORCE_STACKING_CONTEXT and DISPLAY_CHILD_INLINE |
1728 | | */ |
1729 | | void BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, |
1730 | | nsIFrame* aChild, |
1731 | | const nsDisplayListSet& aLists, |
1732 | | uint32_t aFlags = 0); |
1733 | | |
1734 | | bool RefusedAsyncAnimation() const |
1735 | | { |
1736 | | return GetProperty(RefusedAsyncAnimationProperty()); |
1737 | | } |
1738 | | |
1739 | | /** |
1740 | | * Returns true if this frame is transformed (e.g. has CSS or SVG transforms) |
1741 | | * or if its parent is an SVG frame that has children-only transforms (e.g. |
1742 | | * an SVG viewBox attribute) or if its transform-style is preserve-3d or |
1743 | | * the frame has transform animations. |
1744 | | * |
1745 | | * @param aStyleDisplay: If the caller has this->StyleDisplay(), providing |
1746 | | * it here will improve performance. |
1747 | | */ |
1748 | | bool IsTransformed(const nsStyleDisplay* aStyleDisplay) const; |
1749 | | bool IsTransformed() const { |
1750 | | return IsTransformed(StyleDisplay()); |
1751 | | } |
1752 | | |
1753 | | /** |
1754 | | * Same as IsTransformed, except that it doesn't take SVG transforms |
1755 | | * into account. |
1756 | | */ |
1757 | | bool IsCSSTransformed(const nsStyleDisplay* aStyleDisplay) const; |
1758 | | |
1759 | | /** |
1760 | | * True if this frame has any animation of transform in effect. |
1761 | | * |
1762 | | */ |
1763 | | bool HasAnimationOfTransform() const; |
1764 | | |
1765 | | /** |
1766 | | * Returns true if the frame is translucent or the frame has opacity |
1767 | | * animations for the purposes of creating a stacking context. |
1768 | | * |
1769 | | * @param aEffectSet: This function may need to look up EffectSet property. |
1770 | | * If a caller already have one, pass it in can save property look up |
1771 | | * time; otherwise, just left it as nullptr. |
1772 | | */ |
1773 | | bool HasOpacity(mozilla::EffectSet* aEffectSet = nullptr) const |
1774 | 0 | { |
1775 | 0 | return HasOpacityInternal(1.0f, aEffectSet); |
1776 | 0 | } |
1777 | | /** |
1778 | | * Returns true if the frame is translucent for display purposes. |
1779 | | * |
1780 | | * @param aEffectSet: This function may need to look up EffectSet property. |
1781 | | * If a caller already have one, pass it in can save property look up |
1782 | | * time; otherwise, just left it as nullptr. |
1783 | | */ |
1784 | | bool HasVisualOpacity(mozilla::EffectSet* aEffectSet = nullptr) const |
1785 | 0 | { |
1786 | 0 | // Treat an opacity value of 0.99 and above as opaque. This is an |
1787 | 0 | // optimization aimed at Web content which use opacity:0.99 as a hint for |
1788 | 0 | // creating a stacking context only. |
1789 | 0 | return HasOpacityInternal(0.99f, aEffectSet); |
1790 | 0 | } |
1791 | | |
1792 | | /** |
1793 | | * Return true if this frame might be using a transform getter. |
1794 | | */ |
1795 | 0 | virtual bool HasTransformGetter() const { return false; } |
1796 | | |
1797 | | /** |
1798 | | * Returns true if this frame is an SVG frame that has SVG transforms applied |
1799 | | * to it, or if its parent frame is an SVG frame that has children-only |
1800 | | * transforms (e.g. an SVG viewBox attribute). |
1801 | | * If aOwnTransforms is non-null and the frame has its own SVG transforms, |
1802 | | * aOwnTransforms will be set to these transforms. If aFromParentTransforms |
1803 | | * is non-null and the frame has an SVG parent with children-only transforms, |
1804 | | * then aFromParentTransforms will be set to these transforms. |
1805 | | */ |
1806 | | virtual bool IsSVGTransformed(Matrix *aOwnTransforms = nullptr, |
1807 | | Matrix *aFromParentTransforms = nullptr) const; |
1808 | | |
1809 | | /** |
1810 | | * Returns whether this frame will attempt to extend the 3d transforms of its |
1811 | | * children. This requires transform-style: preserve-3d, as well as no clipping |
1812 | | * or svg effects. |
1813 | | * |
1814 | | * @param aStyleDisplay: If the caller has this->StyleDisplay(), providing |
1815 | | * it here will improve performance. |
1816 | | * |
1817 | | * @param aEffectSet: This function may need to look up EffectSet property. |
1818 | | * If a caller already have one, pass it in can save property look up |
1819 | | * time; otherwise, just left it as nullptr. |
1820 | | */ |
1821 | | bool Extend3DContext(const nsStyleDisplay* aStyleDisplay, |
1822 | | mozilla::EffectSet* aEffectSet = nullptr) const; |
1823 | 0 | bool Extend3DContext(mozilla::EffectSet* aEffectSet = nullptr) const { |
1824 | 0 | return Extend3DContext(StyleDisplay(), aEffectSet); |
1825 | 0 | } |
1826 | | |
1827 | | /** |
1828 | | * Returns whether this frame has a parent that Extend3DContext() and has |
1829 | | * its own transform (or hidden backface) to be combined with the parent's |
1830 | | * transform. |
1831 | | * |
1832 | | * @param aStyleDisplay: If the caller has this->StyleDisplay(), providing |
1833 | | * it here will improve performance. |
1834 | | */ |
1835 | | bool Combines3DTransformWithAncestors(const nsStyleDisplay* aStyleDisplay) const; |
1836 | | bool Combines3DTransformWithAncestors() const { |
1837 | | return Combines3DTransformWithAncestors(StyleDisplay()); |
1838 | | } |
1839 | | |
1840 | | /** |
1841 | | * Returns whether this frame has a hidden backface and has a parent that |
1842 | | * Extend3DContext(). This is useful because in some cases the hidden |
1843 | | * backface can safely be ignored if it could not be visible anyway. |
1844 | | * |
1845 | | */ |
1846 | | bool In3DContextAndBackfaceIsHidden() const; |
1847 | | |
1848 | | bool IsPreserve3DLeaf(const nsStyleDisplay* aStyleDisplay, |
1849 | 0 | mozilla::EffectSet* aEffectSet = nullptr) const { |
1850 | 0 | return Combines3DTransformWithAncestors(aStyleDisplay) && |
1851 | 0 | !Extend3DContext(aStyleDisplay, aEffectSet); |
1852 | 0 | } |
1853 | 0 | bool IsPreserve3DLeaf(mozilla::EffectSet* aEffectSet = nullptr) const { |
1854 | 0 | return IsPreserve3DLeaf(StyleDisplay(), aEffectSet); |
1855 | 0 | } |
1856 | | |
1857 | | bool HasPerspective(const nsStyleDisplay* aStyleDisplay) const; |
1858 | 0 | bool HasPerspective() const { |
1859 | 0 | return HasPerspective(StyleDisplay()); |
1860 | 0 | } |
1861 | | |
1862 | | bool ChildrenHavePerspective(const nsStyleDisplay* aStyleDisplay) const; |
1863 | 0 | bool ChildrenHavePerspective() const { |
1864 | 0 | return ChildrenHavePerspective(StyleDisplay()); |
1865 | 0 | } |
1866 | | |
1867 | | /** |
1868 | | * Includes the overflow area of all descendants that participate in the current |
1869 | | * 3d context into aOverflowAreas. |
1870 | | */ |
1871 | | void ComputePreserve3DChildrenOverflow(nsOverflowAreas& aOverflowAreas); |
1872 | | |
1873 | | void RecomputePerspectiveChildrenOverflow(const nsIFrame* aStartFrame); |
1874 | | |
1875 | | /** |
1876 | | * Returns the number of ancestors between this and the root of our frame tree |
1877 | | */ |
1878 | | uint32_t GetDepthInFrameTree() const; |
1879 | | |
1880 | | /** |
1881 | | * Event handling of GUI events. |
1882 | | * |
1883 | | * @param aEvent event structure describing the type of event and rge widget |
1884 | | * where the event originated |
1885 | | * The |point| member of this is in the coordinate system of the |
1886 | | * view returned by GetOffsetFromView. |
1887 | | * @param aEventStatus a return value indicating whether the event was handled |
1888 | | * and whether default processing should be done |
1889 | | * |
1890 | | * XXX From a frame's perspective it's unclear what the effect of the event status |
1891 | | * is. Does it cause the event to continue propagating through the frame hierarchy |
1892 | | * or is it just returned to the widgets? |
1893 | | * |
1894 | | * @see WidgetGUIEvent |
1895 | | * @see nsEventStatus |
1896 | | */ |
1897 | | virtual nsresult HandleEvent(nsPresContext* aPresContext, |
1898 | | mozilla::WidgetGUIEvent* aEvent, |
1899 | | nsEventStatus* aEventStatus) = 0; |
1900 | | |
1901 | | virtual nsresult GetContentForEvent(mozilla::WidgetEvent* aEvent, |
1902 | | nsIContent** aContent) = 0; |
1903 | | |
1904 | | // This structure keeps track of the content node and offsets associated with |
1905 | | // a point; there is a primary and a secondary offset associated with any |
1906 | | // point. The primary and secondary offsets differ when the point is over a |
1907 | | // non-text object. The primary offset is the expected position of the |
1908 | | // cursor calculated from a point; the secondary offset, when it is different, |
1909 | | // indicates that the point is in the boundaries of some selectable object. |
1910 | | // Note that the primary offset can be after the secondary offset; for places |
1911 | | // that need the beginning and end of the object, the StartOffset and |
1912 | | // EndOffset helpers can be used. |
1913 | | struct MOZ_STACK_CLASS ContentOffsets |
1914 | | { |
1915 | | ContentOffsets() : offset(0) |
1916 | | , secondaryOffset(0) |
1917 | 0 | , associate(mozilla::CARET_ASSOCIATE_BEFORE) {} |
1918 | 0 | bool IsNull() { return !content; } |
1919 | | // Helpers for places that need the ends of the offsets and expect them in |
1920 | | // numerical order, as opposed to wanting the primary and secondary offsets |
1921 | 0 | int32_t StartOffset() { return std::min(offset, secondaryOffset); } |
1922 | 0 | int32_t EndOffset() { return std::max(offset, secondaryOffset); } |
1923 | | |
1924 | | nsCOMPtr<nsIContent> content; |
1925 | | int32_t offset; |
1926 | | int32_t secondaryOffset; |
1927 | | // This value indicates whether the associated content is before or after |
1928 | | // the offset; the most visible use is to allow the caret to know which line |
1929 | | // to display on. |
1930 | | mozilla::CaretAssociationHint associate; |
1931 | | }; |
1932 | | enum { |
1933 | | IGNORE_SELECTION_STYLE = 0x01, |
1934 | | // Treat visibility:hidden frames as non-selectable |
1935 | | SKIP_HIDDEN = 0x02 |
1936 | | }; |
1937 | | /** |
1938 | | * This function calculates the content offsets for selection relative to |
1939 | | * a point. Note that this should generally only be callled on the event |
1940 | | * frame associated with an event because this function does not account |
1941 | | * for frame lists other than the primary one. |
1942 | | * @param aPoint point relative to this frame |
1943 | | */ |
1944 | | ContentOffsets GetContentOffsetsFromPoint(const nsPoint& aPoint, |
1945 | | uint32_t aFlags = 0); |
1946 | | |
1947 | | virtual ContentOffsets GetContentOffsetsFromPointExternal(const nsPoint& aPoint, |
1948 | | uint32_t aFlags = 0) |
1949 | 0 | { return GetContentOffsetsFromPoint(aPoint, aFlags); } |
1950 | | |
1951 | | /** |
1952 | | * Ensure that aImage gets notifed when the underlying image request loads |
1953 | | * or animates. |
1954 | | */ |
1955 | | void AssociateImage(const nsStyleImage& aImage, nsPresContext* aPresContext, |
1956 | | uint32_t aImageLoaderFlags); |
1957 | | |
1958 | | /** |
1959 | | * This structure holds information about a cursor. mContainer represents a |
1960 | | * loaded image that should be preferred. If it is not possible to use it, or |
1961 | | * if it is null, mCursor should be used. |
1962 | | */ |
1963 | | struct MOZ_STACK_CLASS Cursor { |
1964 | | nsCOMPtr<imgIContainer> mContainer; |
1965 | | int32_t mCursor = NS_STYLE_CURSOR_AUTO; |
1966 | | bool mHaveHotspot = false; |
1967 | | bool mLoading = false; |
1968 | | float mHotspotX = 0.0f, mHotspotY = 0.0f; |
1969 | | }; |
1970 | | /** |
1971 | | * Get the cursor for a given frame. |
1972 | | */ |
1973 | | virtual nsresult GetCursor(const nsPoint& aPoint, |
1974 | | Cursor& aCursor) = 0; |
1975 | | |
1976 | | /** |
1977 | | * Get a point (in the frame's coordinate space) given an offset into |
1978 | | * the content. This point should be on the baseline of text with |
1979 | | * the correct horizontal offset |
1980 | | */ |
1981 | | virtual nsresult GetPointFromOffset(int32_t inOffset, |
1982 | | nsPoint* outPoint) = 0; |
1983 | | |
1984 | | /** |
1985 | | * Get a list of character rects in a given range. |
1986 | | * This is similar version of GetPointFromOffset. |
1987 | | */ |
1988 | | virtual nsresult GetCharacterRectsInRange(int32_t aInOffset, |
1989 | | int32_t aLength, |
1990 | | nsTArray<nsRect>& aRects) = 0; |
1991 | | |
1992 | | /** |
1993 | | * Get the child frame of this frame which contains the given |
1994 | | * content offset. outChildFrame may be this frame, or nullptr on return. |
1995 | | * outContentOffset returns the content offset relative to the start |
1996 | | * of the returned node. You can also pass a hint which tells the method |
1997 | | * to stick to the end of the first found frame or the beginning of the |
1998 | | * next in case the offset falls on a boundary. |
1999 | | */ |
2000 | | virtual nsresult GetChildFrameContainingOffset(int32_t inContentOffset, |
2001 | | bool inHint,//false stick left |
2002 | | int32_t* outFrameContentOffset, |
2003 | | nsIFrame** outChildFrame) = 0; |
2004 | | |
2005 | | /** |
2006 | | * Get the current frame-state value for this frame. aResult is |
2007 | | * filled in with the state bits. |
2008 | | */ |
2009 | | nsFrameState GetStateBits() const { return mState; } |
2010 | | |
2011 | | /** |
2012 | | * Update the current frame-state value for this frame. |
2013 | | */ |
2014 | | void AddStateBits(nsFrameState aBits) { mState |= aBits; } |
2015 | 0 | void RemoveStateBits(nsFrameState aBits) { mState &= ~aBits; } |
2016 | 0 | void AddOrRemoveStateBits(nsFrameState aBits, bool aVal) { |
2017 | 0 | aVal ? AddStateBits(aBits) : RemoveStateBits(aBits); |
2018 | 0 | } |
2019 | | |
2020 | | /** |
2021 | | * Checks if the current frame-state includes all of the listed bits |
2022 | | */ |
2023 | | bool HasAllStateBits(nsFrameState aBits) const |
2024 | 0 | { |
2025 | 0 | return (mState & aBits) == aBits; |
2026 | 0 | } |
2027 | | |
2028 | | /** |
2029 | | * Checks if the current frame-state includes any of the listed bits |
2030 | | */ |
2031 | | bool HasAnyStateBits(nsFrameState aBits) const |
2032 | | { |
2033 | | return mState & aBits; |
2034 | | } |
2035 | | |
2036 | | /** |
2037 | | * Return true if this frame is the primary frame for mContent. |
2038 | | */ |
2039 | 0 | bool IsPrimaryFrame() const { return mIsPrimaryFrame; } |
2040 | | |
2041 | 0 | void SetIsPrimaryFrame(bool aIsPrimary) { mIsPrimaryFrame = aIsPrimary; } |
2042 | | |
2043 | | /** |
2044 | | * This call is invoked on the primary frame for a character data content |
2045 | | * node, when it is changed in the content tree. |
2046 | | */ |
2047 | | virtual nsresult CharacterDataChanged(const CharacterDataChangeInfo&) = 0; |
2048 | | |
2049 | | /** |
2050 | | * This call is invoked when the value of a content objects's attribute |
2051 | | * is changed. |
2052 | | * The first frame that maps that content is asked to deal |
2053 | | * with the change by doing whatever is appropriate. |
2054 | | * |
2055 | | * @param aNameSpaceID the namespace of the attribute |
2056 | | * @param aAttribute the atom name of the attribute |
2057 | | * @param aModType Whether or not the attribute was added, changed, or removed. |
2058 | | * The constants are defined in MutationEvent.webidl. |
2059 | | */ |
2060 | | virtual nsresult AttributeChanged(int32_t aNameSpaceID, |
2061 | | nsAtom* aAttribute, |
2062 | | int32_t aModType) = 0; |
2063 | | |
2064 | | /** |
2065 | | * When the content states of a content object change, this method is invoked |
2066 | | * on the primary frame of that content object. |
2067 | | * |
2068 | | * @param aStates the changed states |
2069 | | */ |
2070 | | virtual void ContentStatesChanged(mozilla::EventStates aStates); |
2071 | | |
2072 | | /** |
2073 | | * Return how your frame can be split. |
2074 | | */ |
2075 | | virtual nsSplittableType GetSplittableType() const = 0; |
2076 | | |
2077 | | /** |
2078 | | * Continuation member functions |
2079 | | */ |
2080 | | virtual nsIFrame* GetPrevContinuation() const = 0; |
2081 | | virtual void SetPrevContinuation(nsIFrame*) = 0; |
2082 | | virtual nsIFrame* GetNextContinuation() const = 0; |
2083 | | virtual void SetNextContinuation(nsIFrame*) = 0; |
2084 | 0 | virtual nsIFrame* FirstContinuation() const { |
2085 | 0 | return const_cast<nsIFrame*>(this); |
2086 | 0 | } |
2087 | 0 | virtual nsIFrame* LastContinuation() const { |
2088 | 0 | return const_cast<nsIFrame*>(this); |
2089 | 0 | } |
2090 | | |
2091 | | /** |
2092 | | * GetTailContinuation gets the last non-overflow-container continuation |
2093 | | * in the continuation chain, i.e. where the next sibling element |
2094 | | * should attach). |
2095 | | */ |
2096 | | nsIFrame* GetTailContinuation(); |
2097 | | |
2098 | | /** |
2099 | | * Flow member functions |
2100 | | */ |
2101 | | virtual nsIFrame* GetPrevInFlowVirtual() const = 0; |
2102 | 0 | nsIFrame* GetPrevInFlow() const { return GetPrevInFlowVirtual(); } |
2103 | | virtual void SetPrevInFlow(nsIFrame*) = 0; |
2104 | | |
2105 | | virtual nsIFrame* GetNextInFlowVirtual() const = 0; |
2106 | 0 | nsIFrame* GetNextInFlow() const { return GetNextInFlowVirtual(); } |
2107 | | virtual void SetNextInFlow(nsIFrame*) = 0; |
2108 | | |
2109 | | /** |
2110 | | * Return the first frame in our current flow. |
2111 | | */ |
2112 | 0 | virtual nsIFrame* FirstInFlow() const { |
2113 | 0 | return const_cast<nsIFrame*>(this); |
2114 | 0 | } |
2115 | | |
2116 | | /** |
2117 | | * Return the last frame in our current flow. |
2118 | | */ |
2119 | 0 | virtual nsIFrame* LastInFlow() const { |
2120 | 0 | return const_cast<nsIFrame*>(this); |
2121 | 0 | } |
2122 | | |
2123 | | /** |
2124 | | * Note: "width" in the names and comments on the following methods |
2125 | | * means inline-size, which could be height in vertical layout |
2126 | | */ |
2127 | | |
2128 | | /** |
2129 | | * Mark any stored intrinsic width information as dirty (requiring |
2130 | | * re-calculation). Note that this should generally not be called |
2131 | | * directly; nsPresShell::FrameNeedsReflow will call it instead. |
2132 | | */ |
2133 | | virtual void MarkIntrinsicISizesDirty() = 0; |
2134 | | |
2135 | | /** |
2136 | | * Get the min-content intrinsic inline size of the frame. This must be |
2137 | | * less than or equal to the max-content intrinsic inline size. |
2138 | | * |
2139 | | * This is *not* affected by the CSS 'min-width', 'width', and |
2140 | | * 'max-width' properties on this frame, but it is affected by the |
2141 | | * values of those properties on this frame's descendants. (It may be |
2142 | | * called during computation of the values of those properties, so it |
2143 | | * cannot depend on any values in the nsStylePosition for this frame.) |
2144 | | * |
2145 | | * The value returned should **NOT** include the space required for |
2146 | | * padding and border. |
2147 | | * |
2148 | | * Note that many frames will cache the result of this function call |
2149 | | * unless MarkIntrinsicISizesDirty is called. |
2150 | | * |
2151 | | * It is not acceptable for a frame to mark itself dirty when this |
2152 | | * method is called. |
2153 | | * |
2154 | | * This method must not return a negative value. |
2155 | | */ |
2156 | | virtual nscoord GetMinISize(gfxContext *aRenderingContext) = 0; |
2157 | | |
2158 | | /** |
2159 | | * Get the max-content intrinsic inline size of the frame. This must be |
2160 | | * greater than or equal to the min-content intrinsic inline size. |
2161 | | * |
2162 | | * Otherwise, all the comments for |GetMinISize| above apply. |
2163 | | */ |
2164 | | virtual nscoord GetPrefISize(gfxContext *aRenderingContext) = 0; |
2165 | | |
2166 | | /** |
2167 | | * |InlineIntrinsicISize| represents the intrinsic width information |
2168 | | * in inline layout. Code that determines the intrinsic width of a |
2169 | | * region of inline layout accumulates the result into this structure. |
2170 | | * This pattern is needed because we need to maintain state |
2171 | | * information about whitespace (for both collapsing and trimming). |
2172 | | */ |
2173 | | struct InlineIntrinsicISizeData { |
2174 | | InlineIntrinsicISizeData() |
2175 | | : mLine(nullptr) |
2176 | | , mLineContainer(nullptr) |
2177 | | , mPrevLines(0) |
2178 | | , mCurrentLine(0) |
2179 | | , mTrailingWhitespace(0) |
2180 | | , mSkipWhitespace(true) |
2181 | 0 | {} |
2182 | | |
2183 | | // The line. This may be null if the inlines are not associated with |
2184 | | // a block or if we just don't know the line. |
2185 | | const nsLineList_iterator* mLine; |
2186 | | |
2187 | | // The line container. Private, to ensure we always use SetLineContainer |
2188 | | // to update it. |
2189 | | // |
2190 | | // Note that nsContainerFrame::DoInlineIntrinsicISize will clear the |
2191 | | // |mLine| and |mLineContainer| fields when following a next-in-flow link, |
2192 | | // so we must not assume these can always be dereferenced. |
2193 | | private: |
2194 | | nsIFrame* mLineContainer; |
2195 | | |
2196 | | // Setter and getter for the lineContainer field: |
2197 | | public: |
2198 | | void SetLineContainer(nsIFrame* aLineContainer) |
2199 | 0 | { |
2200 | 0 | mLineContainer = aLineContainer; |
2201 | 0 | } |
2202 | 0 | nsIFrame* LineContainer() const { return mLineContainer; } |
2203 | | |
2204 | | // The maximum intrinsic width for all previous lines. |
2205 | | nscoord mPrevLines; |
2206 | | |
2207 | | // The maximum intrinsic width for the current line. At a line |
2208 | | // break (mandatory for preferred width; allowed for minimum width), |
2209 | | // the caller should call |Break()|. |
2210 | | nscoord mCurrentLine; |
2211 | | |
2212 | | // This contains the width of the trimmable whitespace at the end of |
2213 | | // |mCurrentLine|; it is zero if there is no such whitespace. |
2214 | | nscoord mTrailingWhitespace; |
2215 | | |
2216 | | // True if initial collapsable whitespace should be skipped. This |
2217 | | // should be true at the beginning of a block, after hard breaks |
2218 | | // and when the last text ended with whitespace. |
2219 | | bool mSkipWhitespace; |
2220 | | |
2221 | | // Floats encountered in the lines. |
2222 | | class FloatInfo { |
2223 | | public: |
2224 | | FloatInfo(const nsIFrame* aFrame, nscoord aWidth) |
2225 | | : mFrame(aFrame), mWidth(aWidth) |
2226 | 0 | { } |
2227 | 0 | const nsIFrame* Frame() const { return mFrame; } |
2228 | 0 | nscoord Width() const { return mWidth; } |
2229 | | |
2230 | | private: |
2231 | | const nsIFrame* mFrame; |
2232 | | nscoord mWidth; |
2233 | | }; |
2234 | | |
2235 | | nsTArray<FloatInfo> mFloats; |
2236 | | }; |
2237 | | |
2238 | | struct InlineMinISizeData : public InlineIntrinsicISizeData { |
2239 | | InlineMinISizeData() |
2240 | | : mAtStartOfLine(true) |
2241 | 0 | {} |
2242 | | |
2243 | | // The default implementation for nsIFrame::AddInlineMinISize. |
2244 | | void DefaultAddInlineMinISize(nsIFrame* aFrame, |
2245 | | nscoord aISize, |
2246 | | bool aAllowBreak = true); |
2247 | | |
2248 | | // We need to distinguish forced and optional breaks for cases where the |
2249 | | // current line total is negative. When it is, we need to ignore |
2250 | | // optional breaks to prevent min-width from ending up bigger than |
2251 | | // pref-width. |
2252 | | void ForceBreak(); |
2253 | | |
2254 | | // If the break here is actually taken, aHyphenWidth must be added to the |
2255 | | // width of the current line. |
2256 | | void OptionallyBreak(nscoord aHyphenWidth = 0); |
2257 | | |
2258 | | // Whether we're currently at the start of the line. If we are, we |
2259 | | // can't break (for example, between the text-indent and the first |
2260 | | // word). |
2261 | | bool mAtStartOfLine; |
2262 | | }; |
2263 | | |
2264 | | struct InlinePrefISizeData : public InlineIntrinsicISizeData { |
2265 | | typedef mozilla::StyleClear StyleClear; |
2266 | | |
2267 | | InlinePrefISizeData() |
2268 | | : mLineIsEmpty(true) |
2269 | 0 | {} |
2270 | | |
2271 | | /** |
2272 | | * Finish the current line and start a new line. |
2273 | | * |
2274 | | * @param aBreakType controls whether isize of floats are considered |
2275 | | * and what floats are kept for the next line: |
2276 | | * * |None| skips handling floats, which means no floats are |
2277 | | * removed, and isizes of floats are not considered either. |
2278 | | * * |Both| takes floats into consideration when computing isize |
2279 | | * of the current line, and removes all floats after that. |
2280 | | * * |Left| and |Right| do the same as |Both| except that they only |
2281 | | * remove floats on the given side, and any floats on the other |
2282 | | * side that are prior to a float on the given side that has a |
2283 | | * 'clear' property that clears them. |
2284 | | * All other values of StyleClear must be converted to the four |
2285 | | * physical values above for this function. |
2286 | | */ |
2287 | | void ForceBreak(StyleClear aBreakType = StyleClear::Both); |
2288 | | |
2289 | | // The default implementation for nsIFrame::AddInlinePrefISize. |
2290 | | void DefaultAddInlinePrefISize(nscoord aISize); |
2291 | | |
2292 | | // True if the current line contains nothing other than placeholders. |
2293 | | bool mLineIsEmpty; |
2294 | | }; |
2295 | | |
2296 | | /** |
2297 | | * Add the intrinsic minimum width of a frame in a way suitable for |
2298 | | * use in inline layout to an |InlineIntrinsicISizeData| object that |
2299 | | * represents the intrinsic width information of all the previous |
2300 | | * frames in the inline layout region. |
2301 | | * |
2302 | | * All *allowed* breakpoints within the frame determine what counts as |
2303 | | * a line for the |InlineIntrinsicISizeData|. This means that |
2304 | | * |aData->mTrailingWhitespace| will always be zero (unlike for |
2305 | | * AddInlinePrefISize). |
2306 | | * |
2307 | | * All the comments for |GetMinISize| apply, except that this function |
2308 | | * is responsible for adding padding, border, and margin and for |
2309 | | * considering the effects of 'width', 'min-width', and 'max-width'. |
2310 | | * |
2311 | | * This may be called on any frame. Frames that do not participate in |
2312 | | * line breaking can inherit the default implementation on nsFrame, |
2313 | | * which calls |GetMinISize|. |
2314 | | */ |
2315 | | virtual void |
2316 | | AddInlineMinISize(gfxContext *aRenderingContext, |
2317 | | InlineMinISizeData *aData) = 0; |
2318 | | |
2319 | | /** |
2320 | | * Add the intrinsic preferred width of a frame in a way suitable for |
2321 | | * use in inline layout to an |InlineIntrinsicISizeData| object that |
2322 | | * represents the intrinsic width information of all the previous |
2323 | | * frames in the inline layout region. |
2324 | | * |
2325 | | * All the comments for |AddInlineMinISize| and |GetPrefISize| apply, |
2326 | | * except that this fills in an |InlineIntrinsicISizeData| structure |
2327 | | * based on using all *mandatory* breakpoints within the frame. |
2328 | | */ |
2329 | | virtual void |
2330 | | AddInlinePrefISize(gfxContext *aRenderingContext, |
2331 | | InlinePrefISizeData *aData) = 0; |
2332 | | |
2333 | | /** |
2334 | | * Return the horizontal components of padding, border, and margin |
2335 | | * that contribute to the intrinsic width that applies to the parent. |
2336 | | * @param aPercentageBasis the percentage basis to use for padding/margin - |
2337 | | * i.e. the Containing Block's inline-size |
2338 | | */ |
2339 | | struct IntrinsicISizeOffsetData { |
2340 | | nscoord hPadding, hBorder, hMargin; |
2341 | | |
2342 | | IntrinsicISizeOffsetData() |
2343 | | : hPadding(0), hBorder(0), hMargin(0) |
2344 | 0 | {} |
2345 | | }; |
2346 | | virtual IntrinsicISizeOffsetData |
2347 | | IntrinsicISizeOffsets(nscoord aPercentageBasis = NS_UNCONSTRAINEDSIZE) = 0; |
2348 | | |
2349 | | /** |
2350 | | * Return the bsize components of padding, border, and margin |
2351 | | * that contribute to the intrinsic width that applies to the parent. |
2352 | | * @param aPercentageBasis the percentage basis to use for padding/margin - |
2353 | | * i.e. the Containing Block's inline-size |
2354 | | */ |
2355 | | IntrinsicISizeOffsetData |
2356 | | IntrinsicBSizeOffsets(nscoord aPercentageBasis = NS_UNCONSTRAINEDSIZE); |
2357 | | |
2358 | | virtual mozilla::IntrinsicSize GetIntrinsicSize() = 0; |
2359 | | |
2360 | | /** |
2361 | | * Get the intrinsic ratio of this element, or nsSize(0,0) if it has |
2362 | | * no intrinsic ratio. The intrinsic ratio is the ratio of the |
2363 | | * height/width of a box with an intrinsic size or the intrinsic |
2364 | | * aspect ratio of a scalable vector image without an intrinsic size. |
2365 | | * |
2366 | | * Either one of the sides may be zero, indicating a zero or infinite |
2367 | | * ratio. |
2368 | | */ |
2369 | | virtual nsSize GetIntrinsicRatio() = 0; |
2370 | | |
2371 | | /** |
2372 | | * Bit-flags to pass to ComputeSize in |aFlags| parameter. |
2373 | | */ |
2374 | | enum ComputeSizeFlags { |
2375 | | eDefault = 0, |
2376 | | /** |
2377 | | * Set if the frame is in a context where non-replaced blocks should |
2378 | | * shrink-wrap (e.g., it's floating, absolutely positioned, or |
2379 | | * inline-block). |
2380 | | */ |
2381 | | eShrinkWrap = 1 << 0, |
2382 | | /** |
2383 | | * Set if we'd like to compute our 'auto' bsize, regardless of our actual |
2384 | | * corresponding computed value. (e.g. to get an intrinsic height for flex |
2385 | | * items with "min-height: auto" to use during flexbox layout.) |
2386 | | */ |
2387 | | eUseAutoBSize = 1 << 1, |
2388 | | /** |
2389 | | * Indicates that we should clamp the margin-box min-size to the given CB |
2390 | | * size. This is used for implementing the grid area clamping here: |
2391 | | * https://drafts.csswg.org/css-grid/#min-size-auto |
2392 | | */ |
2393 | | eIClampMarginBoxMinSize = 1 << 2, // clamp in our inline axis |
2394 | | eBClampMarginBoxMinSize = 1 << 3, // clamp in our block axis |
2395 | | /** |
2396 | | * The frame is stretching (per CSS Box Alignment) and doesn't have an |
2397 | | * Automatic Minimum Size in the indicated axis. |
2398 | | * (may be used for both flex/grid items, but currently only used for Grid) |
2399 | | * https://drafts.csswg.org/css-grid/#min-size-auto |
2400 | | * https://drafts.csswg.org/css-align-3/#valdef-justify-self-stretch |
2401 | | */ |
2402 | | eIApplyAutoMinSize = 1 << 4, // only has an effect when eShrinkWrap is false |
2403 | | }; |
2404 | | |
2405 | | /** |
2406 | | * Compute the size that a frame will occupy. Called while |
2407 | | * constructing the ReflowInput to be used to Reflow the frame, |
2408 | | * in order to fill its mComputedWidth and mComputedHeight member |
2409 | | * variables. |
2410 | | * |
2411 | | * The |height| member of the return value may be |
2412 | | * NS_UNCONSTRAINEDSIZE, but the |width| member must not be. |
2413 | | * |
2414 | | * Note that the reason that border and padding need to be passed |
2415 | | * separately is so that the 'box-sizing' property can be handled. |
2416 | | * Thus aMargin includes absolute positioning offsets as well. |
2417 | | * |
2418 | | * @param aWritingMode The writing mode to use for the returned size |
2419 | | * (need not match this frame's writing mode). |
2420 | | * This is also the writing mode of the passed-in |
2421 | | * LogicalSize parameters. |
2422 | | * @param aCBSize The size of the element's containing block. (Well, |
2423 | | * the |height| component isn't really.) |
2424 | | * @param aAvailableWidth The available width for 'auto' widths. |
2425 | | * This is usually the same as aCBSize.width, |
2426 | | * but differs in cases such as block |
2427 | | * formatting context roots next to floats, or |
2428 | | * in some cases of float reflow in quirks |
2429 | | * mode. |
2430 | | * @param aMargin The sum of the vertical / horizontal margins |
2431 | | * ***AND*** absolute positioning offsets (top, right, |
2432 | | * bottom, left) of the frame, including actual values |
2433 | | * resulting from percentages and from the |
2434 | | * "hypothetical box" for absolute positioning, but |
2435 | | * not including actual values resulting from 'auto' |
2436 | | * margins or ignored 'auto' values in absolute |
2437 | | * positioning. |
2438 | | * @param aBorder The sum of the vertical / horizontal border widths |
2439 | | * of the frame. |
2440 | | * @param aPadding The sum of the vertical / horizontal margins of |
2441 | | * the frame, including actual values resulting from |
2442 | | * percentages. |
2443 | | * @param aFlags Flags to further customize behavior (definitions above). |
2444 | | */ |
2445 | | virtual mozilla::LogicalSize |
2446 | | ComputeSize(gfxContext *aRenderingContext, |
2447 | | mozilla::WritingMode aWritingMode, |
2448 | | const mozilla::LogicalSize& aCBSize, |
2449 | | nscoord aAvailableISize, |
2450 | | const mozilla::LogicalSize& aMargin, |
2451 | | const mozilla::LogicalSize& aBorder, |
2452 | | const mozilla::LogicalSize& aPadding, |
2453 | | ComputeSizeFlags aFlags) = 0; |
2454 | | |
2455 | | /** |
2456 | | * Compute a tight bounding rectangle for the frame. This is a rectangle |
2457 | | * that encloses the pixels that are actually drawn. We're allowed to be |
2458 | | * conservative and currently we don't try very hard. The rectangle is |
2459 | | * in appunits and relative to the origin of this frame. |
2460 | | * |
2461 | | * This probably only needs to include frame bounds, glyph bounds, and |
2462 | | * text decorations, but today it sometimes includes other things that |
2463 | | * contribute to visual overflow. |
2464 | | * |
2465 | | * @param aDrawTarget a draw target that can be used if we need |
2466 | | * to do measurement |
2467 | | */ |
2468 | | virtual nsRect ComputeTightBounds(DrawTarget* aDrawTarget) const; |
2469 | | |
2470 | | /** |
2471 | | * This function is similar to GetPrefISize and ComputeTightBounds: it |
2472 | | * computes the left and right coordinates of a preferred tight bounding |
2473 | | * rectangle for the frame. This is a rectangle that would enclose the pixels |
2474 | | * that are drawn if we lay out the element without taking any optional line |
2475 | | * breaks. The rectangle is in appunits and relative to the origin of this |
2476 | | * frame. Currently, this function is only implemented for nsBlockFrame and |
2477 | | * nsTextFrame and is used to determine intrinsic widths of MathML token |
2478 | | * elements. |
2479 | | |
2480 | | * @param aContext a rendering context that can be used if we need |
2481 | | * to do measurement |
2482 | | * @param aX computed left coordinate of the tight bounding rectangle |
2483 | | * @param aXMost computed intrinsic width of the tight bounding rectangle |
2484 | | * |
2485 | | */ |
2486 | | virtual nsresult GetPrefWidthTightBounds(gfxContext* aContext, |
2487 | | nscoord* aX, |
2488 | | nscoord* aXMost); |
2489 | | |
2490 | | /** |
2491 | | * The frame is given an available size and asked for its desired |
2492 | | * size. This is the frame's opportunity to reflow its children. |
2493 | | * |
2494 | | * If the frame has the NS_FRAME_IS_DIRTY bit set then it is |
2495 | | * responsible for completely reflowing itself and all of its |
2496 | | * descendants. |
2497 | | * |
2498 | | * Otherwise, if the frame has the NS_FRAME_HAS_DIRTY_CHILDREN bit |
2499 | | * set, then it is responsible for reflowing at least those |
2500 | | * children that have NS_FRAME_HAS_DIRTY_CHILDREN or NS_FRAME_IS_DIRTY |
2501 | | * set. |
2502 | | * |
2503 | | * If a difference in available size from the previous reflow causes |
2504 | | * the frame's size to change, it should reflow descendants as needed. |
2505 | | * |
2506 | | * @param aReflowOutput <i>out</i> parameter where you should return the |
2507 | | * desired size and ascent/descent info. You should include any |
2508 | | * space you want for border/padding in the desired size you return. |
2509 | | * |
2510 | | * It's okay to return a desired size that exceeds the avail |
2511 | | * size if that's the smallest you can be, i.e. it's your |
2512 | | * minimum size. |
2513 | | * |
2514 | | * For an incremental reflow you are responsible for invalidating |
2515 | | * any area within your frame that needs repainting (including |
2516 | | * borders). If your new desired size is different than your current |
2517 | | * size, then your parent frame is responsible for making sure that |
2518 | | * the difference between the two rects is repainted |
2519 | | * |
2520 | | * @param aReflowInput information about your reflow including the reason |
2521 | | * for the reflow and the available space in which to lay out. Each |
2522 | | * dimension of the available space can either be constrained or |
2523 | | * unconstrained (a value of NS_UNCONSTRAINEDSIZE). |
2524 | | * |
2525 | | * Note that the available space can be negative. In this case you |
2526 | | * still must return an accurate desired size. If you're a container |
2527 | | * you must <b>always</b> reflow at least one frame regardless of the |
2528 | | * available space |
2529 | | * |
2530 | | * @param aStatus a return value indicating whether the frame is complete |
2531 | | * and whether the next-in-flow is dirty and needs to be reflowed |
2532 | | */ |
2533 | | virtual void Reflow(nsPresContext* aPresContext, |
2534 | | ReflowOutput& aReflowOutput, |
2535 | | const ReflowInput& aReflowInput, |
2536 | | nsReflowStatus& aStatus) = 0; |
2537 | | |
2538 | | /** |
2539 | | * Post-reflow hook. After a frame is reflowed this method will be called |
2540 | | * informing the frame that this reflow process is complete, and telling the |
2541 | | * frame the status returned by the Reflow member function. |
2542 | | * |
2543 | | * This call may be invoked many times, while NS_FRAME_IN_REFLOW is set, before |
2544 | | * it is finally called once with a NS_FRAME_REFLOW_COMPLETE value. When called |
2545 | | * with a NS_FRAME_REFLOW_COMPLETE value the NS_FRAME_IN_REFLOW bit in the |
2546 | | * frame state will be cleared. |
2547 | | * |
2548 | | * XXX This doesn't make sense. If the frame is reflowed but not complete, then |
2549 | | * the status should have IsIncomplete() equal to true. |
2550 | | * XXX Don't we want the semantics to dictate that we only call this once for |
2551 | | * a given reflow? |
2552 | | */ |
2553 | | virtual void DidReflow(nsPresContext* aPresContext, |
2554 | | const ReflowInput* aReflowInput) = 0; |
2555 | | |
2556 | | /** |
2557 | | * Updates the overflow areas of the frame. This can be called if an |
2558 | | * overflow area of the frame's children has changed without reflowing. |
2559 | | * @return true if either of the overflow areas for this frame have changed. |
2560 | | */ |
2561 | | bool UpdateOverflow(); |
2562 | | |
2563 | | /** |
2564 | | * Computes any overflow area created by the frame itself (outside of the |
2565 | | * frame bounds) and includes it into aOverflowAreas. |
2566 | | * |
2567 | | * Returns false if updating overflow isn't supported for this frame. |
2568 | | * If the frame requires a reflow instead, then it is responsible |
2569 | | * for scheduling one. |
2570 | | */ |
2571 | | virtual bool ComputeCustomOverflow(nsOverflowAreas& aOverflowAreas) = 0; |
2572 | | |
2573 | | /** |
2574 | | * Computes any overflow area created by children of this frame and |
2575 | | * includes it into aOverflowAreas. |
2576 | | */ |
2577 | | virtual void UnionChildOverflow(nsOverflowAreas& aOverflowAreas) = 0; |
2578 | | |
2579 | | /** |
2580 | | * Helper method used by block reflow to identify runs of text so |
2581 | | * that proper word-breaking can be done. |
2582 | | * |
2583 | | * @return |
2584 | | * true if we can continue a "text run" through the frame. A |
2585 | | * text run is text that should be treated contiguously for line |
2586 | | * and word breaking. |
2587 | | */ |
2588 | | virtual bool CanContinueTextRun() const = 0; |
2589 | | |
2590 | | /** |
2591 | | * Computes an approximation of the rendered text of the frame and its |
2592 | | * continuations. Returns nothing for non-text frames. |
2593 | | * The appended text will often not contain all the whitespace from source, |
2594 | | * depending on CSS white-space processing. |
2595 | | * if aEndOffset goes past end, use the text up to the string's end. |
2596 | | * Call this on the primary frame for a text node. |
2597 | | * aStartOffset and aEndOffset can be content offsets or offsets in the |
2598 | | * rendered text, depending on aOffsetType. |
2599 | | * Returns a string, as well as offsets identifying the start of the text |
2600 | | * within the rendered text for the whole node, and within the text content |
2601 | | * of the node. |
2602 | | */ |
2603 | | struct RenderedText { |
2604 | | nsAutoString mString; |
2605 | | uint32_t mOffsetWithinNodeRenderedText; |
2606 | | int32_t mOffsetWithinNodeText; |
2607 | | RenderedText() : mOffsetWithinNodeRenderedText(0), |
2608 | 0 | mOffsetWithinNodeText(0) {} |
2609 | | }; |
2610 | | enum class TextOffsetType { |
2611 | | // Passed-in start and end offsets are within the content text. |
2612 | | OFFSETS_IN_CONTENT_TEXT, |
2613 | | // Passed-in start and end offsets are within the rendered text. |
2614 | | OFFSETS_IN_RENDERED_TEXT |
2615 | | }; |
2616 | | enum class TrailingWhitespace { |
2617 | | TRIM_TRAILING_WHITESPACE, |
2618 | | // Spaces preceding a caret at the end of a line should not be trimmed |
2619 | | DONT_TRIM_TRAILING_WHITESPACE |
2620 | | }; |
2621 | | virtual RenderedText GetRenderedText(uint32_t aStartOffset = 0, |
2622 | | uint32_t aEndOffset = UINT32_MAX, |
2623 | | TextOffsetType aOffsetType = |
2624 | | TextOffsetType::OFFSETS_IN_CONTENT_TEXT, |
2625 | | TrailingWhitespace aTrimTrailingWhitespace = |
2626 | | TrailingWhitespace::TRIM_TRAILING_WHITESPACE) |
2627 | 0 | { return RenderedText(); } |
2628 | | |
2629 | | /** |
2630 | | * Returns true if the frame contains any non-collapsed characters. |
2631 | | * This method is only available for text frames, and it will return false |
2632 | | * for all other frame types. |
2633 | | */ |
2634 | | virtual bool HasAnyNoncollapsedCharacters() |
2635 | 0 | { return false; } |
2636 | | |
2637 | | /** |
2638 | | * Returns true if events of the given type targeted at this frame |
2639 | | * should only be dispatched to the system group. |
2640 | | */ |
2641 | | virtual bool OnlySystemGroupDispatch(mozilla::EventMessage aMessage) const |
2642 | 0 | { return false; } |
2643 | | |
2644 | | // |
2645 | | // Accessor functions to an associated view object: |
2646 | | // |
2647 | | bool HasView() const { return !!(mState & NS_FRAME_HAS_VIEW); } |
2648 | | protected: |
2649 | | virtual nsView* GetViewInternal() const |
2650 | 0 | { |
2651 | 0 | MOZ_ASSERT_UNREACHABLE("method should have been overridden by subclass"); |
2652 | 0 | return nullptr; |
2653 | 0 | } |
2654 | | virtual void SetViewInternal(nsView* aView) |
2655 | 0 | { |
2656 | 0 | MOZ_ASSERT_UNREACHABLE("method should have been overridden by subclass"); |
2657 | 0 | } |
2658 | | public: |
2659 | | nsView* GetView() const |
2660 | | { |
2661 | | if (MOZ_LIKELY(!HasView())) { |
2662 | | return nullptr; |
2663 | | } |
2664 | | nsView* view = GetViewInternal(); |
2665 | | MOZ_ASSERT(view, "GetViewInternal() should agree with HasView()"); |
2666 | | return view; |
2667 | | } |
2668 | | void SetView(nsView* aView); |
2669 | | |
2670 | | /** |
2671 | | * Find the closest view (on |this| or an ancestor). |
2672 | | * If aOffset is non-null, it will be set to the offset of |this| |
2673 | | * from the returned view. |
2674 | | */ |
2675 | | nsView* GetClosestView(nsPoint* aOffset = nullptr) const; |
2676 | | |
2677 | | /** |
2678 | | * Find the closest ancestor (excluding |this| !) that has a view |
2679 | | */ |
2680 | | nsIFrame* GetAncestorWithView() const; |
2681 | | |
2682 | | /** |
2683 | | * Sets the view's attributes from the frame style. |
2684 | | * Call this for nsChangeHint_SyncFrameView style changes or when the view |
2685 | | * has just been created. |
2686 | | * @param aView the frame's view or use GetView() if nullptr is given |
2687 | | */ |
2688 | | void SyncFrameViewProperties(nsView* aView = nullptr); |
2689 | | |
2690 | | /** |
2691 | | * Get the offset between the coordinate systems of |this| and aOther. |
2692 | | * Adding the return value to a point in the coordinate system of |this| |
2693 | | * will transform the point to the coordinate system of aOther. |
2694 | | * |
2695 | | * aOther must be non-null. |
2696 | | * |
2697 | | * This function is fastest when aOther is an ancestor of |this|. |
2698 | | * |
2699 | | * This function _DOES NOT_ work across document boundaries. |
2700 | | * Use this function only when |this| and aOther are in the same document. |
2701 | | * |
2702 | | * NOTE: this actually returns the offset from aOther to |this|, but |
2703 | | * that offset is added to transform _coordinates_ from |this| to |
2704 | | * aOther. |
2705 | | */ |
2706 | | nsPoint GetOffsetTo(const nsIFrame* aOther) const; |
2707 | | |
2708 | | /** |
2709 | | * Just like GetOffsetTo, but treats all scrollframes as scrolled to |
2710 | | * their origin. |
2711 | | */ |
2712 | | nsPoint GetOffsetToIgnoringScrolling(const nsIFrame* aOther) const; |
2713 | | |
2714 | | /** |
2715 | | * Get the offset between the coordinate systems of |this| and aOther |
2716 | | * expressed in appunits per dev pixel of |this|' document. Adding the return |
2717 | | * value to a point that is relative to the origin of |this| will make the |
2718 | | * point relative to the origin of aOther but in the appunits per dev pixel |
2719 | | * ratio of |this|. |
2720 | | * |
2721 | | * aOther must be non-null. |
2722 | | * |
2723 | | * This function is fastest when aOther is an ancestor of |this|. |
2724 | | * |
2725 | | * This function works across document boundaries. |
2726 | | * |
2727 | | * Because this function may cross document boundaries that have different |
2728 | | * app units per dev pixel ratios it needs to be used very carefully. |
2729 | | * |
2730 | | * NOTE: this actually returns the offset from aOther to |this|, but |
2731 | | * that offset is added to transform _coordinates_ from |this| to |
2732 | | * aOther. |
2733 | | */ |
2734 | | nsPoint GetOffsetToCrossDoc(const nsIFrame* aOther) const; |
2735 | | |
2736 | | /** |
2737 | | * Like GetOffsetToCrossDoc, but the caller can specify which appunits |
2738 | | * to return the result in. |
2739 | | */ |
2740 | | nsPoint GetOffsetToCrossDoc(const nsIFrame* aOther, const int32_t aAPD) const; |
2741 | | |
2742 | | /** |
2743 | | * Get the rect of the frame relative to the top-left corner of the |
2744 | | * screen in CSS pixels. |
2745 | | * @return the CSS pixel rect of the frame relative to the top-left |
2746 | | * corner of the screen. |
2747 | | */ |
2748 | | mozilla::CSSIntRect GetScreenRect() const; |
2749 | | |
2750 | | /** |
2751 | | * Get the screen rect of the frame in app units. |
2752 | | * @return the app unit rect of the frame in screen coordinates. |
2753 | | */ |
2754 | | nsRect GetScreenRectInAppUnits() const; |
2755 | | |
2756 | | /** |
2757 | | * Returns the offset from this frame to the closest geometric parent that |
2758 | | * has a view. Also returns the containing view or null in case of error |
2759 | | */ |
2760 | | void GetOffsetFromView(nsPoint& aOffset, nsView** aView) const; |
2761 | | |
2762 | | /** |
2763 | | * Returns the nearest widget containing this frame. If this frame has a |
2764 | | * view and the view has a widget, then this frame's widget is |
2765 | | * returned, otherwise this frame's geometric parent is checked |
2766 | | * recursively upwards. |
2767 | | */ |
2768 | | nsIWidget* GetNearestWidget() const; |
2769 | | |
2770 | | /** |
2771 | | * Same as GetNearestWidget() above but uses an outparam to return the offset |
2772 | | * of this frame to the returned widget expressed in appunits of |this| (the |
2773 | | * widget might be in a different document with a different zoom). |
2774 | | */ |
2775 | | nsIWidget* GetNearestWidget(nsPoint& aOffset) const; |
2776 | | |
2777 | | /** |
2778 | | * Whether the content for this frame is disabled, used for event handling. |
2779 | | */ |
2780 | | bool IsContentDisabled() const; |
2781 | | |
2782 | | /** |
2783 | | * Get the "type" of the frame. |
2784 | | * |
2785 | | * @see mozilla::LayoutFrameType |
2786 | | */ |
2787 | | mozilla::LayoutFrameType Type() const { |
2788 | | MOZ_ASSERT(uint8_t(mClass) < mozilla::ArrayLength(sLayoutFrameTypes)); |
2789 | | return sLayoutFrameTypes[uint8_t(mClass)]; |
2790 | | } |
2791 | | |
2792 | | #define FRAME_TYPE(name_) \ |
2793 | | bool Is##name_##Frame() const \ |
2794 | 0 | { \ |
2795 | 0 | return Type() == mozilla::LayoutFrameType::name_; \ |
2796 | 0 | } Unexecuted instantiation: nsIFrame::IsBackdropFrame() const Unexecuted instantiation: nsIFrame::IsBoxFrame() const Unexecuted instantiation: nsIFrame::IsCanvasFrame() const Unexecuted instantiation: nsIFrame::IsColumnSetFrame() const Unexecuted instantiation: nsIFrame::IsComboboxControlFrame() const Unexecuted instantiation: nsIFrame::IsDeckFrame() const Unexecuted instantiation: nsIFrame::IsDetailsFrame() const Unexecuted instantiation: nsIFrame::IsFieldSetFrame() const Unexecuted instantiation: nsIFrame::IsFrameSetFrame() const Unexecuted instantiation: nsIFrame::IsImageFrame() const Unexecuted instantiation: nsIFrame::IsImageBoxFrame() const Unexecuted instantiation: nsIFrame::IsLegendFrame() const Unexecuted instantiation: nsIFrame::IsLetterFrame() const Unexecuted instantiation: nsIFrame::IsLineFrame() const Unexecuted instantiation: nsIFrame::IsListControlFrame() const Unexecuted instantiation: nsIFrame::IsObjectFrame() const Unexecuted instantiation: nsIFrame::IsPopupSetFrame() const Unexecuted instantiation: nsIFrame::IsRangeFrame() const Unexecuted instantiation: nsIFrame::IsRootFrame() const Unexecuted instantiation: nsIFrame::IsRubyFrame() const Unexecuted instantiation: nsIFrame::IsRubyBaseFrame() const Unexecuted instantiation: nsIFrame::IsRubyBaseContainerFrame() const Unexecuted instantiation: nsIFrame::IsRubyTextFrame() const Unexecuted instantiation: nsIFrame::IsRubyTextContainerFrame() const Unexecuted instantiation: nsIFrame::IsScrollFrame() const Unexecuted instantiation: nsIFrame::IsSubDocumentFrame() const Unexecuted instantiation: nsIFrame::IsSVGAFrame() const Unexecuted instantiation: nsIFrame::IsSVGFilterFrame() const Unexecuted instantiation: nsIFrame::IsSVGForeignObjectFrame() const Unexecuted instantiation: nsIFrame::IsSVGFEContainerFrame() const Unexecuted instantiation: nsIFrame::IsSVGGeometryFrame() const Unexecuted instantiation: nsIFrame::IsSVGLinearGradientFrame() const Unexecuted instantiation: nsIFrame::IsSVGRadialGradientFrame() const Unexecuted instantiation: nsIFrame::IsSVGStopFrame() const Unexecuted instantiation: nsIFrame::IsSVGTextFrame() const Unexecuted instantiation: nsIFrame::IsSVGUseFrame() const Unexecuted instantiation: nsIFrame::IsTableFrame() const Unexecuted instantiation: nsIFrame::IsTableCellFrame() const Unexecuted instantiation: nsIFrame::IsTableColGroupFrame() const Unexecuted instantiation: nsIFrame::IsTableWrapperFrame() const |
2797 | | #include "mozilla/FrameTypeList.h" |
2798 | | #undef FRAME_TYPE |
2799 | | |
2800 | | /** |
2801 | | * Returns a transformation matrix that converts points in this frame's |
2802 | | * coordinate space to points in some ancestor frame's coordinate space. |
2803 | | * The frame decides which ancestor it will use as a reference point. |
2804 | | * If this frame has no ancestor, aOutAncestor will be set to null. |
2805 | | * |
2806 | | * @param aStopAtAncestor don't look further than aStopAtAncestor. If null, |
2807 | | * all ancestors (including across documents) will be traversed. |
2808 | | * @param aOutAncestor [out] The ancestor frame the frame has chosen. If |
2809 | | * this frame has no ancestor, *aOutAncestor will be set to null. If |
2810 | | * this frame is not a root frame, then *aOutAncestor will be in the same |
2811 | | * document as this frame. If this frame IsTransformed(), then *aOutAncestor |
2812 | | * will be the parent frame (if not preserve-3d) or the nearest non-transformed |
2813 | | * ancestor (if preserve-3d). |
2814 | | * @return A Matrix4x4 that converts points in this frame's coordinate space |
2815 | | * into points in aOutAncestor's coordinate space. |
2816 | | */ |
2817 | | enum { |
2818 | | IN_CSS_UNITS = 1 << 0, |
2819 | | STOP_AT_STACKING_CONTEXT_AND_DISPLAY_PORT = 1 << 1 |
2820 | | }; |
2821 | | Matrix4x4Flagged GetTransformMatrix(const nsIFrame* aStopAtAncestor, |
2822 | | nsIFrame **aOutAncestor, |
2823 | | uint32_t aFlags = 0) const; |
2824 | | |
2825 | | /** |
2826 | | * Bit-flags to pass to IsFrameOfType() |
2827 | | */ |
2828 | | enum { |
2829 | | eMathML = 1 << 0, |
2830 | | eSVG = 1 << 1, |
2831 | | eSVGForeignObject = 1 << 2, |
2832 | | eSVGContainer = 1 << 3, |
2833 | | eSVGGeometry = 1 << 4, |
2834 | | eSVGPaintServer = 1 << 5, |
2835 | | eBidiInlineContainer = 1 << 6, |
2836 | | // the frame is for a replaced element, such as an image |
2837 | | eReplaced = 1 << 7, |
2838 | | // Frame that contains a block but looks like a replaced element |
2839 | | // from the outside |
2840 | | eReplacedContainsBlock = 1 << 8, |
2841 | | // A frame that participates in inline reflow, i.e., one that |
2842 | | // requires ReflowInput::mLineLayout. |
2843 | | eLineParticipant = 1 << 9, |
2844 | | eXULBox = 1 << 10, |
2845 | | eCanContainOverflowContainers = 1 << 11, |
2846 | | eBlockFrame = 1 << 12, |
2847 | | eTablePart = 1 << 13, |
2848 | | // If this bit is set, the frame doesn't allow ignorable whitespace as |
2849 | | // children. For example, the whitespace between <table>\n<tr>\n<td> |
2850 | | // will be excluded during the construction of children. |
2851 | | eExcludesIgnorableWhitespace = 1 << 14, |
2852 | | eSupportsCSSTransforms = 1 << 15, |
2853 | | |
2854 | | // A replaced element that has replaced-element sizing |
2855 | | // characteristics (i.e., like images or iframes), as opposed to |
2856 | | // inline-block sizing characteristics (like form controls). |
2857 | | eReplacedSizing = 1 << 16, |
2858 | | |
2859 | | // Does this frame class support 'contain: layout' and |
2860 | | // 'contain:paint' (supporting one is equivalent to supporting the |
2861 | | // other). |
2862 | | eSupportsContainLayoutAndPaint = 1 << 17, |
2863 | | |
2864 | | // These are to allow nsFrame::Init to assert that IsFrameOfType |
2865 | | // implementations all call the base class method. They are only |
2866 | | // meaningful in DEBUG builds. |
2867 | | eDEBUGAllFrames = 1 << 30, |
2868 | | eDEBUGNoFrames = 1 << 31 |
2869 | | }; |
2870 | | |
2871 | | /** |
2872 | | * API for doing a quick check if a frame is of a given |
2873 | | * type. Returns true if the frame matches ALL flags passed in. |
2874 | | * |
2875 | | * Implementations should always override with inline virtual |
2876 | | * functions that call the base class's IsFrameOfType method. |
2877 | | */ |
2878 | | virtual bool IsFrameOfType(uint32_t aFlags) const |
2879 | 0 | { |
2880 | 0 | return !(aFlags & ~( |
2881 | | #ifdef DEBUG |
2882 | | nsIFrame::eDEBUGAllFrames | |
2883 | | #endif |
2884 | | nsIFrame::eSupportsCSSTransforms | |
2885 | 0 | nsIFrame::eSupportsContainLayoutAndPaint |
2886 | 0 | )); |
2887 | 0 | } |
2888 | | |
2889 | | /** |
2890 | | * Returns true if the frame is a block wrapper. |
2891 | | */ |
2892 | | bool IsBlockWrapper() const; |
2893 | | |
2894 | | /** |
2895 | | * Get this frame's CSS containing block. |
2896 | | * |
2897 | | * The algorithm is defined in |
2898 | | * http://www.w3.org/TR/CSS2/visudet.html#containing-block-details. |
2899 | | * |
2900 | | * NOTE: This is guaranteed to return a non-null pointer when invoked on any |
2901 | | * frame other than the root frame. |
2902 | | * |
2903 | | * Requires SKIP_SCROLLED_FRAME to get behaviour matching the spec, otherwise |
2904 | | * it can return anonymous inner scrolled frames. Bug 1204044 is filed for |
2905 | | * investigating whether any of the callers actually require the default |
2906 | | * behaviour. |
2907 | | */ |
2908 | | enum { |
2909 | | // If the containing block is an anonymous scrolled frame, then skip over |
2910 | | // this and return the outer scroll frame. |
2911 | | SKIP_SCROLLED_FRAME = 0x01 |
2912 | | }; |
2913 | | nsIFrame* GetContainingBlock(uint32_t aFlags, |
2914 | | const nsStyleDisplay* aStyleDisplay) const; |
2915 | | nsIFrame* GetContainingBlock(uint32_t aFlags = 0) const { |
2916 | | return GetContainingBlock(aFlags, StyleDisplay()); |
2917 | | } |
2918 | | |
2919 | | /** |
2920 | | * Is this frame a containing block for floating elements? |
2921 | | * Note that very few frames are, so default to false. |
2922 | | */ |
2923 | 0 | virtual bool IsFloatContainingBlock() const { return false; } |
2924 | | |
2925 | | /** |
2926 | | * Is this a leaf frame? Frames that want the frame constructor to be able |
2927 | | * to construct kids for them should return false, all others should return |
2928 | | * true. Note that returning true here does not mean that the frame _can't_ |
2929 | | * have kids. It could still have kids created via |
2930 | | * nsIAnonymousContentCreator. Returning true indicates that "normal" |
2931 | | * (non-anonymous, XBL-bound, CSS generated content, etc) children should not |
2932 | | * be constructed. |
2933 | | */ |
2934 | | bool IsLeaf() const |
2935 | 0 | { |
2936 | 0 | MOZ_ASSERT(uint8_t(mClass) < mozilla::ArrayLength(sFrameClassBits)); |
2937 | 0 | FrameClassBits bits = sFrameClassBits[uint8_t(mClass)]; |
2938 | 0 | if (MOZ_UNLIKELY(bits & eFrameClassBitsDynamicLeaf)) { |
2939 | 0 | return IsLeafDynamic(); |
2940 | 0 | } |
2941 | 0 | return bits & eFrameClassBitsLeaf; |
2942 | 0 | } |
2943 | | |
2944 | | /** |
2945 | | * Marks all display items created by this frame as needing a repaint, |
2946 | | * and calls SchedulePaint() if requested and one is not already pending. |
2947 | | * |
2948 | | * This includes all display items created by this frame, including |
2949 | | * container types. |
2950 | | * |
2951 | | * @param aDisplayItemKey If specified, only issues an invalidate |
2952 | | * if this frame painted a display item of that type during the |
2953 | | * previous paint. SVG rendering observers are always notified. |
2954 | | * @param aRebuildDisplayItems If true, then adds this frame to the |
2955 | | * list of modified frames for display list building. Only pass false |
2956 | | * if you're sure that the relevant display items will be rebuilt |
2957 | | * already (possibly by an ancestor being in the modified list). |
2958 | | */ |
2959 | | virtual void InvalidateFrame(uint32_t aDisplayItemKey = 0, bool aRebuildDisplayItems = true); |
2960 | | |
2961 | | /** |
2962 | | * Same as InvalidateFrame(), but only mark a fixed rect as needing |
2963 | | * repainting. |
2964 | | * |
2965 | | * @param aRect The rect to invalidate, relative to the TopLeft of the |
2966 | | * frame's border box. |
2967 | | * @param aDisplayItemKey If specified, only issues an invalidate |
2968 | | * if this frame painted a display item of that type during the |
2969 | | * previous paint. SVG rendering observers are always notified. |
2970 | | * @param aRebuildDisplayItems If true, then adds this frame to the |
2971 | | * list of modified frames for display list building. Only pass false |
2972 | | * if you're sure that the relevant display items will be rebuilt |
2973 | | * already (possibly by an ancestor being in the modified list). |
2974 | | */ |
2975 | | virtual void InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey = 0, bool aRebuildDisplayItems = true); |
2976 | | |
2977 | | /** |
2978 | | * Calls InvalidateFrame() on all frames descendant frames (including |
2979 | | * this one). |
2980 | | * |
2981 | | * This function doesn't walk through placeholder frames to invalidate |
2982 | | * the out-of-flow frames. |
2983 | | * |
2984 | | * @param aRebuildDisplayItems If true, then adds this frame to the |
2985 | | * list of modified frames for display list building. Only pass false |
2986 | | * if you're sure that the relevant display items will be rebuilt |
2987 | | * already (possibly by an ancestor being in the modified list). |
2988 | | */ |
2989 | | void InvalidateFrameSubtree(bool aRebuildDisplayItems = true); |
2990 | | |
2991 | | /** |
2992 | | * Called when a frame is about to be removed and needs to be invalidated. |
2993 | | * Normally does nothing since DLBI handles removed frames. |
2994 | | */ |
2995 | 0 | virtual void InvalidateFrameForRemoval() {} |
2996 | | |
2997 | | /** |
2998 | | * When HasUserData(frame->LayerIsPrerenderedDataKey()), then the |
2999 | | * entire overflow area of this frame has been rendered in its |
3000 | | * layer(s). |
3001 | | */ |
3002 | 0 | static void* LayerIsPrerenderedDataKey() { |
3003 | 0 | return &sLayerIsPrerenderedDataKey; |
3004 | 0 | } |
3005 | | static uint8_t sLayerIsPrerenderedDataKey; |
3006 | | |
3007 | | /** |
3008 | | * Try to update this frame's transform without invalidating any |
3009 | | * content. Return true iff successful. If unsuccessful, the |
3010 | | * caller is responsible for scheduling an invalidating paint. |
3011 | | * |
3012 | | * If the result is true, aLayerResult will be filled in with the |
3013 | | * transform layer for the frame. |
3014 | | */ |
3015 | | bool TryUpdateTransformOnly(Layer** aLayerResult); |
3016 | | |
3017 | | /** |
3018 | | * Checks if a frame has had InvalidateFrame() called on it since the |
3019 | | * last paint. |
3020 | | * |
3021 | | * If true, then the invalid rect is returned in aRect, with an |
3022 | | * empty rect meaning all pixels drawn by this frame should be |
3023 | | * invalidated. |
3024 | | * If false, aRect is left unchanged. |
3025 | | */ |
3026 | | bool IsInvalid(nsRect& aRect); |
3027 | | |
3028 | | /** |
3029 | | * Check if any frame within the frame subtree (including this frame) |
3030 | | * returns true for IsInvalid(). |
3031 | | */ |
3032 | | bool HasInvalidFrameInSubtree() |
3033 | 0 | { |
3034 | 0 | return HasAnyStateBits(NS_FRAME_NEEDS_PAINT | NS_FRAME_DESCENDANT_NEEDS_PAINT); |
3035 | 0 | } |
3036 | | |
3037 | | /** |
3038 | | * Removes the invalid state from the current frame and all |
3039 | | * descendant frames. |
3040 | | */ |
3041 | | void ClearInvalidationStateBits(); |
3042 | | |
3043 | | /** |
3044 | | * Ensures that the refresh driver is running, and schedules a view |
3045 | | * manager flush on the next tick. |
3046 | | * |
3047 | | * The view manager flush will update the layer tree, repaint any |
3048 | | * invalid areas in the layer tree and schedule a layer tree |
3049 | | * composite operation to display the layer tree. |
3050 | | * |
3051 | | * In general it is not necessary for frames to call this when they change. |
3052 | | * For example, changes that result in a reflow will have this called for |
3053 | | * them by PresContext::DoReflow when the reflow begins. Style changes that |
3054 | | * do not trigger a reflow should have this called for them by |
3055 | | * DoApplyRenderingChangeToTree. |
3056 | | * |
3057 | | * @param aType PAINT_COMPOSITE_ONLY : No changes have been made |
3058 | | * that require a layer tree update, so only schedule a layer |
3059 | | * tree composite. |
3060 | | * PAINT_DELAYED_COMPRESS : Schedule a paint to be executed after a delay, and |
3061 | | * put FrameLayerBuilder in 'compressed' mode that avoids short cut optimizations. |
3062 | | */ |
3063 | | enum PaintType { |
3064 | | PAINT_DEFAULT = 0, |
3065 | | PAINT_COMPOSITE_ONLY, |
3066 | | PAINT_DELAYED_COMPRESS |
3067 | | }; |
3068 | | void SchedulePaint(PaintType aType = PAINT_DEFAULT, bool aFrameChanged = true); |
3069 | | |
3070 | | // Similar to SchedulePaint() but without calling |
3071 | | // InvalidateRenderingObservers() for SVG. |
3072 | | void SchedulePaintWithoutInvalidatingObservers( |
3073 | | PaintType aType = PAINT_DEFAULT); |
3074 | | |
3075 | | /** |
3076 | | * Checks if the layer tree includes a dedicated layer for this |
3077 | | * frame/display item key pair, and invalidates at least aDamageRect |
3078 | | * area within that layer. |
3079 | | * |
3080 | | * If no layer is found, calls InvalidateFrame() instead. |
3081 | | * |
3082 | | * @param aDamageRect Area of the layer to invalidate. |
3083 | | * @param aFrameDamageRect If no layer is found, the area of the frame to |
3084 | | * invalidate. If null, the entire frame will be |
3085 | | * invalidated. |
3086 | | * @param aDisplayItemKey Display item type. |
3087 | | * @param aFlags UPDATE_IS_ASYNC : Will skip the invalidation |
3088 | | * if the found layer is being composited by a remote |
3089 | | * compositor. |
3090 | | * @return Layer, if found, nullptr otherwise. |
3091 | | */ |
3092 | | enum { |
3093 | | UPDATE_IS_ASYNC = 1 << 0 |
3094 | | }; |
3095 | | Layer* InvalidateLayer(DisplayItemType aDisplayItemKey, |
3096 | | const nsIntRect* aDamageRect = nullptr, |
3097 | | const nsRect* aFrameDamageRect = nullptr, |
3098 | | uint32_t aFlags = 0); |
3099 | | |
3100 | | void MarkNeedsDisplayItemRebuild(); |
3101 | | |
3102 | | /** |
3103 | | * Returns a rect that encompasses everything that might be painted by |
3104 | | * this frame. This includes this frame, all its descendant frames, this |
3105 | | * frame's outline, and descendant frames' outline, but does not include |
3106 | | * areas clipped out by the CSS "overflow" and "clip" properties. |
3107 | | * |
3108 | | * HasOverflowRects() (below) will return true when this overflow |
3109 | | * rect has been explicitly set, even if it matches mRect. |
3110 | | * XXX Note: because of a space optimization using the formula above, |
3111 | | * during reflow this function does not give accurate data if |
3112 | | * FinishAndStoreOverflow has been called but mRect hasn't yet been |
3113 | | * updated yet. FIXME: This actually isn't true, but it should be. |
3114 | | * |
3115 | | * The visual overflow rect should NEVER be used for things that |
3116 | | * affect layout. The scrollable overflow rect is permitted to affect |
3117 | | * layout. |
3118 | | * |
3119 | | * @return the rect relative to this frame's origin, but after |
3120 | | * CSS transforms have been applied (i.e. not really this frame's coordinate |
3121 | | * system, and may not contain the frame's border-box, e.g. if there |
3122 | | * is a CSS transform scaling it down) |
3123 | | */ |
3124 | 0 | nsRect GetVisualOverflowRect() const { |
3125 | 0 | return GetOverflowRect(eVisualOverflow); |
3126 | 0 | } |
3127 | | |
3128 | | /** |
3129 | | * Returns a rect that encompasses the area of this frame that the |
3130 | | * user should be able to scroll to reach. This is similar to |
3131 | | * GetVisualOverflowRect, but does not include outline or shadows, and |
3132 | | * may in the future include more margins than visual overflow does. |
3133 | | * It does not include areas clipped out by the CSS "overflow" and |
3134 | | * "clip" properties. |
3135 | | * |
3136 | | * HasOverflowRects() (below) will return true when this overflow |
3137 | | * rect has been explicitly set, even if it matches mRect. |
3138 | | * XXX Note: because of a space optimization using the formula above, |
3139 | | * during reflow this function does not give accurate data if |
3140 | | * FinishAndStoreOverflow has been called but mRect hasn't yet been |
3141 | | * updated yet. |
3142 | | * |
3143 | | * @return the rect relative to this frame's origin, but after |
3144 | | * CSS transforms have been applied (i.e. not really this frame's coordinate |
3145 | | * system, and may not contain the frame's border-box, e.g. if there |
3146 | | * is a CSS transform scaling it down) |
3147 | | */ |
3148 | 0 | nsRect GetScrollableOverflowRect() const { |
3149 | 0 | return GetOverflowRect(eScrollableOverflow); |
3150 | 0 | } |
3151 | | |
3152 | | nsRect GetOverflowRect(nsOverflowType aType) const; |
3153 | | |
3154 | | nsOverflowAreas GetOverflowAreas() const; |
3155 | | |
3156 | | /** |
3157 | | * Same as GetOverflowAreas, except in this frame's coordinate |
3158 | | * system (before transforms are applied). |
3159 | | * |
3160 | | * @return the overflow areas relative to this frame, before any CSS transforms have |
3161 | | * been applied, i.e. in this frame's coordinate system |
3162 | | */ |
3163 | | nsOverflowAreas GetOverflowAreasRelativeToSelf() const; |
3164 | | |
3165 | | /** |
3166 | | * Same as GetScrollableOverflowRect, except relative to the parent |
3167 | | * frame. |
3168 | | * |
3169 | | * @return the rect relative to the parent frame, in the parent frame's |
3170 | | * coordinate system |
3171 | | */ |
3172 | | nsRect GetScrollableOverflowRectRelativeToParent() const; |
3173 | | |
3174 | | /** |
3175 | | * Same as GetScrollableOverflowRect, except in this frame's coordinate |
3176 | | * system (before transforms are applied). |
3177 | | * |
3178 | | * @return the rect relative to this frame, before any CSS transforms have |
3179 | | * been applied, i.e. in this frame's coordinate system |
3180 | | */ |
3181 | | nsRect GetScrollableOverflowRectRelativeToSelf() const; |
3182 | | |
3183 | | /** |
3184 | | * Like GetVisualOverflowRect, except in this frame's |
3185 | | * coordinate system (before transforms are applied). |
3186 | | * |
3187 | | * @return the rect relative to this frame, before any CSS transforms have |
3188 | | * been applied, i.e. in this frame's coordinate system |
3189 | | */ |
3190 | | nsRect GetVisualOverflowRectRelativeToSelf() const; |
3191 | | |
3192 | | /** |
3193 | | * Same as GetVisualOverflowRect, except relative to the parent |
3194 | | * frame. |
3195 | | * |
3196 | | * @return the rect relative to the parent frame, in the parent frame's |
3197 | | * coordinate system |
3198 | | */ |
3199 | | nsRect GetVisualOverflowRectRelativeToParent() const; |
3200 | | |
3201 | | /** |
3202 | | * Returns this frame's visual overflow rect as it would be before taking |
3203 | | * account of SVG effects or transforms. The rect returned is relative to |
3204 | | * this frame. |
3205 | | */ |
3206 | | nsRect GetPreEffectsVisualOverflowRect() const; |
3207 | | |
3208 | | /** |
3209 | | * Store the overflow area in the frame's mOverflow.mVisualDeltas |
3210 | | * fields or as a frame property in the frame manager so that it can |
3211 | | * be retrieved later without reflowing the frame. Returns true if either of |
3212 | | * the overflow areas changed. |
3213 | | */ |
3214 | | bool FinishAndStoreOverflow(nsOverflowAreas& aOverflowAreas, |
3215 | | nsSize aNewSize, nsSize* aOldSize = nullptr, |
3216 | | const nsStyleDisplay* aStyleDisplay = nullptr); |
3217 | | |
3218 | | bool FinishAndStoreOverflow(ReflowOutput* aMetrics, |
3219 | 0 | const nsStyleDisplay* aStyleDisplay = nullptr) { |
3220 | 0 | return FinishAndStoreOverflow(aMetrics->mOverflowAreas, |
3221 | 0 | nsSize(aMetrics->Width(), aMetrics->Height()), |
3222 | 0 | nullptr, aStyleDisplay); |
3223 | 0 | } |
3224 | | |
3225 | | /** |
3226 | | * Returns whether the frame has an overflow rect that is different from |
3227 | | * its border-box. |
3228 | | */ |
3229 | 0 | bool HasOverflowAreas() const { |
3230 | 0 | return mOverflow.mType != NS_FRAME_OVERFLOW_NONE; |
3231 | 0 | } |
3232 | | |
3233 | | /** |
3234 | | * Removes any stored overflow rects (visual and scrollable) from the frame. |
3235 | | * Returns true if the overflow changed. |
3236 | | */ |
3237 | | bool ClearOverflowRects(); |
3238 | | |
3239 | | /** |
3240 | | * Determine whether borders, padding, margins etc should NOT be applied |
3241 | | * on certain sides of the frame. |
3242 | | * @see mozilla::Sides in gfx/2d/BaseMargin.h |
3243 | | * @see mozilla::LogicalSides in layout/generic/WritingModes.h |
3244 | | * |
3245 | | * @note (See also bug 743402, comment 11) GetSkipSides() checks to see |
3246 | | * if this frame has a previous or next continuation to determine |
3247 | | * if a side should be skipped. |
3248 | | * Unfortunately, this only works after reflow has been completed. In |
3249 | | * lieu of this, during reflow, an ReflowInput parameter can be |
3250 | | * passed in, indicating that it should be used to determine if sides |
3251 | | * should be skipped during reflow. |
3252 | | */ |
3253 | | Sides GetSkipSides(const ReflowInput* aReflowInput = nullptr) const; |
3254 | | virtual LogicalSides |
3255 | 0 | GetLogicalSkipSides(const ReflowInput* aReflowInput = nullptr) const { |
3256 | 0 | return LogicalSides(); |
3257 | 0 | } |
3258 | | |
3259 | | /** |
3260 | | * @returns true if this frame is selected. |
3261 | | */ |
3262 | | bool IsSelected() const; |
3263 | | |
3264 | | /** |
3265 | | * called to discover where this frame, or a parent frame has user-select style |
3266 | | * applied, which affects that way that it is selected. |
3267 | | * |
3268 | | * @param aSelectStyle out param. Returns the type of selection style found |
3269 | | * (using values defined in nsStyleConsts.h). |
3270 | | * |
3271 | | * @return Whether the frame can be selected (i.e. is not affected by |
3272 | | * user-select: none) |
3273 | | */ |
3274 | | bool IsSelectable(mozilla::StyleUserSelect* aSelectStyle) const; |
3275 | | |
3276 | | /** |
3277 | | * Called to retrieve the SelectionController associated with the frame. |
3278 | | * @param aSelCon will contain the selection controller associated with |
3279 | | * the frame. |
3280 | | */ |
3281 | | virtual nsresult GetSelectionController(nsPresContext *aPresContext, nsISelectionController **aSelCon) = 0; |
3282 | | |
3283 | | /** |
3284 | | * Call to get nsFrameSelection for this frame. |
3285 | | */ |
3286 | | already_AddRefed<nsFrameSelection> GetFrameSelection(); |
3287 | | |
3288 | | /** |
3289 | | * GetConstFrameSelection returns an object which methods are safe to use for |
3290 | | * example in nsIFrame code. |
3291 | | */ |
3292 | | const nsFrameSelection* GetConstFrameSelection() const; |
3293 | | |
3294 | | /** |
3295 | | * called to find the previous/next character, word, or line returns the actual |
3296 | | * nsIFrame and the frame offset. THIS DOES NOT CHANGE SELECTION STATE |
3297 | | * uses frame's begin selection state to start. if no selection on this frame will |
3298 | | * return NS_ERROR_FAILURE |
3299 | | * @param aPOS is defined in nsFrameSelection |
3300 | | */ |
3301 | | virtual nsresult PeekOffset(nsPeekOffsetStruct *aPos); |
3302 | | |
3303 | | /** |
3304 | | * called to find the previous/next non-anonymous selectable leaf frame. |
3305 | | * @param aDirection [in] the direction to move in (eDirPrevious or eDirNext) |
3306 | | * @param aVisual [in] whether bidi caret behavior is visual (true) or logical (false) |
3307 | | * @param aJumpLines [in] whether to allow jumping across line boundaries |
3308 | | * @param aScrollViewStop [in] whether to stop when reaching a scroll frame boundary |
3309 | | * @param aOutFrame [out] the previous/next selectable leaf frame |
3310 | | * @param aOutOffset [out] 0 indicates that we arrived at the beginning of the output frame; |
3311 | | * -1 indicates that we arrived at its end. |
3312 | | * @param aOutJumpedLine [out] whether this frame and the returned frame are on different lines |
3313 | | * @param aOutMovedOverNonSelectableText [out] whether we jumped over a non-selectable |
3314 | | * frame during the search |
3315 | | */ |
3316 | | nsresult GetFrameFromDirection(nsDirection aDirection, bool aVisual, |
3317 | | bool aJumpLines, bool aScrollViewStop, |
3318 | | nsIFrame** aOutFrame, int32_t* aOutOffset, |
3319 | | bool* aOutJumpedLine, bool* aOutMovedOverNonSelectableText); |
3320 | | |
3321 | | /** |
3322 | | * called to see if the children of the frame are visible from indexstart to index end. |
3323 | | * this does not change any state. returns true only if the indexes are valid and any of |
3324 | | * the children are visible. for textframes this index is the character index. |
3325 | | * if aStart = aEnd result will be false |
3326 | | * @param aStart start index of first child from 0-N (number of children) |
3327 | | * @param aEnd end index of last child from 0-N |
3328 | | * @param aRecurse should this frame talk to siblings to get to the contents other children? |
3329 | | * @param aFinished did this frame have the aEndIndex? or is there more work to do |
3330 | | * @param _retval return value true or false. false = range is not rendered. |
3331 | | */ |
3332 | | virtual nsresult CheckVisibility(nsPresContext* aContext, int32_t aStartIndex, int32_t aEndIndex, bool aRecurse, bool *aFinished, bool *_retval)=0; |
3333 | | |
3334 | | /** |
3335 | | * Called to tell a frame that one of its child frames is dirty (i.e., |
3336 | | * has the NS_FRAME_IS_DIRTY *or* NS_FRAME_HAS_DIRTY_CHILDREN bit |
3337 | | * set). This should always set the NS_FRAME_HAS_DIRTY_CHILDREN on |
3338 | | * the frame, and may do other work. |
3339 | | */ |
3340 | | virtual void ChildIsDirty(nsIFrame* aChild) = 0; |
3341 | | |
3342 | | /** |
3343 | | * Called to retrieve this frame's accessible. |
3344 | | * If this frame implements Accessibility return a valid accessible |
3345 | | * If not return NS_ERROR_NOT_IMPLEMENTED. |
3346 | | * Note: Accessible must be refcountable. Do not implement directly on your frame |
3347 | | * Use a mediatior of some kind. |
3348 | | */ |
3349 | | #ifdef ACCESSIBILITY |
3350 | | virtual mozilla::a11y::AccType AccessibleType() = 0; |
3351 | | #endif |
3352 | | |
3353 | | /** |
3354 | | * Get the frame whose style should be the parent of this frame's style (i.e., |
3355 | | * provide the parent style). |
3356 | | * |
3357 | | * This frame must either be an ancestor of this frame or a child. If |
3358 | | * this returns a child frame, then the child frame must be sure to |
3359 | | * return a grandparent or higher! Furthermore, if a child frame is |
3360 | | * returned it must have the same GetContent() as this frame. |
3361 | | * |
3362 | | * @param aProviderFrame (out) the frame associated with the returned value |
3363 | | * or nullptr if the style is for display:contents content. |
3364 | | * @return The style that should be the parent of this frame's style. Null is |
3365 | | * permitted, and means that this frame's style should be the root of |
3366 | | * the style tree. |
3367 | | */ |
3368 | | virtual ComputedStyle* GetParentComputedStyle(nsIFrame** aProviderFrame) const = 0; |
3369 | | |
3370 | | /** |
3371 | | * Called by RestyleManager to update the style of anonymous boxes |
3372 | | * directly associated with this frame. |
3373 | | * |
3374 | | * The passed-in ServoRestyleState can be used to create new ComputedStyles as |
3375 | | * needed, as well as posting changes to the change list. |
3376 | | * |
3377 | | * It's guaranteed to already have a change in it for this frame and this |
3378 | | * frame's content. |
3379 | | * |
3380 | | * This function will be called after this frame's style has already been |
3381 | | * updated. This function will only be called on frames which have the |
3382 | | * NS_FRAME_OWNS_ANON_BOXES bit set. |
3383 | | */ |
3384 | | void UpdateStyleOfOwnedAnonBoxes(mozilla::ServoRestyleState& aRestyleState) |
3385 | 0 | { |
3386 | 0 | if (GetStateBits() & NS_FRAME_OWNS_ANON_BOXES) { |
3387 | 0 | DoUpdateStyleOfOwnedAnonBoxes(aRestyleState); |
3388 | 0 | } |
3389 | 0 | } |
3390 | | |
3391 | | protected: |
3392 | | // This does the actual work of UpdateStyleOfOwnedAnonBoxes. It calls |
3393 | | // AppendDirectlyOwnedAnonBoxes to find all of the anonymous boxes |
3394 | | // owned by this frame, and then updates styles on each of them. |
3395 | | void DoUpdateStyleOfOwnedAnonBoxes(mozilla::ServoRestyleState& aRestyleState); |
3396 | | |
3397 | | // A helper for DoUpdateStyleOfOwnedAnonBoxes for the specific case |
3398 | | // of the owned anon box being a child of this frame. |
3399 | | void UpdateStyleOfChildAnonBox(nsIFrame* aChildFrame, |
3400 | | mozilla::ServoRestyleState& aRestyleState); |
3401 | | |
3402 | | // Allow ServoRestyleState to call UpdateStyleOfChildAnonBox. |
3403 | | friend class mozilla::ServoRestyleState; |
3404 | | |
3405 | | public: |
3406 | | // A helper both for UpdateStyleOfChildAnonBox, and to update frame-backed |
3407 | | // pseudo-elements in RestyleManager. |
3408 | | // |
3409 | | // This gets a ComputedStyle that will be the new style for `aChildFrame`, and |
3410 | | // takes care of updating it, calling CalcStyleDifference, and adding to the |
3411 | | // change list as appropriate. |
3412 | | // |
3413 | | // If aContinuationComputedStyle is not Nothing, it should be used for |
3414 | | // continuations instead of aNewComputedStyle. In either case, changehints |
3415 | | // are only computed based on aNewComputedStyle. |
3416 | | // |
3417 | | // Returns the generated change hint for the frame. |
3418 | | static nsChangeHint UpdateStyleOfOwnedChildFrame( |
3419 | | nsIFrame* aChildFrame, |
3420 | | ComputedStyle* aNewComputedStyle, |
3421 | | mozilla::ServoRestyleState& aRestyleState, |
3422 | | const Maybe<ComputedStyle*>& aContinuationComputedStyle = Nothing()); |
3423 | | |
3424 | | struct OwnedAnonBox |
3425 | | { |
3426 | | typedef void (*UpdateStyleFn)(nsIFrame* aOwningFrame, |
3427 | | nsIFrame* aAnonBox, |
3428 | | mozilla::ServoRestyleState& aRestyleState); |
3429 | | |
3430 | | explicit OwnedAnonBox(nsIFrame* aAnonBoxFrame, |
3431 | | UpdateStyleFn aUpdateStyleFn = nullptr) |
3432 | | : mAnonBoxFrame(aAnonBoxFrame) |
3433 | | , mUpdateStyleFn(aUpdateStyleFn) |
3434 | 0 | {} |
3435 | | |
3436 | | nsIFrame* mAnonBoxFrame; |
3437 | | UpdateStyleFn mUpdateStyleFn; |
3438 | | }; |
3439 | | |
3440 | | /** |
3441 | | * Appends information about all of the anonymous boxes owned by this frame, |
3442 | | * including other anonymous boxes owned by those which this frame owns |
3443 | | * directly. |
3444 | | */ |
3445 | | void AppendOwnedAnonBoxes(nsTArray<OwnedAnonBox>& aResult) { |
3446 | | if (GetStateBits() & NS_FRAME_OWNS_ANON_BOXES) { |
3447 | | if (IsInlineFrame()) { |
3448 | | // See comment in nsIFrame::DoUpdateStyleOfOwnedAnonBoxes for why |
3449 | | // we skip nsInlineFrames. |
3450 | | return; |
3451 | | } |
3452 | | DoAppendOwnedAnonBoxes(aResult); |
3453 | | } |
3454 | | } |
3455 | | |
3456 | | protected: |
3457 | | // This does the actual work of AppendOwnedAnonBoxes. |
3458 | | void DoAppendOwnedAnonBoxes(nsTArray<OwnedAnonBox>& aResult); |
3459 | | |
3460 | | public: |
3461 | | /** |
3462 | | * Hook subclasses can override to return their owned anonymous boxes. |
3463 | | * |
3464 | | * This function only appends anonymous boxes that are directly owned by |
3465 | | * this frame, i.e. direct children or (for certain frames) a wrapper |
3466 | | * parent, unlike AppendOwnedAnonBoxes, which will append all anonymous |
3467 | | * boxes transitively owned by this frame. |
3468 | | */ |
3469 | | virtual void AppendDirectlyOwnedAnonBoxes(nsTArray<OwnedAnonBox>& aResult); |
3470 | | |
3471 | | /** |
3472 | | * Determines whether a frame is visible for painting; |
3473 | | * taking into account whether it is painting a selection or printing. |
3474 | | */ |
3475 | | bool IsVisibleForPainting(nsDisplayListBuilder* aBuilder); |
3476 | | /** |
3477 | | * Determines whether a frame is visible for painting or collapsed; |
3478 | | * taking into account whether it is painting a selection or printing, |
3479 | | */ |
3480 | | bool IsVisibleOrCollapsedForPainting(nsDisplayListBuilder* aBuilder); |
3481 | | /** |
3482 | | * As above, but slower because we have to recompute some stuff that |
3483 | | * aBuilder already has. |
3484 | | */ |
3485 | | bool IsVisibleForPainting(); |
3486 | | /** |
3487 | | * Check whether this frame is visible in the current selection. Returns |
3488 | | * true if there is no current selection. |
3489 | | */ |
3490 | | bool IsVisibleInSelection(nsDisplayListBuilder* aBuilder); |
3491 | | |
3492 | | /** |
3493 | | * Overridable function to determine whether this frame should be considered |
3494 | | * "in" the given non-null aSelection for visibility purposes. |
3495 | | */ |
3496 | | virtual bool IsVisibleInSelection(mozilla::dom::Selection* aSelection); |
3497 | | |
3498 | | /** |
3499 | | * Determines if this frame is a stacking context. |
3500 | | * |
3501 | | * @param aIsPositioned The precomputed result of IsAbsPosContainingBlock |
3502 | | * on the StyleDisplay(). |
3503 | | */ |
3504 | | bool IsStackingContext(mozilla::EffectSet* aEffectSet, |
3505 | | const nsStyleDisplay* aStyleDisplay, |
3506 | | const nsStylePosition* aStylePosition, |
3507 | | const nsStyleEffects* aStyleEffects, |
3508 | | bool aIsPositioned); |
3509 | | bool IsStackingContext(); |
3510 | | |
3511 | 0 | virtual bool HonorPrintBackgroundSettings() { return true; } |
3512 | | |
3513 | | /** |
3514 | | * Determine whether the frame is logically empty, which is roughly |
3515 | | * whether the layout would be the same whether or not the frame is |
3516 | | * present. Placeholder frames should return true. Block frames |
3517 | | * should be considered empty whenever margins collapse through them, |
3518 | | * even though those margins are relevant. Text frames containing |
3519 | | * only whitespace that does not contribute to the height of the line |
3520 | | * should return true. |
3521 | | */ |
3522 | | virtual bool IsEmpty() = 0; |
3523 | | /** |
3524 | | * Return the same as IsEmpty(). This may only be called after the frame |
3525 | | * has been reflowed and before any further style or content changes. |
3526 | | */ |
3527 | | virtual bool CachedIsEmpty(); |
3528 | | /** |
3529 | | * Determine whether the frame is logically empty, assuming that all |
3530 | | * its children are empty. |
3531 | | */ |
3532 | | virtual bool IsSelfEmpty() = 0; |
3533 | | |
3534 | | /** |
3535 | | * IsGeneratedContentFrame returns whether a frame corresponds to |
3536 | | * generated content |
3537 | | * |
3538 | | * @return whether the frame correspods to generated content |
3539 | | */ |
3540 | 0 | bool IsGeneratedContentFrame() const { |
3541 | 0 | return (mState & NS_FRAME_GENERATED_CONTENT) != 0; |
3542 | 0 | } |
3543 | | |
3544 | | /** |
3545 | | * IsPseudoFrame returns whether a frame is a pseudo frame (eg an |
3546 | | * anonymous table-row frame created for a CSS table-cell without an |
3547 | | * enclosing table-row. |
3548 | | * |
3549 | | * @param aParentContent the content node corresponding to the parent frame |
3550 | | * @return whether the frame is a pseudo frame |
3551 | | */ |
3552 | 0 | bool IsPseudoFrame(const nsIContent* aParentContent) { |
3553 | 0 | return mContent == aParentContent; |
3554 | 0 | } |
3555 | | |
3556 | | /** |
3557 | | * Support for reading and writing properties on the frame. |
3558 | | * These call through to the frame's FrameProperties object, if it |
3559 | | * exists, but avoid creating it if no property is ever set. |
3560 | | */ |
3561 | | template<typename T> |
3562 | | FrameProperties::PropertyType<T> |
3563 | | GetProperty(FrameProperties::Descriptor<T> aProperty, |
3564 | | bool* aFoundResult = nullptr) const |
3565 | 0 | { |
3566 | 0 | return mProperties.Get(aProperty, aFoundResult); |
3567 | 0 | } Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsContainerFrame>::Type nsIFrame::GetProperty<nsContainerFrame>(mozilla::FramePropertyDescriptor<nsContainerFrame> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsOverflowAreas>::Type nsIFrame::GetProperty<nsOverflowAreas>(mozilla::FramePropertyDescriptor<nsOverflowAreas> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsPoint>::Type nsIFrame::GetProperty<nsPoint>(mozilla::FramePropertyDescriptor<nsPoint> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsFrameList>::Type nsIFrame::GetProperty<nsFrameList>(mozilla::FramePropertyDescriptor<nsFrameList> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<AnimatedGeometryRoot>::Type nsIFrame::GetProperty<AnimatedGeometryRoot>(mozilla::FramePropertyDescriptor<AnimatedGeometryRoot> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::ActiveScrolledRoot>::Type nsIFrame::GetProperty<mozilla::ActiveScrolledRoot>(mozilla::FramePropertyDescriptor<mozilla::ActiveScrolledRoot> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsDisplayListBuilder::OutOfFlowDisplayData>::Type nsIFrame::GetProperty<nsDisplayListBuilder::OutOfFlowDisplayData>(mozilla::FramePropertyDescriptor<nsDisplayListBuilder::OutOfFlowDisplayData> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::ComputedGridTrackInfo>::Type nsIFrame::GetProperty<mozilla::ComputedGridTrackInfo>(mozilla::FramePropertyDescriptor<mozilla::ComputedGridTrackInfo> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::ComputedGridLineInfo>::Type nsIFrame::GetProperty<mozilla::ComputedGridLineInfo>(mozilla::FramePropertyDescriptor<mozilla::ComputedGridLineInfo> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea> >::Type nsIFrame::GetProperty<nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea> >(mozilla::FramePropertyDescriptor<nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea> > const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsTArray<mozilla::css::GridNamedArea> >::Type nsIFrame::GetProperty<nsTArray<mozilla::css::GridNamedArea> >(mozilla::FramePropertyDescriptor<nsTArray<mozilla::css::GridNamedArea> > const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<ComputedFlexContainerInfo>::Type nsIFrame::GetProperty<ComputedFlexContainerInfo>(mozilla::FramePropertyDescriptor<ComputedFlexContainerInfo> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsLineBox>::Type nsIFrame::GetProperty<nsLineBox>(mozilla::FramePropertyDescriptor<nsLineBox> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<RetainedDisplayListBuilder>::Type nsIFrame::GetProperty<RetainedDisplayListBuilder>(mozilla::FramePropertyDescriptor<RetainedDisplayListBuilder> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsRect>::Type nsIFrame::GetProperty<nsRect>(mozilla::FramePropertyDescriptor<nsRect> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsMargin>::Type nsIFrame::GetProperty<nsMargin>(mozilla::FramePropertyDescriptor<nsMargin> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::SmallValueHolder<int> >::Type nsIFrame::GetProperty<mozilla::SmallValueHolder<int> >(mozilla::FramePropertyDescriptor<mozilla::SmallValueHolder<int> > const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::StickyScrollContainer>::Type nsIFrame::GetProperty<mozilla::StickyScrollContainer>(mozilla::FramePropertyDescriptor<mozilla::StickyScrollContainer> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsBlockFrame::FrameLines>::Type nsIFrame::GetProperty<nsBlockFrame::FrameLines>(mozilla::FramePropertyDescriptor<nsBlockFrame::FrameLines> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsBulletFrame>::Type nsIFrame::GetProperty<nsBulletFrame>(mozilla::FramePropertyDescriptor<nsBulletFrame> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsIFrame>::Type nsIFrame::GetProperty<nsIFrame>(mozilla::FramePropertyDescriptor<nsIFrame> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::SmallValueHolder<float> >::Type nsIFrame::GetProperty<mozilla::SmallValueHolder<float> >(mozilla::FramePropertyDescriptor<mozilla::SmallValueHolder<float> > const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsFlexContainerFrame::CachedMeasuringReflowResult>::Type nsIFrame::GetProperty<nsFlexContainerFrame::CachedMeasuringReflowResult>(mozilla::FramePropertyDescriptor<nsFlexContainerFrame::CachedMeasuringReflowResult> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsFontInflationData>::Type nsIFrame::GetProperty<nsFontInflationData>(mozilla::FramePropertyDescriptor<nsFontInflationData> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsAbsoluteContainingBlock>::Type nsIFrame::GetProperty<nsAbsoluteContainingBlock>(mozilla::FramePropertyDescriptor<nsAbsoluteContainingBlock> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<AutoTArray<nsDisplayItem*, 4ul> >::Type nsIFrame::GetProperty<AutoTArray<nsDisplayItem*, 4ul> >(mozilla::FramePropertyDescriptor<AutoTArray<nsDisplayItem*, 4ul> > const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::SmallValueHolder<unsigned int> >::Type nsIFrame::GetProperty<mozilla::SmallValueHolder<unsigned int> >(mozilla::FramePropertyDescriptor<mozilla::SmallValueHolder<unsigned int> > const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsDisplayListBuilder::DisplayListBuildingData>::Type nsIFrame::GetProperty<nsDisplayListBuilder::DisplayListBuildingData>(mozilla::FramePropertyDescriptor<nsDisplayListBuilder::DisplayListBuildingData> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsBoxLayoutMetrics>::Type nsIFrame::GetProperty<nsBoxLayoutMetrics>(mozilla::FramePropertyDescriptor<nsBoxLayoutMetrics> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsGridContainerFrame::SharedGridData>::Type nsIFrame::GetProperty<nsGridContainerFrame::SharedGridData>(mozilla::FramePropertyDescriptor<nsGridContainerFrame::SharedGridData> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::LogicalSize>::Type nsIFrame::GetProperty<mozilla::LogicalSize>(mozilla::FramePropertyDescriptor<mozilla::LogicalSize> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<TabWidthStore>::Type nsIFrame::GetProperty<TabWidthStore>(mozilla::FramePropertyDescriptor<TabWidthStore> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<gfxTextRun>::Type nsIFrame::GetProperty<gfxTextRun>(mozilla::FramePropertyDescriptor<gfxTextRun> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<EmphasisMarkInfo>::Type nsIFrame::GetProperty<EmphasisMarkInfo>(mozilla::FramePropertyDescriptor<EmphasisMarkInfo> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsTextFrame>::Type nsIFrame::GetProperty<nsTextFrame>(mozilla::FramePropertyDescriptor<nsTextFrame> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::SVGMaskObserverList>::Type nsIFrame::GetProperty<mozilla::SVGMaskObserverList>(mozilla::FramePropertyDescriptor<mozilla::SVGMaskObserverList> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::TextNodeCorrespondence>::Type nsIFrame::GetProperty<mozilla::TextNodeCorrespondence>(mozilla::FramePropertyDescriptor<mozilla::TextNodeCorrespondence> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::SVGFilterObserverListForCSSProp>::Type nsIFrame::GetProperty<mozilla::SVGFilterObserverListForCSSProp>(mozilla::FramePropertyDescriptor<mozilla::SVGFilterObserverListForCSSProp> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::SVGMarkerObserver>::Type nsIFrame::GetProperty<mozilla::SVGMarkerObserver>(mozilla::FramePropertyDescriptor<mozilla::SVGMarkerObserver> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::SVGTextPathObserver>::Type nsIFrame::GetProperty<mozilla::SVGTextPathObserver>(mozilla::FramePropertyDescriptor<mozilla::SVGTextPathObserver> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::SVGTemplateElementObserver>::Type nsIFrame::GetProperty<mozilla::SVGTemplateElementObserver>(mozilla::FramePropertyDescriptor<mozilla::SVGTemplateElementObserver> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::nsSVGPaintingProperty>::Type nsIFrame::GetProperty<mozilla::nsSVGPaintingProperty>(mozilla::FramePropertyDescriptor<mozilla::nsSVGPaintingProperty> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >::Type nsIFrame::GetProperty<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(mozilla::FramePropertyDescriptor<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> > const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >::Type nsIFrame::GetProperty<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::FramePropertyDescriptor<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> > const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::ReflowOutput>::Type nsIFrame::GetProperty<mozilla::ReflowOutput>(mozilla::FramePropertyDescriptor<mozilla::ReflowOutput> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsTArray<signed char> >::Type nsIFrame::GetProperty<nsTArray<signed char> >(mozilla::FramePropertyDescriptor<nsTArray<signed char> > const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::LayerActivity>::Type nsIFrame::GetProperty<mozilla::LayerActivity>(mozilla::FramePropertyDescriptor<mozilla::LayerActivity> const*, bool*) const Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<RetainedDisplayListData>::Type nsIFrame::GetProperty<RetainedDisplayListData>(mozilla::FramePropertyDescriptor<RetainedDisplayListData> const*, bool*) const |
3568 | | |
3569 | | template<typename T> |
3570 | | bool HasProperty(FrameProperties::Descriptor<T> aProperty) const |
3571 | 0 | { |
3572 | 0 | return mProperties.Has(aProperty); |
3573 | 0 | } Unexecuted instantiation: bool nsIFrame::HasProperty<mozilla::SmallValueHolder<mozilla::FrameBidiData> >(mozilla::FramePropertyDescriptor<mozilla::SmallValueHolder<mozilla::FrameBidiData> > const*) const Unexecuted instantiation: bool nsIFrame::HasProperty<RetainedDisplayListBuilder>(mozilla::FramePropertyDescriptor<RetainedDisplayListBuilder> const*) const Unexecuted instantiation: bool nsIFrame::HasProperty<ComputedFlexContainerInfo>(mozilla::FramePropertyDescriptor<ComputedFlexContainerInfo> const*) const Unexecuted instantiation: bool nsIFrame::HasProperty<nsMargin>(mozilla::FramePropertyDescriptor<nsMargin> const*) const Unexecuted instantiation: bool nsIFrame::HasProperty<mozilla::ComputedGridTrackInfo>(mozilla::FramePropertyDescriptor<mozilla::ComputedGridTrackInfo> const*) const Unexecuted instantiation: bool nsIFrame::HasProperty<mozilla::ComputedGridLineInfo>(mozilla::FramePropertyDescriptor<mozilla::ComputedGridLineInfo> const*) const Unexecuted instantiation: bool nsIFrame::HasProperty<nsRefPtrHashtable<nsGenericHashKey<mozilla::layers::WebRenderUserDataKey>, mozilla::layers::WebRenderUserData> >(mozilla::FramePropertyDescriptor<nsRefPtrHashtable<nsGenericHashKey<mozilla::layers::WebRenderUserDataKey>, mozilla::layers::WebRenderUserData> > const*) const |
3574 | | |
3575 | | // Add a property, or update an existing property for the given descriptor. |
3576 | | template<typename T> |
3577 | | void SetProperty(FrameProperties::Descriptor<T> aProperty, |
3578 | | FrameProperties::PropertyType<T> aValue) |
3579 | 0 | { |
3580 | 0 | mProperties.Set(aProperty, aValue, this); |
3581 | 0 | } Unexecuted instantiation: void nsIFrame::SetProperty<AnimatedGeometryRoot>(mozilla::FramePropertyDescriptor<AnimatedGeometryRoot> const*, mozilla::detail::FramePropertyTypeHelper<AnimatedGeometryRoot>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::ActiveScrolledRoot>(mozilla::FramePropertyDescriptor<mozilla::ActiveScrolledRoot> const*, mozilla::detail::FramePropertyTypeHelper<mozilla::ActiveScrolledRoot>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsLineBox>(mozilla::FramePropertyDescriptor<nsLineBox> const*, mozilla::detail::FramePropertyTypeHelper<nsLineBox>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsContainerFrame>(mozilla::FramePropertyDescriptor<nsContainerFrame> const*, mozilla::detail::FramePropertyTypeHelper<nsContainerFrame>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<RetainedDisplayListBuilder>(mozilla::FramePropertyDescriptor<RetainedDisplayListBuilder> const*, mozilla::detail::FramePropertyTypeHelper<RetainedDisplayListBuilder>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::SmallValueHolder<mozilla::FrameBidiData> >(mozilla::FramePropertyDescriptor<mozilla::SmallValueHolder<mozilla::FrameBidiData> > const*, mozilla::detail::FramePropertyTypeHelper<mozilla::SmallValueHolder<mozilla::FrameBidiData> >::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsPlaceholderFrame>(mozilla::FramePropertyDescriptor<nsPlaceholderFrame> const*, mozilla::detail::FramePropertyTypeHelper<nsPlaceholderFrame>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsIFrame>(mozilla::FramePropertyDescriptor<nsIFrame> const*, mozilla::detail::FramePropertyTypeHelper<nsIFrame>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsRect>(mozilla::FramePropertyDescriptor<nsRect> const*, mozilla::detail::FramePropertyTypeHelper<nsRect>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::SmallValueHolder<int> >(mozilla::FramePropertyDescriptor<mozilla::SmallValueHolder<int> > const*, mozilla::detail::FramePropertyTypeHelper<mozilla::SmallValueHolder<int> >::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsBoxLayoutMetrics>(mozilla::FramePropertyDescriptor<nsBoxLayoutMetrics> const*, mozilla::detail::FramePropertyTypeHelper<nsBoxLayoutMetrics>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::StickyScrollContainer>(mozilla::FramePropertyDescriptor<mozilla::StickyScrollContainer> const*, mozilla::detail::FramePropertyTypeHelper<mozilla::StickyScrollContainer>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsMargin>(mozilla::FramePropertyDescriptor<nsMargin> const*, mozilla::detail::FramePropertyTypeHelper<nsMargin>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsBlockFrame::FrameLines>(mozilla::FramePropertyDescriptor<nsBlockFrame::FrameLines> const*, mozilla::detail::FramePropertyTypeHelper<nsBlockFrame::FrameLines>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsFrameList>(mozilla::FramePropertyDescriptor<nsFrameList> const*, mozilla::detail::FramePropertyTypeHelper<nsFrameList>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsBulletFrame>(mozilla::FramePropertyDescriptor<nsBulletFrame> const*, mozilla::detail::FramePropertyTypeHelper<nsBulletFrame>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::SmallValueHolder<float> >(mozilla::FramePropertyDescriptor<mozilla::SmallValueHolder<float> > const*, mozilla::detail::FramePropertyTypeHelper<mozilla::SmallValueHolder<float> >::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsFlexContainerFrame::CachedMeasuringReflowResult>(mozilla::FramePropertyDescriptor<nsFlexContainerFrame::CachedMeasuringReflowResult> const*, mozilla::detail::FramePropertyTypeHelper<nsFlexContainerFrame::CachedMeasuringReflowResult>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<ComputedFlexContainerInfo>(mozilla::FramePropertyDescriptor<ComputedFlexContainerInfo> const*, mozilla::detail::FramePropertyTypeHelper<ComputedFlexContainerInfo>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsFontInflationData>(mozilla::FramePropertyDescriptor<nsFontInflationData> const*, mozilla::detail::FramePropertyTypeHelper<nsFontInflationData>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsAbsoluteContainingBlock>(mozilla::FramePropertyDescriptor<nsAbsoluteContainingBlock> const*, mozilla::detail::FramePropertyTypeHelper<nsAbsoluteContainingBlock>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::SmallValueHolder<unsigned int> >(mozilla::FramePropertyDescriptor<mozilla::SmallValueHolder<unsigned int> > const*, mozilla::detail::FramePropertyTypeHelper<mozilla::SmallValueHolder<unsigned int> >::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsOverflowAreas>(mozilla::FramePropertyDescriptor<nsOverflowAreas> const*, mozilla::detail::FramePropertyTypeHelper<nsOverflowAreas>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea> >(mozilla::FramePropertyDescriptor<nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea> > const*, mozilla::detail::FramePropertyTypeHelper<nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea> >::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::LogicalSize>(mozilla::FramePropertyDescriptor<mozilla::LogicalSize> const*, mozilla::detail::FramePropertyTypeHelper<mozilla::LogicalSize>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::ComputedGridTrackInfo>(mozilla::FramePropertyDescriptor<mozilla::ComputedGridTrackInfo> const*, mozilla::detail::FramePropertyTypeHelper<mozilla::ComputedGridTrackInfo>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::ComputedGridLineInfo>(mozilla::FramePropertyDescriptor<mozilla::ComputedGridLineInfo> const*, mozilla::detail::FramePropertyTypeHelper<mozilla::ComputedGridLineInfo>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsTArray<mozilla::css::GridNamedArea> >(mozilla::FramePropertyDescriptor<nsTArray<mozilla::css::GridNamedArea> > const*, mozilla::detail::FramePropertyTypeHelper<nsTArray<mozilla::css::GridNamedArea> >::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsGridContainerFrame::SharedGridData>(mozilla::FramePropertyDescriptor<nsGridContainerFrame::SharedGridData> const*, mozilla::detail::FramePropertyTypeHelper<nsGridContainerFrame::SharedGridData>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<TabWidthStore>(mozilla::FramePropertyDescriptor<TabWidthStore> const*, mozilla::detail::FramePropertyTypeHelper<TabWidthStore>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<gfxTextRun>(mozilla::FramePropertyDescriptor<gfxTextRun> const*, mozilla::detail::FramePropertyTypeHelper<gfxTextRun>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<EmphasisMarkInfo>(mozilla::FramePropertyDescriptor<EmphasisMarkInfo> const*, mozilla::detail::FramePropertyTypeHelper<EmphasisMarkInfo>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsTextFrame>(mozilla::FramePropertyDescriptor<nsTextFrame> const*, mozilla::detail::FramePropertyTypeHelper<nsTextFrame>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsTextControlFrame::EditorInitializer>(mozilla::FramePropertyDescriptor<nsTextControlFrame::EditorInitializer> const*, mozilla::detail::FramePropertyTypeHelper<nsTextControlFrame::EditorInitializer>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsPoint>(mozilla::FramePropertyDescriptor<nsPoint> const*, mozilla::detail::FramePropertyTypeHelper<nsPoint>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::SVGFilterObserverListForCSSProp>(mozilla::FramePropertyDescriptor<mozilla::SVGFilterObserverListForCSSProp> const*, mozilla::detail::FramePropertyTypeHelper<mozilla::SVGFilterObserverListForCSSProp>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::SVGMaskObserverList>(mozilla::FramePropertyDescriptor<mozilla::SVGMaskObserverList> const*, mozilla::detail::FramePropertyTypeHelper<mozilla::SVGMaskObserverList>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::SVGMarkerObserver>(mozilla::FramePropertyDescriptor<mozilla::SVGMarkerObserver> const*, mozilla::detail::FramePropertyTypeHelper<mozilla::SVGMarkerObserver>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::SVGTextPathObserver>(mozilla::FramePropertyDescriptor<mozilla::SVGTextPathObserver> const*, mozilla::detail::FramePropertyTypeHelper<mozilla::SVGTextPathObserver>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::SVGTemplateElementObserver>(mozilla::FramePropertyDescriptor<mozilla::SVGTemplateElementObserver> const*, mozilla::detail::FramePropertyTypeHelper<mozilla::SVGTemplateElementObserver>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::nsSVGPaintingProperty>(mozilla::FramePropertyDescriptor<mozilla::nsSVGPaintingProperty> const*, mozilla::detail::FramePropertyTypeHelper<mozilla::nsSVGPaintingProperty>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(mozilla::FramePropertyDescriptor<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> > const*, mozilla::detail::FramePropertyTypeHelper<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::TextNodeCorrespondence>(mozilla::FramePropertyDescriptor<mozilla::TextNodeCorrespondence> const*, mozilla::detail::FramePropertyTypeHelper<mozilla::TextNodeCorrespondence>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::FramePropertyDescriptor<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> > const*, mozilla::detail::FramePropertyTypeHelper<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::ReflowOutput>(mozilla::FramePropertyDescriptor<mozilla::ReflowOutput> const*, mozilla::detail::FramePropertyTypeHelper<mozilla::ReflowOutput>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsTArray<signed char> >(mozilla::FramePropertyDescriptor<nsTArray<signed char> > const*, mozilla::detail::FramePropertyTypeHelper<nsTArray<signed char> >::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsDisplayListBuilder::DisplayListBuildingData>(mozilla::FramePropertyDescriptor<nsDisplayListBuilder::DisplayListBuildingData> const*, mozilla::detail::FramePropertyTypeHelper<nsDisplayListBuilder::DisplayListBuildingData>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::LayerActivity>(mozilla::FramePropertyDescriptor<mozilla::LayerActivity> const*, mozilla::detail::FramePropertyTypeHelper<mozilla::LayerActivity>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<RetainedDisplayListData>(mozilla::FramePropertyDescriptor<RetainedDisplayListData> const*, mozilla::detail::FramePropertyTypeHelper<RetainedDisplayListData>::Type) Unexecuted instantiation: void nsIFrame::SetProperty<mozilla::SmallValueHolder<bool> >(mozilla::FramePropertyDescriptor<mozilla::SmallValueHolder<bool> > const*, mozilla::detail::FramePropertyTypeHelper<mozilla::SmallValueHolder<bool> >::Type) Unexecuted instantiation: void nsIFrame::SetProperty<nsDisplayListBuilder::OutOfFlowDisplayData>(mozilla::FramePropertyDescriptor<nsDisplayListBuilder::OutOfFlowDisplayData> const*, mozilla::detail::FramePropertyTypeHelper<nsDisplayListBuilder::OutOfFlowDisplayData>::Type) |
3582 | | |
3583 | | // Unconditionally add a property; use ONLY if the descriptor is known |
3584 | | // to NOT already be present. |
3585 | | template<typename T> |
3586 | | void AddProperty(FrameProperties::Descriptor<T> aProperty, |
3587 | | FrameProperties::PropertyType<T> aValue) |
3588 | 0 | { |
3589 | 0 | mProperties.Add(aProperty, aValue); |
3590 | 0 | } Unexecuted instantiation: void nsIFrame::AddProperty<nsPoint>(mozilla::FramePropertyDescriptor<nsPoint> const*, mozilla::detail::FramePropertyTypeHelper<nsPoint>::Type) Unexecuted instantiation: void nsIFrame::AddProperty<nsMargin>(mozilla::FramePropertyDescriptor<nsMargin> const*, mozilla::detail::FramePropertyTypeHelper<nsMargin>::Type) Unexecuted instantiation: void nsIFrame::AddProperty<AutoTArray<nsDisplayItem*, 4ul> >(mozilla::FramePropertyDescriptor<AutoTArray<nsDisplayItem*, 4ul> > const*, mozilla::detail::FramePropertyTypeHelper<AutoTArray<nsDisplayItem*, 4ul> >::Type) Unexecuted instantiation: void nsIFrame::AddProperty<nsRect>(mozilla::FramePropertyDescriptor<nsRect> const*, mozilla::detail::FramePropertyTypeHelper<nsRect>::Type) Unexecuted instantiation: void nsIFrame::AddProperty<nsOverflowAreas>(mozilla::FramePropertyDescriptor<nsOverflowAreas> const*, mozilla::detail::FramePropertyTypeHelper<nsOverflowAreas>::Type) |
3591 | | |
3592 | | template<typename T> |
3593 | | FrameProperties::PropertyType<T> |
3594 | | RemoveProperty(FrameProperties::Descriptor<T> aProperty, |
3595 | | bool* aFoundResult = nullptr) |
3596 | 0 | { |
3597 | 0 | return mProperties.Remove(aProperty, aFoundResult); |
3598 | 0 | } Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsFrameList>::Type nsIFrame::RemoveProperty<nsFrameList>(mozilla::FramePropertyDescriptor<nsFrameList> const*, bool*) Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsIFrame>::Type nsIFrame::RemoveProperty<nsIFrame>(mozilla::FramePropertyDescriptor<nsIFrame> const*, bool*) Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::SmallValueHolder<int> >::Type nsIFrame::RemoveProperty<mozilla::SmallValueHolder<int> >(mozilla::FramePropertyDescriptor<mozilla::SmallValueHolder<int> > const*, bool*) Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsBlockFrame::FrameLines>::Type nsIFrame::RemoveProperty<nsBlockFrame::FrameLines>(mozilla::FramePropertyDescriptor<nsBlockFrame::FrameLines> const*, bool*) Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<AutoTArray<nsDisplayItem*, 4ul> >::Type nsIFrame::RemoveProperty<AutoTArray<nsDisplayItem*, 4ul> >(mozilla::FramePropertyDescriptor<AutoTArray<nsDisplayItem*, 4ul> > const*, bool*) Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::SmallValueHolder<unsigned int> >::Type nsIFrame::RemoveProperty<mozilla::SmallValueHolder<unsigned int> >(mozilla::FramePropertyDescriptor<mozilla::SmallValueHolder<unsigned int> > const*, bool*) Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::SmallValueHolder<float> >::Type nsIFrame::RemoveProperty<mozilla::SmallValueHolder<float> >(mozilla::FramePropertyDescriptor<mozilla::SmallValueHolder<float> > const*, bool*) Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<nsPoint>::Type nsIFrame::RemoveProperty<nsPoint>(mozilla::FramePropertyDescriptor<nsPoint> const*, bool*) Unexecuted instantiation: mozilla::detail::FramePropertyTypeHelper<mozilla::LayerActivity>::Type nsIFrame::RemoveProperty<mozilla::LayerActivity>(mozilla::FramePropertyDescriptor<mozilla::LayerActivity> const*, bool*) |
3599 | | |
3600 | | template<typename T> |
3601 | | void DeleteProperty(FrameProperties::Descriptor<T> aProperty) |
3602 | 0 | { |
3603 | 0 | mProperties.Delete(aProperty, this); |
3604 | 0 | } Unexecuted instantiation: void nsIFrame::DeleteProperty<AnimatedGeometryRoot>(mozilla::FramePropertyDescriptor<AnimatedGeometryRoot> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<mozilla::ActiveScrolledRoot>(mozilla::FramePropertyDescriptor<mozilla::ActiveScrolledRoot> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsTextControlFrame::EditorInitializer>(mozilla::FramePropertyDescriptor<nsTextControlFrame::EditorInitializer> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsMargin>(mozilla::FramePropertyDescriptor<nsMargin> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsBoxLayoutMetrics>(mozilla::FramePropertyDescriptor<nsBoxLayoutMetrics> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsRect>(mozilla::FramePropertyDescriptor<nsRect> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<mozilla::SmallValueHolder<int> >(mozilla::FramePropertyDescriptor<mozilla::SmallValueHolder<int> > const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsLineBox>(mozilla::FramePropertyDescriptor<nsLineBox> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<mozilla::SmallValueHolder<float> >(mozilla::FramePropertyDescriptor<mozilla::SmallValueHolder<float> > const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsContainerFrame>(mozilla::FramePropertyDescriptor<nsContainerFrame> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsAbsoluteContainingBlock>(mozilla::FramePropertyDescriptor<nsAbsoluteContainingBlock> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<AutoTArray<nsDisplayItem*, 4ul> >(mozilla::FramePropertyDescriptor<AutoTArray<nsDisplayItem*, 4ul> > const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsFlexContainerFrame::CachedMeasuringReflowResult>(mozilla::FramePropertyDescriptor<nsFlexContainerFrame::CachedMeasuringReflowResult> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsOverflowAreas>(mozilla::FramePropertyDescriptor<nsOverflowAreas> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea> >(mozilla::FramePropertyDescriptor<nsBaseHashtable<nsStringHashKey, mozilla::css::GridNamedArea, mozilla::css::GridNamedArea> > const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsFrameList>(mozilla::FramePropertyDescriptor<nsFrameList> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsTArray<mozilla::css::GridNamedArea> >(mozilla::FramePropertyDescriptor<nsTArray<mozilla::css::GridNamedArea> > const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsGridContainerFrame::SharedGridData>(mozilla::FramePropertyDescriptor<nsGridContainerFrame::SharedGridData> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsPlaceholderFrame>(mozilla::FramePropertyDescriptor<nsPlaceholderFrame> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<TabWidthStore>(mozilla::FramePropertyDescriptor<TabWidthStore> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsTextFrame>(mozilla::FramePropertyDescriptor<nsTextFrame> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<gfxTextRun>(mozilla::FramePropertyDescriptor<gfxTextRun> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<EmphasisMarkInfo>(mozilla::FramePropertyDescriptor<EmphasisMarkInfo> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<mozilla::SVGTextPathObserver>(mozilla::FramePropertyDescriptor<mozilla::SVGTextPathObserver> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<mozilla::SVGFilterObserverListForCSSProp>(mozilla::FramePropertyDescriptor<mozilla::SVGFilterObserverListForCSSProp> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<mozilla::SVGMaskObserverList>(mozilla::FramePropertyDescriptor<mozilla::SVGMaskObserverList> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<mozilla::nsSVGPaintingProperty>(mozilla::FramePropertyDescriptor<mozilla::nsSVGPaintingProperty> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<mozilla::SVGMarkerObserver>(mozilla::FramePropertyDescriptor<mozilla::SVGMarkerObserver> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> >(mozilla::FramePropertyDescriptor<nsInterfaceHashtable<nsRefPtrHashKey<mozilla::URLAndReferrerInfo>, nsIMutationObserver> > const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> >(mozilla::FramePropertyDescriptor<mozilla::gfx::RectTyped<mozilla::gfx::UnknownUnits, double> > const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<mozilla::SVGTemplateElementObserver>(mozilla::FramePropertyDescriptor<mozilla::SVGTemplateElementObserver> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<mozilla::ReflowOutput>(mozilla::FramePropertyDescriptor<mozilla::ReflowOutput> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsTArray<signed char> >(mozilla::FramePropertyDescriptor<nsTArray<signed char> > const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsDisplayListBuilder::DisplayListBuildingData>(mozilla::FramePropertyDescriptor<nsDisplayListBuilder::DisplayListBuildingData> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<mozilla::LayerActivity>(mozilla::FramePropertyDescriptor<mozilla::LayerActivity> const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsRefPtrHashtable<nsGenericHashKey<mozilla::layers::WebRenderUserDataKey>, mozilla::layers::WebRenderUserData> >(mozilla::FramePropertyDescriptor<nsRefPtrHashtable<nsGenericHashKey<mozilla::layers::WebRenderUserDataKey>, mozilla::layers::WebRenderUserData> > const*) Unexecuted instantiation: void nsIFrame::DeleteProperty<nsDisplayListBuilder::OutOfFlowDisplayData>(mozilla::FramePropertyDescriptor<nsDisplayListBuilder::OutOfFlowDisplayData> const*) |
3605 | | |
3606 | | void DeleteAllProperties() |
3607 | 0 | { |
3608 | 0 | mProperties.DeleteAll(this); |
3609 | 0 | } |
3610 | | |
3611 | | // nsIFrames themselves are in the nsPresArena, and so are not measured here. |
3612 | | // Instead, this measures heap-allocated things hanging off the nsIFrame, and |
3613 | | // likewise for its descendants. |
3614 | | virtual void AddSizeOfExcludingThisForTree(nsWindowSizes& aWindowSizes) const; |
3615 | | |
3616 | | /** |
3617 | | * Return true if and only if this frame obeys visibility:hidden. |
3618 | | * if it does not, then nsContainerFrame will hide its view even though |
3619 | | * this means children can't be made visible again. |
3620 | | */ |
3621 | 0 | virtual bool SupportsVisibilityHidden() { return true; } |
3622 | | |
3623 | | /** |
3624 | | * Returns the clip rect set via the 'clip' property, if the 'clip' property |
3625 | | * applies to this frame; otherwise returns Nothing(). The 'clip' property |
3626 | | * applies to HTML frames if they are absolutely positioned. The 'clip' |
3627 | | * property applies to SVG frames regardless of the value of the 'position' |
3628 | | * property. |
3629 | | * |
3630 | | * The coordinates of the returned rectangle are relative to this frame's |
3631 | | * origin. |
3632 | | */ |
3633 | | Maybe<nsRect> GetClipPropClipRect(const nsStyleDisplay* aDisp, |
3634 | | const nsStyleEffects* aEffects, |
3635 | | const nsSize& aSize) const; |
3636 | | |
3637 | | /** |
3638 | | * Check if this frame is focusable and in the current tab order. |
3639 | | * Tabbable is indicated by a nonnegative tabindex & is a subset of focusable. |
3640 | | * For example, only the selected radio button in a group is in the |
3641 | | * tab order, unless the radio group has no selection in which case |
3642 | | * all of the visible, non-disabled radio buttons in the group are |
3643 | | * in the tab order. On the other hand, all of the visible, non-disabled |
3644 | | * radio buttons are always focusable via clicking or script. |
3645 | | * Also, depending on the pref accessibility.tabfocus some widgets may be |
3646 | | * focusable but removed from the tab order. This is the default on |
3647 | | * Mac OS X, where fewer items are focusable. |
3648 | | * @param [in, optional] aTabIndex the computed tab index |
3649 | | * < 0 if not tabbable |
3650 | | * == 0 if in normal tab order |
3651 | | * > 0 can be tabbed to in the order specified by this value |
3652 | | * @param [in, optional] aWithMouse, is this focus query for mouse clicking |
3653 | | * @return whether the frame is focusable via mouse, kbd or script. |
3654 | | */ |
3655 | | virtual bool IsFocusable(int32_t *aTabIndex = nullptr, bool aWithMouse = false); |
3656 | | |
3657 | | // BOX LAYOUT METHODS |
3658 | | // These methods have been migrated from nsIBox and are in the process of |
3659 | | // being refactored. DO NOT USE OUTSIDE OF XUL. |
3660 | | bool IsXULBoxFrame() const |
3661 | 0 | { |
3662 | 0 | return IsFrameOfType(nsIFrame::eXULBox); |
3663 | 0 | } |
3664 | | |
3665 | | enum Halignment { |
3666 | | hAlign_Left, |
3667 | | hAlign_Right, |
3668 | | hAlign_Center |
3669 | | }; |
3670 | | |
3671 | | enum Valignment { |
3672 | | vAlign_Top, |
3673 | | vAlign_Middle, |
3674 | | vAlign_BaseLine, |
3675 | | vAlign_Bottom |
3676 | | }; |
3677 | | |
3678 | | /** |
3679 | | * This calculates the minimum size required for a box based on its state |
3680 | | * @param[in] aBoxLayoutState The desired state to calculate for |
3681 | | * @return The minimum size |
3682 | | */ |
3683 | | virtual nsSize GetXULMinSize(nsBoxLayoutState& aBoxLayoutState) = 0; |
3684 | | |
3685 | | /** |
3686 | | * This calculates the preferred size of a box based on its state |
3687 | | * @param[in] aBoxLayoutState The desired state to calculate for |
3688 | | * @return The preferred size |
3689 | | */ |
3690 | | virtual nsSize GetXULPrefSize(nsBoxLayoutState& aBoxLayoutState) = 0; |
3691 | | |
3692 | | /** |
3693 | | * This calculates the maximum size for a box based on its state |
3694 | | * @param[in] aBoxLayoutState The desired state to calculate for |
3695 | | * @return The maximum size |
3696 | | */ |
3697 | | virtual nsSize GetXULMaxSize(nsBoxLayoutState& aBoxLayoutState) = 0; |
3698 | | |
3699 | | /** |
3700 | | * This returns the minimum size for the scroll area if this frame is |
3701 | | * being scrolled. Usually it's (0,0). |
3702 | | */ |
3703 | | virtual nsSize GetXULMinSizeForScrollArea(nsBoxLayoutState& aBoxLayoutState) = 0; |
3704 | | |
3705 | | // Implemented in nsBox, used in nsBoxFrame |
3706 | | uint32_t GetXULOrdinal(); |
3707 | | |
3708 | | virtual nscoord GetXULFlex() = 0; |
3709 | | virtual nscoord GetXULBoxAscent(nsBoxLayoutState& aBoxLayoutState) = 0; |
3710 | | virtual bool IsXULCollapsed() = 0; |
3711 | | // This does not alter the overflow area. If the caller is changing |
3712 | | // the box size, the caller is responsible for updating the overflow |
3713 | | // area. It's enough to just call XULLayout or SyncLayout on the |
3714 | | // box. You can pass true to aRemoveOverflowArea as a |
3715 | | // convenience. |
3716 | | virtual void SetXULBounds(nsBoxLayoutState& aBoxLayoutState, const nsRect& aRect, |
3717 | | bool aRemoveOverflowAreas = false) = 0; |
3718 | | nsresult XULLayout(nsBoxLayoutState& aBoxLayoutState); |
3719 | | // Box methods. Note that these do NOT just get the CSS border, padding, |
3720 | | // etc. They also talk to nsITheme. |
3721 | | virtual nsresult GetXULBorderAndPadding(nsMargin& aBorderAndPadding); |
3722 | | virtual nsresult GetXULBorder(nsMargin& aBorder)=0; |
3723 | | virtual nsresult GetXULPadding(nsMargin& aBorderAndPadding)=0; |
3724 | | virtual nsresult GetXULMargin(nsMargin& aMargin)=0; |
3725 | 0 | virtual void SetXULLayoutManager(nsBoxLayout* aLayout) { } |
3726 | 0 | virtual nsBoxLayout* GetXULLayoutManager() { return nullptr; } |
3727 | | nsresult GetXULClientRect(nsRect& aContentRect); |
3728 | | |
3729 | | virtual uint32_t GetXULLayoutFlags() |
3730 | 0 | { return 0; } |
3731 | | |
3732 | | // For nsSprocketLayout |
3733 | | virtual Valignment GetXULVAlign() const = 0; |
3734 | | virtual Halignment GetXULHAlign() const = 0; |
3735 | | |
3736 | 0 | bool IsXULHorizontal() const { return (mState & NS_STATE_IS_HORIZONTAL) != 0; } |
3737 | 0 | bool IsXULNormalDirection() const { return (mState & NS_STATE_IS_DIRECTION_NORMAL) != 0; } |
3738 | | |
3739 | | nsresult XULRedraw(nsBoxLayoutState& aState); |
3740 | | virtual nsresult XULRelayoutChildAtOrdinal(nsIFrame* aChild)=0; |
3741 | | |
3742 | | static bool AddXULPrefSize(nsIFrame* aBox, nsSize& aSize, bool& aWidth, bool& aHeightSet); |
3743 | | static bool AddXULMinSize(nsBoxLayoutState& aState, nsIFrame* aBox, |
3744 | | nsSize& aSize, bool& aWidth, bool& aHeightSet); |
3745 | | static bool AddXULMaxSize(nsIFrame* aBox, nsSize& aSize, bool& aWidth, bool& aHeightSet); |
3746 | | static bool AddXULFlex(nsIFrame* aBox, nscoord& aFlex); |
3747 | | |
3748 | | // END OF BOX LAYOUT METHODS |
3749 | | // The above methods have been migrated from nsIBox and are in the process of |
3750 | | // being refactored. DO NOT USE OUTSIDE OF XUL. |
3751 | | |
3752 | | /** |
3753 | | * @return true if this text frame ends with a newline character. It |
3754 | | * should return false if this is not a text frame. |
3755 | | */ |
3756 | | virtual bool HasSignificantTerminalNewline() const; |
3757 | | |
3758 | | struct CaretPosition { |
3759 | | CaretPosition(); |
3760 | | ~CaretPosition(); |
3761 | | |
3762 | | nsCOMPtr<nsIContent> mResultContent; |
3763 | | int32_t mContentOffset; |
3764 | | }; |
3765 | | |
3766 | | /** |
3767 | | * gets the first or last possible caret position within the frame |
3768 | | * |
3769 | | * @param [in] aStart |
3770 | | * true for getting the first possible caret position |
3771 | | * false for getting the last possible caret position |
3772 | | * @return The caret position in a CaretPosition. |
3773 | | * the returned value is a 'best effort' in case errors |
3774 | | * are encountered rummaging through the frame. |
3775 | | */ |
3776 | | CaretPosition GetExtremeCaretPosition(bool aStart); |
3777 | | |
3778 | | /** |
3779 | | * Get a line iterator for this frame, if supported. |
3780 | | * |
3781 | | * @return nullptr if no line iterator is supported. |
3782 | | * @note dispose the line iterator using nsILineIterator::DisposeLineIterator |
3783 | | */ |
3784 | | virtual nsILineIterator* GetLineIterator() = 0; |
3785 | | |
3786 | | /** |
3787 | | * If this frame is a next-in-flow, and its prev-in-flow has something on its |
3788 | | * overflow list, pull those frames into the child list of this one. |
3789 | | */ |
3790 | 0 | virtual void PullOverflowsFromPrevInFlow() {} |
3791 | | |
3792 | | /** |
3793 | | * Clear the list of child PresShells generated during the last paint |
3794 | | * so that we can begin generating a new one. |
3795 | | */ |
3796 | 0 | void ClearPresShellsFromLastPaint() { |
3797 | 0 | PaintedPresShellList()->Clear(); |
3798 | 0 | } |
3799 | | |
3800 | | /** |
3801 | | * Flag a child PresShell as painted so that it will get its paint count |
3802 | | * incremented during empty transactions. |
3803 | | */ |
3804 | 0 | void AddPaintedPresShell(nsIPresShell* shell) { |
3805 | 0 | PaintedPresShellList()->AppendElement(do_GetWeakReference(shell)); |
3806 | 0 | } |
3807 | | |
3808 | | /** |
3809 | | * Increment the paint count of all child PresShells that were painted during |
3810 | | * the last repaint. |
3811 | | */ |
3812 | 0 | void UpdatePaintCountForPaintedPresShells() { |
3813 | 0 | for (nsWeakPtr& item : *PaintedPresShellList()) { |
3814 | 0 | nsCOMPtr<nsIPresShell> shell = do_QueryReferent(item); |
3815 | 0 | if (shell) { |
3816 | 0 | shell->IncrementPaintCount(); |
3817 | 0 | } |
3818 | 0 | } |
3819 | 0 | } |
3820 | | |
3821 | | /** |
3822 | | * @return true if we painted @aShell during the last repaint. |
3823 | | */ |
3824 | | bool DidPaintPresShell(nsIPresShell* aShell) |
3825 | | { |
3826 | | for (nsWeakPtr& item : *PaintedPresShellList()) { |
3827 | | nsCOMPtr<nsIPresShell> shell = do_QueryReferent(item); |
3828 | | if (shell == aShell) { |
3829 | | return true; |
3830 | | } |
3831 | | } |
3832 | | return false; |
3833 | | } |
3834 | | |
3835 | | /** |
3836 | | * Accessors for the absolute containing block. |
3837 | | */ |
3838 | 0 | bool IsAbsoluteContainer() const { return !!(mState & NS_FRAME_HAS_ABSPOS_CHILDREN); } |
3839 | | bool HasAbsolutelyPositionedChildren() const; |
3840 | | nsAbsoluteContainingBlock* GetAbsoluteContainingBlock() const; |
3841 | | void MarkAsAbsoluteContainingBlock(); |
3842 | | void MarkAsNotAbsoluteContainingBlock(); |
3843 | | // Child frame types override this function to select their own child list name |
3844 | 0 | virtual mozilla::layout::FrameChildListID GetAbsoluteListID() const { return kAbsoluteList; } |
3845 | | |
3846 | | // Checks if we (or any of our descendents) have NS_FRAME_PAINTED_THEBES set, and |
3847 | | // clears this bit if so. |
3848 | | bool CheckAndClearPaintedState(); |
3849 | | |
3850 | | // Checks if we (or any of our descendents) have mBuiltDisplayList set, and |
3851 | | // clears this bit if so. |
3852 | | bool CheckAndClearDisplayListState(); |
3853 | | |
3854 | | // CSS visibility just doesn't cut it because it doesn't inherit through |
3855 | | // documents. Also if this frame is in a hidden card of a deck then it isn't |
3856 | | // visible either and that isn't expressed using CSS visibility. Also if it |
3857 | | // is in a hidden view (there are a few cases left and they are hopefully |
3858 | | // going away soon). |
3859 | | // If the VISIBILITY_CROSS_CHROME_CONTENT_BOUNDARY flag is passed then we |
3860 | | // ignore the chrome/content boundary, otherwise we stop looking when we |
3861 | | // reach it. |
3862 | | enum { |
3863 | | VISIBILITY_CROSS_CHROME_CONTENT_BOUNDARY = 0x01 |
3864 | | }; |
3865 | | bool IsVisibleConsideringAncestors(uint32_t aFlags = 0) const; |
3866 | | |
3867 | | struct FrameWithDistance |
3868 | | { |
3869 | | nsIFrame* mFrame; |
3870 | | nscoord mXDistance; |
3871 | | nscoord mYDistance; |
3872 | | }; |
3873 | | |
3874 | | /** |
3875 | | * Finds a frame that is closer to a specified point than a current |
3876 | | * distance. Distance is measured as for text selection -- a closer x |
3877 | | * distance beats a closer y distance. |
3878 | | * |
3879 | | * Normally, this function will only check the distance between this |
3880 | | * frame's rectangle and the specified point. SVGTextFrame overrides |
3881 | | * this so that it can manage all of its descendant frames and take |
3882 | | * into account any SVG text layout. |
3883 | | * |
3884 | | * If aPoint is closer to this frame's rectangle than aCurrentBestFrame |
3885 | | * indicates, then aCurrentBestFrame is updated with the distance between |
3886 | | * aPoint and this frame's rectangle, and with a pointer to this frame. |
3887 | | * If aPoint is not closer, then aCurrentBestFrame is left unchanged. |
3888 | | * |
3889 | | * @param aPoint The point to check for its distance to this frame. |
3890 | | * @param aCurrentBestFrame Pointer to a struct that will be updated with |
3891 | | * a pointer to this frame and its distance to aPoint, if this frame |
3892 | | * is indeed closer than the current distance in aCurrentBestFrame. |
3893 | | */ |
3894 | | virtual void FindCloserFrameForSelection(const nsPoint& aPoint, |
3895 | | FrameWithDistance* aCurrentBestFrame); |
3896 | | |
3897 | | /** |
3898 | | * Is this a flex item? (i.e. a non-abs-pos child of a flex container) |
3899 | | */ |
3900 | | inline bool IsFlexItem() const; |
3901 | | /** |
3902 | | * Is this a flex or grid item? (i.e. a non-abs-pos child of a flex/grid container) |
3903 | | */ |
3904 | | inline bool IsFlexOrGridItem() const; |
3905 | | inline bool IsFlexOrGridContainer() const; |
3906 | | |
3907 | | /** |
3908 | | * @return true if this frame is used as a table caption. |
3909 | | */ |
3910 | | inline bool IsTableCaption() const; |
3911 | | |
3912 | | inline bool IsBlockInside() const; |
3913 | | inline bool IsBlockOutside() const; |
3914 | | inline bool IsInlineOutside() const; |
3915 | | inline mozilla::StyleDisplay GetDisplay() const; |
3916 | | inline bool IsFloating() const; |
3917 | | inline bool IsAbsPosContainingBlock() const; |
3918 | | inline bool IsFixedPosContainingBlock() const; |
3919 | | inline bool IsRelativelyPositioned() const; |
3920 | | inline bool IsAbsolutelyPositioned(const nsStyleDisplay* aStyleDisplay = nullptr) const; |
3921 | | |
3922 | | /** |
3923 | | * Returns the vertical-align value to be used for layout, if it is one |
3924 | | * of the enumerated values. If this is an SVG text frame, it returns a value |
3925 | | * that corresponds to the value of dominant-baseline. If the |
3926 | | * vertical-align property has length or percentage value, this returns |
3927 | | * eInvalidVerticalAlign. |
3928 | | */ |
3929 | | uint8_t VerticalAlignEnum() const; |
3930 | | enum { eInvalidVerticalAlign = 0xFF }; |
3931 | | |
3932 | | void CreateOwnLayerIfNeeded(nsDisplayListBuilder* aBuilder, nsDisplayList* aList, |
3933 | | bool* aCreatedContainerItem = nullptr); |
3934 | | |
3935 | | /** |
3936 | | * Adds the NS_FRAME_IN_POPUP state bit to aFrame, and |
3937 | | * all descendant frames (including cross-doc ones). |
3938 | | */ |
3939 | | static void AddInPopupStateBitToDescendants(nsIFrame* aFrame); |
3940 | | /** |
3941 | | * Removes the NS_FRAME_IN_POPUP state bit from aFrame and |
3942 | | * all descendant frames (including cross-doc ones), unless |
3943 | | * the frame is a popup itself. |
3944 | | */ |
3945 | | static void RemoveInPopupStateBitFromDescendants(nsIFrame* aFrame); |
3946 | | |
3947 | | /** |
3948 | | * Sorts the given nsFrameList, so that for every two adjacent frames in the |
3949 | | * list, the former is less than or equal to the latter, according to the |
3950 | | * templated IsLessThanOrEqual method. |
3951 | | * |
3952 | | * Note: this method uses a stable merge-sort algorithm. |
3953 | | */ |
3954 | | template<bool IsLessThanOrEqual(nsIFrame*, nsIFrame*)> |
3955 | | static void SortFrameList(nsFrameList& aFrameList); |
3956 | | |
3957 | | /** |
3958 | | * Returns true if the given frame list is already sorted, according to the |
3959 | | * templated IsLessThanOrEqual function. |
3960 | | */ |
3961 | | template<bool IsLessThanOrEqual(nsIFrame*, nsIFrame*)> |
3962 | | static bool IsFrameListSorted(nsFrameList& aFrameList); |
3963 | | |
3964 | | /** |
3965 | | * Return true if aFrame is in an {ib} split and is NOT one of the |
3966 | | * continuations of the first inline in it. |
3967 | | */ |
3968 | 0 | bool FrameIsNonFirstInIBSplit() const { |
3969 | 0 | return (GetStateBits() & NS_FRAME_PART_OF_IBSPLIT) && |
3970 | 0 | FirstContinuation()->GetProperty(nsIFrame::IBSplitPrevSibling()); |
3971 | 0 | } |
3972 | | |
3973 | | /** |
3974 | | * Return true if aFrame is in an {ib} split and is NOT one of the |
3975 | | * continuations of the last inline in it. |
3976 | | */ |
3977 | 0 | bool FrameIsNonLastInIBSplit() const { |
3978 | 0 | return (GetStateBits() & NS_FRAME_PART_OF_IBSPLIT) && |
3979 | 0 | FirstContinuation()->GetProperty(nsIFrame::IBSplitSibling()); |
3980 | 0 | } |
3981 | | |
3982 | | /** |
3983 | | * Return whether this is a frame whose width is used when computing |
3984 | | * the font size inflation of its descendants. |
3985 | | */ |
3986 | 0 | bool IsContainerForFontSizeInflation() const { |
3987 | 0 | return GetStateBits() & NS_FRAME_FONT_INFLATION_CONTAINER; |
3988 | 0 | } |
3989 | | |
3990 | | /** |
3991 | | * Return whether this frame keeps track of overflow areas. (Frames for |
3992 | | * non-display SVG elements -- e.g. <clipPath> -- do not maintain overflow |
3993 | | * areas, because they're never painted.) |
3994 | | */ |
3995 | 0 | bool FrameMaintainsOverflow() const { |
3996 | 0 | return !HasAllStateBits(NS_FRAME_SVG_LAYOUT | NS_FRAME_IS_NONDISPLAY); |
3997 | 0 | } |
3998 | | |
3999 | | /* |
4000 | | * @param aStyleDisplay: If the caller has this->StyleDisplay(), providing |
4001 | | * it here will improve performance. |
4002 | | */ |
4003 | 0 | bool BackfaceIsHidden(const nsStyleDisplay* aStyleDisplay) const { |
4004 | 0 | MOZ_ASSERT(aStyleDisplay == StyleDisplay()); |
4005 | 0 | return aStyleDisplay->BackfaceIsHidden(); |
4006 | 0 | } |
4007 | | bool BackfaceIsHidden() const { |
4008 | | return StyleDisplay()->BackfaceIsHidden(); |
4009 | | } |
4010 | | |
4011 | | /** |
4012 | | * Returns true if the frame is scrolled out of view. |
4013 | | */ |
4014 | | bool IsScrolledOutOfView() const; |
4015 | | |
4016 | | /** |
4017 | | * Computes a 2D matrix from the -moz-window-transform and |
4018 | | * -moz-window-transform-origin properties on aFrame. |
4019 | | * Values that don't result in a 2D matrix will be ignored and an identity |
4020 | | * matrix will be returned instead. |
4021 | | */ |
4022 | | Matrix ComputeWidgetTransform(); |
4023 | | |
4024 | | /** |
4025 | | * Applies the values from the -moz-window-* properties to the widget. |
4026 | | */ |
4027 | | virtual void UpdateWidgetProperties(); |
4028 | | |
4029 | | /** |
4030 | | * @return true iff this frame has one or more associated image requests. |
4031 | | * @see mozilla::css::ImageLoader. |
4032 | | */ |
4033 | 0 | bool HasImageRequest() const { return mHasImageRequest; } |
4034 | | |
4035 | | /** |
4036 | | * Update this frame's image request state. |
4037 | | */ |
4038 | | void SetHasImageRequest(bool aHasRequest) { mHasImageRequest = aHasRequest; } |
4039 | | |
4040 | | /** |
4041 | | * Whether this frame has a first-letter child. If it does, the frame is |
4042 | | * actually an nsContainerFrame and the first-letter frame can be gotten by |
4043 | | * walking up to the nearest ancestor blockframe and getting its first |
4044 | | * continuation's nsContainerFrame::FirstLetterProperty() property. This will |
4045 | | * only return true for the first continuation of the first-letter's parent. |
4046 | | */ |
4047 | 0 | bool HasFirstLetterChild() const { return mHasFirstLetterChild; } |
4048 | | |
4049 | | /** |
4050 | | * Whether this frame's parent is a wrapper anonymous box. See documentation |
4051 | | * for mParentIsWrapperAnonBox. |
4052 | | */ |
4053 | 0 | bool ParentIsWrapperAnonBox() const { return mParentIsWrapperAnonBox; } |
4054 | 0 | void SetParentIsWrapperAnonBox() { mParentIsWrapperAnonBox = true; } |
4055 | | |
4056 | | /** |
4057 | | * Whether this is a wrapper anonymous box needing a restyle. |
4058 | | */ |
4059 | 0 | bool IsWrapperAnonBoxNeedingRestyle() const { |
4060 | 0 | return mIsWrapperBoxNeedingRestyle; |
4061 | 0 | } |
4062 | 0 | void SetIsWrapperAnonBoxNeedingRestyle(bool aNeedsRestyle) { |
4063 | 0 | mIsWrapperBoxNeedingRestyle = aNeedsRestyle; |
4064 | 0 | } |
4065 | | |
4066 | 0 | bool MayHaveTransformAnimation() const { |
4067 | 0 | return mMayHaveTransformAnimation; |
4068 | 0 | } |
4069 | | void SetMayHaveTransformAnimation() { |
4070 | | mMayHaveTransformAnimation = true; |
4071 | | } |
4072 | 0 | bool MayHaveOpacityAnimation() const { |
4073 | 0 | return mMayHaveOpacityAnimation; |
4074 | 0 | } |
4075 | | void SetMayHaveOpacityAnimation() { |
4076 | | mMayHaveOpacityAnimation = true; |
4077 | | } |
4078 | | |
4079 | | // Returns true if this frame is visible or may have visible descendants. |
4080 | | bool IsVisibleOrMayHaveVisibleDescendants() const { |
4081 | | return !mAllDescendantsAreInvisible || StyleVisibility()->IsVisible(); |
4082 | | } |
4083 | | // Update mAllDescendantsAreInvisible flag for this frame and ancestors. |
4084 | | void UpdateVisibleDescendantsState(); |
4085 | | |
4086 | | /** |
4087 | | * If this returns true, the frame it's called on should get the |
4088 | | * NS_FRAME_HAS_DIRTY_CHILDREN bit set on it by the caller; either directly |
4089 | | * if it's already in reflow, or via calling FrameNeedsReflow() to schedule a |
4090 | | * reflow. |
4091 | | */ |
4092 | | virtual bool RenumberFrameAndDescendants(int32_t* aOrdinal, |
4093 | | int32_t aDepth, |
4094 | | int32_t aIncrement, |
4095 | 0 | bool aForCounting) { return false; } |
4096 | | |
4097 | | /** |
4098 | | * Helper function - computes the content-box inline size for aCoord. |
4099 | | */ |
4100 | | nscoord ComputeISizeValue(gfxContext* aRenderingContext, |
4101 | | nscoord aContainingBlockISize, |
4102 | | nscoord aContentEdgeToBoxSizing, |
4103 | | nscoord aBoxSizingToMarginEdge, |
4104 | | const nsStyleCoord& aCoord, |
4105 | | ComputeSizeFlags aFlags = eDefault); |
4106 | | |
4107 | | DisplayItemDataArray& DisplayItemData() { return mDisplayItemData; } |
4108 | | |
4109 | | void AddDisplayItem(nsDisplayItem* aItem); |
4110 | | bool RemoveDisplayItem(nsDisplayItem* aItem); |
4111 | | void RemoveDisplayItemDataForDeletion(); |
4112 | | bool HasDisplayItems(); |
4113 | | bool HasDisplayItem(nsDisplayItem* aItem); |
4114 | | |
4115 | 0 | bool ForceDescendIntoIfVisible() { return mForceDescendIntoIfVisible; } |
4116 | 0 | void SetForceDescendIntoIfVisible(bool aForce) { mForceDescendIntoIfVisible = aForce; } |
4117 | | |
4118 | 0 | bool BuiltDisplayList() { return mBuiltDisplayList; } |
4119 | 0 | void SetBuiltDisplayList(bool aBuilt) { mBuiltDisplayList = aBuilt; } |
4120 | | |
4121 | 0 | bool IsFrameModified() { return mFrameIsModified; } |
4122 | 0 | void SetFrameIsModified(bool aFrameIsModified) { mFrameIsModified = aFrameIsModified; } |
4123 | | |
4124 | 0 | bool HasOverrideDirtyRegion() { return mHasOverrideDirtyRegion; } |
4125 | 0 | void SetHasOverrideDirtyRegion(bool aHasDirtyRegion) { mHasOverrideDirtyRegion = aHasDirtyRegion; } |
4126 | | |
4127 | 0 | bool MayHaveWillChangeBudget() { return mMayHaveWillChangeBudget; } |
4128 | 0 | void SetMayHaveWillChangeBudget(bool aHasBudget) { mMayHaveWillChangeBudget = aHasBudget; } |
4129 | | |
4130 | | /** |
4131 | | * Returns the set of flags indicating the properties of the frame that the |
4132 | | * compositor might care about for hit-testing purposes. Note that this function |
4133 | | * must be called during Gecko display list construction time (i.e while the |
4134 | | * frame tree is being traversed) because that is when the display list builder |
4135 | | * has the necessary state set up correctly. |
4136 | | */ |
4137 | | mozilla::gfx::CompositorHitTestInfo GetCompositorHitTestInfo(nsDisplayListBuilder* aBuilder); |
4138 | | |
4139 | | protected: |
4140 | | static void DestroyAnonymousContent(nsPresContext* aPresContext, |
4141 | | already_AddRefed<nsIContent>&& aContent); |
4142 | | |
4143 | | /** |
4144 | | * Reparent this frame's view if it has one. |
4145 | | */ |
4146 | | void ReparentFrameViewTo(nsViewManager* aViewManager, |
4147 | | nsView* aNewParentView, |
4148 | | nsView* aOldParentView); |
4149 | | |
4150 | | /** |
4151 | | * To be overridden by frame classes that have a varying IsLeaf() state and |
4152 | | * is indicating that with DynamicLeaf in nsFrameIdList.h. |
4153 | | * @see IsLeaf() |
4154 | | */ |
4155 | 0 | virtual bool IsLeafDynamic() const { return false; } |
4156 | | |
4157 | | // Members |
4158 | | nsRect mRect; |
4159 | | nsCOMPtr<nsIContent> mContent; |
4160 | | RefPtr<ComputedStyle> mComputedStyle; |
4161 | | private: |
4162 | | nsContainerFrame* mParent; |
4163 | | nsIFrame* mNextSibling; // doubly-linked list of frames |
4164 | | nsIFrame* mPrevSibling; // Do not touch outside SetNextSibling! |
4165 | | |
4166 | | DisplayItemDataArray mDisplayItemData; |
4167 | | |
4168 | | void MarkAbsoluteFramesForDisplayList(nsDisplayListBuilder* aBuilder); |
4169 | | |
4170 | | static void DestroyPaintedPresShellList(nsTArray<nsWeakPtr>* list) { |
4171 | | list->Clear(); |
4172 | | delete list; |
4173 | | } |
4174 | | |
4175 | | // Stores weak references to all the PresShells that were painted during |
4176 | | // the last paint event so that we can increment their paint count during |
4177 | | // empty transactions |
4178 | | NS_DECLARE_FRAME_PROPERTY_WITH_DTOR(PaintedPresShellsProperty, |
4179 | | nsTArray<nsWeakPtr>, |
4180 | | DestroyPaintedPresShellList) |
4181 | | |
4182 | | nsTArray<nsWeakPtr>* PaintedPresShellList() { |
4183 | | nsTArray<nsWeakPtr>* list = GetProperty(PaintedPresShellsProperty()); |
4184 | | |
4185 | | if (!list) { |
4186 | | list = new nsTArray<nsWeakPtr>(); |
4187 | | SetProperty(PaintedPresShellsProperty(), list); |
4188 | | } |
4189 | | |
4190 | | return list; |
4191 | | } |
4192 | | |
4193 | | protected: |
4194 | | /** |
4195 | | * Copies aRootElemWM to mWritingMode on 'this' and all its ancestors. |
4196 | | */ |
4197 | | inline void PropagateRootElementWritingMode(mozilla::WritingMode aRootElemWM); |
4198 | | |
4199 | 0 | void MarkInReflow() { |
4200 | | #ifdef DEBUG_dbaron_off |
4201 | | // bug 81268 |
4202 | | NS_ASSERTION(!(mState & NS_FRAME_IN_REFLOW), "frame is already in reflow"); |
4203 | | #endif |
4204 | | AddStateBits(NS_FRAME_IN_REFLOW); |
4205 | 0 | } |
4206 | | |
4207 | | nsFrameState mState; |
4208 | | |
4209 | | /** |
4210 | | * List of properties attached to the frame. |
4211 | | */ |
4212 | | FrameProperties mProperties; |
4213 | | |
4214 | | // When there is an overflow area only slightly larger than mRect, |
4215 | | // we store a set of four 1-byte deltas from the edges of mRect |
4216 | | // rather than allocating a whole separate rectangle property. |
4217 | | // Note that these are unsigned values, all measured "outwards" |
4218 | | // from the edges of mRect, so /mLeft/ and /mTop/ are reversed from |
4219 | | // our normal coordinate system. |
4220 | | // If mOverflow.mType == NS_FRAME_OVERFLOW_LARGE, then the |
4221 | | // delta values are not meaningful and the overflow area is stored |
4222 | | // as a separate rect property. |
4223 | | struct VisualDeltas { |
4224 | | uint8_t mLeft; |
4225 | | uint8_t mTop; |
4226 | | uint8_t mRight; |
4227 | | uint8_t mBottom; |
4228 | | bool operator==(const VisualDeltas& aOther) const |
4229 | 0 | { |
4230 | 0 | return mLeft == aOther.mLeft && mTop == aOther.mTop && |
4231 | 0 | mRight == aOther.mRight && mBottom == aOther.mBottom; |
4232 | 0 | } |
4233 | | bool operator!=(const VisualDeltas& aOther) const |
4234 | 0 | { |
4235 | 0 | return !(*this == aOther); |
4236 | 0 | } |
4237 | | }; |
4238 | | union { |
4239 | | uint32_t mType; |
4240 | | VisualDeltas mVisualDeltas; |
4241 | | } mOverflow; |
4242 | | |
4243 | | /** @see GetWritingMode() */ |
4244 | | mozilla::WritingMode mWritingMode; |
4245 | | |
4246 | | /** The ClassID of the concrete class of this instance. */ |
4247 | | ClassID mClass; // 1 byte |
4248 | | |
4249 | | bool mMayHaveRoundedCorners : 1; |
4250 | | |
4251 | | /** |
4252 | | * True iff this frame has one or more associated image requests. |
4253 | | * @see mozilla::css::ImageLoader. |
4254 | | */ |
4255 | | bool mHasImageRequest : 1; |
4256 | | |
4257 | | /** |
4258 | | * True if this frame has a continuation that has a first-letter frame, or its |
4259 | | * placeholder, as a child. In that case this frame has a blockframe ancestor |
4260 | | * that has the first-letter frame hanging off it in the |
4261 | | * nsContainerFrame::FirstLetterProperty() property. |
4262 | | */ |
4263 | | bool mHasFirstLetterChild : 1; |
4264 | | |
4265 | | /** |
4266 | | * True if this frame's parent is a wrapper anonymous box (e.g. a table |
4267 | | * anonymous box as specified at |
4268 | | * <https://www.w3.org/TR/CSS21/tables.html#anonymous-boxes>). |
4269 | | * |
4270 | | * We could compute this information directly when we need it, but it wouldn't |
4271 | | * be all that cheap, and since this information is immutable for the lifetime |
4272 | | * of the frame we might as well cache it. |
4273 | | * |
4274 | | * Note that our parent may itself have mParentIsWrapperAnonBox set to true. |
4275 | | */ |
4276 | | bool mParentIsWrapperAnonBox : 1; |
4277 | | |
4278 | | /** |
4279 | | * True if this is a wrapper anonymous box needing a restyle. This is used to |
4280 | | * track, during stylo post-traversal, whether we've already recomputed the |
4281 | | * style of this anonymous box, if we end up seeing it twice. |
4282 | | */ |
4283 | | bool mIsWrapperBoxNeedingRestyle : 1; |
4284 | | |
4285 | | /** |
4286 | | * This bit is used in nsTextFrame::CharacterDataChanged() as an optimization |
4287 | | * to skip redundant reflow-requests when the character data changes multiple |
4288 | | * times between reflows. If this flag is set, then it implies that the |
4289 | | * NS_FRAME_IS_DIRTY state bit is also set (and that intrinsic sizes have |
4290 | | * been marked as dirty on our ancestor chain). |
4291 | | * |
4292 | | * XXXdholbert This bit is *only* used on nsTextFrame, but it lives here on |
4293 | | * nsIFrame simply because this is where we've got unused state bits |
4294 | | * available in a gap. If bits become more scarce, we should perhaps consider |
4295 | | * expanding the range of frame-specific state bits in nsFrameStateBits.h and |
4296 | | * moving this to be one of those (e.g. by swapping one of the adjacent |
4297 | | * general-purpose bits to take the place of this bool:1 here, so we can grow |
4298 | | * that range of frame-specific bits by 1). |
4299 | | */ |
4300 | | bool mReflowRequestedForCharDataChange : 1; |
4301 | | |
4302 | | /** |
4303 | | * This bit is used during BuildDisplayList to mark frames that need to |
4304 | | * have display items rebuilt. We will descend into them if they are |
4305 | | * currently visible, even if they don't intersect the dirty area. |
4306 | | */ |
4307 | | bool mForceDescendIntoIfVisible : 1; |
4308 | | |
4309 | | /** |
4310 | | * True if we have built display items for this frame since |
4311 | | * the last call to CheckAndClearDisplayListState, false |
4312 | | * otherwise. Used for the reftest harness to verify minimal |
4313 | | * display list building. |
4314 | | */ |
4315 | | bool mBuiltDisplayList : 1; |
4316 | | |
4317 | | bool mFrameIsModified : 1; |
4318 | | |
4319 | | bool mHasOverrideDirtyRegion : 1; |
4320 | | |
4321 | | /** |
4322 | | * True if frame has will-change, and currently has display |
4323 | | * items consuming some of the will-change budget. |
4324 | | */ |
4325 | | bool mMayHaveWillChangeBudget : 1; |
4326 | | |
4327 | | private: |
4328 | | /** |
4329 | | * True if this is the primary frame for mContent. |
4330 | | */ |
4331 | | bool mIsPrimaryFrame : 1; |
4332 | | |
4333 | | bool mMayHaveTransformAnimation : 1; |
4334 | | bool mMayHaveOpacityAnimation : 1; |
4335 | | |
4336 | | /** |
4337 | | * True if we are certain that all descendants are not visible. |
4338 | | * |
4339 | | * This flag is conservative in that it might sometimes be false even if, in |
4340 | | * fact, all descendants are invisible. |
4341 | | * For example; an element is visibility:visible and has a visibility:hidden |
4342 | | * child. This flag is stil false in such case. |
4343 | | */ |
4344 | | bool mAllDescendantsAreInvisible : 1; |
4345 | | |
4346 | | protected: |
4347 | | |
4348 | | // There is a 1-bit gap left here. |
4349 | | |
4350 | | // Helpers |
4351 | | /** |
4352 | | * Can we stop inside this frame when we're skipping non-rendered whitespace? |
4353 | | * @param aForward [in] Are we moving forward (or backward) in content order. |
4354 | | * @param aOffset [in/out] At what offset into the frame to start looking. |
4355 | | * on output - what offset was reached (whether or not we found a place to stop). |
4356 | | * @return STOP: An appropriate offset was found within this frame, |
4357 | | * and is given by aOffset. |
4358 | | * CONTINUE: Not found within this frame, need to try the next frame. |
4359 | | * see enum FrameSearchResult for more details. |
4360 | | */ |
4361 | | virtual FrameSearchResult PeekOffsetNoAmount(bool aForward, int32_t* aOffset) = 0; |
4362 | | |
4363 | | /** |
4364 | | * Search the frame for the next character |
4365 | | * @param aForward [in] Are we moving forward (or backward) in content order. |
4366 | | * @param aOffset [in/out] At what offset into the frame to start looking. |
4367 | | * on output - what offset was reached (whether or not we found a place to stop). |
4368 | | * @param aOptions [in] Options, see the comment in |
4369 | | * PeekOffsetCharacterOptions for the detail. |
4370 | | * @return STOP: An appropriate offset was found within this frame, |
4371 | | * and is given by aOffset. |
4372 | | * CONTINUE: Not found within this frame, need to try the next frame. |
4373 | | * see enum FrameSearchResult for more details. |
4374 | | */ |
4375 | | virtual FrameSearchResult |
4376 | | PeekOffsetCharacter(bool aForward, int32_t* aOffset, |
4377 | | PeekOffsetCharacterOptions aOptions = |
4378 | | PeekOffsetCharacterOptions()) = 0; |
4379 | | static_assert(sizeof(PeekOffsetCharacterOptions) <= sizeof(intptr_t), |
4380 | | "aOptions should be changed to const reference"); |
4381 | | |
4382 | | /** |
4383 | | * Search the frame for the next word boundary |
4384 | | * @param aForward [in] Are we moving forward (or backward) in content order. |
4385 | | * @param aWordSelectEatSpace [in] true: look for non-whitespace following |
4386 | | * whitespace (in the direction of movement). |
4387 | | * false: look for whitespace following non-whitespace (in the |
4388 | | * direction of movement). |
4389 | | * @param aIsKeyboardSelect [in] Was the action initiated by a keyboard operation? |
4390 | | * If true, punctuation immediately following a word is considered part |
4391 | | * of that word. Otherwise, a sequence of punctuation is always considered |
4392 | | * as a word on its own. |
4393 | | * @param aOffset [in/out] At what offset into the frame to start looking. |
4394 | | * on output - what offset was reached (whether or not we found a place to stop). |
4395 | | * @param aState [in/out] the state that is carried from frame to frame |
4396 | | * @return true: An appropriate offset was found within this frame, |
4397 | | * and is given by aOffset. |
4398 | | * false: Not found within this frame, need to try the next frame. |
4399 | | */ |
4400 | | struct PeekWordState { |
4401 | | // true when we're still at the start of the search, i.e., we can't return |
4402 | | // this point as a valid offset! |
4403 | | bool mAtStart; |
4404 | | // true when we've encountered at least one character of the pre-boundary type |
4405 | | // (whitespace if aWordSelectEatSpace is true, non-whitespace otherwise) |
4406 | | bool mSawBeforeType; |
4407 | | // true when the last character encountered was punctuation |
4408 | | bool mLastCharWasPunctuation; |
4409 | | // true when the last character encountered was whitespace |
4410 | | bool mLastCharWasWhitespace; |
4411 | | // true when we've seen non-punctuation since the last whitespace |
4412 | | bool mSeenNonPunctuationSinceWhitespace; |
4413 | | // text that's *before* the current frame when aForward is true, *after* |
4414 | | // the current frame when aForward is false. Only includes the text |
4415 | | // on the current line. |
4416 | | nsAutoString mContext; |
4417 | | |
4418 | | PeekWordState() : mAtStart(true), mSawBeforeType(false), |
4419 | | mLastCharWasPunctuation(false), mLastCharWasWhitespace(false), |
4420 | 0 | mSeenNonPunctuationSinceWhitespace(false) {} |
4421 | 0 | void SetSawBeforeType() { mSawBeforeType = true; } |
4422 | 0 | void Update(bool aAfterPunctuation, bool aAfterWhitespace) { |
4423 | 0 | mLastCharWasPunctuation = aAfterPunctuation; |
4424 | 0 | mLastCharWasWhitespace = aAfterWhitespace; |
4425 | 0 | if (aAfterWhitespace) { |
4426 | 0 | mSeenNonPunctuationSinceWhitespace = false; |
4427 | 0 | } else if (!aAfterPunctuation) { |
4428 | 0 | mSeenNonPunctuationSinceWhitespace = true; |
4429 | 0 | } |
4430 | 0 | mAtStart = false; |
4431 | 0 | } |
4432 | | }; |
4433 | | virtual FrameSearchResult PeekOffsetWord(bool aForward, bool aWordSelectEatSpace, bool aIsKeyboardSelect, |
4434 | | int32_t* aOffset, PeekWordState* aState) = 0; |
4435 | | |
4436 | | /** |
4437 | | * Search for the first paragraph boundary before or after the given position |
4438 | | * @param aPos See description in nsFrameSelection.h. The following fields are |
4439 | | * used by this method: |
4440 | | * Input: mDirection |
4441 | | * Output: mResultContent, mContentOffset |
4442 | | */ |
4443 | | nsresult PeekOffsetParagraph(nsPeekOffsetStruct *aPos); |
4444 | | |
4445 | | private: |
4446 | | // Get a pointer to the overflow areas property attached to the frame. |
4447 | 0 | nsOverflowAreas* GetOverflowAreasProperty() const { |
4448 | 0 | MOZ_ASSERT(mOverflow.mType == NS_FRAME_OVERFLOW_LARGE); |
4449 | 0 | nsOverflowAreas* overflow = GetProperty(OverflowAreasProperty()); |
4450 | 0 | MOZ_ASSERT(overflow); |
4451 | 0 | return overflow; |
4452 | 0 | } |
4453 | | |
4454 | 0 | nsRect GetVisualOverflowFromDeltas() const { |
4455 | 0 | MOZ_ASSERT(mOverflow.mType != NS_FRAME_OVERFLOW_LARGE, |
4456 | 0 | "should not be called when overflow is in a property"); |
4457 | 0 | // Calculate the rect using deltas from the frame's border rect. |
4458 | 0 | // Note that the mOverflow.mDeltas fields are unsigned, but we will often |
4459 | 0 | // need to return negative values for the left and top, so take care |
4460 | 0 | // to cast away the unsigned-ness. |
4461 | 0 | return nsRect(-(int32_t)mOverflow.mVisualDeltas.mLeft, |
4462 | 0 | -(int32_t)mOverflow.mVisualDeltas.mTop, |
4463 | 0 | mRect.Width() + mOverflow.mVisualDeltas.mRight + |
4464 | 0 | mOverflow.mVisualDeltas.mLeft, |
4465 | 0 | mRect.Height() + mOverflow.mVisualDeltas.mBottom + |
4466 | 0 | mOverflow.mVisualDeltas.mTop); |
4467 | 0 | } |
4468 | | /** |
4469 | | * Returns true if any overflow changed. |
4470 | | */ |
4471 | | bool SetOverflowAreas(const nsOverflowAreas& aOverflowAreas); |
4472 | | |
4473 | | // Helper-functions for SortFrameList(): |
4474 | | template<bool IsLessThanOrEqual(nsIFrame*, nsIFrame*)> |
4475 | | static nsIFrame* SortedMerge(nsIFrame *aLeft, nsIFrame *aRight); |
4476 | | |
4477 | | template<bool IsLessThanOrEqual(nsIFrame*, nsIFrame*)> |
4478 | | static nsIFrame* MergeSort(nsIFrame *aSource); |
4479 | | |
4480 | | bool HasOpacityInternal(float aThreshold, |
4481 | | mozilla::EffectSet* aEffectSet = nullptr) const; |
4482 | | |
4483 | | // Maps mClass to LayoutFrameType. |
4484 | | static const mozilla::LayoutFrameType sLayoutFrameTypes[ |
4485 | | #define FRAME_ID(...) 1 + |
4486 | | #define ABSTRACT_FRAME_ID(...) |
4487 | | #include "nsFrameIdList.h" |
4488 | | #undef FRAME_ID |
4489 | | #undef ABSTRACT_FRAME_ID |
4490 | | 0]; |
4491 | | |
4492 | | enum FrameClassBits { |
4493 | | eFrameClassBitsNone = 0x0, |
4494 | | eFrameClassBitsLeaf = 0x1, |
4495 | | eFrameClassBitsDynamicLeaf = 0x2, |
4496 | | }; |
4497 | | // Maps mClass to IsLeaf() flags. |
4498 | | static const FrameClassBits sFrameClassBits[ |
4499 | | #define FRAME_ID(...) 1 + |
4500 | | #define ABSTRACT_FRAME_ID(...) |
4501 | | #include "nsFrameIdList.h" |
4502 | | #undef FRAME_ID |
4503 | | #undef ABSTRACT_FRAME_ID |
4504 | | 0]; |
4505 | | |
4506 | | #ifdef DEBUG_FRAME_DUMP |
4507 | | public: |
4508 | | static void IndentBy(FILE* out, int32_t aIndent) { |
4509 | | while (--aIndent >= 0) fputs(" ", out); |
4510 | | } |
4511 | | void ListTag(FILE* out) const { |
4512 | | ListTag(out, this); |
4513 | | } |
4514 | | static void ListTag(FILE* out, const nsIFrame* aFrame) { |
4515 | | nsAutoCString t; |
4516 | | ListTag(t, aFrame); |
4517 | | fputs(t.get(), out); |
4518 | | } |
4519 | | static void ListTag(FILE* out, const nsFrameList& aFrameList) { |
4520 | | for (nsIFrame* frame : aFrameList) { |
4521 | | ListTag(out, frame); |
4522 | | } |
4523 | | } |
4524 | | void ListTag(nsACString& aTo) const; |
4525 | | nsAutoCString ListTag() const { |
4526 | | nsAutoCString tag; |
4527 | | ListTag(tag); |
4528 | | return tag; |
4529 | | } |
4530 | | static void ListTag(nsACString& aTo, const nsIFrame* aFrame); |
4531 | | void ListGeneric(nsACString& aTo, const char* aPrefix = "", uint32_t aFlags = 0) const; |
4532 | | enum { |
4533 | | TRAVERSE_SUBDOCUMENT_FRAMES = 0x01 |
4534 | | }; |
4535 | | virtual void List(FILE* out = stderr, const char* aPrefix = "", uint32_t aFlags = 0) const; |
4536 | | /** |
4537 | | * lists the frames beginning from the root frame |
4538 | | * - calls root frame's List(...) |
4539 | | */ |
4540 | | static void RootFrameList(nsPresContext* aPresContext, |
4541 | | FILE* out = stderr, const char* aPrefix = ""); |
4542 | | virtual void DumpFrameTree() const; |
4543 | | void DumpFrameTreeLimited() const; |
4544 | | |
4545 | | virtual nsresult GetFrameName(nsAString& aResult) const = 0; |
4546 | | #endif |
4547 | | }; |
4548 | | |
4549 | | //---------------------------------------------------------------------- |
4550 | | |
4551 | | /** |
4552 | | * AutoWeakFrame can be used to keep a reference to a nsIFrame in a safe way. |
4553 | | * Whenever an nsIFrame object is deleted, the AutoWeakFrames pointing |
4554 | | * to it will be cleared. AutoWeakFrame is for variables on the stack or |
4555 | | * in static storage only, there is also a WeakFrame below for heap uses. |
4556 | | * |
4557 | | * Create AutoWeakFrame object when it is sure that nsIFrame object |
4558 | | * is alive and after some operations which may destroy the nsIFrame |
4559 | | * (for example any DOM modifications) use IsAlive() or GetFrame() methods to |
4560 | | * check whether it is safe to continue to use the nsIFrame object. |
4561 | | * |
4562 | | * @note The usage of this class should be kept to a minimum. |
4563 | | */ |
4564 | | class WeakFrame; |
4565 | | class MOZ_NONHEAP_CLASS AutoWeakFrame |
4566 | | { |
4567 | | public: |
4568 | | explicit AutoWeakFrame() |
4569 | | : mPrev(nullptr), mFrame(nullptr) {} |
4570 | | |
4571 | | AutoWeakFrame(const AutoWeakFrame& aOther) |
4572 | | : mPrev(nullptr), mFrame(nullptr) |
4573 | | { |
4574 | | Init(aOther.GetFrame()); |
4575 | | } |
4576 | | |
4577 | | MOZ_IMPLICIT AutoWeakFrame(const WeakFrame& aOther); |
4578 | | |
4579 | | MOZ_IMPLICIT AutoWeakFrame(nsIFrame* aFrame) |
4580 | | : mPrev(nullptr), mFrame(nullptr) |
4581 | 21 | { |
4582 | 21 | Init(aFrame); |
4583 | 21 | } |
4584 | | |
4585 | | AutoWeakFrame& operator=(AutoWeakFrame& aOther) { |
4586 | | Init(aOther.GetFrame()); |
4587 | | return *this; |
4588 | | } |
4589 | | |
4590 | | AutoWeakFrame& operator=(nsIFrame* aFrame) { |
4591 | | Init(aFrame); |
4592 | | return *this; |
4593 | | } |
4594 | | |
4595 | | nsIFrame* operator->() |
4596 | | { |
4597 | | return mFrame; |
4598 | | } |
4599 | | |
4600 | | operator nsIFrame*() |
4601 | | { |
4602 | | return mFrame; |
4603 | | } |
4604 | | |
4605 | 21 | void Clear(nsIPresShell* aShell) { |
4606 | 21 | if (aShell) { |
4607 | 0 | aShell->RemoveAutoWeakFrame(this); |
4608 | 0 | } |
4609 | 21 | mFrame = nullptr; |
4610 | 21 | mPrev = nullptr; |
4611 | 21 | } |
4612 | | |
4613 | 0 | bool IsAlive() { return !!mFrame; } |
4614 | | |
4615 | | nsIFrame* GetFrame() const { return mFrame; } |
4616 | | |
4617 | 0 | AutoWeakFrame* GetPreviousWeakFrame() { return mPrev; } |
4618 | | |
4619 | 0 | void SetPreviousWeakFrame(AutoWeakFrame* aPrev) { mPrev = aPrev; } |
4620 | | |
4621 | | ~AutoWeakFrame() |
4622 | 0 | { |
4623 | 0 | Clear(mFrame ? mFrame->PresContext()->GetPresShell() : nullptr); |
4624 | 0 | } |
4625 | | private: |
4626 | | // Not available for the heap! |
4627 | | void* operator new(size_t) = delete; |
4628 | | void* operator new[](size_t) = delete; |
4629 | | void operator delete(void*) = delete; |
4630 | | void operator delete[](void*) = delete; |
4631 | | |
4632 | | void Init(nsIFrame* aFrame); |
4633 | | |
4634 | | AutoWeakFrame* mPrev; |
4635 | | nsIFrame* mFrame; |
4636 | | }; |
4637 | | |
4638 | | // Use nsIFrame's fast-path to avoid QueryFrame: |
4639 | | inline do_QueryFrameHelper<nsIFrame> |
4640 | | do_QueryFrame(AutoWeakFrame& s) |
4641 | | { |
4642 | | return do_QueryFrameHelper<nsIFrame>(s.GetFrame()); |
4643 | | } |
4644 | | |
4645 | | /** |
4646 | | * @see AutoWeakFrame |
4647 | | */ |
4648 | | class MOZ_HEAP_CLASS WeakFrame |
4649 | | { |
4650 | | public: |
4651 | | WeakFrame() : mFrame(nullptr) {} |
4652 | | |
4653 | | WeakFrame(const WeakFrame& aOther) : mFrame(nullptr) |
4654 | 0 | { |
4655 | 0 | Init(aOther.GetFrame()); |
4656 | 0 | } |
4657 | | |
4658 | | MOZ_IMPLICIT WeakFrame(const AutoWeakFrame& aOther) : mFrame(nullptr) |
4659 | | { |
4660 | | Init(aOther.GetFrame()); |
4661 | | } |
4662 | | |
4663 | | MOZ_IMPLICIT WeakFrame(nsIFrame* aFrame) : mFrame(nullptr) |
4664 | | { |
4665 | | Init(aFrame); |
4666 | | } |
4667 | | |
4668 | | ~WeakFrame() |
4669 | | { |
4670 | | Clear(mFrame ? mFrame->PresContext()->GetPresShell() : nullptr); |
4671 | | } |
4672 | | |
4673 | | WeakFrame& operator=(WeakFrame& aOther) { |
4674 | | Init(aOther.GetFrame()); |
4675 | | return *this; |
4676 | | } |
4677 | | |
4678 | | WeakFrame& operator=(nsIFrame* aFrame) { |
4679 | | Init(aFrame); |
4680 | | return *this; |
4681 | | } |
4682 | | |
4683 | | nsIFrame* operator->() { return mFrame; } |
4684 | | operator nsIFrame*() { return mFrame; } |
4685 | | |
4686 | | void Clear(nsIPresShell* aShell) { |
4687 | | if (aShell) { |
4688 | | aShell->RemoveWeakFrame(this); |
4689 | | } |
4690 | | mFrame = nullptr; |
4691 | | } |
4692 | | |
4693 | | bool IsAlive() { return !!mFrame; } |
4694 | | nsIFrame* GetFrame() const { return mFrame; } |
4695 | | |
4696 | | private: |
4697 | | void Init(nsIFrame* aFrame); |
4698 | | |
4699 | | nsIFrame* mFrame; |
4700 | | }; |
4701 | | |
4702 | | // Use nsIFrame's fast-path to avoid QueryFrame: |
4703 | | inline do_QueryFrameHelper<nsIFrame> |
4704 | | do_QueryFrame(WeakFrame& s) |
4705 | | { |
4706 | | return do_QueryFrameHelper<nsIFrame>(s.GetFrame()); |
4707 | | } |
4708 | | |
4709 | | inline bool |
4710 | | nsFrameList::ContinueRemoveFrame(nsIFrame* aFrame) |
4711 | 0 | { |
4712 | 0 | MOZ_ASSERT(!aFrame->GetPrevSibling() || !aFrame->GetNextSibling(), |
4713 | 0 | "Forgot to call StartRemoveFrame?"); |
4714 | 0 | if (aFrame == mLastChild) { |
4715 | 0 | MOZ_ASSERT(!aFrame->GetNextSibling(), "broken frame list"); |
4716 | 0 | nsIFrame* prevSibling = aFrame->GetPrevSibling(); |
4717 | 0 | if (!prevSibling) { |
4718 | 0 | MOZ_ASSERT(aFrame == mFirstChild, "broken frame list"); |
4719 | 0 | mFirstChild = mLastChild = nullptr; |
4720 | 0 | return true; |
4721 | 0 | } |
4722 | 0 | MOZ_ASSERT(prevSibling->GetNextSibling() == aFrame, "Broken frame linkage"); |
4723 | 0 | prevSibling->SetNextSibling(nullptr); |
4724 | 0 | mLastChild = prevSibling; |
4725 | 0 | return true; |
4726 | 0 | } |
4727 | 0 | if (aFrame == mFirstChild) { |
4728 | 0 | MOZ_ASSERT(!aFrame->GetPrevSibling(), "broken frame list"); |
4729 | 0 | mFirstChild = aFrame->GetNextSibling(); |
4730 | 0 | aFrame->SetNextSibling(nullptr); |
4731 | 0 | MOZ_ASSERT(mFirstChild, "broken frame list"); |
4732 | 0 | return true; |
4733 | 0 | } |
4734 | 0 | return false; |
4735 | 0 | } |
4736 | | |
4737 | | inline bool |
4738 | | nsFrameList::StartRemoveFrame(nsIFrame* aFrame) |
4739 | 0 | { |
4740 | 0 | if (aFrame->GetPrevSibling() && aFrame->GetNextSibling()) { |
4741 | 0 | UnhookFrameFromSiblings(aFrame); |
4742 | 0 | return true; |
4743 | 0 | } |
4744 | 0 | return ContinueRemoveFrame(aFrame); |
4745 | 0 | } |
4746 | | |
4747 | | inline void |
4748 | | nsFrameList::Enumerator::Next() |
4749 | | { |
4750 | | NS_ASSERTION(!AtEnd(), "Should have checked AtEnd()!"); |
4751 | | mFrame = mFrame->GetNextSibling(); |
4752 | | } |
4753 | | |
4754 | | inline |
4755 | | nsFrameList::FrameLinkEnumerator:: |
4756 | | FrameLinkEnumerator(const nsFrameList& aList, nsIFrame* aPrevFrame) |
4757 | | : Enumerator(aList) |
4758 | 0 | { |
4759 | 0 | mPrev = aPrevFrame; |
4760 | 0 | mFrame = aPrevFrame ? aPrevFrame->GetNextSibling() : aList.FirstChild(); |
4761 | 0 | } |
4762 | | |
4763 | | inline void |
4764 | | nsFrameList::FrameLinkEnumerator::Next() |
4765 | 0 | { |
4766 | 0 | mPrev = mFrame; |
4767 | 0 | Enumerator::Next(); |
4768 | 0 | } |
4769 | | |
4770 | | template<typename Predicate> |
4771 | | inline void |
4772 | | nsFrameList::FrameLinkEnumerator::Find(Predicate&& aPredicate) |
4773 | 0 | { |
4774 | 0 | static_assert( |
4775 | 0 | std::is_same<typename mozilla::FunctionTypeTraits<Predicate>::ReturnType, |
4776 | 0 | bool>::value && |
4777 | 0 | mozilla::FunctionTypeTraits<Predicate>::arity == 1 && |
4778 | 0 | std::is_same<typename mozilla::FunctionTypeTraits<Predicate>::template ParameterType<0>, |
4779 | 0 | nsIFrame*>::value, |
4780 | 0 | "aPredicate should be of this function signature: bool(nsIFrame*)"); |
4781 | 0 |
|
4782 | 0 | for (; !AtEnd(); Next()) { |
4783 | 0 | if (aPredicate(mFrame)) { |
4784 | 0 | return; |
4785 | 0 | } |
4786 | 0 | } |
4787 | 0 | } Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void nsFrameList::FrameLinkEnumerator::Find<nsCSSFrameConstructor::AppendFramesToParent(nsFrameConstructorState&, nsContainerFrame*, nsFrameItems&, nsIFrame*, bool)::$_3&>(nsCSSFrameConstructor::AppendFramesToParent(nsFrameConstructorState&, nsContainerFrame*, nsFrameItems&, nsIFrame*, bool)::$_3&) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void nsFrameList::FrameLinkEnumerator::Find<nsCSSFrameConstructor::AppendFramesToParent(nsFrameConstructorState&, nsContainerFrame*, nsFrameItems&, nsIFrame*, bool)::$_4&>(nsCSSFrameConstructor::AppendFramesToParent(nsFrameConstructorState&, nsContainerFrame*, nsFrameItems&, nsIFrame*, bool)::$_4&) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void nsFrameList::FrameLinkEnumerator::Find<nsCSSFrameConstructor::WrapFramesInFirstLineFrame(nsFrameConstructorState&, nsIContent*, nsContainerFrame*, nsFirstLineFrame*, nsFrameItems&)::$_7&>(nsCSSFrameConstructor::WrapFramesInFirstLineFrame(nsFrameConstructorState&, nsIContent*, nsContainerFrame*, nsFirstLineFrame*, nsFrameItems&)::$_7&) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void nsFrameList::FrameLinkEnumerator::Find<nsCSSFrameConstructor::ConstructInline(nsFrameConstructorState&, nsCSSFrameConstructor::FrameConstructionItem&, nsContainerFrame*, nsStyleDisplay const*, nsFrameItems&)::$_8>(nsCSSFrameConstructor::ConstructInline(nsFrameConstructorState&, nsCSSFrameConstructor::FrameConstructionItem&, nsContainerFrame*, nsStyleDisplay const*, nsFrameItems&)::$_8&&) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void nsFrameList::FrameLinkEnumerator::Find<nsCSSFrameConstructor::CreateIBSiblings(nsFrameConstructorState&, nsContainerFrame*, bool, nsFrameItems&, nsFrameItems&)::$_9&>(nsCSSFrameConstructor::CreateIBSiblings(nsFrameConstructorState&, nsContainerFrame*, bool, nsFrameItems&, nsFrameItems&)::$_9&) Unexecuted instantiation: Unified_cpp_layout_base1.cpp:void nsFrameList::FrameLinkEnumerator::Find<nsCSSFrameConstructor::CreateIBSiblings(nsFrameConstructorState&, nsContainerFrame*, bool, nsFrameItems&, nsFrameItems&)::$_10&>(nsCSSFrameConstructor::CreateIBSiblings(nsFrameConstructorState&, nsContainerFrame*, bool, nsFrameItems&, nsFrameItems&)::$_10&) |
4788 | | |
4789 | | // Operators of nsFrameList::Iterator |
4790 | | // --------------------------------------------------- |
4791 | | |
4792 | | inline nsFrameList::Iterator& |
4793 | | nsFrameList::Iterator::operator++() |
4794 | | { |
4795 | | mCurrent = mCurrent->GetNextSibling(); |
4796 | | return *this; |
4797 | | } |
4798 | | |
4799 | | inline nsFrameList::Iterator& |
4800 | | nsFrameList::Iterator::operator--() |
4801 | 0 | { |
4802 | 0 | if (!mCurrent) { |
4803 | 0 | mCurrent = mList.LastChild(); |
4804 | 0 | } else { |
4805 | 0 | mCurrent = mCurrent->GetPrevSibling(); |
4806 | 0 | } |
4807 | 0 | return *this; |
4808 | 0 | } |
4809 | | |
4810 | | // Helper-functions for nsIFrame::SortFrameList() |
4811 | | // --------------------------------------------------- |
4812 | | |
4813 | | template<bool IsLessThanOrEqual(nsIFrame*, nsIFrame*)> |
4814 | | /* static */ nsIFrame* |
4815 | | nsIFrame::SortedMerge(nsIFrame *aLeft, nsIFrame *aRight) |
4816 | 0 | { |
4817 | 0 | MOZ_ASSERT(aLeft && aRight, "SortedMerge must have non-empty lists"); |
4818 | 0 |
|
4819 | 0 | nsIFrame *result; |
4820 | 0 | // Unroll first iteration to avoid null-check 'result' inside the loop. |
4821 | 0 | if (IsLessThanOrEqual(aLeft, aRight)) { |
4822 | 0 | result = aLeft; |
4823 | 0 | aLeft = aLeft->GetNextSibling(); |
4824 | 0 | if (!aLeft) { |
4825 | 0 | result->SetNextSibling(aRight); |
4826 | 0 | return result; |
4827 | 0 | } |
4828 | 0 | } |
4829 | 0 | else { |
4830 | 0 | result = aRight; |
4831 | 0 | aRight = aRight->GetNextSibling(); |
4832 | 0 | if (!aRight) { |
4833 | 0 | result->SetNextSibling(aLeft); |
4834 | 0 | return result; |
4835 | 0 | } |
4836 | 0 | } |
4837 | 0 | |
4838 | 0 | nsIFrame *last = result; |
4839 | 0 | for (;;) { |
4840 | 0 | if (IsLessThanOrEqual(aLeft, aRight)) { |
4841 | 0 | last->SetNextSibling(aLeft); |
4842 | 0 | last = aLeft; |
4843 | 0 | aLeft = aLeft->GetNextSibling(); |
4844 | 0 | if (!aLeft) { |
4845 | 0 | last->SetNextSibling(aRight); |
4846 | 0 | return result; |
4847 | 0 | } |
4848 | 0 | } |
4849 | 0 | else { |
4850 | 0 | last->SetNextSibling(aRight); |
4851 | 0 | last = aRight; |
4852 | 0 | aRight = aRight->GetNextSibling(); |
4853 | 0 | if (!aRight) { |
4854 | 0 | last->SetNextSibling(aLeft); |
4855 | 0 | return result; |
4856 | 0 | } |
4857 | 0 | } |
4858 | 0 | } |
4859 | 0 | } |
4860 | | |
4861 | | template<bool IsLessThanOrEqual(nsIFrame*, nsIFrame*)> |
4862 | | /* static */ nsIFrame* |
4863 | | nsIFrame::MergeSort(nsIFrame *aSource) |
4864 | 0 | { |
4865 | 0 | MOZ_ASSERT(aSource, "MergeSort null arg"); |
4866 | 0 |
|
4867 | 0 | nsIFrame *sorted[32] = { nullptr }; |
4868 | 0 | nsIFrame **fill = &sorted[0]; |
4869 | 0 | nsIFrame **left; |
4870 | 0 | nsIFrame *rest = aSource; |
4871 | 0 |
|
4872 | 0 | do { |
4873 | 0 | nsIFrame *current = rest; |
4874 | 0 | rest = rest->GetNextSibling(); |
4875 | 0 | current->SetNextSibling(nullptr); |
4876 | 0 |
|
4877 | 0 | // Merge it with sorted[0] if present; then merge the result with sorted[1] etc. |
4878 | 0 | // sorted[0] is a list of length 1 (or nullptr). |
4879 | 0 | // sorted[1] is a list of length 2 (or nullptr). |
4880 | 0 | // sorted[2] is a list of length 4 (or nullptr). etc. |
4881 | 0 | for (left = &sorted[0]; left != fill && *left; ++left) { |
4882 | 0 | current = SortedMerge<IsLessThanOrEqual>(*left, current); |
4883 | 0 | *left = nullptr; |
4884 | 0 | } |
4885 | 0 |
|
4886 | 0 | // Fill the empty slot that we couldn't merge with the last result. |
4887 | 0 | *left = current; |
4888 | 0 |
|
4889 | 0 | if (left == fill) |
4890 | 0 | ++fill; |
4891 | 0 | } while (rest); |
4892 | 0 |
|
4893 | 0 | // Collect and merge the results. |
4894 | 0 | nsIFrame *result = nullptr; |
4895 | 0 | for (left = &sorted[0]; left != fill; ++left) { |
4896 | 0 | if (*left) { |
4897 | 0 | result = result ? SortedMerge<IsLessThanOrEqual>(*left, result) : *left; |
4898 | 0 | } |
4899 | 0 | } |
4900 | 0 | return result; |
4901 | 0 | } |
4902 | | |
4903 | | template<bool IsLessThanOrEqual(nsIFrame*, nsIFrame*)> |
4904 | | /* static */ void |
4905 | | nsIFrame::SortFrameList(nsFrameList& aFrameList) |
4906 | 0 | { |
4907 | 0 | nsIFrame* head = MergeSort<IsLessThanOrEqual>(aFrameList.FirstChild()); |
4908 | 0 | aFrameList = nsFrameList(head, nsLayoutUtils::GetLastSibling(head)); |
4909 | 0 | MOZ_ASSERT(IsFrameListSorted<IsLessThanOrEqual>(aFrameList), |
4910 | 0 | "After we sort a frame list, it should be in sorted order..."); |
4911 | 0 | } |
4912 | | |
4913 | | template<bool IsLessThanOrEqual(nsIFrame*, nsIFrame*)> |
4914 | | /* static */ bool |
4915 | | nsIFrame::IsFrameListSorted(nsFrameList& aFrameList) |
4916 | 0 | { |
4917 | 0 | if (aFrameList.IsEmpty()) { |
4918 | 0 | // empty lists are trivially sorted. |
4919 | 0 | return true; |
4920 | 0 | } |
4921 | 0 | |
4922 | 0 | // We'll walk through the list with two iterators, one trailing behind the |
4923 | 0 | // other. The list is sorted IFF trailingIter <= iter, across the whole list. |
4924 | 0 | nsFrameList::Enumerator trailingIter(aFrameList); |
4925 | 0 | nsFrameList::Enumerator iter(aFrameList); |
4926 | 0 | iter.Next(); // Skip |iter| past first frame. (List is nonempty, so we can.) |
4927 | 0 |
|
4928 | 0 | // Now, advance the iterators in parallel, comparing each adjacent pair. |
4929 | 0 | while (!iter.AtEnd()) { |
4930 | 0 | MOZ_ASSERT(!trailingIter.AtEnd(), "trailing iter shouldn't finish first"); |
4931 | 0 | if (!IsLessThanOrEqual(trailingIter.get(), iter.get())) { |
4932 | 0 | return false; |
4933 | 0 | } |
4934 | 0 | trailingIter.Next(); |
4935 | 0 | iter.Next(); |
4936 | 0 | } |
4937 | 0 |
|
4938 | 0 | // We made it to the end without returning early, so the list is sorted. |
4939 | 0 | return true; |
4940 | 0 | } |
4941 | | |
4942 | | // Needs to be defined here rather than nsIFrameInlines.h, because it is used |
4943 | | // within this header. |
4944 | | nsPoint |
4945 | | nsIFrame::GetNormalPosition(bool* aHasProperty) const |
4946 | 0 | { |
4947 | 0 | nsPoint* normalPosition = GetProperty(NormalPositionProperty()); |
4948 | 0 | if (normalPosition) { |
4949 | 0 | if (aHasProperty) { |
4950 | 0 | *aHasProperty = true; |
4951 | 0 | } |
4952 | 0 | return *normalPosition; |
4953 | 0 | } |
4954 | 0 | if (aHasProperty) { |
4955 | 0 | *aHasProperty = false; |
4956 | 0 | } |
4957 | 0 | return GetPosition(); |
4958 | 0 | } |
4959 | | |
4960 | | #endif /* nsIFrame_h___ */ |