From abbffc933ff652660146eeb4731818eeeb340ddb Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 28 Sep 2016 18:36:31 +0200 Subject: [PATCH] disallow calling ModalityState.current() from non-EDT --- .../openapi/application/impl/LaterInvocator.java | 1 + .../application/impl/LaterInvocatorTest.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java index 81c0b5e97f0e..d7773879c448 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/LaterInvocator.java @@ -319,6 +319,7 @@ public class LaterInvocator { @NotNull public static ModalityState getCurrentModalityState() { + ApplicationManager.getApplication().assertIsDispatchThread(); return ourModalityStack.peek(); } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/application/impl/LaterInvocatorTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/application/impl/LaterInvocatorTest.java index 2fc0c573c217..c8902987347c 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/application/impl/LaterInvocatorTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/application/impl/LaterInvocatorTest.java @@ -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 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")); + } + } }