--- /dev/null
+package com.vaadin.tests.layouts;\r
+\r
+import com.vaadin.tests.components.TestBase;\r
+import com.vaadin.ui.Button;\r
+import com.vaadin.ui.GridLayout;\r
+import com.vaadin.ui.Label;\r
+import com.vaadin.ui.VerticalLayout;\r
+import com.vaadin.ui.Button.ClickEvent;\r
+\r
+public class GridLayoutNPE extends TestBase {\r
+\r
+ @Override\r
+ protected void setup() {\r
+ final VerticalLayout lo = new VerticalLayout();\r
+\r
+ final GridLayout gl = new GridLayout(2, 1);\r
+ gl.setSpacing(true);\r
+\r
+ final Label toRemove = new Label("First");\r
+ gl.addComponent(toRemove);\r
+ final Label toEdit = new Label("Second");\r
+ gl.addComponent(toEdit);\r
+\r
+ final Button b = new Button("remove 'First'");\r
+ final Button b2 = new Button("edit 'Second'");\r
+ b2.setVisible(false);\r
+\r
+ lo.addComponent(gl);\r
+ lo.addComponent(b);\r
+ lo.addComponent(b2);\r
+\r
+ b.addListener(new Button.ClickListener() {\r
+\r
+ public void buttonClick(Button.ClickEvent event) {\r
+ gl.removeComponent(toRemove);\r
+\r
+ // move another component to where the first was removed\r
+ // before rendering to the client\r
+ gl.removeComponent(toEdit);\r
+ // this could also be the result of removeAllComponents()\r
+ // followed by a loop of addComponent(c)\r
+ gl.addComponent(toEdit, 0, 0);\r
+\r
+ b.setVisible(false);\r
+ b2.setVisible(true);\r
+\r
+ }\r
+\r
+ });\r
+\r
+ b2.addListener(new Button.ClickListener() {\r
+\r
+ public void buttonClick(ClickEvent event) {\r
+ toEdit.setValue("Second (edited)");\r
+ }\r
+\r
+ });\r
+\r
+ addComponent(lo);\r
+ }\r
+\r
+ @Override\r
+ protected String getDescription() {\r
+ return "VGridLayout throws an NPE, causing client side to crash";\r
+ }\r
+\r
+ @Override\r
+ protected Integer getTicketNumber() {\r
+ return 4019;\r
+ }\r
+\r
+}\r