@@ -14,7 +14,7 @@ const version_id = 'dev',
1414
1515/** @summary version date
1616 * @desc Release date in format day/month/year like '14/04/2022' */
17- version_date = '22 /10/2025',
17+ version_date = '23 /10/2025',
1818
1919/** @summary version id and date
2020 * @desc Produced by concatenation of {@link version_id} and {@link version_date}
@@ -1139,7 +1139,7 @@ async function injectCode(code) {
11391139 // check if code already loaded - to avoid duplication
11401140 const scripts = document.getElementsByTagName('script');
11411141 for (let n = 0; n < scripts.length; ++n) {
1142- if (scripts[n].innerHTML === code)
1142+ if (scripts[n].innerText === code)
11431143 return true;
11441144 }
11451145
@@ -1155,7 +1155,7 @@ async function injectCode(code) {
11551155 return promise.then(() => {
11561156 const element = document.createElement('script');
11571157 element.setAttribute('type', is_mjs ? 'module' : 'text/javascript');
1158- element.innerHTML = code;
1158+ element.innerText = code;
11591159 document.head.appendChild(element);
11601160 // while onload event not fired, just postpone resolve
11611161 return isBatchMode() ? true : postponePromise(true, 10);
@@ -78461,18 +78461,18 @@ function injectStyle(code, node, tag) {
7846178461 const styles = (node || document).getElementsByTagName('style');
7846278462 for (let n = 0; n < styles.length; ++n) {
7846378463 if (tag && styles[n].getAttribute('tag') === tag) {
78464- styles[n].innerHTML = code;
78464+ styles[n].innerText = code;
7846578465 return true;
7846678466 }
7846778467
78468- if (styles[n].innerHTML === code)
78468+ if (styles[n].innerText === code)
7846978469 return true;
7847078470 }
7847178471
7847278472 const element = document.createElement('style');
7847378473 if (tag)
7847478474 element.setAttribute('tag', tag);
78475- element.innerHTML = code;
78475+ element.innerText = code;
7847678476 (node || document.head).appendChild(element);
7847778477 return true;
7847878478}
@@ -86050,7 +86050,7 @@ class TabsDisplay extends MDIDisplay {
8605086050 }).append('button')
8605186051 .attr('title', 'close')
8605286052 .attr('style', 'margin-left: .5em; padding: 0; font-size: 0.5em; width: 1.8em; height: 1.8em; vertical-align: center;')
86053- .html('✕ ')
86053+ .text('\u2715 ')
8605486054 .on('click', function() {
8605586055 mdi.modifyTabsFrame(select(this.parentNode).property('frame_id'), 'close');
8605686056 });
@@ -86203,9 +86203,9 @@ class FlexibleDisplay extends MDIDisplay {
8620386203 const btn = select(this);
8620486204 if (((d.t === 'minimize') && (newstate === 'min')) ||
8620586205 ((d.t === 'maximize') && (newstate === 'max')))
86206- btn.html('▞ ').attr('title', 'restore');
86206+ btn.text('\u259E ').attr('title', 'restore');
8620786207 else
86208- btn.html (d.n).attr('title', d.t);
86208+ btn.text (d.n).attr('title', d.t);
8620986209 });
8621086210
8621186211 main.property('state', newstate);
@@ -86315,13 +86315,13 @@ class FlexibleDisplay extends MDIDisplay {
8631586315 .on('contextmenu', evnt => mdi.showContextMenu(evnt, true))
8631686316 .on('click', function() { mdi.activateFrame(select(this.parentNode).select('.jsroot_flex_draw').node()); })
8631786317 .selectAll('button')
86318- .data([{ n: '✕ ', t: 'close' }, { n: '▔ ', t: 'maximize' }, { n: '▁ ', t: 'minimize' }])
86318+ .data([{ n: '\u2715 ', t: 'close' }, { n: '\u2594 ', t: 'maximize' }, { n: '\u2581 ', t: 'minimize' }])
8631986319 .enter()
8632086320 .append('button')
8632186321 .attr('type', 'button')
8632286322 .attr('style', 'float: right; padding: 0; width: 1.4em; text-align: center; font-size: 10px; margin-top: 2px; margin-right: 4px')
8632386323 .attr('title', d => d.t)
86324- .html (d => d.n)
86324+ .text (d => d.n)
8632586325 .on('click', function() { mdi._clickButton(this); });
8632686326
8632786327 let moving_frame = null, moving_div = null, doing_move = false, current = [];
@@ -86577,7 +86577,7 @@ class BatchDisplay extends MDIDisplay {
8657786577 return Promise.all(prs).then(() => {
8657886578 this.jsdom_body.append('div')
8657986579 .attr('id', 'jsroot_batch_final')
86580- .html (`${cnt}`);
86580+ .text (`${cnt}`);
8658186581 });
8658286582 }
8658386583
@@ -166319,12 +166319,12 @@ class HierarchyPainter extends BasePainter {
166319166319
166320166320 if ((options.length === 1) && (options[0] === 'iotest')) {
166321166321 this.clearHierarchy();
166322- select('#' + this.disp_frameid).html('<h2> Start I/O test</h2> ');
166322+ select('#' + this.disp_frameid).html('').append('h2').text(' Start I/O test');
166323166323
166324166324 const tm0 = new Date();
166325- return this.getObject(items[0]).then(() => {
166325+ return this.getObject(items[0]).then(res => {
166326166326 const tm1 = new Date();
166327- select('#' + this.disp_frameid).append('h2').html(' Item ' + items[0] + ' reading time = ' + ( tm1.getTime() - tm0.getTime()) + 'ms' );
166327+ select('#' + this.disp_frameid).append('h2').text(` Item ${ items[0]} reading ` + (res?.obj ? `type ${res?.obj._typename} time = ${ tm1.getTime() - tm0.getTime()}ms` : 'fail') );
166328166328 return true;
166329166329 });
166330166330 }
@@ -167606,6 +167606,7 @@ class HierarchyPainter extends BasePainter {
167606167606 browser_kind = 'float';
167607167607
167608167608 this.no_select = getOption('noselect');
167609+ this.top_info = getOption('info');
167609167610
167610167611 if (getOption('files_monitoring') !== null)
167611167612 this.files_monitoring = true;
@@ -167896,7 +167897,7 @@ class HierarchyPainter extends BasePainter {
167896167897
167897167898 this.brlayout.setBrowserContent(guiCode);
167898167899
167899- const title_elem = this.brlayout.setBrowserTitle(this.is_online ? 'ROOT online server' : 'Read a ROOT file');
167900+ const title_elem = this.brlayout.setBrowserTitle(this.top_info || (this. is_online ? 'ROOT online server' : 'Read a ROOT file') );
167900167901 title_elem?.on('contextmenu', evnt => {
167901167902 evnt.preventDefault();
167902167903 createMenu(evnt).then(menu => {
0 commit comments