From 22b21be62612e4186b4822375c38e195ac2d0087 Mon Sep 17 00:00:00 2001 From: Tetsuya Mori Date: Sun, 17 Feb 2019 12:54:27 +0900 Subject: [PATCH 01/25] [test] Issue #61 Suppress some console logs to save memory --- test/lit-bundled/test-runner.js | 24 ++++++++++++------------ test/lit-src4-bundled/test-runner.js | 24 ++++++++++++------------ test/preprocess4/test-runner.js | 24 ++++++++++++------------ test/src4/test-runner.js | 24 ++++++++++++------------ 4 files changed, 48 insertions(+), 48 deletions(-) diff --git a/test/lit-bundled/test-runner.js b/test/lit-bundled/test-runner.js index 23ba94b0..2c96597f 100755 --- a/test/lit-bundled/test-runner.js +++ b/test/lit-bundled/test-runner.js @@ -406,19 +406,19 @@ window.setupFixture = function setupFixture (params, fixtureModel) { typeof fixtureModel.lang === 'string' && fixtureModel.lang !== 'en' && fixtureModel.lang !== element.effectiveLang && element.effectiveLang !== 'en') { - console.log('setupFixture: waiting for lang-updated'); + //console.log('setupFixture: waiting for lang-updated'); element.addEventListener('lang-updated', function setupFixtureLangUpdated (event) { - console.log('setupFixtureLangUpdated'); + //console.log('setupFixtureLangUpdated'); if (event.target === element && element.effectiveLang === (fixtureModel.lang || element.templateDefaultLang || I18nControllerBehavior.properties.defaultLang.value || 'en')) { - console.log('setupFixtureLangUpdated lang = ' + event.detail.lang + ' effectiveLang = ' + element.effectiveLang); + //console.log('setupFixtureLangUpdated lang = ' + event.detail.lang + ' effectiveLang = ' + element.effectiveLang); element.removeEventListener('lang-updated', setupFixtureLangUpdated); resolve(element); } }); } else { - console.log('setupFixture: element ready without lang-updated'); + //console.log('setupFixture: element ready without lang-updated'); setTimeout(function () { if (params.lang === '' || params.lang === 'en') { element.fire('lang-updated'); @@ -495,12 +495,12 @@ window.suitesRunner = function suitesRunner (suites, _wait) { return (_wait ? new Promise((resolve) => { setTimeout(() => { resolve(); }, _wait); }) : Promise.resolve()).then(() => setupFixture(params, params.fixtureModel)) .then(function (element) { el = element; - console.log('setup: element.lang = ' + element.lang); + //console.log('setup: element.lang = ' + element.lang); if (params && params.suite === 'fr simple attribute') { //debugger; } return new Promise(function (resolve, reject) { - console.log(params.suite, 'waiting for ' + event); + //console.log(params.suite, 'waiting for ' + event); var resolved = false; if (params && (params.event || @@ -512,18 +512,18 @@ window.suitesRunner = function suitesRunner (suites, _wait) { (el.lang === 'en' && params.lang === '' && el.effectiveLang === 'en' && params.effectiveLang === '')*/)) { el.removeEventListener(event, fixtureSetup); - console.log('setup: updateProperty resolving on ' + event); + //console.log('setup: updateProperty resolving on ' + event); if (!resolved) { resolved = true; resolve(el); } } else { - console.log(params.suite + ' skipping uninteresting event ' + event + - ' "' + el.lang + '" "' + params.lang + '" "' + el.effectiveLang + '" "' + params.effectiveLang + '"'); + //console.log(params.suite + ' skipping uninteresting event ' + event + + // ' "' + el.lang + '" "' + params.lang + '" "' + el.effectiveLang + '" "' + params.effectiveLang + '"'); } }); - console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); + //console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); updateProperty(el, params.assign); setTimeout(() => { if (!resolved) { @@ -533,8 +533,8 @@ window.suitesRunner = function suitesRunner (suites, _wait) { }, 10000); } else { - console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); - console.log('setup: updateProperty resolving without ' + event); + //console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); + //console.log('setup: updateProperty resolving without ' + event); updateProperty(el, params.assign); resolve(el); } diff --git a/test/lit-src4-bundled/test-runner.js b/test/lit-src4-bundled/test-runner.js index 23ba94b0..2c96597f 100755 --- a/test/lit-src4-bundled/test-runner.js +++ b/test/lit-src4-bundled/test-runner.js @@ -406,19 +406,19 @@ window.setupFixture = function setupFixture (params, fixtureModel) { typeof fixtureModel.lang === 'string' && fixtureModel.lang !== 'en' && fixtureModel.lang !== element.effectiveLang && element.effectiveLang !== 'en') { - console.log('setupFixture: waiting for lang-updated'); + //console.log('setupFixture: waiting for lang-updated'); element.addEventListener('lang-updated', function setupFixtureLangUpdated (event) { - console.log('setupFixtureLangUpdated'); + //console.log('setupFixtureLangUpdated'); if (event.target === element && element.effectiveLang === (fixtureModel.lang || element.templateDefaultLang || I18nControllerBehavior.properties.defaultLang.value || 'en')) { - console.log('setupFixtureLangUpdated lang = ' + event.detail.lang + ' effectiveLang = ' + element.effectiveLang); + //console.log('setupFixtureLangUpdated lang = ' + event.detail.lang + ' effectiveLang = ' + element.effectiveLang); element.removeEventListener('lang-updated', setupFixtureLangUpdated); resolve(element); } }); } else { - console.log('setupFixture: element ready without lang-updated'); + //console.log('setupFixture: element ready without lang-updated'); setTimeout(function () { if (params.lang === '' || params.lang === 'en') { element.fire('lang-updated'); @@ -495,12 +495,12 @@ window.suitesRunner = function suitesRunner (suites, _wait) { return (_wait ? new Promise((resolve) => { setTimeout(() => { resolve(); }, _wait); }) : Promise.resolve()).then(() => setupFixture(params, params.fixtureModel)) .then(function (element) { el = element; - console.log('setup: element.lang = ' + element.lang); + //console.log('setup: element.lang = ' + element.lang); if (params && params.suite === 'fr simple attribute') { //debugger; } return new Promise(function (resolve, reject) { - console.log(params.suite, 'waiting for ' + event); + //console.log(params.suite, 'waiting for ' + event); var resolved = false; if (params && (params.event || @@ -512,18 +512,18 @@ window.suitesRunner = function suitesRunner (suites, _wait) { (el.lang === 'en' && params.lang === '' && el.effectiveLang === 'en' && params.effectiveLang === '')*/)) { el.removeEventListener(event, fixtureSetup); - console.log('setup: updateProperty resolving on ' + event); + //console.log('setup: updateProperty resolving on ' + event); if (!resolved) { resolved = true; resolve(el); } } else { - console.log(params.suite + ' skipping uninteresting event ' + event + - ' "' + el.lang + '" "' + params.lang + '" "' + el.effectiveLang + '" "' + params.effectiveLang + '"'); + //console.log(params.suite + ' skipping uninteresting event ' + event + + // ' "' + el.lang + '" "' + params.lang + '" "' + el.effectiveLang + '" "' + params.effectiveLang + '"'); } }); - console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); + //console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); updateProperty(el, params.assign); setTimeout(() => { if (!resolved) { @@ -533,8 +533,8 @@ window.suitesRunner = function suitesRunner (suites, _wait) { }, 10000); } else { - console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); - console.log('setup: updateProperty resolving without ' + event); + //console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); + //console.log('setup: updateProperty resolving without ' + event); updateProperty(el, params.assign); resolve(el); } diff --git a/test/preprocess4/test-runner.js b/test/preprocess4/test-runner.js index 23ba94b0..2c96597f 100755 --- a/test/preprocess4/test-runner.js +++ b/test/preprocess4/test-runner.js @@ -406,19 +406,19 @@ window.setupFixture = function setupFixture (params, fixtureModel) { typeof fixtureModel.lang === 'string' && fixtureModel.lang !== 'en' && fixtureModel.lang !== element.effectiveLang && element.effectiveLang !== 'en') { - console.log('setupFixture: waiting for lang-updated'); + //console.log('setupFixture: waiting for lang-updated'); element.addEventListener('lang-updated', function setupFixtureLangUpdated (event) { - console.log('setupFixtureLangUpdated'); + //console.log('setupFixtureLangUpdated'); if (event.target === element && element.effectiveLang === (fixtureModel.lang || element.templateDefaultLang || I18nControllerBehavior.properties.defaultLang.value || 'en')) { - console.log('setupFixtureLangUpdated lang = ' + event.detail.lang + ' effectiveLang = ' + element.effectiveLang); + //console.log('setupFixtureLangUpdated lang = ' + event.detail.lang + ' effectiveLang = ' + element.effectiveLang); element.removeEventListener('lang-updated', setupFixtureLangUpdated); resolve(element); } }); } else { - console.log('setupFixture: element ready without lang-updated'); + //console.log('setupFixture: element ready without lang-updated'); setTimeout(function () { if (params.lang === '' || params.lang === 'en') { element.fire('lang-updated'); @@ -495,12 +495,12 @@ window.suitesRunner = function suitesRunner (suites, _wait) { return (_wait ? new Promise((resolve) => { setTimeout(() => { resolve(); }, _wait); }) : Promise.resolve()).then(() => setupFixture(params, params.fixtureModel)) .then(function (element) { el = element; - console.log('setup: element.lang = ' + element.lang); + //console.log('setup: element.lang = ' + element.lang); if (params && params.suite === 'fr simple attribute') { //debugger; } return new Promise(function (resolve, reject) { - console.log(params.suite, 'waiting for ' + event); + //console.log(params.suite, 'waiting for ' + event); var resolved = false; if (params && (params.event || @@ -512,18 +512,18 @@ window.suitesRunner = function suitesRunner (suites, _wait) { (el.lang === 'en' && params.lang === '' && el.effectiveLang === 'en' && params.effectiveLang === '')*/)) { el.removeEventListener(event, fixtureSetup); - console.log('setup: updateProperty resolving on ' + event); + //console.log('setup: updateProperty resolving on ' + event); if (!resolved) { resolved = true; resolve(el); } } else { - console.log(params.suite + ' skipping uninteresting event ' + event + - ' "' + el.lang + '" "' + params.lang + '" "' + el.effectiveLang + '" "' + params.effectiveLang + '"'); + //console.log(params.suite + ' skipping uninteresting event ' + event + + // ' "' + el.lang + '" "' + params.lang + '" "' + el.effectiveLang + '" "' + params.effectiveLang + '"'); } }); - console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); + //console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); updateProperty(el, params.assign); setTimeout(() => { if (!resolved) { @@ -533,8 +533,8 @@ window.suitesRunner = function suitesRunner (suites, _wait) { }, 10000); } else { - console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); - console.log('setup: updateProperty resolving without ' + event); + //console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); + //console.log('setup: updateProperty resolving without ' + event); updateProperty(el, params.assign); resolve(el); } diff --git a/test/src4/test-runner.js b/test/src4/test-runner.js index 23ba94b0..2c96597f 100755 --- a/test/src4/test-runner.js +++ b/test/src4/test-runner.js @@ -406,19 +406,19 @@ window.setupFixture = function setupFixture (params, fixtureModel) { typeof fixtureModel.lang === 'string' && fixtureModel.lang !== 'en' && fixtureModel.lang !== element.effectiveLang && element.effectiveLang !== 'en') { - console.log('setupFixture: waiting for lang-updated'); + //console.log('setupFixture: waiting for lang-updated'); element.addEventListener('lang-updated', function setupFixtureLangUpdated (event) { - console.log('setupFixtureLangUpdated'); + //console.log('setupFixtureLangUpdated'); if (event.target === element && element.effectiveLang === (fixtureModel.lang || element.templateDefaultLang || I18nControllerBehavior.properties.defaultLang.value || 'en')) { - console.log('setupFixtureLangUpdated lang = ' + event.detail.lang + ' effectiveLang = ' + element.effectiveLang); + //console.log('setupFixtureLangUpdated lang = ' + event.detail.lang + ' effectiveLang = ' + element.effectiveLang); element.removeEventListener('lang-updated', setupFixtureLangUpdated); resolve(element); } }); } else { - console.log('setupFixture: element ready without lang-updated'); + //console.log('setupFixture: element ready without lang-updated'); setTimeout(function () { if (params.lang === '' || params.lang === 'en') { element.fire('lang-updated'); @@ -495,12 +495,12 @@ window.suitesRunner = function suitesRunner (suites, _wait) { return (_wait ? new Promise((resolve) => { setTimeout(() => { resolve(); }, _wait); }) : Promise.resolve()).then(() => setupFixture(params, params.fixtureModel)) .then(function (element) { el = element; - console.log('setup: element.lang = ' + element.lang); + //console.log('setup: element.lang = ' + element.lang); if (params && params.suite === 'fr simple attribute') { //debugger; } return new Promise(function (resolve, reject) { - console.log(params.suite, 'waiting for ' + event); + //console.log(params.suite, 'waiting for ' + event); var resolved = false; if (params && (params.event || @@ -512,18 +512,18 @@ window.suitesRunner = function suitesRunner (suites, _wait) { (el.lang === 'en' && params.lang === '' && el.effectiveLang === 'en' && params.effectiveLang === '')*/)) { el.removeEventListener(event, fixtureSetup); - console.log('setup: updateProperty resolving on ' + event); + //console.log('setup: updateProperty resolving on ' + event); if (!resolved) { resolved = true; resolve(el); } } else { - console.log(params.suite + ' skipping uninteresting event ' + event + - ' "' + el.lang + '" "' + params.lang + '" "' + el.effectiveLang + '" "' + params.effectiveLang + '"'); + //console.log(params.suite + ' skipping uninteresting event ' + event + + // ' "' + el.lang + '" "' + params.lang + '" "' + el.effectiveLang + '" "' + params.effectiveLang + '"'); } }); - console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); + //console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); updateProperty(el, params.assign); setTimeout(() => { if (!resolved) { @@ -533,8 +533,8 @@ window.suitesRunner = function suitesRunner (suites, _wait) { }, 10000); } else { - console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); - console.log('setup: updateProperty resolving without ' + event); + //console.log('setup: updateProperty ' + JSON.stringify(params.assign, null, 2)); + //console.log('setup: updateProperty resolving without ' + event); updateProperty(el, params.assign); resolve(el); } From d98dca5662d1e84ffda91d3d4040e92171984534 Mon Sep 17 00:00:00 2001 From: Tetsuya Mori Date: Mon, 18 Feb 2019 12:11:01 +0900 Subject: [PATCH 02/25] Issue #61 Call _processTasks() at rendering of cached templates as well as the just preprocessed one --- i18n.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/i18n.js b/i18n.js index 31dbd707..6f026fa0 100644 --- a/i18n.js +++ b/i18n.js @@ -472,6 +472,7 @@ export const i18n = (base) => class I18nBaseElement extends mixinMethods(_I18nBe while (task = this._tasks.shift()) { this[task[0]].apply(this, task[1]); } + this._tasks = null; } } } @@ -532,6 +533,9 @@ export const html = (strings, ...parts) => { if (cachedTemplate) { preprocessedStrings = cachedTemplate.preprocessedStrings; preprocessedPartsGenerator = cachedTemplate.preprocessedPartsGenerator; + if (element._tasks) { + element._processTasks(); + } } else { let originalHtml = ''; From 75fbbb579f593c1b51d52c4b8736180df847214d Mon Sep 17 00:00:00 2001 From: Tetsuya Mori Date: Mon, 18 Feb 2019 12:16:37 +0900 Subject: [PATCH 03/25] [test] Issue #61 Rebuild test/lit(-src4)-bundled/ --- test/lit-bundled/basic-test-imports.js | 4 ++-- test/lit-bundled/edge-case-test-imports.js | 4 ++-- test/lit-bundled/minimal-test-imports.js | 4 ++-- test/lit-bundled/multiple-case-test-imports.js | 2 +- test/lit-bundled/no-persist-test-imports.js | 2 +- test/lit-bundled/preference-test-imports.js | 2 +- test/lit-bundled/template-default-lang-test-imports.js | 2 +- test/lit-src4-bundled/basic-test-imports.js | 4 ++-- test/lit-src4-bundled/edge-case-test-imports.js | 4 ++-- test/lit-src4-bundled/minimal-test-imports.js | 4 ++-- test/lit-src4-bundled/multiple-case-test-imports.js | 2 +- test/lit-src4-bundled/no-persist-test-imports.js | 2 +- test/lit-src4-bundled/preference-test-imports.js | 2 +- test/lit-src4-bundled/template-default-lang-test-imports.js | 2 +- 14 files changed, 20 insertions(+), 20 deletions(-) diff --git a/test/lit-bundled/basic-test-imports.js b/test/lit-bundled/basic-test-imports.js index 65da3992..87412a0a 100644 --- a/test/lit-bundled/basic-test-imports.js +++ b/test/lit-bundled/basic-test-imports.js @@ -20,7 +20,7 @@ const directives=new WeakMap,directive=f=>(...args)=>{const d=f(...args);directi -`;var sharedData={},template$2=$_documentContainer$1.content.querySelector("template#i18n-attr-repo"),domModule$2=document.createElement("dom-module");domModule$2.appendChild(template$2);domModule$2.register("i18n-attr-repo");window.BehaviorsStore=window.BehaviorsStore||{};var Polymer$2=function(proto){BehaviorsStore._I18nAttrRepo=proto;BehaviorsStore._I18nAttrRepo._created();return Polymer$1(proto)};Polymer$2({importMeta:bundledImportMeta$5,is:"i18n-attr-repo",created:function(){this.data=sharedData;var customAttributes=this.querySelector("template#custom");if(customAttributes&&!this.hasAttribute("processed")){this._traverseTemplateTree(customAttributes._content||customAttributes.content);this.setAttribute("processed","")}this._created()},_created:function(){this.data=sharedData;if(this.data.__ready__){return}this.data.__ready__=!0;var standardTemplate;if(!this.$){var t=DomModule.import(this.is,"template");standardTemplate=(t._content||t.content).querySelector("template#standard")}else{standardTemplate=this.$.standard}this._traverseTemplateTree(standardTemplate._content||standardTemplate.content)},isLocalizableAttribute:function(element,attr){var tagName=element.tagName.toLowerCase();if(!this.data){this._created();this.data=sharedData}attr=attr.replace(/\$$/,"");if(this.data["any-elements"]&&this.data["any-elements"][attr]){return this.data["any-elements"][attr]}else if(this.data[tagName]){return this.data[tagName]["any-attributes"]||this._getType(element,this.data[tagName][attr])}else{return!1}},_getType:function(element,value){var selector,result;if("object"===typeof value){for(selector in value){if(selector){if(this._matchAttribute(element,selector)){result=this._getType(element,value[selector]);if(result){return result}}}}if(value[""]){if(this._matchAttribute(element,"")){result=this._getType(element,value[""]);if(result){return result}}}return!1}else{return value}},_matchAttribute:function(element,selector){var value,match;if(""===selector){return!0}match=selector.match(/^([^!=]*)=(.*)$/);if(match){if(element.hasAttribute(match[1])){value=element.getAttribute(match[1]);return!!value.match(new RegExp("^"+match[2]+"$"))}else{return!1}}match=selector.match(/^!([^!=]*)$/);if(match){return!element.hasAttribute(match[1])}match=selector.match(/^([^!=]*)$/);if(match){if(element.hasAttribute(match[1])){value=element.getAttribute(match[1]);return!value}else{return!1}}return!1},_compareSelectors:function(s1,s2){var name1=s1.replace(/^!/,"").replace(/=.*$/,"").toLowerCase(),name2=s2.replace(/^!/,"").replace(/=.*$/,"").toLowerCase();return name1.localeCompare(name2)},setLocalizableAttribute:function(element,attr,value){this.data[element]=this.data[element]||{};var cursor=this.data[element],prev=attr,type=!0,selectors=[];if("string"===typeof value&&value){selectors=value.split(",");if(selectors[selectors.length-1].match(/^[^!=][^=]*$/)){type=selectors.pop()}selectors=selectors.map(function(selector){return selector.replace(/=$/,"")});selectors.sort(this._compareSelectors);while(""===selectors[0]){selectors.shift()}}selectors.forEach(function(selector,index){if("object"!==typeof cursor[prev]){cursor[prev]=cursor[prev]?{"":cursor[prev]}:{}}cursor[prev][selector]=cursor[prev][selector]||{};cursor=cursor[prev];prev=selector});if("object"===typeof cursor[prev]&&cursor[prev]&&Object.keys(cursor[prev]).length){cursor=cursor[prev];prev=""}cursor[prev]=type},registerLocalizableAttributes:function(element,template){if(!this.data){this._created();this.data=sharedData}if(!element){element=template.getAttribute("id")}if(element){var attrs=(template.getAttribute("text-attr")||"").split(" "),textAttr=!1;attrs.forEach(function(attr){if(attr){this.setLocalizableAttribute(element,attr,!0)}},this);Array.prototype.forEach.call(template.attributes,function(attr){switch(attr.name){case"id":case"lang":case"localizable-text":case"assetpath":break;case"text-attr":textAttr=!0;break;default:if(textAttr){this.setLocalizableAttribute(element,attr.name,attr.value)}break;}}.bind(this))}},_traverseTemplateTree:function(node){var name;if(node.nodeType===node.ELEMENT_NODE){name=node.nodeName.toLowerCase();Array.prototype.forEach.call(node.attributes,function(attribute){this.data[name]=this.data[name]||{};this.setLocalizableAttribute(name,attribute.name,attribute.value)},this)}if(0=isExtLangCode+2&&(match=parts[isExtLangCode+1].match(/^([A-Za-z])([A-Za-z]{3})$/))){isScriptCode=1;scriptCode=parts[isExtLangCode+1]=match[1].toUpperCase()+match[2].toLowerCase()}if(parts.length>=isExtLangCode+isScriptCode+2&&(match=parts[isExtLangCode+isScriptCode+1].match(/^[A-Za-z0-9]{2,3}$/))){isCountryCode=1;countryCode=parts[isExtLangCode+isScriptCode+1]=match[0].toUpperCase()}if(parts.length>=isExtLangCode+isScriptCode+isCountryCode+2){for(n=isExtLangCode+isScriptCode+isCountryCode+1;n not found in