aboutsummaryrefslogtreecommitdiffstats
path: root/plugin/icedteanp/java/sun/applet
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/icedteanp/java/sun/applet')
-rw-r--r--plugin/icedteanp/java/sun/applet/Applet3MessageHandler.java21
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginAppletPanelFactory.java228
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginAppletViewer.java1647
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginCookieManager.java5
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginMain.java15
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java2
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java2
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginParameterParser.java2
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginProxySelector.java4
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginStreamHandler.java6
10 files changed, 44 insertions, 1888 deletions
diff --git a/plugin/icedteanp/java/sun/applet/Applet3MessageHandler.java b/plugin/icedteanp/java/sun/applet/Applet3MessageHandler.java
new file mode 100644
index 0000000..140e5eb
--- /dev/null
+++ b/plugin/icedteanp/java/sun/applet/Applet3MessageHandler.java
@@ -0,0 +1,21 @@
+package sun.applet;
+
+import sun.applet.AppletMessageHandler;
+
+public class Applet3MessageHandler extends AppletMessageHandler {
+
+ public Applet3MessageHandler(String baseKey) {
+ super(baseKey);
+ }
+
+ public String getMessage(String key) {
+ return super.getMessage(key);
+ }
+ public String getMessage(String key, Object arg){
+ return super.getMessage(key, arg);
+ }
+ public String getMessage(String key, Object arg1, Object arg2){
+ return super.getMessage(key, arg1, arg2);
+ }
+
+}
diff --git a/plugin/icedteanp/java/sun/applet/PluginAppletPanelFactory.java b/plugin/icedteanp/java/sun/applet/PluginAppletPanelFactory.java
deleted file mode 100644
index 429cb62..0000000
--- a/plugin/icedteanp/java/sun/applet/PluginAppletPanelFactory.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/* Copyright (C) 2012 Red Hat
-
-This file is part of IcedTea.
-
-IcedTea is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-IcedTea is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with IcedTea; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-/*
- * Copyright 1995-2004 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package sun.applet;
-
-import java.applet.Applet;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URL;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-import javax.swing.SwingUtilities;
-
-import net.sourceforge.jnlp.NetxPanel;
-import net.sourceforge.jnlp.PluginParameters;
-import net.sourceforge.jnlp.util.logging.OutputController;
-
-/**
- * Lets us construct one using unix-style one shot behaviors
- */
-
-class PluginAppletPanelFactory {
-
- public AppletPanel createPanel(PluginStreamHandler streamhandler,
- final int identifier,
- final long handle,
- final URL doc,
- final PluginParameters params) {
- final NetxPanel panel = AccessController.doPrivileged(new PrivilegedAction<NetxPanel>() {
- public NetxPanel run() {
- NetxPanel panel = new NetxPanel(doc, params);
- NetxPanel.debug("Using NetX panel");
- PluginDebug.debug(params.toString());
- return panel;
- }
- });
-
- // Framing the panel needs to happen in a thread whose thread group
- // is the same as the threadgroup of the applet thread. If this
- // isn't the case, the awt eventqueue thread's context classloader
- // won't be set to a JNLPClassLoader, and when an applet class needs
- // to be loaded from the awt eventqueue, it won't be found.
- Thread panelInit = new Thread(panel.getThreadGroup(), new Runnable() {
- @Override public void run() {
- panel.createNewAppContext();
- // create the frame.
- PluginDebug.debug("X and Y are: " + params.getWidth() + " " + params.getHeight());
- panel.setAppletViewerFrame(PluginAppletViewer.framePanel(identifier, handle,
- params.getWidth(), params.getHeight(), panel));
-
- panel.init();
- // Start the applet
- initEventQueue(panel);
- }
- }, "NetXPanel initializer");
-
- panelInit.start();
- try {
- panelInit.join();
- } catch (InterruptedException e) {
- OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e);
- }
-
- setAppletViewerSize(panel, params.getWidth(), params.getHeight());
-
- // Wait for the panel to initialize
- PluginAppletViewer.waitForAppletInit(panel);
-
- Applet a = panel.getApplet();
-
- // Still null?
- if (a == null) {
- streamhandler.write("instance " + identifier + " reference " + -1 + " fatalError: " + "Initialization timed out");
- return null;
- }
-
- PluginDebug.debug("Applet ", a.getClass(), " initialized");
- streamhandler.write("instance " + identifier + " reference 0 initialized");
-
- panel.removeSplash();
-
- AppletSecurityContextManager.getSecurityContext(0).associateSrc(panel.getAppletClassLoader(), doc);
- AppletSecurityContextManager.getSecurityContext(0).associateInstance(identifier, panel.getAppletClassLoader());
-
- return panel;
- }
-
- /* AppletViewerPanel sometimes doesn't set size right initially. This
- * causes the parent frame to be the default (10x10) size.
- *
- * Normally it goes unnoticed since browsers like Firefox make a resize
- * call after init. However some browsers (e.g. Midori) don't.
- *
- * We therefore manually set the parent to the right size.
- */
- static private void setAppletViewerSize(final AppletPanel panel,
- final int width, final int height) {
- try {
- SwingUtilities.invokeAndWait(new Runnable() {
- public void run() {
- panel.getParent().setSize(width, height);
- }
- });
- } catch (InvocationTargetException e) {
- // Not being able to resize is non-fatal
- PluginDebug.debug("Unable to resize panel: ");
- OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e);
- } catch (InterruptedException e) {
- // Not being able to resize is non-fatal
- PluginDebug.debug("Unable to resize panel: ");
- OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e);
- }
- }
- /**
- * Send the initial set of events to the appletviewer event queue.
- * On start-up the current behaviour is to load the applet and call
- * Applet.init() and Applet.start().
- */
- private void initEventQueue(AppletPanel panel) {
- // appletviewer.send.event is an undocumented and unsupported system
- // property which is used exclusively for testing purposes.
- PrivilegedAction<String> pa = new PrivilegedAction<String>() {
- public String run() {
- return System.getProperty("appletviewer.send.event");
- }
- };
- String eventList = AccessController.doPrivileged(pa);
-
- if (eventList == null) {
- // Add the standard events onto the event queue.
- panel.sendEvent(AppletPanel.APPLET_LOAD);
- panel.sendEvent(AppletPanel.APPLET_INIT);
- panel.sendEvent(AppletPanel.APPLET_START);
- } else {
- // We're testing AppletViewer. Force the specified set of events
- // onto the event queue, wait for the events to be processed, and
- // exit.
-
- // The list of events that will be executed is provided as a
- // ","-separated list. No error-checking will be done on the list.
- String[] events = eventList.split(",");
-
- for (String event : events) {
- PluginDebug.debug("Adding event to queue: ", event);
- if ("dispose".equals(event))
- panel.sendEvent(AppletPanel.APPLET_DISPOSE);
- else if ("load".equals(event))
- panel.sendEvent(AppletPanel.APPLET_LOAD);
- else if ("init".equals(event))
- panel.sendEvent(AppletPanel.APPLET_INIT);
- else if ("start".equals(event))
- panel.sendEvent(AppletPanel.APPLET_START);
- else if ("stop".equals(event))
- panel.sendEvent(AppletPanel.APPLET_STOP);
- else if ("destroy".equals(event))
- panel.sendEvent(AppletPanel.APPLET_DESTROY);
- else if ("quit".equals(event))
- panel.sendEvent(AppletPanel.APPLET_QUIT);
- else if ("error".equals(event))
- panel.sendEvent(AppletPanel.APPLET_ERROR);
- else
- // non-fatal error if we get an unrecognized event
- PluginDebug.debug("Unrecognized event name: ", event);
- }
-
- while (!panel.emptyEventQueue())
- ;
- }
- }
-} \ No newline at end of file
diff --git a/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java b/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java
deleted file mode 100644
index 8d1630d..0000000
--- a/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java
+++ /dev/null
@@ -1,1647 +0,0 @@
-/* PluginAppletViewer -- Handles embedding of the applet panel
- Copyright (C) 2008 Red Hat
-
-This file is part of IcedTea.
-
-IcedTea is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-IcedTea is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with IcedTea; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-/*
- * Copyright 1995-2004 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package sun.applet;
-
-import static net.sourceforge.jnlp.runtime.Translator.R;
-
-import java.applet.Applet;
-import java.applet.AppletContext;
-import java.applet.AudioClip;
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Frame;
-import java.awt.Graphics;
-import java.awt.Image;
-import java.awt.Insets;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.awt.event.WindowListener;
-import java.awt.print.PageFormat;
-import java.awt.print.Printable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.SocketPermission;
-import java.net.URI;
-import java.net.URL;
-import java.net.URLConnection;
-import java.security.AccessController;
-import java.security.AllPermission;
-import java.security.PrivilegedAction;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Vector;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.locks.ReentrantLock;
-
-import javax.swing.SwingUtilities;
-
-import net.sourceforge.jnlp.LaunchException;
-import net.sourceforge.jnlp.NetxPanel;
-import net.sourceforge.jnlp.PluginParameters;
-import net.sourceforge.jnlp.runtime.JNLPClassLoader;
-import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel;
-import net.sourceforge.jnlp.security.appletextendedsecurity.AppletStartupSecuritySettings;
-import net.sourceforge.jnlp.splashscreen.SplashController;
-import net.sourceforge.jnlp.splashscreen.SplashPanel;
-import net.sourceforge.jnlp.splashscreen.SplashUtils;
-import sun.awt.AppContext;
-import sun.awt.SunToolkit;
-import sun.awt.X11.XEmbeddedFrame;
-import sun.misc.Ref;
-
-import com.sun.jndi.toolkit.url.UrlUtil;
-import net.sourceforge.jnlp.util.logging.OutputController;
-
-/*
- */
-// FIXME: declare JSProxy implementation
-@SuppressWarnings("serial")
-public class PluginAppletViewer extends XEmbeddedFrame
- implements AppletContext, Printable, SplashController {
-
- /**
- * Enumerates the current status of an applet
- *
- * PRE_INIT -> Parsing and initialization phase
- * INIT_COMPLETE -> Initialization complete, reframe pending
- * REFRAME_COMPLETE -> Reframe complete, applet is initialized and usable by the user
- * INACTIVE -> Browser has directed that the applet be destroyed (this state is non-overridable except by DESTROYED)
- * DESTROYED -> Applet has been destroyed
- */
- private static enum PAV_INIT_STATUS {
- PRE_INIT, INIT_COMPLETE, REFRAME_COMPLETE, INACTIVE, DESTROYED
- };
-
- /**
- * The panel in which the applet is being displayed.
- */
- private NetxPanel panel;
- static final ReentrantLock panelLock = new ReentrantLock();
- // CONDITION PREDICATE: panel.isAlive()
- static final Condition panelLive = panelLock.newCondition();
- private int identifier;
-
- // Instance identifier -> PluginAppletViewer object.
- private static ConcurrentMap<Integer, PluginAppletViewer> applets =
- new ConcurrentHashMap<Integer, PluginAppletViewer>();
- private static final ReentrantLock appletsLock = new ReentrantLock();
- // CONDITION PREDICATE: !applets.containsKey(identifier)
- private static final Condition appletAdded = appletsLock.newCondition();
-
- private static PluginStreamHandler streamhandler;
-
- private static PluginCallRequestFactory requestFactory;
-
- private static ConcurrentMap<Integer, PAV_INIT_STATUS> status =
- new ConcurrentHashMap<Integer, PAV_INIT_STATUS>();
- private static final ReentrantLock statusLock = new ReentrantLock();
- // CONDITION PREDICATE: !status.get(identifier).equals(PAV_INIT_STATUS.INIT_COMPLETE)
- private static final Condition initComplete = statusLock.newCondition();
-
- private WindowListener windowEventListener = null;
- private AppletEventListener appletEventListener = null;
-
- public static final long APPLET_TIMEOUT = 180000000000L; // 180s in ns
-
- private static final Object requestMutex = new Object();
- private static long requestIdentityCounter = 0L;
-
- private Image bufFrameImg;
- private Graphics bufFrameImgGraphics;
-
-
- private SplashPanel splashPanel;
-
- private static long REQUEST_TIMEOUT=60000;//60s
-
- private static void waitForRequestCompletion(PluginCallRequest request) {
- try {
- if (!request.isDone()) {
- request.wait(REQUEST_TIMEOUT);
- }
- if (!request.isDone()) {
- // Do not wait indefinitely to avoid the potential of deadlock
- throw new RuntimeException("Possible deadlock, releasing");
- }
- } catch (InterruptedException ex) {
- throw new RuntimeException("Interrupted waiting for call request.", ex);
- }
- }
-
- /**
- * Null constructor to allow instantiation via newInstance()
- */
- public PluginAppletViewer() {
- }
-
- public static PluginAppletViewer framePanel(int identifier, long handle, int width, int height, NetxPanel panel) {
-
- PluginDebug.debug("Framing ", panel);
-
- // SecurityManager MUST be set, and only privileged code may call framePanel()
- System.getSecurityManager().checkPermission(new AllPermission());
-
- PluginAppletViewer appletFrame = new PluginAppletViewer(handle, identifier, panel);
- appletFrame.setSize(width, height);
-
- appletFrame.appletEventListener = new AppletEventListener(appletFrame, appletFrame);
- panel.addAppletListener(appletFrame.appletEventListener);
- // Clear references, if any
- if (applets.containsKey(identifier)) {
- PluginAppletViewer oldFrame = applets.get(identifier);
- oldFrame.remove(panel);
- panel.removeAppletListener(oldFrame.appletEventListener);
- }
-
- appletsLock.lock();
- applets.put(identifier, appletFrame);
- appletAdded.signalAll();
- appletsLock.unlock();
-
- PluginDebug.debug(panel, " framed");
- return appletFrame;
- }
-
- /**
- * Create new plugin appletviewer frame
- */
- private PluginAppletViewer(long handle, final int identifier,
- NetxPanel appletPanel) {
-
- super(handle, true);
- this.identifier = identifier;
- this.panel = appletPanel;
-
- synchronized(appletPanels) {
- if (!appletPanels.contains(panel))
- appletPanels.addElement(panel);
- }
-
- windowEventListener = new WindowAdapter() {
-
- @Override
- public void windowClosing(WindowEvent evt) {
- destroyApplet(identifier);
- }
-
- @Override
- public void windowIconified(WindowEvent evt) {
- appletStop();
- }
-
- @Override
- public void windowDeiconified(WindowEvent evt) {
- appletStart();
- }
- };
-
- addWindowListener(windowEventListener);
- final AppletPanel fPanel = panel;
- try {
- SwingUtilities.invokeAndWait(new SplashCreator(fPanel));
- } catch (Exception e) {
- OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); // Not much we can do other than print
- }
-
- }
-
- @Override
- public void replaceSplash(final SplashPanel newSplash) {
- if (splashPanel == null) {
- return;
- }
- if (newSplash == null) {
- removeSplash();
- return;
- }
- try {
- SwingUtilities.invokeAndWait(new Runnable() {
-
- @Override
- public void run() {
- splashPanel.getSplashComponent().setVisible(false);
- splashPanel.stopAnimation();
- remove(splashPanel.getSplashComponent());
- newSplash.setPercentage(splashPanel.getPercentage());
- newSplash.setSplashWidth(splashPanel.getSplashWidth());
- newSplash.setSplashHeight(splashPanel.getSplashHeight());
- newSplash.adjustForSize();
- splashPanel = newSplash;
- add("Center", splashPanel.getSplashComponent());
- pack();
- }
- });
- } catch (Exception e) {
- OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); // Not much we can do other than print
- }
- }
-
- @Override
- public void removeSplash() {
- if (splashPanel == null) {
- return;
- }
- try {
- SwingUtilities.invokeAndWait(new Runnable() {
-
- @Override
- public void run() {
- splashPanel.getSplashComponent().setVisible(false);
- splashPanel.stopAnimation();
- removeAll();
- setLayout(new BorderLayout());
- //remove(splashPanel.getSplashComponent());
- splashPanel = null;
- //remove(panel);
- // Re-add the applet to notify container
- add(panel);
- panel.setVisible(true);
- pack();
- }
- });
- } catch (Exception e) {
- OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e); // Not much we can do other than print
- }
- }
-
- @Override
- public int getSplashWidth() {
- if (splashPanel != null) {
- return splashPanel.getSplashWidth();
- } else {
- return -1;
- }
- }
-
- @Override
- public int getSplashHeigth() {
- if (splashPanel != null) {
- return splashPanel.getSplashHeight();
- } else {
- return -1;
- }
- }
-
- private static class AppletEventListener implements AppletListener {
- final Frame frame;
- final PluginAppletViewer appletViewer;
-
- public AppletEventListener(Frame frame, PluginAppletViewer appletViewer) {
- this.frame = frame;
- this.appletViewer = appletViewer;
- }
-
- @Override
- public void appletStateChanged(AppletEvent evt) {
- AppletPanel src = (AppletPanel) evt.getSource();
-
- panelLock.lock();
- panelLive.signalAll();
- panelLock.unlock();
- switch (evt.getID()) {
- case AppletPanel.APPLET_RESIZE: {
- if (src != null) {
- appletViewer.setSize(appletViewer.getPreferredSize());
- appletViewer.validate();
- }
- break;
- }
- case AppletPanel.APPLET_LOADING_COMPLETED: {
- Applet a = src.getApplet(); // sun.applet.AppletPanel
-
- // Fixed #4754451: Applet can have methods running on main
- // thread event queue.
- //
- // The cause of this bug is that the frame of the applet
- // is created in main thread group. Thus, when certain
- // AWT/Swing events are generated, the events will be
- // dispatched through the wrong event dispatch thread.
- //
- // To fix this, we rearrange the AppContext with the frame,
- // so the proper event queue will be looked up.
- //
- // Swing also maintains a Frame list for the AppContext,
- // so we will have to rearrange it as well.
- //
- if (a != null) {
- AppletPanel.changeFrameAppContext(frame, SunToolkit.targetToAppContext(a));
- }
- else {
- AppletPanel.changeFrameAppContext(frame, AppContext.getAppContext());
- }
-
- updateStatus(appletViewer.identifier, PAV_INIT_STATUS.INIT_COMPLETE);
-
- break;
- }
- case AppletPanel.APPLET_START: {
- if (src.status != AppletPanel.APPLET_INIT && src.status != AppletPanel.APPLET_STOP) {
- String s="Applet started, but but reached invalid state";
- PluginDebug.debug(s);
- SplashPanel sp=SplashUtils.getErrorSplashScreen(appletViewer.panel.getWidth(), appletViewer.panel.getHeight(), new Exception(s));
- appletViewer.replaceSplash(sp);
- }
-
- break;
- }
- case AppletPanel.APPLET_ERROR: {
- String s="Undefined error causing applet not to staart appeared";
- PluginDebug.debug(s);
- SplashPanel sp=SplashUtils.getErrorSplashScreen(appletViewer.panel.getWidth(), appletViewer.panel.getHeight(), new Exception(s));
- appletViewer.replaceSplash(sp);
- break;
- }
- }
- }
- }
-
- public static void setStreamhandler(PluginStreamHandler sh) {
- streamhandler = sh;
- }
-
- public static void setPluginCallRequestFactory(PluginCallRequestFactory rf) {
- requestFactory = rf;
- }
-
- private static void handleInitializationMessage(int identifier, String message) throws IOException, LaunchException {
-
- /* The user has specified via a global setting that applets should not be run.*/
- if (AppletStartupSecuritySettings.getInstance().getSecurityLevel() == AppletSecurityLevel.DENY_ALL) {
- throw new LaunchException(null, null, R("LSFatal"), R("LCClient"), R("LUnsignedApplet"), R("LUnsignedAppletPolicyDenied"));
- }
-
- // If there is a key for this status, it means it
- // was either initialized before, or destroy has been
- // processed. Stop moving further.
- if (updateStatus(identifier, PAV_INIT_STATUS.PRE_INIT) != null) {
- return;
- }
-
- // Extract the information from the message
- String[] msgParts = new String[4];
- for (int i = 0; i < 3; i++) {
- int spaceLocation = message.indexOf(' ');
- int nextSpaceLocation = message.indexOf(' ', spaceLocation + 1);
- msgParts[i] = message.substring(spaceLocation + 1, nextSpaceLocation);
- message = message.substring(nextSpaceLocation + 1);
- }
-
- long handle = Long.parseLong(msgParts[0]);
- String width = msgParts[1];
- String height = msgParts[2];
-
- int spaceLocation = message.indexOf(' ', "tag".length() + 1);
- String documentBase = message.substring("tag".length() + 1, spaceLocation);
- String paramString = message.substring(spaceLocation + 1);
-
- PluginDebug.debug("Handle = ", handle, "\n",
- "Width = ", width, "\n",
- "Height = ", height, "\n",
- "DocumentBase = ", documentBase, "\n",
- "Params = ", paramString);
-
- PluginAppletPanelFactory factory = new PluginAppletPanelFactory();
- AppletMessageHandler amh = new AppletMessageHandler("appletviewer");
- URL url = new URL(documentBase);
- URLConnection conn = url.openConnection();
- /* The original URL may have been redirected - this
- * sets it to whatever URL/codebase we ended up getting
- */
- url = conn.getURL();
-
- PluginParameters params = new PluginParameterParser().parse(width, height, paramString);
-
- // Let user know we are starting up
- streamhandler.write("instance " + identifier + " status " + amh.getMessage("status.start"));
- factory.createPanel(streamhandler, identifier, handle, url, params);
-
- long maxTimeToSleep = APPLET_TIMEOUT;
- appletsLock.lock();
- try {
- while (!applets.containsKey(identifier) &&
- maxTimeToSleep > 0) { // Map is populated only by reFrame
- maxTimeToSleep -= waitTillTimeout(appletsLock, appletAdded,
- maxTimeToSleep);
- }
- }
- finally {
- appletsLock.unlock();
- }
-
- // If wait exceeded maxWait, we timed out. Throw an exception
- if (maxTimeToSleep <= 0) {
- // Caught in handleMessage
- throw new RuntimeException("Applet initialization timeout");
- }
-
- // We should not try to destroy an applet during
- // initialization. It may cause an inconsistent state,
- // which would bad if it's a trusted applet that
- // read/writes to files
- waitForAppletInit(applets.get(identifier).panel);
-
- // Should we proceed with reframing?
- PluginDebug.debug("Init complete");
-
- if (updateStatus(identifier, PAV_INIT_STATUS.REFRAME_COMPLETE).equals(PAV_INIT_STATUS.INACTIVE)) {
- destroyApplet(identifier);
- return;
- }
- }
-
- /**
- * Handle an incoming message from the plugin.
- */
- public static void handleMessage(int identifier, int reference, String message) {
-
- PluginDebug.debug("PAV handling: ", message);
-
- try {
- if (message.startsWith("handle")) {
- handleInitializationMessage(identifier, message);
- } else if (message.startsWith("destroy")) {
-
- // Set it inactive, and try to do cleanup is applicable
- PAV_INIT_STATUS previousStatus = updateStatus(identifier, PAV_INIT_STATUS.INACTIVE);
- PluginDebug.debug("Destroy status set for ", identifier);
-
- if (previousStatus != null &&
- previousStatus.equals(PAV_INIT_STATUS.REFRAME_COMPLETE)) {
- destroyApplet(identifier);
- }
-
- } else {
- PluginDebug.debug("Handling message: ", message, " instance ", identifier, " ", Thread.currentThread());
-
- // Wait till initialization finishes
- while (!applets.containsKey(identifier) &&
- (
- !status.containsKey(identifier) ||
- status.get(identifier).equals(PAV_INIT_STATUS.PRE_INIT)
- ))
- ;
-
- // don't bother processing further for inactive applets
- if (status.get(identifier).equals(PAV_INIT_STATUS.INACTIVE)) {
- return;
- }
-
- applets.get(identifier).handleMessage(reference, message);
- }
- } catch (Exception e) {
-
- OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e);
-
- // If an exception happened during pre-init, we need to update status
- updateStatus(identifier, PAV_INIT_STATUS.INACTIVE);
-
- throw new RuntimeException("Failed to handle message: " +
- message + " for instance " + identifier, e);
- }
- }
-
- /**
- * Sets the status unless an overriding status is set (e.g. if
- * status is DESTROYED, it may not be overridden).
- *
- * @param identifier The identifier for which the status is to be set
- * @param status The status to switch to
- * @return The previous status
- */
- private static synchronized PAV_INIT_STATUS updateStatus(int identifier, PAV_INIT_STATUS newStatus) {
-
- PAV_INIT_STATUS prev = status.get(identifier);
-
- // If the status is set
- if (status.containsKey(identifier)) {
-
- // Nothing may override destroyed status
- if (status.get(identifier).equals(PAV_INIT_STATUS.DESTROYED)) {
- return prev;
- }
-
- // If status is inactive, only DESTROYED may override it
- if (status.get(identifier).equals(PAV_INIT_STATUS.INACTIVE)) {
- if (!newStatus.equals(PAV_INIT_STATUS.DESTROYED)) {
- return prev;
- }
- }
- }
-
- // Else set to given status
-
- statusLock.lock();
- status.put(identifier, newStatus);
- initComplete.signalAll();
- statusLock.unlock();
-
- return prev;
- }
-
- /**
- * Destroys the given applet instance.
- *
- * This function may be called multiple times without problems.
- * It does a synchronized check on the status and will only
- * attempt to destroy the applet if not previously destroyed.
- *
- * @param identifier The instance which is to be destroyed
- */
-
- private static synchronized void destroyApplet(int identifier) {
-
- // We should not try to destroy an applet during
- // initialization. It may cause an inconsistent state.
- waitForAppletInit( applets.get(identifier).panel );
-
- PluginDebug.debug("DestroyApplet called for ", identifier);
-
- PAV_INIT_STATUS prev = updateStatus(identifier, PAV_INIT_STATUS.DESTROYED);
-
- // If already destroyed, return
- if (prev.equals(PAV_INIT_STATUS.DESTROYED)) {
- PluginDebug.debug(identifier, " already destroyed. Returning.");
- return;
- }
-
- PluginDebug.debug("Attempting to destroy frame ", identifier);
-
- // Try to dispose the panel right away
- final PluginAppletViewer pav = applets.get(identifier);
- if (pav != null) {
- pav.dispose();
-
- // If panel is already disposed, return
- if (pav.panel.applet == null) {
- PluginDebug.debug(identifier, " panel inactive. Returning.");
- return;
- }
-
- PluginDebug.debug("Attempting to destroy panel ", identifier);
-
- SwingUtilities.invokeLater(new Runnable() {
- @Override
- public void run() {
- pav.appletClose();
- }
- });
- }
-
- PluginDebug.debug(identifier, " destroyed");
- }
-
- /**
- * Function to block until applet initialization is complete.
- *
- * This function will return if the wait is longer than {@link #APPLET_TIMEOUT}
- *
- * @param panel the instance to wait for.
- */
- public static void waitForAppletInit(NetxPanel panel) {
-
- PluginDebug.debug("Waiting for applet init");
-
- // Wait till initialization finishes
- long maxTimeToSleep = APPLET_TIMEOUT;
-
- panelLock.lock();
- try {
- while (!panel.isInitialized() &&
- maxTimeToSleep > 0) {
- PluginDebug.debug("Waiting for applet panel ", panel, " to initialize...");
- maxTimeToSleep -= waitTillTimeout(panelLock, panelLive, maxTimeToSleep);
- }
- }
- finally {
- panelLock.unlock();
- }
-
- PluginDebug.debug("Applet panel ", panel, " initialized");
- }
-
- /* Resizes an applet panel, waiting for the applet to initialze.
- * Should be done asynchronously to avoid the chance of deadlock. */
- private void resizeAppletPanel(final int width, final int height) {
- // Wait for panel to come alive
- waitForAppletInit(panel);
-
- SwingUtilities.invokeLater(new Runnable() {
- @Override
- public void run() {
- panel.updateSizeInAtts(height, width);
-
- setSize(width, height);
-
- // There is a rather odd drawing bug whereby resizing
- // the panel makes no difference on initial call
- // because the panel thinks that it is already the
- // right size. Validation has no effect there either.
- // So we work around by setting size to 1, validating,
- // and then setting to the right size and validating
- // again. This is not very efficient, and there is
- // probably a better way -- but resizing happens
- // quite infrequently, so for now this is how we do it
-
- panel.setSize(1, 1);
- panel.validate();
-
- panel.setSize(width, height);
- panel.validate();
-
- panel.applet.resize(width, height);
- panel.applet.validate();
- }
- });
- }
-
- public void handleMessage(int reference, String message) {
- if (message.startsWith("width")) {
-
- // 0 => width, 1=> width_value, 2 => height, 3=> height_value
- String[] dimMsg = message.split(" ");
-
- final int width = Integer.parseInt(dimMsg[1]);
- final int height = Integer.parseInt(dimMsg[3]);
-
- /* Resize the applet asynchronously, to avoid the chance of
- * deadlock while waiting for the applet to initialize.
- *
- * In general, worker threads should spawn new threads for any blocking operations. */
- Thread resizeAppletThread = new Thread("resizeAppletThread") {
- @Override
- public void run() {
- resizeAppletPanel(width, height);
- }
- };
-
- /* Let it eventually complete */
- resizeAppletThread.start();
-
- } else if (message.startsWith("GetJavaObject")) {
-
- // FIXME: how do we determine what security context this
- // object should belong to?
- Object o;
-
- // Wait for the panel to initialize
- // (happens in a separate thread)
- waitForAppletInit(panel);
-
- PluginDebug.debug(panel, " -- ", panel.getApplet(), " -- initialized: ", panel.isInitialized());
-
- // Still null?
- if (panel.getApplet() == null) {
- streamhandler.write("instance " + identifier + " reference " + -1 + " fatalError: " + "Initialization failed");
- streamhandler.write("context 0 reference " + reference + " Error");
- return;
- }
-
- o = panel.getApplet();
- PluginDebug.debug("Looking for object ", o, " panel is ", panel);
- AppletSecurityContextManager.getSecurityContext(0).store(o);
- PluginDebug.debug("WRITING 1: ", "context 0 reference ", reference, " GetJavaObject "
- , AppletSecurityContextManager.getSecurityContext(0).getIdentifier(o));
- streamhandler.write("context 0 reference " + reference + " GetJavaObject "
- + AppletSecurityContextManager.getSecurityContext(0).getIdentifier(o));
- PluginDebug.debug("WRITING 1 DONE");
- }
- }
-
- /*
- * Methods for java.applet.AppletContext
- */
-
- private static Map<URL, AudioClip> audioClips = new HashMap<URL, AudioClip>();
-
- /**
- * Get an audio clip.
- */
- @Override
- public AudioClip getAudioClip(URL url) {
- checkConnect(url);
- synchronized (audioClips) {
- AudioClip clip = audioClips.get(url);
- if (clip == null) {
- audioClips.put(url, clip = new AppletAudioClip(url));
- }
- return clip;
- }
- }
-
- private static Map<URL, AppletImageRef> imageRefs = new HashMap<URL, AppletImageRef>();
-
- /**
- * Get an image.
- */
- @Override
- public Image getImage(URL url) {
- return getCachedImage(url);
- }
-
- private Image getCachedImage(URL url) {
- return (Image) getCachedImageRef(url).get();
- }
-
- /**
- * Get an image ref.
- */
- private synchronized Ref getCachedImageRef(URL url) {
- PluginDebug.debug("getCachedImageRef() searching for ", url);
-
- try {
-
- String originalURL = url.toString();
- String codeBase = panel.getCodeBase().toString();
-
- if (originalURL.startsWith(codeBase)) {
-
- PluginDebug.debug("getCachedImageRef() got URL = ", url);
- PluginDebug.debug("getCachedImageRef() plugin codebase = ", codeBase);
-
- String resourceName = originalURL.substring(codeBase.length());
- JNLPClassLoader loader = (JNLPClassLoader) panel.getAppletClassLoader();
-
- URL localURL = null;
- if (loader.resourceAvailableLocally(resourceName)) {
- url = loader.getResource(resourceName);
- }
-
- url = localURL != null ? localURL : url;
- }
-
- PluginDebug.debug("getCachedImageRef() getting img from URL = ", url);
-
- synchronized (imageRefs) {
- AppletImageRef ref = imageRefs.get(url);
- if (ref == null) {
- ref = new AppletImageRef(url);
- imageRefs.put(url, ref);
- }
- return ref;
- }
- } catch (Exception e) {
- OutputController.getLogger().log(OutputController.Level.ERROR_ALL, "Error occurred when trying to fetch image:");
- OutputController.getLogger().log(e);
- return null;
- }
- }
-
- /**
- * Flush the image cache.
- */
- static void flushImageCache() {
- imageRefs.clear();
- }
-
- private static Vector<NetxPanel> appletPanels = new Vector<NetxPanel>();
-
- /**
- * Get an applet by name.
- */
- @Override
- public Applet getApplet(String name) {
- name = name.toLowerCase();
- SocketPermission panelSp =
- new SocketPermission(panel.getCodeBase().getHost(), "connect");
- synchronized(appletPanels) {
- for (Enumeration<NetxPanel> e = appletPanels.elements(); e.hasMoreElements();) {
- AppletPanel p = e.nextElement();
- String param = p.getParameter("name");
- if (param != null) {
- param = param.toLowerCase();
- }
- if (name.equals(param) &&
- p.getDocumentBase().equals(panel.getDocumentBase())) {
-
- SocketPermission sp =
- new SocketPermission(p.getCodeBase().getHost(), "connect");
-
- if (panelSp.implies(sp)) {
- return p.applet;
- }
- }
- }
- }
- return null;
- }
-
- /**
- * Return an enumeration of all the accessible
- * applets on this page.
- */
- @Override
- public Enumeration<Applet> getApplets() {
- Vector<Applet> v = new Vector<Applet>();
- SocketPermission panelSp =
- new SocketPermission(panel.getCodeBase().getHost(), "connect");
-
- synchronized(appletPanels) {
- for (Enumeration<NetxPanel> e = appletPanels.elements(); e.hasMoreElements();) {
- AppletPanel p = e.nextElement();
- if (p.getDocumentBase().equals(panel.getDocumentBase())) {
-
- SocketPermission sp =
- new SocketPermission(p.getCodeBase().getHost(), "connect");
- if (panelSp.implies(sp)) {
- v.addElement(p.applet);
- }
- }
- }
- }
- return v.elements();
- }
-
- @Override
- public void showDocument(URL url) {
- PluginDebug.debug("Showing document...");
- showDocument(url, "_self");
- }
-
- @Override
- public void showDocument(URL url, String target) {
- // If it is a javascript document, eval on current page.
- if ("javascript".equals(url.getProtocol())) {
- // Snip protocol off string
- String evalString = url.toString().substring("javascript:".length());
- eval(getWindow(), evalString);
- return;
- }
- try {
- Long reference = getRequestIdentifier();
- write("reference " + reference + " LoadURL " + UrlUtil.encode(url.toString(), "UTF-8") + " " + target);
- } catch (IOException exception) {
- // Deliberately ignore IOException. showDocument may be
- // called from threads other than the main thread after
- // streamhandler.pluginOutputStream has been closed.
- }
- }
-
- /**
- * Show status.
- */
- @Override
- public void showStatus(String status) {
- try {
- // FIXME: change to postCallRequest
- // For statuses, we cannot have a newline
- status = status.replace("\n", " ");
- write("status " + status);
- } catch (IOException exception) {
- // Deliberately ignore IOException. showStatus may be
- // called from threads other than the main thread after
- // streamhandler.pluginOutputStream has been closed.
- }
- }
-
- /**
- * Returns an incremental number (unique identifier) for a message.
- * If identifier hits Long.MAX_VALUE it loops back starting at 0.
- *
- * @return A unique Long identifier for the request
- */
- private static long getRequestIdentifier() {
- synchronized(requestMutex) {
- if (requestIdentityCounter == Long.MAX_VALUE) {
- requestIdentityCounter = 0L;
- }
-
- return requestIdentityCounter++;
- }
- }
-
- public long getWindow() {
- PluginDebug.debug("STARTING getWindow");
- Long reference = getRequestIdentifier();
-
- PluginCallRequest request = requestFactory.getPluginCallRequest("window",
- "instance " + identifier + " reference " +
- +reference + " " + "GetWindow", reference);
-
- PluginDebug.debug("STARTING postCallRequest");
- streamhandler.postCallRequest(request);
- PluginDebug.debug("STARTING postCallRequest done");
- streamhandler.write(request.getMessage());
- try {
- PluginDebug.debug("wait request 1");
- synchronized (request) {
- PluginDebug.debug("wait request 2");
- while ((Long) request.getObject() == 0)
- request.wait();
- PluginDebug.debug("wait request 3");
- }
- } catch (InterruptedException e) {
- throw new RuntimeException("Interrupted waiting for call request.",
- e);
- }
-
- PluginDebug.debug("STARTING getWindow DONE");
- return (Long) request.getObject();
- }
-
- // FIXME: make private, access via reflection.
- public static Object getMember(long internal, String name) {
- AppletSecurityContextManager.getSecurityContext(0).store(name);
- int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name);
- Long reference = getRequestIdentifier();
-
- // Prefix with dummy instance for convenience.
- PluginCallRequest request = requestFactory.getPluginCallRequest("member",
- "instance " + 0 + " reference " + reference + " GetMember " +
- internal + " " + nameID, reference);
-
- streamhandler.postCallRequest(request);
- streamhandler.write(request.getMessage());
- try {
- PluginDebug.debug("wait getMEM request 1");
- synchronized (request) {
- PluginDebug.debug("wait getMEM request 2");
- while (request.isDone() == false)
- request.wait();
- PluginDebug.debug("wait getMEM request 3 GOT: ", request.getObject().getClass());
- }
- } catch (InterruptedException e) {
- throw new RuntimeException("Interrupted waiting for call request.",
- e);
- }
- PluginDebug.debug(" getMember DONE");
- return request.getObject();
- }
-
- public static void setMember(long internal, String name, Object value) {
- PluginDebug.debug("Setting to class " + value.getClass() + ":" + value.getClass().isPrimitive());
- PluginAppletSecurityContext securityContext = AppletSecurityContextManager.getSecurityContext(0);
- securityContext.store(name);
- int nameID = securityContext.getIdentifier(name);
- Long reference = getRequestIdentifier();
-
- // work on a copy of value, as we don't want to be manipulating
- // complex objects
- String objIDStr = securityContext.toObjectIDString(value,
- value.getClass(), true /* unbox primitives */);
-
- // Prefix with dummy instance for convenience.
- PluginCallRequest request = requestFactory.getPluginCallRequest("void",
- "instance " + 0 + " reference " + reference + " SetMember " +
- internal + " " + nameID + " " + objIDStr, reference);
-
- streamhandler.postCallRequest(request);
- streamhandler.write(request.getMessage());
- try {
- PluginDebug.debug("wait setMem request: ", request.getMessage());
- PluginDebug.debug("wait setMem request 1");
- synchronized (request) {
- PluginDebug.debug("wait setMem request 2");
- while (request.isDone() == false)
- request.wait();
- PluginDebug.debug("wait setMem request 3");
- }
- } catch (InterruptedException e) {
- throw new RuntimeException("Interrupted waiting for call request.",
- e);
- }
- PluginDebug.debug(" setMember DONE");
- }
-
- // FIXME: handle long index as well.
- public static void setSlot(long internal, int index, Object value) {
- PluginAppletSecurityContext securityContext = AppletSecurityContextManager.getSecurityContext(0);
- securityContext.store(value);
- Long reference = getRequestIdentifier();
-
- String objIDStr = securityContext.toObjectIDString(value,
- value.getClass(), true /* unbox primitives */);
-
- // Prefix with dummy instance for convenience.
- PluginCallRequest request = requestFactory.getPluginCallRequest("void",
- "instance " + 0 + " reference " + reference + " SetSlot " +
- internal + " " + index + " " + objIDStr, reference);
-
- streamhandler.postCallRequest(request);
- streamhandler.write(request.getMessage());
- try {
- PluginDebug.debug("wait setSlot request 1");
- synchronized (request) {
- PluginDebug.debug("wait setSlot request 2");
- while (request.isDone() == false)
- request.wait();
- PluginDebug.debug("wait setSlot request 3");
- }
- } catch (InterruptedException e) {
- throw new RuntimeException("Interrupted waiting for call request.",
- e);
- }
- PluginDebug.debug(" setSlot DONE");
- }
-
- public static Object getSlot(long internal, int index) {
- Long reference = getRequestIdentifier();
-
- // Prefix with dummy instance for convenience.
- PluginCallRequest request = requestFactory.getPluginCallRequest("member",
- "instance " + 0 + " reference " + reference + " GetSlot " +
- internal + " " + index, reference);
- streamhandler.postCallRequest(request);
- streamhandler.write(request.getMessage());
- try {
- PluginDebug.debug("wait getSlot request 1");
- synchronized (request) {
- PluginDebug.debug("wait getSlot request 2");
- while (request.isDone() == false)
- request.wait();
- PluginDebug.debug("wait getSlot request 3");
- }
- } catch (InterruptedException e) {
- throw new RuntimeException("Interrupted waiting for call request.",
- e);
- }
- PluginDebug.debug(" getSlot DONE");
- return request.getObject();
- }
-
- public static Object eval(long internal, String s) {
- AppletSecurityContextManager.getSecurityContext(0).store(s);
- int stringID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(s);
- Long reference = getRequestIdentifier();
-
- // Prefix with dummy instance for convenience.
- // FIXME: rename GetMemberPluginCallRequest ObjectPluginCallRequest.
- PluginCallRequest request = requestFactory.getPluginCallRequest("member",
- "instance " + 0 + " reference " + reference + " Eval " +
- internal + " " + stringID, reference);
- streamhandler.postCallRequest(request);
- streamhandler.write(request.getMessage());
- try {
- PluginDebug.debug("wait eval request 1");
- synchronized (request) {
- PluginDebug.debug("wait eval request 2");
- while (request.isDone() == false) {
- request.wait();
- }
- PluginDebug.debug("wait eval request 3");
- }
- } catch (InterruptedException e) {
- throw new RuntimeException("Interrupted waiting for call request.",
- e);
- }
- PluginDebug.debug(" getSlot DONE");
- return request.getObject();
- }
-
- public static void removeMember(long internal, String name) {
- AppletSecurityContextManager.getSecurityContext(0).store(name);
- int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name);
- Long reference = getRequestIdentifier();
-
- // Prefix with dummy instance for convenience.
- PluginCallRequest request = requestFactory.getPluginCallRequest("void",
- "instance " + 0 + " reference " + reference + " RemoveMember " +
- internal + " " + nameID, reference);
-
- streamhandler.postCallRequest(request);
- streamhandler.write(request.getMessage());
- try {
- PluginDebug.debug("wait removeMember request 1");
- synchronized (request) {
- PluginDebug.debug("wait removeMember request 2");
- while (request.isDone() == false)
- request.wait();
- PluginDebug.debug("wait removeMember request 3");
- }
- } catch (InterruptedException e) {
- throw new RuntimeException("Interrupted waiting for call request.",
- e);
- }
- PluginDebug.debug(" RemoveMember DONE");
- }
-
- public static Object call(long internal, String name, Object args[]) {
- // FIXME: when is this removed from the object store?
- // FIXME: reference should return the ID.
- // FIXME: convenience method for this long line.
- AppletSecurityContextManager.getSecurityContext(0).store(name);
- int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name);
- Long reference = getRequestIdentifier();
-
- String argIDs = "";
- for (Object arg : args) {
- AppletSecurityContextManager.getSecurityContext(0).store(arg);
- argIDs += AppletSecurityContextManager.getSecurityContext(0).getIdentifier(arg) + " ";
- }
- argIDs = argIDs.trim();
-
- // Prefix with dummy instance for convenience.
- PluginCallRequest request = requestFactory.getPluginCallRequest("member",
- "instance " + 0 + " reference " + reference + " Call " +
- internal + " " + nameID + " " + argIDs, reference);
-
- streamhandler.postCallRequest(request);
- streamhandler.write(request.getMessage());
- try {
- PluginDebug.debug("wait call request 1");
- synchronized (request) {
- PluginDebug.debug("wait call request 2");
- while (request.isDone() == false) {
- request.wait();
- }
- PluginDebug.debug("wait call request 3");
- }
- } catch (InterruptedException e) {
- throw new RuntimeException("Interrupted waiting for call request.",
- e);
- }
- PluginDebug.debug(" Call DONE");
- return request.getObject();
- }
-
- public static Object requestPluginCookieInfo(URI uri) {
-
- PluginCallRequest request;
- Long reference = getRequestIdentifier();
-
- try {
- String encodedURI = UrlUtil.encode(uri.toString(), "UTF-8");
- request = requestFactory.getPluginCallRequest("cookieinfo",
- "plugin PluginCookieInfo " + "reference " + reference +
- " " + encodedURI, reference);
-
- } catch (UnsupportedEncodingException e) {
- OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e);
- return null;
- }
-
- PluginMessageConsumer.registerPriorityWait(reference);
- streamhandler.postCallRequest(request);
- streamhandler.write(request.getMessage());
- try {
- PluginDebug.debug("wait cookieinfo request 1");
- synchronized (request) {
- PluginDebug.debug("wait cookieinfo request 2");
- while (request.isDone() == false) {
- request.wait();
- }
- PluginDebug.debug("wait cookieinfo request 3");
- }
- } catch (InterruptedException e) {
- throw new RuntimeException("Interrupted waiting for cookieinfo request.",
- e);
- }
- PluginDebug.debug(" Cookieinfo DONE");
- return request.getObject();
- }
-
- /**
- * Obtain information about the proxy from the browser.
- *
- * @param uri a String in url-encoded form
- * @return a {@link URI} that indicates a proxy.
- */
- public static Object requestPluginProxyInfo(String uri) {
- Long reference = getRequestIdentifier();
-
- PluginCallRequest request = requestFactory.getPluginCallRequest("proxyinfo",
- "plugin PluginProxyInfo reference " + reference + " " +
- uri, reference);
-
- PluginMessageConsumer.registerPriorityWait(reference);
- streamhandler.postCallRequest(request);
- streamhandler.write(request.getMessage());
- try {
- PluginDebug.debug("wait call request 1");
- synchronized (request) {
- PluginDebug.debug("wait call request 2");
- while (request.isDone() == false) {
- request.wait();
- }
- PluginDebug.debug("wait call request 3");
- }
- } catch (InterruptedException e) {
- throw new RuntimeException("Interrupted waiting for call request.",
- e);
- }
- PluginDebug.debug(" Call DONE");
- return request.getObject();
- }
-
- public static void JavaScriptFinalize(long internal) {
- Long reference = getRequestIdentifier();
-
- // Prefix with dummy instance for convenience.
- PluginCallRequest request = requestFactory.getPluginCallRequest("void",
- "instance " + 0 + " reference " + reference + " Finalize " +
- internal, reference);
-
- streamhandler.postCallRequest(request);
- streamhandler.write(request.getMessage());
- try {
- PluginDebug.debug("wait finalize request 1");
- synchronized (request) {
- PluginDebug.debug("wait finalize request 2");
- while (request.isDone() == false) {
- request.wait();
- }
- PluginDebug.debug("wait finalize request 3");
- }
- } catch (InterruptedException e) {
- throw new RuntimeException("Interrupted waiting for call request.",
- e);
- }
- PluginDebug.debug(" finalize DONE");
- }
-
- public static String javascriptToString(long internal) {
- Long reference = getRequestIdentifier();
-
- // Prefix with dummy instance for convenience.
- PluginCallRequest request = requestFactory.getPluginCallRequest("member",
- "instance " + 0 + " reference " + reference + " ToString " +
- internal, reference);
-
- streamhandler.postCallRequest(request);
- streamhandler.write(request.getMessage());
- PluginDebug.debug("wait ToString request 1");
- synchronized (request) {
- PluginDebug.debug("wait ToString request 2");
- waitForRequestCompletion(request);
- PluginDebug.debug("wait ToString request 3");
- }
-
- PluginDebug.debug(" ToString DONE");
- return (String) request.getObject();
- }
-
- // FIXME: make this private and access it from JSObject using
- // reflection.
- private void write(String message) throws IOException {
- PluginDebug.debug("WRITING 2: ", "instance ", identifier, " " + message);
- streamhandler.write("instance " + identifier + " " + message);
- PluginDebug.debug("WRITING 2 DONE");
- }
-
- @Override
- public void setStream(String key, InputStream stream) throws IOException {
- // We do nothing.
- }
-
- @Override
- public InputStream getStream(String key) {
- // We do nothing.
- return null;
- }
-
- @Override
- public Iterator<String> getStreamKeys() {
- // We do nothing.
- return null;
- }
-
- /**
- * System parameters.
- */
- static Hashtable<String, String> systemParam = new Hashtable<String, String>();
-
- static {
- systemParam.put("codebase", "codebase");
- systemParam.put("code", "code");
- systemParam.put("alt", "alt");
- systemParam.put("width", "width");
- systemParam.put("height", "height");
- systemParam.put("align", "align");
- systemParam.put("vspace", "vspace");
- systemParam.put("hspace", "hspace");
- }
-
- /**
- * Make sure the atrributes are uptodate.
- */
- public void updateAtts() {
- Dimension d = panel.getSize();
- Insets in = panel.getInsets();
- int width = d.width - (in.left + in.right);
- int height = d.height - (in.top + in.bottom);
- panel.updateSizeInAtts(height, width);
- }
-
- /**
- * Restart the applet.
- */
- void appletRestart() {
- panel.sendEvent(AppletPanel.APPLET_STOP);
- panel.sendEvent(AppletPanel.APPLET_DESTROY);
- panel.sendEvent(AppletPanel.APPLET_INIT);
- panel.sendEvent(AppletPanel.APPLET_START);
- }
-
- /**
- * Reload the applet.
- */
- void appletReload() {
- panel.sendEvent(AppletPanel.APPLET_STOP);
- panel.sendEvent(AppletPanel.APPLET_DESTROY);
- panel.sendEvent(AppletPanel.APPLET_DISPOSE);
-
- /**
- * Fixed #4501142: Classlaoder sharing policy doesn't
- * take "archive" into account. This will be overridden
- * by Java Plug-in. [stanleyh]
- */
- AppletPanel.flushClassLoader(panel.getClassLoaderCacheKey());
-
- /*
- * Make sure we don't have two threads running through the event queue
- * at the same time.
- */
- try {
- ((AppletViewerPanel)panel).joinAppletThread();
- ((AppletViewerPanel)panel).release();
- } catch (InterruptedException e) {
- return; // abort the reload
- }
-
- AccessController.doPrivileged(new PrivilegedAction<Void>() {
- @Override
- public Void run() {
- ((AppletViewerPanel)panel).createAppletThread();
- return null;
- }
- });
-
- panel.sendEvent(AppletPanel.APPLET_LOAD);
- panel.sendEvent(AppletPanel.APPLET_INIT);
- panel.sendEvent(AppletPanel.APPLET_START);
- }
-
- @Override
- public int print(Graphics graphics, PageFormat pf, int pageIndex) {
- return Printable.NO_SUCH_PAGE;
- }
-
- /**
- * Start the applet.
- */
- void appletStart() {
- panel.sendEvent(AppletPanel.APPLET_START);
- }
-
- /**
- * Stop the applet.
- */
- void appletStop() {
- panel.sendEvent(AppletPanel.APPLET_STOP);
- }
-
- /**
- * Shutdown a viewer.
- * Stop, Destroy, Dispose and Quit a viewer
- */
- private void appletShutdown(AppletPanel p) {
- p.sendEvent(AppletPanel.APPLET_STOP);
- p.sendEvent(AppletPanel.APPLET_DESTROY);
- p.sendEvent(AppletPanel.APPLET_DISPOSE);
- p.sendEvent(AppletPanel.APPLET_QUIT);
- }
-
- /**
- * Close this viewer.
- * Stop, Destroy, Dispose and Quit an AppletView, then
- * reclaim resources and exit the program if this is
- * the last applet.
- */
- void appletClose() {
-
- // The caller thread is event dispatch thread, so
- // spawn a new thread to avoid blocking the event queue
- // when calling appletShutdown.
- //
- final AppletPanel p = panel;
-
- new Thread(new Runnable() {
- @SuppressWarnings("deprecation")
- @Override
- public void run() {
- ClassLoader cl = p.applet.getClass().getClassLoader();
-
- // Since we want to deal with JNLPClassLoader, extract it if this
- // is a codebase loader
- if (cl instanceof JNLPClassLoader.CodeBaseClassLoader) {
- cl = ((JNLPClassLoader.CodeBaseClassLoader) cl).getParentJNLPClassLoader();
- }
-
- appletShutdown(p);
- appletPanels.removeElement(p);
-
- // Mark classloader unusable
- ((JNLPClassLoader) cl).decrementLoaderUseCount();
-
- try {
- SwingUtilities.invokeAndWait(new Runnable() {
- @Override
- public void run() {
- dispose();
- }
- });
- } catch (Exception e) { // ignore, we are just disposing it
- }
-
- if (countApplets() == 0) {
- appletSystemExit();
- }
-
- updateStatus(identifier, PAV_INIT_STATUS.DESTROYED);
- }
- }).start();
- }
-
- /**
- * Exit the program.
- * Exit from the program (if not stand alone) - do no clean-up
- */
- private void appletSystemExit() {
- // Do nothing. Exit is handled by another
- // block of code, called when _all_ applets are gone
- }
-
- /**
- * How many applets are running?
- */
-
- public static int countApplets() {
- return appletPanels.size();
- }
-
-
- private static void checkConnect(URL url) {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- try {
- java.security.Permission perm =
- url.openConnection().getPermission();
- if (perm != null) {
- security.checkPermission(perm);
- }
- else {
- security.checkConnect(url.getHost(), url.getPort());
- }
- } catch (java.io.IOException ioe) {
- security.checkConnect(url.getHost(), url.getPort());
- }
- }
- }
-
- /**
- * {@inheritDoc}
- *
- * This method calls paint directly, rather than via super.update() since
- * the parent class's update() just does a couple of checks (both of
- * which are accounted for) and then calls paint anyway.
- */
- @Override
- public void paint(Graphics g) {
-
- // If the image or the graphics don't exist, create new ones
- if (bufFrameImg == null || bufFrameImgGraphics == null) {
- // although invisible applets do not have right to paint
- // we rather paint to 1x1 to be sure all callbacks will be completed
- bufFrameImg = createImage(Math.max(1, getWidth()), Math.max(1, getHeight()));
- bufFrameImgGraphics = bufFrameImg.getGraphics();
- }
-
- // Paint off-screen
- for (Component c: this.getComponents()) {
- c.paint(bufFrameImgGraphics);
- }
-
- // Draw the painted image
- g.drawImage(bufFrameImg, 0, 0, this);
- }
-
-
- @Override
- public void update(Graphics g) {
- paint(g);
- }
-
- /**
- * Waits on a given condition queue until timeout.
- *
- * <b>This function assumes that the monitor lock has already been
- * acquired by the caller.</b>
- *
- * If the given lock is null, this function returns immediately.
- *
- * @param lock the lock that must be held when this method is called.
- * @param cond the condition queue on which to wait for notifications.
- * @param timeout The maximum time to wait (nanoseconds)
- * @return Approximate time spent sleeping (not guaranteed to be perfect)
- */
- public static long waitTillTimeout(ReentrantLock lock, Condition cond,
- long timeout) {
-
- // Can't wait on null. Return 0 indicating no wait happened.
- if (lock == null) {
- return 0;
- }
-
- assert lock.isHeldByCurrentThread();
-
- // Record when we started sleeping
- long sleepStart = 0L;
-
- try {
- sleepStart = System.nanoTime();
- cond.await(timeout, TimeUnit.NANOSECONDS);
- } catch (InterruptedException ie) {} // Discarded, time to return
-
- // Return the difference
- return System.nanoTime() - sleepStart;
- }
-
- private class SplashCreator implements Runnable {
-
- private final AppletPanel fPanel;
-
- public SplashCreator(AppletPanel fPanel) {
- this.fPanel = fPanel;
- }
-
- @Override
- public void run() {
- add("Center", fPanel);
- fPanel.setVisible(false);
- splashPanel = SplashUtils.getSplashScreen(fPanel.getWidth(), fPanel.getHeight());
- if (splashPanel != null) {
- splashPanel.startAnimation();
- PluginDebug.debug("Added splash " + splashPanel);
- add("Center", splashPanel.getSplashComponent());
- }
- pack();
- }
- }
-}
diff --git a/plugin/icedteanp/java/sun/applet/PluginCookieManager.java b/plugin/icedteanp/java/sun/applet/PluginCookieManager.java
index 21bdbc0..de58d07 100644
--- a/plugin/icedteanp/java/sun/applet/PluginCookieManager.java
+++ b/plugin/icedteanp/java/sun/applet/PluginCookieManager.java
@@ -45,6 +45,8 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
+import jogamp.plugin.applet.PluginApplet3Viewer;
+
import com.sun.jndi.toolkit.url.UrlUtil;
public class PluginCookieManager extends CookieManager {
@@ -64,8 +66,7 @@ public class PluginCookieManager extends CookieManager {
Map<String, List<String>> cookieMap = new java.util.HashMap<String, List<String>>();
- String cookies = (String) PluginAppletViewer
- .requestPluginCookieInfo(uri);
+ String cookies = (String) PluginApplet3Viewer.requestPluginCookieInfo(uri);
List<String> cookieHeader = new java.util.ArrayList<String>();
if (cookies != null && cookies.length() > 0)
diff --git a/plugin/icedteanp/java/sun/applet/PluginMain.java b/plugin/icedteanp/java/sun/applet/PluginMain.java
index 421edb5..32b8ab6 100644
--- a/plugin/icedteanp/java/sun/applet/PluginMain.java
+++ b/plugin/icedteanp/java/sun/applet/PluginMain.java
@@ -77,14 +77,13 @@ import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Map;
import java.util.Properties;
-import sun.awt.AppContext;
-import sun.awt.SunToolkit;
+import jogamp.applet.App3Context;
+import jogamp.plugin.applet.PluginApplet3Viewer;
import net.sourceforge.jnlp.config.DeploymentConfiguration;
import net.sourceforge.jnlp.runtime.JNLPRuntime;
import net.sourceforge.jnlp.security.JNLPAuthenticator;
import net.sourceforge.jnlp.util.logging.JavaConsole;
-import net.sourceforge.jnlp.util.logging.LogConfig;
import net.sourceforge.jnlp.util.logging.OutputController;
/**
@@ -127,8 +126,12 @@ public class PluginMain {
OutputController.getLogger().log(i + ": "+string);
}
+ /**
if (AppContext.getAppContext() == null) {
SunToolkit.createNewAppContext();
+ } */
+ if (App3Context.getAppContext() == null) {
+ App3Context.createAppContext();
}
installDummyJavascriptProtocolHandler();
@@ -152,8 +155,10 @@ public class PluginMain {
PluginAppletSecurityContext.setStreamhandler(streamHandler);
AppletSecurityContextManager.addContext(0, sc);
- PluginAppletViewer.setStreamhandler(streamHandler);
- PluginAppletViewer.setPluginCallRequestFactory(new PluginCallRequestFactory());
+ // FIXME PluginAppletViewer.setStreamhandler(streamHandler);
+ // FIXME PluginAppletViewer.setPluginCallRequestFactory(new PluginCallRequestFactory());
+ PluginApplet3Viewer.setStreamhandler(streamHandler); // FIXME
+ PluginApplet3Viewer.setPluginCallRequestFactory(new PluginCallRequestFactory()); // FIXME
init();
diff --git a/plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java b/plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java
index 1de8bd7..1975cba 100644
--- a/plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java
+++ b/plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java
@@ -41,7 +41,7 @@ import java.util.ArrayList;
import java.util.LinkedList;
import net.sourceforge.jnlp.util.logging.OutputController;
-class PluginMessageConsumer {
+public class PluginMessageConsumer {
private static final int MAX_PARALLEL_INITS = 1;
diff --git a/plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java b/plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java
index 79d925d..c945b8e 100644
--- a/plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java
+++ b/plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java
@@ -39,7 +39,7 @@ package sun.applet;
import net.sourceforge.jnlp.util.logging.OutputController;
-class PluginMessageHandlerWorker extends Thread {
+public class PluginMessageHandlerWorker extends Thread {
private boolean free = true;
private final boolean isPriorityWorker;
diff --git a/plugin/icedteanp/java/sun/applet/PluginParameterParser.java b/plugin/icedteanp/java/sun/applet/PluginParameterParser.java
index 1db6034..56dabc9 100644
--- a/plugin/icedteanp/java/sun/applet/PluginParameterParser.java
+++ b/plugin/icedteanp/java/sun/applet/PluginParameterParser.java
@@ -6,7 +6,7 @@ import java.util.Map;
import net.sourceforge.jnlp.PluginParameters;
-class PluginParameterParser {
+public class PluginParameterParser {
static private final char DELIMITER_ESCAPE = ':';
static private final String KEY_VALUE_DELIMITER = ";";
diff --git a/plugin/icedteanp/java/sun/applet/PluginProxySelector.java b/plugin/icedteanp/java/sun/applet/PluginProxySelector.java
index 25689f5..7355ab9 100644
--- a/plugin/icedteanp/java/sun/applet/PluginProxySelector.java
+++ b/plugin/icedteanp/java/sun/applet/PluginProxySelector.java
@@ -45,6 +45,8 @@ import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
+import jogamp.plugin.applet.PluginApplet3Viewer;
+
import com.sun.jndi.toolkit.url.UrlUtil;
import net.sourceforge.jnlp.config.DeploymentConfiguration;
@@ -135,7 +137,7 @@ public class PluginProxySelector extends JNLPProxySelector {
/** For tests to override */
protected Object getProxyFromRemoteCallToBrowser(String uri) {
- return PluginAppletViewer.requestPluginProxyInfo(uri);
+ return PluginApplet3Viewer.requestPluginProxyInfo(uri);
}
/**
diff --git a/plugin/icedteanp/java/sun/applet/PluginStreamHandler.java b/plugin/icedteanp/java/sun/applet/PluginStreamHandler.java
index 990a903..d45cdc4 100644
--- a/plugin/icedteanp/java/sun/applet/PluginStreamHandler.java
+++ b/plugin/icedteanp/java/sun/applet/PluginStreamHandler.java
@@ -46,7 +46,7 @@ import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
-import javax.swing.SwingUtilities;
+import jogamp.plugin.applet.PluginApplet3Viewer;
import net.sourceforge.jnlp.runtime.JNLPRuntime;
import net.sourceforge.jnlp.runtime.Translator;
import net.sourceforge.jnlp.util.logging.JavaConsole;
@@ -230,12 +230,14 @@ public class PluginStreamHandler {
final String frest = rest;
if (type.equals("instance")) {
- PluginAppletViewer.handleMessage(identifier, freference, frest);
+ PluginApplet3Viewer.handleMessage(identifier, freference, frest); // FIXME
+ // FIXME PluginAppletViewer.handleMessage(identifier, freference, frest);
} else if (type.equals("context")) {
PluginDebug.debug("Sending to PASC: ", identifier, "/", reference, " and ", rest);
AppletSecurityContextManager.handleMessage(identifier, reference, src, privileges, rest);
}
} catch (Exception e) {
+ e.printStackTrace(); // FIXME
throw new PluginException(this, identifier, reference, e);
}
}