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); |
- } |
-}; |