JavaScriptCore:
[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     void checkStopDelayingDeferredRepaints();
153     void resetDeferredRepaintDelay();
154
155 #if ENABLE(DASHBOARD_SUPPORT)
156     void updateDashboardRegions();
157 #endif
158     void updateControlTints();
159
160     void restoreScrollbar();
161
162     void scheduleEvent(PassRefPtr<Event>, PassRefPtr<Node>);
163     void pauseScheduledEvents();
164     void resumeScheduledEvents();
165     void postLayoutTimerFired(Timer<FrameView>*);
166
167     bool wasScrolledByUser() const;
168     void setWasScrolledByUser(bool);
169
170     void addWidgetToUpdate(RenderPartObject*);
171     void removeWidgetToUpdate(RenderPartObject*);
172
173     virtual void paintContents(GraphicsContext*, const IntRect& damageRect);
174     void setPaintRestriction(PaintRestriction);
175     bool isPainting() const;
176     void setNodeToDraw(Node*);
177
178     static double currentPaintTimeStamp() { return sCurrentPaintTimeStamp; } // returns 0 if not painting
179     
180     void layoutIfNeededRecursive();
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
190 private:
191     void reset();
192     void init();
193
194     virtual bool isFrameView() const;
195
196     bool useSlowRepaints() const;
197
198     void applyOverflowToViewport(RenderObject*, ScrollbarMode& hMode, ScrollbarMode& vMode);
199
200     void updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow);
201
202     void dispatchScheduledEvents();
203     void performPostLayoutTasks();
204
205     virtual void repaintContentRectangle(const IntRect&, bool immediate);
206     virtual void contentsResized() { setNeedsLayout(); }
207     virtual void visibleContentsResized() { layout(); }
208     
209     void deferredRepaintTimerFired(Timer<FrameView>*);
210     void doDeferredRepaints();
211     void updateDeferredRepaintDelay();
212     double adjustedDeferredRepaintDelay() const;
213
214     static double sCurrentPaintTimeStamp; // used for detecting decoded resource thrash in the cache
215
216     unsigned m_refCount;
217     IntSize m_size;
218     IntSize m_margins;
219     OwnPtr<HashSet<RenderPartObject*> > m_widgetUpdateSet;
220     RefPtr<Frame> m_frame;
221
222     bool m_doFullRepaint;
223     
224     ScrollbarMode m_vmode;
225     ScrollbarMode m_hmode;
226     bool m_useSlowRepaints;
227     unsigned m_slowRepaintObjectCount;
228
229     int m_borderX, m_borderY;
230
231     Timer<FrameView> m_layoutTimer;
232     bool m_delayedLayout;
233     RenderObject* m_layoutRoot;
234     
235     bool m_layoutSchedulingEnabled;
236     bool m_midLayout;
237     int m_layoutCount;
238     unsigned m_nestedLayoutCount;
239     Timer<FrameView> m_postLayoutTasksTimer;
240     bool m_firstLayoutCallbackPending;
241
242     bool m_firstLayout;
243     bool m_needToInitScrollbars;
244     bool m_isTransparent;
245     Color m_baseBackgroundColor;
246     IntSize m_lastLayoutSize;
247     float m_lastZoomFactor;
248
249     String m_mediaType;
250     
251     unsigned m_enqueueEvents;
252     Vector<ScheduledEvent*> m_scheduledEvents;
253     
254     bool m_overflowStatusDirty;
255     bool m_horizontalOverflow;
256     bool m_verticalOverflow;    
257     RenderObject* m_viewportRenderer;
258
259     bool m_wasScrolledByUser;
260     bool m_inProgrammaticScroll;
261     
262     unsigned m_deferringRepaints;
263     unsigned m_repaintCount;
264     Vector<IntRect> m_repaintRects;
265     Timer<FrameView> m_deferredRepaintTimer;
266     double m_deferredRepaintDelay;
267     double m_lastPaintTime;
268
269     bool m_shouldUpdateWhileOffscreen;
270
271     RefPtr<Node> m_nodeToDraw;
272     PaintRestriction m_paintRestriction;
273     bool m_isPainting;
274
275     bool m_isVisuallyNonEmpty;
276     bool m_firstVisuallyNonEmptyLayoutCallbackPending;
277 };
278
279 } // namespace WebCore
280
281 #endif // FrameView_h