Home | History | Annotate | Download | only in frame
      1 /*
      2    Copyright (C) 1997 Martin Jones (mjones (at) kde.org)
      3              (C) 1998 Waldo Bastian (bastian (at) kde.org)
      4              (C) 1998, 1999 Torben Weis (weis (at) kde.org)
      5              (C) 1999 Lars Knoll (knoll (at) kde.org)
      6              (C) 1999 Antti Koivisto (koivisto (at) 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 "core/frame/AdjustViewSizeOrNot.h"
     29 #include "core/rendering/Pagination.h"
     30 #include "core/rendering/PaintPhase.h"
     31 #include "core/rendering/PartialLayoutState.h"
     32 #include "platform/geometry/LayoutRect.h"
     33 #include "platform/graphics/Color.h"
     34 #include "platform/scroll/ScrollView.h"
     35 #include "wtf/Forward.h"
     36 #include "wtf/OwnPtr.h"
     37 #include "wtf/text/WTFString.h"
     38 
     39 namespace WebCore {
     40 
     41 class AXObjectCache;
     42 class Element;
     43 class FloatSize;
     44 class Frame;
     45 class KURL;
     46 class Node;
     47 class Page;
     48 class RenderBox;
     49 class RenderEmbeddedObject;
     50 class RenderObject;
     51 class RenderScrollbarPart;
     52 class RenderStyle;
     53 
     54 Pagination::Mode paginationModeForRenderStyle(RenderStyle*);
     55 
     56 typedef unsigned long long DOMTimeStamp;
     57 
     58 class FrameView : public ScrollView {
     59 public:
     60     friend class RenderView;
     61     friend class Internals;
     62 
     63     static PassRefPtr<FrameView> create(Frame*);
     64     static PassRefPtr<FrameView> create(Frame*, const IntSize& initialSize);
     65 
     66     virtual ~FrameView();
     67 
     68     virtual HostWindow* hostWindow() const;
     69 
     70     virtual void invalidateRect(const IntRect&);
     71     virtual void setFrameRect(const IntRect&);
     72 
     73     virtual bool scheduleAnimation();
     74 
     75     Frame& frame() const { return *m_frame; }
     76 
     77     RenderView* renderView() const;
     78 
     79     LayoutUnit marginWidth() const { return m_margins.width(); } // -1 means default
     80     LayoutUnit marginHeight() const { return m_margins.height(); } // -1 means default
     81     void setMarginWidth(LayoutUnit);
     82     void setMarginHeight(LayoutUnit);
     83 
     84     virtual void setCanHaveScrollbars(bool);
     85     void updateCanHaveScrollbars();
     86 
     87     virtual PassRefPtr<Scrollbar> createScrollbar(ScrollbarOrientation);
     88 
     89     virtual void setContentsSize(const IntSize&);
     90 
     91     void layout(bool allowSubtree = true);
     92     bool didFirstLayout() const;
     93     void layoutTimerFired(Timer<FrameView>*);
     94     void scheduleRelayout();
     95     void scheduleRelayoutOfSubtree(RenderObject*);
     96     void unscheduleRelayout();
     97     bool layoutPending() const;
     98     bool isInLayout() const { return m_inLayout; }
     99 
    100     RenderObject* layoutRoot(bool onlyDuringLayout = false) const;
    101     void clearLayoutRoot() { m_layoutRoot = 0; }
    102     int layoutCount() const { return m_layoutCount; }
    103 
    104     bool needsLayout() const;
    105     void setNeedsLayout();
    106     void setViewportConstrainedObjectsNeedLayout();
    107 
    108     // Methods for getting/setting the size Blink should use to layout the contents.
    109     IntSize layoutSize(IncludeScrollbarsInRect = ExcludeScrollbars) const;
    110     void setLayoutSize(const IntSize&);
    111 
    112     // If this is set to false, the layout size will need to be explicitly set by the owner.
    113     // E.g. WebViewImpl sets its mainFrame's layout size manually
    114     void setLayoutSizeFixedToFrameSize(bool isFixed) { m_layoutSizeFixedToFrameSize = isFixed; }
    115     bool layoutSizeFixedToFrameSize() { return m_layoutSizeFixedToFrameSize; }
    116 
    117     bool needsFullRepaint() const { return m_doFullRepaint; }
    118 
    119     void serviceScriptedAnimations(double monotonicAnimationStartTime);
    120 
    121     void updateCompositingLayersAfterStyleChange();
    122     void updateCompositingLayersAfterLayout();
    123 
    124     bool hasCompositedContent() const;
    125     bool isEnclosedInCompositingLayer() const;
    126 
    127     // Returns true when a paint with the PaintBehaviorFlattenCompositingLayers flag set gives
    128     // a faithful representation of the content.
    129     bool isSoftwareRenderable() const;
    130 
    131     void resetScrollbars();
    132     void prepareForDetach();
    133     void detachCustomScrollbars();
    134     virtual void recalculateScrollbarOverlayStyle();
    135 
    136     void clear();
    137 
    138     bool isTransparent() const;
    139     void setTransparent(bool isTransparent);
    140 
    141     // True if the FrameView is not transparent, and the base background color is opaque.
    142     bool hasOpaqueBackground() const;
    143 
    144     Color baseBackgroundColor() const;
    145     void setBaseBackgroundColor(const Color&);
    146     void updateBackgroundRecursively(const Color&, bool);
    147 
    148     bool shouldUpdateWhileOffscreen() const;
    149     void setShouldUpdateWhileOffscreen(bool);
    150     bool shouldUpdate() const;
    151 
    152     void adjustViewSize();
    153 
    154     virtual IntRect windowClipRect(bool clipToContents = true) const;
    155     IntRect windowClipRectForFrameOwner(const HTMLFrameOwnerElement*, bool clipToLayerContents) const;
    156 
    157     virtual IntRect windowResizerRect() const;
    158 
    159     virtual float visibleContentScaleFactor() const OVERRIDE { return m_visibleContentScaleFactor; }
    160     void setVisibleContentScaleFactor(float);
    161 
    162     virtual float inputEventsScaleFactor() const OVERRIDE;
    163     virtual IntSize inputEventsOffsetForEmulation() const OVERRIDE;
    164     void setInputEventsTransformForEmulation(const IntSize&, float);
    165 
    166     virtual void setScrollPosition(const IntPoint&) OVERRIDE;
    167     virtual void repaintFixedElementsAfterScrolling();
    168     virtual void updateFixedElementsAfterScrolling();
    169     virtual bool shouldRubberBandInDirection(ScrollDirection) const;
    170     virtual bool isRubberBandInProgress() const OVERRIDE;
    171     void setScrollPositionNonProgrammatically(const IntPoint&);
    172 
    173     // This is different than visibleContentRect() in that it ignores negative (or overly positive)
    174     // offsets from rubber-banding, and it takes zooming into account.
    175     LayoutRect viewportConstrainedVisibleContentRect() const;
    176 
    177     AtomicString mediaType() const;
    178     void setMediaType(const AtomicString&);
    179     void adjustMediaTypeForPrinting(bool printing);
    180 
    181     void setCannotBlitToWindow();
    182     void setIsOverlapped(bool);
    183     bool isOverlapped() const { return m_isOverlapped; }
    184     bool isOverlappedIncludingAncestors() const;
    185     void setContentIsOpaque(bool);
    186 
    187     void addSlowRepaintObject();
    188     void removeSlowRepaintObject();
    189     bool hasSlowRepaintObjects() const { return m_slowRepaintObjectCount; }
    190 
    191     // Includes fixed- and sticky-position objects.
    192     typedef HashSet<RenderObject*> ViewportConstrainedObjectSet;
    193     void addViewportConstrainedObject(RenderObject*);
    194     void removeViewportConstrainedObject(RenderObject*);
    195     const ViewportConstrainedObjectSet* viewportConstrainedObjects() const { return m_viewportConstrainedObjects.get(); }
    196     bool hasViewportConstrainedObjects() const { return m_viewportConstrainedObjects && m_viewportConstrainedObjects->size() > 0; }
    197 
    198     void handleLoadCompleted();
    199     void resetDeferredRepaintDelay();
    200 
    201     void updateAnnotatedRegions();
    202     void updateControlTints();
    203 
    204     void restoreScrollbar();
    205 
    206     void postLayoutTimerFired(Timer<FrameView>*);
    207 
    208     bool wasScrolledByUser() const;
    209     void setWasScrolledByUser(bool);
    210 
    211     bool safeToPropagateScrollToParent() const { return m_safeToPropagateScrollToParent; }
    212     void setSafeToPropagateScrollToParent(bool isSafe) { m_safeToPropagateScrollToParent = isSafe; }
    213 
    214     void addWidgetToUpdate(RenderEmbeddedObject&);
    215 
    216     virtual void paintContents(GraphicsContext*, const IntRect& damageRect);
    217     void setPaintBehavior(PaintBehavior);
    218     PaintBehavior paintBehavior() const;
    219     bool isPainting() const;
    220     bool hasEverPainted() const { return m_lastPaintTime; }
    221     void setLastPaintTime(double lastPaintTime) { m_lastPaintTime = lastPaintTime; }
    222     void setNodeToDraw(Node*);
    223 
    224     virtual void paintOverhangAreas(GraphicsContext*, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect);
    225     virtual void paintScrollCorner(GraphicsContext*, const IntRect& cornerRect);
    226     virtual void paintScrollbar(GraphicsContext*, Scrollbar*, const IntRect&) OVERRIDE;
    227 
    228     Color documentBackgroundColor() const;
    229 
    230     static double currentFrameTimeStamp() { return s_currentFrameTimeStamp; }
    231 
    232     void updateLayoutAndStyleIfNeededRecursive();
    233 
    234     void incrementVisuallyNonEmptyCharacterCount(unsigned);
    235     void incrementVisuallyNonEmptyPixelCount(const IntSize&);
    236     void setIsVisuallyNonEmpty() { m_isVisuallyNonEmpty = true; }
    237     bool isVisuallyNonEmpty() const { return m_isVisuallyNonEmpty; }
    238     void enableAutoSizeMode(bool enable, const IntSize& minSize, const IntSize& maxSize);
    239 
    240     void forceLayout(bool allowSubtree = false);
    241     void forceLayoutForPagination(const FloatSize& pageSize, const FloatSize& originalPageSize, float maximumShrinkFactor, AdjustViewSizeOrNot);
    242 
    243     bool scrollToFragment(const KURL&);
    244     bool scrollToAnchor(const String&);
    245     void maintainScrollPositionAtAnchor(Node*);
    246     void scrollElementToRect(Element*, const IntRect&);
    247 
    248     // Methods to convert points and rects between the coordinate space of the renderer, and this view.
    249     virtual IntRect convertFromRenderer(const RenderObject*, const IntRect&) const;
    250     virtual IntRect convertToRenderer(const RenderObject*, const IntRect&) const;
    251     virtual IntPoint convertFromRenderer(const RenderObject*, const IntPoint&) const;
    252     virtual IntPoint convertToRenderer(const RenderObject*, const IntPoint&) const;
    253 
    254     bool isFrameViewScrollCorner(RenderScrollbarPart* scrollCorner) const { return m_scrollCorner == scrollCorner; }
    255 
    256     bool isScrollable();
    257 
    258     enum ScrollbarModesCalculationStrategy { RulesFromWebContentOnly, AnyRule };
    259     void calculateScrollbarModesForLayout(ScrollbarMode& hMode, ScrollbarMode& vMode, ScrollbarModesCalculationStrategy = AnyRule);
    260 
    261     // Normal delay
    262     static void setRepaintThrottlingDeferredRepaintDelay(double);
    263     // Negative value would mean that first few repaints happen without a delay
    264     static void setRepaintThrottlingnInitialDeferredRepaintDelayDuringLoading(double);
    265     // The delay grows on each repaint to this maximum value
    266     static void setRepaintThrottlingMaxDeferredRepaintDelayDuringLoading(double);
    267     // On each repaint the delay increses by this amount
    268     static void setRepaintThrottlingDeferredRepaintDelayIncrementDuringLoading(double);
    269 
    270     virtual IntPoint lastKnownMousePosition() const;
    271     bool shouldSetCursor() const;
    272 
    273     void setCursor(const Cursor&);
    274 
    275     virtual bool scrollbarsCanBeActive() const OVERRIDE;
    276 
    277     // FIXME: Remove this method once plugin loading is decoupled from layout.
    278     void flushAnyPendingPostLayoutTasks();
    279 
    280     virtual bool shouldSuspendScrollAnimations() const;
    281     virtual void scrollbarStyleChanged(int newStyle, bool forceUpdate);
    282 
    283     void setAnimatorsAreActive();
    284 
    285     RenderBox* embeddedContentBox() const;
    286 
    287     void setTracksRepaints(bool);
    288     bool isTrackingRepaints() const { return m_isTrackingRepaints; }
    289     void resetTrackedRepaints();
    290     const Vector<IntRect>& trackedRepaintRects() const { return m_trackedRepaintRects; }
    291     String trackedRepaintRectsAsText() const;
    292 
    293     typedef HashSet<ScrollableArea*> ScrollableAreaSet;
    294     // Returns whether the scrollable area has just been newly added.
    295     bool addScrollableArea(ScrollableArea*);
    296     // Returns whether the scrollable area has just been removed.
    297     bool removeScrollableArea(ScrollableArea*);
    298     bool containsScrollableArea(const ScrollableArea*) const;
    299     const ScrollableAreaSet* scrollableAreas() const { return m_scrollableAreas.get(); }
    300 
    301     // With CSS style "resize:" enabled, a little resizer handle will appear at the bottom
    302     // right of the object. We keep track of these resizer areas for checking if touches
    303     // (implemented using Scroll gesture) are targeting the resizer.
    304     typedef HashSet<RenderBox*> ResizerAreaSet;
    305     void addResizerArea(RenderBox*);
    306     void removeResizerArea(RenderBox*);
    307     const ResizerAreaSet* resizerAreas() const { return m_resizerAreas.get(); }
    308 
    309     virtual void removeChild(Widget*) OVERRIDE;
    310 
    311     // This function exists for ports that need to handle wheel events manually.
    312     // On Mac WebKit1 the underlying NSScrollView just does the scrolling, but on most other platforms
    313     // we need this function in order to do the scroll ourselves.
    314     bool wheelEvent(const PlatformWheelEvent&);
    315 
    316     // Page and FrameView both store a Pagination value. Page::pagination() is set only by API,
    317     // and FrameView::pagination() is set only by CSS. Page::pagination() will affect all
    318     // FrameViews in the page cache, but FrameView::pagination() only affects the current
    319     // FrameView. FrameView::pagination() will return m_pagination if it has been set. Otherwise,
    320     // it will return Page::pagination() since currently there are no callers that need to
    321     // distinguish between the two.
    322     const Pagination& pagination() const;
    323     void setPagination(const Pagination&);
    324 
    325     bool inProgrammaticScroll() const { return m_inProgrammaticScroll; }
    326     void setInProgrammaticScroll(bool programmaticScroll) { m_inProgrammaticScroll = programmaticScroll; }
    327 
    328     void setHasSoftwareFilters(bool hasSoftwareFilters) { m_hasSoftwareFilters = hasSoftwareFilters; }
    329     bool hasSoftwareFilters() const { return m_hasSoftwareFilters; }
    330 
    331     virtual bool isActive() const OVERRIDE;
    332 
    333     // DEPRECATED: Use viewportConstrainedVisibleContentRect() instead.
    334     IntSize scrollOffsetForFixedPosition() const;
    335 
    336     PartialLayoutState& partialLayout() { return m_partialLayout; }
    337 
    338     // Override scrollbar notifications to update the AXObject cache.
    339     virtual void didAddScrollbar(Scrollbar*, ScrollbarOrientation) OVERRIDE;
    340     virtual void willRemoveScrollbar(Scrollbar*, ScrollbarOrientation) OVERRIDE;
    341 
    342     class DeferredRepaintScope {
    343     public:
    344         DeferredRepaintScope(FrameView&);
    345         ~DeferredRepaintScope();
    346     private:
    347         RefPtr<FrameView> m_view;
    348     };
    349 
    350 protected:
    351     virtual bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect);
    352     virtual void scrollContentsSlowPath(const IntRect& updateRect);
    353 
    354     virtual bool isVerticalDocument() const;
    355     virtual bool isFlippedDocument() const;
    356 
    357 private:
    358     explicit FrameView(Frame*);
    359 
    360     void beginDeferredRepaints();
    361     void endDeferredRepaints();
    362     void flushDeferredRepaints();
    363     void startDeferredRepaintTimer(double delay);
    364 
    365     void reset();
    366     void init();
    367 
    368     virtual void frameRectsChanged();
    369     virtual bool isFrameView() const OVERRIDE { return true; }
    370 
    371     friend class RenderWidget;
    372     bool useSlowRepaints(bool considerOverlap = true) const;
    373     bool useSlowRepaintsIfNotOverlapped() const;
    374     void updateCanBlitOnScrollRecursively();
    375     bool contentsInCompositedLayer() const;
    376 
    377     void applyOverflowToViewport(RenderObject*, ScrollbarMode& hMode, ScrollbarMode& vMode);
    378     void applyPaginationToViewport();
    379 
    380     void updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow);
    381 
    382     void paintControlTints();
    383 
    384     void updateCounters();
    385     void autoSizeIfEnabled();
    386     void forceLayoutParentViewIfNeeded();
    387     void performPreLayoutTasks();
    388     void performLayout(RenderObject* rootForThisLayout, bool inSubtreeLayout);
    389     void scheduleOrPerformPostLayoutTasks();
    390     void performPostLayoutTasks();
    391 
    392     void repaintTree(RenderObject* root);
    393 
    394     virtual void gatherDebugLayoutRects(RenderObject* layoutRoot);
    395 
    396     virtual void repaintContentRectangle(const IntRect&);
    397     virtual void contentsResized() OVERRIDE;
    398     virtual void scrollbarExistenceDidChange();
    399 
    400     // Override ScrollView methods to do point conversion via renderers, in order to
    401     // take transforms into account.
    402     virtual IntRect convertToContainingView(const IntRect&) const OVERRIDE;
    403     virtual IntRect convertFromContainingView(const IntRect&) const OVERRIDE;
    404     virtual IntPoint convertToContainingView(const IntPoint&) const OVERRIDE;
    405     virtual IntPoint convertFromContainingView(const IntPoint&) const OVERRIDE;
    406 
    407     // ScrollableArea interface
    408     virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&) OVERRIDE;
    409     virtual void getTickmarks(Vector<IntRect>&) const OVERRIDE;
    410     virtual void scrollTo(const IntSize&) OVERRIDE;
    411     virtual ScrollableArea* enclosingScrollableArea() const OVERRIDE;
    412     virtual IntRect scrollableAreaBoundingBox() const OVERRIDE;
    413     virtual bool scrollAnimatorEnabled() const OVERRIDE;
    414     virtual bool usesCompositedScrolling() const OVERRIDE;
    415     virtual GraphicsLayer* layerForScrolling() const OVERRIDE;
    416     virtual GraphicsLayer* layerForHorizontalScrollbar() const OVERRIDE;
    417     virtual GraphicsLayer* layerForVerticalScrollbar() const OVERRIDE;
    418     virtual GraphicsLayer* layerForScrollCorner() const OVERRIDE;
    419 
    420     void sendResizeEventIfNeeded();
    421 
    422     void updateScrollableAreaSet();
    423 
    424     virtual void notifyPageThatContentAreaWillPaint() const;
    425 
    426     bool shouldUseLoadTimeDeferredRepaintDelay() const;
    427     void deferredRepaintTimerFired(Timer<FrameView>*);
    428     void doDeferredRepaints();
    429     void updateDeferredRepaintDelayAfterRepaint();
    430     double adjustedDeferredRepaintDelay() const;
    431 
    432     void updateWidgetsTimerFired(Timer<FrameView>*);
    433     bool updateWidgets();
    434 
    435     void scrollToAnchor();
    436     void scrollPositionChanged();
    437 
    438     bool hasCustomScrollbars() const;
    439     bool shouldUseCustomScrollbars(Element*& customScrollbarElement, Frame*& customScrollbarFrame);
    440 
    441     virtual void updateScrollCorner();
    442 
    443     FrameView* parentFrameView() const;
    444 
    445     virtual AXObjectCache* axObjectCache() const;
    446     void removeFromAXObjectCache();
    447 
    448     bool isMainFrame() const;
    449 
    450     void setLayoutSizeInternal(const IntSize&);
    451 
    452     static double s_currentFrameTimeStamp; // used for detecting decoded resource thrash in the cache
    453     static bool s_inPaintContents;
    454 
    455     LayoutSize m_size;
    456     LayoutSize m_margins;
    457 
    458     typedef HashSet<RefPtr<RenderEmbeddedObject> > EmbeddedObjectSet;
    459     EmbeddedObjectSet m_widgetUpdateSet;
    460 
    461     RefPtr<Frame> m_frame;
    462 
    463     bool m_doFullRepaint;
    464 
    465     bool m_canHaveScrollbars;
    466     bool m_cannotBlitToWindow;
    467     bool m_isOverlapped;
    468     bool m_contentIsOpaque;
    469     unsigned m_slowRepaintObjectCount;
    470     int m_borderX;
    471     int m_borderY;
    472 
    473     Timer<FrameView> m_layoutTimer;
    474     bool m_delayedLayout;
    475     RenderObject* m_layoutRoot;
    476 
    477     bool m_layoutSchedulingEnabled;
    478     bool m_inLayout;
    479     bool m_doingPreLayoutStyleUpdate;
    480     bool m_inSynchronousPostLayout;
    481     int m_layoutCount;
    482     unsigned m_nestedLayoutCount;
    483     Timer<FrameView> m_postLayoutTasksTimer;
    484     Timer<FrameView> m_updateWidgetsTimer;
    485     bool m_firstLayoutCallbackPending;
    486 
    487     bool m_firstLayout;
    488     bool m_isTransparent;
    489     Color m_baseBackgroundColor;
    490     IntSize m_lastViewportSize;
    491     float m_lastZoomFactor;
    492 
    493     AtomicString m_mediaType;
    494     AtomicString m_mediaTypeWhenNotPrinting;
    495 
    496     bool m_overflowStatusDirty;
    497     bool m_horizontalOverflow;
    498     bool m_verticalOverflow;
    499     RenderObject* m_viewportRenderer;
    500 
    501     Pagination m_pagination;
    502 
    503     bool m_wasScrolledByUser;
    504     bool m_inProgrammaticScroll;
    505     bool m_safeToPropagateScrollToParent;
    506 
    507     unsigned m_deferringRepaints;
    508     unsigned m_repaintCount;
    509     Vector<LayoutRect> m_repaintRects;
    510     Timer<FrameView> m_deferredRepaintTimer;
    511     double m_deferredRepaintDelay;
    512     double m_lastPaintTime;
    513 
    514     bool m_isTrackingRepaints; // Used for testing.
    515     Vector<IntRect> m_trackedRepaintRects;
    516 
    517     bool m_shouldUpdateWhileOffscreen;
    518 
    519     RefPtr<Node> m_nodeToDraw;
    520     PaintBehavior m_paintBehavior;
    521     bool m_isPainting;
    522 
    523     unsigned m_visuallyNonEmptyCharacterCount;
    524     unsigned m_visuallyNonEmptyPixelCount;
    525     bool m_isVisuallyNonEmpty;
    526     bool m_firstVisuallyNonEmptyLayoutCallbackPending;
    527 
    528     RefPtr<Node> m_maintainScrollPositionAnchor;
    529 
    530     // Renderer to hold our custom scroll corner.
    531     RenderScrollbarPart* m_scrollCorner;
    532 
    533     // If true, automatically resize the frame view around its content.
    534     bool m_shouldAutoSize;
    535     bool m_inAutoSize;
    536     // True if autosize has been run since m_shouldAutoSize was set.
    537     bool m_didRunAutosize;
    538     // The lower bound on the size when autosizing.
    539     IntSize m_minAutoSize;
    540     // The upper bound on the size when autosizing.
    541     IntSize m_maxAutoSize;
    542 
    543     OwnPtr<ScrollableAreaSet> m_scrollableAreas;
    544     OwnPtr<ResizerAreaSet> m_resizerAreas;
    545     OwnPtr<ViewportConstrainedObjectSet> m_viewportConstrainedObjects;
    546 
    547     static double s_normalDeferredRepaintDelay;
    548     static double s_initialDeferredRepaintDelayDuringLoading;
    549     static double s_maxDeferredRepaintDelayDuringLoading;
    550     static double s_deferredRepaintDelayIncrementDuringLoading;
    551 
    552     bool m_hasSoftwareFilters;
    553 
    554     float m_visibleContentScaleFactor;
    555     IntSize m_inputEventsOffsetForEmulation;
    556     float m_inputEventsScaleFactorForEmulation;
    557 
    558     PartialLayoutState m_partialLayout;
    559     IntSize m_layoutSize;
    560     bool m_layoutSizeFixedToFrameSize;
    561 };
    562 
    563 inline void FrameView::incrementVisuallyNonEmptyCharacterCount(unsigned count)
    564 {
    565     if (m_isVisuallyNonEmpty)
    566         return;
    567     m_visuallyNonEmptyCharacterCount += count;
    568     // Use a threshold value to prevent very small amounts of visible content from triggering didFirstVisuallyNonEmptyLayout.
    569     // The first few hundred characters rarely contain the interesting content of the page.
    570     static const unsigned visualCharacterThreshold = 200;
    571     if (m_visuallyNonEmptyCharacterCount > visualCharacterThreshold)
    572         setIsVisuallyNonEmpty();
    573 }
    574 
    575 inline void FrameView::incrementVisuallyNonEmptyPixelCount(const IntSize& size)
    576 {
    577     if (m_isVisuallyNonEmpty)
    578         return;
    579     m_visuallyNonEmptyPixelCount += size.width() * size.height();
    580     // Use a threshold value to prevent very small amounts of visible content from triggering didFirstVisuallyNonEmptyLayout
    581     static const unsigned visualPixelThreshold = 32 * 32;
    582     if (m_visuallyNonEmptyPixelCount > visualPixelThreshold)
    583         setIsVisuallyNonEmpty();
    584 }
    585 
    586 DEFINE_TYPE_CASTS(FrameView, Widget, widget, widget->isFrameView(), widget.isFrameView());
    587 
    588 } // namespace WebCore
    589 
    590 #endif // FrameView_h
    591