From 462e469d36246bcada38c12fedff31e22e1556df Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 2 Feb 2017 17:42:33 +0300 Subject: [PATCH] more diagnostics for blinking testKeyboardEventsAreDetected() --- .../src/com/intellij/ide/IdeEventQueue.java | 8 +++++- .../com/intellij/ide/IdeEventQueueTest.java | 26 ++++++++++++++----- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java index f24c80d41cd1..5463e83a257c 100644 --- a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java +++ b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java @@ -1141,8 +1141,13 @@ public class IdeEventQueue extends EventQueue { private final FrequentEventDetector myFrequentEventDetector = new FrequentEventDetector(1009, 100); @Override public void postEvent(@NotNull AWTEvent event) { + doPostEvent(event); + } + + // return true if posted, false if consumed immediately + boolean doPostEvent(@NotNull AWTEvent event) { for (PostEventHook listener : myPostEventListeners.getListeners()) { - if (listener.consumePostedEvent(event)) return; + if (listener.consumePostedEvent(event)) return false; } myFrequentEventDetector.eventHappened(event); @@ -1150,6 +1155,7 @@ public class IdeEventQueue extends EventQueue { myKeyboardEventsPosted.incrementAndGet(); } super.postEvent(event); + return true; } private static boolean isKeyboardEvent(@NotNull AWTEvent event) { diff --git a/platform/platform-tests/testSrc/com/intellij/ide/IdeEventQueueTest.java b/platform/platform-tests/testSrc/com/intellij/ide/IdeEventQueueTest.java index b6d8fb5a3d72..7d9c6b0d5b02 100644 --- a/platform/platform-tests/testSrc/com/intellij/ide/IdeEventQueueTest.java +++ b/platform/platform-tests/testSrc/com/intellij/ide/IdeEventQueueTest.java @@ -17,11 +17,15 @@ package com.intellij.ide; import com.intellij.testFramework.PlatformTestCase; import com.intellij.testFramework.PlatformTestUtil; +import com.intellij.util.ReflectionUtil; import com.intellij.util.ui.UIUtil; import javax.swing.*; import java.awt.*; -import java.awt.event.*; +import java.awt.event.ActionEvent; +import java.awt.event.InputEvent; +import java.awt.event.InvocationEvent; +import java.awt.event.KeyEvent; import java.util.concurrent.atomic.AtomicInteger; public class IdeEventQueueTest extends PlatformTestCase { @@ -42,14 +46,13 @@ public class IdeEventQueueTest extends PlatformTestCase { assertTrue(EventQueue.isDispatchThread()); IdeEventQueue ideEventQueue = IdeEventQueue.getInstance(); - EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue(); - assertSame(ideEventQueue, eventQueue); + assertSame(ideEventQueue, Toolkit.getDefaultToolkit().getSystemEventQueue()); PlatformTestUtil.dispatchAllEventsInIdeEventQueue(); int posted = ideEventQueue.myKeyboardEventsPosted.get(); int dispatched = ideEventQueue.myKeyboardEventsDispatched.get(); KeyEvent pressX = new KeyEvent(new JLabel(), KeyEvent.KEY_PRESSED, 1, InputEvent.ALT_DOWN_MASK, 11, 'x'); - eventQueue.postEvent(pressX); + postCarefully(pressX); assertEquals(posted+1, ideEventQueue.myKeyboardEventsPosted.get()); assertEquals(dispatched, ideEventQueue.myKeyboardEventsDispatched.get()); assertEquals(pressX, dispatchAllInvocationEventsUntilOtherEvent(ideEventQueue)); @@ -59,7 +62,8 @@ public class IdeEventQueueTest extends PlatformTestCase { // do not react to other events AWTEvent ev2 = new ActionEvent(new JLabel(), ActionEvent.ACTION_PERFORMED, "Command"); - eventQueue.postEvent(ev2); + postCarefully(ev2); + assertEquals(posted+1, ideEventQueue.myKeyboardEventsPosted.get()); assertEquals(dispatched+1, ideEventQueue.myKeyboardEventsDispatched.get()); assertEquals(ev2, dispatchAllInvocationEventsUntilOtherEvent(ideEventQueue)); @@ -68,7 +72,8 @@ public class IdeEventQueueTest extends PlatformTestCase { assertEquals(dispatched+1, ideEventQueue.myKeyboardEventsDispatched.get()); KeyEvent keyRelease = new KeyEvent(new JLabel(), KeyEvent.KEY_RELEASED, 1, InputEvent.ALT_DOWN_MASK, 11, 'x'); - eventQueue.postEvent(keyRelease); + postCarefully(keyRelease); + assertEquals(posted+2, ideEventQueue.myKeyboardEventsPosted.get()); assertEquals(dispatched+1, ideEventQueue.myKeyboardEventsDispatched.get()); assertEquals(keyRelease, dispatchAllInvocationEventsUntilOtherEvent(ideEventQueue)); @@ -77,6 +82,15 @@ public class IdeEventQueueTest extends PlatformTestCase { assertEquals(dispatched+2, ideEventQueue.myKeyboardEventsDispatched.get()); } + private static void postCarefully(AWTEvent event) { + IdeEventQueue ideEventQueue = IdeEventQueue.getInstance(); + boolean didPosted = ideEventQueue.doPostEvent(event); + assertTrue("Was not posted: "+event, didPosted); + boolean mustBeConsumed = event.getID() == ActionEvent.ACTION_PERFORMED; + assertEquals(mustBeConsumed, ReflectionUtil.getField(AWTEvent.class, event, boolean.class, "consumed").booleanValue()); + assertTrue(ReflectionUtil.getField(AWTEvent.class, event, boolean.class, "isPosted")); + } + // need this because everybody can post some crazy stuff to IdeEventQueue, so we have to filter InvocationEvents out private static AWTEvent dispatchAllInvocationEventsUntilOtherEvent(IdeEventQueue ideEventQueue) throws InterruptedException { while (true) {