Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(131)

Side by Side Diff: Source/core/frame/FrameView.h

Issue 1246173002: Throttle rendering pipeline for invisible iframes (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Keep animation time consistent. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 Copyright (C) 1997 Martin Jones (mjones@kde.org) 2 Copyright (C) 1997 Martin Jones (mjones@kde.org)
3 (C) 1998 Waldo Bastian (bastian@kde.org) 3 (C) 1998 Waldo Bastian (bastian@kde.org)
4 (C) 1998, 1999 Torben Weis (weis@kde.org) 4 (C) 1998, 1999 Torben Weis (weis@kde.org)
5 (C) 1999 Lars Knoll (knoll@kde.org) 5 (C) 1999 Lars Knoll (knoll@kde.org)
6 (C) 1999 Antti Koivisto (koivisto@kde.org) 6 (C) 1999 Antti Koivisto (koivisto@kde.org)
7 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv ed. 7 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv ed.
8 8
9 This library is free software; you can redistribute it and/or 9 This library is free software; you can redistribute it and/or
10 modify it under the terms of the GNU Library General Public 10 modify it under the terms of the GNU Library General Public
11 License as published by the Free Software Foundation; either 11 License as published by the Free Software Foundation; either
12 version 2 of the License, or (at your option) any later version. 12 version 2 of the License, or (at your option) any later version.
13 13
14 This library is distributed in the hope that it will be useful, 14 This library is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Library General Public License for more details. 17 Library General Public License for more details.
18 18
19 You should have received a copy of the GNU Library General Public License 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 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, 21 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 Boston, MA 02110-1301, USA. 22 Boston, MA 02110-1301, USA.
23 */ 23 */
24 24
25 #ifndef FrameView_h 25 #ifndef FrameView_h
26 #define FrameView_h 26 #define FrameView_h
27 27
28 #include "core/CoreExport.h" 28 #include "core/CoreExport.h"
29 #include "core/dom/DocumentLifecycle.h"
29 #include "core/frame/FrameViewAutoSizeInfo.h" 30 #include "core/frame/FrameViewAutoSizeInfo.h"
30 #include "core/frame/LayoutSubtreeRootList.h" 31 #include "core/frame/LayoutSubtreeRootList.h"
31 #include "core/frame/RootFrameViewport.h" 32 #include "core/frame/RootFrameViewport.h"
32 #include "core/layout/LayoutAnalyzer.h" 33 #include "core/layout/LayoutAnalyzer.h"
33 #include "core/paint/PaintPhase.h" 34 #include "core/paint/PaintPhase.h"
34 #include "platform/RuntimeEnabledFeatures.h" 35 #include "platform/RuntimeEnabledFeatures.h"
35 #include "platform/Widget.h" 36 #include "platform/Widget.h"
36 #include "platform/geometry/IntRect.h" 37 #include "platform/geometry/IntRect.h"
37 #include "platform/geometry/LayoutRect.h" 38 #include "platform/geometry/LayoutRect.h"
38 #include "platform/graphics/Color.h" 39 #include "platform/graphics/Color.h"
39 #include "platform/scroll/ScrollTypes.h" 40 #include "platform/scroll/ScrollTypes.h"
40 #include "platform/scroll/ScrollableArea.h" 41 #include "platform/scroll/ScrollableArea.h"
41 #include "platform/scroll/Scrollbar.h" 42 #include "platform/scroll/Scrollbar.h"
42 #include "public/platform/WebDisplayMode.h" 43 #include "public/platform/WebDisplayMode.h"
43 #include "public/platform/WebRect.h" 44 #include "public/platform/WebRect.h"
44 #include "wtf/Allocator.h" 45 #include "wtf/Allocator.h"
45 #include "wtf/Forward.h" 46 #include "wtf/Forward.h"
46 #include "wtf/HashSet.h" 47 #include "wtf/HashSet.h"
47 #include "wtf/ListHashSet.h" 48 #include "wtf/ListHashSet.h"
48 #include "wtf/OwnPtr.h" 49 #include "wtf/OwnPtr.h"
49 #include "wtf/TemporaryChange.h" 50 #include "wtf/TemporaryChange.h"
50 #include "wtf/text/WTFString.h" 51 #include "wtf/text/WTFString.h"
51 52
52 namespace blink { 53 namespace blink {
53 54
54 class AXObjectCache; 55 class AXObjectCache;
55 class DocumentLifecycle;
56 class Cursor; 56 class Cursor;
57 class Element; 57 class Element;
58 class FloatSize; 58 class FloatSize;
59 class HTMLFrameOwnerElement; 59 class HTMLFrameOwnerElement;
60 class LayoutPart; 60 class LayoutPart;
61 class LocalFrame; 61 class LocalFrame;
62 class KURL; 62 class KURL;
63 class Node; 63 class Node;
64 class LayoutBox; 64 class LayoutBox;
65 class LayoutEmbeddedObject; 65 class LayoutEmbeddedObject;
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 void setIsPainting(bool val) { m_isPainting = val; } 219 void setIsPainting(bool val) { m_isPainting = val; }
220 bool isPainting() const; 220 bool isPainting() const;
221 void setLastPaintTime(double val) { m_lastPaintTime = val; } 221 void setLastPaintTime(double val) { m_lastPaintTime = val; }
222 bool hasEverPainted() const { return m_lastPaintTime; } 222 bool hasEverPainted() const { return m_lastPaintTime; }
223 void setNodeToDraw(Node*); 223 void setNodeToDraw(Node*);
224 Node* nodeToDraw() { return m_nodeToDraw.get(); } 224 Node* nodeToDraw() { return m_nodeToDraw.get(); }
225 225
226 Color documentBackgroundColor() const; 226 Color documentBackgroundColor() const;
227 227
228 // Run all needed lifecycle stages. After calling this method, all frames wi ll be in the lifecycle state PaintInvalidationClean. 228 // Run all needed lifecycle stages. After calling this method, all frames wi ll be in the lifecycle state PaintInvalidationClean.
229 void updateAllLifecyclePhases(); 229 // If lifecycle throttling is allowed, some frames may skip the lifecycle up date (e.g., based on visibility) and will not end
230 // up being PaintInvalidationClean.
231 void updateAllLifecyclePhases(DocumentLifecycle::ThrottlingMode = DocumentLi fecycle::ThrottlingMode::Disallow);
230 232
231 // Computes the style, layout and compositing lifecycle stages if needed. Af ter calling this method, all frames wil lbe in a lifecycle 233 // Computes the style, layout and compositing lifecycle stages if needed. Af ter calling this method, all frames wil lbe in a lifecycle
232 // state >= CompositingClean, and scrolling has been updated. 234 // state >= CompositingClean, and scrolling has been updated.
233 void updateLifecycleToCompositingCleanPlusScrolling(); 235 void updateLifecycleToCompositingCleanPlusScrolling(DocumentLifecycle::Throt tlingMode = DocumentLifecycle::ThrottlingMode::Disallow);
234 236
235 bool invalidateViewportConstrainedObjects(); 237 bool invalidateViewportConstrainedObjects();
236 238
237 void incrementVisuallyNonEmptyCharacterCount(unsigned); 239 void incrementVisuallyNonEmptyCharacterCount(unsigned);
238 void incrementVisuallyNonEmptyPixelCount(const IntSize&); 240 void incrementVisuallyNonEmptyPixelCount(const IntSize&);
239 bool isVisuallyNonEmpty() const { return m_isVisuallyNonEmpty; } 241 bool isVisuallyNonEmpty() const { return m_isVisuallyNonEmpty; }
240 void setIsVisuallyNonEmpty() { m_isVisuallyNonEmpty = true; } 242 void setIsVisuallyNonEmpty() { m_isVisuallyNonEmpty = true; }
241 void enableAutoSizeMode(const IntSize& minSize, const IntSize& maxSize); 243 void enableAutoSizeMode(const IntSize& minSize, const IntSize& maxSize);
242 void disableAutoSizeMode(); 244 void disableAutoSizeMode();
243 245
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 // Returns true if the default scrolling direction is vertical. i.e. writing mode 554 // Returns true if the default scrolling direction is vertical. i.e. writing mode
553 // is horiziontal. In a vertical document, a spacebar scrolls down. 555 // is horiziontal. In a vertical document, a spacebar scrolls down.
554 bool isVerticalDocument() const; 556 bool isVerticalDocument() const;
555 557
556 // Returns true if the document's writing mode is right-to-left or bottom-to -top. 558 // Returns true if the document's writing mode is right-to-left or bottom-to -top.
557 bool isFlippedDocument() const; 559 bool isFlippedDocument() const;
558 560
559 void setFrameTimingRequestsDirty(bool isDirty) { m_frameTimingRequestsDirty = isDirty; } 561 void setFrameTimingRequestsDirty(bool isDirty) { m_frameTimingRequestsDirty = isDirty; }
560 bool frameTimingRequestsDirty() { return m_frameTimingRequestsDirty; } 562 bool frameTimingRequestsDirty() { return m_frameTimingRequestsDirty; }
561 563
564 // Returns true if this frame should skip rendering pipeline processing duri ng the
565 // current BeginMainFrame.
566 bool shouldThrottleRenderingPipeline() const;
567
568 // Returns true if this frame should skip style computation, layout and
569 // compositing updates for the current BeginMainFrame.
570 bool shouldThrottleStyleLayoutAndCompositingUpdates() const;
571
572 // Updates the throttling status of all frames in the hierarchy and
573 // schedules new animations or lifecycle updates as necessary. Must be
574 // called after the layer update phase of the current BeginMainFrame.
575 void updateThrottling();
576
562 protected: 577 protected:
563 // Scroll the content via the compositor. 578 // Scroll the content via the compositor.
564 bool scrollContentsFastPath(const IntSize& scrollDelta); 579 bool scrollContentsFastPath(const IntSize& scrollDelta);
565 580
566 // Scroll the content by invalidating everything. 581 // Scroll the content by invalidating everything.
567 void scrollContentsSlowPath(const IntRect& updateRect); 582 void scrollContentsSlowPath(const IntRect& updateRect);
568 583
569 // These functions are used to create/destroy scrollbars. 584 // These functions are used to create/destroy scrollbars.
570 void setHasHorizontalScrollbar(bool); 585 void setHasHorizontalScrollbar(bool);
571 void setHasVerticalScrollbar(bool); 586 void setHasVerticalScrollbar(bool);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 explicit FrameView(LocalFrame*); 620 explicit FrameView(LocalFrame*);
606 621
607 void setScrollOffset(const IntPoint&, ScrollType) override; 622 void setScrollOffset(const IntPoint&, ScrollType) override;
608 void setScrollOffset(const DoublePoint&, ScrollType) override; 623 void setScrollOffset(const DoublePoint&, ScrollType) override;
609 624
610 enum LifeCycleUpdateOption { 625 enum LifeCycleUpdateOption {
611 AllPhases, 626 AllPhases,
612 OnlyUpToCompositingCleanPlusScrolling, 627 OnlyUpToCompositingCleanPlusScrolling,
613 }; 628 };
614 629
615 void updateLifecyclePhasesInternal(LifeCycleUpdateOption); 630 void updateLifecyclePhasesInternal(LifeCycleUpdateOption, DocumentLifecycle: :ThrottlingMode);
616 void invalidateTreeIfNeededRecursive(); 631 void invalidateTreeIfNeededRecursive();
617 void scrollContentsIfNeededRecursive(); 632 void scrollContentsIfNeededRecursive();
618 void updateStyleAndLayoutIfNeededRecursive(); 633 void updateStyleAndLayoutIfNeededRecursive();
619 void paintForSlimmingPaintV2(); 634 void paintForSlimmingPaintV2();
620 void compositeForSlimmingPaintV2(); 635 void compositeForSlimmingPaintV2();
621 636
622 void reset(); 637 void reset();
623 void init(); 638 void init();
624 639
625 void clearLayoutSubtreeRootsAndMarkContainingBlocks(); 640 void clearLayoutSubtreeRootsAndMarkContainingBlocks();
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 // LayoutObject for the viewport-defining element (see Document::viewportDef iningElement). 725 // LayoutObject for the viewport-defining element (see Document::viewportDef iningElement).
711 LayoutObject* viewportLayoutObject(); 726 LayoutObject* viewportLayoutObject();
712 727
713 void collectAnnotatedRegions(LayoutObject&, Vector<AnnotatedRegionValue>&); 728 void collectAnnotatedRegions(LayoutObject&, Vector<AnnotatedRegionValue>&);
714 729
715 typedef WTF::HashMap <const GraphicsLayer*, Vector<std::pair<int64_t, WebRec t>>> GraphicsLayerFrameTimingRequests; 730 typedef WTF::HashMap <const GraphicsLayer*, Vector<std::pair<int64_t, WebRec t>>> GraphicsLayerFrameTimingRequests;
716 void updateFrameTimingRequestsIfNeeded(); 731 void updateFrameTimingRequestsIfNeeded();
717 void collectFrameTimingRequests(GraphicsLayerFrameTimingRequests&); 732 void collectFrameTimingRequests(GraphicsLayerFrameTimingRequests&);
718 void collectFrameTimingRequestsRecursive(GraphicsLayerFrameTimingRequests&); 733 void collectFrameTimingRequestsRecursive(GraphicsLayerFrameTimingRequests&);
719 734
735 void updateViewportVisibilityIfNeeded();
736 void setLifecycleThrottlingModeForSubtree(DocumentLifecycle::ThrottlingMode) ;
737
738 enum class SecurityOriginStatus { IsSameOrigin, IsCrossOrigin };
739 void updateThrottlingRecursive(SecurityOriginStatus);
740
720 LayoutSize m_size; 741 LayoutSize m_size;
721 742
722 typedef HashSet<RefPtr<LayoutEmbeddedObject>> EmbeddedObjectSet; 743 typedef HashSet<RefPtr<LayoutEmbeddedObject>> EmbeddedObjectSet;
723 EmbeddedObjectSet m_partUpdateSet; 744 EmbeddedObjectSet m_partUpdateSet;
724 745
725 // FIXME: These are just "children" of the FrameView and should be RefPtrWil lBeMember<Widget> instead. 746 // FIXME: These are just "children" of the FrameView and should be RefPtrWil lBeMember<Widget> instead.
726 HashSet<RefPtr<LayoutPart>> m_parts; 747 HashSet<RefPtr<LayoutPart>> m_parts;
727 748
728 // The RefPtr cycle between LocalFrame and FrameView is broken 749 // The RefPtr cycle between LocalFrame and FrameView is broken
729 // when a LocalFrame is detached by LocalFrame::detach(). 750 // when a LocalFrame is detached by LocalFrame::detach().
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 IntSize m_layoutSize; 815 IntSize m_layoutSize;
795 bool m_layoutSizeFixedToFrameSize; 816 bool m_layoutSizeFixedToFrameSize;
796 817
797 Timer<FrameView> m_didScrollTimer; 818 Timer<FrameView> m_didScrollTimer;
798 819
799 Vector<IntRect> m_tickmarks; 820 Vector<IntRect> m_tickmarks;
800 821
801 float m_topControlsViewportAdjustment; 822 float m_topControlsViewportAdjustment;
802 823
803 bool m_needsUpdateWidgetPositions; 824 bool m_needsUpdateWidgetPositions;
825 bool m_needsUpdateViewportVisibility;
804 826
805 #if ENABLE(ASSERT) 827 #if ENABLE(ASSERT)
806 // Verified when finalizing. 828 // Verified when finalizing.
807 bool m_hasBeenDisposed; 829 bool m_hasBeenDisposed;
808 #endif 830 #endif
809 831
810 RefPtrWillBeMember<Scrollbar> m_horizontalScrollbar; 832 RefPtrWillBeMember<Scrollbar> m_horizontalScrollbar;
811 RefPtrWillBeMember<Scrollbar> m_verticalScrollbar; 833 RefPtrWillBeMember<Scrollbar> m_verticalScrollbar;
812 ScrollbarMode m_horizontalScrollbarMode; 834 ScrollbarMode m_horizontalScrollbarMode;
813 ScrollbarMode m_verticalScrollbarMode; 835 ScrollbarMode m_verticalScrollbarMode;
(...skipping 18 matching lines...) Expand all
832 OwnPtr<LayoutAnalyzer> m_analyzer; 854 OwnPtr<LayoutAnalyzer> m_analyzer;
833 855
834 // Mark if something has changed in the mapping from Frame to GraphicsLayer 856 // Mark if something has changed in the mapping from Frame to GraphicsLayer
835 // and the Frame Timing regions should be recalculated. 857 // and the Frame Timing regions should be recalculated.
836 bool m_frameTimingRequestsDirty; 858 bool m_frameTimingRequestsDirty;
837 859
838 // Exists only on root frame. 860 // Exists only on root frame.
839 // TODO(bokan): crbug.com/484188. We should specialize FrameView for the 861 // TODO(bokan): crbug.com/484188. We should specialize FrameView for the
840 // main frame. 862 // main frame.
841 OwnPtrWillBeMember<ScrollableArea> m_viewportScrollableArea; 863 OwnPtrWillBeMember<ScrollableArea> m_viewportScrollableArea;
864
865 // This frame's bounds in the root frame's content coordinates, clipped
866 // recursively through every ancestor view.
867 IntRect m_clippedBounds;
868
869 enum class ViewportVisibility { Hidden, Visible };
870
871 // The following members control rendering pipeline throttling for this
872 // frame. They are only updated at the end of the pipeline (after painting)
873 // to avoid running further pipeline stages for a frame without having gone
874 // through the previous ones.
875 ViewportVisibility m_viewportVisibility;
876 SecurityOriginStatus m_securityOriginStatusForThrottling;
842 }; 877 };
843 878
844 inline void FrameView::incrementVisuallyNonEmptyCharacterCount(unsigned count) 879 inline void FrameView::incrementVisuallyNonEmptyCharacterCount(unsigned count)
845 { 880 {
846 if (m_isVisuallyNonEmpty) 881 if (m_isVisuallyNonEmpty)
847 return; 882 return;
848 m_visuallyNonEmptyCharacterCount += count; 883 m_visuallyNonEmptyCharacterCount += count;
849 // Use a threshold value to prevent very small amounts of visible content fr om triggering didFirstVisuallyNonEmptyLayout. 884 // Use a threshold value to prevent very small amounts of visible content fr om triggering didFirstVisuallyNonEmptyLayout.
850 // The first few hundred characters rarely contain the interesting content o f the page. 885 // The first few hundred characters rarely contain the interesting content o f the page.
851 static const unsigned visualCharacterThreshold = 200; 886 static const unsigned visualCharacterThreshold = 200;
(...skipping 10 matching lines...) Expand all
862 static const unsigned visualPixelThreshold = 32 * 32; 897 static const unsigned visualPixelThreshold = 32 * 32;
863 if (m_visuallyNonEmptyPixelCount > visualPixelThreshold) 898 if (m_visuallyNonEmptyPixelCount > visualPixelThreshold)
864 setIsVisuallyNonEmpty(); 899 setIsVisuallyNonEmpty();
865 } 900 }
866 901
867 DEFINE_TYPE_CASTS(FrameView, Widget, widget, widget->isFrameView(), widget.isFra meView()); 902 DEFINE_TYPE_CASTS(FrameView, Widget, widget, widget->isFrameView(), widget.isFra meView());
868 903
869 } // namespace blink 904 } // namespace blink
870 905
871 #endif // FrameView_h 906 #endif // FrameView_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698