diff options
author | Pawel Piech | 2012-10-04 22:12:32 +0000 |
---|---|---|
committer | Pawel Piech | 2012-10-04 22:15:55 +0000 |
commit | edfab47671de30ab12d17294cb58ff12f3e7b4c4 (patch) | |
tree | 01e091dd6c2aa7c28cfc5d46cae896d631f748f0 | |
parent | 65d0355c6752ef05db3c570823b5ea00d3b0b574 (diff) | |
download | eclipse.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.
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 |