blob: 0006a0bce771b3250d7188067ba31a7fac151ec8 [file] [log] [blame]
/**
@license
Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
*/
'use strict';
export default class StyleCache {
constructor(typeMax = 100) {
// map element name -> [{properties, styleElement, scopeSelector}]
this.cache = {};
/** @type {number} */
this.typeMax = typeMax;
}
_validate(cacheEntry, properties, ownPropertyNames) {
for (let idx = 0; idx < ownPropertyNames.length; idx++) {
let pn = ownPropertyNames[idx];
if (cacheEntry.properties[pn] !== properties[pn]) {
return false;
}
}
return true;
}
store(tagname, properties, styleElement, scopeSelector) {
let list = this.cache[tagname] || [];
list.push({properties, styleElement, scopeSelector});
if (list.length > this.typeMax) {
list.shift();
}
this.cache[tagname] = list;
}
fetch(tagname, properties, ownPropertyNames) {
let list = this.cache[tagname];
if (!list) {
return;
}
// reverse list for most-recent lookups
for (let idx = list.length - 1; idx >= 0; idx--) {
let entry = list[idx];
if (this._validate(entry, properties, ownPropertyNames)) {
return entry;
}
}
}
}