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

Unified Diff: chrome/browser/resources/md_history/app.crisper.js

Issue 2324293002: Roll performance-oriented iron-list changes (Closed)
Patch Set: test fix courtesy of michaelpg@ Created 4 years, 3 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: chrome/browser/resources/md_history/app.crisper.js
diff --git a/chrome/browser/resources/md_history/app.crisper.js b/chrome/browser/resources/md_history/app.crisper.js
index 41217a6032ebcf8f07bc095b0b0ea27399e2afd7..efe232b90d3e45a3cd9e080bae20d6a20b7c662c 100644
--- a/chrome/browser/resources/md_history/app.crisper.js
+++ b/chrome/browser/resources/md_history/app.crisper.js
@@ -7201,8 +7201,6 @@ Polymer({
_firstVisibleIndexVal: null,
_lastVisibleIndexVal: null,
_collection: null,
- _itemsRendered: false,
- _lastPage: null,
_maxPages: 3,
_focusedItem: null,
_focusedIndex: -1,
@@ -7211,6 +7209,7 @@ Polymer({
_itemsPerRow: 1,
_itemWidth: 0,
_rowHeight: 0,
+ _templateCost: 0,
get _physicalBottom() {
return this._physicalTop + this._physicalSize;
},
@@ -7268,7 +7267,7 @@ Polymer({
return this._estRowsInView * this._itemsPerRow * this._maxPages;
},
get _isVisible() {
- return this.scrollTarget && Boolean(this.scrollTarget.offsetWidth || this.scrollTarget.offsetHeight);
+ return Boolean(this.offsetWidth || this.offsetHeight);
},
get firstVisibleIndex() {
if (this._firstVisibleIndexVal === null) {
@@ -7321,11 +7320,12 @@ Polymer({
},
attached: function() {
this.updateViewportBoundaries();
- this._render();
+ if (this._physicalCount === 0) {
+ this._debounceTemplate(this._render);
+ }
this.listen(this, 'iron-resize', '_resizeHandler');
},
detached: function() {
- this._itemsRendered = false;
this.unlisten(this, 'iron-resize', '_resizeHandler');
},
_setOverflow: function(scrollTarget) {
@@ -7426,25 +7426,36 @@ Polymer({
if (this._viewportHeight === 0) {
return false;
}
- var isClientHeightFull = this._physicalBottom >= this._scrollBottom && this._physicalTop <= this._scrollPosition;
- if (this._physicalSize >= this._optPhysicalSize && isClientHeightFull) {
+ var self = this;
+ var isClientFull = this._physicalBottom >= this._scrollBottom && this._physicalTop <= this._scrollPosition;
+ if (this._physicalSize >= this._optPhysicalSize && isClientFull) {
return false;
}
- var currentPage = Math.floor(this._physicalSize / this._viewportHeight);
- if (currentPage === 0) {
- this._debounceTemplate(this._increasePool.bind(this, Math.round(this._physicalCount * .5)));
- } else if (this._lastPage !== currentPage && isClientHeightFull) {
- Polymer.dom.addDebouncer(this.debounce('_debounceTemplate', this._increasePool.bind(this, this._itemsPerRow), 16));
- } else {
- this._debounceTemplate(this._increasePool.bind(this, this._itemsPerRow));
+ var maxPoolSize = Math.round(this._physicalCount * .5);
+ if (!isClientFull) {
+ this._debounceTemplate(this._increasePool.bind(this, maxPoolSize));
+ return true;
}
- this._lastPage = currentPage;
+ this._yield(function() {
+ self._increasePool(Math.min(maxPoolSize, Math.max(1, Math.round(50 / self._templateCost))));
+ });
return true;
},
+ _yield: function(cb) {
+ var g = window;
+ var handle = g.requestIdleCallback ? g.requestIdleCallback(cb) : g.setTimeout(cb, 16);
+ Polymer.dom.addDebouncer({
+ complete: function() {
+ g.cancelIdleCallback ? g.cancelIdleCallback(handle) : g.clearTimeout(handle);
+ cb();
+ }
+ });
+ },
_increasePool: function(missingItems) {
var nextPhysicalCount = Math.min(this._physicalCount + missingItems, this._virtualCount - this._virtualStart, Math.max(this.maxPhysicalCount, DEFAULT_PHYSICAL_COUNT));
var prevPhysicalCount = this._physicalCount;
var delta = nextPhysicalCount - prevPhysicalCount;
+ var ts = window.performance.now();
if (delta <= 0) {
return;
}
@@ -7455,13 +7466,15 @@ Polymer({
this._physicalStart = this._physicalStart + delta;
}
this._update();
+ this._templateCost = (window.performance.now() - ts) / delta;
},
_render: function() {
- var requiresUpdate = this._virtualCount > 0 || this._physicalCount > 0;
- if (this.isAttached && !this._itemsRendered && this._isVisible && requiresUpdate) {
- this._lastPage = 0;
- this._update();
- this._itemsRendered = true;
+ if (this.isAttached && this._isVisible) {
+ if (this._physicalCount === 0) {
+ this._increasePool(DEFAULT_PHYSICAL_COUNT);
+ } else {
+ this._update();
+ }
}
},
_ensureTemplatized: function() {
@@ -7542,23 +7555,20 @@ Polymer({
this._physicalIndexForKey = {};
this._firstVisibleIndexVal = null;
this._lastVisibleIndexVal = null;
+ this._physicalCount = this._physicalCount || 0;
+ this._physicalItems = this._physicalItems || [];
+ this._physicalSizes = this._physicalSizes || [];
+ this._physicalStart = 0;
this._resetScrollPosition(0);
this._removeFocusedItem();
- if (!this._physicalItems) {
- this._physicalCount = Math.max(1, Math.min(DEFAULT_PHYSICAL_COUNT, this._virtualCount));
- this._physicalItems = this._createPool(this._physicalCount);
- this._physicalSizes = new Array(this._physicalCount);
- }
- this._physicalStart = 0;
+ this._debounceTemplate(this._render);
} else if (change.path === 'items.splices') {
this._adjustVirtualIndex(change.value.indexSplices);
this._virtualCount = this.items ? this.items.length : 0;
+ this._debounceTemplate(this._render);
} else {
this._forwardItemPath(change.path.split('.').slice(1).join('.'), change.value);
- return;
}
- this._itemsRendered = false;
- this._debounceTemplate(this._render);
},
_adjustVirtualIndex: function(splices) {
splices.forEach(function(splice) {
@@ -7727,7 +7737,7 @@ Polymer({
return;
}
Polymer.dom.flush();
- if (!this._itemsRendered) {
+ if (this._physicalCount === 0) {
return;
}
idx = Math.min(Math.max(idx, 0), this._virtualCount - 1);
@@ -7765,7 +7775,7 @@ Polymer({
Polymer.dom.addDebouncer(this.debounce('_debounceTemplate', function() {
this.updateViewportBoundaries();
this._render();
- if (this._itemsRendered && this._physicalItems && this._isVisible) {
+ if (this._physicalCount > 0 && this._isVisible) {
this._resetAverage();
this.scrollToIndex(this.firstVisibleIndex);
}
« no previous file with comments | « chrome/browser/resources/md_downloads/crisper.js ('k') | chrome/test/data/webui/settings/languages_page_browsertest.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698