Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPawel Piech2012-10-04 22:12:32 +0000
committerPawel Piech2012-10-04 22:15:55 +0000
commitedfab47671de30ab12d17294cb58ff12f3e7b4c4 (patch)
tree01e091dd6c2aa7c28cfc5d46cae896d631f748f0
parent65d0355c6752ef05db3c570823b5ea00d3b0b574 (diff)
downloadeclipse.platform.debug-edfab47671de30ab12d17294cb58ff12f3e7b4c4.tar.gz
eclipse.platform.debug-edfab47671de30ab12d17294cb58ff12f3e7b4c4.tar.xz
eclipse.platform.debug-edfab47671de30ab12d17294cb58ff12f3e7b4c4.zip
Bug 380288 - NPE switching to the Breakpoints View
Added guard to prevent updating viewer while input == null.
-rw-r--r--org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java34
-rw-r--r--org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java1
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java4
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.java5
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java4
5 files changed, 40 insertions, 8 deletions
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java
index 3f63ba195..9a6ac7950 100644
--- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java
@@ -1130,4 +1130,38 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi
Assert.assertTrue("RESTORE started before SAVE to complete", fListener.isFinished(STATE_SAVE_COMPLETE));
}
+ /**
+ * This test tries to restore a viewer state while input == null.
+ * See: Bug 380288 - NPE switching to the Breakpoints View
+ */
+ public void testUpdateWithNullInput() throws InterruptedException {
+ TestModel model = TestModel.simpleMultiLevel();
+ fViewer.setAutoExpandLevel(-1);
+
+ // Create the listener
+ fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false);
+
+ // Set the input into the view and update the view.
+ fViewer.setInput(model.getRootElement());
+ while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0);
+ model.validateData(fViewer, TreePath.EMPTY);
+
+ ModelDelta expandedState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE);
+ fViewer.saveElementState(TreePath.EMPTY, expandedState, IModelDelta.EXPAND);
+
+ // Refresh the viewer so that updates are generated.
+ fListener.reset();
+ fListener.addChildreCountUpdate(TreePath.EMPTY);
+ model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT));
+
+ // Wait for the delta to be processed.
+ while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILD_COUNT_UPDATES))
+ if (!fDisplay.readAndDispatch ()) Thread.sleep(0);
+
+ fViewer.setInput(null);
+ fViewer.updateViewer(expandedState);
+
+ while (!fListener.isFinished(CONTENT_COMPLETE | VIEWER_UPDATES_RUNNING)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0);
+
+ }
}
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java
index a499ae5e7..1b23bdb4e 100644
--- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java
@@ -637,7 +637,6 @@ abstract public class UpdateTests extends TestCase implements ITestModelUpdatesL
}
-
private void completeQueuedUpdatesOfType(TestModel model, Class updateClass) {
List updatesToComplete = new LinkedList();
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java
index 871c84a2c..8d89714e7 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenCountUpdate.java
@@ -232,9 +232,7 @@ class ChildrenCountUpdate extends ViewerUpdateMonitor implements IChildrenCountU
protected boolean doEquals(ViewerUpdateMonitor update) {
return
update instanceof ChildrenCountUpdate &&
- // Bug 380288 - workaround a race condition where update is initialized with null input.
- ((getViewerInput() == null && update.getViewerInput() == null) ||
- (getViewerInput() != null && getViewerInput().equals(update.getViewerInput()))) &&
+ getViewerInput().equals(update.getViewerInput()) &&
getElementPath().equals(getElementPath());
}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.java
index 07351334e..6397a2bdc 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ChildrenUpdate.java
@@ -223,16 +223,13 @@ public class ChildrenUpdate extends ViewerUpdateMonitor implements IChildrenUpda
update instanceof ChildrenUpdate &&
((ChildrenUpdate)update).getOffset() == getOffset() &&
((ChildrenUpdate)update).getLength() == getLength() &&
- // Bug 380288 - workaround a race condition where update is initialized with null input.
- ((getViewerInput() == null && update.getViewerInput() == null) ||
- (getViewerInput() != null && getViewerInput().equals(update.getViewerInput()))) &&
+ getViewerInput().equals(update.getViewerInput()) &&
getElementPath().equals(getElementPath());
}
protected int doHashCode() {
return (int)Math.pow(
(getClass().hashCode() + getViewerInput().hashCode() + getElementPath().hashCode()) * (getOffset() + 2),
-
getLength() + 2);
}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java
index f488f32e6..b95ffa248 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java
@@ -426,6 +426,10 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon
}
public void updateModel(IModelDelta delta, int mask) {
+ // Processing deltas with null input leads to NPEs
+ // (Bug 380288 - NPE switching to the Breakpoints View)
+ if (getViewer() == null || getViewer().getInput() == null) return;
+
IModelDelta[] deltaArray = new IModelDelta[] { delta };
updateNodes(deltaArray, mask & (IModelDelta.REMOVED | IModelDelta.UNINSTALL));
updateNodes(deltaArray, mask & ITreeModelContentProvider.UPDATE_MODEL_DELTA_FLAGS

Back to the top