1c627df2f9077cd0bdfffea58186cf533f866a29
[WebKit-https.git] / Source / WebCore / page / FrameView.h
1 /*
2    Copyright (C) 1997 Martin Jones (mjones@kde.org)
3              (C) 1998 Waldo Bastian (bastian@kde.org)
4              (C) 1998, 1999 Torben Weis (weis@kde.org)
5              (C) 1999 Lars Knoll (knoll@kde.org)
6              (C) 1999 Antti Koivisto (koivisto@kde.org)
7    Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
8
9    This library is free software; you can redistribute it and/or
10    modify it under the terms of the GNU Library General Public
11    License as published by the Free Software Foundation; either
12    version 2 of the License, or (at your option) any later version.
13
14    This library is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17    Library General Public License for more details.
18
19    You should have received a copy of the GNU Library General Public License
20    along with this library; see the file COPYING.LIB.  If not, write to
21    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22    Boston, MA 02110-1301, USA.
23 */
24
25 #ifndef FrameView_h
26 #define FrameView_h
27
28 #include "AdjustViewSizeOrNot.h"
29 #include "Color.h"
30 #include "LayoutMilestones.h"
31 #include "LayoutRect.h"
32 #include "Pagination.h"
33 #include "PaintPhase.h"
34 #include "ScrollView.h"
35 #include <wtf/Forward.h>
36 #include <wtf/ListHashSet.h>
37 #include <wtf/OwnPtr.h>
38 #include <wtf/text/WTFString.h>
39
40 namespace WebCore {
41
42 class AXObjectCache;
43 class Element;
44 class Event;
45 class FloatSize;
46 class Frame;
47 class HTMLFrameOwnerElement;
48 class URL;
49 class Node;
50 class Page;
51 class RenderBox;
52 class RenderElement;
53 class RenderEmbeddedObject;
54 class RenderLayer;
55 class RenderObject;
56 class RenderScrollbarPart;
57 class RenderStyle;
58 class RenderView;
59 class RenderWidget;
60
61 Pagination::Mode paginationModeForRenderStyle(const RenderStyle&);
62
63 typedef unsigned long long DOMTimeStamp;
64
65 class FrameView FINAL : public ScrollView {
66 public:
67     friend class RenderView;
68     friend class Internals;
69
70     static PassRefPtr<FrameView> create(Frame&);
71     static PassRefPtr<FrameView> create(Frame&, const IntSize& initialSize);
72
73     virtual ~FrameView();
74
75     virtual HostWindow* hostWindow() const OVERRIDE;
76     
77     virtual void invalidateRect(const IntRect&) OVERRIDE;
78     virtual void setFrameRect(const IntRect&) OVERRIDE;
79
80 #if ENABLE(REQUEST_ANIMATION_FRAME)
81     virtual bool scheduleAnimation() OVERRIDE;
82 #endif
83
84     Frame& frame() const { return *m_frame; }
85
86     RenderView* renderView() const;
87
88     int mapFromLayoutToCSSUnits(LayoutUnit) const;
89     LayoutUnit mapFromCSSToLayoutUnits(int) const;
90
91     LayoutUnit marginWidth() const { return m_margins.width(); } // -1 means default
92     LayoutUnit marginHeight() const { return m_margins.height(); } // -1 means default
93     void setMarginWidth(LayoutUnit);
94     void setMarginHeight(LayoutUnit);
95
96     virtual void setCanHaveScrollbars(bool) OVERRIDE;
97     void updateCanHaveScrollbars();
98
99     virtual PassRefPtr<Scrollbar> createScrollbar(ScrollbarOrientation) OVERRIDE;
100
101     virtual bool avoidScrollbarCreation() const OVERRIDE;
102
103     virtual void setContentsSize(const IntSize&) OVERRIDE;
104
105     void layout(bool allowSubtree = true);
106     bool didFirstLayout() const;
107     void layoutTimerFired(Timer<FrameView>*);
108     void scheduleRelayout();
109     void scheduleRelayoutOfSubtree(RenderElement&);
110     void unscheduleRelayout();
111     bool layoutPending() const;
112     bool isInLayout() const { return m_layoutPhase == InLayout; }
113
114     RenderObject* layoutRoot(bool onlyDuringLayout = false) const;
115     void clearLayoutRoot() { m_layoutRoot = nullptr; }
116     int layoutCount() const { return m_layoutCount; }
117
118     bool needsLayout() const;
119     void setNeedsLayout();
120     void setViewportConstrainedObjectsNeedLayout();
121
122     bool needsFullRepaint() const { return m_needsFullRepaint; }
123
124 #if ENABLE(REQUEST_ANIMATION_FRAME)
125     void serviceScriptedAnimations(double monotonicAnimationStartTime);
126 #endif
127
128 #if USE(ACCELERATED_COMPOSITING)
129     void updateCompositingLayersAfterStyleChange();
130     void updateCompositingLayersAfterLayout();
131     bool flushCompositingStateForThisFrame(Frame* rootFrameForFlush);
132
133     void clearBackingStores();
134     void restoreBackingStores();
135
136     // Called when changes to the GraphicsLayer hierarchy have to be synchronized with
137     // content rendered via the normal painting path.
138     void setNeedsOneShotDrawingSynchronization();
139
140     virtual TiledBacking* tiledBacking() OVERRIDE;
141
142     // In the future when any ScrollableArea can have a node in th ScrollingTree, this should
143     // become a virtual function on ScrollableArea.
144     uint64_t scrollLayerID() const;
145 #endif
146
147     bool hasCompositedContent() const;
148     bool hasCompositedContentIncludingDescendants() const;
149     bool hasCompositingAncestor() const;
150     void enterCompositingMode();
151     bool isEnclosedInCompositingLayer() const;
152
153     // Only used with accelerated compositing, but outside the #ifdef to make linkage easier.
154     // Returns true if the flush was completed.
155     bool flushCompositingStateIncludingSubframes();
156
157     // Returns true when a paint with the PaintBehaviorFlattenCompositingLayers flag set gives
158     // a faithful representation of the content.
159     bool isSoftwareRenderable() const;
160
161     void didMoveOnscreen();
162     void willMoveOffscreen();
163     void setIsInWindow(bool);
164
165     void resetScrollbars();
166     void resetScrollbarsAndClearContentsSize();
167     void prepareForDetach();
168     void detachCustomScrollbars();
169     void recalculateScrollbarOverlayStyle();
170
171     void clear();
172
173     bool isTransparent() const;
174     void setTransparent(bool isTransparent);
175     
176     // True if the FrameView is not transparent, and the base background color is opaque.
177     bool hasOpaqueBackground() const;
178
179     Color baseBackgroundColor() const;
180     void setBaseBackgroundColor(const Color&);
181     void updateBackgroundRecursively(const Color&, bool);
182
183     bool shouldUpdateWhileOffscreen() const;
184     void setShouldUpdateWhileOffscreen(bool);
185     bool shouldUpdate(bool = false) const;
186
187     void adjustViewSize();
188     
189     virtual IntRect windowClipRect(bool clipToContents = true) const OVERRIDE;
190     IntRect windowClipRectForFrameOwner(const HTMLFrameOwnerElement*, bool clipToLayerContents) const;
191
192     virtual IntRect windowResizerRect() const OVERRIDE;
193
194     virtual float visibleContentScaleFactor() const OVERRIDE;
195
196     virtual void setFixedVisibleContentRect(const IntRect&) OVERRIDE;
197     virtual void setScrollPosition(const IntPoint&) OVERRIDE;
198     void scrollPositionChangedViaPlatformWidget();
199     virtual void updateLayerPositionsAfterScrolling() OVERRIDE;
200     virtual void updateCompositingLayersAfterScrolling() OVERRIDE;
201     virtual bool requestScrollPositionUpdate(const IntPoint&) OVERRIDE;
202     virtual bool isRubberBandInProgress() const OVERRIDE;
203     virtual IntPoint minimumScrollPosition() const OVERRIDE;
204     virtual IntPoint maximumScrollPosition() const OVERRIDE;
205
206     // This is different than visibleContentRect() in that it ignores negative (or overly positive)
207     // offsets from rubber-banding, and it takes zooming into account. 
208     LayoutRect viewportConstrainedVisibleContentRect() const;
209
210     String mediaType() const;
211     void setMediaType(const String&);
212     void adjustMediaTypeForPrinting(bool printing);
213
214     void setCannotBlitToWindow();
215     void setIsOverlapped(bool);
216     bool isOverlapped() const { return m_isOverlapped; }
217     bool isOverlappedIncludingAncestors() const;
218     void setContentIsOpaque(bool);
219
220     void addSlowRepaintObject(RenderElement*);
221     void removeSlowRepaintObject(RenderElement*);
222     bool hasSlowRepaintObject(RenderElement* o) const { return m_slowRepaintObjects && m_slowRepaintObjects->contains(o); }
223     bool hasSlowRepaintObjects() const { return m_slowRepaintObjects && m_slowRepaintObjects->size(); }
224
225     // Includes fixed- and sticky-position objects.
226     typedef HashSet<RenderElement*> ViewportConstrainedObjectSet;
227     void addViewportConstrainedObject(RenderElement*);
228     void removeViewportConstrainedObject(RenderElement*);
229     const ViewportConstrainedObjectSet* viewportConstrainedObjects() const { return m_viewportConstrainedObjects.get(); }
230     bool hasViewportConstrainedObjects() const { return m_viewportConstrainedObjects && m_viewportConstrainedObjects->size() > 0; }
231
232     // Functions for querying the current scrolled position, negating the effects of overhang
233     // and adjusting for page scale.
234     IntSize scrollOffsetForFixedPosition() const;
235     // Static function can be called from another thread.
236     static IntSize scrollOffsetForFixedPosition(const IntRect& visibleContentRect, const IntSize& totalContentsSize, const IntPoint& scrollPosition, const IntPoint& scrollOrigin, float frameScaleFactor, bool fixedElementsLayoutRelativeToFrame, ScrollBehaviorForFixedElements, int headerHeight, int footerHeight);
237
238     bool fixedElementsLayoutRelativeToFrame() const;
239
240     void beginDeferredRepaints();
241     void endDeferredRepaints();
242     void handleLoadCompleted();
243     void flushDeferredRepaints();
244     void startDeferredRepaintTimer(double delay);
245     void resetDeferredRepaintDelay();
246
247     void updateLayerFlushThrottlingInAllFrames();
248     void adjustTiledBackingCoverage();
249
250 #if ENABLE(DASHBOARD_SUPPORT) || ENABLE(DRAGGABLE_REGION)
251     void updateAnnotatedRegions();
252 #endif
253     void updateControlTints();
254
255     void restoreScrollbar();
256
257     void scheduleEvent(PassRefPtr<Event>, PassRefPtr<Node>);
258     void pauseScheduledEvents();
259     void resumeScheduledEvents();
260     void postLayoutTimerFired(Timer<FrameView>*);
261
262     bool wasScrolledByUser() const;
263     void setWasScrolledByUser(bool);
264
265     bool safeToPropagateScrollToParent() const { return m_safeToPropagateScrollToParent; }
266     void setSafeToPropagateScrollToParent(bool isSafe) { m_safeToPropagateScrollToParent = isSafe; }
267
268     void addEmbeddedObjectToUpdate(RenderEmbeddedObject&);
269     void removeEmbeddedObjectToUpdate(RenderEmbeddedObject&);
270
271     virtual void paintContents(GraphicsContext*, const IntRect& damageRect) OVERRIDE;
272     void setPaintBehavior(PaintBehavior);
273     PaintBehavior paintBehavior() const;
274     bool isPainting() const;
275     bool hasEverPainted() const { return m_lastPaintTime; }
276     void setLastPaintTime(double lastPaintTime) { m_lastPaintTime = lastPaintTime; }
277     void setNodeToDraw(Node*);
278
279     enum SelectionInSnapshot { IncludeSelection, ExcludeSelection };
280     enum CoordinateSpaceForSnapshot { DocumentCoordinates, ViewCoordinates };
281     void paintContentsForSnapshot(GraphicsContext*, const IntRect& imageRect, SelectionInSnapshot shouldPaintSelection, CoordinateSpaceForSnapshot);
282
283     virtual void paintOverhangAreas(GraphicsContext*, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect) OVERRIDE;
284     virtual void paintScrollCorner(GraphicsContext*, const IntRect& cornerRect) OVERRIDE;
285     virtual void paintScrollbar(GraphicsContext*, Scrollbar*, const IntRect&) OVERRIDE;
286
287     Color documentBackgroundColor() const;
288
289     bool isInChildFrameWithFrameFlattening() const;
290
291     static double currentPaintTimeStamp() { return sCurrentPaintTimeStamp; } // returns 0 if not painting
292     
293     void updateLayoutAndStyleIfNeededRecursive();
294
295     void incrementVisuallyNonEmptyCharacterCount(unsigned);
296     void incrementVisuallyNonEmptyPixelCount(const IntSize&);
297     void updateIsVisuallyNonEmpty();
298     bool isVisuallyNonEmpty() const { return m_isVisuallyNonEmpty; }
299     void enableAutoSizeMode(bool enable, const IntSize& minSize, const IntSize& maxSize);
300     void setAutoSizeFixedMinimumHeight(int fixedMinimumHeight);
301     IntSize autoSizingIntrinsicContentSize() const { return m_autoSizeContentSize; }
302
303     void forceLayout(bool allowSubtree = false);
304     void forceLayoutForPagination(const FloatSize& pageSize, const FloatSize& originalPageSize, float maximumShrinkFactor, AdjustViewSizeOrNot);
305
306     // FIXME: This method is retained because of embedded WebViews in AppKit.  When a WebView is embedded inside
307     // some enclosing view with auto-pagination, no call happens to resize the view.  The new pagination model
308     // needs the view to resize as a result of the breaks, but that means that the enclosing view has to potentially
309     // resize around that view.  Auto-pagination uses the bounds of the actual view that's being printed to determine
310     // the edges of the print operation, so the resize is necessary if the enclosing view's bounds depend on the
311     // web document's bounds.
312     // 
313     // This is already a problem if the view needs to be a different size because of printer fonts or because of print stylesheets.
314     // Mail/Dictionary work around this problem by using the _layoutForPrinting SPI
315     // to at least get print stylesheets and printer fonts into play, but since WebKit doesn't know about the page offset or
316     // page size, it can't actually paginate correctly during _layoutForPrinting.
317     //
318     // We can eventually move Mail to a newer SPI that would let them opt in to the layout-time pagination model,
319     // but that doesn't solve the general problem of how other AppKit views could opt in to the better model.
320     //
321     // NO OTHER PLATFORM BESIDES MAC SHOULD USE THIS METHOD.
322     void adjustPageHeightDeprecated(float* newBottom, float oldTop, float oldBottom, float bottomLimit);
323
324     bool scrollToFragment(const URL&);
325     bool scrollToAnchor(const String&);
326     void maintainScrollPositionAtAnchor(Node*);
327     void scrollElementToRect(Element*, const IntRect&);
328
329     // Methods to convert points and rects between the coordinate space of the renderer, and this view.
330     IntRect convertFromRenderer(const RenderElement*, const IntRect&) const;
331     IntRect convertToRenderer(const RenderElement*, const IntRect&) const;
332     IntPoint convertFromRenderer(const RenderElement*, const IntPoint&) const;
333     IntPoint convertToRenderer(const RenderElement*, const IntPoint&) const;
334
335     bool isFrameViewScrollCorner(RenderScrollbarPart* scrollCorner) const { return m_scrollCorner == scrollCorner; }
336
337     bool isScrollable();
338
339     enum ScrollbarModesCalculationStrategy { RulesFromWebContentOnly, AnyRule };
340     void calculateScrollbarModesForLayout(ScrollbarMode& hMode, ScrollbarMode& vMode, ScrollbarModesCalculationStrategy = AnyRule);
341
342     // Normal delay
343     static void setRepaintThrottlingDeferredRepaintDelay(double p);
344     // Negative value would mean that first few repaints happen without a delay
345     static void setRepaintThrottlingnInitialDeferredRepaintDelayDuringLoading(double p);
346     // The delay grows on each repaint to this maximum value
347     static void setRepaintThrottlingMaxDeferredRepaintDelayDuringLoading(double p);
348     // On each repaint the delay increses by this amount
349     static void setRepaintThrottlingDeferredRepaintDelayIncrementDuringLoading(double p);
350
351     virtual IntPoint lastKnownMousePosition() const OVERRIDE;
352     virtual bool isHandlingWheelEvent() const OVERRIDE;
353     bool shouldSetCursor() const;
354
355     // FIXME: Remove this method once plugin loading is decoupled from layout.
356     void flushAnyPendingPostLayoutTasks();
357
358     virtual bool shouldSuspendScrollAnimations() const OVERRIDE;
359     virtual void scrollbarStyleChanged(int newStyle, bool forceUpdate) OVERRIDE;
360
361     RenderBox* embeddedContentBox() const;
362     
363     void setTracksRepaints(bool);
364     bool isTrackingRepaints() const { return m_isTrackingRepaints; }
365     void resetTrackedRepaints();
366     const Vector<IntRect>& trackedRepaintRects() const { return m_trackedRepaintRects; }
367     String trackedRepaintRectsAsText() const;
368
369     typedef HashSet<ScrollableArea*> ScrollableAreaSet;
370     // Returns whether the scrollable area has just been newly added.
371     bool addScrollableArea(ScrollableArea*);
372     // Returns whether the scrollable area has just been removed.
373     bool removeScrollableArea(ScrollableArea*);
374     bool containsScrollableArea(ScrollableArea*) const;
375     const ScrollableAreaSet* scrollableAreas() const { return m_scrollableAreas.get(); }
376
377     virtual void removeChild(Widget*) OVERRIDE;
378
379     // This function exists for ports that need to handle wheel events manually.
380     // On Mac WebKit1 the underlying NSScrollView just does the scrolling, but on most other platforms
381     // we need this function in order to do the scroll ourselves.
382     bool wheelEvent(const PlatformWheelEvent&);
383
384     void setScrollingPerformanceLoggingEnabled(bool);
385
386     // Page and FrameView both store a Pagination value. Page::pagination() is set only by API,
387     // and FrameView::pagination() is set only by CSS. Page::pagination() will affect all
388     // FrameViews in the page cache, but FrameView::pagination() only affects the current
389     // FrameView. FrameView::pagination() will return m_pagination if it has been set. Otherwise,
390     // it will return Page::pagination() since currently there are no callers that need to
391     // distinguish between the two.
392     const Pagination& pagination() const;
393     void setPagination(const Pagination&);
394     
395     bool inProgrammaticScroll() const { return m_inProgrammaticScroll; }
396     void setInProgrammaticScroll(bool programmaticScroll) { m_inProgrammaticScroll = programmaticScroll; }
397
398 #if ENABLE(CSS_DEVICE_ADAPTATION)
399     IntSize initialViewportSize() const { return m_initialViewportSize; }
400     void setInitialViewportSize(const IntSize& size) { m_initialViewportSize = size; }
401 #endif
402
403     virtual bool isActive() const OVERRIDE;
404     virtual bool updatesScrollLayerPositionOnMainThread() const OVERRIDE;
405
406 #if ENABLE(RUBBER_BANDING)
407     GraphicsLayer* setWantsLayerForTopOverHangArea(bool) const;
408     GraphicsLayer* setWantsLayerForBottomOverHangArea(bool) const;
409 #endif
410
411     virtual int headerHeight() const OVERRIDE { return m_headerHeight; }
412     void setHeaderHeight(int);
413     virtual int footerHeight() const OVERRIDE { return m_footerHeight; }
414     void setFooterHeight(int);
415
416     virtual void willStartLiveResize() OVERRIDE;
417     virtual void willEndLiveResize() OVERRIDE;
418
419     void addPaintPendingMilestones(LayoutMilestones);
420     void firePaintRelatedMilestones();
421     LayoutMilestones milestonesPendingPaint() const { return m_milestonesPendingPaint; }
422
423     bool visualUpdatesAllowedByClient() const { return m_visualUpdatesAllowedByClient; }
424     void setVisualUpdatesAllowedByClient(bool);
425
426     void setScrollPinningBehavior(ScrollPinningBehavior);
427
428     ScrollBehaviorForFixedElements scrollBehaviorForFixedElements() const;
429
430     void updateWidgetPositions();
431     void didAddWidgetToRenderTree(Widget&);
432     void willRemoveWidgetFromRenderTree(Widget&);
433
434     void addTrackedRepaintRect(const IntRect&);
435
436 protected:
437     virtual bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect) OVERRIDE;
438     virtual void scrollContentsSlowPath(const IntRect& updateRect) OVERRIDE;
439     
440     void repaintSlowRepaintObjects();
441
442     virtual bool isVerticalDocument() const OVERRIDE;
443     virtual bool isFlippedDocument() const OVERRIDE;
444
445 private:
446     explicit FrameView(Frame&);
447
448     void reset();
449     void init();
450
451     enum LayoutPhase {
452         OutsideLayout,
453         InPreLayout,
454         InPreLayoutStyleUpdate,
455         InLayout,
456         InViewSizeAdjust,
457         InPostLayout,
458     };
459     LayoutPhase layoutPhase() const { return m_layoutPhase; }
460
461     bool inPreLayoutStyleUpdate() const { return m_layoutPhase == InPreLayoutStyleUpdate; }
462
463     virtual bool isFrameView() const OVERRIDE { return true; }
464
465     friend class RenderWidget;
466     bool useSlowRepaints(bool considerOverlap = true) const;
467     bool useSlowRepaintsIfNotOverlapped() const;
468     void updateCanBlitOnScrollRecursively();
469     bool contentsInCompositedLayer() const;
470
471     bool shouldUpdateCompositingLayersAfterScrolling() const;
472
473     void applyOverflowToViewport(RenderElement*, ScrollbarMode& hMode, ScrollbarMode& vMode);
474     void applyPaginationToViewport();
475
476     void updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow);
477
478     void paintControlTints();
479
480     void forceLayoutParentViewIfNeeded();
481     void performPostLayoutTasks();
482     void autoSizeIfEnabled();
483
484     virtual void repaintContentRectangle(const IntRect&, bool immediate) OVERRIDE;
485     virtual void contentsResized() OVERRIDE;
486     virtual void visibleContentsResized() OVERRIDE;
487     virtual void addedOrRemovedScrollbar() OVERRIDE;
488     virtual void fixedLayoutSizeChanged() OVERRIDE;
489
490     virtual void delegatesScrollingDidChange() OVERRIDE;
491
492     // Override ScrollView methods to do point conversion via renderers, in order to
493     // take transforms into account.
494     virtual IntRect convertToContainingView(const IntRect&) const OVERRIDE;
495     virtual IntRect convertFromContainingView(const IntRect&) const OVERRIDE;
496     virtual IntPoint convertToContainingView(const IntPoint&) const OVERRIDE;
497     virtual IntPoint convertFromContainingView(const IntPoint&) const OVERRIDE;
498
499     // ScrollableArea interface
500     virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&) OVERRIDE;
501     virtual void scrollTo(const IntSize&) OVERRIDE;
502     virtual void setVisibleScrollerThumbRect(const IntRect&) OVERRIDE;
503     virtual ScrollableArea* enclosingScrollableArea() const OVERRIDE;
504     virtual IntRect scrollableAreaBoundingBox() const OVERRIDE;
505     virtual bool scrollAnimatorEnabled() const OVERRIDE;
506 #if USE(ACCELERATED_COMPOSITING)
507     virtual bool usesCompositedScrolling() const OVERRIDE;
508     virtual GraphicsLayer* layerForScrolling() const OVERRIDE;
509     virtual GraphicsLayer* layerForHorizontalScrollbar() const OVERRIDE;
510     virtual GraphicsLayer* layerForVerticalScrollbar() const OVERRIDE;
511     virtual GraphicsLayer* layerForScrollCorner() const OVERRIDE;
512 #if ENABLE(RUBBER_BANDING)
513     virtual GraphicsLayer* layerForOverhangAreas() const OVERRIDE;
514 #endif
515 #endif
516
517     // Override scrollbar notifications to update the AXObject cache.
518     virtual void didAddScrollbar(Scrollbar*, ScrollbarOrientation) OVERRIDE;
519     virtual void willRemoveScrollbar(Scrollbar*, ScrollbarOrientation) OVERRIDE;
520
521     void sendResizeEventIfNeeded();
522
523     void updateScrollableAreaSet();
524
525     virtual void notifyPageThatContentAreaWillPaint() const OVERRIDE;
526
527     bool shouldUseLoadTimeDeferredRepaintDelay() const;
528     void deferredRepaintTimerFired(Timer<FrameView>*);
529     void doDeferredRepaints();
530     void updateDeferredRepaintDelayAfterRepaint();
531     double adjustedDeferredRepaintDelay() const;
532
533     bool updateEmbeddedObjects();
534     void updateEmbeddedObject(RenderEmbeddedObject&);
535     void scrollToAnchor();
536     void scrollPositionChanged();
537
538     bool hasCustomScrollbars() const;
539
540     virtual void updateScrollCorner() OVERRIDE;
541
542     FrameView* parentFrameView() const;
543
544     void startLayoutAtMainFrameViewIfNeeded(bool allowSubtree);
545     bool frameFlatteningEnabled() const;
546     bool isFrameFlatteningValidForThisFrame() const;
547
548     bool qualifiesAsVisuallyNonEmpty() const;
549
550     AXObjectCache* axObjectCache() const;
551     void notifyWidgetsInAllFrames(WidgetNotification);
552     void removeFromAXObjectCache();
553     void notifyWidgets(WidgetNotification);
554
555     HashSet<Widget*> m_widgetsInRenderTree;
556
557     static double sCurrentPaintTimeStamp; // used for detecting decoded resource thrash in the cache
558
559     LayoutSize m_size;
560     LayoutSize m_margins;
561
562     OwnPtr<ListHashSet<RenderEmbeddedObject*>> m_embeddedObjectsToUpdate;
563     const RefPtr<Frame> m_frame;
564
565     OwnPtr<HashSet<RenderElement*>> m_slowRepaintObjects;
566
567     bool m_needsFullRepaint;
568     
569     bool m_canHaveScrollbars;
570     bool m_cannotBlitToWindow;
571     bool m_isOverlapped;
572     bool m_contentIsOpaque;
573
574     int m_borderX;
575     int m_borderY;
576
577     Timer<FrameView> m_layoutTimer;
578     bool m_delayedLayout;
579     RenderElement* m_layoutRoot;
580
581     LayoutPhase m_layoutPhase;
582     bool m_layoutSchedulingEnabled;
583     bool m_inSynchronousPostLayout;
584     int m_layoutCount;
585     unsigned m_nestedLayoutCount;
586     Timer<FrameView> m_postLayoutTasksTimer;
587     bool m_firstLayoutCallbackPending;
588
589     bool m_firstLayout;
590     bool m_isTransparent;
591     Color m_baseBackgroundColor;
592     IntSize m_lastViewportSize;
593     float m_lastZoomFactor;
594
595     String m_mediaType;
596     String m_mediaTypeWhenNotPrinting;
597
598     bool m_overflowStatusDirty;
599     bool m_horizontalOverflow;
600     bool m_verticalOverflow;    
601     RenderElement* m_viewportRenderer;
602
603     Pagination m_pagination;
604
605     bool m_wasScrolledByUser;
606     bool m_inProgrammaticScroll;
607     bool m_safeToPropagateScrollToParent;
608
609     unsigned m_deferringRepaints;
610     unsigned m_repaintCount;
611     Vector<LayoutRect> m_repaintRects;
612     Timer<FrameView> m_deferredRepaintTimer;
613     double m_deferredRepaintDelay;
614     double m_lastPaintTime;
615
616     bool m_isTrackingRepaints; // Used for testing.
617     Vector<IntRect> m_trackedRepaintRects;
618
619     bool m_shouldUpdateWhileOffscreen;
620
621     unsigned m_deferSetNeedsLayouts;
622     bool m_setNeedsLayoutWasDeferred;
623
624     RefPtr<Node> m_nodeToDraw;
625     PaintBehavior m_paintBehavior;
626     bool m_isPainting;
627
628     unsigned m_visuallyNonEmptyCharacterCount;
629     unsigned m_visuallyNonEmptyPixelCount;
630     bool m_isVisuallyNonEmpty;
631     bool m_firstVisuallyNonEmptyLayoutCallbackPending;
632
633     RefPtr<Node> m_maintainScrollPositionAnchor;
634
635     // Renderer to hold our custom scroll corner.
636     RenderScrollbarPart* m_scrollCorner;
637
638     // If true, automatically resize the frame view around its content.
639     bool m_shouldAutoSize;
640     bool m_inAutoSize;
641     // True if autosize has been run since m_shouldAutoSize was set.
642     bool m_didRunAutosize;
643     // The lower bound on the size when autosizing.
644     IntSize m_minAutoSize;
645     // The upper bound on the size when autosizing.
646     IntSize m_maxAutoSize;
647     // The fixed height to resize the view to after autosizing is complete.
648     int m_autoSizeFixedMinimumHeight;
649     // The intrinsic content size decided by autosizing.
650     IntSize m_autoSizeContentSize;
651
652     OwnPtr<ScrollableAreaSet> m_scrollableAreas;
653     OwnPtr<ViewportConstrainedObjectSet> m_viewportConstrainedObjects;
654
655     int m_headerHeight;
656     int m_footerHeight;
657
658     LayoutMilestones m_milestonesPendingPaint;
659
660     static double s_normalDeferredRepaintDelay;
661     static double s_initialDeferredRepaintDelayDuringLoading;
662     static double s_maxDeferredRepaintDelayDuringLoading;
663     static double s_deferredRepaintDelayIncrementDuringLoading;
664
665     static const unsigned visualCharacterThreshold = 200;
666     static const unsigned visualPixelThreshold = 32 * 32;
667
668 #if ENABLE(CSS_DEVICE_ADAPTATION)
669     // Size of viewport before any UA or author styles have overridden
670     // the viewport given by the window or viewing area of the UA.
671     IntSize m_initialViewportSize;
672 #endif
673
674     bool m_visualUpdatesAllowedByClient;
675     
676     ScrollPinningBehavior m_scrollPinningBehavior;
677
678     unsigned m_scheduledEventSuppressionCount;
679
680     struct ScheduledEvent;
681     Vector<ScheduledEvent> m_scheduledEvents;
682 };
683
684 inline void FrameView::incrementVisuallyNonEmptyCharacterCount(unsigned count)
685 {
686     if (m_isVisuallyNonEmpty)
687         return;
688     m_visuallyNonEmptyCharacterCount += count;
689     if (m_visuallyNonEmptyCharacterCount <= visualCharacterThreshold)
690         return;
691     updateIsVisuallyNonEmpty();
692 }
693
694 inline void FrameView::incrementVisuallyNonEmptyPixelCount(const IntSize& size)
695 {
696     if (m_isVisuallyNonEmpty)
697         return;
698     m_visuallyNonEmptyPixelCount += size.width() * size.height();
699     if (m_visuallyNonEmptyPixelCount <= visualPixelThreshold)
700         return;
701     updateIsVisuallyNonEmpty();
702 }
703
704 WIDGET_TYPE_CASTS(FrameView, isFrameView());
705
706 } // namespace WebCore
707
708 #endif // FrameView_h