Prevent enabling of tooltip markup after tooltip text is set

Add a check that tooltip text is not yet set at the time when the
tooltip markup enabled flag is set.

Bug 553067: Accidental XSS Possible with RAP
https://bugs.eclipse.org/bugs/show_bug.cgi?id=553067

Change-Id: If3e54d738273d5050b21d5061a45af5e750b09d3
Signed-off-by: Ivan Furnadjiev <ivan@eclipsesource.com>
diff --git a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/Grid.java b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/Grid.java
index 35e8d56..0eadb98 100644
--- a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/Grid.java
+++ b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/Grid.java
@@ -10,8 +10,9 @@
  ******************************************************************************/
 package org.eclipse.nebula.widgets.grid;
 
-import static org.eclipse.swt.internal.widgets.MarkupUtil.checkWidgetState;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.checkMarkupPrecondition;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isMarkupEnabledFor;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TEXT;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -2332,7 +2333,7 @@
   @Override
   public void setData( String key, Object value ) {
     if( !RWT.MARKUP_ENABLED.equals( key ) || !isMarkupEnabledFor( this ) ) {
-      checkWidgetState( key, () -> items.size() == 0 );
+      checkMarkupPrecondition( key, TEXT, () -> items.size() == 0 );
       super.setData( key, value );
     }
   }
diff --git a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumn.java b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumn.java
index e526049..44856e1 100644
--- a/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumn.java
+++ b/bundles/org.eclipse.rap.nebula.widgets.grid/src/org/eclipse/nebula/widgets/grid/GridColumn.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2015 EclipseSource and others.
+ * Copyright (c) 2012, 2019 EclipseSource and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -10,7 +10,9 @@
  ******************************************************************************/
 package org.eclipse.nebula.widgets.grid;
 
+import static org.eclipse.swt.internal.widgets.MarkupUtil.checkMarkupPrecondition;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isToolTipMarkupEnabledFor;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TOOLTIP;
 import static org.eclipse.swt.internal.widgets.MarkupValidator.isValidationDisabledFor;
 
 import org.eclipse.nebula.widgets.grid.internal.gridcolumnkit.GridColumnLCA;
@@ -1101,6 +1103,7 @@
   public void setData( String key, Object value ) {
     handleFooterSpan( key, value );
     if( !RWT.TOOLTIP_MARKUP_ENABLED.equals( key ) || !isToolTipMarkupEnabledFor( this ) ) {
+      checkMarkupPrecondition( key, TOOLTIP, () -> headerTooltip == null );
       super.setData( key, value );
     }
   }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/custom/CLabel.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/custom/CLabel.java
index 9b4a11b..c95bf67 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/custom/CLabel.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/custom/CLabel.java
@@ -12,8 +12,9 @@
 package org.eclipse.swt.custom;
 
 import static org.eclipse.rap.rwt.internal.textsize.TextSizeUtil.textExtent;
-import static org.eclipse.swt.internal.widgets.MarkupUtil.checkWidgetState;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.checkMarkupPrecondition;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isMarkupEnabledFor;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TEXT;
 import static org.eclipse.swt.internal.widgets.MarkupValidator.isValidationDisabledFor;
 
 import org.eclipse.rap.rwt.RWT;
@@ -684,7 +685,7 @@
   @Override
   public void setData( String key, Object value ) {
     if( !RWT.MARKUP_ENABLED.equals( key ) || !isMarkupEnabledFor( this ) ) {
-      checkWidgetState( key, () -> text == null || text.isEmpty() );
+      checkMarkupPrecondition( key, TEXT, () -> text == null || text.isEmpty() );
       super.setData( key, value );
     }
   }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/custom/CTabItem.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/custom/CTabItem.java
index 6a4ed11..4763dc5 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/custom/CTabItem.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/custom/CTabItem.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2016 Innoopract Informationssysteme GmbH.
+ * Copyright (c) 2002, 2019 Innoopract Informationssysteme GmbH.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,7 +11,9 @@
  ******************************************************************************/
 package org.eclipse.swt.custom;
 
+import static org.eclipse.swt.internal.widgets.MarkupUtil.checkMarkupPrecondition;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isToolTipMarkupEnabledFor;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TOOLTIP;
 import static org.eclipse.swt.internal.widgets.MarkupValidator.isValidationDisabledFor;
 
 import org.eclipse.rap.rwt.RWT;
