summaryrefslogtreecommitdiff
path: root/chromium/content/browser/resources/media/cache_entry.js
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/resources/media/cache_entry.js')
-rw-r--r--chromium/content/browser/resources/media/cache_entry.js237
1 files changed, 237 insertions, 0 deletions
diff --git a/chromium/content/browser/resources/media/cache_entry.js b/chromium/content/browser/resources/media/cache_entry.js
new file mode 100644
index 00000000000..275a8c74a50
--- /dev/null
+++ b/chromium/content/browser/resources/media/cache_entry.js
@@ -0,0 +1,237 @@
+// Copyright (c) 2011 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.
+
+cr.define('media', function() {
+ 'use strict';
+
+ /**
+ * This class represents a file cached by net.
+ */
+ function CacheEntry() {
+ this.read_ = new media.DisjointRangeSet;
+ this.written_ = new media.DisjointRangeSet;
+ this.available_ = new media.DisjointRangeSet;
+
+ // Set to true when we know the entry is sparse.
+ this.sparse = false;
+ this.key = null;
+ this.size = null;
+
+ // The <details> element representing this CacheEntry.
+ this.details_ = document.createElement('details');
+ this.details_.className = 'cache-entry';
+ this.details_.open = false;
+
+ // The <details> summary line. It contains a chart of requested file ranges
+ // and the url if we know it.
+ var summary = document.createElement('summary');
+
+ this.summaryText_ = document.createTextNode('');
+ summary.appendChild(this.summaryText_);
+
+ summary.appendChild(document.createTextNode(' '));
+
+ // Controls to modify this CacheEntry.
+ var controls = document.createElement('span');
+ controls.className = 'cache-entry-controls';
+ summary.appendChild(controls);
+ summary.appendChild(document.createElement('br'));
+
+ // A link to clear recorded data from this CacheEntry.
+ var clearControl = document.createElement('a');
+ clearControl.href = 'javascript:void(0)';
+ clearControl.onclick = this.clear.bind(this);
+ clearControl.textContent = '(clear entry)';
+ controls.appendChild(clearControl);
+
+ this.details_.appendChild(summary);
+
+ // The canvas for drawing cache writes.
+ this.writeCanvas = document.createElement('canvas');
+ this.writeCanvas.width = media.BAR_WIDTH;
+ this.writeCanvas.height = media.BAR_HEIGHT;
+ this.details_.appendChild(this.writeCanvas);
+
+ // The canvas for drawing cache reads.
+ this.readCanvas = document.createElement('canvas');
+ this.readCanvas.width = media.BAR_WIDTH;
+ this.readCanvas.height = media.BAR_HEIGHT;
+ this.details_.appendChild(this.readCanvas);
+
+ // A tabular representation of the data in the above canvas.
+ this.detailTable_ = document.createElement('table');
+ this.detailTable_.className = 'cache-table';
+ this.details_.appendChild(this.detailTable_);
+ }
+
+ CacheEntry.prototype = {
+ /**
+ * Mark a range of bytes as read from the cache.
+ * @param {int} start The first byte read.
+ * @param {int} length The number of bytes read.
+ */
+ readBytes: function(start, length) {
+ start = parseInt(start);
+ length = parseInt(length);
+ this.read_.add(start, start + length);
+ this.available_.add(start, start + length);
+ this.sparse = true;
+ },
+
+ /**
+ * Mark a range of bytes as written to the cache.
+ * @param {int} start The first byte written.
+ * @param {int} length The number of bytes written.
+ */
+ writeBytes: function(start, length) {
+ start = parseInt(start);
+ length = parseInt(length);
+ this.written_.add(start, start + length);
+ this.available_.add(start, start + length);
+ this.sparse = true;
+ },
+
+ /**
+ * Merge this CacheEntry with another, merging recorded ranges and flags.
+ * @param {CacheEntry} other The CacheEntry to merge into this one.
+ */
+ merge: function(other) {
+ this.read_.merge(other.read_);
+ this.written_.merge(other.written_);
+ this.available_.merge(other.available_);
+ this.sparse = this.sparse || other.sparse;
+ this.key = this.key || other.key;
+ this.size = this.size || other.size;
+ },
+
+ /**
+ * Clear all recorded ranges from this CacheEntry and redraw this.details_.
+ */
+ clear: function() {
+ this.read_ = new media.DisjointRangeSet;
+ this.written_ = new media.DisjointRangeSet;
+ this.available_ = new media.DisjointRangeSet;
+ this.generateDetails();
+ },
+
+ /**
+ * Helper for drawCacheReadsToCanvas() and drawCacheWritesToCanvas().
+ *
+ * Accepts the entries to draw, a canvas fill style, and the canvas to
+ * draw on.
+ */
+ drawCacheEntriesToCanvas: function(entries, fillStyle, canvas) {
+ // Don't bother drawing anything if we don't know the total size.
+ if (!this.size) {
+ return;
+ }
+
+ var width = canvas.width;
+ var height = canvas.height;
+ var context = canvas.getContext('2d');
+ var fileSize = this.size;
+
+ context.fillStyle = '#aaa';
+ context.fillRect(0, 0, width, height);
+
+ function drawRange(start, end) {
+ var left = start / fileSize * width;
+ var right = end / fileSize * width;
+ context.fillRect(left, 0, right - left, height);
+ }
+
+ context.fillStyle = fillStyle;
+ entries.map(function(start, end) {
+ drawRange(start, end);
+ });
+ },
+
+ /**
+ * Draw cache writes to the given canvas.
+ *
+ * It should consist of a horizontal bar with highlighted sections to
+ * represent which parts of a file have been written to the cache.
+ *
+ * e.g. |xxxxxx----------x|
+ */
+ drawCacheWritesToCanvas: function(canvas) {
+ this.drawCacheEntriesToCanvas(this.written_, '#00a', canvas);
+ },
+
+ /**
+ * Draw cache reads to the given canvas.
+ *
+ * It should consist of a horizontal bar with highlighted sections to
+ * represent which parts of a file have been read from the cache.
+ *
+ * e.g. |xxxxxx----------x|
+ */
+ drawCacheReadsToCanvas: function(canvas) {
+ this.drawCacheEntriesToCanvas(this.read_, '#0a0', canvas);
+ },
+
+ /**
+ * Update this.details_ to contain everything we currently know about
+ * this file.
+ */
+ generateDetails: function() {
+ this.details_.id = this.key;
+ this.summaryText_.textContent = this.key || 'Unknown File';
+
+ this.detailTable_.textContent = '';
+ var header = document.createElement('thead');
+ var footer = document.createElement('tfoot');
+ var body = document.createElement('tbody');
+ this.detailTable_.appendChild(header);
+ this.detailTable_.appendChild(footer);
+ this.detailTable_.appendChild(body);
+
+ var headerRow = document.createElement('tr');
+ headerRow.appendChild(media.makeElement('th', 'Read From Cache'));
+ headerRow.appendChild(media.makeElement('th', 'Written To Cache'));
+ header.appendChild(headerRow);
+
+ var footerRow = document.createElement('tr');
+ var footerCell = document.createElement('td');
+ footerCell.textContent = 'Out of ' + (this.size || 'unkown size');
+ footerCell.setAttribute('colspan', 2);
+ footerRow.appendChild(footerCell);
+ footer.appendChild(footerRow);
+
+ var read = this.read_.map(function(start, end) {
+ return start + ' - ' + end;
+ });
+ var written = this.written_.map(function(start, end) {
+ return start + ' - ' + end;
+ });
+
+ var length = Math.max(read.length, written.length);
+ for (var i = 0; i < length; i++) {
+ var row = document.createElement('tr');
+ row.appendChild(media.makeElement('td', read[i] || ''));
+ row.appendChild(media.makeElement('td', written[i] || ''));
+ body.appendChild(row);
+ }
+
+ this.drawCacheWritesToCanvas(this.writeCanvas);
+ this.drawCacheReadsToCanvas(this.readCanvas);
+ },
+
+ /**
+ * Render this CacheEntry as a <li>.
+ * @return {HTMLElement} A <li> representing this CacheEntry.
+ */
+ toListItem: function() {
+ this.generateDetails();
+
+ var result = document.createElement('li');
+ result.appendChild(this.details_);
+ return result;
+ }
+ };
+
+ return {
+ CacheEntry: CacheEntry
+ };
+});