Home | History | Annotate | Download | only in page
      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 "Frame.h"
     29 #include "IntSize.h"
     30 #include "Page.h"
     31 #include "RenderLayer.h"
     32 #include "ScrollView.h"
     33 #include <wtf/Forward.h>
     34 #include <wtf/OwnPtr.h>
     35 
     36 namespace WebCore {
     37 
     38 class Color;
     39 class Event;
     40 class Frame;
     41 class FrameViewPrivate;
     42 class InspectorTimelineAgent;
     43 class IntRect;
     44 class Node;
     45 class PlatformMouseEvent;
     46 class RenderLayer;
     47 class RenderObject;
     48 class RenderEmbeddedObject;
     49 class ScheduledEvent;
     50 class String;
     51 
     52 template <typename T> class Timer;
     53 
     54 class FrameView : public ScrollView {
     55 public:
     56     friend class RenderView;
     57 
     58     static PassRefPtr<FrameView> create(Frame*);
     59     static PassRefPtr<FrameView> create(Frame*, const IntSize& initialSize);
     60 
     61     virtual ~FrameView();
     62 
     63     virtual HostWindow* hostWindow() const;
     64 
     65     virtual void invalidateRect(const IntRect&);
     66 
     67     Frame* frame() const { return m_frame.get(); }
     68     void clearFrame();
     69 
     70     int marginWidth() const { return m_margins.width(); } // -1 means default
     71     int marginHeight() const { return m_margins.height(); } // -1 means default
     72     void setMarginWidth(int);
     73     void setMarginHeight(int);
     74 
     75     virtual void setCanHaveScrollbars(bool);
     76     void updateCanHaveScrollbars();
     77 
     78     virtual PassRefPtr<Scrollbar> createScrollbar(ScrollbarOrientation);
     79 
     80     virtual void setContentsSize(const IntSize&);
     81 
     82     void layout(bool allowSubtree = true);
     83     bool didFirstLayout() const;
     84     void layoutTimerFired(Timer<FrameView>*);
     85     void scheduleRelayout();
     86     void scheduleRelayoutOfSubtree(RenderObject*);
     87     void unscheduleRelayout();
     88     bool layoutPending() const;
     89 
     90     RenderObject* layoutRoot(bool onlyDuringLayout = false) const;
     91     int layoutCount() const { return m_layoutCount; }
     92 
     93     bool needsLayout() const;
     94     void setNeedsLayout();
     95 
     96     bool needsFullRepaint() const { return m_doFullRepaint; }
     97 
     98 #if USE(ACCELERATED_COMPOSITING)
     99     void updateCompositingLayers();
    100 
    101     // Called when changes to the GraphicsLayer hierarchy have to be synchronized with
    102     // content rendered via the normal painting path.
    103     void setNeedsOneShotDrawingSynchronization();
    104 #endif
    105     // Only used with accelerated compositing, but outside the #ifdef to make linkage easier.
    106     // Returns true if the sync was completed.
    107     bool syncCompositingStateRecursive();
    108 
    109     void didMoveOnscreen();
    110     void willMoveOffscreen();
    111 
    112     void resetScrollbars();
    113     void detachCustomScrollbars();
    114 
    115     void clear();
    116 
    117     bool isTransparent() const;
    118     void setTransparent(bool isTransparent);
    119 
    120     Color baseBackgroundColor() const;
    121     void setBaseBackgroundColor(Color);
    122     void updateBackgroundRecursively(const Color&, bool);
    123 
    124     bool shouldUpdateWhileOffscreen() const;
    125     void setShouldUpdateWhileOffscreen(bool);
    126 
    127     void adjustViewSize();
    128 
    129     virtual IntRect windowClipRect(bool clipToContents = true) const;
    130     IntRect windowClipRectForLayer(const RenderLayer*, bool clipToLayerContents) const;
    131 
    132     virtual IntRect windowResizerRect() const;
    133 
    134     virtual void scrollRectIntoViewRecursively(const IntRect&);
    135     virtual void setScrollPosition(const IntPoint&);
    136     void scrollPositionChanged();
    137 
    138     String mediaType() const;
    139     void setMediaType(const String&);
    140 
    141     void setUseSlowRepaints();
    142     void setIsOverlapped(bool);
    143     void setContentIsOpaque(bool);
    144 
    145     void addSlowRepaintObject();
    146     void removeSlowRepaintObject();
    147 
    148     void beginDeferredRepaints();
    149     void endDeferredRepaints();
    150     void checkStopDelayingDeferredRepaints();
    151     void resetDeferredRepaintDelay();
    152 
    153 #if ENABLE(DASHBOARD_SUPPORT)
    154     void updateDashboardRegions();
    155 #endif
    156     void updateControlTints();
    157 
    158     void restoreScrollbar();
    159 
    160     void scheduleEvent(PassRefPtr<Event>, PassRefPtr<Node>);
    161     void pauseScheduledEvents();
    162     void resumeScheduledEvents();
    163     void postLayoutTimerFired(Timer<FrameView>*);
    164 
    165     bool wasScrolledByUser() const;
    166     void setWasScrolledByUser(bool);
    167 
    168     void addWidgetToUpdate(RenderEmbeddedObject*);
    169     void removeWidgetToUpdate(RenderEmbeddedObject*);
    170 
    171     virtual void paintContents(GraphicsContext*, const IntRect& damageRect);
    172     void setPaintBehavior(PaintBehavior);
    173     PaintBehavior paintBehavior() const { return m_paintBehavior; }
    174     bool isPainting() const;
    175     void setNodeToDraw(Node*);
    176 
    177     static double currentPaintTimeStamp() { return sCurrentPaintTimeStamp; } // returns 0 if not painting
    178 
    179     void layoutIfNeededRecursive();
    180     void flushDeferredRepaints();
    181 
    182     void setIsVisuallyNonEmpty() { m_isVisuallyNonEmpty = true; }
    183 
    184     void forceLayout(bool allowSubtree = false);
    185     void forceLayoutWithPageWidthRange(float minPageWidth, float maxPageWidth, bool adjustViewSize);
    186 
    187     void adjustPageHeight(float* newBottom, float oldTop, float oldBottom, float bottomLimit);
    188 
    189     bool scrollToFragment(const KURL&);
    190     bool scrollToAnchor(const String&);
    191     void maintainScrollPositionAtAnchor(Node*);
    192 
    193     // Methods to convert points and rects between the coordinate space of the renderer, and this view.
    194     virtual IntRect convertFromRenderer(const RenderObject*, const IntRect&) const;
    195     virtual IntRect convertToRenderer(const RenderObject*, const IntRect&) const;
    196     virtual IntPoint convertFromRenderer(const RenderObject*, const IntPoint&) const;
    197     virtual IntPoint convertToRenderer(const RenderObject*, const IntPoint&) const;
    198 
    199     bool isFrameViewScrollCorner(RenderScrollbarPart* scrollCorner) const { return m_scrollCorner == scrollCorner; }
    200     void invalidateScrollCorner();
    201 
    202 private:
    203     FrameView(Frame*);
    204 
    205     void reset();
    206     void init();
    207 
    208     virtual bool isFrameView() const;
    209 
    210     friend class RenderWidget;
    211     bool useSlowRepaints() const;
    212     bool useSlowRepaintsIfNotOverlapped() const;
    213 
    214     void applyOverflowToViewport(RenderObject*, ScrollbarMode& hMode, ScrollbarMode& vMode);
    215 
    216     void updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow);
    217 
    218     void dispatchScheduledEvents();
    219     void performPostLayoutTasks();
    220 
    221     virtual void repaintContentRectangle(const IntRect&, bool immediate);
    222     virtual void contentsResized() { setNeedsLayout(); }
    223     virtual void visibleContentsResized();
    224 
    225     // Override ScrollView methods to do point conversion via renderers, in order to
    226     // take transforms into account.
    227     virtual IntRect convertToContainingView(const IntRect&) const;
    228     virtual IntRect convertFromContainingView(const IntRect&) const;
    229     virtual IntPoint convertToContainingView(const IntPoint&) const;
    230     virtual IntPoint convertFromContainingView(const IntPoint&) const;
    231 
    232     // ScrollBarClient interface
    233     virtual void valueChanged(Scrollbar*);
    234     virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&);
    235     virtual bool isActive() const;
    236     virtual void getTickmarks(Vector<IntRect>&) const;
    237 
    238     void deferredRepaintTimerFired(Timer<FrameView>*);
    239     void doDeferredRepaints();
    240     void updateDeferredRepaintDelay();
    241     double adjustedDeferredRepaintDelay() const;
    242 
    243     bool updateWidgets();
    244     void scrollToAnchor();
    245 
    246 #if ENABLE(INSPECTOR)
    247     InspectorTimelineAgent* inspectorTimelineAgent() const;
    248 #endif
    249 
    250     bool hasCustomScrollbars() const;
    251 
    252     virtual void updateScrollCorner();
    253     virtual void paintScrollCorner(GraphicsContext*, const IntRect& cornerRect);
    254 
    255     static double sCurrentPaintTimeStamp; // used for detecting decoded resource thrash in the cache
    256 
    257     IntSize m_size;
    258     IntSize m_margins;
    259 
    260     typedef HashSet<RenderEmbeddedObject*> RenderEmbeddedObjectSet;
    261     OwnPtr<RenderEmbeddedObjectSet> m_widgetUpdateSet;
    262     RefPtr<Frame> m_frame;
    263 
    264     bool m_doFullRepaint;
    265 
    266     bool m_canHaveScrollbars;
    267     bool m_useSlowRepaints;
    268     bool m_isOverlapped;
    269     bool m_contentIsOpaque;
    270     unsigned m_slowRepaintObjectCount;
    271 
    272     int m_borderX, m_borderY;
    273 
    274     Timer<FrameView> m_layoutTimer;
    275     bool m_delayedLayout;
    276     RenderObject* m_layoutRoot;
    277 
    278     bool m_layoutSchedulingEnabled;
    279     bool m_midLayout;
    280     int m_layoutCount;
    281     unsigned m_nestedLayoutCount;
    282     Timer<FrameView> m_postLayoutTasksTimer;
    283     bool m_firstLayoutCallbackPending;
    284 
    285     bool m_firstLayout;
    286     bool m_isTransparent;
    287     Color m_baseBackgroundColor;
    288     IntSize m_lastLayoutSize;
    289     float m_lastZoomFactor;
    290 
    291     String m_mediaType;
    292 
    293     unsigned m_enqueueEvents;
    294     Vector<ScheduledEvent*> m_scheduledEvents;
    295 
    296     bool m_overflowStatusDirty;
    297     bool m_horizontalOverflow;
    298     bool m_verticalOverflow;
    299     RenderObject* m_viewportRenderer;
    300 
    301     bool m_wasScrolledByUser;
    302     bool m_inProgrammaticScroll;
    303 
    304     unsigned m_deferringRepaints;
    305     unsigned m_repaintCount;
    306     Vector<IntRect> m_repaintRects;
    307     Timer<FrameView> m_deferredRepaintTimer;
    308     double m_deferredRepaintDelay;
    309     double m_lastPaintTime;
    310 
    311     bool m_shouldUpdateWhileOffscreen;
    312 
    313     unsigned m_deferSetNeedsLayouts;
    314     bool m_setNeedsLayoutWasDeferred;
    315 
    316     RefPtr<Node> m_nodeToDraw;
    317     PaintBehavior m_paintBehavior;
    318     bool m_isPainting;
    319 
    320     bool m_isVisuallyNonEmpty;
    321     bool m_firstVisuallyNonEmptyLayoutCallbackPending;
    322 
    323     RefPtr<Node> m_maintainScrollPositionAnchor;
    324 
    325     // Renderer to hold our custom scroll corner.
    326     RenderScrollbarPart* m_scrollCorner;
    327 };
    328 
    329 #if ENABLE(INSPECTOR)
    330 inline InspectorTimelineAgent* FrameView::inspectorTimelineAgent() const
    331 {
    332     return m_frame->page() ? m_frame->page()->inspectorTimelineAgent() : 0;
    333 }
    334 #endif
    335 
    336 } // namespace WebCore
    337 
    338 #endif // FrameView_h
    339