Coverage Report

Created: 2018-09-25 14:53

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