1ad0fbd166fdcd5f0d49fa46fb4bc9b1cab10bb2
[WebKit-https.git] / 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 "IntSize.h"
29 #include "RenderLayer.h"
30 #include "ScrollView.h"
31 #include <wtf/Forward.h>
32 #include <wtf/OwnPtr.h>
33
34 namespace WebCore {
35
36 class Color;
37 class Event;
38 class Frame;
39 class FrameViewPrivate;
40 class IntRect;
41 class Node;
42 class PlatformMouseEvent;
43 class RenderLayer;
44 class RenderObject;
45 class RenderPartObject;
46 class ScheduledEvent;
47 class String;
48
49 template <typename T> class Timer;
50
51 class FrameView : public ScrollView {
52 public:
53     friend class RenderView;
54
55     FrameView(Frame*);
56     FrameView(Frame*, const IntSize& initialSize);
57
58     virtual ~FrameView();
59
60     virtual HostWindow* hostWindow() const;
61     
62     virtual void invalidateRect(const IntRect&);
63
64     Frame* frame() const { return m_frame.get(); }
65     void clearFrame();
66
67     void ref() { ++m_refCount; }
68     void deref() { if (!--m_refCount) delete this; }
69     bool hasOneRef() { return m_refCount == 1; }
70
71     int marginWidth() const { return m_margins.width(); } // -1 means default
72     int marginHeight() const { return m_margins.height(); } // -1 means default
73     void setMarginWidth(int);
74     void setMarginHeight(int);
75
76     virtual void setCanHaveScrollbars(bool);
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     // These two helper functions just pass through to the RenderView.
94     bool needsLayout() const;
95     void setNeedsLayout();
96
97     bool needsFullRepaint() const { return m_doFullRepaint; }
98
99 #if USE(ACCELERATED_COMPOSITING)
100     enum CompositingUpdate { NormalCompositingUpdate, ForcedCompositingUpdate };
101     void updateCompositingLayers(CompositingUpdate updateType = NormalCompositingUpdate);
102
103     // Called when changes to the GraphicsLayer hierarchy have to be synchronized with
104     // content rendered via the normal painting path.
105     void setNeedsOneShotDrawingSynchronization();
106 #endif
107
108     void didMoveOnscreen();
109     void willMoveOffscreen();
110
111     void resetScrollbars();
112
113     void clear();
114
115     bool isTransparent() const;
116     void setTransparent(bool isTransparent);
117
118     Color baseBackgroundColor() const;
119     void setBaseBackgroundColor(Color);
120     void updateBackgroundRecursively(const Color&, bool);
121
122     bool shouldUpdateWhileOffscreen() const;
123     void setShouldUpdateWhileOffscreen(bool);
124
125     void adjustViewSize();
126     void initScrollbars();
127     void updateDefaultScrollbarState();
128     
129     virtual IntRect windowClipRect(bool clipToContents = true) const;
130     IntRect windowClipRectForLayer(const RenderLayer*, bool clipToLayerContents) const;
131
132     virtual bool isActive() const;
133     virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&);
134     virtual void valueChanged(Scrollbar*);
135     virtual void getTickmarks(Vector<IntRect>&) const;
136
137     virtual IntRect windowResizerRect() const;
138
139     virtual void scrollRectIntoViewRecursively(const IntRect&);
140     virtual void setScrollPosition(const IntPoint&);
141
142     String mediaType() const;
143     void setMediaType(const String&);
144
145     void setUseSlowRepaints();
146
147     void addSlowRepaintObject();
148     void removeSlowRepaintObject();
149
150     void beginDeferredRepaints();
151     void endDeferredRepaints();
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(RenderPartObject*);
169     void removeWidgetToUpdate(RenderPartObject*);
170
171     virtual void paintContents(GraphicsContext*, const IntRect& damageRect);
172     void setPaintRestriction(PaintRestriction);
173     bool isPainting() const;
174     void setNodeToDraw(Node*);
175
176     static double currentPaintTimeStamp() { return sCurrentPaintTimeStamp; } // returns 0 if not painting
177     
178     void layoutIfNeededRecursive();
179
180     void setIsVisuallyNonEmpty() { m_isVisuallyNonEmpty = true; }
181
182     void forceLayout(bool allowSubtree = false);
183     void forceLayoutWithPageWidthRange(float minPageWidth, float maxPageWidth, bool adjustViewSize);
184
185     void adjustPageHeight(float* newBottom, float oldTop, float oldBottom, float bottomLimit);
186
187
188 private:
189     void reset();
190     void init();
191
192     virtual bool isFrameView() const;
193
194     bool useSlowRepaints() const;
195
196     void applyOverflowToViewport(RenderObject*, ScrollbarMode& hMode, ScrollbarMode& vMode);
197
198     void updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow);
199
200     void dispatchScheduledEvents();
201     void performPostLayoutTasks();
202
203     virtual void repaintContentRectangle(const IntRect&, bool immediate);
204     virtual void contentsResized() { setNeedsLayout(); }
205     virtual void visibleContentsResized() { layout(); }
206
207     static double sCurrentPaintTimeStamp; // used for detecting decoded resource thrash in the cache
208
209     unsigned m_refCount;
210     IntSize m_size;
211     IntSize m_margins;
212     OwnPtr<HashSet<RenderPartObject*> > m_widgetUpdateSet;
213     RefPtr<Frame> m_frame;
214
215     bool m_doFullRepaint;
216     
217     ScrollbarMode m_vmode;
218     ScrollbarMode m_hmode;
219     bool m_useSlowRepaints;
220     unsigned m_slowRepaintObjectCount;
221
222     int m_borderX, m_borderY;
223
224     Timer<FrameView> m_layoutTimer;
225     bool m_delayedLayout;
226     RenderObject* m_layoutRoot;
227     
228     bool m_layoutSchedulingEnabled;
229     bool m_midLayout;
230     int m_layoutCount;
231     unsigned m_nestedLayoutCount;
232     Timer<FrameView> m_postLayoutTasksTimer;
233     bool m_firstLayoutCallbackPending;
234
235     bool m_firstLayout;
236     bool m_needToInitScrollbars;
237     bool m_isTransparent;
238     Color m_baseBackgroundColor;
239     IntSize m_lastLayoutSize;
240     float m_lastZoomFactor;
241
242     String m_mediaType;
243     
244     unsigned m_enqueueEvents;
245     Vector<ScheduledEvent*> m_scheduledEvents;
246     
247     bool m_overflowStatusDirty;
248     bool m_horizontalOverflow;
249     bool m_verticalOverflow;    
250     RenderObject* m_viewportRenderer;
251
252     bool m_wasScrolledByUser;
253     bool m_inProgrammaticScroll;
254     
255     unsigned m_deferringRepaints;
256     unsigned m_repaintCount;
257     IntRect m_repaintRect;
258     Vector<IntRect> m_repaintRects;
259
260     bool m_shouldUpdateWhileOffscreen;
261
262     RefPtr<Node> m_nodeToDraw;
263     PaintRestriction m_paintRestriction;
264     bool m_isPainting;
265
266     bool m_isVisuallyNonEmpty;
267     bool m_firstVisuallyNonEmptyLayoutCallbackPending;
268 };
269
270 } // namespace WebCore
271
272 #endif // FrameView_h