Bug 399665: Part references leak view/editor site after part is disposed
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/search/SearchLeakTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/search/SearchLeakTest.java
index 54247dc..4c000b8 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/search/SearchLeakTest.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/search/SearchLeakTest.java
@@ -10,6 +10,18 @@
  *******************************************************************************/
 package org.eclipse.jdt.ui.tests.search;
 
+import org.eclipse.jdt.testplugin.util.DisplayHelper;
+
+import org.eclipse.swt.widgets.Display;
+
+import org.eclipse.ui.editors.text.TextEditor;
+
+import org.eclipse.search.internal.ui.text.FileSearchPage;
+import org.eclipse.search.internal.ui.text.FileSearchQuery;
+import org.eclipse.search.ui.ISearchResultViewPart;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.search.ui.text.FileTextSearchScope;
+
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
@@ -18,10 +30,12 @@
 import org.eclipse.jdt.ui.leaktest.LeakTestCase;
 import org.eclipse.jdt.ui.leaktest.LeakTestSetup;
 
+import org.eclipse.jdt.internal.ui.JavaPlugin;
 import org.eclipse.jdt.internal.ui.search.JavaSearchQuery;
 import org.eclipse.jdt.internal.ui.search.JavaSearchResult;
 
 /**
+ * XXX: Every test in this class needs a delegate method in {@link SearchLeakTestWrapper}!
  */
 public class SearchLeakTest extends LeakTestCase {
 
@@ -57,10 +71,33 @@
 		query2= null;
 		assertInstanceCount(JavaSearchResult.class, 0);
 	}
+	
 	public void testRemoveAllQueries() throws Exception {
 		SearchTestHelper.runMethodRefQuery("junit.framework.Test", "countTestCases", new String[0]);
 		SearchTestHelper.runMethodRefQuery("junit.framework.TestCase", "countTestCases", new String[0]);
 		InternalSearchUI.getInstance().removeAllQueries();
 		assertInstanceCount(JavaSearchResult.class, 0);
 	}
+	
+	public void testSearchResultEditorClose() throws Exception {
+		assertInstanceCount(TextEditor.class, 0);
+		
+		FileTextSearchScope scope= FileTextSearchScope.newWorkspaceScope(null, false);
+		FileSearchQuery query= new FileSearchQuery("projectDescription", false, false, scope);
+		NewSearchUI.runQueryInForeground(null, query);
+		ISearchResultViewPart view= NewSearchUI.getSearchResultView();
+		FileSearchPage page= (FileSearchPage) view.getActivePage();
+		
+		DisplayHelper.sleep(Display.getDefault(), 2000);
+		page.gotoNextMatch();
+		
+		assertInstanceCount(TextEditor.class, 1);
+		
+		assertTrue(JavaPlugin.getActivePage().closeAllEditors(false));
+		
+		assertInstanceCount(TextEditor.class, 0);
+		
+		NewSearchUI.removeQuery(query);
+	}
+
 }
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/search/SearchLeakTestWrapper.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/search/SearchLeakTestWrapper.java
index e56eb72..03b1635 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/search/SearchLeakTestWrapper.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/search/SearchLeakTestWrapper.java
@@ -61,4 +61,8 @@
 	public void testRemoveAllQueries() throws Exception {
 		fTest.testRemoveAllQueries();
 	}
+
+	public void testSearchResultEditorClose() throws Exception {
+		fTest.testSearchResultEditorClose();
+	}
 }