@@ -129,7 +131,7 @@
    */
   public CTabItem( CTabFolder parent, int style, int index ) {
     super( parent, checkStyle( style ) );
-    this.showClose = ( style & SWT.CLOSE ) != 0;
+    showClose = ( style & SWT.CLOSE ) != 0;
     this.parent = parent;
     parent.createItem( this, index );
   }
@@ -142,7 +144,7 @@
         widgetFontAdapter = new IWidgetFontAdapter() {
           @Override
           public Font getUserFont() {
-            return CTabItem.this.font;
+            return font;
           }
         };
       }
@@ -444,6 +446,7 @@
   public void setData( String key, Object value ) {
     handleBadge( key, value );
     if( !RWT.TOOLTIP_MARKUP_ENABLED.equals( key ) || !isToolTipMarkupEnabledFor( this ) ) {
+      checkMarkupPrecondition( key, TOOLTIP, () -> toolTipText == null );
       super.setData( key, value );
     }
   }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/widgets/MarkupUtil.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/widgets/MarkupUtil.java
index f1c36a5..dbaab6f 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/widgets/MarkupUtil.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/widgets/MarkupUtil.java
@@ -10,6 +10,8 @@
  ******************************************************************************/
 package org.eclipse.swt.internal.widgets;
 
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TOOLTIP;
+
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.swt.SWTException;
 import org.eclipse.swt.widgets.Widget;
@@ -17,7 +19,12 @@
 
 public class MarkupUtil {
 
-  public interface WidgetStateChecker {
+  public enum MarkupTarget {
+    TEXT,
+    TOOLTIP
+  }
+
+  public interface MarkupPreconditionChecker {
     public boolean check();
   }
 
@@ -29,10 +36,15 @@
     return Boolean.TRUE.equals( widget.getData( RWT.TOOLTIP_MARKUP_ENABLED ) );
   }
 
-  public static void checkWidgetState( String key, WidgetStateChecker checker ) {
-    if( RWT.MARKUP_ENABLED.equals( key ) && !checker.check() ) {
+  public static void checkMarkupPrecondition( String key,
+                                              MarkupTarget target,
+                                              MarkupPreconditionChecker checker )
+  {
+    String dataKey = TOOLTIP.equals( target ) ? RWT.TOOLTIP_MARKUP_ENABLED : RWT.MARKUP_ENABLED;
+    String dataKeyName = TOOLTIP.equals( target ) ? "RWT.TOOLTIP_MARKUP_ENABLED" : "RWT.MARKUP_ENABLED";
+    if( dataKey.equals( key ) && !checker.check() ) {
       SWTException exception = new SWTException();
-      String message = "RWT.MARKUP_ENABLED must be set before any widget data.";
+      String message = dataKeyName + " must be set before any widget data.";
       exception.throwable = new IllegalStateException( message );
       throw exception;
     }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Button.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Button.java
index 11b8bb9..85475e5 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Button.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Button.java
@@ -13,8 +13,9 @@
 
 import static org.eclipse.rap.rwt.internal.textsize.TextSizeUtil.getCharHeight;
 import static org.eclipse.rap.rwt.internal.textsize.TextSizeUtil.textExtent;
-import static org.eclipse.swt.internal.widgets.MarkupUtil.checkWidgetState;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.checkMarkupPrecondition;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isMarkupEnabledFor;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TEXT;
 import static org.eclipse.swt.internal.widgets.MarkupValidator.isValidationDisabledFor;
 
 import org.eclipse.rap.rwt.RWT;
@@ -514,7 +515,7 @@
     } else if( RWT.MARKUP_ENABLED.equals( key ) && isMarkupEnabledFor( this ) ) {
       return;
     }
-    checkWidgetState( key, () -> text.isEmpty() );
+    checkMarkupPrecondition( key, TEXT, () -> text.isEmpty() );
     super.setData( key, value );
   }
 
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Control.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Control.java
index 42d497b..d8367ef 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Control.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Control.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2017 Innoopract Informationssysteme GmbH and others.
+ * Copyright (c) 2002, 2019 Innoopract Informationssysteme GmbH and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,7 +11,9 @@
  ******************************************************************************/
 package org.eclipse.swt.widgets;
 
+import static org.eclipse.swt.internal.widgets.MarkupUtil.checkMarkupPrecondition;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isToolTipMarkupEnabledFor;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TOOLTIP;
 import static org.eclipse.swt.internal.widgets.MarkupValidator.isValidationDisabledFor;
 
 import org.eclipse.rap.rwt.RWT;
@@ -2522,6 +2524,7 @@
     if( RWT.CUSTOM_VARIANT.equals( key ) ) {
       bufferedPadding = null;
     }
+    checkMarkupPrecondition( key, TOOLTIP, () -> toolTipText == null );
     super.setData( key, value );
   }
 
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Label.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Label.java
index 176d84d..3a72307 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Label.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Label.java
@@ -12,8 +12,9 @@
 package org.eclipse.swt.widgets;
 
 import static org.eclipse.rap.rwt.internal.textsize.TextSizeUtil.textExtent;
-import static org.eclipse.swt.internal.widgets.MarkupUtil.checkWidgetState;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.checkMarkupPrecondition;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isMarkupEnabledFor;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TEXT;
 import static org.eclipse.swt.internal.widgets.MarkupValidator.isValidationDisabledFor;
 
 import org.eclipse.rap.rwt.RWT;
@@ -321,7 +322,7 @@
   @Override
   public void setData( String key, Object value ) {
     if( !RWT.MARKUP_ENABLED.equals( key ) || !isMarkupEnabledFor( this ) ) {
-      checkWidgetState( key, () -> text.isEmpty() );
+      checkMarkupPrecondition( key, TEXT, () -> text.isEmpty() );
       super.setData( key, value );
     }
   }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/List.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/List.java
index f8295a2..0a2a354 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/List.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/List.java
@@ -12,8 +12,9 @@
 package org.eclipse.swt.widgets;
 
 import static org.eclipse.rap.rwt.internal.textsize.TextSizeUtil.stringExtent;
-import static org.eclipse.swt.internal.widgets.MarkupUtil.checkWidgetState;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.checkMarkupPrecondition;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isMarkupEnabledFor;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TEXT;
 import static org.eclipse.swt.internal.widgets.MarkupValidator.isValidationDisabledFor;
 
 import org.eclipse.rap.rwt.RWT;
@@ -1084,7 +1085,7 @@
       setCustomItemHeight( value );
     }
     if( !RWT.MARKUP_ENABLED.equals( key ) || !isMarkupEnabledFor( this ) ) {
-      checkWidgetState( key, () -> model.getItemCount() == 0 );
+      checkMarkupPrecondition( key, TEXT, () -> model.getItemCount() == 0 );
       super.setData( key, value );
     }
   }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TabItem.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TabItem.java
