Major
Nice to have
Detail
Ein Tooltip ist ein HTML-String. Wenn man den internationalisierten Text in einem Tooltip über einen tl:ResKey mit dynamischen Argumenten erzeugt, dann muss man sicherstellen, dass alle Argumente vorher gequotet werden. Ansonsten wird das Argument in die Message as-is eingefügt. Enthält das Argument HTML-Code, so wird dieser im Browser ausgeführt.
Ein Beispiel ist hierfür der tl:ResourceProvider für tl:Person:
Genauso katastrophal ist es, als Tooltip einfach getLabel() zurückzugeben. Da das Label ein beliebiger String ist, der Tooltip aber HTML, muss das Label vorher gequotet werden, um als Tooltip verwendet werden zu können:
Die Probleme dieser Bauart sind nahezu unzählig:
- com.top_logic.util.monitor.db.SQLResourceProvider
- com.top_logic.kafka.layout.sensors.SensorActivityStateResourceProvider
- com.top_logic.risk.layout.RiskItemAccessor.MetaElementTypeResourceProvider
- com.top_logic.extensions.ewe.layout.worklist.WorklistEntryResourceProvider
- com.top_logic.project.pos.reporting.producer.MTAChartModelBuilder.createUI().new I18NResourceProvider() {...}.(ResPrefix)
- com.top_logic.milestone.reporting.mta.MTAFilterComponent.fill().new I18NResourceProvider() {...}.(ResPrefix)
- com.top_logic.risk.layout.label.StatusReportResourceProvider
- com.top_logic.vw.pmt.riskitem.PMTRiskResourceProvider (mgrType)
- com.top_logic.vw.pmt.layout.targetproduct.TargetProductResourceProvider (theType)
- com.top_logic.vw.pmt.program.PMTProgramResourceProvider (theType)
- com.top_logic.knowledge.gui.layout.person.PersonResourceProvider
- com.top_logic.project.stem.effort.EffortLineResourceProvider
- com.top_logic.committee.layout.decision.DecisionMemoResourceProvider
- com.top_logic.contact.layout.ContactResourceProvider (super.getLabel())
- com.top_logic.vw.pmt.layout.orgUnit.CritResponseResourceProvider
Die einzig sichere Lösung scheint zu sein, dass die API String getTooltip() in tl:ResourceProvider verschwinden muss.
Valide Tooltips
- Ist der Tooltip die Übersetzung eines ResKey's mit Argumenten müssen die Argumente gequotet werden. Z.B: {{{
String getTooltip(Object o) { return _resources.getMessage(_tooltipKey, TagUtil.encodeXML(arg1), ... ,TagUtil.encodeXML(arg_n)); } }}}
- Wird der Tooltip über andere Funktionen bestimmt (z.B. über das Label) so muß vor der Rückgabe der Wert gequotet werden: {{{
String getTooltip(Object o) { return TagUtil.encodeXML(getLabel(o))); } }}}
Code-Migration
Überschreibungen von AbstractTLItemResourceProvider#getTooltipValues(Resources, Object) müssen die plain Tooltipwerte zurückgeben. Das Quoten der Werte findet in der Oberklasse statt, d.h. Aufrufe von TagUtil#encodeXML(...) für Werte in dem Ergebnis-Array entfallen.
Test
Bsp. für den tl:ResourceProvider für tl:Person:
- Zugang anlegen
- Zugang den Vornamen <img src="error.png"/>
- Zugehörigen Kontakt anzeigen.
- Tooltip des Links zu dem Zugang anzeigen.
- Erwartung: Es wird nicht ein fehlendes Bild, sondern <img src="error.png"/> als Vorname angezeigt.