Mercurial > hg > openjdk > jdk9 > jdk
changeset 17264:d188affa1add
8174098: Better image fetching
Reviewed-by: serb, vadim, skoivu
author | prr |
---|---|
date | Sun, 12 Feb 2017 08:10:34 -0800 |
parents | 6c01ea8d6930 |
children | 0d63e215d98b |
files | src/java.desktop/share/classes/sun/awt/image/ImageWatched.java |
diffstat | 1 files changed, 30 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/java.desktop/share/classes/sun/awt/image/ImageWatched.java Mon Feb 06 15:31:37 2017 -0800 +++ b/src/java.desktop/share/classes/sun/awt/image/ImageWatched.java Sun Feb 12 08:10:34 2017 -0800 @@ -29,6 +29,10 @@ import java.awt.Image; import java.awt.image.ImageObserver; +import java.security.AccessControlContext; +import java.security.AccessController; +import java.security.PrivilegedAction; + public abstract class ImageWatched { public static Link endlink = new Link(); @@ -85,16 +89,26 @@ } } + static class AccWeakReference<T> extends WeakReference<T> { + + private final AccessControlContext acc; + + AccWeakReference(T ref) { + super(ref); + acc = AccessController.getContext(); + } + } + /* * Standard Link implementation to manage a Weak Reference * to an ImageObserver. */ public static class WeakLink extends Link { - private WeakReference<ImageObserver> myref; + private final AccWeakReference<ImageObserver> myref; private Link next; public WeakLink(ImageObserver obs, Link next) { - myref = new WeakReference<ImageObserver>(obs); + myref = new AccWeakReference<ImageObserver>(obs); this.next = next; } @@ -120,6 +134,19 @@ return this; } + private static boolean update(ImageObserver iw, AccessControlContext acc, + Image img, int info, + int x, int y, int w, int h) { + + if (acc != null || System.getSecurityManager() != null) { + return AccessController.doPrivileged( + (PrivilegedAction<Boolean>) () -> { + return iw.imageUpdate(img, info, x, y, w, h); + }, acc); + } + return false; + } + public boolean newInfo(Image img, int info, int x, int y, int w, int h) { @@ -129,7 +156,7 @@ if (myiw == null) { // My referent is null so we must prune in a second pass. ret = true; - } else if (myiw.imageUpdate(img, info, x, y, w, h) == false) { + } else if (update(myiw, myref.acc, img, info, x, y, w, h) == false) { // My referent has lost interest so clear it and ask // for a pruning pass to remove it later. myref.clear();