FUS: IDEA-247394 UI freeze, infinite loop in UI thread
authorSvetlana.Zemlyanskaya <svetlana.zemlyanskaya@jetbrains.com>
Wed, 12 Aug 2020 10:10:45 +0000 (12:10 +0200)
committerintellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com>
Wed, 12 Aug 2020 17:23:29 +0000 (17:23 +0000)
GitOrigin-RevId: 9ca957bc9e770771b1f7809cba883f1e41799199

platform/platform-impl/src/com/intellij/internal/statistic/collectors/fus/actions/persistence/ActionsBuiltInWhitelist.java
platform/platform-impl/src/com/intellij/internal/statistic/collectors/fus/actions/persistence/ActionsCollectorImpl.java

index 6ecec1572dffd13c2079b3d8b3b654e464f522c2..318a4c2046073de398c6ace8ba17b7980f5c8d25 100644 (file)
@@ -4,6 +4,7 @@ package com.intellij.internal.statistic.collectors.fus.actions.persistence;
 import com.intellij.ide.plugins.IdeaPluginDescriptor;
 import com.intellij.internal.statistic.utils.PluginInfo;
 import com.intellij.internal.statistic.utils.PluginInfoDetectorKt;
+import com.intellij.openapi.actionSystem.AnAction;
 import com.intellij.openapi.extensions.PluginDescriptor;
 import com.intellij.openapi.keymap.Keymap;
 import com.intellij.openapi.keymap.impl.DefaultKeymapImpl;
@@ -12,6 +13,7 @@ import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 final class ActionsBuiltInWhitelist {
@@ -21,6 +23,9 @@ final class ActionsBuiltInWhitelist {
     return ourInstance;
   }
 
+  private final Object myLock = new Object();
+  private final Map<AnAction, String> myDynamicActionsToId = ContainerUtil.createWeakMap();
+
   private final Set<String> ourXmlActionIds = new HashSet<>();
   private final Set<String> ourCustomActionWhitelist = ContainerUtil.newHashSet(
     "ShowUsagesPopup.showSettings",
@@ -35,13 +40,21 @@ final class ActionsBuiltInWhitelist {
   }
 
   public boolean isWhitelistedActionId(@NotNull String actionId) {
-    return isCustomAllowedAction(actionId) || ourXmlActionIds.contains(actionId);
+    return isCustomAllowedAction(actionId) || isStaticXmlActionId(actionId);
+  }
+
+  private boolean isStaticXmlActionId(@NotNull String actionId) {
+    synchronized (myLock) {
+      return ourXmlActionIds.contains(actionId);
+    }
   }
 
   public void addActionLoadedFromXml(@NotNull String actionId, @Nullable IdeaPluginDescriptor plugin) {
     PluginInfo pluginInfo = plugin == null ? null : PluginInfoDetectorKt.getPluginInfoByDescriptor(plugin);
     if (pluginInfo != null && pluginInfo.isSafeToReport()) {
-      ourXmlActionIds.add(actionId);
+      synchronized (myLock) {
+        ourXmlActionIds.add(actionId);
+      }
     }
   }
 
@@ -49,8 +62,25 @@ final class ActionsBuiltInWhitelist {
     if (keymap instanceof DefaultKeymapImpl) {
       PluginDescriptor plugin = ((DefaultKeymapImpl)keymap).getPlugin();
       if (PluginInfoDetectorKt.getPluginInfoByDescriptor(plugin).isDevelopedByJetBrains()) {
-        ourXmlActionIds.addAll(actionIds);
+        synchronized (myLock) {
+          ourXmlActionIds.addAll(actionIds);
+        }
+      }
+    }
+  }
+
+  public void registerDynamicActionId(@NotNull AnAction action, @NotNull String id) {
+    synchronized (myLock) {
+      if (isWhitelistedActionId(id)) {
+        myDynamicActionsToId.put(action, id);
       }
     }
   }
+
+  @Nullable
+  public String getDynamicActionId(@NotNull AnAction action) {
+    synchronized (myLock) {
+      return myDynamicActionsToId.get(action);
+    }
+  }
 }
index b0490ba3fc3a406c4722b69e93fb28dd41ab053c..943c76626b40510f8860036739ab98949cf9e799 100644 (file)
@@ -15,7 +15,6 @@ import com.intellij.openapi.keymap.Keymap;
 import com.intellij.openapi.project.DumbService;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.util.containers.ContainerUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -30,8 +29,6 @@ public class ActionsCollectorImpl extends ActionsCollector {
 
   private static final ActionsBuiltInWhitelist ourWhitelist = ActionsBuiltInWhitelist.getInstance();
 
-  private final Map<AnAction, String> myOtherActions = ContainerUtil.createWeakMap();
-
   @Override
   public void record(@Nullable String actionId, @Nullable InputEvent event, @NotNull Class context) {
     String recorded = StringUtil.isNotEmpty(actionId) && ourWhitelist.isCustomAllowedAction(actionId) ? actionId : DEFAULT_ID;
@@ -87,7 +84,7 @@ public class ActionsCollectorImpl extends ActionsCollector {
                                       @NotNull AnAction action,
                                       @NotNull PluginInfo info) {
     String actionClassName = info.isSafeToReport() ? action.getClass().getName() : DEFAULT_ID;
-    String actionId = ((ActionsCollectorImpl)getInstance()).getActionId(info, action);
+    String actionId = getActionId(info, action);
     if (action instanceof ActionWithDelegate) {
       Object delegate = ((ActionWithDelegate<?>)action).getDelegate();
       PluginInfo delegateInfo = PluginInfoDetectorKt.getPluginInfo(delegate.getClass());
@@ -114,7 +111,7 @@ public class ActionsCollectorImpl extends ActionsCollector {
 
 
   @NotNull
-  private String getActionId(@NotNull PluginInfo pluginInfo, @NotNull AnAction action) {
+  private static String getActionId(@NotNull PluginInfo pluginInfo, @NotNull AnAction action) {
     if (!pluginInfo.isSafeToReport()) {
       return DEFAULT_ID;
     }
@@ -126,7 +123,7 @@ public class ActionsCollectorImpl extends ActionsCollector {
       return action.getClass().getName();
     }
     if (actionId == null) {
-      actionId = myOtherActions.get(action);
+      actionId = ourWhitelist.getDynamicActionId(action);
     }
     return actionId != null ? actionId : action.getClass().getName();
   }
@@ -137,9 +134,7 @@ public class ActionsCollectorImpl extends ActionsCollector {
 
   @Override
   public void onActionConfiguredByActionId(@NotNull AnAction action, @NotNull String actionId) {
-    if (canReportActionId(actionId)) {
-      myOtherActions.put(action, actionId);
-    }
+    ourWhitelist.registerDynamicActionId(action, actionId);
   }
 
   public static void onActionLoadedFromXml(@NotNull AnAction action, @NotNull String actionId, @Nullable IdeaPluginDescriptor plugin) {