mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
consider progress modality write-safe when it's created (not started) in a write-safe context (EA-83534 - assert: TransactionGuardImpl.submitTransactionAndWait)
This commit is contained in:
+5
@@ -17,6 +17,8 @@ package com.intellij.openapi.progress.util;
|
||||
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.application.ModalityState;
|
||||
import com.intellij.openapi.application.TransactionGuard;
|
||||
import com.intellij.openapi.application.TransactionGuardImpl;
|
||||
import com.intellij.openapi.application.impl.ModalityStateEx;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.progress.ProcessCanceledException;
|
||||
@@ -216,6 +218,9 @@ public class AbstractProgressIndicatorBase extends UserDataHolderBase implements
|
||||
myModalityProgress = modalityProgress;
|
||||
ModalityState currentModality = ApplicationManager.getApplication().getCurrentModalityState();
|
||||
myModalityState = myModalityProgress != null ? ((ModalityStateEx)currentModality).appendProgress(myModalityProgress) : currentModality;
|
||||
if (modalityProgress != null) {
|
||||
((TransactionGuardImpl)TransactionGuard.getInstance()).enteredModality(myModalityState);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.intellij.ide.IdeEventQueue
|
||||
import com.intellij.openapi.application.*
|
||||
import com.intellij.openapi.application.impl.LaterInvocator
|
||||
import com.intellij.openapi.progress.ProgressManager
|
||||
import com.intellij.openapi.progress.util.ProgressWindow
|
||||
import com.intellij.openapi.roots.ex.ProjectRootManagerEx
|
||||
import com.intellij.openapi.util.Disposer
|
||||
import com.intellij.openapi.util.EmptyRunnable
|
||||
@@ -82,9 +83,7 @@ class TransactionTest extends LightPlatformTestCase {
|
||||
def disposable = Disposer.newDisposable('assertWritingProhibited')
|
||||
LoggedErrorProcessor.instance.disableStderrDumping(disposable)
|
||||
try {
|
||||
app.runWriteAction {
|
||||
ProjectRootManagerEx.getInstanceEx(project).makeRootsChange(EmptyRunnable.instance, false, true)
|
||||
}
|
||||
app.runWriteAction { makeRootsChange() }
|
||||
}
|
||||
catch (AssertionError ignore) {
|
||||
writeActionFailed = true
|
||||
@@ -97,6 +96,10 @@ class TransactionTest extends LightPlatformTestCase {
|
||||
}
|
||||
}
|
||||
|
||||
private static makeRootsChange() {
|
||||
ProjectRootManagerEx.getInstanceEx(project).makeRootsChange(EmptyRunnable.instance, false, true)
|
||||
}
|
||||
|
||||
public void "test parent disposable"() {
|
||||
def parent = Disposer.newDisposable()
|
||||
|
||||
@@ -318,4 +321,26 @@ class TransactionTest extends LightPlatformTestCase {
|
||||
assert log == ['1', '2']
|
||||
}
|
||||
|
||||
public void "test progress created on EDT and run on pooled thread"() {
|
||||
TransactionGuard.submitTransaction testRootDisposable, {
|
||||
def progress = new ProgressWindow(true, project)
|
||||
|
||||
def process = {
|
||||
log << '1'
|
||||
assert progress.modalityState != ModalityState.NON_MODAL
|
||||
assert guard.getModalityTransaction(progress.modalityState)
|
||||
|
||||
Runnable writeAction = {
|
||||
makeRootsChange()
|
||||
log << '2'
|
||||
}
|
||||
app.invokeLater({ app.runWriteAction(writeAction) }, progress.modalityState)
|
||||
}
|
||||
|
||||
app.executeOnPooledThread { ProgressManager.getInstance().runProcess(process, progress) }.get()
|
||||
}
|
||||
UIUtil.dispatchAllInvocationEvents()
|
||||
assert log == ['1', '2']
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user