disallow calling ModalityState.current() from non-EDT

This commit is contained in:
peter
2016-09-28 18:45:03 +02:00
parent 27543fe191
commit abbffc933f
2 changed files with 17 additions and 0 deletions
@@ -319,6 +319,7 @@ public class LaterInvocator {
@NotNull
public static ModalityState getCurrentModalityState() {
ApplicationManager.getApplication().assertIsDispatchThread();
return ourModalityStack.peek();
}
@@ -19,6 +19,7 @@ import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Conditions;
import com.intellij.testFramework.LoggedErrorProcessor;
import com.intellij.testFramework.PlatformTestCase;
import com.intellij.testFramework.SkipInHeadlessEnvironment;
import com.intellij.testFramework.UsefulTestCase;
@@ -30,6 +31,9 @@ import javax.swing.*;
import java.awt.*;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
@SuppressWarnings({"SSBasedInspection", "SynchronizeOnThis"})
@SkipInHeadlessEnvironment
@@ -561,4 +565,16 @@ public class LaterInvocatorTest extends PlatformTestCase {
assertOrderedEquals(myOrder, "m12", "m2", "m1", "m1x");
});
}
public void testModalityStateCurrentAllowedOnlyFromEDT() throws Exception {
LoggedErrorProcessor.getInstance().disableStderrDumping(getTestRootDisposable());
Future<ModalityState> future = ApplicationManager.getApplication().executeOnPooledThread(() -> ModalityState.current());
try {
future.get(1000, TimeUnit.MILLISECONDS);
fail("should fail");
}
catch (ExecutionException e) {
assertTrue(e.getMessage(), e.getMessage().contains("Access is allowed from event dispatch thread only"));
}
}
}