Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Loskutov2017-02-19 07:22:54 +0000
committerAndrey Loskutov2017-02-19 07:55:12 +0000
commit42867e454f548f766bc574e480d3e7dda0f675ea (patch)
tree43eccd3e493415d5bb198a1997ce34c778b7d476 /org.eclipse.ui.editors.tests
parentf85976cf2deff630448510b18ec517fa21dc9da4 (diff)
downloadeclipse.platform.text-42867e454f548f766bc574e480d3e7dda0f675ea.tar.gz
eclipse.platform.text-42867e454f548f766bc574e480d3e7dda0f675ea.tar.xz
eclipse.platform.text-42867e454f548f766bc574e480d3e7dda0f675ea.zip
Bug 320672 - [WorkbenchParts] [Compatibility] SWTException when
activating an editor with stale content This is the second part of the fix for bug 320672, the first one is covered by bug 511873. Remember if we are in the middle of the focus state change. During this operation we should not attempt to call updatePartControl() from sanityCheckState() (which is called on part activation) because it can dispose widgets we are currently setting focus to. In theory, this can happen from other protected methods here too, but I'm trying to keep the patch as small as possible because this class is a base class for MANY other text editors. Change-Id: Ibb860eac30986b6ed3a155f809dc58c9db082ff1 Signed-off-by: Andrey Loskutov <loskutov@gmx.de> Also-by: Vasili Gulevich <vasili.gulevich@xored.com>
Diffstat (limited to 'org.eclipse.ui.editors.tests')
-rw-r--r--org.eclipse.ui.editors.tests/META-INF/MANIFEST.MF4
-rw-r--r--org.eclipse.ui.editors.tests/pom.xml2
-rw-r--r--org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/EditorsTestSuite.java3
-rw-r--r--org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/StatusEditorTest.java117
4 files changed, 123 insertions, 3 deletions
diff --git a/org.eclipse.ui.editors.tests/META-INF/MANIFEST.MF b/org.eclipse.ui.editors.tests/META-INF/MANIFEST.MF
index 95423a228df..68229c02dd9 100644
--- a/org.eclipse.ui.editors.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.ui.editors.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Plugin.name
Bundle-SymbolicName: org.eclipse.ui.editors.tests;singleton:=true
-Bundle-Version: 3.10.0.qualifier
+Bundle-Version: 3.11.0.qualifier
Bundle-Vendor: %Plugin.providerName
Bundle-Localization: plugin
Export-Package: org.eclipse.ui.editors.tests
@@ -17,6 +17,8 @@ Require-Bundle:
org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)",
org.eclipse.core.filebuffers.tests;bundle-version="[3.4.100,4.0.0)",
org.eclipse.ui.ide;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.core.filesystem;bundle-version="1.7.0",
+ org.eclipse.e4.ui.model.workbench;bundle-version="1.3.0",
org.eclipse.text.tests;bundle-version="[3.5.0,4.0.0)"
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Eclipse-BundleShape: dir
diff --git a/org.eclipse.ui.editors.tests/pom.xml b/org.eclipse.ui.editors.tests/pom.xml
index 62bb4434a6c..613138b003c 100644
--- a/org.eclipse.ui.editors.tests/pom.xml
+++ b/org.eclipse.ui.editors.tests/pom.xml
@@ -19,7 +19,7 @@
</parent>
<groupId>org.eclipse.ui</groupId>
<artifactId>org.eclipse.ui.editors.tests</artifactId>
- <version>3.10.0-SNAPSHOT</version>
+ <version>3.11.0-SNAPSHOT</version>
<packaging>eclipse-test-plugin</packaging>
<properties>
<testSuite>${project.artifactId}</testSuite>
diff --git a/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/EditorsTestSuite.java b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/EditorsTestSuite.java
index 6b1e4b01150..9904134fb11 100644
--- a/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/EditorsTestSuite.java
+++ b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/EditorsTestSuite.java
@@ -28,7 +28,8 @@ import org.junit.runners.Suite.SuiteClasses;
SegmentedModeTest.class,
MarkerAnnotationOrderTest.class,
ZoomTest.class,
- FileDocumentProviderTest.class
+ FileDocumentProviderTest.class,
+ StatusEditorTest.class
})
public class EditorsTestSuite {
// see @SuiteClasses
diff --git a/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/StatusEditorTest.java b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/StatusEditorTest.java
new file mode 100644
index 00000000000..2a12d15005f
--- /dev/null
+++ b/org.eclipse.ui.editors.tests/src/org/eclipse/ui/editors/tests/StatusEditorTest.java
@@ -0,0 +1,117 @@
+package org.eclipse.ui.editors.tests;
+
+import java.lang.reflect.Method;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.widgets.Display;
+
+import org.eclipse.core.filesystem.EFS;
+
+import org.eclipse.core.runtime.ILog;
+import org.eclipse.core.runtime.ILogListener;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.WorkbenchException;
+import org.eclipse.ui.ide.FileStoreEditorInput;
+import org.eclipse.ui.internal.PartSite;
+
+import org.eclipse.ui.texteditor.AbstractTextEditor;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.editors.text.ForwardingDocumentProvider;
+import org.eclipse.ui.editors.text.TextEditor;
+
+public class StatusEditorTest {
+ private IWorkbenchWindow window;
+ private Display display;
+ private IWorkbenchPage page;
+
+ @Before
+ public void before() throws WorkbenchException {
+ window = PlatformUI.getWorkbench().openWorkbenchWindow(null);
+ display = window.getShell().getDisplay();
+ page = window.getActivePage();
+ processEvents();
+ }
+
+ @After
+ public void after() {
+ window.close();
+ page = null;
+ processEvents();
+ }
+
+ /*
+ * https://bugs.eclipse.org/bugs/attachment.cgi?bugid=320672
+ *
+ * No exceptions are thrown when a status editor displaying an erroneous status is activated with a mouse click.
+ * @throws Exception
+ */
+ @Test
+ public void doNotThrowOnActivationInStale() throws Exception {
+ IEditorPart editor1 = openNonExistentFile(page, new URI("file:/1.txt"));
+ openNonExistentFile(page, new URI("file:/2.txt"));
+ ILog log = Platform.getLog(Platform.getBundle("org.eclipse.e4.ui.workbench"));
+ List<String> logEvents = new ArrayList<>();
+ ILogListener listener = (status, plugin) -> logEvents.add(status.toString());
+ log.addLogListener(listener);
+ // Clicks are not equivalent to activation from API, so we need this
+ // hack to imitate tab clicks.
+ CTabFolder folder = (CTabFolder) (((PartSite) editor1.getSite()).getModel().getParent().getWidget());
+ try {
+ folder.setSelection(0);
+ processEvents();
+ folder.setSelection(1);
+ processEvents();
+ } finally {
+ log.removeLogListener(listener);
+ }
+ if(!logEvents.isEmpty()) {
+ Assert.assertEquals("Unexpected errors logged", "", logEvents.toString());
+ }
+ }
+
+ private void processEvents() {
+ while (display.readAndDispatch()) {
+ //
+ }
+ }
+
+ private IEditorPart openNonExistentFile(IWorkbenchPage page1, URI uri) throws Exception {
+ FileStoreEditorInput input = new FileStoreEditorInput(EFS.getStore(uri));
+ TextEditor editor = (TextEditor) page1.openEditor(input, EditorsUI.DEFAULT_TEXT_EDITOR_ID, true);
+ Method setMethod= AbstractTextEditor.class.getDeclaredMethod("setDocumentProvider", IDocumentProvider.class);
+ setMethod.setAccessible(true);
+ setMethod.invoke(editor, new ErrorDocumentProvider(editor.getDocumentProvider()));
+ editor.setInput(input);
+ processEvents();
+ return editor;
+ }
+
+ private static class ErrorDocumentProvider extends ForwardingDocumentProvider {
+ public ErrorDocumentProvider(IDocumentProvider parent) {
+ super("", ignored -> { /**/ }, parent);
+ }
+
+ @Override
+ public IStatus getStatus(Object element) {
+ return new Status(IStatus.ERROR, "org.eclipse.ui.workbench.texteditor.tests",
+ 0, "This document provider always fails", null);
+ }
+ }
+}

Back to the top