From 3427858d908b20bd1bbcec3efe7ce3e5a91178d1 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Wed, 22 Apr 2020 13:25:15 +0300 Subject: [PATCH] ui: do not leak disposed Content via layout after toolwindow deactivation Disposed Content was accessible via myLastLayout.toDrop collection. GitOrigin-RevId: 8dcc2647e374c46848cbfa50b2c92951defc32ef --- .../src/com/intellij/openapi/wm/impl/ToolWindowImpl.kt | 5 ++++- .../intellij/openapi/wm/impl/content/TabContentLayout.java | 4 ++++ .../openapi/wm/impl/content/ToolWindowContentUi.java | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.kt b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.kt index 61e7f3d5a565..589c0f7bdff4 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.kt +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.kt @@ -8,7 +8,6 @@ import com.intellij.ide.actions.* import com.intellij.ide.impl.ContentManagerWatcher import com.intellij.idea.ActionsBundle import com.intellij.internal.statistic.eventLog.EventPair -import com.intellij.internal.statistic.eventLog.FeatureUsageData import com.intellij.notification.EventLog import com.intellij.openapi.Disposable import com.intellij.openapi.actionSystem.* @@ -321,6 +320,10 @@ internal class ToolWindowImpl(val toolWindowManager: ToolWindowManagerImpl, if (isAvailable != value) { isAvailable = value toolWindowManager.toolWindowPropertyChanged(this, ToolWindowProperty.AVAILABLE) + + if (!value) { + contentUi?.dropCaches() + } } } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/TabContentLayout.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/TabContentLayout.java index f68ea22a9182..0bb509662301 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/TabContentLayout.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/TabContentLayout.java @@ -87,6 +87,10 @@ final class TabContentLayout extends ContentLayout implements MorePopupAware { return myLastLayout.moreRect; } + public void dropCaches() { + myLastLayout = null; + } + @Override public boolean canShowMorePopup() { return getMoreRect() != null; diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java index 0029993fe2b8..2e5662cfba59 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java @@ -225,6 +225,10 @@ public final class ToolWindowContentUi implements ContentUI, DataProvider { contentComponent.repaint(); } + public void dropCaches() { + tabsLayout.dropCaches(); + } + private void rebuild() { getCurrentLayout().rebuild(); getCurrentLayout().update();