40d9e4215bf65af8152883de1f540c66596ae602
[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     bool isFrameViewScrollCorner(RenderScrollbarPart* scrollCorner) const { return m_scrollCorner == scrollCorner; }
264
265     void calculateScrollbarModesForLayout(ScrollbarMode& hMode, ScrollbarMode& vMode);
266
267     // Normal delay
268     static void setRepaintThrottlingDeferredRepaintDelay(double p);
269     // Negative value would mean that first few repaints happen without a delay
270     static void setRepaintThrottlingnInitialDeferredRepaintDelayDuringLoading(double p);
271     // The delay grows on each repaint to this maximum value
272     static void setRepaintThrottlingMaxDeferredRepaintDelayDuringLoading(double p);
273     // On each repaint the delay increses by this amount
274     static void setRepaintThrottlingDeferredRepaintDelayIncrementDuringLoading(double p);
275
276     virtual IntPoint currentMousePosition() const;
277
278     // FIXME: Remove this method once plugin loading is decoupled from layout.
279     void flushAnyPendingPostLayoutTasks();
280
281     virtual bool shouldSuspendScrollAnimations() const;
282
283     void setAnimatorsAreActive();
284
285 protected:
286     virtual bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect);
287     virtual void scrollContentsSlowPath(const IntRect& updateRect);
288
289     virtual bool isVerticalDocument() const;
290     virtual bool isFlippedDocument() const;
291
292 private:
293     FrameView(Frame*);
294
295     void reset();
296     void init();
297
298     virtual bool isFrameView() const;
299
300     friend class RenderWidget;
301     bool useSlowRepaints() const;
302     bool useSlowRepaintsIfNotOverlapped() const;
303     void updateCanBlitOnScrollRecursively();
304
305     bool hasFixedObjects() const { return m_fixedObjectCount > 0; }
306
307     void applyOverflowToViewport(RenderObject*, ScrollbarMode& hMode, ScrollbarMode& vMode);
308
309     void updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow);
310
311     void performPostLayoutTasks();
312
313     virtual void repaintContentRectangle(const IntRect&, bool immediate);
314     virtual void contentsResized();
315     virtual void visibleContentsResized();
316
317     // Override ScrollView methods to do point conversion via renderers, in order to
318     // take transforms into account.
319     virtual IntRect convertToContainingView(const IntRect&) const;
320     virtual IntRect convertFromContainingView(const IntRect&) const;
321     virtual IntPoint convertToContainingView(const IntPoint&) const;
322     virtual IntPoint convertFromContainingView(const IntPoint&) const;
323
324     // ScrollableArea interface
325     virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&);
326     virtual bool isActive() const;
327     virtual void getTickmarks(Vector<IntRect>&) const;
328     virtual void scrollTo(const IntSize&);
329     virtual void didStartRubberBand(const IntSize&) const;
330     virtual void didCompleteRubberBand(const IntSize&) const;
331     virtual void didStartAnimatedScroll() const;
332     virtual void didCompleteAnimatedScroll() const;
333     virtual void setVisibleScrollerThumbRect(const IntRect&);
334     virtual bool isOnActivePage() const;
335 #if USE(ACCELERATED_COMPOSITING)
336     virtual GraphicsLayer* layerForHorizontalScrollbar() const;
337     virtual GraphicsLayer* layerForVerticalScrollbar() const;
338     virtual GraphicsLayer* layerForScrollCorner() const;
339 #endif
340
341     virtual void notifyPageThatContentAreaWillPaint() const;
342     virtual void disconnectFromPage() { m_page = 0; }
343
344     virtual bool scrollAnimatorEnabled() const;
345
346     void deferredRepaintTimerFired(Timer<FrameView>*);
347     void doDeferredRepaints();
348     void updateDeferredRepaintDelay();
349     double adjustedDeferredRepaintDelay() const;
350
351     bool updateWidgets();
352     void updateWidget(RenderEmbeddedObject*);
353     void scrollToAnchor();
354     void scrollPositionChanged();
355
356     bool hasCustomScrollbars() const;
357
358     virtual void updateScrollCorner();
359
360     FrameView* parentFrameView() const;
361
362     virtual AXObjectCache* axObjectCache() const;
363     void notifyWidgetsInAllFrames(WidgetNotification);
364     
365     static double sCurrentPaintTimeStamp; // used for detecting decoded resource thrash in the cache
366
367     IntSize m_size;
368     IntSize m_margins;
369     
370     typedef HashSet<RenderEmbeddedObject*> RenderEmbeddedObjectSet;
371     OwnPtr<RenderEmbeddedObjectSet> m_widgetUpdateSet;
372     RefPtr<Frame> m_frame;
373
374     bool m_doFullRepaint;
375     
376     bool m_canHaveScrollbars;
377     bool m_useSlowRepaints;
378     bool m_isOverlapped;
379     bool m_contentIsOpaque;
380     unsigned m_slowRepaintObjectCount;
381     unsigned m_fixedObjectCount;
382
383     int m_borderX;
384     int m_borderY;
385
386     Timer<FrameView> m_layoutTimer;
387     bool m_delayedLayout;
388     RenderObject* m_layoutRoot;
389     
390     bool m_layoutSchedulingEnabled;
391     bool m_inLayout;
392     bool m_hasPendingPostLayoutTasks;
393     bool m_inSynchronousPostLayout;
394     int m_layoutCount;
395     unsigned m_nestedLayoutCount;
396     Timer<FrameView> m_postLayoutTasksTimer;
397     bool m_firstLayoutCallbackPending;
398
399     bool m_firstLayout;
400     bool m_isTransparent;
401     Color m_baseBackgroundColor;
402     IntSize m_lastLayoutSize;
403     float m_lastZoomFactor;
404
405     String m_mediaType;
406     String m_mediaTypeWhenNotPrinting;
407
408     OwnPtr<FrameActionScheduler> m_actionScheduler;
409
410     bool m_overflowStatusDirty;
411     bool m_horizontalOverflow;
412     bool m_verticalOverflow;    
413     RenderObject* m_viewportRenderer;
414
415     bool m_wasScrolledByUser;
416     bool m_inProgrammaticScroll;
417     
418     unsigned m_deferringRepaints;
419     unsigned m_repaintCount;
420     Vector<IntRect> m_repaintRects;
421     Timer<FrameView> m_deferredRepaintTimer;
422     double m_deferredRepaintDelay;
423     double m_lastPaintTime;
424
425     bool m_shouldUpdateWhileOffscreen;
426
427     unsigned m_deferSetNeedsLayouts;
428     bool m_setNeedsLayoutWasDeferred;
429
430     RefPtr<Node> m_nodeToDraw;
431     PaintBehavior m_paintBehavior;
432     bool m_isPainting;
433
434     bool m_isVisuallyNonEmpty;
435     bool m_firstVisuallyNonEmptyLayoutCallbackPending;
436
437     RefPtr<Node> m_maintainScrollPositionAnchor;
438
439     // Renderer to hold our custom scroll corner.
440     RenderScrollbarPart* m_scrollCorner;
441
442     Page* m_page;
443
444     static double s_deferredRepaintDelay;
445     static double s_initialDeferredRepaintDelayDuringLoading;
446     static double s_maxDeferredRepaintDelayDuringLoading;
447     static double s_deferredRepaintDelayIncrementDuringLoading;
448 };
449
450 } // namespace WebCore
451
452 #endif // FrameView_h