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