From ad947d661526dd0a64d7ee55fbd200478381a3cc Mon Sep 17 00:00:00 2001 From: plainheart Date: Tue, 18 Jun 2024 18:45:50 +0800 Subject: [PATCH 1/3] fix(tooltip): fix tooltip XSS issue when legend name is HTML string --- src/util/graphic.ts | 4 +++- test/tooltip.html | 51 +++++++++++++++++++++++++-------------------- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/util/graphic.ts b/src/util/graphic.ts index a7e26e1d98..d98cf674c8 100644 --- a/src/util/graphic.ts +++ b/src/util/graphic.ts @@ -67,6 +67,7 @@ import { } from 'zrender/src/core/util'; import { getECData } from './innerStore'; import ComponentModel from '../model/Component'; +import { encodeHTML } from 'zrender/src/core/dom'; import { @@ -600,10 +601,11 @@ export function setTooltipConfig(opt: { const ecData = getECData(opt.el); ecData.componentMainType = mainType; ecData.componentIndex = componentIndex; + ecData.tooltipConfig = { name: itemName, option: defaults({ - content: itemName, + content: encodeHTML(itemName), formatterParams: formatterParams }, itemTooltipOptionObj) }; diff --git a/test/tooltip.html b/test/tooltip.html index 8f3a55ea02..d80804e8b1 100644 --- a/test/tooltip.html +++ b/test/tooltip.html @@ -66,8 +66,8 @@

dispatchAciton manually with `position` specified (postion: [10,10])

- - +

Tooltip shouldn't render legend name as HTML element by default

+
@@ -785,34 +785,39 @@

dispatchAciton manually with `position` specified (postion: [10,10])

- \ No newline at end of file + + From c1727a65fcef3ab6ac72e34856f918386970c19a Mon Sep 17 00:00:00 2001 From: plainheart Date: Wed, 19 Jun 2024 11:19:25 +0800 Subject: [PATCH 2/3] refactor(tooltip): add `encodeHTMLContent` option to specify whether the content should be encoded by default --- src/component/tooltip/TooltipView.ts | 14 +++++++++++++- src/util/graphic.ts | 6 ++---- src/util/types.ts | 6 ++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/component/tooltip/TooltipView.ts b/src/component/tooltip/TooltipView.ts index e585aef9ef..d5bf5d8f21 100644 --- a/src/component/tooltip/TooltipView.ts +++ b/src/component/tooltip/TooltipView.ts @@ -20,7 +20,7 @@ import { bind, each, clone, trim, isString, isFunction, isArray, isObject, exten import env from 'zrender/src/core/env'; import TooltipHTMLContent from './TooltipHTMLContent'; import TooltipRichContent from './TooltipRichContent'; -import { convertToColorString, formatTpl, TooltipMarker } from '../../util/format'; +import { convertToColorString, encodeHTML, formatTpl, TooltipMarker } from '../../util/format'; import { parsePercent } from '../../util/number'; import { Rect } from '../../util/graphic'; import findPointFromSeries from '../axisPointer/findPointFromSeries'; @@ -724,9 +724,11 @@ class TooltipView extends ComponentView { el: ECElement, dispatchAction: ExtensionAPI['dispatchAction'] ) { + const isHTMLRenderMode = this._renderMode === 'html'; const ecData = getECData(el); const tooltipConfig = ecData.tooltipConfig; let tooltipOpt = tooltipConfig.option || {}; + let encodeHTMLContent = tooltipOpt.encodeHTMLContent; if (isString(tooltipOpt)) { const content = tooltipOpt; tooltipOpt = { @@ -734,6 +736,16 @@ class TooltipView extends ComponentView { // Fixed formatter formatter: content }; + // when `tooltipConfig.option` is a string rather than an object, + // we can't know if the content needs to be encoded + // for the sake of security, encode it by default. + encodeHTMLContent = true; + } + + if (encodeHTMLContent && isHTMLRenderMode && tooltipOpt.content) { + // clone might be unnecessary? + tooltipOpt = clone(tooltipOpt); + tooltipOpt.content = encodeHTML(tooltipOpt.content); } const tooltipModelCascade = [tooltipOpt] as TooltipModelOptionCascade[]; diff --git a/src/util/graphic.ts b/src/util/graphic.ts index d98cf674c8..09c84953c4 100644 --- a/src/util/graphic.ts +++ b/src/util/graphic.ts @@ -67,8 +67,6 @@ import { } from 'zrender/src/core/util'; import { getECData } from './innerStore'; import ComponentModel from '../model/Component'; -import { encodeHTML } from 'zrender/src/core/dom'; - import { updateProps, @@ -601,11 +599,11 @@ export function setTooltipConfig(opt: { const ecData = getECData(opt.el); ecData.componentMainType = mainType; ecData.componentIndex = componentIndex; - ecData.tooltipConfig = { name: itemName, option: defaults({ - content: encodeHTML(itemName), + content: itemName, + encodeHTMLContent: true, formatterParams: formatterParams }, itemTooltipOptionObj) }; diff --git a/src/util/types.ts b/src/util/types.ts index 8fd9435013..653b687d91 100644 --- a/src/util/types.ts +++ b/src/util/types.ts @@ -1336,6 +1336,12 @@ export interface CommonTooltipOption { export type ComponentItemTooltipOption = CommonTooltipOption & { // Default content HTML. content?: string; + /** + * Whether to encode HTML content according to `tooltip.renderMode`. + * + * e.g. renderMode 'html' needs to encode but 'richText' does not. + */ + encodeHTMLContent?: boolean; formatterParams?: ComponentItemTooltipLabelFormatterParams; }; export type ComponentItemTooltipLabelFormatterParams = { From 62210761d6e4e56adaef0d08b9f0b26c80151733 Mon Sep 17 00:00:00 2001 From: plainheart Date: Wed, 19 Jun 2024 11:21:09 +0800 Subject: [PATCH 3/3] test(tooltip): update test case for tooltip xss --- test/runTest/actions/__meta__.json | 2 +- test/runTest/actions/tooltip.json | 2 +- test/tooltip.html | 47 ++++++++++++++++++++++++------ 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/test/runTest/actions/__meta__.json b/test/runTest/actions/__meta__.json index feea060fbc..26eac6dd21 100644 --- a/test/runTest/actions/__meta__.json +++ b/test/runTest/actions/__meta__.json @@ -192,7 +192,7 @@ "toolbox-textStyle": 1, "toolbox-title": 4, "toolbox-tooltip": 1, - "tooltip": 10, + "tooltip": 11, "tooltip-appendToBody": 4, "tooltip-axisPointer": 20, "tooltip-axisPointer2": 4, diff --git a/test/runTest/actions/tooltip.json b/test/runTest/actions/tooltip.json index ac3c35bc8c..b2d44e8639 100644 --- a/test/runTest/actions/tooltip.json +++ b/test/runTest/actions/tooltip.json @@ -1 +1 @@ -[{"name":"Action 1","ops":[{"type":"mousemove","time":1066,"x":297,"y":258},{"type":"mousemove","time":1269,"x":388,"y":256},{"type":"mousemove","time":2085,"x":392,"y":256},{"type":"mousemove","time":2287,"x":494,"y":258},{"type":"mousemove","time":2517,"x":509,"y":259},{"type":"mousemove","time":3436,"x":503,"y":284},{"type":"mousemove","time":3636,"x":491,"y":397},{"type":"mousemove","time":3837,"x":490,"y":409},{"type":"screenshot","time":4534},{"type":"mousemove","time":4578,"x":485,"y":410},{"type":"mousemove","time":4780,"x":279,"y":421},{"type":"mousemove","time":4992,"x":257,"y":421},{"type":"screenshot","time":5742}],"scrollY":0,"scrollX":0,"timestamp":1568044930472},{"name":"Action 2","ops":[{"type":"mousemove","time":1561,"x":318,"y":287},{"type":"mousemove","time":1762,"x":335,"y":287},{"type":"mousemove","time":2008,"x":321,"y":288},{"type":"mousemove","time":2161,"x":320,"y":288},{"type":"mousemove","time":2375,"x":311,"y":289},{"type":"mousemove","time":3113,"x":315,"y":289},{"type":"screenshot","time":3160},{"type":"mousemove","time":3313,"x":367,"y":283},{"type":"mousemove","time":3526,"x":371,"y":283},{"type":"screenshot","time":4530},{"type":"mousemove","time":4948,"x":371,"y":283},{"type":"mousemove","time":5148,"x":371,"y":371},{"type":"mousemove","time":5366,"x":373,"y":408},{"type":"mousemove","time":5595,"x":372,"y":444},{"type":"mousemove","time":6534,"x":376,"y":444},{"type":"mousemove","time":6743,"x":477,"y":447}],"scrollY":371,"scrollX":0,"timestamp":1568044956076},{"name":"Action 3","ops":[{"type":"mousemove","time":1063,"x":384,"y":345},{"type":"mousemove","time":1264,"x":224,"y":335},{"type":"mousemove","time":1472,"x":222,"y":335},{"type":"screenshot","time":2025}],"scrollY":901,"scrollX":0,"timestamp":1568044971045},{"name":"Action 4","ops":[{"type":"mousemove","time":547,"x":498,"y":307},{"type":"mousemove","time":747,"x":247,"y":322},{"type":"mousemove","time":955,"x":146,"y":330},{"type":"screenshot","time":1695}],"scrollY":1254,"scrollX":0,"timestamp":1568045000596},{"name":"Action 5","ops":[{"type":"mousemove","time":833,"x":479,"y":415},{"type":"mousemove","time":1041,"x":258,"y":384},{"type":"mousemove","time":1259,"x":255,"y":384},{"type":"screenshot","time":1742},{"type":"mousemove","time":2167,"x":256,"y":384},{"type":"mousemove","time":2367,"x":455,"y":402},{"type":"mousemove","time":2577,"x":514,"y":407},{"type":"screenshot","time":3243}],"scrollY":1560,"scrollX":0,"timestamp":1568045020545},{"name":"Action 6","ops":[{"type":"mousemove","time":1518,"x":561,"y":419},{"type":"mousemove","time":1718,"x":342,"y":395},{"type":"mousemove","time":1918,"x":330,"y":394},{"type":"mousemove","time":2161,"x":330,"y":394},{"type":"screenshot","time":2643},{"type":"mousemove","time":2836,"x":334,"y":393},{"type":"mousemove","time":3036,"x":427,"y":379},{"type":"mousemove","time":3236,"x":503,"y":366},{"type":"mousemove","time":3450,"x":526,"y":355},{"type":"mousemove","time":3651,"x":549,"y":346},{"type":"screenshot","time":4619},{"type":"mousemove","time":4721,"x":555,"y":344},{"type":"mousemove","time":4922,"x":636,"y":320},{"type":"mousemove","time":5122,"x":653,"y":313},{"type":"mousemove","time":5355,"x":653,"y":313},{"type":"screenshot","time":6033}],"scrollY":1949,"scrollX":0,"timestamp":1568045029877},{"name":"Action 7","ops":[{"type":"mousemove","time":84,"x":749,"y":474},{"type":"mousemove","time":285,"x":574,"y":446},{"type":"mousemove","time":500,"x":536,"y":444},{"type":"mousemove","time":709,"x":529,"y":445},{"type":"mousemove","time":916,"x":527,"y":445},{"type":"screenshot","time":1274},{"type":"screenshot","time":2870},{"type":"mousemove","time":3663,"x":518,"y":445},{"type":"mousemove","time":3863,"x":238,"y":419},{"type":"mousemove","time":4063,"x":236,"y":419},{"type":"mousemove","time":4263,"x":236,"y":420},{"type":"mousemove","time":6015,"x":230,"y":419},{"type":"mousemove","time":6215,"x":213,"y":417},{"type":"mousemove","time":6423,"x":219,"y":429},{"type":"mousemove","time":6566,"x":219,"y":429},{"type":"mousemove","time":6773,"x":200,"y":432},{"type":"mousemove","time":6982,"x":115,"y":422},{"type":"mousemove","time":7224,"x":115,"y":422},{"type":"mousemove","time":7399,"x":117,"y":422},{"type":"mousemove","time":7600,"x":395,"y":436},{"type":"mousemove","time":7808,"x":397,"y":437},{"type":"mousemove","time":8301,"x":388,"y":437},{"type":"mousemove","time":8511,"x":334,"y":434},{"type":"mousemove","time":8953,"x":335,"y":434},{"type":"mousemove","time":9162,"x":466,"y":440},{"type":"mousemove","time":9369,"x":483,"y":440},{"type":"mousemove","time":9569,"x":524,"y":440},{"type":"mousemove","time":9769,"x":496,"y":439},{"type":"mousemove","time":10169,"x":496,"y":439},{"type":"mousemove","time":10370,"x":487,"y":447},{"type":"mousemove","time":10570,"x":465,"y":475},{"type":"mousemove","time":10785,"x":465,"y":475},{"type":"mousemove","time":10979,"x":465,"y":476},{"type":"mousemove","time":11188,"x":426,"y":502},{"type":"mousemove","time":11461,"x":425,"y":502},{"type":"mousemove","time":11661,"x":392,"y":504},{"type":"mousemove","time":11870,"x":375,"y":503},{"type":"mousemove","time":12196,"x":375,"y":503},{"type":"mousemove","time":12406,"x":336,"y":503},{"type":"mousemove","time":12621,"x":332,"y":503},{"type":"mousemove","time":12880,"x":332,"y":503},{"type":"screenshot","time":14160},{"type":"mousemove","time":16617,"x":331,"y":503}],"scrollY":2512,"scrollX":0,"timestamp":1568045076317},{"name":"Action 8","ops":[{"type":"mousemove","time":309,"x":359,"y":416},{"type":"mousemove","time":509,"x":355,"y":444},{"type":"mousemove","time":716,"x":355,"y":445},{"type":"mousemove","time":2594,"x":355,"y":446},{"type":"mousemove","time":2795,"x":379,"y":478},{"type":"mousemove","time":3004,"x":399,"y":492},{"type":"mousemove","time":3220,"x":400,"y":492},{"type":"screenshot","time":4078},{"type":"mousemove","time":4353,"x":402,"y":490},{"type":"mousemove","time":4554,"x":427,"y":439},{"type":"mousemove","time":4762,"x":431,"y":423},{"type":"mousemove","time":5387,"x":431,"y":423},{"type":"screenshot","time":5579},{"type":"mousemove","time":6372,"x":431,"y":423},{"type":"mousemove","time":6572,"x":431,"y":423}],"scrollY":2989,"scrollX":0,"timestamp":1568045103543},{"name":"Action 9","ops":[{"type":"mousemove","time":514,"x":388,"y":421},{"type":"mousemove","time":714,"x":358,"y":424},{"type":"mousemove","time":914,"x":360,"y":423},{"type":"mousemove","time":1120,"x":363,"y":423},{"type":"screenshot","time":1499},{"type":"mousemove","time":1672,"x":360,"y":421},{"type":"mousemove","time":1872,"x":93,"y":272},{"type":"mousemove","time":2080,"x":91,"y":271},{"type":"screenshot","time":2915}],"scrollY":3767,"scrollX":0,"timestamp":1568045115708},{"name":"Action 10","ops":[{"type":"mousedown","time":1166,"x":366,"y":376},{"type":"mouseup","time":1285,"x":366,"y":376},{"time":1286,"delay":400,"type":"screenshot-auto"}],"scrollY":4118,"scrollX":0,"timestamp":1568045124648}] \ No newline at end of file +[{"name":"Action 1","ops":[{"type":"mousemove","time":1066,"x":297,"y":258},{"type":"mousemove","time":1269,"x":388,"y":256},{"type":"mousemove","time":2085,"x":392,"y":256},{"type":"mousemove","time":2287,"x":494,"y":258},{"type":"mousemove","time":2517,"x":509,"y":259},{"type":"mousemove","time":3436,"x":503,"y":284},{"type":"mousemove","time":3636,"x":491,"y":397},{"type":"mousemove","time":3837,"x":490,"y":409},{"type":"screenshot","time":4534},{"type":"mousemove","time":4578,"x":485,"y":410},{"type":"mousemove","time":4780,"x":279,"y":421},{"type":"mousemove","time":4992,"x":257,"y":421},{"type":"screenshot","time":5742}],"scrollY":0,"scrollX":0,"timestamp":1568044930472},{"name":"Action 2","ops":[{"type":"mousemove","time":1561,"x":318,"y":287},{"type":"mousemove","time":1762,"x":335,"y":287},{"type":"mousemove","time":2008,"x":321,"y":288},{"type":"mousemove","time":2161,"x":320,"y":288},{"type":"mousemove","time":2375,"x":311,"y":289},{"type":"mousemove","time":3113,"x":315,"y":289},{"type":"screenshot","time":3160},{"type":"mousemove","time":3313,"x":367,"y":283},{"type":"mousemove","time":3526,"x":371,"y":283},{"type":"screenshot","time":4530},{"type":"mousemove","time":4948,"x":371,"y":283},{"type":"mousemove","time":5148,"x":371,"y":371},{"type":"mousemove","time":5366,"x":373,"y":408},{"type":"mousemove","time":5595,"x":372,"y":444},{"type":"mousemove","time":6534,"x":376,"y":444},{"type":"mousemove","time":6743,"x":477,"y":447}],"scrollY":371,"scrollX":0,"timestamp":1568044956076},{"name":"Action 3","ops":[{"type":"mousemove","time":1063,"x":384,"y":345},{"type":"mousemove","time":1264,"x":224,"y":335},{"type":"mousemove","time":1472,"x":222,"y":335},{"type":"screenshot","time":2025}],"scrollY":901,"scrollX":0,"timestamp":1568044971045},{"name":"Action 4","ops":[{"type":"mousemove","time":547,"x":498,"y":307},{"type":"mousemove","time":747,"x":247,"y":322},{"type":"mousemove","time":955,"x":146,"y":330},{"type":"screenshot","time":1695}],"scrollY":1254,"scrollX":0,"timestamp":1568045000596},{"name":"Action 5","ops":[{"type":"mousemove","time":833,"x":479,"y":415},{"type":"mousemove","time":1041,"x":258,"y":384},{"type":"mousemove","time":1259,"x":255,"y":384},{"type":"screenshot","time":1742},{"type":"mousemove","time":2167,"x":256,"y":384},{"type":"mousemove","time":2367,"x":455,"y":402},{"type":"mousemove","time":2577,"x":514,"y":407},{"type":"screenshot","time":3243}],"scrollY":1560,"scrollX":0,"timestamp":1568045020545},{"name":"Action 6","ops":[{"type":"mousemove","time":1518,"x":561,"y":419},{"type":"mousemove","time":1718,"x":342,"y":395},{"type":"mousemove","time":1918,"x":330,"y":394},{"type":"mousemove","time":2161,"x":330,"y":394},{"type":"screenshot","time":2643},{"type":"mousemove","time":2836,"x":334,"y":393},{"type":"mousemove","time":3036,"x":427,"y":379},{"type":"mousemove","time":3236,"x":503,"y":366},{"type":"mousemove","time":3450,"x":526,"y":355},{"type":"mousemove","time":3651,"x":549,"y":346},{"type":"screenshot","time":4619},{"type":"mousemove","time":4721,"x":555,"y":344},{"type":"mousemove","time":4922,"x":636,"y":320},{"type":"mousemove","time":5122,"x":653,"y":313},{"type":"mousemove","time":5355,"x":653,"y":313},{"type":"screenshot","time":6033}],"scrollY":1949,"scrollX":0,"timestamp":1568045029877},{"name":"Action 7","ops":[{"type":"mousemove","time":84,"x":749,"y":474},{"type":"mousemove","time":285,"x":574,"y":446},{"type":"mousemove","time":500,"x":536,"y":444},{"type":"mousemove","time":709,"x":529,"y":445},{"type":"mousemove","time":916,"x":527,"y":445},{"type":"screenshot","time":1274},{"type":"screenshot","time":2870},{"type":"mousemove","time":3663,"x":518,"y":445},{"type":"mousemove","time":3863,"x":238,"y":419},{"type":"mousemove","time":4063,"x":236,"y":419},{"type":"mousemove","time":4263,"x":236,"y":420},{"type":"mousemove","time":6015,"x":230,"y":419},{"type":"mousemove","time":6215,"x":213,"y":417},{"type":"mousemove","time":6423,"x":219,"y":429},{"type":"mousemove","time":6566,"x":219,"y":429},{"type":"mousemove","time":6773,"x":200,"y":432},{"type":"mousemove","time":6982,"x":115,"y":422},{"type":"mousemove","time":7224,"x":115,"y":422},{"type":"mousemove","time":7399,"x":117,"y":422},{"type":"mousemove","time":7600,"x":395,"y":436},{"type":"mousemove","time":7808,"x":397,"y":437},{"type":"mousemove","time":8301,"x":388,"y":437},{"type":"mousemove","time":8511,"x":334,"y":434},{"type":"mousemove","time":8953,"x":335,"y":434},{"type":"mousemove","time":9162,"x":466,"y":440},{"type":"mousemove","time":9369,"x":483,"y":440},{"type":"mousemove","time":9569,"x":524,"y":440},{"type":"mousemove","time":9769,"x":496,"y":439},{"type":"mousemove","time":10169,"x":496,"y":439},{"type":"mousemove","time":10370,"x":487,"y":447},{"type":"mousemove","time":10570,"x":465,"y":475},{"type":"mousemove","time":10785,"x":465,"y":475},{"type":"mousemove","time":10979,"x":465,"y":476},{"type":"mousemove","time":11188,"x":426,"y":502},{"type":"mousemove","time":11461,"x":425,"y":502},{"type":"mousemove","time":11661,"x":392,"y":504},{"type":"mousemove","time":11870,"x":375,"y":503},{"type":"mousemove","time":12196,"x":375,"y":503},{"type":"mousemove","time":12406,"x":336,"y":503},{"type":"mousemove","time":12621,"x":332,"y":503},{"type":"mousemove","time":12880,"x":332,"y":503},{"type":"screenshot","time":14160},{"type":"mousemove","time":16617,"x":331,"y":503}],"scrollY":2512,"scrollX":0,"timestamp":1568045076317},{"name":"Action 8","ops":[{"type":"mousemove","time":309,"x":359,"y":416},{"type":"mousemove","time":509,"x":355,"y":444},{"type":"mousemove","time":716,"x":355,"y":445},{"type":"mousemove","time":2594,"x":355,"y":446},{"type":"mousemove","time":2795,"x":379,"y":478},{"type":"mousemove","time":3004,"x":399,"y":492},{"type":"mousemove","time":3220,"x":400,"y":492},{"type":"screenshot","time":4078},{"type":"mousemove","time":4353,"x":402,"y":490},{"type":"mousemove","time":4554,"x":427,"y":439},{"type":"mousemove","time":4762,"x":431,"y":423},{"type":"mousemove","time":5387,"x":431,"y":423},{"type":"screenshot","time":5579},{"type":"mousemove","time":6372,"x":431,"y":423},{"type":"mousemove","time":6572,"x":431,"y":423}],"scrollY":2989,"scrollX":0,"timestamp":1568045103543},{"name":"Action 9","ops":[{"type":"mousemove","time":514,"x":388,"y":421},{"type":"mousemove","time":714,"x":358,"y":424},{"type":"mousemove","time":914,"x":360,"y":423},{"type":"mousemove","time":1120,"x":363,"y":423},{"type":"screenshot","time":1499},{"type":"mousemove","time":1672,"x":360,"y":421},{"type":"mousemove","time":1872,"x":93,"y":272},{"type":"mousemove","time":2080,"x":91,"y":271},{"type":"screenshot","time":2915}],"scrollY":3767,"scrollX":0,"timestamp":1568045115708},{"name":"Action 10","ops":[{"type":"mousedown","time":1166,"x":366,"y":376},{"type":"mouseup","time":1285,"x":366,"y":376},{"time":1286,"delay":400,"type":"screenshot-auto"}],"scrollY":4118,"scrollX":0,"timestamp":1568045124648},{"name":"Action 11","ops":[{"type":"mousemove","time":409,"x":481,"y":65},{"type":"mousemove","time":616,"x":454,"y":88},{"type":"mousemove","time":823,"x":439,"y":101},{"type":"mousemove","time":1040,"x":435,"y":116},{"type":"screenshot","time":2112},{"type":"mousemove","time":2468,"x":435,"y":117},{"type":"mousemove","time":2669,"x":438,"y":132},{"type":"screenshot","time":3861},{"type":"mousemove","time":4317,"x":439,"y":132},{"type":"mousemove","time":4518,"x":506,"y":117},{"type":"mousemove","time":4740,"x":519,"y":108},{"type":"mousemove","time":4941,"x":519,"y":106},{"type":"mousemove","time":5009,"x":524,"y":105},{"type":"mousemove","time":5219,"x":554,"y":99},{"type":"mousemove","time":5364,"x":578,"y":90},{"type":"mousemove","time":5564,"x":650,"y":86},{"type":"mousemove","time":5819,"x":706,"y":86},{"type":"mousemove","time":6365,"x":709,"y":86},{"type":"mousemove","time":6568,"x":726,"y":89},{"type":"mousemove","time":6776,"x":761,"y":100},{"type":"mousemove","time":6976,"x":781,"y":108},{"type":"mousemove","time":7206,"x":787,"y":109},{"type":"mousedown","time":7598,"x":787,"y":109},{"type":"mouseup","time":7724,"x":787,"y":109},{"time":7725,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":8094,"x":785,"y":109},{"type":"mousemove","time":8294,"x":691,"y":99},{"type":"mousemove","time":9300,"x":429,"y":100},{"type":"mousemove","time":9502,"x":403,"y":105},{"type":"mousemove","time":9769,"x":398,"y":106},{"type":"screenshot","time":10559},{"type":"mousemove","time":11132,"x":397,"y":107},{"type":"mousemove","time":11336,"x":412,"y":124},{"type":"mousemove","time":11574,"x":420,"y":131},{"type":"screenshot","time":12252},{"type":"mousemove","time":13060,"x":432,"y":134},{"type":"mousemove","time":13269,"x":750,"y":73},{"type":"mousemove","time":13597,"x":744,"y":75}],"scrollY":5197,"scrollX":0,"timestamp":1718765653712}] \ No newline at end of file diff --git a/test/tooltip.html b/test/tooltip.html index d80804e8b1..070e63b88f 100644 --- a/test/tooltip.html +++ b/test/tooltip.html @@ -785,12 +785,25 @@

Tooltip shouldn't render legend name as HTML element by default