Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 /* a presentation of a document, part 1 */
8 #ifndef nsPresContext_h___
9 #define nsPresContext_h___
11 #include "mozilla/Attributes.h"
12 #include "mozilla/WeakPtr.h"
13 #include "nsColor.h"
14 #include "nsCoord.h"
15 #include "nsCOMPtr.h"
16 #include "nsIPresShell.h"
17 #include "nsRect.h"
18 #include "nsFont.h"
19 #include "gfxFontConstants.h"
20 #include "nsIAtom.h"
21 #include "nsIObserver.h"
22 #include "nsITimer.h"
23 #include "nsCRT.h"
24 #include "FramePropertyTable.h"
25 #include "nsGkAtoms.h"
26 #include "nsCycleCollectionParticipant.h"
27 #include "nsChangeHint.h"
28 #include <algorithm>
29 // This also pulls in gfxTypes.h, which we cannot include directly.
30 #include "gfxRect.h"
31 #include "nsTArray.h"
32 #include "nsAutoPtr.h"
33 #include "mozilla/MemoryReporting.h"
34 #include "mozilla/TimeStamp.h"
35 #include "mozilla/AppUnits.h"
36 #include "prclist.h"
37 #include "nsThreadUtils.h"
38 #include "ScrollbarStyles.h"
40 class nsBidiPresUtils;
41 class nsAString;
42 class nsIPrintSettings;
43 class nsDocShell;
44 class nsIDocShell;
45 class nsIDocument;
46 class nsILanguageAtomService;
47 class nsITheme;
48 class nsIContent;
49 class nsIFrame;
50 class nsFrameManager;
51 class nsILinkHandler;
52 class nsIAtom;
53 class nsICSSPseudoComparator;
54 struct nsStyleBackground;
55 struct nsStyleBorder;
56 class nsIRunnable;
57 class gfxUserFontSet;
58 class gfxTextPerfMetrics;
59 class nsUserFontSet;
60 struct nsFontFaceRuleContainer;
61 class nsObjectFrame;
62 class nsTransitionManager;
63 class nsAnimationManager;
64 class nsRefreshDriver;
65 class nsIWidget;
66 class nsDeviceContext;
68 namespace mozilla {
69 class EventStateManager;
70 class RestyleManager;
71 namespace dom {
72 class MediaQueryList;
73 }
74 namespace layers {
75 class ContainerLayer;
76 }
77 }
79 // supported values for cached bool types
80 enum nsPresContext_CachedBoolPrefType {
81 kPresContext_UseDocumentColors = 1,
82 kPresContext_UseDocumentFonts,
83 kPresContext_UnderlineLinks
84 };
86 // supported values for cached integer pref types
87 enum nsPresContext_CachedIntPrefType {
88 kPresContext_ScrollbarSide = 1,
89 kPresContext_BidiDirection
90 };
92 // IDs for the default variable and fixed fonts (not to be changed, see nsFont.h)
93 // To be used for Get/SetDefaultFont(). The other IDs in nsFont.h are also supported.
94 const uint8_t kPresContext_DefaultVariableFont_ID = 0x00; // kGenericFont_moz_variable
95 const uint8_t kPresContext_DefaultFixedFont_ID = 0x01; // kGenericFont_moz_fixed
97 #ifdef DEBUG
98 struct nsAutoLayoutPhase;
100 enum nsLayoutPhase {
101 eLayoutPhase_Paint,
102 eLayoutPhase_Reflow,
103 eLayoutPhase_FrameC,
104 eLayoutPhase_COUNT
105 };
106 #endif
108 class nsInvalidateRequestList {
109 public:
110 struct Request {
111 nsRect mRect;
112 uint32_t mFlags;
113 };
115 void TakeFrom(nsInvalidateRequestList* aList)
116 {
117 mRequests.MoveElementsFrom(aList->mRequests);
118 }
119 bool IsEmpty() { return mRequests.IsEmpty(); }
121 nsTArray<Request> mRequests;
122 };
124 /* Used by nsPresContext::HasAuthorSpecifiedRules */
125 #define NS_AUTHOR_SPECIFIED_BACKGROUND (1 << 0)
126 #define NS_AUTHOR_SPECIFIED_BORDER (1 << 1)
127 #define NS_AUTHOR_SPECIFIED_PADDING (1 << 2)
128 #define NS_AUTHOR_SPECIFIED_TEXT_SHADOW (1 << 3)
130 class nsRootPresContext;
132 // An interface for presentation contexts. Presentation contexts are
133 // objects that provide an outer context for a presentation shell.
135 class nsPresContext : public nsIObserver {
136 public:
137 typedef mozilla::FramePropertyTable FramePropertyTable;
139 NS_DECL_CYCLE_COLLECTING_ISUPPORTS
140 NS_DECL_NSIOBSERVER
141 NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW
142 NS_DECL_CYCLE_COLLECTION_CLASS(nsPresContext)
144 enum nsPresContextType {
145 eContext_Galley, // unpaginated screen presentation
146 eContext_PrintPreview, // paginated screen presentation
147 eContext_Print, // paginated printer presentation
148 eContext_PageLayout // paginated & editable.
149 };
151 // Policies for rebuilding style data.
152 enum StyleRebuildType {
153 eRebuildStyleIfNeeded,
154 eAlwaysRebuildStyle
155 };
157 nsPresContext(nsIDocument* aDocument, nsPresContextType aType) NS_HIDDEN;
159 /**
160 * Initialize the presentation context from a particular device.
161 */
162 NS_HIDDEN_(nsresult) Init(nsDeviceContext* aDeviceContext);
164 /**
165 * Set the presentation shell that this context is bound to.
166 * A presentation context may only be bound to a single shell.
167 */
168 NS_HIDDEN_(void) SetShell(nsIPresShell* aShell);
171 NS_HIDDEN_(nsPresContextType) Type() const { return mType; }
173 /**
174 * Get the PresentationShell that this context is bound to.
175 */
176 nsIPresShell* PresShell() const
177 {
178 NS_ASSERTION(mShell, "Null pres shell");
179 return mShell;
180 }
182 nsIPresShell* GetPresShell() const { return mShell; }
184 /**
185 * Returns the parent prescontext for this one. Returns null if this is a
186 * root.
187 */
188 nsPresContext* GetParentPresContext();
190 /**
191 * Returns the prescontext of the toplevel content document that contains
192 * this presentation, or null if there isn't one.
193 */
194 nsPresContext* GetToplevelContentDocumentPresContext();
196 /**
197 * Returns the nearest widget for the root frame of this.
198 *
199 * @param aOffset If non-null the offset from the origin of the root
200 * frame's view to the widget's origin (usually positive)
201 * expressed in appunits of this will be returned in
202 * aOffset.
203 */
204 nsIWidget* GetNearestWidget(nsPoint* aOffset = nullptr);
206 /**
207 * Returns the root widget for this.
208 * Note that the widget is a mediater with IME.
209 */
210 nsIWidget* GetRootWidget();
212 /**
213 * Return the presentation context for the root of the view manager
214 * hierarchy that contains this presentation context, or nullptr if it can't
215 * be found (e.g. it's detached).
216 */
217 nsRootPresContext* GetRootPresContext();
218 nsRootPresContext* GetDisplayRootPresContext();
219 virtual bool IsRoot() { return false; }
221 nsIDocument* Document() const
222 {
223 NS_ASSERTION(!mShell || !mShell->GetDocument() ||
224 mShell->GetDocument() == mDocument,
225 "nsPresContext doesn't have the same document as nsPresShell!");
226 return mDocument;
227 }
229 #ifdef MOZILLA_INTERNAL_API
230 nsStyleSet* StyleSet() { return GetPresShell()->StyleSet(); }
232 nsFrameManager* FrameManager()
233 { return PresShell()->FrameManager(); }
235 nsCSSFrameConstructor* FrameConstructor()
236 { return PresShell()->FrameConstructor(); }
238 nsTransitionManager* TransitionManager() { return mTransitionManager; }
239 nsAnimationManager* AnimationManager() { return mAnimationManager; }
241 nsRefreshDriver* RefreshDriver() { return mRefreshDriver; }
243 mozilla::RestyleManager* RestyleManager() { return mRestyleManager; }
244 #endif
246 /**
247 * Rebuilds all style data by throwing out the old rule tree and
248 * building a new one, and additionally applying aExtraHint (which
249 * must not contain nsChangeHint_ReconstructFrame) to the root frame.
250 * Also rebuild the user font set.
251 */
252 void RebuildAllStyleData(nsChangeHint aExtraHint);
253 /**
254 * Just like RebuildAllStyleData, except (1) asynchronous and (2) it
255 * doesn't rebuild the user font set.
256 */
257 void PostRebuildAllStyleDataEvent(nsChangeHint aExtraHint);
259 void MediaFeatureValuesChanged(StyleRebuildType aShouldRebuild,
260 nsChangeHint aChangeHint = nsChangeHint(0));
261 void PostMediaFeatureValuesChangedEvent();
262 NS_HIDDEN_(void) HandleMediaFeatureValuesChangedEvent();
263 void FlushPendingMediaFeatureValuesChanged() {
264 if (mPendingMediaFeatureValuesChanged)
265 MediaFeatureValuesChanged(eRebuildStyleIfNeeded);
266 }
268 /**
269 * Support for window.matchMedia()
270 */
271 already_AddRefed<mozilla::dom::MediaQueryList>
272 MatchMedia(const nsAString& aMediaQueryList);
274 /**
275 * Access compatibility mode for this context. This is the same as
276 * our document's compatibility mode.
277 */
278 nsCompatibility CompatibilityMode() const;
280 /**
281 * Notify the context that the document's compatibility mode has changed
282 */
283 NS_HIDDEN_(void) CompatibilityModeChanged();
285 /**
286 * Access the image animation mode for this context
287 */
288 uint16_t ImageAnimationMode() const { return mImageAnimationMode; }
289 virtual NS_HIDDEN_(void) SetImageAnimationModeExternal(uint16_t aMode);
290 NS_HIDDEN_(void) SetImageAnimationModeInternal(uint16_t aMode);
291 #ifdef MOZILLA_INTERNAL_API
292 void SetImageAnimationMode(uint16_t aMode)
293 { SetImageAnimationModeInternal(aMode); }
294 #else
295 void SetImageAnimationMode(uint16_t aMode)
296 { SetImageAnimationModeExternal(aMode); }
297 #endif
299 /**
300 * Get medium of presentation
301 */
302 nsIAtom* Medium() {
303 if (!mIsEmulatingMedia)
304 return mMedium;
305 return mMediaEmulated;
306 }
308 /*
309 * Render the document as if being viewed on a device with the specified
310 * media type.
311 */
312 void EmulateMedium(const nsAString& aMediaType);
314 /*
315 * Restore the viewer's natural medium
316 */
317 void StopEmulatingMedium();
319 void* AllocateFromShell(size_t aSize)
320 {
321 if (mShell)
322 return mShell->AllocateMisc(aSize);
323 return nullptr;
324 }
326 void FreeToShell(size_t aSize, void* aFreeChunk)
327 {
328 NS_ASSERTION(mShell, "freeing after shutdown");
329 if (mShell)
330 mShell->FreeMisc(aSize, aFreeChunk);
331 }
333 /**
334 * Get the default font for the given language and generic font ID.
335 * If aLanguage is nullptr, the document's language is used.
336 *
337 * This object is read-only, you must copy the font to modify it.
338 *
339 * When aFontID is kPresContext_DefaultVariableFontID or
340 * kPresContext_DefaultFixedFontID (which equals
341 * kGenericFont_moz_fixed, which is used for the -moz-fixed generic),
342 * the nsFont returned has its name as a CSS generic family (serif or
343 * sans-serif for the former, monospace for the latter), and its size
344 * as the default font size for variable or fixed fonts for the
345 * language group.
346 *
347 * For aFontID corresponding to a CSS Generic, the nsFont returned has
348 * its name set to that generic font's name, and its size set to
349 * the user's preference for font size for that generic and the
350 * given language.
351 */
352 NS_HIDDEN_(const nsFont*) GetDefaultFont(uint8_t aFontID,
353 nsIAtom *aLanguage) const;
355 /** Get a cached boolean pref, by its type */
356 // * - initially created for bugs 31816, 20760, 22963
357 bool GetCachedBoolPref(nsPresContext_CachedBoolPrefType aPrefType) const
358 {
359 // If called with a constant parameter, the compiler should optimize
360 // this switch statement away.
361 switch (aPrefType) {
362 case kPresContext_UseDocumentFonts:
363 return mUseDocumentFonts;
364 case kPresContext_UseDocumentColors:
365 return mUseDocumentColors;
366 case kPresContext_UnderlineLinks:
367 return mUnderlineLinks;
368 default:
369 NS_ERROR("Invalid arg passed to GetCachedBoolPref");
370 }
372 return false;
373 }
375 /** Get a cached integer pref, by its type */
376 // * - initially created for bugs 30910, 61883, 74186, 84398
377 int32_t GetCachedIntPref(nsPresContext_CachedIntPrefType aPrefType) const
378 {
379 // If called with a constant parameter, the compiler should optimize
380 // this switch statement away.
381 switch (aPrefType) {
382 case kPresContext_ScrollbarSide:
383 return mPrefScrollbarSide;
384 case kPresContext_BidiDirection:
385 return mPrefBidiDirection;
386 default:
387 NS_ERROR("invalid arg passed to GetCachedIntPref");
388 }
390 return false;
391 }
393 /**
394 * Get the default colors
395 */
396 const nscolor DefaultColor() const { return mDefaultColor; }
397 const nscolor DefaultBackgroundColor() const { return mBackgroundColor; }
398 const nscolor DefaultLinkColor() const { return mLinkColor; }
399 const nscolor DefaultActiveLinkColor() const { return mActiveLinkColor; }
400 const nscolor DefaultVisitedLinkColor() const { return mVisitedLinkColor; }
401 const nscolor FocusBackgroundColor() const { return mFocusBackgroundColor; }
402 const nscolor FocusTextColor() const { return mFocusTextColor; }
404 /**
405 * Body text color, for use in quirks mode only.
406 */
407 const nscolor BodyTextColor() const { return mBodyTextColor; }
408 void SetBodyTextColor(nscolor aColor) { mBodyTextColor = aColor; }
410 bool GetUseFocusColors() const { return mUseFocusColors; }
411 uint8_t FocusRingWidth() const { return mFocusRingWidth; }
412 bool GetFocusRingOnAnything() const { return mFocusRingOnAnything; }
413 uint8_t GetFocusRingStyle() const { return mFocusRingStyle; }
415 NS_HIDDEN_(void) SetContainer(nsIDocShell* aContainer);
417 virtual nsISupports* GetContainerWeakExternal() const;
418 nsISupports* GetContainerWeakInternal() const;
419 #ifdef MOZILLA_INTERNAL_API
420 nsISupports* GetContainerWeak() const
421 { return GetContainerWeakInternal(); }
422 #else
423 nsISupports* GetContainerWeak() const
424 { return GetContainerWeakExternal(); }
425 #endif
427 nsIDocShell* GetDocShell() const;
429 // XXX this are going to be replaced with set/get container
430 void SetLinkHandler(nsILinkHandler* aHandler) { mLinkHandler = aHandler; }
431 nsILinkHandler* GetLinkHandler() { return mLinkHandler; }
433 /**
434 * Detach this pres context - i.e. cancel relevant timers,
435 * SetLinkHandler(null), SetContainer(null) etc.
436 * Only to be used by the DocumentViewer.
437 */
438 virtual void Detach();
440 /**
441 * Get the visible area associated with this presentation context.
442 * This is the size of the visible area that is used for
443 * presenting the document. The returned value is in the standard
444 * nscoord units (as scaled by the device context).
445 */
446 nsRect GetVisibleArea() { return mVisibleArea; }
448 /**
449 * Set the currently visible area. The units for r are standard
450 * nscoord units (as scaled by the device context).
451 */
452 void SetVisibleArea(const nsRect& r) {
453 if (!r.IsEqualEdges(mVisibleArea)) {
454 mVisibleArea = r;
455 // Visible area does not affect media queries when paginated.
456 if (!IsPaginated() && HasCachedStyleData()) {
457 mPendingViewportChange = true;
458 PostMediaFeatureValuesChangedEvent();
459 }
460 }
461 }
463 /**
464 * Return true if this presentation context is a paginated
465 * context.
466 */
467 bool IsPaginated() const { return mPaginated; }
469 /**
470 * Sets whether the presentation context can scroll for a paginated
471 * context.
472 */
473 NS_HIDDEN_(void) SetPaginatedScrolling(bool aResult);
475 /**
476 * Return true if this presentation context can scroll for paginated
477 * context.
478 */
479 bool HasPaginatedScrolling() const { return mCanPaginatedScroll; }
481 /**
482 * Get/set the size of a page
483 */
484 nsSize GetPageSize() { return mPageSize; }
485 void SetPageSize(nsSize aSize) { mPageSize = aSize; }
487 /**
488 * Get/set whether this document should be treated as having real pages
489 * XXX This raises the obvious question of why a document that isn't a page
490 * is paginated; there isn't a good reason except history
491 */
492 bool IsRootPaginatedDocument() { return mIsRootPaginatedDocument; }
493 void SetIsRootPaginatedDocument(bool aIsRootPaginatedDocument)
494 { mIsRootPaginatedDocument = aIsRootPaginatedDocument; }
496 /**
497 * Get/set the print scaling level; used by nsPageFrame to scale up
498 * pages. Set safe to call before reflow, get guaranteed to be set
499 * properly after reflow.
500 */
502 float GetPageScale() { return mPageScale; }
503 void SetPageScale(float aScale) { mPageScale = aScale; }
505 /**
506 * Get/set the scaling facor to use when rendering the pages for print preview.
507 * Only safe to get after print preview set up; safe to set anytime.
508 * This is a scaling factor for the display of the print preview. It
509 * does not affect layout. It only affects the size of the onscreen pages
510 * in print preview.
511 * XXX Temporary: see http://wiki.mozilla.org/Gecko:PrintPreview
512 */
513 float GetPrintPreviewScale() { return mPPScale; }
514 void SetPrintPreviewScale(float aScale) { mPPScale = aScale; }
516 nsDeviceContext* DeviceContext() { return mDeviceContext; }
517 mozilla::EventStateManager* EventStateManager() { return mEventManager; }
518 nsIAtom* GetLanguageFromCharset() { return mLanguage; }
520 float TextZoom() { return mTextZoom; }
521 void SetTextZoom(float aZoom) {
522 if (aZoom == mTextZoom)
523 return;
525 mTextZoom = aZoom;
526 if (HasCachedStyleData()) {
527 // Media queries could have changed, since we changed the meaning
528 // of 'em' units in them.
529 MediaFeatureValuesChanged(eAlwaysRebuildStyle, NS_STYLE_HINT_REFLOW);
530 }
531 }
533 nsTArray<nsFont> mFontsUsed; // currently for font-count limiting only
534 nsTArray<nsFont> mFontsTried; // currently for font-count limiting only
535 void AddFontUse(const nsFont &font);
536 void AddFontAttempt(const nsFont &font);
537 PRBool FontUseCountReached(const nsFont &font);
538 PRBool FontAttemptCountReached(const nsFont &font);
540 /**
541 * Get the minimum font size for the specified language. If aLanguage
542 * is nullptr, then the document's language is used. This combines
543 * the language-specific global preference with the per-presentation
544 * base minimum font size.
545 */
546 int32_t MinFontSize(nsIAtom *aLanguage) const {
547 const LangGroupFontPrefs *prefs = GetFontPrefsForLang(aLanguage);
548 return std::max(mBaseMinFontSize, prefs->mMinimumFontSize);
549 }
551 /**
552 * Get the per-presentation base minimum font size. This size is
553 * independent of the language-specific global preference.
554 */
555 int32_t BaseMinFontSize() const {
556 return mBaseMinFontSize;
557 }
559 /**
560 * Set the per-presentation base minimum font size. This size is
561 * independent of the language-specific global preference.
562 */
563 void SetBaseMinFontSize(int32_t aMinFontSize) {
564 if (aMinFontSize == mBaseMinFontSize)
565 return;
567 mBaseMinFontSize = aMinFontSize;
568 if (HasCachedStyleData()) {
569 // Media queries could have changed, since we changed the meaning
570 // of 'em' units in them.
571 MediaFeatureValuesChanged(eAlwaysRebuildStyle, NS_STYLE_HINT_REFLOW);
572 }
573 }
575 float GetFullZoom() { return mFullZoom; }
576 void SetFullZoom(float aZoom);
578 nscoord GetAutoQualityMinFontSize() {
579 return DevPixelsToAppUnits(mAutoQualityMinFontSizePixelsPref);
580 }
582 /**
583 * Return the device's screen width in inches, for font size
584 * inflation.
585 *
586 * If |aChanged| is non-null, then aChanged is filled in with whether
587 * the return value has changed since either:
588 * a. the last time the function was called with non-null aChanged, or
589 * b. the first time the function was called.
590 */
591 float ScreenWidthInchesForFontInflation(bool* aChanged = nullptr);
593 static int32_t AppUnitsPerCSSPixel() { return mozilla::AppUnitsPerCSSPixel(); }
594 int32_t AppUnitsPerDevPixel() const;
595 static int32_t AppUnitsPerCSSInch() { return mozilla::AppUnitsPerCSSInch(); }
597 static nscoord CSSPixelsToAppUnits(int32_t aPixels)
598 { return NSToCoordRoundWithClamp(float(aPixels) *
599 float(AppUnitsPerCSSPixel())); }
601 static nscoord CSSPixelsToAppUnits(float aPixels)
602 { return NSToCoordRoundWithClamp(aPixels *
603 float(AppUnitsPerCSSPixel())); }
605 static int32_t AppUnitsToIntCSSPixels(nscoord aAppUnits)
606 { return NSAppUnitsToIntPixels(aAppUnits,
607 float(AppUnitsPerCSSPixel())); }
609 static float AppUnitsToFloatCSSPixels(nscoord aAppUnits)
610 { return NSAppUnitsToFloatPixels(aAppUnits,
611 float(AppUnitsPerCSSPixel())); }
613 nscoord DevPixelsToAppUnits(int32_t aPixels) const
614 { return NSIntPixelsToAppUnits(aPixels, AppUnitsPerDevPixel()); }
616 int32_t AppUnitsToDevPixels(nscoord aAppUnits) const
617 { return NSAppUnitsToIntPixels(aAppUnits,
618 float(AppUnitsPerDevPixel())); }
620 int32_t CSSPixelsToDevPixels(int32_t aPixels)
621 { return AppUnitsToDevPixels(CSSPixelsToAppUnits(aPixels)); }
623 float CSSPixelsToDevPixels(float aPixels)
624 {
625 return NSAppUnitsToFloatPixels(CSSPixelsToAppUnits(aPixels),
626 float(AppUnitsPerDevPixel()));
627 }
629 int32_t DevPixelsToIntCSSPixels(int32_t aPixels)
630 { return AppUnitsToIntCSSPixels(DevPixelsToAppUnits(aPixels)); }
632 float DevPixelsToFloatCSSPixels(int32_t aPixels)
633 { return AppUnitsToFloatCSSPixels(DevPixelsToAppUnits(aPixels)); }
635 // If there is a remainder, it is rounded to nearest app units.
636 nscoord GfxUnitsToAppUnits(gfxFloat aGfxUnits) const;
638 gfxFloat AppUnitsToGfxUnits(nscoord aAppUnits) const;
640 gfxRect AppUnitsToGfxUnits(const nsRect& aAppRect) const
641 { return gfxRect(AppUnitsToGfxUnits(aAppRect.x),
642 AppUnitsToGfxUnits(aAppRect.y),
643 AppUnitsToGfxUnits(aAppRect.width),
644 AppUnitsToGfxUnits(aAppRect.height)); }
646 static nscoord CSSTwipsToAppUnits(float aTwips)
647 { return NSToCoordRoundWithClamp(
648 mozilla::AppUnitsPerCSSInch() * NS_TWIPS_TO_INCHES(aTwips)); }
650 // Margin-specific version, since they often need TwipsToAppUnits
651 static nsMargin CSSTwipsToAppUnits(const nsIntMargin &marginInTwips)
652 { return nsMargin(CSSTwipsToAppUnits(float(marginInTwips.top)),
653 CSSTwipsToAppUnits(float(marginInTwips.right)),
654 CSSTwipsToAppUnits(float(marginInTwips.bottom)),
655 CSSTwipsToAppUnits(float(marginInTwips.left))); }
657 static nscoord CSSPointsToAppUnits(float aPoints)
658 { return NSToCoordRound(aPoints * mozilla::AppUnitsPerCSSInch() /
659 POINTS_PER_INCH_FLOAT); }
661 nscoord RoundAppUnitsToNearestDevPixels(nscoord aAppUnits) const
662 { return DevPixelsToAppUnits(AppUnitsToDevPixels(aAppUnits)); }
664 void SetViewportOverflowOverride(uint8_t aX, uint8_t aY)
665 {
666 mViewportStyleOverflow.mHorizontal = aX;
667 mViewportStyleOverflow.mVertical = aY;
668 }
669 mozilla::ScrollbarStyles GetViewportOverflowOverride()
670 {
671 return mViewportStyleOverflow;
672 }
674 /**
675 * Set and get methods for controlling the background drawing
676 */
677 bool GetBackgroundImageDraw() const { return mDrawImageBackground; }
678 void SetBackgroundImageDraw(bool aCanDraw)
679 {
680 mDrawImageBackground = aCanDraw;
681 }
683 bool GetBackgroundColorDraw() const { return mDrawColorBackground; }
684 void SetBackgroundColorDraw(bool aCanDraw)
685 {
686 mDrawColorBackground = aCanDraw;
687 }
689 /**
690 * Getter and setter for OMTA time counters
691 */
692 bool ThrottledTransitionStyleIsUpToDate() const;
693 void TickLastUpdateThrottledTransitionStyle();
694 bool ThrottledAnimationStyleIsUpToDate() const;
695 void TickLastUpdateThrottledAnimationStyle();
696 bool StyleUpdateForAllAnimationsIsUpToDate();
697 void TickLastStyleUpdateForAllAnimations();
699 /**
700 * Check if bidi enabled (set depending on the presence of RTL
701 * characters or when default directionality is RTL).
702 * If enabled, we should apply the Unicode Bidi Algorithm
703 *
704 * @lina 07/12/2000
705 */
706 #ifdef MOZILLA_INTERNAL_API
707 bool BidiEnabled() const { return BidiEnabledInternal(); }
708 #else
709 bool BidiEnabled() const { return BidiEnabledExternal(); }
710 #endif
711 virtual bool BidiEnabledExternal() const;
712 bool BidiEnabledInternal() const;
714 /**
715 * Set bidi enabled. This means we should apply the Unicode Bidi Algorithm
716 *
717 * @lina 07/12/2000
718 */
719 NS_HIDDEN_(void) SetBidiEnabled() const;
721 /**
722 * Set visual or implicit mode into the pres context.
723 *
724 * Visual directionality is a presentation method that displays text
725 * as if it were a uni-directional, according to the primary display
726 * direction only.
727 *
728 * Implicit directionality is a presentation method in which the
729 * direction is determined by the Bidi algorithm according to the
730 * category of the characters and the category of the adjacent
731 * characters, and according to their primary direction.
732 *
733 * @lina 05/02/2000
734 */
735 void SetVisualMode(bool aIsVisual)
736 {
737 mIsVisual = aIsVisual;
738 }
740 /**
741 * Check whether the content should be treated as visual.
742 *
743 * @lina 05/02/2000
744 */
745 bool IsVisualMode() const { return mIsVisual; }
747 //Mohamed
749 /**
750 * Set the Bidi options for the presentation context
751 */
752 NS_HIDDEN_(void) SetBidi(uint32_t aBidiOptions,
753 bool aForceRestyle = false);
755 /**
756 * Get the Bidi options for the presentation context
757 * Not inline so consumers of nsPresContext are not forced to
758 * include nsIDocument.
759 */
760 NS_HIDDEN_(uint32_t) GetBidi() const;
762 /**
763 * Render only Selection
764 */
765 void SetIsRenderingOnlySelection(bool aResult)
766 {
767 mIsRenderingOnlySelection = aResult;
768 }
770 bool IsRenderingOnlySelection() const { return mIsRenderingOnlySelection; }
772 NS_HIDDEN_(bool) IsTopLevelWindowInactive();
774 /*
775 * Obtain a native them for rendering our widgets (both form controls and html)
776 */
777 NS_HIDDEN_(nsITheme*) GetTheme();
779 /*
780 * Notify the pres context that the theme has changed. An internal switch
781 * means it's one of our Mozilla themes that changed (e.g., Modern to Classic).
782 * Otherwise, the OS is telling us that the native theme for the platform
783 * has changed.
784 */
785 NS_HIDDEN_(void) ThemeChanged();
787 /*
788 * Notify the pres context that the resolution of the user interface has
789 * changed. This happens if a window is moved between HiDPI and non-HiDPI
790 * displays, so that the ratio of points to device pixels changes.
791 */
792 NS_HIDDEN_(void) UIResolutionChanged();
794 /*
795 * Notify the pres context that a system color has changed
796 */
797 NS_HIDDEN_(void) SysColorChanged();
799 /** Printing methods below should only be used for Medium() == print **/
800 NS_HIDDEN_(void) SetPrintSettings(nsIPrintSettings *aPrintSettings);
802 nsIPrintSettings* GetPrintSettings() { return mPrintSettings; }
804 /* Accessor for table of frame properties */
805 FramePropertyTable* PropertyTable() { return &mPropertyTable; }
807 /* Helper function that ensures that this prescontext is shown in its
808 docshell if it's the most recent prescontext for the docshell. Returns
809 whether the prescontext is now being shown.
810 */
811 NS_HIDDEN_(bool) EnsureVisible();
813 #ifdef MOZ_REFLOW_PERF
814 NS_HIDDEN_(void) CountReflows(const char * aName,
815 nsIFrame * aFrame);
816 #endif
818 /**
819 * This table maps border-width enums 'thin', 'medium', 'thick'
820 * to actual nscoord values.
821 */
822 const nscoord* GetBorderWidthTable() { return mBorderWidthTable; }
824 gfxTextPerfMetrics *GetTextPerfMetrics() { return mTextPerf; }
826 bool IsDynamic() { return (mType == eContext_PageLayout || mType == eContext_Galley); }
827 bool IsScreen() { return (mMedium == nsGkAtoms::screen ||
828 mType == eContext_PageLayout ||
829 mType == eContext_PrintPreview); }
831 // Is this presentation in a chrome docshell?
832 bool IsChrome() const { return mIsChrome; }
833 bool IsChromeOriginImage() const { return mIsChromeOriginImage; }
834 void UpdateIsChrome();
836 // Public API for native theme code to get style internals.
837 virtual bool HasAuthorSpecifiedRules(nsIFrame *aFrame, uint32_t ruleTypeMask) const;
839 // Is it OK to let the page specify colors and backgrounds?
840 bool UseDocumentColors() const {
841 return GetCachedBoolPref(kPresContext_UseDocumentColors) || IsChrome() || IsChromeOriginImage();
842 }
844 // Explicitly enable and disable paint flashing.
845 void SetPaintFlashing(bool aPaintFlashing) {
846 mPaintFlashing = aPaintFlashing;
847 mPaintFlashingInitialized = true;
848 }
850 // This method should be used instead of directly accessing mPaintFlashing,
851 // as that value may be out of date when mPaintFlashingInitialized is false.
852 bool GetPaintFlashing() const;
854 bool SupressingResizeReflow() const { return mSupressResizeReflow; }
856 virtual NS_HIDDEN_(gfxUserFontSet*) GetUserFontSetExternal();
857 NS_HIDDEN_(gfxUserFontSet*) GetUserFontSetInternal();
858 #ifdef MOZILLA_INTERNAL_API
859 gfxUserFontSet* GetUserFontSet() { return GetUserFontSetInternal(); }
860 #else
861 gfxUserFontSet* GetUserFontSet() { return GetUserFontSetExternal(); }
862 #endif
864 void FlushUserFontSet();
865 void RebuildUserFontSet(); // asynchronously
867 // Should be called whenever the set of fonts available in the user
868 // font set changes (e.g., because a new font loads, or because the
869 // user font set is changed and fonts become unavailable).
870 void UserFontSetUpdated();
872 // Ensure that it is safe to hand out CSS rules outside the layout
873 // engine by ensuring that all CSS style sheets have unique inners
874 // and, if necessary, synchronously rebuilding all style data.
875 void EnsureSafeToHandOutCSSRules();
877 void NotifyInvalidation(uint32_t aFlags);
878 void NotifyInvalidation(const nsRect& aRect, uint32_t aFlags);
879 // aRect is in device pixels
880 void NotifyInvalidation(const nsIntRect& aRect, uint32_t aFlags);
881 // aFlags are nsIPresShell::PAINT_ flags
882 void NotifyDidPaintForSubtree(uint32_t aFlags);
883 void FireDOMPaintEvent(nsInvalidateRequestList* aList);
885 // Callback for catching invalidations in ContainerLayers
886 // Passed to LayerProperties::ComputeDifference
887 static void NotifySubDocInvalidation(mozilla::layers::ContainerLayer* aContainer,
888 const nsIntRegion& aRegion);
889 void SetNotifySubDocInvalidationData(mozilla::layers::ContainerLayer* aContainer);
890 static void ClearNotifySubDocInvalidationData(mozilla::layers::ContainerLayer* aContainer);
891 bool IsDOMPaintEventPending();
892 void ClearMozAfterPaintEvents() {
893 mInvalidateRequestsSinceLastPaint.mRequests.Clear();
894 mUndeliveredInvalidateRequestsBeforeLastPaint.mRequests.Clear();
895 mAllInvalidated = false;
896 }
898 bool IsProcessingRestyles() const {
899 return mProcessingRestyles;
900 }
902 void SetProcessingRestyles(bool aProcessing) {
903 NS_ASSERTION(aProcessing != bool(mProcessingRestyles),
904 "should never nest");
905 mProcessingRestyles = aProcessing;
906 }
908 bool IsProcessingAnimationStyleChange() const {
909 return mProcessingAnimationStyleChange;
910 }
912 void SetProcessingAnimationStyleChange(bool aProcessing) {
913 NS_ASSERTION(aProcessing != bool(mProcessingAnimationStyleChange),
914 "should never nest");
915 mProcessingAnimationStyleChange = aProcessing;
916 }
918 /**
919 * Notify the prescontext that the presshell is about to reflow a reflow root.
920 * The single argument indicates whether this reflow should be interruptible.
921 * If aInterruptible is false then CheckForInterrupt and HasPendingInterrupt
922 * will always return false. If aInterruptible is true then CheckForInterrupt
923 * will return true when a pending event is detected. This is for use by the
924 * presshell only. Reflow code wanting to prevent interrupts should use
925 * InterruptPreventer.
926 */
927 void ReflowStarted(bool aInterruptible);
929 /**
930 * A class that can be used to temporarily disable reflow interruption.
931 */
932 class InterruptPreventer;
933 friend class InterruptPreventer;
934 class MOZ_STACK_CLASS InterruptPreventer {
935 public:
936 InterruptPreventer(nsPresContext* aCtx) :
937 mCtx(aCtx),
938 mInterruptsEnabled(aCtx->mInterruptsEnabled),
939 mHasPendingInterrupt(aCtx->mHasPendingInterrupt)
940 {
941 mCtx->mInterruptsEnabled = false;
942 mCtx->mHasPendingInterrupt = false;
943 }
944 ~InterruptPreventer() {
945 mCtx->mInterruptsEnabled = mInterruptsEnabled;
946 mCtx->mHasPendingInterrupt = mHasPendingInterrupt;
947 }
949 private:
950 nsPresContext* mCtx;
951 bool mInterruptsEnabled;
952 bool mHasPendingInterrupt;
953 };
955 /**
956 * Check for interrupts. This may return true if a pending event is
957 * detected. Once it has returned true, it will keep returning true
958 * until ReflowStarted is called. In all cases where this returns true,
959 * the passed-in frame (which should be the frame whose reflow will be
960 * interrupted if true is returned) will be passed to
961 * nsIPresShell::FrameNeedsToContinueReflow.
962 */
963 bool CheckForInterrupt(nsIFrame* aFrame);
964 /**
965 * Returns true if CheckForInterrupt has returned true since the last
966 * ReflowStarted call. Cannot itself trigger an interrupt check.
967 */
968 bool HasPendingInterrupt() { return mHasPendingInterrupt; }
970 /**
971 * If we have a presshell, and if the given content's current
972 * document is the same as our presshell's document, return the
973 * content's primary frame. Otherwise, return null. Only use this
974 * if you care about which presshell the primary frame is in.
975 */
976 nsIFrame* GetPrimaryFrameFor(nsIContent* aContent);
978 void NotifyDestroyingFrame(nsIFrame* aFrame)
979 {
980 PropertyTable()->DeleteAllFor(aFrame);
981 }
983 virtual size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
984 virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const {
985 return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
986 }
988 bool IsRootContentDocument();
989 bool IsCrossProcessRootContentDocument();
991 bool IsGlyph() const {
992 return mIsGlyph;
993 }
995 void SetIsGlyph(bool aValue) {
996 mIsGlyph = aValue;
997 }
999 bool UsesRootEMUnits() const {
1000 return mUsesRootEMUnits;
1001 }
1003 void SetUsesRootEMUnits(bool aValue) {
1004 mUsesRootEMUnits = aValue;
1005 }
1007 bool UsesViewportUnits() const {
1008 return mUsesViewportUnits;
1009 }
1011 void SetUsesViewportUnits(bool aValue) {
1012 mUsesViewportUnits = aValue;
1013 }
1015 // true if there are OMTA transition updates for the current document which
1016 // have been throttled, and therefore some style information may not be up
1017 // to date
1018 bool ExistThrottledUpdates() const {
1019 return mExistThrottledUpdates;
1020 }
1022 void SetExistThrottledUpdates(bool aExistThrottledUpdates) {
1023 mExistThrottledUpdates = aExistThrottledUpdates;
1024 }
1026 bool IsDeviceSizePageSize();
1028 bool HasWarnedAboutPositionedTableParts() const {
1029 return mHasWarnedAboutPositionedTableParts;
1030 }
1032 void SetHasWarnedAboutPositionedTableParts() {
1033 mHasWarnedAboutPositionedTableParts = true;
1034 }
1036 protected:
1037 friend class nsRunnableMethod<nsPresContext>;
1038 NS_HIDDEN_(void) ThemeChangedInternal();
1039 NS_HIDDEN_(void) SysColorChangedInternal();
1040 NS_HIDDEN_(void) UIResolutionChangedInternal();
1042 static NS_HIDDEN_(bool)
1043 UIResolutionChangedSubdocumentCallback(nsIDocument* aDocument, void* aData);
1045 NS_HIDDEN_(void) SetImgAnimations(nsIContent *aParent, uint16_t aMode);
1046 NS_HIDDEN_(void) SetSMILAnimations(nsIDocument *aDoc, uint16_t aNewMode,
1047 uint16_t aOldMode);
1048 NS_HIDDEN_(void) GetDocumentColorPreferences();
1050 NS_HIDDEN_(void) PreferenceChanged(const char* aPrefName);
1051 static NS_HIDDEN_(void) PrefChangedCallback(const char*, void*);
1053 NS_HIDDEN_(void) UpdateAfterPreferencesChanged();
1054 static NS_HIDDEN_(void) PrefChangedUpdateTimerCallback(nsITimer *aTimer, void *aClosure);
1056 NS_HIDDEN_(void) GetUserPreferences();
1058 // Allow nsAutoPtr<LangGroupFontPrefs> dtor to access this protected struct's
1059 // dtor:
1060 struct LangGroupFontPrefs;
1061 friend class nsAutoPtr<LangGroupFontPrefs>;
1062 struct LangGroupFontPrefs {
1063 // Font sizes default to zero; they will be set in GetFontPreferences
1064 LangGroupFontPrefs()
1065 : mLangGroup(nullptr)
1066 , mMinimumFontSize(0)
1067 , mDefaultVariableFont("serif", NS_FONT_STYLE_NORMAL, NS_FONT_VARIANT_NORMAL,
1068 NS_FONT_WEIGHT_NORMAL, NS_FONT_STRETCH_NORMAL, 0, 0)
1069 , mDefaultFixedFont("monospace", NS_FONT_STYLE_NORMAL,
1070 NS_FONT_VARIANT_NORMAL, NS_FONT_WEIGHT_NORMAL,
1071 NS_FONT_STRETCH_NORMAL, 0, 0)
1072 , mDefaultSerifFont("serif", NS_FONT_STYLE_NORMAL, NS_FONT_VARIANT_NORMAL,
1073 NS_FONT_WEIGHT_NORMAL, NS_FONT_STRETCH_NORMAL, 0, 0)
1074 , mDefaultSansSerifFont("sans-serif", NS_FONT_STYLE_NORMAL,
1075 NS_FONT_VARIANT_NORMAL, NS_FONT_WEIGHT_NORMAL,
1076 NS_FONT_STRETCH_NORMAL, 0, 0)
1077 , mDefaultMonospaceFont("monospace", NS_FONT_STYLE_NORMAL,
1078 NS_FONT_VARIANT_NORMAL, NS_FONT_WEIGHT_NORMAL,
1079 NS_FONT_STRETCH_NORMAL, 0, 0)
1080 , mDefaultCursiveFont("cursive", NS_FONT_STYLE_NORMAL,
1081 NS_FONT_VARIANT_NORMAL, NS_FONT_WEIGHT_NORMAL,
1082 NS_FONT_STRETCH_NORMAL, 0, 0)
1083 , mDefaultFantasyFont("fantasy", NS_FONT_STYLE_NORMAL,
1084 NS_FONT_VARIANT_NORMAL, NS_FONT_WEIGHT_NORMAL,
1085 NS_FONT_STRETCH_NORMAL, 0, 0)
1086 {}
1088 size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const {
1089 size_t n = 0;
1090 LangGroupFontPrefs *curr = mNext;
1091 while (curr) {
1092 n += aMallocSizeOf(curr);
1094 // Measurement of the following members may be added later if DMD finds
1095 // it is worthwhile:
1096 // - mLangGroup
1097 // - mDefault*Font
1099 curr = curr->mNext;
1100 }
1101 return n;
1102 }
1104 nsCOMPtr<nsIAtom> mLangGroup;
1105 nscoord mMinimumFontSize;
1106 nsFont mDefaultVariableFont;
1107 nsFont mDefaultFixedFont;
1108 nsFont mDefaultSerifFont;
1109 nsFont mDefaultSansSerifFont;
1110 nsFont mDefaultMonospaceFont;
1111 nsFont mDefaultCursiveFont;
1112 nsFont mDefaultFantasyFont;
1113 nsAutoPtr<LangGroupFontPrefs> mNext;
1114 };
1116 /**
1117 * Fetch the user's font preferences for the given aLanguage's
1118 * langugage group.
1119 */
1120 const LangGroupFontPrefs* GetFontPrefsForLang(nsIAtom *aLanguage) const;
1122 void ResetCachedFontPrefs() {
1123 // Throw away any other LangGroupFontPrefs objects:
1124 mLangGroupFontPrefs.mNext = nullptr;
1126 // Make GetFontPreferences reinitialize mLangGroupFontPrefs:
1127 mLangGroupFontPrefs.mLangGroup = nullptr;
1128 }
1130 NS_HIDDEN_(void) UpdateCharSet(const nsCString& aCharSet);
1132 public:
1133 void DoChangeCharSet(const nsCString& aCharSet);
1135 /**
1136 * Checks for MozAfterPaint listeners on the document
1137 */
1138 bool MayHavePaintEventListener();
1140 /**
1141 * Checks for MozAfterPaint listeners on the document and
1142 * any subdocuments, except for subdocuments that are non-top-level
1143 * content documents.
1144 */
1145 bool MayHavePaintEventListenerInSubDocument();
1147 protected:
1148 void InvalidateThebesLayers();
1149 void AppUnitsPerDevPixelChanged();
1151 void HandleRebuildUserFontSet() {
1152 mPostedFlushUserFontSet = false;
1153 FlushUserFontSet();
1154 }
1156 bool HavePendingInputEvent();
1158 // Can't be inline because we can't include nsStyleSet.h.
1159 bool HasCachedStyleData();
1161 bool IsChromeSlow() const;
1163 // IMPORTANT: The ownership implicit in the following member variables
1164 // has been explicitly checked. If you add any members to this class,
1165 // please make the ownership explicit (pinkerton, scc).
1167 nsPresContextType mType;
1168 nsIPresShell* mShell; // [WEAK]
1169 nsCOMPtr<nsIDocument> mDocument;
1170 nsRefPtr<nsDeviceContext> mDeviceContext; // [STRONG] could be weak, but
1171 // better safe than sorry.
1172 // Cannot reintroduce cycles
1173 // since there is no dependency
1174 // from gfx back to layout.
1175 nsRefPtr<mozilla::EventStateManager> mEventManager;
1176 nsRefPtr<nsRefreshDriver> mRefreshDriver;
1177 nsRefPtr<nsTransitionManager> mTransitionManager;
1178 nsRefPtr<nsAnimationManager> mAnimationManager;
1179 nsRefPtr<mozilla::RestyleManager> mRestyleManager;
1180 nsIAtom* mMedium; // initialized by subclass ctors;
1181 // weak pointer to static atom
1182 nsCOMPtr<nsIAtom> mMediaEmulated;
1184 nsILinkHandler* mLinkHandler; // [WEAK]
1186 // Formerly mLangGroup; moving from charset-oriented langGroup to
1187 // maintaining actual language settings everywhere (see bug 524107).
1188 // This may in fact hold a langGroup such as x-western rather than
1189 // a specific language, however (e.g, if it is inferred from the
1190 // charset rather than explicitly specified as a lang attribute).
1191 nsCOMPtr<nsIAtom> mLanguage;
1193 public:
1194 // The following are public member variables so that we can use them
1195 // with mozilla::AutoToggle or mozilla::AutoRestore.
1197 // Should we disable font size inflation because we're inside of
1198 // shrink-wrapping calculations on an inflation container?
1199 bool mInflationDisabledForShrinkWrap;
1201 protected:
1203 mozilla::WeakPtr<nsDocShell> mContainer;
1205 PRCList mDOMMediaQueryLists;
1207 // Base minimum font size, independent of the language-specific global preference. Defaults to 0
1208 int32_t mBaseMinFontSize;
1209 float mTextZoom; // Text zoom, defaults to 1.0
1210 float mFullZoom; // Page zoom, defaults to 1.0
1212 float mLastFontInflationScreenWidth;
1214 int32_t mCurAppUnitsPerDevPixel;
1215 int32_t mAutoQualityMinFontSizePixelsPref;
1217 nsCOMPtr<nsITheme> mTheme;
1218 nsCOMPtr<nsILanguageAtomService> mLangService;
1219 nsCOMPtr<nsIPrintSettings> mPrintSettings;
1220 nsCOMPtr<nsITimer> mPrefChangedTimer;
1222 FramePropertyTable mPropertyTable;
1224 nsInvalidateRequestList mInvalidateRequestsSinceLastPaint;
1225 nsInvalidateRequestList mUndeliveredInvalidateRequestsBeforeLastPaint;
1227 // container for per-context fonts (downloadable, SVG, etc.)
1228 nsUserFontSet* mUserFontSet;
1230 // text performance metrics
1231 nsAutoPtr<gfxTextPerfMetrics> mTextPerf;
1233 nsRect mVisibleArea;
1234 nsSize mPageSize;
1235 float mPageScale;
1236 float mPPScale;
1238 nscolor mDefaultColor;
1239 nscolor mBackgroundColor;
1241 nscolor mLinkColor;
1242 nscolor mActiveLinkColor;
1243 nscolor mVisitedLinkColor;
1245 nscolor mFocusBackgroundColor;
1246 nscolor mFocusTextColor;
1248 nscolor mBodyTextColor;
1250 mozilla::ScrollbarStyles mViewportStyleOverflow;
1251 uint8_t mFocusRingWidth;
1253 bool mExistThrottledUpdates;
1255 uint16_t mImageAnimationMode;
1256 uint16_t mImageAnimationModePref;
1258 LangGroupFontPrefs mLangGroupFontPrefs;
1260 nscoord mBorderWidthTable[3];
1262 uint32_t mInterruptChecksToSkip;
1264 mozilla::TimeStamp mReflowStartTime;
1265 PRInt32 mMaxFontAttempts;
1266 PRInt32 mMaxFonts;
1268 // last time animations styles were flushed to their primary frames
1269 mozilla::TimeStamp mLastUpdateThrottledAnimationStyle;
1270 // last time transition styles were flushed to their primary frames
1271 mozilla::TimeStamp mLastUpdateThrottledTransitionStyle;
1272 // last time we did a full style flush
1273 mozilla::TimeStamp mLastStyleUpdateForAllAnimations;
1275 unsigned mHasPendingInterrupt : 1;
1276 unsigned mInterruptsEnabled : 1;
1277 unsigned mUseDocumentFonts : 1;
1278 unsigned mUseDocumentColors : 1;
1279 unsigned mUnderlineLinks : 1;
1280 unsigned mSendAfterPaintToContent : 1;
1281 unsigned mUseFocusColors : 1;
1282 unsigned mFocusRingOnAnything : 1;
1283 unsigned mFocusRingStyle : 1;
1284 unsigned mDrawImageBackground : 1;
1285 unsigned mDrawColorBackground : 1;
1286 unsigned mNeverAnimate : 1;
1287 unsigned mIsRenderingOnlySelection : 1;
1288 unsigned mPaginated : 1;
1289 unsigned mCanPaginatedScroll : 1;
1290 unsigned mDoScaledTwips : 1;
1291 unsigned mIsRootPaginatedDocument : 1;
1292 unsigned mPrefBidiDirection : 1;
1293 unsigned mPrefScrollbarSide : 2;
1294 unsigned mPendingSysColorChanged : 1;
1295 unsigned mPendingThemeChanged : 1;
1296 unsigned mPendingUIResolutionChanged : 1;
1297 unsigned mPendingMediaFeatureValuesChanged : 1;
1298 unsigned mPrefChangePendingNeedsReflow : 1;
1299 unsigned mIsEmulatingMedia : 1;
1300 // True if the requests in mInvalidateRequestsSinceLastPaint cover the
1301 // entire viewport
1302 unsigned mAllInvalidated : 1;
1304 // Are we currently drawing an SVG glyph?
1305 unsigned mIsGlyph : 1;
1307 // Does the associated document use root-em (rem) units?
1308 unsigned mUsesRootEMUnits : 1;
1309 // Does the associated document use viewport units (vw/vh/vmin/vmax)?
1310 unsigned mUsesViewportUnits : 1;
1312 // Has there been a change to the viewport's dimensions?
1313 unsigned mPendingViewportChange : 1;
1315 // Is the current mUserFontSet valid?
1316 unsigned mUserFontSetDirty : 1;
1317 // Has GetUserFontSet() been called?
1318 unsigned mGetUserFontSetCalled : 1;
1319 // Do we currently have an event posted to call FlushUserFontSet?
1320 unsigned mPostedFlushUserFontSet : 1;
1322 // resize reflow is suppressed when the only change has been to zoom
1323 // the document rather than to change the document's dimensions
1324 unsigned mSupressResizeReflow : 1;
1326 unsigned mIsVisual : 1;
1328 unsigned mProcessingRestyles : 1;
1329 unsigned mProcessingAnimationStyleChange : 1;
1331 unsigned mFireAfterPaintEvents : 1;
1333 unsigned mIsChrome : 1;
1334 unsigned mIsChromeOriginImage : 1;
1336 // Should we paint flash in this context? Do not use this variable directly.
1337 // Use GetPaintFlashing() method instead.
1338 mutable unsigned mPaintFlashing : 1;
1339 mutable unsigned mPaintFlashingInitialized : 1;
1341 unsigned mHasWarnedAboutPositionedTableParts : 1;
1343 #ifdef DEBUG
1344 bool mInitialized;
1345 #endif
1348 protected:
1350 virtual ~nsPresContext() NS_HIDDEN;
1352 // these are private, use the list in nsFont.h if you want a public list
1353 enum {
1354 eDefaultFont_Variable,
1355 eDefaultFont_Fixed,
1356 eDefaultFont_Serif,
1357 eDefaultFont_SansSerif,
1358 eDefaultFont_Monospace,
1359 eDefaultFont_Cursive,
1360 eDefaultFont_Fantasy,
1361 eDefaultFont_COUNT
1362 };
1364 nscolor MakeColorPref(const nsString& aColor);
1366 void LastRelease();
1368 #ifdef DEBUG
1369 private:
1370 friend struct nsAutoLayoutPhase;
1371 uint32_t mLayoutPhaseCount[eLayoutPhase_COUNT];
1372 public:
1373 uint32_t LayoutPhaseCount(nsLayoutPhase aPhase) {
1374 return mLayoutPhaseCount[aPhase];
1375 }
1376 #endif
1378 };
1380 class nsRootPresContext MOZ_FINAL : public nsPresContext {
1381 public:
1382 nsRootPresContext(nsIDocument* aDocument, nsPresContextType aType) NS_HIDDEN;
1383 virtual ~nsRootPresContext();
1384 virtual void Detach() MOZ_OVERRIDE;
1386 /**
1387 * Ensure that NotifyDidPaintForSubtree is eventually called on this
1388 * object after a timeout.
1389 */
1390 void EnsureEventualDidPaintEvent();
1392 void CancelDidPaintTimer()
1393 {
1394 if (mNotifyDidPaintTimer) {
1395 mNotifyDidPaintTimer->Cancel();
1396 mNotifyDidPaintTimer = nullptr;
1397 }
1398 }
1400 /**
1401 * Registers a plugin to receive geometry updates (position and clip
1402 * region) so it can update its widget.
1403 * Callers must call UnregisterPluginForGeometryUpdates before
1404 * the aPlugin frame is destroyed.
1405 */
1406 void RegisterPluginForGeometryUpdates(nsIContent* aPlugin);
1407 /**
1408 * Stops a plugin receiving geometry updates (position and clip
1409 * region). If the plugin was not already registered, this does
1410 * nothing.
1411 */
1412 void UnregisterPluginForGeometryUpdates(nsIContent* aPlugin);
1414 bool NeedToComputePluginGeometryUpdates()
1415 {
1416 return mRegisteredPlugins.Count() > 0;
1417 }
1418 /**
1419 * Compute geometry updates for each plugin given that aList is the display
1420 * list for aFrame. The updates are not yet applied;
1421 * ApplyPluginGeometryUpdates is responsible for that. In the meantime they
1422 * are stored on each nsObjectFrame.
1423 * This needs to be called even when aFrame is a popup, since although
1424 * windowed plugins aren't allowed in popups, windowless plugins are
1425 * and ComputePluginGeometryUpdates needs to be called for them.
1426 */
1427 void ComputePluginGeometryUpdates(nsIFrame* aFrame,
1428 nsDisplayListBuilder* aBuilder,
1429 nsDisplayList* aList);
1431 /**
1432 * Apply the stored plugin geometry updates. This should normally be called
1433 * in DidPaint so the plugins are moved/clipped immediately after we've
1434 * updated our window, so they look in sync with our window.
1435 */
1436 void ApplyPluginGeometryUpdates();
1438 virtual bool IsRoot() MOZ_OVERRIDE { return true; }
1440 /**
1441 * Increment DOM-modification generation counter to indicate that
1442 * the DOM has changed in a way that might lead to style changes/
1443 * reflows/frame creation and destruction.
1444 */
1445 void IncrementDOMGeneration() { mDOMGeneration++; }
1447 /**
1448 * Get the current DOM generation counter.
1449 *
1450 * See nsFrameManagerBase::GetGlobalGenerationNumber() for a
1451 * global generation number.
1452 */
1453 uint32_t GetDOMGeneration() { return mDOMGeneration; }
1455 /**
1456 * Add a runnable that will get called before the next paint. They will get
1457 * run eventually even if painting doesn't happen. They might run well before
1458 * painting happens.
1459 */
1460 void AddWillPaintObserver(nsIRunnable* aRunnable);
1462 /**
1463 * Run all runnables that need to get called before the next paint.
1464 */
1465 void FlushWillPaintObservers();
1467 virtual size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const MOZ_OVERRIDE;
1469 protected:
1470 /**
1471 * Start a timer to ensure we eventually run ApplyPluginGeometryUpdates.
1472 */
1473 void InitApplyPluginGeometryTimer();
1474 /**
1475 * Cancel the timer that ensures we eventually run ApplyPluginGeometryUpdates.
1476 */
1477 void CancelApplyPluginGeometryTimer();
1479 class RunWillPaintObservers : public nsRunnable {
1480 public:
1481 RunWillPaintObservers(nsRootPresContext* aPresContext) : mPresContext(aPresContext) {}
1482 void Revoke() { mPresContext = nullptr; }
1483 NS_IMETHOD Run() MOZ_OVERRIDE
1484 {
1485 if (mPresContext) {
1486 mPresContext->FlushWillPaintObservers();
1487 }
1488 return NS_OK;
1489 }
1490 nsRootPresContext* mPresContext;
1491 };
1493 friend class nsPresContext;
1495 nsCOMPtr<nsITimer> mNotifyDidPaintTimer;
1496 nsCOMPtr<nsITimer> mApplyPluginGeometryTimer;
1497 nsTHashtable<nsRefPtrHashKey<nsIContent> > mRegisteredPlugins;
1498 nsTArray<nsCOMPtr<nsIRunnable> > mWillPaintObservers;
1499 nsRevocableEventPtr<RunWillPaintObservers> mWillPaintFallbackEvent;
1500 uint32_t mDOMGeneration;
1501 };
1503 #ifdef MOZ_REFLOW_PERF
1505 #define DO_GLOBAL_REFLOW_COUNT(_name) \
1506 aPresContext->CountReflows((_name), (nsIFrame*)this);
1507 #else
1508 #define DO_GLOBAL_REFLOW_COUNT(_name)
1509 #endif // MOZ_REFLOW_PERF
1511 #endif /* nsPresContext_h___ */