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

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

Issue 1246173002: Throttle rendering pipeline for invisible iframes (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Add layout tests. 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) 1998, 1999 Torben Weis <weis@kde.org> 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
3 * 1999 Lars Knoll <knoll@kde.org> 3 * 1999 Lars Knoll <knoll@kde.org>
4 * 1999 Antti Koivisto <koivisto@kde.org> 4 * 1999 Antti Koivisto <koivisto@kde.org>
5 * 2000 Dirk Mueller <mueller@kde.org> 5 * 2000 Dirk Mueller <mueller@kde.org>
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
7 * (C) 2006 Graham Dennis (graham.dennis@gmail.com) 7 * (C) 2006 Graham Dennis (graham.dennis@gmail.com)
8 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) 8 * (C) 2006 Alexey Proskuryakov (ap@nypop.com)
9 * Copyright (C) 2009 Google Inc. All rights reserved. 9 * Copyright (C) 2009 Google Inc. All rights reserved.
10 * 10 *
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 , m_baseBackgroundColor(Color::white) 123 , m_baseBackgroundColor(Color::white)
124 , m_mediaType(MediaTypeNames::screen) 124 , m_mediaType(MediaTypeNames::screen)
125 , m_safeToPropagateScrollToParent(true) 125 , m_safeToPropagateScrollToParent(true)
126 , m_isTrackingPaintInvalidations(false) 126 , m_isTrackingPaintInvalidations(false)
127 , m_scrollCorner(nullptr) 127 , m_scrollCorner(nullptr)
128 , m_inputEventsScaleFactorForEmulation(1) 128 , m_inputEventsScaleFactorForEmulation(1)
129 , m_layoutSizeFixedToFrameSize(true) 129 , m_layoutSizeFixedToFrameSize(true)
130 , m_didScrollTimer(this, &FrameView::didScrollTimerFired) 130 , m_didScrollTimer(this, &FrameView::didScrollTimerFired)
131 , m_topControlsViewportAdjustment(0) 131 , m_topControlsViewportAdjustment(0)
132 , m_needsUpdateWidgetPositions(false) 132 , m_needsUpdateWidgetPositions(false)
133 , m_needsUpdateViewportVisibility(true)
133 #if ENABLE(ASSERT) 134 #if ENABLE(ASSERT)
134 , m_hasBeenDisposed(false) 135 , m_hasBeenDisposed(false)
135 #endif 136 #endif
136 , m_horizontalScrollbarMode(ScrollbarAuto) 137 , m_horizontalScrollbarMode(ScrollbarAuto)
137 , m_verticalScrollbarMode(ScrollbarAuto) 138 , m_verticalScrollbarMode(ScrollbarAuto)
138 , m_horizontalScrollbarLock(false) 139 , m_horizontalScrollbarLock(false)
139 , m_verticalScrollbarLock(false) 140 , m_verticalScrollbarLock(false)
140 , m_scrollbarsAvoidingResizer(0) 141 , m_scrollbarsAvoidingResizer(0)
141 , m_scrollbarsSuppressed(false) 142 , m_scrollbarsSuppressed(false)
142 , m_inUpdateScrollbars(false) 143 , m_inUpdateScrollbars(false)
143 , m_clipsRepaints(true) 144 , m_clipsRepaints(true)
144 , m_frameTimingRequestsDirty(true) 145 , m_frameTimingRequestsDirty(true)
145 146 , m_viewportVisibility(ViewportVisibility::Visible)
147 , m_securityOriginStatusForThrottling(SecurityOriginStatus::IsSameOrigin)
146 { 148 {
147 ASSERT(m_frame); 149 ASSERT(m_frame);
148 init(); 150 init();
149 } 151 }
150 152
151 PassRefPtrWillBeRawPtr<FrameView> FrameView::create(LocalFrame* frame) 153 PassRefPtrWillBeRawPtr<FrameView> FrameView::create(LocalFrame* frame)
152 { 154 {
153 RefPtrWillBeRawPtr<FrameView> view = adoptRefWillBeNoop(new FrameView(frame) ); 155 RefPtrWillBeRawPtr<FrameView> view = adoptRefWillBeNoop(new FrameView(frame) );
154 view->show(); 156 view->show();
155 return view.release(); 157 return view.release();
(...skipping 921 matching lines...) Expand 10 before | Expand all | Expand 10 after
1077 1079
1078 frame().document()->layoutUpdated(); 1080 frame().document()->layoutUpdated();
1079 } 1081 }
1080 1082
1081 // The plan is to move to compositor-queried paint invalidation, in which case t his 1083 // The plan is to move to compositor-queried paint invalidation, in which case t his
1082 // method would setNeedsRedraw on the GraphicsLayers with invalidations and 1084 // method would setNeedsRedraw on the GraphicsLayers with invalidations and
1083 // let the compositor pick which to actually draw. 1085 // let the compositor pick which to actually draw.
1084 // See http://crbug.com/306706 1086 // See http://crbug.com/306706
1085 void FrameView::invalidateTreeIfNeeded(PaintInvalidationState& paintInvalidation State) 1087 void FrameView::invalidateTreeIfNeeded(PaintInvalidationState& paintInvalidation State)
1086 { 1088 {
1089 if (shouldThrottleRenderingPipeline())
1090 return;
1091
1087 lifecycle().advanceTo(DocumentLifecycle::InPaintInvalidation); 1092 lifecycle().advanceTo(DocumentLifecycle::InPaintInvalidation);
1088 1093
1089 ASSERT(layoutView()); 1094 ASSERT(layoutView());
1090 LayoutView& rootForPaintInvalidation = *layoutView(); 1095 LayoutView& rootForPaintInvalidation = *layoutView();
1091 ASSERT(!rootForPaintInvalidation.needsLayout()); 1096 ASSERT(!rootForPaintInvalidation.needsLayout());
1092 1097
1093 TRACE_EVENT1("blink", "FrameView::invalidateTree", "root", rootForPaintInval idation.debugName().ascii()); 1098 TRACE_EVENT1("blink", "FrameView::invalidateTree", "root", rootForPaintInval idation.debugName().ascii());
1094 1099
1095 rootForPaintInvalidation.invalidateTreeIfNeeded(paintInvalidationState); 1100 rootForPaintInvalidation.invalidateTreeIfNeeded(paintInvalidationState);
1096 1101
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1286 } 1291 }
1287 1292
1288 bool FrameView::shouldSetCursor() const 1293 bool FrameView::shouldSetCursor() const
1289 { 1294 {
1290 Page* page = frame().page(); 1295 Page* page = frame().page();
1291 return page && page->visibilityState() != PageVisibilityStateHidden && page- >focusController().isActive() && page->settings().deviceSupportsMouse(); 1296 return page && page->visibilityState() != PageVisibilityStateHidden && page- >focusController().isActive() && page->settings().deviceSupportsMouse();
1292 } 1297 }
1293 1298
1294 void FrameView::scrollContentsIfNeededRecursive() 1299 void FrameView::scrollContentsIfNeededRecursive()
1295 { 1300 {
1301 if (shouldThrottleStyleLayoutAndCompositingUpdates())
1302 return;
1296 scrollContentsIfNeeded(); 1303 scrollContentsIfNeeded();
1297 1304
1298 for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree ().nextSibling()) { 1305 for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree ().nextSibling()) {
1299 if (!child->isLocalFrame()) 1306 if (!child->isLocalFrame())
1300 continue; 1307 continue;
1301 if (FrameView* view = toLocalFrame(child)->view()) 1308 if (FrameView* view = toLocalFrame(child)->view())
1302 view->scrollContentsIfNeededRecursive(); 1309 view->scrollContentsIfNeededRecursive();
1303 } 1310 }
1304 } 1311 }
1305 1312
1313 void FrameView::setLifecycleThrottlingModeForSubtree(DocumentLifecycle::Throttli ngMode throttlingMode)
1314 {
1315 ASSERT(m_frame->isLocalRoot());
1316 for (Frame* frame = m_frame.get(); frame; frame = frame->tree().traverseNext (m_frame.get())) {
1317 if (!frame->isLocalFrame())
1318 continue;
1319 if (FrameView* view = toLocalFrame(frame)->view())
1320 view->lifecycle().setThrottlingMode(throttlingMode);
1321 }
1322 }
1323
1306 bool FrameView::invalidateViewportConstrainedObjects() 1324 bool FrameView::invalidateViewportConstrainedObjects()
1307 { 1325 {
1308 for (const auto& viewportConstrainedObject : *m_viewportConstrainedObjects) { 1326 for (const auto& viewportConstrainedObject : *m_viewportConstrainedObjects) {
1309 LayoutObject* layoutObject = viewportConstrainedObject; 1327 LayoutObject* layoutObject = viewportConstrainedObject;
1310 ASSERT(layoutObject->style()->hasViewportConstrainedPosition()); 1328 ASSERT(layoutObject->style()->hasViewportConstrainedPosition());
1311 ASSERT(layoutObject->hasLayer()); 1329 ASSERT(layoutObject->hasLayer());
1312 DeprecatedPaintLayer* layer = toLayoutBoxModelObject(layoutObject)->laye r(); 1330 DeprecatedPaintLayer* layer = toLayoutBoxModelObject(layoutObject)->laye r();
1313 1331
1314 if (layer->isPaintInvalidationContainer()) 1332 if (layer->isPaintInvalidationContainer())
1315 continue; 1333 continue;
(...skipping 1095 matching lines...) Expand 10 before | Expand all | Expand 10 after
2411 void FrameView::updateWidgetPositionsIfNeeded() 2429 void FrameView::updateWidgetPositionsIfNeeded()
2412 { 2430 {
2413 if (!m_needsUpdateWidgetPositions) 2431 if (!m_needsUpdateWidgetPositions)
2414 return; 2432 return;
2415 2433
2416 m_needsUpdateWidgetPositions = false; 2434 m_needsUpdateWidgetPositions = false;
2417 2435
2418 updateWidgetPositions(); 2436 updateWidgetPositions();
2419 } 2437 }
2420 2438
2421 void FrameView::updateAllLifecyclePhases(const LayoutRect& interestRect) 2439 void FrameView::updateAllLifecyclePhases(DocumentLifecycle::ThrottlingMode throt tlingMode, const LayoutRect& interestRect)
2422 { 2440 {
2423 frame().localFrameRoot()->view()->updateLifecyclePhasesInternal(AllPhases, i nterestRect); 2441 frame().localFrameRoot()->view()->updateLifecyclePhasesInternal(AllPhases, t hrottlingMode, interestRect);
2424 } 2442 }
2425 2443
2426 // TODO(chrishtr): add a scrolling update lifecycle phase. 2444 // TODO(chrishtr): add a scrolling update lifecycle phase.
2427 void FrameView::updateLifecycleToCompositingCleanPlusScrolling() 2445 void FrameView::updateLifecycleToCompositingCleanPlusScrolling(DocumentLifecycle ::ThrottlingMode throttlingMode)
2428 { 2446 {
2429 frame().localFrameRoot()->view()->updateLifecyclePhasesInternal(OnlyUpToComp ositingCleanPlusScrolling); 2447 frame().localFrameRoot()->view()->updateLifecyclePhasesInternal(OnlyUpToComp ositingCleanPlusScrolling, throttlingMode, LayoutRect::infiniteRect());
2430 } 2448 }
2431 2449
2432 void FrameView::updateLifecyclePhasesInternal(LifeCycleUpdateOption phases, cons t LayoutRect& interestRect) 2450 void FrameView::updateLifecyclePhasesInternal(LifeCycleUpdateOption phases, Docu mentLifecycle::ThrottlingMode throttlingMode, const LayoutRect& interestRect)
2433 { 2451 {
2434 // This must be called from the root frame, since it recurses down, not up. 2452 // This must be called from the root frame, since it recurses down, not up.
2435 // Otherwise the lifecycles of the frames might be out of sync. 2453 // Otherwise the lifecycles of the frames might be out of sync.
2436 ASSERT(m_frame->isLocalRoot()); 2454 ASSERT(m_frame->isLocalRoot());
2437 2455
2438 // Updating layout can run script, which can tear down the FrameView. 2456 // Updating layout can run script, which can tear down the FrameView.
2439 RefPtrWillBeRawPtr<FrameView> protector(this); 2457 RefPtrWillBeRawPtr<FrameView> protector(this);
2440 2458
2459 setLifecycleThrottlingModeForSubtree(throttlingMode);
2441 updateStyleAndLayoutIfNeededRecursive(); 2460 updateStyleAndLayoutIfNeededRecursive();
2442 2461
2443 if (LayoutView* view = layoutView()) { 2462 if (LayoutView* view = layoutView()) {
2444 TRACE_EVENT1("devtools.timeline", "UpdateLayerTree", "data", InspectorUp dateLayerTreeEvent::data(m_frame.get())); 2463 TRACE_EVENT1("devtools.timeline", "UpdateLayerTree", "data", InspectorUp dateLayerTreeEvent::data(m_frame.get()));
2445 2464
2446 // This was required for slimming paint v1 but is only temporarily 2465 // This was required for slimming paint v1 but is only temporarily
2447 // needed for slimming paint v2. 2466 // needed for slimming paint v2.
2448 view->compositor()->updateIfNeededRecursive(); 2467 view->compositor()->updateIfNeededRecursive();
2449 scrollContentsIfNeededRecursive(); 2468 scrollContentsIfNeededRecursive();
2450 2469
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
2525 collectFrameTimingRequestsRecursive(graphicsLayerTimingRequests); 2544 collectFrameTimingRequestsRecursive(graphicsLayerTimingRequests);
2526 2545
2527 for (const auto& iter : graphicsLayerTimingRequests) { 2546 for (const auto& iter : graphicsLayerTimingRequests) {
2528 const GraphicsLayer* graphicsLayer = iter.key; 2547 const GraphicsLayer* graphicsLayer = iter.key;
2529 graphicsLayer->platformLayer()->setFrameTimingRequests(iter.value); 2548 graphicsLayer->platformLayer()->setFrameTimingRequests(iter.value);
2530 } 2549 }
2531 } 2550 }
2532 2551
2533 void FrameView::updateStyleAndLayoutIfNeededRecursive() 2552 void FrameView::updateStyleAndLayoutIfNeededRecursive()
2534 { 2553 {
2554 if (shouldThrottleStyleLayoutAndCompositingUpdates())
2555 return;
2556
2535 // We have to crawl our entire subtree looking for any FrameViews that need 2557 // We have to crawl our entire subtree looking for any FrameViews that need
2536 // layout and make sure they are up to date. 2558 // layout and make sure they are up to date.
2537 // Mac actually tests for intersection with the dirty region and tries not t o 2559 // Mac actually tests for intersection with the dirty region and tries not t o
2538 // update layout for frames that are outside the dirty region. Not only doe s this seem 2560 // update layout for frames that are outside the dirty region. Not only doe s this seem
2539 // pointless (since those frames will have set a zero timer to layout anyway ), but 2561 // pointless (since those frames will have set a zero timer to layout anyway ), but
2540 // it is also incorrect, since if two frames overlap, the first could be exc luded from the dirty 2562 // it is also incorrect, since if two frames overlap, the first could be exc luded from the dirty
2541 // region but then become included later by the second frame adding rects to the dirty region 2563 // region but then become included later by the second frame adding rects to the dirty region
2542 // when it lays out. 2564 // when it lays out.
2543 2565
2544 m_frame->document()->updateLayoutTreeIfNeeded(); 2566 m_frame->document()->updateLayoutTreeIfNeeded();
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2576 #if ENABLE(ASSERT) 2598 #if ENABLE(ASSERT)
2577 m_frame->document()->layoutView()->assertLaidOut(); 2599 m_frame->document()->layoutView()->assertLaidOut();
2578 #endif 2600 #endif
2579 2601
2580 updateWidgetPositionsIfNeeded(); 2602 updateWidgetPositionsIfNeeded();
2581 } 2603 }
2582 2604
2583 void FrameView::invalidateTreeIfNeededRecursive() 2605 void FrameView::invalidateTreeIfNeededRecursive()
2584 { 2606 {
2585 ASSERT(layoutView()); 2607 ASSERT(layoutView());
2608
2609 // We need to stop recursing here since a child frame view might not be thro ttled
2610 // even though we are (e.g., it didn't compute its visibility yet).
2611 if (shouldThrottleRenderingPipeline())
2612 return;
2586 TRACE_EVENT1("blink", "FrameView::invalidateTreeIfNeededRecursive", "root", layoutView()->debugName().ascii()); 2613 TRACE_EVENT1("blink", "FrameView::invalidateTreeIfNeededRecursive", "root", layoutView()->debugName().ascii());
2587 2614
2588 Vector<LayoutObject*> pendingDelayedPaintInvalidations; 2615 Vector<LayoutObject*> pendingDelayedPaintInvalidations;
2589 PaintInvalidationState rootPaintInvalidationState(*layoutView(), pendingDela yedPaintInvalidations); 2616 PaintInvalidationState rootPaintInvalidationState(*layoutView(), pendingDela yedPaintInvalidations);
2590 2617
2591 invalidateTreeIfNeeded(rootPaintInvalidationState); 2618 invalidateTreeIfNeeded(rootPaintInvalidationState);
2592 2619
2593 // Some frames may be not reached during the above invalidateTreeIfNeeded be cause 2620 // Some frames may be not reached during the above invalidateTreeIfNeeded be cause
2594 // - the frame is a detached frame; or 2621 // - the frame is a detached frame; or
2595 // - it didn't need paint invalidation. 2622 // - it didn't need paint invalidation.
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
2894 2921
2895 if (m_scrollbarsAvoidingResizer && parent()) 2922 if (m_scrollbarsAvoidingResizer && parent())
2896 toFrameView(parent())->adjustScrollbarsAvoidingResizerCount(-m_scrollbar sAvoidingResizer); 2923 toFrameView(parent())->adjustScrollbarsAvoidingResizerCount(-m_scrollbar sAvoidingResizer);
2897 2924
2898 Widget::setParent(parentView); 2925 Widget::setParent(parentView);
2899 2926
2900 if (m_scrollbarsAvoidingResizer && parent()) 2927 if (m_scrollbarsAvoidingResizer && parent())
2901 toFrameView(parent())->adjustScrollbarsAvoidingResizerCount(m_scrollbars AvoidingResizer); 2928 toFrameView(parent())->adjustScrollbarsAvoidingResizerCount(m_scrollbars AvoidingResizer);
2902 2929
2903 updateScrollableAreaSet(); 2930 updateScrollableAreaSet();
2931 m_needsUpdateViewportVisibility = true;
2904 } 2932 }
2905 2933
2906 void FrameView::removeChild(Widget* child) 2934 void FrameView::removeChild(Widget* child)
2907 { 2935 {
2908 ASSERT(child->parent() == this); 2936 ASSERT(child->parent() == this);
2909 2937
2910 if (child->isFrameView()) 2938 if (child->isFrameView())
2911 removeScrollableArea(toFrameView(child)); 2939 removeScrollableArea(toFrameView(child));
2912 2940
2913 child->setParent(0); 2941 child->setParent(0);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2951 return; 2979 return;
2952 page->chromeClient().setCursor(cursor); 2980 page->chromeClient().setCursor(cursor);
2953 } 2981 }
2954 2982
2955 void FrameView::frameRectsChanged() 2983 void FrameView::frameRectsChanged()
2956 { 2984 {
2957 TRACE_EVENT0("blink", "FrameView::frameRectsChanged"); 2985 TRACE_EVENT0("blink", "FrameView::frameRectsChanged");
2958 if (layoutSizeFixedToFrameSize()) 2986 if (layoutSizeFixedToFrameSize())
2959 setLayoutSizeInternal(frameRect().size()); 2987 setLayoutSizeInternal(frameRect().size());
2960 2988
2989 m_needsUpdateViewportVisibility = true;
2961 for (const auto& child : m_children) 2990 for (const auto& child : m_children)
2962 child->frameRectsChanged(); 2991 child->frameRectsChanged();
2963 } 2992 }
2964 2993
2965 void FrameView::setLayoutSizeInternal(const IntSize& size) 2994 void FrameView::setLayoutSizeInternal(const IntSize& size)
2966 { 2995 {
2967 if (m_layoutSize == size) 2996 if (m_layoutSize == size)
2968 return; 2997 return;
2969 2998
2970 m_layoutSize = size; 2999 m_layoutSize = size;
(...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after
3732 return ScrollBehaviorInstant; 3761 return ScrollBehaviorInstant;
3733 } 3762 }
3734 3763
3735 void FrameView::paint(GraphicsContext* context, const IntRect& rect) 3764 void FrameView::paint(GraphicsContext* context, const IntRect& rect)
3736 { 3765 {
3737 paint(context, GlobalPaintNormalPhase, rect); 3766 paint(context, GlobalPaintNormalPhase, rect);
3738 } 3767 }
3739 3768
3740 void FrameView::paint(GraphicsContext* context, const GlobalPaintFlags globalPai ntFlags, const IntRect& rect) 3769 void FrameView::paint(GraphicsContext* context, const GlobalPaintFlags globalPai ntFlags, const IntRect& rect)
3741 { 3770 {
3771 // TODO(skyostil): Remove this early-out in favor of painting cached scrollb ars.
3772 if (shouldThrottleRenderingPipeline())
3773 return;
3742 FramePainter(*this).paint(context, globalPaintFlags, rect); 3774 FramePainter(*this).paint(context, globalPaintFlags, rect);
3743 } 3775 }
3744 3776
3745 void FrameView::paintContents(GraphicsContext* context, const GlobalPaintFlags g lobalPaintFlags, const IntRect& damageRect) 3777 void FrameView::paintContents(GraphicsContext* context, const GlobalPaintFlags g lobalPaintFlags, const IntRect& damageRect)
3746 { 3778 {
3779 if (shouldThrottleRenderingPipeline())
3780 return;
3747 FramePainter(*this).paintContents(context, globalPaintFlags, damageRect); 3781 FramePainter(*this).paintContents(context, globalPaintFlags, damageRect);
3748 } 3782 }
3749 3783
3750 bool FrameView::isPointInScrollbarCorner(const IntPoint& windowPoint) 3784 bool FrameView::isPointInScrollbarCorner(const IntPoint& windowPoint)
3751 { 3785 {
3752 if (!scrollbarCornerPresent()) 3786 if (!scrollbarCornerPresent())
3753 return false; 3787 return false;
3754 3788
3755 IntPoint framePoint = convertFromContainingWindow(windowPoint); 3789 IntPoint framePoint = convertFromContainingWindow(windowPoint);
3756 3790
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
3924 } 3958 }
3925 3959
3926 void FrameView::collectFrameTimingRequests(GraphicsLayerFrameTimingRequests& gra phicsLayerTimingRequests) 3960 void FrameView::collectFrameTimingRequests(GraphicsLayerFrameTimingRequests& gra phicsLayerTimingRequests)
3927 { 3961 {
3928 if (!m_frame->isLocalFrame()) 3962 if (!m_frame->isLocalFrame())
3929 return; 3963 return;
3930 Frame* frame = m_frame.get(); 3964 Frame* frame = m_frame.get();
3931 LocalFrame* localFrame = toLocalFrame(frame); 3965 LocalFrame* localFrame = toLocalFrame(frame);
3932 LayoutRect viewRect = localFrame->contentLayoutObject()->viewRect(); 3966 LayoutRect viewRect = localFrame->contentLayoutObject()->viewRect();
3933 const LayoutBoxModelObject* paintInvalidationContainer = localFrame->content LayoutObject()->containerForPaintInvalidation(); 3967 const LayoutBoxModelObject* paintInvalidationContainer = localFrame->content LayoutObject()->containerForPaintInvalidation();
3968 // If the frame is being throttled, its compositing state may not be up to d ate.
3969 if (!paintInvalidationContainer->enclosingLayer()->isAllowedToQueryCompositi ngState())
3970 return;
3934 const GraphicsLayer* graphicsLayer = paintInvalidationContainer->enclosingLa yer()->graphicsLayerBacking(); 3971 const GraphicsLayer* graphicsLayer = paintInvalidationContainer->enclosingLa yer()->graphicsLayerBacking();
3935 3972
3936 if (!graphicsLayer) 3973 if (!graphicsLayer)
3937 return; 3974 return;
3938 3975
3939 DeprecatedPaintLayer::mapRectToPaintInvalidationBacking(localFrame->contentL ayoutObject(), paintInvalidationContainer, viewRect); 3976 DeprecatedPaintLayer::mapRectToPaintInvalidationBacking(localFrame->contentL ayoutObject(), paintInvalidationContainer, viewRect);
3940 3977
3941 graphicsLayerTimingRequests.add(graphicsLayer, Vector<std::pair<int64_t, Web Rect>>()).storedValue->value.append(std::make_pair(m_frame->frameID(), enclosing IntRect(viewRect))); 3978 graphicsLayerTimingRequests.add(graphicsLayer, Vector<std::pair<int64_t, Web Rect>>()).storedValue->value.append(std::make_pair(m_frame->frameID(), enclosing IntRect(viewRect)));
3942 } 3979 }
3943 3980
3981 void FrameView::updateViewportVisibilityIfNeeded()
3982 {
3983 // TODO(skyostil): Replace this with an intersection observer.
3984
3985 // Without slimming paint v2 we can sometimes end up back in LayoutClean
3986 // during painting (e.g., because of block selection gaps).
esprehn 2015/09/21 21:27:20 huh?
Sami 2015/09/23 18:31:07 Yeah :( I found out that block selections can inva
3987 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
3988 ASSERT(shouldThrottleRenderingPipeline() || lifecycle().state() >= Docum entLifecycle::PaintInvalidationClean);
3989 else
3990 ASSERT(shouldThrottleRenderingPipeline() || lifecycle().state() >= Docum entLifecycle::LayoutClean);
3991 if (!m_needsUpdateViewportVisibility)
3992 return;
3993
3994 // Our frame's bounds in our parent's content coordinates.
3995 m_clippedBounds = frameRect();
3996 m_viewportVisibility = ViewportVisibility::Visible;
3997 m_needsUpdateViewportVisibility = false;
3998
3999 FrameView* parent = parentFrameView();
4000 if (!parent)
4001 return;
4002 ASSERT(!parent->m_needsUpdateViewportVisibility);
4003
4004 // If our parent is hidden, then we are too.
4005 if (parent->m_viewportVisibility == ViewportVisibility::Hidden) {
4006 m_viewportVisibility = ViewportVisibility::Hidden;
4007 return;
4008 }
4009
4010 // Transform our bounds into the root frame's content coordinate space.
4011 m_clippedBounds = parent->contentsToRootFrame(m_clippedBounds);
4012
4013 // TODO(skyostil): Expand the viewport to make it less likely to see stale c ontent while scrolling.
4014 IntRect viewport = parent->m_clippedBounds;
4015 m_clippedBounds.intersect(viewport);
4016
4017 // If our bounds got clipped away, we are invisible.
4018 if (m_clippedBounds.isEmpty())
4019 m_viewportVisibility = ViewportVisibility::Hidden;
4020 }
4021
4022 void FrameView::updateThrottling()
4023 {
4024 ASSERT(m_frame->isLocalRoot());
4025 updateThrottlingRecursive(SecurityOriginStatus::IsSameOrigin);
4026 }
4027
4028 void FrameView::updateThrottlingRecursive(SecurityOriginStatus securityOriginSta tus)
4029 {
4030 ASSERT(!isInPerformLayout());
4031 // Without slimming paint v2 we can sometimes end up back in LayoutClean
4032 // during painting (e.g., because of block selection gaps).
4033 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
4034 ASSERT(shouldThrottleRenderingPipeline() || lifecycle().state() >= Docum entLifecycle::PaintInvalidationClean);
4035 else
4036 ASSERT(shouldThrottleRenderingPipeline() || lifecycle().state() >= Docum entLifecycle::LayoutClean);
4037 bool wasThrottled = shouldThrottleRenderingPipeline();
4038
4039 updateViewportVisibilityIfNeeded();
4040
4041 // We only throttle the rendering pipeline in cross-origin frames. This is
4042 // to avoid a situation where an ancestor frame directly depends on the
4043 // pipeline timing of a descendant and breaks as a result of throttling.
4044 // The rationale is that cross-origin frames must already communicate with
4045 // asynchronous messages, so they should be able to tolerate some delay in
4046 // receiving replies from a throttled peer.
4047 //
4048 // Check if we can access our parent's security origin. As an optimization
4049 // only do this if we are invisible.
4050 if (securityOriginStatus == SecurityOriginStatus::IsSameOrigin
4051 && parentFrameView() && m_viewportVisibility == ViewportVisibility::Hidd en) {
4052 const SecurityOrigin* origin = frame().securityContext()->securityOrigin ();
4053 const SecurityOrigin* parentOrigin = parentFrameView()->frame().security Context()->securityOrigin();
4054 if (!origin->canAccess(parentOrigin))
4055 securityOriginStatus = SecurityOriginStatus::IsCrossOrigin;
4056 }
4057 m_securityOriginStatusForThrottling = securityOriginStatus;
4058
4059 bool becameUnthrottled = wasThrottled && !shouldThrottleRenderingPipeline();
4060 if (becameUnthrottled)
4061 page()->animator().scheduleVisualUpdate(m_frame.get());
4062
4063 for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree ().nextSibling()) {
4064 if (!child->isLocalFrame())
4065 continue;
4066 if (FrameView* view = toLocalFrame(child)->view())
4067 view->updateThrottlingRecursive(securityOriginStatus);
4068 }
4069 }
4070
4071 bool FrameView::shouldThrottleStyleLayoutAndCompositingUpdates() const
4072 {
4073 return lifecycle().throttlingMode() == DocumentLifecycle::ThrottlingMode::Al low
4074 && shouldThrottleRenderingPipeline();
4075 }
4076
4077 bool FrameView::shouldThrottleRenderingPipeline() const
4078 {
4079 if (!RuntimeEnabledFeatures::renderingPipelineThrottlingEnabled())
4080 return false;
4081 return m_viewportVisibility == ViewportVisibility::Hidden
4082 && m_securityOriginStatusForThrottling == SecurityOriginStatus::IsCrossO rigin;
4083 }
4084
3944 } // namespace blink 4085 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698