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

Unified Diff: Source/web/tests/WebViewTest.cpp

Issue 908453003: Blink changes to record interest rects for http://w3c.github.io/frame-timing/ (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Code review comments Created 5 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: Source/web/tests/WebViewTest.cpp
diff --git a/Source/web/tests/WebViewTest.cpp b/Source/web/tests/WebViewTest.cpp
index 1831bbe43c06effba0934b0b0e87fa47c335c3e9..11efa38853defe8d10b7b006c1397ac4b35585eb 100644
--- a/Source/web/tests/WebViewTest.cpp
+++ b/Source/web/tests/WebViewTest.cpp
@@ -45,11 +45,15 @@
#include "core/html/HTMLInputElement.h"
#include "core/html/HTMLTextAreaElement.h"
#include "core/layout/LayoutView.h"
+#include "core/loader/DocumentLoader.h"
#include "core/loader/FrameLoadRequest.h"
#include "core/page/Chrome.h"
#include "core/page/Page.h"
#include "core/paint/DeprecatedPaintLayer.h"
#include "core/paint/DeprecatedPaintLayerPainter.h"
+#include "core/timing/DOMWindowPerformance.h"
+#include "core/timing/Performance.h"
+#include "core/timing/PerformanceCompositeTiming.h"
#include "platform/KeyboardCodes.h"
#include "platform/UserGestureIndicator.h"
#include "platform/geometry/IntSize.h"
@@ -91,6 +95,7 @@
using namespace blink;
using blink::FrameTestHelpers::loadFrame;
using blink::URLTestHelpers::toKURL;
+using blink::URLTestHelpers::registerMockedURLLoad;
using blink::testing::runPendingTasks;
namespace {
@@ -2750,4 +2755,235 @@ TEST_F(WebViewTest, ShowUnhandledTapUIIfNeededWithPreventDefault)
m_webViewHelper.reset(); // Remove dependency on locally scoped client.
}
+// Test 3 frames, all on the same layer (i.e. [1 2 3])
+TEST_F(WebViewTest, TestPushFrameTimingRequestRectsToGraphicsLayer1)
+{
+ std::string url = m_baseURL + "frame_timing_inner.html?100px:100px";
+ registerMockedURLLoad(toKURL(url), "frame_timing_inner.html");
+ url = m_baseURL + "frame_timing_inner.html?200px:200px";
+ registerMockedURLLoad(toKURL(url), "frame_timing_inner.html");
+ url = m_baseURL + "frame_timing_inner.html?300px:300px";
+ registerMockedURLLoad(toKURL(url), "frame_timing_inner.html");
+ url = m_baseURL + "frame_timing_1.html";
+ registerMockedURLLoad(toKURL(url), "frame_timing_1.html");
+
+ WebView* webView = m_webViewHelper.initialize(true);
+ loadFrame(webView->mainFrame(), url);
+
+ webView->resize(WebSize(800, 600));
+ webView->layout();
+
+ WebViewImpl* webViewImpl = toWebViewImpl(webView);
+
+ Frame* frame = webViewImpl->page()->mainFrame();
+ int64_t id = frame->frameID();
+
+ EXPECT_EQ(3u, frame->tree().childCount());
+
+ WebVector<std::pair<int64_t, WebRect>> frameTimingRequests =
+ toLocalFrame(frame)->document()
+ ->layoutView()->enclosingLayer()
+ ->enclosingLayerForPaintInvalidationCrossingFrameBoundaries()
+ ->graphicsLayerBacking()->platformLayer()->frameTimingRequests();
+
+ EXPECT_EQ(4u, frameTimingRequests.size());
+ EXPECT_EQ(id + 0, frameTimingRequests[0].first);
+ EXPECT_EQ(WebRect(0, 0, 800, 600), frameTimingRequests[0].second);
+ EXPECT_EQ(id + 1, frameTimingRequests[1].first);
+ EXPECT_EQ(WebRect(2, 2, 100, 100), frameTimingRequests[1].second);
+ EXPECT_EQ(id + 2, frameTimingRequests[2].first);
+ EXPECT_EQ(WebRect(106, 2, 200, 200), frameTimingRequests[2].second);
+ EXPECT_EQ(id + 3, frameTimingRequests[3].first);
+ EXPECT_EQ(WebRect(310, 2, 300, 300), frameTimingRequests[3].second);
+}
+
+// Test 3 frames, where frame 2 is on a different GraphicsLayer (i.e. [1 2' 3])
+TEST_F(WebViewTest, TestPushFrameTimingRequestRectsToGraphicsLayer2)
+{
+ std::string url = m_baseURL + "frame_timing_inner.html?100px:100px";
+ registerMockedURLLoad(toKURL(url), "frame_timing_inner.html");
+ url = m_baseURL + "frame_timing_inner.html?200px:200px";
+ registerMockedURLLoad(toKURL(url), "frame_timing_inner.html");
+ url = m_baseURL + "frame_timing_inner.html?300px:300px";
+ registerMockedURLLoad(toKURL(url), "frame_timing_inner.html");
+ url = m_baseURL + "frame_timing_2.html";
+ registerMockedURLLoad(toKURL(url), "frame_timing_2.html");
+
+ WebView* webView = m_webViewHelper.initialize(true);
+ loadFrame(webView->mainFrame(), url);
+
+ webView->resize(WebSize(800, 600));
+ webView->layout();
+
+ WebViewImpl* webViewImpl = toWebViewImpl(webView);
+
+ Frame* frame = webViewImpl->page()->mainFrame();
+ int64_t id = frame->frameID();
+
+ EXPECT_EQ(3u, frame->tree().childCount());
+
+ const WebLayer* graphicsLayer1 =
+ toLocalFrame(webViewImpl->page()->mainFrame())->document()
+ ->layoutView()->enclosingLayer()
+ ->enclosingLayerForPaintInvalidationCrossingFrameBoundaries()
+ ->graphicsLayerBacking()->platformLayer();
+ WebVector<std::pair<int64_t, WebRect>> frameTimingRequests1 =
+ graphicsLayer1->frameTimingRequests();
+
+ EXPECT_EQ(3u, frameTimingRequests1.size());
+ EXPECT_EQ(id + 0, frameTimingRequests1[0].first);
+ EXPECT_EQ(WebRect(0, 0, 800, 600), frameTimingRequests1[0].second);
+ EXPECT_EQ(id + 1, frameTimingRequests1[1].first);
+ EXPECT_EQ(WebRect(2, 2, 100, 100), frameTimingRequests1[1].second);
+ EXPECT_EQ(id + 3, frameTimingRequests1[2].first);
+ EXPECT_EQ(WebRect(310, 2, 300, 300), frameTimingRequests1[2].second);
+
+ const WebLayer* graphicsLayer2 = nullptr;
+ for (Frame* frame = webViewImpl->page()->mainFrame(); frame;
+ frame = frame->tree().traverseNext()) {
+ graphicsLayer2 = toLocalFrame(frame)->document()->layoutView()
+ ->enclosingLayer()
+ ->enclosingLayerForPaintInvalidationCrossingFrameBoundaries()
+ ->graphicsLayerBacking()->platformLayer();
+ if (graphicsLayer2 != graphicsLayer1)
+ break;
+ }
+ WebVector<std::pair<int64_t, WebRect>> frameTimingRequests2 =
+ graphicsLayer2->frameTimingRequests();
+ EXPECT_EQ(1u, frameTimingRequests2.size());
+ EXPECT_EQ(id + 2, frameTimingRequests2[0].first);
+ EXPECT_EQ(WebRect(2, 2, 200, 200), frameTimingRequests2[0].second);
+}
+
+
+// Test nested frames (i.e. [1 2'[4 5'] 3])
+TEST_F(WebViewTest, TestPushFrameTimingRequestRectsToGraphicsLayer3)
+{
+ std::string url = m_baseURL + "frame_timing_inner.html?100px:100px";
+ registerMockedURLLoad(toKURL(url), "frame_timing_inner.html");
+ url = m_baseURL + "frame_timing_inner.html?200px:200px";
+ registerMockedURLLoad(toKURL(url), "frame_timing_inner.html");
+ url = m_baseURL + "frame_timing_inner.html?300px:300px";
+ registerMockedURLLoad(toKURL(url), "frame_timing_inner.html");
+ url = m_baseURL + "frame_timing_b.html";
+ registerMockedURLLoad(toKURL(url), "frame_timing_b.html");
+ url = m_baseURL + "frame_timing_3.html";
+ registerMockedURLLoad(toKURL(url), "frame_timing_3.html");
+
+ WebView* webView = m_webViewHelper.initialize(true);
+ loadFrame(webView->mainFrame(), url);
+
+ webView->resize(WebSize(800, 600));
+ webView->layout();
+
+ WebViewImpl* webViewImpl = toWebViewImpl(webView);
+
+ Frame* frame = webViewImpl->page()->mainFrame();
+ int64_t id = frame->frameID();
+
+ EXPECT_EQ(3u, frame->tree().childCount());
+
+ const WebLayer* graphicsLayer1 =
+ toLocalFrame(webViewImpl->page()->mainFrame())->document()
+ ->layoutView()->enclosingLayer()
+ ->enclosingLayerForPaintInvalidationCrossingFrameBoundaries()
+ ->graphicsLayerBacking()->platformLayer();
+ WebVector<std::pair<int64_t, WebRect>> frameTimingRequests1 =
+ graphicsLayer1->frameTimingRequests();
+
+ EXPECT_EQ(3u, frameTimingRequests1.size());
+ EXPECT_EQ(id + 0, frameTimingRequests1[0].first);
+ EXPECT_EQ(WebRect(0, 0, 800, 600), frameTimingRequests1[0].second);
+ EXPECT_EQ(WebRect(2, 2, 100, 100), frameTimingRequests1[1].second);
+ EXPECT_EQ(WebRect(410, 2, 200, 200), frameTimingRequests1[2].second);
+
+ const WebLayer* graphicsLayer2 = nullptr;
+ for (Frame* frame = webViewImpl->page()->mainFrame(); frame;
+ frame = frame->tree().traverseNext()) {
+ graphicsLayer2 = toLocalFrame(frame)->document()->layoutView()
+ ->enclosingLayer()
+ ->enclosingLayerForPaintInvalidationCrossingFrameBoundaries()
+ ->graphicsLayerBacking()->platformLayer();
+ if (graphicsLayer2 != graphicsLayer1)
+ break;
+ }
+ WebVector<std::pair<int64_t, WebRect>> frameTimingRequests2 =
+ graphicsLayer2->frameTimingRequests();
+ EXPECT_EQ(2u, frameTimingRequests2.size());
+ EXPECT_EQ(WebRect(0, 0, 300, 300), frameTimingRequests2[0].second);
+ EXPECT_EQ(WebRect(2, 2, 100, 100), frameTimingRequests2[1].second);
+
+ const WebLayer* graphicsLayer3 = nullptr;
+ for (Frame* frame = webViewImpl->page()->mainFrame(); frame;
+ frame = frame->tree().traverseNext()) {
+ graphicsLayer3 = toLocalFrame(frame)->document()->layoutView()
+ ->enclosingLayer()
+ ->enclosingLayerForPaintInvalidationCrossingFrameBoundaries()
+ ->graphicsLayerBacking()->platformLayer();
+ if (graphicsLayer3 != graphicsLayer1 && graphicsLayer3 != graphicsLayer2)
+ break;
+ }
+ WebVector<std::pair<int64_t, WebRect>> frameTimingRequests3 =
+ graphicsLayer3->frameTimingRequests();
+ EXPECT_EQ(1u, frameTimingRequests3.size());
+ EXPECT_EQ(WebRect(2, 2, 100, 100), frameTimingRequests3[0].second);
+}
+
+// Test 3 frames, all on the same layer (i.e. [1 2 3])
+TEST_F(WebViewTest, TestRecordFrameTimingEvents)
+{
+ std::string url = m_baseURL + "frame_timing_inner.html?100px:100px";
+ registerMockedURLLoad(toKURL(url), "frame_timing_inner.html");
+ url = m_baseURL + "frame_timing_inner.html?200px:200px";
+ registerMockedURLLoad(toKURL(url), "frame_timing_inner.html");
+ url = m_baseURL + "frame_timing_inner.html?300px:300px";
+ registerMockedURLLoad(toKURL(url), "frame_timing_inner.html");
+ url = m_baseURL + "frame_timing_1.html";
+ registerMockedURLLoad(toKURL(url), "frame_timing_1.html");
+
+ WebView* webView = m_webViewHelper.initialize(true);
+ loadFrame(webView->mainFrame(), url);
+
+ webView->resize(WebSize(800, 600));
+ webView->layout();
+
+ WebViewImpl* webViewImpl = toWebViewImpl(webView);
+
+ Frame* frame = webViewImpl->page()->mainFrame();
+ int64_t id = frame->frameID();
+
+ std::vector<std::pair<int, double>> compositePairs = {
+ std::make_pair(1, 2.0), std::make_pair(2, 3.0), std::make_pair(3, 4.0)
+ };
+ WebVector<std::pair<int, double>> compositeEvents(compositePairs);
+ webViewImpl->recordFrameTimingEvent(WebView::CompositeEvent, id, compositeEvents);
+ PerformanceEntryVector composites = DOMWindowPerformance::performance(*frame->domWindow())->getEntriesByType("composite");
+ PerformanceEntryVector renders = DOMWindowPerformance::performance(*frame->domWindow())->getEntriesByType("render");
+ ASSERT_EQ(3ul, composites.size());
+ ASSERT_EQ(0ul, renders.size());
+ for (size_t i = 0; i < composites.size(); ++i) {
+ double docTime = frame->domWindow()->document()->loader()->timing().monotonicTimeToZeroBasedDocumentTime(compositePairs[i].second) * 1000.0;
+ ASSERT_EQ(docTime, composites[i]->startTime());
+ }
+
+ // Skip ahead to subframe 2.
+ frame = frame->tree().traverseNext();
+ frame = frame->tree().traverseNext();
+ id += 2;
+
+ std::vector<std::pair<int, double>> renderPairs = {
+ std::make_pair(4, 5.0), std::make_pair(5, 6.0), std::make_pair(6, 7.0),
+ std::make_pair(7, 8.0) };
+ WebVector<std::pair<int, double>> renderEvents(renderPairs);
+ webViewImpl->recordFrameTimingEvent(WebView::RenderEvent, id, renderEvents);
+ composites = DOMWindowPerformance::performance(*frame->domWindow())->getEntriesByType("composite");
+ renders = DOMWindowPerformance::performance(*frame->domWindow())->getEntriesByType("render");
+ ASSERT_EQ(0ul, composites.size());
+ ASSERT_EQ(4ul, renders.size());
+ for (size_t i = 0; i < renders.size(); ++i) {
+ double docTime = frame->domWindow()->document()->loader()->timing().monotonicTimeToZeroBasedDocumentTime(renderPairs[i].second) * 1000.0;
+ ASSERT_DOUBLE_EQ(docTime, renders[i]->startTime());
+ }
+}
+
} // namespace

Powered by Google App Engine
This is Rietveld 408576698