| Index: content/browser/resources/media/new/render_manager.js
|
| diff --git a/content/browser/resources/media/new/render_manager.js b/content/browser/resources/media/new/render_manager.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..009b9de69fc69477042ffa01157682bcf0864729
|
| --- /dev/null
|
| +++ b/content/browser/resources/media/new/render_manager.js
|
| @@ -0,0 +1,191 @@
|
| +// 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.
|
| +
|
| +
|
| +var RenderManager = (function () {
|
| + "use strict";
|
| +
|
| +
|
| + function timer(millis) {
|
| + var lastTime = (new Date()).getTime();
|
| +
|
| + // A function that if called will return true
|
| + // if |millis| time has passed. If so, it resets
|
| + // to be used again.
|
| + var toReturn = function () {
|
| + var curTime = (new Date()).getTime();
|
| + if (curTime - lastTime >= millis) {
|
| + lastTime = curTime;
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| + };
|
| +
|
| + // Forces the next call to the timer to succeeded.
|
| + toReturn.trigger = function () {
|
| + lastTime -= millis;
|
| + return toReturn;
|
| + };
|
| +
|
| + // The timer is reset.
|
| + toReturn.postpone = function () {
|
| + lastTime = (new Date()).getTime();
|
| + return toReturn;
|
| + };
|
| +
|
| + // The original time that the timer is set for.
|
| + toReturn.time = millis;
|
| +
|
| + return toReturn;
|
| + }
|
| +
|
| + // A painter is a class that has three methods:
|
| + // paintNew(playerInfo, div, properties)
|
| + // paintExist(playerInfo, div, properties)
|
| + // invalidate(playerInfo, properties)
|
| + // where |playerInfo| is a PlayerInfo instance, |div|
|
| + // is the div that is going to be rendered into, and
|
| + // |properties| is an object containing other properties
|
| + // that the painter might want.
|
| + function RenderManager(playerManager) {
|
| + // A model is an object that contains the following properties
|
| + this.models = {
|
| + log: {
|
| + // The name of the model (used for errors and such)
|
| + name: "log",
|
| + // The div that the model can modify anything inside of
|
| + div: document.querySelector("#log"),
|
| + // The element (if any) that could be hiding the |div|
|
| + collapse: document.querySelector("#log-wrapper>.collapse"),
|
| + // If the element needs to be completely rewritten from scratch
|
| + dirty: true,
|
| + // An object containing functions that
|
| + // write html to the inside of |div|
|
| + painter: logPainter,
|
| + // A timer for how often it should be redrawn
|
| + timer: timer(500).trigger()
|
| + },
|
| + graph: {
|
| + name: "graph",
|
| + div: document.querySelector("#graph"),
|
| + collapse: document.querySelector("#graph-wrapper>.collapse"),
|
| + dirty: true,
|
| + painter: graphPainter,
|
| + timer: timer(100).trigger()
|
| + },
|
| + prop: {
|
| + name: "prop",
|
| + div: document.querySelector("#properties"),
|
| + collapse: null,
|
| + dirty: true,
|
| + painter: propertyPainter,
|
| + timer: timer(200).trigger()
|
| + },
|
| + playerList: {
|
| + name: "player list",
|
| + div: document.querySelector("#stream"),
|
| + collapse: null,
|
| + dirty: true,
|
| + painter: playerListPainter,
|
| + timer: timer(1000).trigger()
|
| + }
|
| + };
|
| +
|
| + // All the models that contain information about a Player.
|
| + // Non-standard models include the player-list and the system properties
|
| + this.standardModels = [this.models.log, this.models.graph,
|
| + this.models.prop];
|
| +
|
| + // The id of the current player
|
| + this.cachedId = -1;
|
| + // The playerInfo instance of the current player
|
| + this.current = null;
|
| + // The playerManager that owns this class
|
| + this.playerManager = playerManager;
|
| +
|
| + // The text being used to filter logs
|
| + this.filterText = "";
|
| +
|
| + // If the user is scrolling through the log, don't update it.
|
| + this.models.log.div.parentNode.onscroll = function () {
|
| + this.models.log.timer.postpone();
|
| + }.bind(this);
|
| +
|
| + // When <enter> is pressed inside the input, set |this.filterText|.
|
| + var filterField = document.querySelector("#filter-input");
|
| + filterField.onkeydown = function (event) {
|
| + // 13 is the keyCode for <enter>
|
| + if (event.keyCode === 13) {
|
| + this.filterText = filterField.value;
|
| + // We need to trigger a repaint immediately
|
| + this.models.log.dirty = true;
|
| + this.models.log.timer.trigger();
|
| + this.update();
|
| + }
|
| + }.bind(this);
|
| + }
|
| +
|
| + // Checks to see if a collapsible div is open or not
|
| + function isOpen(div) {
|
| + // If there is no parent, we have to assume that
|
| + // this is viewable
|
| + if (!div) {
|
| + return true;
|
| + }
|
| +
|
| + return div.className.indexOf("open") !== -1;
|
| + }
|
| +
|
| + // Ran when a player is selected in the playerList
|
| + RenderManager.prototype.select = function (id) {
|
| + // If we are already viewing it, don't do anything
|
| + if (this.cachedId === id) {
|
| + return;
|
| + }
|
| + this.cachedId = id;
|
| + this.current = this.playerManager.players[id];
|
| +
|
| + // All the models need to be reset and triggered so that they
|
| + // are redrawn completely and immediately;
|
| + this.standardModels.forEach(function (m) {
|
| + m.dirty = true;
|
| + m.timer.trigger();
|
| + });
|
| + this.update();
|
| + };
|
| +
|
| + // Ran whenever a property is updated
|
| + RenderManager.prototype.update = function () {
|
| + // To get passed into the painters
|
| + var extra = {filterText: this.filterText};
|
| +
|
| + // If we are actually looking at something
|
| + if (this.current) {
|
| + this.standardModels.forEach(function (model) {
|
| + if (model.timer() && isOpen(model.collapse)) {
|
| + if (model.dirty) {
|
| + console.warn("writing " + model.name +
|
| + " from scratch.");
|
| + model.painter.paintNew(this.current, model.div, extra);
|
| + model.dirty = false;
|
| + } else {
|
| + model.painter.paintExist(this.current,
|
| + model.div, extra);
|
| + }
|
| + }
|
| + }, this);
|
| + }
|
| + };
|
| +
|
| + // Redraws the playerList
|
| + RenderManager.prototype.redrawList = function () {
|
| + var m = this.models.playerList;
|
| + var prop = {playerManager: this.playerManager};
|
| +
|
| + m.painter.paintNew(null, m.div, prop);
|
| + };
|
| +
|
| + return RenderManager;
|
| +}());
|
|
|