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 "core/frame/FrameViewAutoSizeInfo.h"
29 #include "core/rendering/PaintPhase.h"
30 #include "platform/RuntimeEnabledFeatures.h"
31 #include "platform/geometry/LayoutRect.h"
32 #include "platform/graphics/Color.h"
33 #include "platform/scroll/ScrollView.h"
34 #include "wtf/Forward.h"
35 #include "wtf/OwnPtr.h"
36 #include "wtf/text/WTFString.h"
37
38 namespace blink {
39
40 class AXObjectCache;
41 class DocumentLifecycle;
42 class Cursor;
43 class Element;
44 class FloatSize;
45 class HTMLFrameOwnerElement;
46 class LocalFrame;
47 class KURL;
48 class Node;
49 class Page;
50 class RenderBox;
51 class RenderEmbeddedObject;
52 class RenderObject;
53 class RenderScrollbarPart;
54 class RenderView;
55 class RenderWidget;
56 struct CompositedSelectionBound;
57
58 typedef unsigned long long DOMTimeStamp;
59
60 // FIXME: Oilpan: move Widget (and thereby FrameView) to the heap.
61 class FrameView FINAL : public ScrollView {
62 public:
63 friend class RenderView;
64 friend class Internals;
65
66 static PassRefPtr<FrameView> create(LocalFrame*);
67 static PassRefPtr<FrameView> create(LocalFrame*, const IntSize& initialSize);
68
69 virtual ~FrameView();
70
71 virtual HostWindow* hostWindow() const OVERRIDE;
72
73 virtual void invalidateRect(const IntRect&) OVERRIDE;
74 virtual void setFrameRect(const IntRect&) OVERRIDE;
75
frame()76 LocalFrame& frame() const
77 {
78 ASSERT(m_frame);
79 return *m_frame;
80 }
81
82 Page* page() const;
83
84 RenderView* renderView() const;
85
86 virtual void setCanHaveScrollbars(bool) OVERRIDE;
87
88 virtual PassRefPtr<Scrollbar> createScrollbar(ScrollbarOrientation) OVERRIDE;
89
90 virtual void setContentsSize(const IntSize&) OVERRIDE;
91 IntPoint clampOffsetAtScale(const IntPoint& offset, float scale) const;
92
93 void layout(bool allowSubtree = true);
94 bool didFirstLayout() const;
95 void scheduleRelayout();
96 void scheduleRelayoutOfSubtree(RenderObject*);
97 bool layoutPending() const;
98 bool isInPerformLayout() const;
99
setCanInvalidatePaintDuringPerformLayout(bool b)100 void setCanInvalidatePaintDuringPerformLayout(bool b) { m_canInvalidatePaintDuringPerformLayout = b; }
canInvalidatePaintDuringPerformLayout()101 bool canInvalidatePaintDuringPerformLayout() const { return m_canInvalidatePaintDuringPerformLayout; }
102
103 RenderObject* layoutRoot(bool onlyDuringLayout = false) const;
clearLayoutSubtreeRoot()104 void clearLayoutSubtreeRoot() { m_layoutSubtreeRoot = 0; }
layoutCount()105 int layoutCount() const { return m_layoutCount; }
106
107 bool needsLayout() const;
108 void setNeedsLayout();
109
setNeedsUpdateWidgetPositions()110 void setNeedsUpdateWidgetPositions() { m_needsUpdateWidgetPositions = true; }
111
112 // Methods for getting/setting the size Blink should use to layout the contents.
113 IntSize layoutSize(IncludeScrollbarsInRect = ExcludeScrollbars) const;
114 void setLayoutSize(const IntSize&);
115
116 // If this is set to false, the layout size will need to be explicitly set by the owner.
117 // E.g. WebViewImpl sets its mainFrame's layout size manually
setLayoutSizeFixedToFrameSize(bool isFixed)118 void setLayoutSizeFixedToFrameSize(bool isFixed) { m_layoutSizeFixedToFrameSize = isFixed; }
layoutSizeFixedToFrameSize()119 bool layoutSizeFixedToFrameSize() { return m_layoutSizeFixedToFrameSize; }
120
needsFullPaintInvalidation()121 bool needsFullPaintInvalidation() const { return m_doFullPaintInvalidation; }
setNeedsFullPaintInvalidation()122 void setNeedsFullPaintInvalidation() { m_doFullPaintInvalidation = true; }
123
124 void updateAcceleratedCompositingSettings();
125
126 void recalcOverflowAfterStyleChange();
127
128 bool isEnclosedInCompositingLayer() const;
129
130 void resetScrollbars();
131 void prepareForDetach();
132 void detachCustomScrollbars();
133 virtual void recalculateScrollbarOverlayStyle();
134
135 void clear();
136
137 bool isTransparent() const;
138 void setTransparent(bool isTransparent);
139
140 // True if the FrameView is not transparent, and the base background color is opaque.
141 bool hasOpaqueBackground() const;
142
143 Color baseBackgroundColor() const;
144 void setBaseBackgroundColor(const Color&);
145 void updateBackgroundRecursively(const Color&, bool);
146
147 void adjustViewSize();
148
149 virtual IntRect windowClipRect(IncludeScrollbarsInRect = ExcludeScrollbars) const OVERRIDE;
150 IntRect windowClipRectForFrameOwner(const HTMLFrameOwnerElement*) const;
151
152 virtual IntRect windowResizerRect() const OVERRIDE;
153
visibleContentScaleFactor()154 virtual float visibleContentScaleFactor() const OVERRIDE { return m_visibleContentScaleFactor; }
155 void setVisibleContentScaleFactor(float);
156
157 virtual float inputEventsScaleFactor() const OVERRIDE;
158 virtual IntSize inputEventsOffsetForEmulation() const OVERRIDE;
159 void setInputEventsTransformForEmulation(const IntSize&, float);
160
161 virtual void setScrollPosition(const IntPoint&, ScrollBehavior = ScrollBehaviorInstant) OVERRIDE;
162 virtual bool isRubberBandInProgress() const OVERRIDE;
163 void setScrollPositionNonProgrammatically(const IntPoint&);
164
165 // This is different than visibleContentRect() in that it ignores negative (or overly positive)
166 // offsets from rubber-banding, and it takes zooming into account.
167 LayoutRect viewportConstrainedVisibleContentRect() const;
168 void viewportConstrainedVisibleContentSizeChanged(bool widthChanged, bool heightChanged);
169
170 AtomicString mediaType() const;
171 void setMediaType(const AtomicString&);
172 void adjustMediaTypeForPrinting(bool printing);
173
174 void addSlowRepaintObject();
175 void removeSlowRepaintObject();
hasSlowRepaintObjects()176 bool hasSlowRepaintObjects() const { return m_slowRepaintObjectCount; }
177
178 // Fixed-position objects.
179 typedef HashSet<RenderObject*> ViewportConstrainedObjectSet;
180 void addViewportConstrainedObject(RenderObject*);
181 void removeViewportConstrainedObject(RenderObject*);
viewportConstrainedObjects()182 const ViewportConstrainedObjectSet* viewportConstrainedObjects() const { return m_viewportConstrainedObjects.get(); }
hasViewportConstrainedObjects()183 bool hasViewportConstrainedObjects() const { return m_viewportConstrainedObjects && m_viewportConstrainedObjects->size() > 0; }
184
185 void handleLoadCompleted();
186
187 void updateAnnotatedRegions();
188
189 void restoreScrollbar();
190
191 void postLayoutTimerFired(Timer<FrameView>*);
192
193 bool wasScrolledByUser() const;
194 void setWasScrolledByUser(bool);
195
safeToPropagateScrollToParent()196 bool safeToPropagateScrollToParent() const { return m_safeToPropagateScrollToParent; }
setSafeToPropagateScrollToParent(bool isSafe)197 void setSafeToPropagateScrollToParent(bool isSafe) { m_safeToPropagateScrollToParent = isSafe; }
198
199 void addWidget(RenderWidget*);
200 void removeWidget(RenderWidget*);
201 void updateWidgetPositions();
202
203 void addWidgetToUpdate(RenderEmbeddedObject&);
204
205 virtual void paintContents(GraphicsContext*, const IntRect& damageRect) OVERRIDE;
206 void setPaintBehavior(PaintBehavior);
207 PaintBehavior paintBehavior() const;
208 bool isPainting() const;
hasEverPainted()209 bool hasEverPainted() const { return m_lastPaintTime; }
210 void setNodeToDraw(Node*);
211
212 virtual void paintOverhangAreas(GraphicsContext*, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect) OVERRIDE;
213 virtual void paintScrollCorner(GraphicsContext*, const IntRect& cornerRect) OVERRIDE;
214 virtual void paintScrollbar(GraphicsContext*, Scrollbar*, const IntRect&) OVERRIDE;
215
216 Color documentBackgroundColor() const;
217
currentFrameTimeStamp()218 static double currentFrameTimeStamp() { return s_currentFrameTimeStamp; }
219
220 void updateLayoutAndStyleForPainting();
221 void updateLayoutAndStyleIfNeededRecursive();
222
223 void invalidateTreeIfNeededRecursive();
224
225 void incrementVisuallyNonEmptyCharacterCount(unsigned);
226 void incrementVisuallyNonEmptyPixelCount(const IntSize&);
setIsVisuallyNonEmpty()227 void setIsVisuallyNonEmpty() { m_isVisuallyNonEmpty = true; }
228 void enableAutoSizeMode(const IntSize& minSize, const IntSize& maxSize);
disableAutoSizeMode()229 void disableAutoSizeMode() { m_autoSizeInfo.clear(); }
230
231 void forceLayout(bool allowSubtree = false);
232 void forceLayoutForPagination(const FloatSize& pageSize, const FloatSize& originalPageSize, float maximumShrinkFactor);
233
234 bool scrollToFragment(const KURL&);
235 bool scrollToAnchor(const String&);
236 void maintainScrollPositionAtAnchor(Node*);
237 void scrollElementToRect(Element*, const IntRect&);
238 void scrollContentsIfNeededRecursive();
239
240 // Methods to convert points and rects between the coordinate space of the renderer, and this view.
241 IntRect convertFromRenderer(const RenderObject&, const IntRect&) const;
242 IntRect convertToRenderer(const RenderObject&, const IntRect&) const;
243 IntPoint convertFromRenderer(const RenderObject&, const IntPoint&) const;
244 IntPoint convertToRenderer(const RenderObject&, const IntPoint&) const;
245
isFrameViewScrollCorner(RenderScrollbarPart * scrollCorner)246 bool isFrameViewScrollCorner(RenderScrollbarPart* scrollCorner) const { return m_scrollCorner == scrollCorner; }
247
248 enum ScrollingReasons {
249 Scrollable,
250 NotScrollableNoOverflow,
251 NotScrollableNotVisible,
252 NotScrollableExplicitlyDisabled
253 };
254
255 ScrollingReasons scrollingReasons();
256 bool isScrollable();
257
258 enum ScrollbarModesCalculationStrategy { RulesFromWebContentOnly, AnyRule };
259 void calculateScrollbarModesForLayoutAndSetViewportRenderer(ScrollbarMode& hMode, ScrollbarMode& vMode, ScrollbarModesCalculationStrategy = AnyRule);
260
261 virtual IntPoint lastKnownMousePosition() const OVERRIDE;
262 bool shouldSetCursor() const;
263
264 void setCursor(const Cursor&);
265
266 virtual bool scrollbarsCanBeActive() const OVERRIDE;
267
268 // FIXME: Remove this method once plugin loading is decoupled from layout.
269 void flushAnyPendingPostLayoutTasks();
270
271 virtual bool shouldSuspendScrollAnimations() const OVERRIDE;
272 virtual void scrollbarStyleChanged() OVERRIDE;
273
274 RenderBox* embeddedContentBox() const;
275
276 void setTracksPaintInvalidations(bool);
isTrackingPaintInvalidations()277 bool isTrackingPaintInvalidations() const { return m_isTrackingPaintInvalidations; }
278 void resetTrackedPaintInvalidations();
279
280 String trackedPaintInvalidationRectsAsText() const;
281
282 typedef HashSet<ScrollableArea*> ScrollableAreaSet;
283 void addScrollableArea(ScrollableArea*);
284 void removeScrollableArea(ScrollableArea*);
scrollableAreas()285 const ScrollableAreaSet* scrollableAreas() const { return m_scrollableAreas.get(); }
286
287 // With CSS style "resize:" enabled, a little resizer handle will appear at the bottom
288 // right of the object. We keep track of these resizer areas for checking if touches
289 // (implemented using Scroll gesture) are targeting the resizer.
290 typedef HashSet<RenderBox*> ResizerAreaSet;
291 void addResizerArea(RenderBox&);
292 void removeResizerArea(RenderBox&);
resizerAreas()293 const ResizerAreaSet* resizerAreas() const { return m_resizerAreas.get(); }
294
295 virtual void setParent(Widget*) OVERRIDE;
296 virtual void removeChild(Widget*) OVERRIDE;
297
298 // This function exists for ports that need to handle wheel events manually.
299 // On Mac WebKit1 the underlying NSScrollView just does the scrolling, but on most other platforms
300 // we need this function in order to do the scroll ourselves.
301 bool wheelEvent(const PlatformWheelEvent&);
302
inProgrammaticScroll()303 bool inProgrammaticScroll() const { return m_inProgrammaticScroll; }
setInProgrammaticScroll(bool programmaticScroll)304 void setInProgrammaticScroll(bool programmaticScroll) { m_inProgrammaticScroll = programmaticScroll; }
305
306 virtual bool isActive() const OVERRIDE;
307
308 // DEPRECATED: Use viewportConstrainedVisibleContentRect() instead.
309 IntSize scrollOffsetForFixedPosition() const;
310
311 // Override scrollbar notifications to update the AXObject cache.
312 virtual void didAddScrollbar(Scrollbar*, ScrollbarOrientation) OVERRIDE;
313 virtual void willRemoveScrollbar(Scrollbar*, ScrollbarOrientation) OVERRIDE;
314
315 // FIXME: This should probably be renamed as the 'inSubtreeLayout' parameter
316 // passed around the FrameView layout methods can be true while this returns
317 // false.
isSubtreeLayout()318 bool isSubtreeLayout() const { return !!m_layoutSubtreeRoot; }
319
320 // Sets the tickmarks for the FrameView, overriding the default behavior
321 // which is to display the tickmarks corresponding to find results.
322 // If |m_tickmarks| is empty, the default behavior is restored.
setTickmarks(const Vector<IntRect> & tickmarks)323 void setTickmarks(const Vector<IntRect>& tickmarks) { m_tickmarks = tickmarks; }
324
325 // Since the compositor can resize the viewport due to top controls and
326 // commit scroll offsets before a WebView::resize occurs, we need to adjust
327 // our scroll extents to prevent clamping the scroll offsets.
328 void setTopControlsViewportAdjustment(float);
329
330 virtual IntPoint maximumScrollPosition() const OVERRIDE;
331
332 // ScrollableArea interface
333 virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&) OVERRIDE;
334 virtual void getTickmarks(Vector<IntRect>&) const OVERRIDE;
335 virtual void scrollTo(const IntSize&) OVERRIDE;
336 virtual IntRect scrollableAreaBoundingBox() const OVERRIDE;
337 virtual bool scrollAnimatorEnabled() const OVERRIDE;
338 virtual bool usesCompositedScrolling() const OVERRIDE;
339 virtual GraphicsLayer* layerForScrolling() const OVERRIDE;
340 virtual GraphicsLayer* layerForHorizontalScrollbar() const OVERRIDE;
341 virtual GraphicsLayer* layerForVerticalScrollbar() const OVERRIDE;
342 virtual GraphicsLayer* layerForScrollCorner() const OVERRIDE;
343
344 protected:
345 virtual void scrollContentsIfNeeded();
346 virtual bool scrollContentsFastPath(const IntSize& scrollDelta) OVERRIDE;
347 virtual void scrollContentsSlowPath(const IntRect& updateRect) OVERRIDE;
348
349 virtual bool isVerticalDocument() const OVERRIDE;
350 virtual bool isFlippedDocument() const OVERRIDE;
351
352 // Prevents creation of scrollbars. Used to prevent drawing two sets of
353 // overlay scrollbars in the case of the pinch viewport.
354 virtual bool scrollbarsDisabled() const OVERRIDE;
355
356 private:
357 explicit FrameView(LocalFrame*);
358
359 void reset();
360 void init();
361
362 virtual void frameRectsChanged() OVERRIDE;
isFrameView()363 virtual bool isFrameView() const OVERRIDE { return true; }
364
365 friend class RenderWidget;
366
367 bool contentsInCompositedLayer() const;
368
369 void applyOverflowToViewportAndSetRenderer(RenderObject*, ScrollbarMode& hMode, ScrollbarMode& vMode);
370 void updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow);
371
372 void updateCounters();
373 void forceLayoutParentViewIfNeeded();
374 void performPreLayoutTasks();
375 void performLayout(RenderObject* rootForThisLayout, bool inSubtreeLayout);
376 void scheduleOrPerformPostLayoutTasks();
377 void performPostLayoutTasks();
378
379 void invalidateTreeIfNeeded();
380
381 void gatherDebugLayoutRects(RenderObject* layoutRoot);
382
383 DocumentLifecycle& lifecycle() const;
384
385 virtual void contentRectangleForPaintInvalidation(const IntRect&) OVERRIDE;
386 virtual void contentsResized() OVERRIDE;
387 virtual void scrollbarExistenceDidChange() OVERRIDE;
388
389 // Override ScrollView methods to do point conversion via renderers, in order to
390 // take transforms into account.
391 virtual IntRect convertToContainingView(const IntRect&) const OVERRIDE;
392 virtual IntRect convertFromContainingView(const IntRect&) const OVERRIDE;
393 virtual IntPoint convertToContainingView(const IntPoint&) const OVERRIDE;
394 virtual IntPoint convertFromContainingView(const IntPoint&) const OVERRIDE;
395
396 void updateWidgetPositionsIfNeeded();
397
398 bool wasViewportResized();
399 void sendResizeEventIfNeeded();
400
401 void updateScrollableAreaSet();
402
403 virtual void notifyPageThatContentAreaWillPaint() const OVERRIDE;
404
405 void scheduleUpdateWidgetsIfNecessary();
406 void updateWidgetsTimerFired(Timer<FrameView>*);
407 bool updateWidgets();
408
409 void scrollToAnchor();
410 void scrollPositionChanged();
411 void didScrollTimerFired(Timer<FrameView>*);
412
413 void updateLayersAndCompositingAfterScrollIfNeeded();
414
415 static bool computeCompositedSelectionBounds(LocalFrame&, CompositedSelectionBound& start, CompositedSelectionBound& end);
416 void updateFixedElementPaintInvalidationRectsAfterScroll();
417 void updateCompositedSelectionBoundsIfNeeded();
418
419 bool hasCustomScrollbars() const;
420 bool shouldUseCustomScrollbars(Element*& customScrollbarElement, LocalFrame*& customScrollbarFrame);
421
422 virtual void updateScrollCorner() OVERRIDE;
423
424 FrameView* parentFrameView() const;
425
426 AXObjectCache* axObjectCache() const;
427 void removeFromAXObjectCache();
428
429 void setLayoutSizeInternal(const IntSize&);
430
paintInvalidationIsAllowed()431 bool paintInvalidationIsAllowed() const
432 {
433 return !isInPerformLayout() || canInvalidatePaintDuringPerformLayout();
434 }
435
436 static double s_currentFrameTimeStamp; // used for detecting decoded resource thrash in the cache
437 static bool s_inPaintContents;
438
439 LayoutSize m_size;
440
441 typedef WillBeHeapHashSet<RefPtrWillBeMember<RenderEmbeddedObject> > EmbeddedObjectSet;
442 WillBePersistentHeapHashSet<RefPtrWillBeMember<RenderEmbeddedObject> > m_widgetUpdateSet;
443
444 // FIXME: These are just "children" of the FrameView and should be RefPtr<Widget> instead.
445 WillBePersistentHeapHashSet<RefPtrWillBeMember<RenderWidget> > m_widgets;
446
447 // Oilpan: the use of a persistent back reference 'emulates' the
448 // RefPtr-cycle that is kept between the two objects non-Oilpan.
449 //
450 // That cycle is broken when a LocalFrame is detached by
451 // FrameLoader::detachFromParent(), it then clears its
452 // FrameView's m_frame reference by calling setView(nullptr).
453 RefPtrWillBePersistent<LocalFrame> m_frame;
454
455 bool m_doFullPaintInvalidation;
456
457 bool m_canHaveScrollbars;
458 unsigned m_slowRepaintObjectCount;
459
460 bool m_hasPendingLayout;
461 RenderObject* m_layoutSubtreeRoot;
462
463 bool m_layoutSchedulingEnabled;
464 bool m_inPerformLayout;
465 bool m_canInvalidatePaintDuringPerformLayout;
466 bool m_inSynchronousPostLayout;
467 int m_layoutCount;
468 unsigned m_nestedLayoutCount;
469 Timer<FrameView> m_postLayoutTasksTimer;
470 Timer<FrameView> m_updateWidgetsTimer;
471 bool m_firstLayoutCallbackPending;
472
473 bool m_firstLayout;
474 bool m_isTransparent;
475 Color m_baseBackgroundColor;
476 IntSize m_lastViewportSize;
477 float m_lastZoomFactor;
478
479 AtomicString m_mediaType;
480 AtomicString m_mediaTypeWhenNotPrinting;
481
482 bool m_overflowStatusDirty;
483 bool m_horizontalOverflow;
484 bool m_verticalOverflow;
485 RenderObject* m_viewportRenderer;
486
487 bool m_wasScrolledByUser;
488 bool m_inProgrammaticScroll;
489 bool m_safeToPropagateScrollToParent;
490
491 double m_lastPaintTime;
492
493 bool m_isTrackingPaintInvalidations; // Used for testing.
494 Vector<IntRect> m_trackedPaintInvalidationRects;
495
496 RefPtrWillBePersistent<Node> m_nodeToDraw;
497 PaintBehavior m_paintBehavior;
498 bool m_isPainting;
499
500 unsigned m_visuallyNonEmptyCharacterCount;
501 unsigned m_visuallyNonEmptyPixelCount;
502 bool m_isVisuallyNonEmpty;
503 bool m_firstVisuallyNonEmptyLayoutCallbackPending;
504
505 RefPtrWillBePersistent<Node> m_maintainScrollPositionAnchor;
506
507 // Renderer to hold our custom scroll corner.
508 RawPtrWillBePersistent<RenderScrollbarPart> m_scrollCorner;
509
510 OwnPtr<ScrollableAreaSet> m_scrollableAreas;
511 OwnPtr<ResizerAreaSet> m_resizerAreas;
512 OwnPtr<ViewportConstrainedObjectSet> m_viewportConstrainedObjects;
513 OwnPtr<FrameViewAutoSizeInfo> m_autoSizeInfo;
514
515 float m_visibleContentScaleFactor;
516 IntSize m_inputEventsOffsetForEmulation;
517 float m_inputEventsScaleFactorForEmulation;
518
519 IntSize m_layoutSize;
520 bool m_layoutSizeFixedToFrameSize;
521
522 Timer<FrameView> m_didScrollTimer;
523
524 Vector<IntRect> m_tickmarks;
525
526 bool m_needsUpdateWidgetPositions;
527 float m_topControlsViewportAdjustment;
528 };
529
incrementVisuallyNonEmptyCharacterCount(unsigned count)530 inline void FrameView::incrementVisuallyNonEmptyCharacterCount(unsigned count)
531 {
532 if (m_isVisuallyNonEmpty)
533 return;
534 m_visuallyNonEmptyCharacterCount += count;
535 // Use a threshold value to prevent very small amounts of visible content from triggering didFirstVisuallyNonEmptyLayout.
536 // The first few hundred characters rarely contain the interesting content of the page.
537 static const unsigned visualCharacterThreshold = 200;
538 if (m_visuallyNonEmptyCharacterCount > visualCharacterThreshold)
539 setIsVisuallyNonEmpty();
540 }
541
incrementVisuallyNonEmptyPixelCount(const IntSize & size)542 inline void FrameView::incrementVisuallyNonEmptyPixelCount(const IntSize& size)
543 {
544 if (m_isVisuallyNonEmpty)
545 return;
546 m_visuallyNonEmptyPixelCount += size.width() * size.height();
547 // Use a threshold value to prevent very small amounts of visible content from triggering didFirstVisuallyNonEmptyLayout
548 static const unsigned visualPixelThreshold = 32 * 32;
549 if (m_visuallyNonEmptyPixelCount > visualPixelThreshold)
550 setIsVisuallyNonEmpty();
551 }
552
553 DEFINE_TYPE_CASTS(FrameView, Widget, widget, widget->isFrameView(), widget.isFrameView());
554
555 class AllowPaintInvalidationScope {
556 public:
AllowPaintInvalidationScope(FrameView * view)557 explicit AllowPaintInvalidationScope(FrameView* view)
558 : m_view(view)
559 , m_originalValue(view ? view->canInvalidatePaintDuringPerformLayout() : false)
560 {
561 if (!m_view)
562 return;
563
564 m_view->setCanInvalidatePaintDuringPerformLayout(true);
565 }
566
~AllowPaintInvalidationScope()567 ~AllowPaintInvalidationScope()
568 {
569 if (!m_view)
570 return;
571
572 m_view->setCanInvalidatePaintDuringPerformLayout(m_originalValue);
573 }
574 private:
575 FrameView* m_view;
576 bool m_originalValue;
577 };
578
579 } // namespace blink
580
581 #endif // FrameView_h
582