Mercurial > hg > openjdk > bsd-port > jdk
changeset 8724:79f9ef695052
8174098: Better image fetching
Reviewed-by: serb, vadim, skoivu
author | prr |
---|---|
date | Fri, 14 Jul 2017 18:21:30 +0100 |
parents | 9976ce1ff903 |
children | a632a29f0478 |
files | src/share/classes/sun/awt/image/ImageWatched.java |
diffstat | 1 files changed, 32 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/sun/awt/image/ImageWatched.java Fri Jul 14 17:42:44 2017 +0100 +++ b/src/share/classes/sun/awt/image/ImageWatched.java Fri Jul 14 18:21:30 2017 +0100 @@ -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,21 @@ return this; } + private static boolean update(final ImageObserver iw, AccessControlContext acc, + final Image img, final int info, + final int x, final int y, final int w, final int h) { + + if (acc != null || System.getSecurityManager() != null) { + return AccessController.doPrivileged(new PrivilegedAction<Boolean>() { + @Override + public Boolean run() { + 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 +158,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();