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

Unified Diff: third_party/WebKit/Source/devtools/front_end/ui_lazy/ViewportDataGrid.js

Issue 2623743002: DevTools: extract modules (non-extensions) (Closed)
Patch Set: rebaseline Created 3 years, 11 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: third_party/WebKit/Source/devtools/front_end/ui_lazy/ViewportDataGrid.js
diff --git a/third_party/WebKit/Source/devtools/front_end/ui_lazy/ViewportDataGrid.js b/third_party/WebKit/Source/devtools/front_end/ui_lazy/ViewportDataGrid.js
deleted file mode 100644
index 7c5911f5710b60d46235754a987e54b3db2228b0..0000000000000000000000000000000000000000
--- a/third_party/WebKit/Source/devtools/front_end/ui_lazy/ViewportDataGrid.js
+++ /dev/null
@@ -1,481 +0,0 @@
-// Copyright 2014 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.
-/**
- * @unrestricted
- * @extends {UI.DataGrid<!NODE_TYPE>}
- * @template NODE_TYPE
- */
-UI.ViewportDataGrid = class extends UI.DataGrid {
- /**
- * @param {!Array.<!UI.DataGrid.ColumnDescriptor>} columnsArray
- * @param {function(!NODE_TYPE, string, string, string)=} editCallback
- * @param {function(!NODE_TYPE)=} deleteCallback
- * @param {function()=} refreshCallback
- */
- constructor(columnsArray, editCallback, deleteCallback, refreshCallback) {
- super(columnsArray, editCallback, deleteCallback, refreshCallback);
-
- this._onScrollBound = this._onScroll.bind(this);
- this._scrollContainer.addEventListener('scroll', this._onScrollBound, true);
-
- // This is not in setScrollContainer because mouse wheel needs to detect events on the content not the scrollbar itself.
- this._scrollContainer.addEventListener('mousewheel', this._onWheel.bind(this), true);
- /** @type {!Array.<!UI.ViewportDataGridNode>} */
- this._visibleNodes = [];
- /** @type {boolean} */
- this._inline = false;
-
- // Wheel target shouldn't be removed from DOM to preserve native kinetic scrolling.
- /** @type {?Node} */
- this._wheelTarget = null;
-
- // Element that was hidden earlier, but hasn't been removed yet.
- /** @type {?Node} */
- this._hiddenWheelTarget = null;
-
- /** @type {boolean} */
- this._stickToBottom = false;
- /** @type {boolean} */
- this._atBottom = true;
- /** @type {number} */
- this._lastScrollTop = 0;
-
- this.setRootNode(new UI.ViewportDataGridNode());
- }
-
- /**
- * @param {!Element} scrollContainer
- */
- setScrollContainer(scrollContainer) {
- this._scrollContainer.removeEventListener('scroll', this._onScrollBound, true);
- this._scrollContainer = scrollContainer;
- this._scrollContainer.addEventListener('scroll', this._onScrollBound, true);
- }
-
- /**
- * @override
- */
- onResize() {
- if (this._stickToBottom && this._atBottom)
- this._scrollContainer.scrollTop = this._scrollContainer.scrollHeight - this._scrollContainer.clientHeight;
- this.scheduleUpdate();
- super.onResize();
- }
-
- /**
- * @param {boolean} stick
- */
- setStickToBottom(stick) {
- this._stickToBottom = stick;
- }
-
- /**
- * @param {?Event} event
- */
- _onWheel(event) {
- this._wheelTarget = event.target ? event.target.enclosingNodeOrSelfWithNodeName('tr') : null;
- }
-
- /**
- * @param {?Event} event
- */
- _onScroll(event) {
- this._atBottom = this._scrollContainer.isScrolledToBottom();
- if (this._lastScrollTop !== this._scrollContainer.scrollTop)
- this.scheduleUpdate();
- }
-
- /**
- * @protected
- */
- scheduleUpdateStructure() {
- this.scheduleUpdate();
- }
-
- scheduleUpdate() {
- if (this._updateAnimationFrameId)
- return;
- this._updateAnimationFrameId = this.element.window().requestAnimationFrame(this._update.bind(this));
- }
-
- updateInstantlyForTests() {
- if (!this._updateAnimationFrameId)
- return;
- this.element.window().cancelAnimationFrame(this._updateAnimationFrameId);
- this._update();
- }
-
- /**
- * @override
- */
- renderInline() {
- this._inline = true;
- super.renderInline();
- this._update();
- }
-
- /**
- * @param {number} clientHeight
- * @param {number} scrollTop
- * @return {{topPadding: number, bottomPadding: number, contentHeight: number, visibleNodes: !Array.<!UI.ViewportDataGridNode>, offset: number}}
- */
- _calculateVisibleNodes(clientHeight, scrollTop) {
- var nodes = this.rootNode().flatChildren();
- if (this._inline)
- return {topPadding: 0, bottomPadding: 0, contentHeight: 0, visibleNodes: nodes, offset: 0};
-
- var size = nodes.length;
- var i = 0;
- var y = 0;
-
- for (; i < size && y + nodes[i].nodeSelfHeight() < scrollTop; ++i)
- y += nodes[i].nodeSelfHeight();
- var start = i;
- var topPadding = y;
-
- for (; i < size && y < scrollTop + clientHeight; ++i)
- y += nodes[i].nodeSelfHeight();
- var end = i;
-
- var bottomPadding = 0;
- for (; i < size; ++i)
- bottomPadding += nodes[i].nodeSelfHeight();
-
- return {
- topPadding: topPadding,
- bottomPadding: bottomPadding,
- contentHeight: y - topPadding,
- visibleNodes: nodes.slice(start, end),
- offset: start
- };
- }
-
- /**
- * @return {number}
- */
- _contentHeight() {
- var nodes = this.rootNode().flatChildren();
- var result = 0;
- for (var i = 0, size = nodes.length; i < size; ++i)
- result += nodes[i].nodeSelfHeight();
- return result;
- }
-
- _update() {
- if (this._updateAnimationFrameId) {
- this.element.window().cancelAnimationFrame(this._updateAnimationFrameId);
- delete this._updateAnimationFrameId;
- }
-
- var clientHeight = this._scrollContainer.clientHeight;
- var scrollTop = this._scrollContainer.scrollTop;
- var currentScrollTop = scrollTop;
- var maxScrollTop = Math.max(0, this._contentHeight() - clientHeight);
- if (this._stickToBottom && this._atBottom)
- scrollTop = maxScrollTop;
- scrollTop = Math.min(maxScrollTop, scrollTop);
- this._atBottom = scrollTop === maxScrollTop;
-
- var viewportState = this._calculateVisibleNodes(clientHeight, scrollTop);
- var visibleNodes = viewportState.visibleNodes;
- var visibleNodesSet = new Set(visibleNodes);
-
- if (this._hiddenWheelTarget && this._hiddenWheelTarget !== this._wheelTarget) {
- this._hiddenWheelTarget.remove();
- this._hiddenWheelTarget = null;
- }
-
- for (var i = 0; i < this._visibleNodes.length; ++i) {
- var oldNode = this._visibleNodes[i];
- if (!visibleNodesSet.has(oldNode) && oldNode.attached()) {
- var element = oldNode.existingElement();
- if (element === this._wheelTarget)
- this._hiddenWheelTarget = oldNode.abandonElement();
- else
- element.remove();
- oldNode.wasDetached();
- }
- }
-
- var previousElement = this.topFillerRowElement();
- if (previousElement.nextSibling === this._hiddenWheelTarget)
- previousElement = this._hiddenWheelTarget;
- var tBody = this.dataTableBody;
- var offset = viewportState.offset;
- for (var i = 0; i < visibleNodes.length; ++i) {
- var node = visibleNodes[i];
- var element = node.element();
- node.willAttach();
- element.classList.toggle('odd', (offset + i) % 2 === 0);
- tBody.insertBefore(element, previousElement.nextSibling);
- node.revealed = true;
- previousElement = element;
- }
-
- this.setVerticalPadding(viewportState.topPadding, viewportState.bottomPadding);
- this._lastScrollTop = scrollTop;
- if (scrollTop !== currentScrollTop)
- this._scrollContainer.scrollTop = scrollTop;
- var contentFits =
- viewportState.contentHeight <= clientHeight && viewportState.topPadding + viewportState.bottomPadding === 0;
- if (contentFits !== this.element.classList.contains('data-grid-fits-viewport')) {
- this.element.classList.toggle('data-grid-fits-viewport', contentFits);
- this.updateWidths();
- }
- this._visibleNodes = visibleNodes;
- this.dispatchEventToListeners(UI.ViewportDataGrid.Events.ViewportCalculated);
- }
-
- /**
- * @param {!UI.ViewportDataGridNode} node
- */
- _revealViewportNode(node) {
- var nodes = this.rootNode().flatChildren();
- var index = nodes.indexOf(node);
- if (index === -1)
- return;
- var fromY = 0;
- for (var i = 0; i < index; ++i)
- fromY += nodes[i].nodeSelfHeight();
- var toY = fromY + node.nodeSelfHeight();
-
- var scrollTop = this._scrollContainer.scrollTop;
- if (scrollTop > fromY) {
- scrollTop = fromY;
- this._atBottom = false;
- } else if (scrollTop + this._scrollContainer.offsetHeight < toY) {
- scrollTop = toY - this._scrollContainer.offsetHeight;
- }
- this._scrollContainer.scrollTop = scrollTop;
- }
-};
-
-UI.ViewportDataGrid.Events = {
- ViewportCalculated: Symbol('ViewportCalculated')
-};
-
-/**
- * @unrestricted
- * @this {NODE_TYPE}
- * @extends {UI.DataGridNode<!NODE_TYPE>}
- * @template NODE_TYPE
- */
-UI.ViewportDataGridNode = class extends UI.DataGridNode {
- /**
- * @param {?Object.<string, *>=} data
- * @param {boolean=} hasChildren
- */
- constructor(data, hasChildren) {
- super(data, hasChildren);
- /** @type {boolean} */
- this._stale = false;
- /** @type {?Array<!UI.ViewportDataGridNode>} */
- this._flatNodes = null;
- }
-
- /**
- * @override
- * @return {!Element}
- */
- element() {
- var existingElement = this.existingElement();
- var element = existingElement || this.createElement();
- if (!existingElement || this._stale) {
- this.createCells(element);
- this._stale = false;
- }
- return element;
- }
-
- _clearFlatNodes() {
- this._flatNodes = null;
- var parent = /** @type {!UI.ViewportDataGridNode} */ (this.parent);
- if (parent)
- parent._clearFlatNodes();
- }
-
- /**
- * @return {!Array<!UI.ViewportDataGridNode>}
- */
- flatChildren() {
- if (this._flatNodes)
- return this._flatNodes;
- /** @type {!Array<!UI.ViewportDataGridNode>} */
- var flatNodes = [];
- /** @type {!Array<!Array<!UI.ViewportDataGridNode>>} */
- var children = [this.children];
- /** @type {!Array<number>} */
- var counters = [0];
- var depth = 0;
- while (depth >= 0) {
- if (children[depth].length <= counters[depth]) {
- depth--;
- continue;
- }
- var node = children[depth][counters[depth]++];
- flatNodes.push(node);
- if (node._expanded && node.children.length) {
- depth++;
- children[depth] = node.children;
- counters[depth] = 0;
- }
- }
-
- this._flatNodes = flatNodes;
- return flatNodes;
- }
-
- /**
- * @override
- * @param {!NODE_TYPE} child
- * @param {number} index
- */
- insertChild(child, index) {
- this._clearFlatNodes();
- if (child.parent === this) {
- var currentIndex = this.children.indexOf(child);
- if (currentIndex < 0)
- console.assert(false, 'Inconsistent DataGrid state');
- if (currentIndex === index)
- return;
- if (currentIndex < index)
- --index;
- }
- child.remove();
- child.parent = this;
- child.dataGrid = this.dataGrid;
- if (!this.children.length)
- this.setHasChildren(true);
- this.children.splice(index, 0, child);
- child.recalculateSiblings(index);
- if (this._expanded)
- this.dataGrid.scheduleUpdateStructure();
- }
-
- /**
- * @override
- * @param {!NODE_TYPE} child
- */
- removeChild(child) {
- this._clearFlatNodes();
- if (this.dataGrid)
- this.dataGrid.updateSelectionBeforeRemoval(child, false);
- if (child.previousSibling)
- child.previousSibling.nextSibling = child.nextSibling;
- if (child.nextSibling)
- child.nextSibling.previousSibling = child.previousSibling;
- if (child.parent !== this)
- throw 'removeChild: Node is not a child of this node.';
-
- child._unlink();
- this.children.remove(child, true);
- if (!this.children.length)
- this.setHasChildren(false);
- if (this._expanded)
- this.dataGrid.scheduleUpdateStructure();
- }
-
- /**
- * @override
- */
- removeChildren() {
- this._clearFlatNodes();
- if (this.dataGrid)
- this.dataGrid.updateSelectionBeforeRemoval(this, true);
- for (var i = 0; i < this.children.length; ++i)
- this.children[i]._unlink();
- this.children = [];
-
- if (this._expanded)
- this.dataGrid.scheduleUpdateStructure();
- }
-
- _unlink() {
- if (this.attached()) {
- this.existingElement().remove();
- this.wasDetached();
- }
- this.dataGrid = null;
- this.parent = null;
- this.nextSibling = null;
- this.previousSibling = null;
- }
-
- /**
- * @override
- */
- collapse() {
- if (!this._expanded)
- return;
- this._clearFlatNodes();
- this._expanded = false;
- if (this.existingElement())
- this.existingElement().classList.remove('expanded');
- this.dataGrid.scheduleUpdateStructure();
- }
-
- /**
- * @override
- */
- expand() {
- if (this._expanded)
- return;
- this._clearFlatNodes();
- super.expand();
- this.dataGrid.scheduleUpdateStructure();
- }
-
- /**
- * @protected
- */
- willAttach() {
- }
-
- /**
- * @protected
- * @return {boolean}
- */
- attached() {
- return !!(this.dataGrid && this.existingElement() && this.existingElement().parentElement);
- }
-
- /**
- * @override
- */
- refresh() {
- if (this.attached()) {
- this._stale = true;
- this.dataGrid.scheduleUpdate();
- } else {
- this.resetElement();
- }
- }
-
- /**
- * @return {?Element}
- */
- abandonElement() {
- var result = this.existingElement();
- if (result)
- result.style.display = 'none';
- this.resetElement();
- return result;
- }
-
- /**
- * @override
- */
- reveal() {
- this.dataGrid._revealViewportNode(this);
- }
-
- /**
- * @override
- * @param {number} index
- */
- recalculateSiblings(index) {
- this._clearFlatNodes();
- super.recalculateSiblings(index);
- }
-};

Powered by Google App Engine
This is Rietveld 408576698