index b463bfc..2672360 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TabItem.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TabItem.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2015 Innoopract Informationssysteme GmbH and others.
+ * Copyright (c) 2002, 2019 Innoopract Informationssysteme GmbH and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,7 +11,9 @@
  ******************************************************************************/
 package org.eclipse.swt.widgets;
 
+import static org.eclipse.swt.internal.widgets.MarkupUtil.checkMarkupPrecondition;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isToolTipMarkupEnabledFor;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TOOLTIP;
 import static org.eclipse.swt.internal.widgets.MarkupValidator.isValidationDisabledFor;
 
 import org.eclipse.rap.rwt.RWT;
@@ -319,6 +321,7 @@
   public void setData( String key, Object value ) {
     handleBadge( key, value );
     if( !RWT.TOOLTIP_MARKUP_ENABLED.equals( key ) || !isToolTipMarkupEnabledFor( this ) ) {
+      checkMarkupPrecondition( key, TOOLTIP, () -> toolTipText == null );
       super.setData( key, value );
     }
   }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Table.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Table.java
index 9c87777..b042526 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Table.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Table.java
@@ -12,9 +12,10 @@
 package org.eclipse.swt.widgets;
 
 import static org.eclipse.rap.rwt.internal.textsize.TextSizeUtil.stringExtent;
-import static org.eclipse.swt.internal.widgets.MarkupUtil.checkWidgetState;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.checkMarkupPrecondition;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isMarkupEnabledFor;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isToolTipMarkupEnabledFor;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TEXT;
 import static org.eclipse.swt.internal.widgets.MarkupValidator.isValidationDisabledFor;
 
 import org.eclipse.rap.rwt.RWT;
@@ -402,7 +403,7 @@
       setPreloadedItems( value );
     }
     if( !RWT.MARKUP_ENABLED.equals( key ) || !isMarkupEnabledFor( this ) ) {
-      checkWidgetState( key, () -> itemCount == 0 );
+      checkMarkupPrecondition( key, TEXT, () -> itemCount == 0 );
       super.setData( key, value );
     }
   }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TableColumn.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TableColumn.java
