diff options
author | Alex Yatskov <alex@foosoft.net> | 2016-05-05 20:06:13 -0700 |
---|---|---|
committer | Alex Yatskov <alex@foosoft.net> | 2016-05-05 20:06:13 -0700 |
commit | 9cb099e5f6aad33c70d986bd6a48668e54ee211c (patch) | |
tree | d46de3d97388764f15f8f319d8455e60d3c2d9f4 /ext/bg | |
parent | dd4b2f73656d652bc56be784a27e7378ab969ac6 (diff) |
Optimization
Diffstat (limited to 'ext/bg')
-rw-r--r-- | ext/bg/js/templates.js | 98 | ||||
-rw-r--r-- | ext/bg/js/translator.js | 16 | ||||
-rw-r--r-- | ext/bg/js/yomichan.js | 67 |
3 files changed, 65 insertions, 116 deletions
diff --git a/ext/bg/js/templates.js b/ext/bg/js/templates.js index b2fc0651..54033197 100644 --- a/ext/bg/js/templates.js +++ b/ext/bg/js/templates.js @@ -21,49 +21,39 @@ templates['kanji.html'] = template({"1":function(container,depth0,helpers,partia return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.enableAnkiConnect : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"2":function(container,depth0,helpers,partials,data,blockParams,depths) { - var stack1; - - return " <div class=\"action-bar\">\n" - + ((stack1 = helpers["with"].call(depth0 != null ? depth0 : {},(depths[1] != null ? depths[1].addable : depths[1]),{"name":"with","hash":{},"fn":container.program(3, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + " </div>\n"; -},"3":function(container,depth0,helpers,partials,data,blockParams,depths) { - var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=container.escapeExpression; + var helper, alias1=container.escapeExpression; - return " <a href=\"#\" title=\"Add Kanji\" class=\"action-link " - + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.kanji : depth0),{"name":"unless","hash":{},"fn":container.program(4, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "\" data-mode=\"kanji\" data-index=\"" - + alias2(((helper = (helper = helpers.index || (data && data.index)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(alias1,{"name":"index","hash":{},"data":data}) : helper))) + return " <a href=\"#\" title=\"Add Kanji\" class=\"action-link disabled\" data-mode=\"kanji\" data-index=\"" + + alias1(((helper = (helper = helpers.index || (data && data.index)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : {},{"name":"index","hash":{},"data":data}) : helper))) + "\"><img src=\"" - + alias2(container.lambda((depths[2] != null ? depths[2].root : depths[2]), depth0)) + + alias1(container.lambda((depths[1] != null ? depths[1].root : depths[1]), depth0)) + "/add_kanji.png\"></a>\n"; },"4":function(container,depth0,helpers,partials,data) { - return "disabled"; -},"6":function(container,depth0,helpers,partials,data) { var stack1; return " <dt>Meanings</dt>\n <dd>\n" - + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.glossary : depth0),{"name":"each","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.glossary : depth0),{"name":"each","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " </dd>\n"; -},"7":function(container,depth0,helpers,partials,data) { +},"5":function(container,depth0,helpers,partials,data) { var stack1; return " " + container.escapeExpression(container.lambda(depth0, depth0)) - + ((stack1 = helpers.unless.call(depth0 != null ? depth0 : {},(data && data.last),{"name":"unless","hash":{},"fn":container.program(8, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + + ((stack1 = helpers.unless.call(depth0 != null ? depth0 : {},(data && data.last),{"name":"unless","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n"; -},"8":function(container,depth0,helpers,partials,data) { +},"6":function(container,depth0,helpers,partials,data) { return ", "; -},"10":function(container,depth0,helpers,partials,data) { +},"8":function(container,depth0,helpers,partials,data) { var stack1; return " <dt>Kunyomi</dt>\n <dd>\n" - + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.kunyomi : depth0),{"name":"each","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.kunyomi : depth0),{"name":"each","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " </dd>\n"; -},"12":function(container,depth0,helpers,partials,data) { +},"10":function(container,depth0,helpers,partials,data) { var stack1; return " <dt>Onyomi</dt>\n <dd>\n" - + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.onyomi : depth0),{"name":"each","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.onyomi : depth0),{"name":"each","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " </dd>\n"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data,blockParams,depths) { var stack1, helper, alias1=depth0 != null ? depth0 : {}; @@ -73,11 +63,11 @@ templates['kanji.html'] = template({"1":function(container,depth0,helpers,partia + "\n <div class=\"kanji-glyph\">" + container.escapeExpression(((helper = (helper = helpers.character || (depth0 != null ? depth0.character : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(alias1,{"name":"character","hash":{},"data":data}) : helper))) + "</div>\n\n <div class=\"kanji-info\">\n <dl>\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.glossary : depth0),{"name":"if","hash":{},"fn":container.program(6, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") + + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.glossary : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.kunyomi : depth0),{"name":"if","hash":{},"fn":container.program(10, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") + + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.kunyomi : depth0),{"name":"if","hash":{},"fn":container.program(8, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.onyomi : depth0),{"name":"if","hash":{},"fn":container.program(12, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") + + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.onyomi : depth0),{"name":"if","hash":{},"fn":container.program(10, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " </dl>\n </div>\n</div>\n</div>\n"; },"useData":true,"useDepths":true}); templates['kanji-link.html'] = template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { @@ -103,72 +93,60 @@ templates['term.html'] = template({"1":function(container,depth0,helpers,partial return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.enableAnkiConnect : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"2":function(container,depth0,helpers,partials,data,blockParams,depths) { - var stack1; - - return " <div class=\"action-bar\">\n" - + ((stack1 = helpers["with"].call(depth0 != null ? depth0 : {},(depths[1] != null ? depths[1].addable : depths[1]),{"name":"with","hash":{},"fn":container.program(3, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + " </div>\n"; -},"3":function(container,depth0,helpers,partials,data,blockParams,depths) { - var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; + var helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; - return " <a href=\"#\" title=\"Add as expression\" class=\"action-link " - + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.vocabExp : depth0),{"name":"unless","hash":{},"fn":container.program(4, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "\" data-mode=\"vocabExp\" data-index=\"" + return " <div class=\"action-bar\">\n <a href=\"#\" title=\"Add as expression\" class=\"action-link disabled\" data-mode=\"vocabExp\" data-index=\"" + alias4(((helper = (helper = helpers.index || (data && data.index)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"index","hash":{},"data":data}) : helper))) + "\"><img src=\"" - + alias4(alias5((depths[2] != null ? depths[2].root : depths[2]), depth0)) - + "/img/add_expression.png\"></a>\n <a href=\"#\" title=\"Add as reading\" class=\"action-link " - + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.vocabExp : depth0),{"name":"unless","hash":{},"fn":container.program(4, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") - + "\" data-mode=\"vocabReading\" data-index=\"" + + alias4(alias5((depths[1] != null ? depths[1].root : depths[1]), depth0)) + + "/img/add_expression.png\"></a>\n <a href=\"#\" title=\"Add as reading\" class=\"action-link disabled\" data-mode=\"vocabReading\" data-index=\"" + alias4(((helper = (helper = helpers.index || (data && data.index)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"index","hash":{},"data":data}) : helper))) + "\"><img src=\"" - + alias4(alias5((depths[2] != null ? depths[2].root : depths[2]), depth0)) - + "/img/add_reading.png\"></a>\n"; + + alias4(alias5((depths[1] != null ? depths[1].root : depths[1]), depth0)) + + "/img/add_reading.png\"></a>\n </div>\n"; },"4":function(container,depth0,helpers,partials,data) { - return "disabled"; -},"6":function(container,depth0,helpers,partials,data) { var stack1, helper, options, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3="function", buffer = " <div class=\"term-expression\"><ruby>"; - stack1 = ((helper = (helper = helpers.kanjiLinks || (depth0 != null ? depth0.kanjiLinks : depth0)) != null ? helper : alias2),(options={"name":"kanjiLinks","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data}),(typeof helper === alias3 ? helper.call(alias1,options) : helper)); + stack1 = ((helper = (helper = helpers.kanjiLinks || (depth0 != null ? depth0.kanjiLinks : depth0)) != null ? helper : alias2),(options={"name":"kanjiLinks","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data}),(typeof helper === alias3 ? helper.call(alias1,options) : helper)); if (!helpers.kanjiLinks) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)} if (stack1 != null) { buffer += stack1; } return buffer + "<rt>" + container.escapeExpression(((helper = (helper = helpers.reading || (depth0 != null ? depth0.reading : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"reading","hash":{},"data":data}) : helper))) + "</rt></ruby></div>\n"; -},"7":function(container,depth0,helpers,partials,data) { +},"5":function(container,depth0,helpers,partials,data) { var helper; return container.escapeExpression(((helper = (helper = helpers.expression || (depth0 != null ? depth0.expression : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : {},{"name":"expression","hash":{},"data":data}) : helper))); -},"9":function(container,depth0,helpers,partials,data) { +},"7":function(container,depth0,helpers,partials,data) { var stack1, helper, options, buffer = " <div class=\"term-expression\">"; - stack1 = ((helper = (helper = helpers.kanjiLinks || (depth0 != null ? depth0.kanjiLinks : depth0)) != null ? helper : helpers.helperMissing),(options={"name":"kanjiLinks","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data}),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : {},options) : helper)); + stack1 = ((helper = (helper = helpers.kanjiLinks || (depth0 != null ? depth0.kanjiLinks : depth0)) != null ? helper : helpers.helperMissing),(options={"name":"kanjiLinks","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data}),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : {},options) : helper)); if (!helpers.kanjiLinks) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)} if (stack1 != null) { buffer += stack1; } return buffer + "</div>\n"; -},"11":function(container,depth0,helpers,partials,data) { +},"9":function(container,depth0,helpers,partials,data) { var stack1; return " <div class=\"term-rules\">\n" - + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.rules : depth0),{"name":"each","hash":{},"fn":container.program(12, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.rules : depth0),{"name":"each","hash":{},"fn":container.program(10, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " </div>\n"; -},"12":function(container,depth0,helpers,partials,data) { +},"10":function(container,depth0,helpers,partials,data) { var stack1; return " <span class=\"rule\">" + container.escapeExpression(container.lambda(depth0, depth0)) + "</span> " - + ((stack1 = helpers.unless.call(depth0 != null ? depth0 : {},(data && data.last),{"name":"unless","hash":{},"fn":container.program(13, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + + ((stack1 = helpers.unless.call(depth0 != null ? depth0 : {},(data && data.last),{"name":"unless","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n"; -},"13":function(container,depth0,helpers,partials,data) { +},"11":function(container,depth0,helpers,partials,data) { return "«"; -},"15":function(container,depth0,helpers,partials,data) { +},"13":function(container,depth0,helpers,partials,data) { var stack1; return " <div class=\"term-tags\">\n" - + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.tags : depth0),{"name":"each","hash":{},"fn":container.program(16, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + + ((stack1 = helpers.each.call(depth0 != null ? depth0 : {},(depth0 != null ? depth0.tags : depth0),{"name":"each","hash":{},"fn":container.program(14, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " </div>\n"; -},"16":function(container,depth0,helpers,partials,data) { +},"14":function(container,depth0,helpers,partials,data) { var helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return " <span class=\"tag tag-" @@ -178,7 +156,7 @@ templates['term.html'] = template({"1":function(container,depth0,helpers,partial + "\">" + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data}) : helper))) + "</span>\n"; -},"18":function(container,depth0,helpers,partials,data) { +},"16":function(container,depth0,helpers,partials,data) { return " <li><span>" + container.escapeExpression(container.lambda(depth0, depth0)) + "</span></li>\n"; @@ -188,13 +166,13 @@ templates['term.html'] = template({"1":function(container,depth0,helpers,partial return "<div class=\"term-definition\">\n" + ((stack1 = helpers["with"].call(alias1,(depth0 != null ? depth0.options : depth0),{"name":"with","hash":{},"fn":container.program(1, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.reading : depth0),{"name":"if","hash":{},"fn":container.program(6, data, 0, blockParams, depths),"inverse":container.program(9, data, 0, blockParams, depths),"data":data})) != null ? stack1 : "") + + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.reading : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0, blockParams, depths),"inverse":container.program(7, data, 0, blockParams, depths),"data":data})) != null ? stack1 : "") + "\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.rules : depth0),{"name":"if","hash":{},"fn":container.program(11, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") + + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.rules : depth0),{"name":"if","hash":{},"fn":container.program(9, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.tags : depth0),{"name":"if","hash":{},"fn":container.program(15, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") + + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.tags : depth0),{"name":"if","hash":{},"fn":container.program(13, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n <div class=\"term-glossary\">\n <ol>\n" - + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.glossary : depth0),{"name":"each","hash":{},"fn":container.program(18, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") + + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.glossary : depth0),{"name":"each","hash":{},"fn":container.program(16, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " </ol>\n </div>\n</div>\n"; },"useData":true,"useDepths":true}); templates['term-list.html'] = template({"1":function(container,depth0,helpers,partials,data,blockParams,depths) { diff --git a/ext/bg/js/translator.js b/ext/bg/js/translator.js index 606f6ec5..1a7b9bb4 100644 --- a/ext/bg/js/translator.js +++ b/ext/bg/js/translator.js @@ -89,12 +89,12 @@ class Translator { } } - let results = []; + let definitions = []; for (const key in groups) { - results.push(groups[key]); + definitions.push(groups[key]); } - results = results.sort((v1, v2) => { + definitions = definitions.sort((v1, v2) => { const sl1 = v1.source.length; const sl2 = v2.source.length; if (sl1 > sl2) { @@ -123,25 +123,25 @@ class Translator { }); let length = 0; - for (const result of results) { + for (const result of definitions) { length = Math.max(length, result.source.length); } - return {results: results, length: length}; + return {definitions: definitions, length: length}; } findKanji(text) { - let results = []; + let definitions = []; const processed = {}; for (const c of text) { if (!processed[c]) { - results = results.concat(this.dictionary.findKanji(c)); + definitions = definitions.concat(this.dictionary.findKanji(c)); processed[c] = true; } } - return results; + return definitions; } processTerm(groups, source, tags, rules=[], root='') { diff --git a/ext/bg/js/yomichan.js b/ext/bg/js/yomichan.js index 887bab2e..e7e674ac 100644 --- a/ext/bg/js/yomichan.js +++ b/ext/bg/js/yomichan.js @@ -34,8 +34,6 @@ class Yomichan { }); this.translator = new Translator(); - this.xhr = null; - this.setState('disabled'); loadOptions((opts) => { @@ -52,11 +50,12 @@ class Yomichan { onMessage(request, sender, callback) { const {action, params} = request, handlers = { - findKanji: ({text}) => this.actionFindKanji(text, callback), - findTerm: ({text}) => this.actionFindTerm(text, callback), - getOptions: () => callback(this.options), - getState: () => callback(this.state), - renderText: ({data, template}) => callback(Handlebars.templates[template](data)) + canAddNotes: ({definitions}) => this.ankiInvoke('canAddNotes', definitions, callback), + findKanji: ({text}) => callback(this.translator.findKanji(text)), + findTerm: ({text}) => callback(this.translator.findTerm(text)), + getOptions: () => callback(this.options), + getState: () => callback(this.state), + renderText: ({data, template}) => callback(Handlebars.templates[template](data)) }; handlers[action].call(this, params); @@ -102,49 +101,21 @@ class Yomichan { Yomichan.notifyChange('options', this.options); } - actionFindTerm(text, callback) { - const results = this.translator.findTerm(text); - this.callAnkiApi('canAddNotes', results.results, (definitions) => { - if (definitions !== null) { - results.results = definitions; - } - - callback(results); - }); - } - - actionFindKanji(text, callback) { - const results = this.translator.findKanji(text); - this.callAnkiApi('cannAddNotes', results.results, (definitions) => { - if (definitions !== null) { - results.results = definitions; - } - - callback(results); - }); - } - - callAnkiApi(action, params, callback) { - if (!this.options.enableAnkiConnect) { + ankiInvoke(action, params, callback) { + if (this.options.enableAnkiConnect) { + const xhr = new XMLHttpRequest(); + xhr.addEventListener('loadend', () => { + const resp = xhr.responseText; + callback(resp ? JSON.parse(resp) : null); + }); + + xhr.open('POST', 'http://127.0.0.1:8888'); + xhr.withCredentials = true; + xhr.setRequestHeader('Content-Type', 'text/json'); + xhr.send(JSON.stringify({action: action, params: params})); + } else { callback(null); - return; - } - - if (this.xhr !== null) { - this.xhr.abort(); } - - this.xhr = new XMLHttpRequest(); - this.xhr.addEventListener('loadend', () => { - const resp = this.xhr.responseText; - callback(resp ? JSON.parse(resp) : null); - this.xhr = null; - }); - - this.xhr.open('POST', 'http://127.0.0.1:8888'); - this.xhr.withCredentials = true; - this.xhr.setRequestHeader('Content-Type', 'text/json'); - this.xhr.send(JSON.stringify({action: action, params: params})); } static notifyChange(name, value) { |