| Index: tools/perf/perf_tools/scroll.js
|
| diff --git a/tools/perf/perf_tools/scroll.js b/tools/perf/perf_tools/scroll.js
|
| deleted file mode 100644
|
| index 6863cee82464b5a9886ac44ceae4227b57e6e577..0000000000000000000000000000000000000000
|
| --- a/tools/perf/perf_tools/scroll.js
|
| +++ /dev/null
|
| @@ -1,252 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -// Inject this script on any page to measure framerate as the page is scrolled
|
| -// from top to bottom.
|
| -//
|
| -// Usage:
|
| -// 1. Define a callback that takes a RenderingStats object as a parameter.
|
| -// 2. To start the test, call new __ScrollTest(callback).
|
| -// 3a. When the test is complete, the callback will be called.
|
| -// 3b. If no callback is specified, the results is sent to the console.
|
| -
|
| -(function() {
|
| - var getTimeMs = (function() {
|
| - if (window.performance)
|
| - return (performance.now ||
|
| - performance.mozNow ||
|
| - performance.msNow ||
|
| - performance.oNow ||
|
| - performance.webkitNow).bind(window.performance);
|
| - else
|
| - return function() { return new Date().getTime(); };
|
| - })();
|
| -
|
| - var requestAnimationFrame = (function() {
|
| - return window.requestAnimationFrame ||
|
| - window.webkitRequestAnimationFrame ||
|
| - window.mozRequestAnimationFrame ||
|
| - window.oRequestAnimationFrame ||
|
| - window.msRequestAnimationFrame ||
|
| - function(callback) {
|
| - window.setTimeout(callback, 1000 / 60);
|
| - };
|
| - })().bind(window);
|
| -
|
| - /**
|
| - * Scrolls a given element down a certain amount to emulate user scrolling.
|
| - * Uses smooth scrolling capabilities provided by the platform, if available.
|
| - * @constructor
|
| - */
|
| - function SmoothScrollDownGesture(opt_element) {
|
| - this.element_ = opt_element || document.body;
|
| - };
|
| -
|
| - function min(a, b) {
|
| - if (a > b) {
|
| - return b;
|
| - }
|
| - return a;
|
| - };
|
| -
|
| - function getBoundingVisibleRect(el) {
|
| - r = el.getBoundingClientRect();
|
| - cur = el;
|
| - while (cur && cur.parentElement) {
|
| - r.top += cur.parentElement.offsetTop;
|
| - r.left += cur.parentElement.offsetLeft;
|
| - r.height = min(r.height, cur.parentElement.offsetHeight);
|
| - r.width = min(r.width, cur.parentElement.offsetWidth);
|
| - cur = cur.parentElement;
|
| - }
|
| - return r;
|
| - };
|
| -
|
| - function rectsDoIntersect(r1, r2) {
|
| - return (r1.right >= r2.left &&
|
| - r1.left <= r2.right &&
|
| - r1.bottom >= r2.top &&
|
| - r1.top <= r2.bottom);
|
| - };
|
| -
|
| - SmoothScrollDownGesture.prototype.start = function(callback) {
|
| - this.callback_ = callback;
|
| - if (chrome &&
|
| - chrome.gpuBenchmarking &&
|
| - chrome.gpuBenchmarking.beginSmoothScrollDown) {
|
| - rect = getBoundingVisibleRect(this.element_);
|
| - if (chrome.gpuBenchmarking.beginSmoothScrollSupportsPositioning ||
|
| - rectsDoIntersect(rect, {left: 0,
|
| - top: 0,
|
| - right: 1,
|
| - bottom: 1,
|
| - height: 1,
|
| - width: 1})) {
|
| - chrome.gpuBenchmarking.beginSmoothScrollDown(true, function() {
|
| - callback();
|
| - }, rect.left + rect.width / 2, rect.top + rect.height / 2);
|
| - return;
|
| - }
|
| - }
|
| -
|
| - var SCROLL_DELTA = 100;
|
| - this.element_.scrollTop += SCROLL_DELTA;
|
| - requestAnimationFrame(callback);
|
| - };
|
| -
|
| - /**
|
| - * Tracks rendering performance using the gpuBenchmarking.renderingStats API.
|
| - * @constructor
|
| - */
|
| - function GpuBenchmarkingRenderingStats() {
|
| - }
|
| -
|
| - GpuBenchmarkingRenderingStats.prototype.start = function() {
|
| - this.initialStats_ = this.getRenderingStats_();
|
| - }
|
| - GpuBenchmarkingRenderingStats.prototype.stop = function() {
|
| - this.finalStats_ = this.getRenderingStats_();
|
| - }
|
| -
|
| - GpuBenchmarkingRenderingStats.prototype.getDeltas = function() {
|
| - if (!this.initialStats_)
|
| - throw new Error('Start not called.');
|
| -
|
| - if (!this.finalStats_)
|
| - throw new Error('Stop was not called.');
|
| -
|
| - var stats = this.finalStats_;
|
| - for (var key in stats)
|
| - stats[key] -= this.initialStats_[key];
|
| - return stats;
|
| - };
|
| -
|
| - GpuBenchmarkingRenderingStats.prototype.getRenderingStats_ = function() {
|
| - var stats = chrome.gpuBenchmarking.renderingStats();
|
| - stats.totalTimeInSeconds = getTimeMs() / 1000;
|
| - return stats;
|
| - };
|
| -
|
| - /**
|
| - * Tracks rendering performance using requestAnimationFrame.
|
| - * @constructor
|
| - */
|
| - function RafRenderingStats() {
|
| - this.recording_ = false;
|
| - this.frameTimes_ = [];
|
| - }
|
| -
|
| - RafRenderingStats.prototype.start = function() {
|
| - if (this.recording_)
|
| - throw new Error('Already started.');
|
| - this.recording_ = true;
|
| - requestAnimationFrame(this.recordFrameTime_.bind(this));
|
| - }
|
| -
|
| - RafRenderingStats.prototype.stop = function() {
|
| - this.recording_ = false;
|
| - }
|
| -
|
| - RafRenderingStats.prototype.getDeltas = function() {
|
| - var results = {};
|
| - results.numAnimationFrames = this.frameTimes_.length - 1;
|
| - results.numFramesSentToScreen = results.numAnimationFrames;
|
| - results.droppedFrameCount = this.getDroppedFrameCount_(this.frameTimes_);
|
| - results.totalTimeInSeconds = (
|
| - this.frameTimes_[this.frameTimes_.length - 1] -
|
| - this.frameTimes_[0]) / 1000;
|
| - return results;
|
| - };
|
| -
|
| - RafRenderingStats.prototype.recordFrameTime_ = function(timestamp) {
|
| - if (!this.recording_)
|
| - return;
|
| -
|
| - this.frameTimes_.push(timestamp);
|
| - requestAnimationFrame(this.recordFrameTime_.bind(this));
|
| - };
|
| -
|
| - RafRenderingStats.prototype.getDroppedFrameCount_ = function(frameTimes) {
|
| - var droppedFrameCount = 0;
|
| - for (var i = 1; i < frameTimes.length; i++) {
|
| - var frameTime = frameTimes[i] - frameTimes[i-1];
|
| - if (frameTime > 1000 / 55)
|
| - droppedFrameCount++;
|
| - }
|
| - return droppedFrameCount;
|
| - };
|
| -
|
| - // This class scrolls a page from the top to the bottom once.
|
| - //
|
| - // The page is scrolled down by a set of scroll gestures. These gestures
|
| - // correspond to a reading gesture on that platform.
|
| - //
|
| - // start -> startPass_ -> ...scrolling... -> onGestureComplete_ ->
|
| - // -> startPass_ -> .. scrolling... -> onGestureComplete_ -> callback_
|
| - function ScrollTest(opt_callback) {
|
| - var self = this;
|
| -
|
| - this.callback_ = opt_callback;
|
| - }
|
| -
|
| - ScrollTest.prototype.start = function(opt_element) {
|
| - // Assign this.element_ here instead of constructor, because the constructor
|
| - // ensures this method will be called after the document is loaded.
|
| - this.element_ = opt_element || document.body;
|
| - // Some pages load more content when you scroll to the bottom. Record
|
| - // the original element height here and only scroll to that point.
|
| - this.scrollHeight_ = this.element_.scrollHeight
|
| - requestAnimationFrame(this.startPass_.bind(this));
|
| - };
|
| -
|
| - ScrollTest.prototype.startPass_ = function() {
|
| - this.element_.scrollTop = 0;
|
| - if (window.chrome && chrome.gpuBenchmarking &&
|
| - chrome.gpuBenchmarking.renderingStats)
|
| - this.renderingStats_ = new GpuBenchmarkingRenderingStats();
|
| - else
|
| - this.renderingStats_ = new RafRenderingStats();
|
| - this.renderingStats_.start();
|
| -
|
| - this.gesture_ = new SmoothScrollDownGesture(this.element_);
|
| - this.gesture_.start(this.onGestureComplete_.bind(this));
|
| - };
|
| -
|
| - ScrollTest.prototype.onGestureComplete_ = function(timestamp) {
|
| - // clientHeight is "special" for the body element.
|
| - var clientHeight;
|
| - if (this.element_ == document.body)
|
| - clientHeight = window.innerHeight;
|
| - else
|
| - clientHeight = this.element_.clientHeight;
|
| -
|
| - // If the scrollHeight went down, only scroll to the new scrollHeight.
|
| - this.scrollHeight_ = Math.min(this.scrollHeight_,
|
| - this.element_.scrollHeight);
|
| -
|
| - // -1 to allow for rounding errors on scaled viewports (like mobile).
|
| - var isPassComplete =
|
| - this.element_.scrollTop + clientHeight >= this.scrollHeight_ - 1;
|
| -
|
| - if (!isPassComplete) {
|
| - this.gesture_.start(this.onGestureComplete_.bind(this));
|
| - return;
|
| - }
|
| -
|
| - this.endPass_();
|
| -
|
| - // We're done.
|
| - if (this.callback_)
|
| - this.callback_(this.renderingStats_.getDeltas());
|
| - else
|
| - console.log(this.renderingStats_.getDeltas());
|
| - };
|
| -
|
| - ScrollTest.prototype.endPass_ = function() {
|
| - this.renderingStats_.stop();
|
| - };
|
| -
|
| -
|
| - window.__ScrollTest = ScrollTest;
|
| -})();
|
|
|