index e97799d..db61067 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TableColumn.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TableColumn.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2015 Innoopract Informationssysteme GmbH and others.
+ * Copyright (c) 2002, 2019 Innoopract Informationssysteme GmbH and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,7 +11,9 @@
  ******************************************************************************/
 package org.eclipse.swt.widgets;
 
+import static org.eclipse.swt.internal.widgets.MarkupUtil.checkMarkupPrecondition;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isToolTipMarkupEnabledFor;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TOOLTIP;
 import static org.eclipse.swt.internal.widgets.MarkupValidator.isValidationDisabledFor;
 
 import org.eclipse.rap.rwt.RWT;
@@ -496,6 +498,7 @@
   @Override
   public void setData( String key, Object value ) {
     if( !RWT.TOOLTIP_MARKUP_ENABLED.equals( key ) || !isToolTipMarkupEnabledFor( this ) ) {
+      checkMarkupPrecondition( key, TOOLTIP, () -> toolTipText == null );
       super.setData( key, value );
     }
   }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/ToolItem.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/ToolItem.java
index 19d5b49..447d612 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/ToolItem.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/ToolItem.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2015 Innoopract Informationssysteme GmbH and others.
+ * Copyright (c) 2002, 2019 Innoopract Informationssysteme GmbH and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,7 +11,9 @@
  ******************************************************************************/
 package org.eclipse.swt.widgets;
 
+import static org.eclipse.swt.internal.widgets.MarkupUtil.checkMarkupPrecondition;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isToolTipMarkupEnabledFor;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TOOLTIP;
 import static org.eclipse.swt.internal.widgets.MarkupValidator.isValidationDisabledFor;
 
 import org.eclipse.rap.rwt.RWT;
@@ -402,6 +404,7 @@
     } else if( RWT.TOOLTIP_MARKUP_ENABLED.equals( key ) && isToolTipMarkupEnabledFor( this ) ) {
       return;
     }
+    checkMarkupPrecondition( key, TOOLTIP, () -> toolTipText == null );
     super.setData( key, value );
   }
 
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/ToolTip.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/ToolTip.java
index b0ab522..431f854 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/ToolTip.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/ToolTip.java
@@ -11,8 +11,9 @@
  ******************************************************************************/
 package org.eclipse.swt.widgets;
 
-import static org.eclipse.swt.internal.widgets.MarkupUtil.checkWidgetState;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.checkMarkupPrecondition;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isMarkupEnabledFor;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TEXT;
 import static org.eclipse.swt.internal.widgets.MarkupValidator.isValidationDisabledFor;
 
 import org.eclipse.rap.rwt.RWT;
@@ -436,7 +437,7 @@
   @Override
   public void setData( String key, Object value ) {
     if( !RWT.MARKUP_ENABLED.equals( key ) || !isMarkupEnabledFor( this ) ) {
-      checkWidgetState( key, () -> text.isEmpty() );
+      checkMarkupPrecondition( key, TEXT, () -> text.isEmpty() );
       super.setData( key, value );
     }
   }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Tree.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Tree.java
index 41d7d98..17c1e9a 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Tree.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Tree.java
@@ -12,9 +12,10 @@
 package org.eclipse.swt.widgets;
 
 import static org.eclipse.rap.rwt.internal.textsize.TextSizeUtil.stringExtent;
-import static org.eclipse.swt.internal.widgets.MarkupUtil.checkWidgetState;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.checkMarkupPrecondition;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isMarkupEnabledFor;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isToolTipMarkupEnabledFor;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TEXT;
 import static org.eclipse.swt.internal.widgets.MarkupValidator.isValidationDisabledFor;
 
 import java.util.ArrayList;
@@ -1712,7 +1713,7 @@
       setPreloadedItems( value );
     }
     if( !RWT.MARKUP_ENABLED.equals( key ) || !isMarkupEnabledFor( this ) ) {
-      checkWidgetState( key, () -> itemCount == 0 );
+      checkMarkupPrecondition( key, TEXT, () -> itemCount == 0 );
       super.setData( key, value );
     }
   }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TreeColumn.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TreeColumn.java
index 6c221de..f8c0c3d 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TreeColumn.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TreeColumn.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2015 Innoopract Informationssysteme GmbH and others.
+ * Copyright (c) 2002, 2019 Innoopract Informationssysteme GmbH and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,7 +11,9 @@
  ******************************************************************************/
 package org.eclipse.swt.widgets;
 
