2011-01-19 James Robinson <jamesr@chromium.org>
[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 "Frame.h"
29 #include "IntSize.h"
30 #include "Page.h"
31 #include "RenderObject.h" // For PaintBehavior
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 FrameViewPrivate;
41 class IntRect;
42 class Node;
43 class PlatformMouseEvent;
44 class RenderLayer;
45 class RenderObject;
46 class RenderEmbeddedObject;
47 class RenderScrollbarPart;
48 struct ScheduledEvent;
49
50 template <typename T> class Timer;
51
52 class FrameView : public ScrollView {
53 public:
54     friend class RenderView;
55
56     static PassRefPtr<FrameView> create(Frame*);
57     static PassRefPtr<FrameView> create(Frame*, const IntSize& initialSize);
58
59     virtual ~FrameView();
60
61     virtual HostWindow* hostWindow() const;
62     
63     virtual void invalidateRect(const IntRect&);
64     virtual void setFrameRect(const IntRect&);
65
66     Frame* frame() const { return m_frame.get(); }
67     void clearFrame();
68
69     int marginWidth() const { return m_margins.width(); } // -1 means default
70     int marginHeight() const { return m_margins.height(); } // -1 means default
71     void setMarginWidth(int);
72     void setMarginHeight(int);
73
74     virtual void setCanHaveScrollbars(bool);
75     void updateCanHaveScrollbars();
76
77     virtual PassRefPtr<Scrollbar> createScrollbar(ScrollbarOrientation);
78
79     virtual bool avoidScrollbarCreation() const;
80
81     virtual void setContentsSize(const IntSize&);
82
83     void layout(bool allowSubtree = true);
84     bool didFirstLayout() const;
85     void layoutTimerFired(Timer<FrameView>*);
86     void scheduleRelayout();
87     void scheduleRelayoutOfSubtree(RenderObject*);
88     void unscheduleRelayout();
89     bool layoutPending() const;
90     bool isInLayout() const { return m_inLayout; }
91
92     RenderObject* layoutRoot(bool onlyDuringLayout = false) const;
93     int layoutCount() const { return m_layoutCount; }
94
95     bool needsLayout() const;
96     void setNeedsLayout();
97
98     bool needsFullRepaint() const { return m_doFullRepaint; }
99
100 #if USE(ACCELERATED_COMPOSITING)
101     void updateCompositingLayers();
102     bool syncCompositingStateForThisFrame();
103
104     // Called when changes to the GraphicsLayer hierarchy have to be synchronized with
105     // content rendered via the normal painting path.
106     void setNeedsOneShotDrawingSynchronization();
107 #endif
108
109     bool hasCompositedContent() const;
110     bool hasCompositedContentIncludingDescendants() const;
111     bool hasCompositingAncestor() const;
112     void enterCompositingMode();
113     bool isEnclosedInCompositingLayer() const;
114
115     // Only used with accelerated compositing, but outside the #ifdef to make linkage easier.
116     // Returns true if the sync was completed.
117     bool syncCompositingStateIncludingSubframes();
118
119     // Returns true when a paint with the PaintBehaviorFlattenCompositingLayers flag set gives
120     // a faithful representation of the content.
121     bool isSoftwareRenderable() const;
122
123     void didMoveOnscreen();
124     void willMoveOffscreen();
125
126     void resetScrollbars();
127     void detachCustomScrollbars();
128
129     void clear();
130
131     bool isTransparent() const;
132     void setTransparent(bool isTransparent);
133
134     Color baseBackgroundColor() const;
135     void setBaseBackgroundColor(Color);
136     void updateBackgroundRecursively(const Color&, bool);
137
138     bool shouldUpdateWhileOffscreen() const;
139     void setShouldUpdateWhileOffscreen(bool);
140     bool shouldUpdate(bool = false) const;
141
142     void adjustViewSize();
143     
144     virtual IntRect windowClipRect(bool clipToContents = true) const;
145     IntRect windowClipRectForLayer(const RenderLayer*, bool clipToLayerContents) const;
146
147     virtual IntRect windowResizerRect() const;
148
149     void setScrollPosition(const IntPoint&);
150     void scrollPositionChangedViaPlatformWidget();
151     virtual void repaintFixedElementsAfterScrolling();
152
153     String mediaType() const;
154     void setMediaType(const String&);
155     void adjustMediaTypeForPrinting(bool printing);
156
157     void setUseSlowRepaints();
158     void setIsOverlapped(bool);
159     bool isOverlapped() const { return m_isOverlapped; }
160     bool isOverlappedIncludingAncestors() const;
161     void setContentIsOpaque(bool);
162
163     void addSlowRepaintObject();
164     void removeSlowRepaintObject();
165
166     void addFixedObject();
167     void removeFixedObject();
168
169     void beginDeferredRepaints();
170     void endDeferredRepaints();
171     void checkStopDelayingDeferredRepaints();
172     void resetDeferredRepaintDelay();
173
174 #if ENABLE(DASHBOARD_SUPPORT)
175     void updateDashboardRegions();
176 #endif
177     void updateControlTints();
178
179     void restoreScrollbar();
180
181     void scheduleEvent(PassRefPtr<Event>, PassRefPtr<Node>);
182     void pauseScheduledEvents();
183     void resumeScheduledEvents();
184     void postLayoutTimerFired(Timer<FrameView>*);
185
186     bool wasScrolledByUser() const;
187     void setWasScrolledByUser(bool);
188
189     void addWidgetToUpdate(RenderEmbeddedObject*);
190     void removeWidgetToUpdate(RenderEmbeddedObject*);
191
192     virtual void paintContents(GraphicsContext*, const IntRect& damageRect);
193     void setPaintBehavior(PaintBehavior);
194     PaintBehavior paintBehavior() const;
195     bool isPainting() const;
196     void setNodeToDraw(Node*);
197
198     static double currentPaintTimeStamp() { return sCurrentPaintTimeStamp; } // returns 0 if not painting
199     
200     void updateLayoutAndStyleIfNeededRecursive();
201     void flushDeferredRepaints();
202
203     void setIsVisuallyNonEmpty() { m_isVisuallyNonEmpty = true; }
204
205     void forceLayout(bool allowSubtree = false);
206     void forceLayoutForPagination(const FloatSize& pageSize, float maximumShrinkFactor, Frame::AdjustViewSizeOrNot);
207
208     // FIXME: This method is retained because of embedded WebViews in AppKit.  When a WebView is embedded inside
209     // some enclosing view with auto-pagination, no call happens to resize the view.  The new pagination model
210     // needs the view to resize as a result of the breaks, but that means that the enclosing view has to potentially
211     // resize around that view.  Auto-pagination uses the bounds of the actual view that's being printed to determine
212     // the edges of the print operation, so the resize is necessary if the enclosing view's bounds depend on the
213     // web document's bounds.
214     // 
215     // This is already a problem if the view needs to be a different size because of printer fonts or because of print stylesheets.
216     // Mail/Dictionary work around this problem by using the _layoutForPrinting SPI
217     // to at least get print stylesheets and printer fonts into play, but since WebKit doesn't know about the page offset or
218     // page size, it can't actually paginate correctly during _layoutForPrinting.
219     //
220     // We can eventually move Mail to a newer SPI that would let them opt in to the layout-time pagination model,
221     // but that doesn't solve the general problem of how other AppKit views could opt in to the better model.
222     //
223     // NO OTHER PLATFORM BESIDES MAC SHOULD USE THIS METHOD.
224     void adjustPageHeightDeprecated(float* newBottom, float oldTop, float oldBottom, float bottomLimit);
225
226     bool scrollToFragment(const KURL&);
227     bool scrollToAnchor(const String&);
228     void maintainScrollPositionAtAnchor(Node*);
229
230     // Methods to convert points and rects between the coordinate space of the renderer, and this view.
231     virtual IntRect convertFromRenderer(const RenderObject*, const IntRect&) const;
232     virtual IntRect convertToRenderer(const RenderObject*, const IntRect&) const;
233     virtual IntPoint convertFromRenderer(const RenderObject*, const IntPoint&) const;
234     virtual IntPoint convertToRenderer(const RenderObject*, const IntPoint&) const;
235
236     bool isFrameViewScrollCorner(RenderScrollbarPart* scrollCorner) const { return m_scrollCorner == scrollCorner; }
237     void invalidateScrollCorner();
238
239     void calculateScrollbarModesForLayout(ScrollbarMode& hMode, ScrollbarMode& vMode);
240
241     // Normal delay
242     static void setRepaintThrottlingDeferredRepaintDelay(double p);
243     // Negative value would mean that first few repaints happen without a delay
244     static void setRepaintThrottlingnInitialDeferredRepaintDelayDuringLoading(double p);
245     // The delay grows on each repaint to this maximum value
246     static void setRepaintThrottlingMaxDeferredRepaintDelayDuringLoading(double p);
247     // On each repaint the delay increses by this amount
248     static void setRepaintThrottlingDeferredRepaintDelayIncrementDuringLoading(double p);
249
250 protected:
251     virtual bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect);
252     virtual void scrollContentsSlowPath(const IntRect& updateRect);
253
254     virtual bool isVerticalDocument() const;
255     virtual bool isFlippedDocument() const;
256
257 private:
258     FrameView(Frame*);
259
260     void reset();
261     void init();
262
263     virtual bool isFrameView() const;
264
265     friend class RenderWidget;
266     bool useSlowRepaints() const;
267     bool useSlowRepaintsIfNotOverlapped() const;
268     void updateCanBlitOnScrollRecursively();
269
270     bool hasFixedObjects() const { return m_fixedObjectCount > 0; }
271
272     void applyOverflowToViewport(RenderObject*, ScrollbarMode& hMode, ScrollbarMode& vMode);
273
274     void updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow);
275
276     void dispatchScheduledEvents();
277     void performPostLayoutTasks();
278
279     virtual void repaintContentRectangle(const IntRect&, bool immediate);
280     virtual void contentsResized() { setNeedsLayout(); }
281     virtual void visibleContentsResized();
282
283     // Override ScrollView methods to do point conversion via renderers, in order to
284     // take transforms into account.
285     virtual IntRect convertToContainingView(const IntRect&) const;
286     virtual IntRect convertFromContainingView(const IntRect&) const;
287     virtual IntPoint convertToContainingView(const IntPoint&) const;
288     virtual IntPoint convertFromContainingView(const IntPoint&) const;
289
290     // ScrollBarClient interface
291     virtual void valueChanged(Scrollbar*);
292     virtual void valueChanged(const IntSize&);
293     virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&);
294     virtual bool isActive() const;
295     virtual void getTickmarks(Vector<IntRect>&) const;
296
297     void deferredRepaintTimerFired(Timer<FrameView>*);
298     void doDeferredRepaints();
299     void updateDeferredRepaintDelay();
300     double adjustedDeferredRepaintDelay() const;
301
302     bool updateWidgets();
303     void updateWidget(RenderEmbeddedObject*);
304     void scrollToAnchor();
305     void scrollPositionChanged();
306
307     bool hasCustomScrollbars() const;
308
309     virtual void updateScrollCorner();
310     virtual void paintScrollCorner(GraphicsContext*, const IntRect& cornerRect);
311
312     virtual AXObjectCache* axObjectCache() const;
313     void notifyWidgetsInAllFrames(WidgetNotification);
314     
315     static double sCurrentPaintTimeStamp; // used for detecting decoded resource thrash in the cache
316
317     IntSize m_size;
318     IntSize m_margins;
319     
320     typedef HashSet<RenderEmbeddedObject*> RenderEmbeddedObjectSet;
321     OwnPtr<RenderEmbeddedObjectSet> m_widgetUpdateSet;
322     RefPtr<Frame> m_frame;
323
324     bool m_doFullRepaint;
325     
326     bool m_canHaveScrollbars;
327     bool m_useSlowRepaints;
328     bool m_isOverlapped;
329     bool m_contentIsOpaque;
330     unsigned m_slowRepaintObjectCount;
331     unsigned m_fixedObjectCount;
332
333     int m_borderX;
334     int m_borderY;
335
336     Timer<FrameView> m_layoutTimer;
337     bool m_delayedLayout;
338     RenderObject* m_layoutRoot;
339     
340     bool m_layoutSchedulingEnabled;
341     bool m_inLayout;
342     bool m_hasPendingPostLayoutTasks;
343     bool m_inSynchronousPostLayout;
344     int m_layoutCount;
345     unsigned m_nestedLayoutCount;
346     Timer<FrameView> m_postLayoutTasksTimer;
347     bool m_firstLayoutCallbackPending;
348
349     bool m_firstLayout;
350     bool m_isTransparent;
351     Color m_baseBackgroundColor;
352     IntSize m_lastLayoutSize;
353     float m_lastZoomFactor;
354
355     String m_mediaType;
356     String m_mediaTypeWhenNotPrinting;
357
358     unsigned m_enqueueEvents;
359     Vector<ScheduledEvent*> m_scheduledEvents;
360     
361     bool m_overflowStatusDirty;
362     bool m_horizontalOverflow;
363     bool m_verticalOverflow;    
364     RenderObject* m_viewportRenderer;
365
366     bool m_wasScrolledByUser;
367     bool m_inProgrammaticScroll;
368     
369     unsigned m_deferringRepaints;
370     unsigned m_repaintCount;
371     Vector<IntRect> m_repaintRects;
372     Timer<FrameView> m_deferredRepaintTimer;
373     double m_deferredRepaintDelay;
374     double m_lastPaintTime;
375
376     bool m_shouldUpdateWhileOffscreen;
377
378     unsigned m_deferSetNeedsLayouts;
379     bool m_setNeedsLayoutWasDeferred;
380
381     RefPtr<Node> m_nodeToDraw;
382     PaintBehavior m_paintBehavior;
383     bool m_isPainting;
384
385     bool m_isVisuallyNonEmpty;
386     bool m_firstVisuallyNonEmptyLayoutCallbackPending;
387
388     RefPtr<Node> m_maintainScrollPositionAnchor;
389
390     // Renderer to hold our custom scroll corner.
391     RenderScrollbarPart* m_scrollCorner;
392
393     static double s_deferredRepaintDelay;
394     static double s_initialDeferredRepaintDelayDuringLoading;
395     static double s_maxDeferredRepaintDelayDuringLoading;
396     static double s_deferredRepaintDelayIncrementDuringLoading;
397 };
398
399 } // namespace WebCore
400
401 #endif // FrameView_h