1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "web/tests/sim/SimCompositor.h"
8 #include "core/frame/FrameView.h"
9 #include "core/layout/LayoutView.h"
10 #include "core/layout/compositing/CompositedDeprecatedPaintLayerMapping.h"
11 #include "core/paint/DeprecatedPaintLayer.h"
12 #include "platform/graphics/ContentLayerDelegate.h"
13 #include "public/platform/WebRect.h"
14 #include "web/WebLocalFrameImpl.h"
15 #include "web/WebViewImpl.h"
16 #include "web/tests/sim/SimDisplayItemList.h"
17 #include "web/tests/sim/SimLayerTreeView.h"
18 #include "wtf/CurrentTime.h"
22 static void paintLayers(DeprecatedPaintLayer
& layer
, SimDisplayItemList
& displayList
)
24 if (layer
.compositingState() == PaintsIntoOwnBacking
) {
25 CompositedDeprecatedPaintLayerMapping
* mapping
= layer
.compositedDeprecatedPaintLayerMapping();
26 GraphicsLayer
* graphicsLayer
= mapping
->mainGraphicsLayer();
27 if (graphicsLayer
->hasTrackedPaintInvalidations()) {
28 ContentLayerDelegate
* delegate
= graphicsLayer
->contentLayerDelegateForTesting();
29 delegate
->paintContents(&displayList
, WebRect(0, 0, layer
.size().width(), layer
.size().height()));
30 graphicsLayer
->resetTrackedPaintInvalidations();
33 for (DeprecatedPaintLayer
* child
= layer
.firstChild(); child
; child
= child
->nextSibling())
34 paintLayers(*child
, displayList
);
37 static void paintFrames(LocalFrame
& root
, SimDisplayItemList
& displayList
)
39 for (Frame
* frame
= &root
; frame
; frame
= frame
->tree().traverseNext(&root
)) {
40 if (!frame
->isLocalFrame())
42 DeprecatedPaintLayer
* layer
= toLocalFrame(frame
)->view()->layoutView()->layer();
43 paintLayers(*layer
, displayList
);
47 SimCompositor::SimCompositor(SimLayerTreeView
& layerTreeView
)
48 : m_layerTreeView(&layerTreeView
)
50 , m_lastFrameTimeMonotonic(0)
52 FrameView::setInitialTracksPaintInvalidationsForTesting(true);
53 // Disable the debug red fill so the output display list doesn't differ in
54 // size in Release vs Debug builds.
55 GraphicsLayer::setDrawDebugRedFillForTesting(false);
58 SimCompositor::~SimCompositor()
60 FrameView::setInitialTracksPaintInvalidationsForTesting(false);
61 GraphicsLayer::setDrawDebugRedFillForTesting(true);
64 void SimCompositor::setWebViewImpl(WebViewImpl
& webViewImpl
)
66 m_webViewImpl
= &webViewImpl
;
69 SimDisplayItemList
SimCompositor::beginFrame()
71 ASSERT(m_webViewImpl
);
72 ASSERT(!m_layerTreeView
->deferCommits());
73 ASSERT(m_layerTreeView
->needsAnimate());
75 // Always advance the time as if the compositor was running at 60fps.
76 m_lastFrameTimeMonotonic
= monotonicallyIncreasingTime() + 0.016;
78 WebBeginFrameArgs
args(m_lastFrameTimeMonotonic
, 0, 0);
79 m_webViewImpl
->beginFrame(args
);
80 m_webViewImpl
->layout();
82 LocalFrame
* root
= m_webViewImpl
->mainFrameImpl()->frame();
84 SimDisplayItemList displayList
;
85 paintFrames(*root
, displayList
);
87 m_layerTreeView
->clearNeedsAnimate();