+import static org.eclipse.swt.internal.widgets.MarkupUtil.checkMarkupPrecondition;
 import static org.eclipse.swt.internal.widgets.MarkupUtil.isToolTipMarkupEnabledFor;
+import static org.eclipse.swt.internal.widgets.MarkupUtil.MarkupTarget.TOOLTIP;
 import static org.eclipse.swt.internal.widgets.MarkupValidator.isValidationDisabledFor;
 
 import org.eclipse.rap.rwt.RWT;
@@ -573,6 +575,7 @@
       parent.layoutCache.invalidateAll();
     }
     if( !RWT.TOOLTIP_MARKUP_ENABLED.equals( key ) || !isToolTipMarkupEnabledFor( this ) ) {
+      checkMarkupPrecondition( key, TOOLTIP, () -> toolTipText == null );
       super.setData( key, value );
     }
   }
diff --git a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumn_Test.java b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumn_Test.java
index bb3dfe9..5972609 100644
--- a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumn_Test.java
+++ b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/GridColumn_Test.java
@@ -32,6 +32,7 @@
 import org.eclipse.rap.rwt.testfixture.TestContext;
 import org.eclipse.rap.rwt.testfixture.internal.Fixture;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
 import org.eclipse.swt.events.ControlAdapter;
 import org.eclipse.swt.events.ControlListener;
 import org.eclipse.swt.events.DisposeEvent;
@@ -849,6 +850,26 @@
   }
 
   @Test
+  public void testSetToolTipMarkupEnabled_onDirtyWidget() {
+    column.setHeaderTooltip( "something" );
+
+    try {
+      column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+      fail();
+    } catch( SWTException expected ) {
+      assertTrue( expected.throwable instanceof IllegalStateException );
+    }
+  }
+
+  @Test
+  public void testSetToolTipMarkupEnabled_onDirtyWidget_onceEnabledBefore() {
+    column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+    column.setHeaderTooltip( "something" );
+
+    column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+  }
+
+  @Test
   public void testDisableMarkupIsIgnored() {
     column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
 
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/custom/CTabItem_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/custom/CTabItem_Test.java
index 5539b7e..c2d2f8b 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/custom/CTabItem_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/custom/CTabItem_Test.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2016 Innoopract Informationssysteme GmbH and others.
+ * Copyright (c) 2002, 2019 Innoopract Informationssysteme GmbH and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -27,6 +27,7 @@
 import org.eclipse.rap.rwt.testfixture.TestContext;
 import org.eclipse.rap.rwt.testfixture.internal.Fixture;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.internal.custom.ICTabFolderAdapter;
@@ -292,6 +293,26 @@
   }
 
   @Test
+  public void testSetToolTipMarkupEnabled_onDirtyWidget() {
+    item.setToolTipText( "something" );
+
+    try {
+      item.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+      fail();
+    } catch( SWTException expected ) {
+      assertTrue( expected.throwable instanceof IllegalStateException );
+    }
+  }
+
+  @Test
+  public void testSetToolTipMarkupEnabled_onDirtyWidget_onceEnabledBefore() {
+    item.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+    item.setToolTipText( "something" );
+
+    item.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+  }
+
+  @Test
   public void testDisableMarkupIsIgnored() {
     item.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
 
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Control_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Control_Test.java
index 1215dfe..52b2620 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Control_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Control_Test.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2017 Innoopract Informationssysteme GmbH and others.
+ * Copyright (c) 2009, 2019 Innoopract Informationssysteme GmbH and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -1587,6 +1587,26 @@
   }
 
   @Test
+  public void testSetToolTipMarkupEnabled_onDirtyWidget() {
+    shell.setToolTipText( "something" );
+
+    try {
+      shell.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+      fail();
+    } catch( SWTException expected ) {
+      assertTrue( expected.throwable instanceof IllegalStateException );
+    }
+  }
+
+  @Test
+  public void testSetToolTipMarkupEnabled_onDirtyWidget_onceEnabledBefore() {
+    shell.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+    shell.setToolTipText( "something" );
+
+    shell.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+  }
+
+  @Test
   public void testDisableMarkupIsIgnored() {
     shell.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
 
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TabItem_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TabItem_Test.java
index 64ff31c..e864691 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TabItem_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TabItem_Test.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2013, 2015 EclipseSource and others.
+ * Copyright (c) 2013, 2019 EclipseSource and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -25,6 +25,7 @@
 import org.eclipse.rap.rwt.testfixture.TestContext;
 import org.eclipse.rap.rwt.testfixture.internal.Fixture;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.internal.widgets.MarkupValidator;
@@ -211,6 +212,26 @@
   }
 
   @Test
