modules/graphics/src/main/java/javafx/concurrent/Task.java

Print this page
rev 8410 : RT-39421: Security exception in Service.cancel when running sandboxed applet

*** 23,32 **** --- 23,35 ---- * questions. */ package javafx.concurrent; + import java.security.AccessController; + import java.security.Permission; + import java.security.PrivilegedAction; import javafx.application.Platform; import javafx.beans.property.BooleanProperty; import javafx.beans.property.DoubleProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.ReadOnlyBooleanProperty;
*** 992,1004 **** @Override public final boolean cancel() { return cancel(true); } @Override public boolean cancel(boolean mayInterruptIfRunning) { // Delegate to the super implementation to actually attempt to cancel this thing ! boolean flag = super.cancel(mayInterruptIfRunning); // If cancel succeeded (according to the semantics of the Future cancel method), // then we need to make sure the State flag is set appropriately if (flag) { // If this method was called on the FX application thread, then we can // just update the state directly and this will make sure that after --- 995,1018 ---- @Override public final boolean cancel() { return cancel(true); } + // Need to assert the modifyThread permission so an app can cancel + // a task that it created (the default executor for the service runs in + // its own thread group) + // Note that this is needed when running as an applet or a web start app. + private static final Permission modifyThreadPerm = new RuntimePermission("modifyThread"); + @Override public boolean cancel(boolean mayInterruptIfRunning) { // Delegate to the super implementation to actually attempt to cancel this thing ! // Assert the modifyThread permission ! boolean flag = AccessController.doPrivileged( ! (PrivilegedAction<Boolean>) () -> super.cancel(mayInterruptIfRunning), ! null, ! modifyThreadPerm); ! // If cancel succeeded (according to the semantics of the Future cancel method), // then we need to make sure the State flag is set appropriately if (flag) { // If this method was called on the FX application thread, then we can // just update the state directly and this will make sure that after