+  public void testSetToolTipMarkupEnabled_onDirtyWidget() {
+    item.setToolTipText( "something" );
+
+    try {
+      item.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+      fail();
+    } catch( SWTException expected ) {
+      assertTrue( expected.throwable instanceof IllegalStateException );
+    }
+  }
+
+  @Test
+  public void testSetToolTipMarkupEnabled_onDirtyWidget_onceEnabledBefore() {
+    item.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+    item.setToolTipText( "something" );
+
+    item.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+  }
+
+  @Test
   public void testDisableMarkupIsIgnored() {
     item.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
 
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TableColumn_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TableColumn_Test.java
index fe99397..97f32af 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TableColumn_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TableColumn_Test.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2015 Innoopract Informationssysteme GmbH and others.
+ * Copyright (c) 2007, 2019 Innoopract Informationssysteme GmbH and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -28,6 +28,7 @@
 import org.eclipse.rap.rwt.testfixture.TestContext;
 import org.eclipse.rap.rwt.testfixture.internal.Fixture;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
 import org.eclipse.swt.events.ControlAdapter;
 import org.eclipse.swt.events.ControlEvent;
 import org.eclipse.swt.events.ControlListener;
@@ -477,6 +478,26 @@
   }
 
   @Test
+  public void testSetToolTipMarkupEnabled_onDirtyWidget() {
+    column.setToolTipText( "something" );
+
+    try {
+      column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+      fail();
+    } catch( SWTException expected ) {
+      assertTrue( expected.throwable instanceof IllegalStateException );
+    }
+  }
+
+  @Test
+  public void testSetToolTipMarkupEnabled_onDirtyWidget_onceEnabledBefore() {
+    column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+    column.setToolTipText( "something" );
+
+    column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+  }
+
+  @Test
   public void testDisableMarkupIsIgnored() {
     column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
 
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/ToolItem_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/ToolItem_Test.java
index 858a8a2..f99c431 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/ToolItem_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/ToolItem_Test.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009, 2015 EclipseSource and others.
+ * Copyright (c) 2009, 2019 EclipseSource and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -22,6 +22,7 @@
 import org.eclipse.rap.rwt.internal.lifecycle.WidgetLCA;
 import org.eclipse.rap.rwt.testfixture.TestContext;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.internal.widgets.MarkupValidator;
 import org.eclipse.swt.internal.widgets.toolitemkit.ToolItemLCA;
@@ -305,6 +306,26 @@
   }
 
   @Test
+  public void testSetToolTipMarkupEnabled_onDirtyWidget() {
+    toolItem.setToolTipText( "something" );
+
+    try {
+      toolItem.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+      fail();
+    } catch( SWTException expected ) {
+      assertTrue( expected.throwable instanceof IllegalStateException );
+    }
+  }
+
+  @Test
+  public void testSetToolTipMarkupEnabled_onDirtyWidget_onceEnabledBefore() {
+    toolItem.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+    toolItem.setToolTipText( "something" );
+
+    toolItem.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+  }
+
+  @Test
   public void testDisableMarkupIsIgnored() {
     toolItem.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
 
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TreeColumn_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TreeColumn_Test.java
index 8d9b449..7ad2f48 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TreeColumn_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TreeColumn_Test.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2015 Innoopract Informationssysteme GmbH and others.
+ * Copyright (c) 2007, 2019 Innoopract Informationssysteme GmbH and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -29,6 +29,7 @@
 import org.eclipse.rap.rwt.testfixture.TestContext;
 import org.eclipse.rap.rwt.testfixture.internal.Fixture;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
 import org.eclipse.swt.events.ControlListener;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Image;
@@ -398,6 +399,26 @@
   }
 
   @Test
+  public void testSetToolTipMarkupEnabled_onDirtyWidget() {
+    column.setToolTipText( "something" );
+
+    try {
+      column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+      fail();
+    } catch( SWTException expected ) {
+      assertTrue( expected.throwable instanceof IllegalStateException );
+    }
+  }
+
+  @Test
+  public void testSetToolTipMarkupEnabled_onDirtyWidget_onceEnabledBefore() {
+    column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+    column.setToolTipText( "something" );
+
+    column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );
+  }
+
+  @Test
   public void testDisableMarkupIsIgnored() {
     column.setData( RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE );