home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / browser / ns405lyc / nav40.z / java40.jar / netscape / applet / MozillaAppletContext.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-03-24  |  14.8 KB  |  935 lines

  1. package netscape.applet;
  2.  
  3. import java.applet.Applet;
  4. import java.applet.AppletContext;
  5. import java.applet.AudioClip;
  6. import java.awt.Image;
  7. import java.awt.Toolkit;
  8. import java.awt.Window;
  9. import java.io.PrintStream;
  10. import java.net.MalformedURLException;
  11. import java.net.URL;
  12. import java.util.Enumeration;
  13. import java.util.Hashtable;
  14. import java.util.Vector;
  15. import netscape.debug.Debugger;
  16. import netscape.net.URLStreamHandlerFactory;
  17. import netscape.security.AppletSecurity;
  18. import netscape.security.AppletSecurityException;
  19. import netscape.security.PrivilegeManager;
  20. import sun.awt.image.URLImageSource;
  21.  
  22. class MozillaAppletContext implements AppletContext {
  23.    boolean bIcon;
  24.    int frameMWContext;
  25.    Mapping appletFrames;
  26.    Hashtable imageCache;
  27.    Hashtable audioClipCache;
  28.    URL documentURL;
  29.    Integer contextID;
  30.    static AppletThreadKiller killer;
  31.    static Console console;
  32.    static boolean javaInitialized;
  33.    static boolean javaOneTimeInitDone;
  34.    static int totalApplets;
  35.    static int trimThreshold;
  36.    static boolean noisyTrimming;
  37.    static Mapping appletContexts;
  38.    static int debug;
  39.    static final int DBG_NONE = 0;
  40.    static final int DBG_APPLET_USER = 1;
  41.    static final int DBG_LOADING_USER = 2;
  42.    static final int DBG_CONTEXT_USER = 3;
  43.    static final int DBG_APPLET_DEV = 4;
  44.    static final int DBG_LOADING_DEV = 5;
  45.    static final int DBG_CONTEXT_DEV = 6;
  46.    static final int DBG_APPLET_NS = 7;
  47.    static final int DBG_LOADING_NS = 8;
  48.    static final int DBG_CONTEXT_NS = 9;
  49.  
  50.    MozillaAppletContext(int var1, Integer var2, String var3) {
  51.       this.frameMWContext = var1;
  52.       this.contextID = var2;
  53.       this.appletFrames = new Mapping();
  54.       this.imageCache = new Hashtable();
  55.       this.audioClipCache = new Hashtable();
  56.       if (debug >= 3) {
  57.          System.out.println("# New applet context: " + var3 + ", contextID=" + var2);
  58.       }
  59.  
  60.       if (var3 != null) {
  61.          try {
  62.             this.documentURL = new URL(var3);
  63.          } catch (MalformedURLException var4) {
  64.             if (debug >= 4) {
  65.                System.err.println("#     Malformed documentURL: " + var3);
  66.             }
  67.  
  68.             this.mochaOnLoad(-1);
  69.          }
  70.       }
  71.  
  72.       Debugger.debuggerStartHook();
  73.    }
  74.  
  75.    static void indent(PrintStream var0, int var1) {
  76.       while(true) {
  77.          --var1;
  78.          if (var1 < 0) {
  79.             return;
  80.          }
  81.  
  82.          var0.print("  ");
  83.       }
  84.    }
  85.  
  86.    void dumpState(PrintStream var1, int var2) {
  87.       indent(var1, var2);
  88.       int var3 = this.appletFrames == null ? 0 : this.appletFrames.size();
  89.       int var4 = this.imageCache == null ? 0 : this.imageCache.size();
  90.       int var5 = this.audioClipCache == null ? 0 : this.audioClipCache.size();
  91.       var1.println("MozillaAppletContext id=" + this.contextID + " #frames=" + var3 + " #images=" + var4 + " #audioClips=" + var5 + " url=" + this.documentURL);
  92.  
  93.       for(int var6 = 0; var6 < var3; ++var6) {
  94.          DerivedAppletFrame var7 = (DerivedAppletFrame)this.appletFrames.elementAt(var6);
  95.          var7.dumpState(var1, var2 + 1);
  96.       }
  97.  
  98.       if (var4 > 0) {
  99.          indent(var1, var2 + 1);
  100.          var1.println("image cache:");
  101.          Enumeration var9 = this.imageCache.keys();
  102.  
  103.          while(var9.hasMoreElements()) {
  104.             URL var8 = (URL)var9.nextElement();
  105.             indent(var1, var2 + 2);
  106.             var1.println(var8.toString());
  107.          }
  108.       }
  109.  
  110.       if (var5 > 0) {
  111.          indent(var1, var2 + 1);
  112.          var1.println("audio clip cache:");
  113.          Enumeration var10 = this.audioClipCache.keys();
  114.  
  115.          while(var10.hasMoreElements()) {
  116.             URL var11 = (URL)var10.nextElement();
  117.             indent(var1, var2 + 2);
  118.             var1.println(var11.toString());
  119.          }
  120.       }
  121.  
  122.    }
  123.  
  124.    synchronized boolean destroy() {
  125.       if (debug >= 3) {
  126.          System.err.println("# Destroying applet context: " + this.documentURL + ", contextID=" + this.contextID);
  127.       }
  128.  
  129.       if (debug >= 9) {
  130.          System.err.println("#   frameMWContext=" + this.frameMWContext);
  131.       }
  132.  
  133.       this.destroyApplets();
  134.       this.frameMWContext = 0;
  135.       this.appletFrames = null;
  136.       this.imageCache = null;
  137.       this.audioClipCache = null;
  138.       appletContexts.remove(this.contextID);
  139.       return true;
  140.    }
  141.  
  142.    public AudioClip getAudioClip(URL var1) {
  143.       AudioClip var2 = lookupAudioClip(this, var1);
  144.       return var2;
  145.    }
  146.  
  147.    public Image getImage(URL var1) {
  148.       Image var2 = lookupImage(this, var1);
  149.       return var2;
  150.    }
  151.  
  152.    public Applet getApplet(String var1) {
  153.       int var2 = this.appletFrames.size();
  154.  
  155.       for(int var3 = 0; var3 < var2; ++var3) {
  156.          DerivedAppletFrame var4 = (DerivedAppletFrame)this.appletFrames.elementAt(var3);
  157.          if (var1.equals(var4.applet.getParameter("name"))) {
  158.             return var4.applet;
  159.          }
  160.       }
  161.  
  162.       return null;
  163.    }
  164.  
  165.    public Enumeration getApplets() {
  166.       int var1 = this.appletFrames.size();
  167.       Vector var2 = new Vector(var1);
  168.  
  169.       for(int var3 = 0; var3 < var1; ++var3) {
  170.          DerivedAppletFrame var4 = (DerivedAppletFrame)this.appletFrames.elementAt(var3);
  171.          var2.addElement(var4.applet);
  172.       }
  173.  
  174.       return var2.elements();
  175.    }
  176.  
  177.    public void showDocument(URL var1) {
  178.       this.showDocument(var1, "_top");
  179.    }
  180.  
  181.    public void showDocument(URL var1, String var2) {
  182.       this.pShowDocument(var1.toExternalForm(), (String)null, var2);
  183.    }
  184.  
  185.    public void showStatus(String var1) {
  186.       if (this.frameMWContext != 0) {
  187.          this.pShowStatus(var1);
  188.       }
  189.  
  190.    }
  191.  
  192.    public void mochaOnLoad(int var1) {
  193.       this.pMochaOnLoad(var1);
  194.    }
  195.  
  196.    private native void pShowDocument(String var1, String var2, String var3);
  197.  
  198.    private native void pShowStatus(String var1);
  199.  
  200.    private native void pMochaOnLoad(int var1);
  201.  
  202.    static synchronized AudioClip lookupAudioClip(MozillaAppletContext var0, URL var1) {
  203.       int var2 = appletContexts.size();
  204.  
  205.       for(int var3 = 0; var3 < var2; ++var3) {
  206.          MozillaAppletContext var4 = (MozillaAppletContext)appletContexts.elementAt(var3);
  207.          Object var5 = var4.audioClipCache.get(var1);
  208.          if (var5 != null) {
  209.             return (AudioClip)var5;
  210.          }
  211.       }
  212.  
  213.       AppletAudioClip var6 = new AppletAudioClip(var1);
  214.       var0.audioClipCache.put(var1, var6);
  215.       if (debug >= 2) {
  216.          System.err.println("# Loaded audio clip: " + var1);
  217.       }
  218.  
  219.       return var6;
  220.    }
  221.  
  222.    static synchronized Image lookupImage(MozillaAppletContext var0, URL var1) {
  223.       int var2 = appletContexts.size();
  224.  
  225.       for(int var3 = 0; var3 < var2; ++var3) {
  226.          MozillaAppletContext var4 = (MozillaAppletContext)appletContexts.elementAt(var3);
  227.          Object var5 = var4.imageCache.get(var1);
  228.          if (var5 != null) {
  229.             return (Image)var5;
  230.          }
  231.       }
  232.  
  233.       Image var7;
  234.       try {
  235.          URLImageSource var8 = new URLImageSource(var1);
  236.          var7 = Toolkit.getDefaultToolkit().createImage(var8);
  237.          var0.imageCache.put(var1, var7);
  238.          if (debug >= 2) {
  239.             System.err.println("# Loaded image: " + var1);
  240.          }
  241.       } catch (Exception var6) {
  242.          var7 = null;
  243.       }
  244.  
  245.       return var7;
  246.    }
  247.  
  248.    synchronized void initApplet(int var1, String var2, Hashtable var3, boolean var4) {
  249.       if (debug >= 4) {
  250.          String var5 = (String)var3.get("code");
  251.          System.err.println("# Initializing applet: " + var5 + ", appletID=" + var1 + ", contextID=" + this.contextID);
  252.       }
  253.  
  254.       if (debug >= 7) {
  255.          System.err.println("#   docURL=" + var2 + " reloadClasses=" + var4);
  256.       }
  257.  
  258.       if (this.documentURL != null) {
  259.          String var21 = (String)var3.get("codebase");
  260.          if (var21 == null) {
  261.             int var6 = var2.lastIndexOf(47) + 1;
  262.             var21 = var2.substring(0, var6);
  263.          } else {
  264.             if (!var21.endsWith("/")) {
  265.                var21 = var21 + "/";
  266.             }
  267.  
  268.             try {
  269.                URL var22 = new URL(this.documentURL, var21);
  270.                var21 = var22.toString();
  271.                int var7 = var21.lastIndexOf(47) + 1;
  272.                if (var7 != var21.length() - 1) {
  273.                   var21 = var21.substring(0, var7);
  274.                }
  275.             } catch (MalformedURLException var20) {
  276.             }
  277.  
  278.             if (!var2.startsWith("file:") && var21.startsWith("file:")) {
  279.                throw new AppletSecurityException("Illegal access from non-'file:' document to 'file:' codebase.\n#\tdocument: " + var2 + "\n#\tcodebase: " + var21);
  280.             }
  281.          }
  282.  
  283.          var3.put("codebase", var21);
  284.          URL var23 = this.documentURL;
  285.  
  286.          try {
  287.             var23 = new URL(var21);
  288.          } catch (MalformedURLException var19) {
  289.          }
  290.  
  291.          Object var24 = null;
  292.          String var8 = (String)var3.get("archive");
  293.          String var9 = (String)var3.get("archives");
  294.          if (var9 != null) {
  295.             if (var8 != null) {
  296.                var8 = var8 + "," + var9;
  297.             } else {
  298.                var8 = var9;
  299.             }
  300.          }
  301.  
  302.          URL[] var25;
  303.          if (var8 != null) {
  304.             int var10 = 1;
  305.  
  306.             for(int var11 = -1; (var11 = var8.indexOf(44, var11 + 1)) != -1; ++var10) {
  307.             }
  308.  
  309.             var25 = new URL[var10];
  310.             int var27 = -1;
  311.             String var12 = var8;
  312.             String var13 = null;
  313.  
  314.             for(int var14 = 0; var14 < var10; ++var14) {
  315.                try {
  316.                   int var15 = var8.indexOf(44, var27 + 1);
  317.                   if (var15 != -1) {
  318.                      var12 = var8.substring(var27 + 1, var15).trim();
  319.                      var27 = var15;
  320.                   } else {
  321.                      var12 = var8.substring(var27 + 1).trim();
  322.                   }
  323.  
  324.                   URL var16 = new URL(var23, var12);
  325.                   var12 = var16.toString();
  326.                } catch (MalformedURLException var18) {
  327.                }
  328.  
  329.                if (!var21.startsWith("file:") && var12.startsWith("file:")) {
  330.                   throw new AppletSecurityException("Illegal access from non-'file:' document to 'file:' codebase.\n#\tdocument: " + var2 + "\n#\tcodebase: " + var21);
  331.                }
  332.  
  333.                var13 = var13 + var12;
  334.  
  335.                try {
  336.                   var25[var14] = new URL(var12);
  337.                } catch (MalformedURLException var17) {
  338.                }
  339.             }
  340.  
  341.             var3.put("archive", var13);
  342.          } else {
  343.             var25 = new URL[0];
  344.          }
  345.  
  346.          Integer var26 = new Integer(var1);
  347.          DerivedAppletFrame var28 = new DerivedAppletFrame(this.documentURL, var23, var25, var3, this, var26, var4);
  348.          this.appletFrames.put(var26, var28);
  349.          ++totalApplets;
  350.          if (debug >= 7) {
  351.             System.err.println("#     total applets=" + totalApplets);
  352.          }
  353.  
  354.          if (debug >= 7) {
  355.             String var30 = "";
  356.  
  357.             Object var32;
  358.             for(Enumeration var31 = var3.keys(); var31.hasMoreElements(); var30 = var30 + (String)var32 + "=" + (String)var3.get(var32) + " ") {
  359.                var32 = var31.nextElement();
  360.             }
  361.  
  362.             System.err.println("#     New applet: " + var1 + " at " + var23 + " " + var30);
  363.          }
  364.  
  365.          var28.start();
  366.          ((Window)var28).pack();
  367.          ((Window)var28).show();
  368.          var28.sendEvent(new AppletEvent(1));
  369.          var28.sendEvent(new AppletEvent(2));
  370.       }
  371.    }
  372.  
  373.    DerivedAppletFrame getAppletFrame(Integer var1) {
  374.       DerivedAppletFrame var2 = (DerivedAppletFrame)this.appletFrames.get(var1);
  375.       if (var2 == null && debug >= 7) {
  376.          System.err.println("#   Warning: AppletFrame not found for appletID " + var1);
  377.       }
  378.  
  379.       return var2;
  380.    }
  381.  
  382.    synchronized void startApplet(int var1) {
  383.       DerivedAppletFrame var2 = this.getAppletFrame(new Integer(var1));
  384.       if (debug >= 4) {
  385.          System.err.println("# Starting applet: " + (var2 != null ? var2.getAppletName() : "?") + ", appletID=" + var1 + ", contextID=" + this.contextID);
  386.       }
  387.  
  388.       if (var2 == null) {
  389.          if (debug >= 7) {
  390.             System.err.println("#   applet must have been pruned: " + var1 + " on " + this.documentURL);
  391.          }
  392.  
  393.       } else {
  394.          var2.inHistory = false;
  395.          var2.sendEvent(new AppletEvent(3));
  396.       }
  397.    }
  398.  
  399.    synchronized void resizeApplet(int var1, int var2, int var3, int var4, int var5) {
  400.    }
  401.  
  402.    synchronized void printApplet(int var1, int var2) {
  403.    }
  404.  
  405.    static void printApplet(int var0, int var1, int var2) {
  406.       System.err.println("Applet printing will be supported soon");
  407.    }
  408.  
  409.    synchronized void stopApplet(int var1) {
  410.       DerivedAppletFrame var2 = this.getAppletFrame(new Integer(var1));
  411.       if (var2 != null) {
  412.          if (debug >= 4) {
  413.             System.err.println("# Stopping applet: " + var2.getAppletName() + ", appletID=" + var1 + ", contextID=" + this.contextID);
  414.          }
  415.  
  416.          var2.inHistory = true;
  417.          var2.sendEvent(new AppletEvent(4));
  418.       }
  419.    }
  420.  
  421.    synchronized void destroyApplet(Integer var1) {
  422.       DerivedAppletFrame var2 = this.getAppletFrame(var1);
  423.       boolean var3 = false;
  424.       if (var2 != null) {
  425.          if (noisyTrimming && debug >= 4) {
  426.             System.err.println("# Destroying applet: " + var2.getAppletName() + ", appletID=" + var1 + ", contextID=" + this.contextID);
  427.          }
  428.  
  429.          --totalApplets;
  430.          if (noisyTrimming && debug >= 7) {
  431.             System.err.println("#     total applets=" + totalApplets);
  432.          }
  433.  
  434.          if (!noisyTrimming) {
  435.             var2.noisy = false;
  436.          }
  437.  
  438.          this.appletFrames.remove(var1, true);
  439.          ThreadGroup var4 = var2.handler.getThreadGroup();
  440.          AppletThreadList var5 = new AppletThreadList(var4, var2);
  441.          var2.pData = 0;
  442.          killer.addAppletThread(var5);
  443.          if (this.appletFrames.isEmpty()) {
  444.             if (debug >= 9) {
  445.                System.err.println("#   destroying context for contextID " + this.contextID);
  446.             }
  447.  
  448.             var3 = this.destroy();
  449.          }
  450.  
  451.       }
  452.    }
  453.  
  454.    synchronized void iconifyApplets() {
  455.       if (!this.bIcon) {
  456.          this.bIcon = true;
  457.          if (debug >= 6) {
  458.             System.err.println("# Iconifying all applets: " + this.documentURL + ", contextID=" + this.contextID);
  459.          }
  460.  
  461.          int var1 = this.appletFrames.size();
  462.  
  463.          for(int var2 = 0; var2 < var1; ++var2) {
  464.             DerivedAppletFrame var3 = (DerivedAppletFrame)this.appletFrames.elementAt(var2);
  465.             if (debug >= 7) {
  466.                System.err.println("#     iconifyApplets: stopping appletID " + var3.pData);
  467.             }
  468.  
  469.             var3.sendEvent(new AppletEvent(4));
  470.          }
  471.  
  472.       }
  473.    }
  474.  
  475.    synchronized void uniconifyApplets() {
  476.       if (this.bIcon) {
  477.          this.bIcon = false;
  478.          if (debug >= 6) {
  479.             System.err.println("# Uniconifying all applets: " + this.documentURL + ", contextID=" + this.contextID);
  480.          }
  481.  
  482.          int var1 = this.appletFrames.size();
  483.  
  484.          for(int var2 = 0; var2 < var1; ++var2) {
  485.             DerivedAppletFrame var3 = (DerivedAppletFrame)this.appletFrames.elementAt(var2);
  486.             if (debug >= 7) {
  487.                System.err.println("#     uniconifyApplets: starting appletID " + var3.pData);
  488.             }
  489.  
  490.             var3.sendEvent(new AppletEvent(3));
  491.          }
  492.  
  493.       }
  494.    }
  495.  
  496.    synchronized Object reflectApplet(int var1) {
  497.       if (debug >= 7) {
  498.          System.err.println("#   reflectApplet: appletID=" + var1);
  499.       }
  500.  
  501.       DerivedAppletFrame var2 = this.getAppletFrame(new Integer(var1));
  502.       return var2 == null ? null : var2.applet;
  503.    }
  504.  
  505.    synchronized void destroyApplets() {
  506.       if (debug >= 6) {
  507.          System.err.println("# Destroying all applets: " + this.documentURL + ", contextID=" + this.contextID);
  508.       }
  509.  
  510.       this.frameMWContext = 0;
  511.       int var1 = this.appletFrames.size();
  512.  
  513.       for(int var2 = var1 - 1; var2 >= 0; --var2) {
  514.          Integer var3 = (Integer)this.appletFrames.keyAt(var2);
  515.          this.destroyApplet(var3);
  516.       }
  517.  
  518.    }
  519.  
  520.    static void init() {
  521.       if (!javaOneTimeInitDone) {
  522.          SecurityManager.enablePrivilege("UniversalSetFactory");
  523.          URL.setURLStreamHandlerFactory(new URLStreamHandlerFactory());
  524.          AppletSecurity.setPrivilegeManager(new PrivilegeManager());
  525.       }
  526.  
  527.       console = new Console();
  528.  
  529.       try {
  530.          SecurityManager.enablePrivilege("UniversalPropertyWrite");
  531.          System.setProperties(new AppletProperties());
  532.       } catch (SecurityException var0) {
  533.       }
  534.  
  535.       appletContexts = new Mapping();
  536.       killer = new AppletThreadKiller();
  537.       if (!javaOneTimeInitDone) {
  538.          System.setSecurityManager(new AppletSecurity());
  539.          javaOneTimeInitDone = true;
  540.       }
  541.  
  542.       javaInitialized = true;
  543.    }
  544.  
  545.    static boolean shutdown() {
  546.       javaInitialized = false;
  547.       destroyAll();
  548.       Task.destroyAll();
  549.       boolean var0 = killer.shutdown();
  550.       killer = null;
  551.       appletContexts = null;
  552.       return var0;
  553.    }
  554.  
  555.    static void setConsoleState(int var0) {
  556.       setConsoleState0(var0);
  557.    }
  558.  
  559.    static native void setConsoleState0(int var0);
  560.  
  561.    static void showConsole() {
  562.       console.show();
  563.    }
  564.  
  565.    static void hideConsole() {
  566.       console.hide();
  567.    }
  568.  
  569.    static int trimApplets(int var0, boolean var1) {
  570.       int var2 = trimApplets1(var0, true);
  571.       if (var2 < var0 && !var1) {
  572.          var2 += trimApplets1(var0 - var2, false);
  573.       }
  574.  
  575.       return var2;
  576.    }
  577.  
  578.    static int trimApplets1(int var0, boolean var1) {
  579.       int var2;
  580.       for(var2 = 0; var0-- > 0; ++var2) {
  581.          long var3 = -1L;
  582.          DerivedAppletFrame var5 = null;
  583.          MozillaAppletContext var6 = null;
  584.          int var7 = appletContexts.size();
  585.  
  586.          for(int var8 = 0; var8 < var7; ++var8) {
  587.             MozillaAppletContext var9 = (MozillaAppletContext)appletContexts.elementAt(var8);
  588.             int var10 = var9.appletFrames.size();
  589.  
  590.             for(int var11 = 0; var11 < var10; ++var11) {
  591.                DerivedAppletFrame var12 = (DerivedAppletFrame)var9.appletFrames.elementAt(var11);
  592.                if ((!var1 || var12.inHistory) && (var3 == -1L || var12.timestamp < var3)) {
  593.                   var3 = var12.timestamp;
  594.                   var5 = var12;
  595.                   var6 = var9;
  596.                }
  597.             }
  598.          }
  599.  
  600.          if (var5 == null) {
  601.             if (noisyTrimming && debug >= 4) {
  602.                System.err.println("# No stopped applets to prune.");
  603.             }
  604.  
  605.             return var2;
  606.          }
  607.  
  608.          try {
  609.             if (noisyTrimming) {
  610.                Applet var15 = var5.applet;
  611.                String var16 = null;
  612.                if (var15 != null) {
  613.                   var16 = var15.getParameter("name");
  614.                }
  615.  
  616.                if (var16 == null) {
  617.                   var16 = var15.getClass().getName().toString();
  618.                }
  619.  
  620.                System.err.println("# Pruning applet " + var16 + " from " + var6.documentURL + " to save memory.");
  621.                if (debug >= 7) {
  622.                   System.err.println("#   Pruning appletID=" + var5.pData + " contextID=" + var6.contextID + " applet=" + var5.applet);
  623.                }
  624.             }
  625.          } catch (Throwable var14) {
  626.          }
  627.  
  628.          try {
  629.             var6.destroyApplet(var5.appletID);
  630.          } catch (Throwable var13) {
  631.          }
  632.       }
  633.  
  634.       return var2;
  635.    }
  636.  
  637.    static void trimApplets() {
  638.       trimApplets(totalApplets - trimThreshold, true);
  639.    }
  640.  
  641.    static MozillaAppletContext getAppletContext(int var0) {
  642.       Integer var1 = new Integer(var0);
  643.       MozillaAppletContext var2 = (MozillaAppletContext)appletContexts.get(var1);
  644.       if (var2 == null && debug >= 9) {
  645.          System.err.println("# Warning: applet context not found for contextID " + var0);
  646.       }
  647.  
  648.       return var2;
  649.    }
  650.  
  651.    static MozillaAppletContext ensureAppletContext(int var0, int var1, String var2) {
  652.       Integer var3 = new Integer(var1);
  653.       MozillaAppletContext var4 = (MozillaAppletContext)appletContexts.get(var3);
  654.       if (var4 == null) {
  655.          var4 = new MozillaAppletContext(var0, var3, var2);
  656.          appletContexts.put(var3, var4);
  657.       }
  658.  
  659.       return var4;
  660.    }
  661.  
  662.    static void initApplet(int var0, int var1, int var2, int var3, String[] var4, boolean var5) {
  663.       if (javaInitialized) {
  664.          Hashtable var6 = new Hashtable();
  665.  
  666.          for(int var7 = 1; var7 < var4.length; ++var7) {
  667.             String var8 = var4[var7];
  668.             int var9 = var8.indexOf(61);
  669.             if (var9 >= 0) {
  670.                var6.put(var8.substring(0, var9).toLowerCase(), var8.substring(var9 + 1));
  671.             }
  672.          }
  673.  
  674.          String var11 = (String)var6.get("debug");
  675.          if (var11 != null) {
  676.             try {
  677.                debug = Integer.parseInt(var11);
  678.             } catch (Exception var10) {
  679.             }
  680.          }
  681.  
  682.          if (debug >= 7) {
  683.             System.err.println("# initApplet: contextID=" + var2 + " appletID=" + var3 + " parentContext=" + var0 + " frameContext=" + var1);
  684.          }
  685.  
  686.          trimApplets();
  687.          MozillaAppletContext var12 = ensureAppletContext(var1, var2, var4[0]);
  688.          var12.frameMWContext = var1;
  689.          var12.initApplet(var3, var4[0], var6, var5);
  690.       }
  691.    }
  692.  
  693.    static void startApplet(int var0, int var1, int var2) {
  694.       if (javaInitialized) {
  695.          if (debug >= 7) {
  696.             System.err.println("# startApplet: contextID=" + var0 + " appletID=" + var1 + " newFrameMWContext=" + var2);
  697.          }
  698.  
  699.          MozillaAppletContext var3 = getAppletContext(var0);
  700.          if (var3 != null) {
  701.             var3.frameMWContext = var2;
  702.             var3.startApplet(var1);
  703.          }
  704.       }
  705.    }
  706.  
  707.    static void resizeApplet(int var0, int var1, int var2, int var3, int var4, int var5) {
  708.       if (javaInitialized) {
  709.          if (debug >= 7) {
  710.             System.err.println("# resizeApplet: contextID=" + var0 + " appletID=" + var1);
  711.          }
  712.  
  713.          MozillaAppletContext var6 = getAppletContext(var0);
  714.          if (var6 != null) {
  715.             var6.resizeApplet(var1, var2, var3, var4, var5);
  716.          }
  717.       }
  718.    }
  719.  
  720.    static void stopApplet(int var0, int var1, int var2) {
  721.       if (javaInitialized) {
  722.          if (debug >= 7) {
  723.             System.err.println("# stopApplet: contextID=" + var0 + " appletID=" + var1 + " parentMWContext=" + var2);
  724.          }
  725.  
  726.          MozillaAppletContext var3 = getAppletContext(var0);
  727.          if (var3 != null) {
  728.             var3.frameMWContext = var2;
  729.             var3.stopApplet(var1);
  730.          }
  731.       }
  732.    }
  733.  
  734.    static void destroyApplet(int var0, int var1) {
  735.       if (javaInitialized) {
  736.          if (debug >= 7) {
  737.             System.err.println("# destroyApplet: contextID=" + var0 + " appletID=" + var1);
  738.          }
  739.  
  740.          MozillaAppletContext var2 = getAppletContext(var0);
  741.          if (var2 != null) {
  742.             var2.destroyApplet(new Integer(var1));
  743.          }
  744.       }
  745.    }
  746.  
  747.    static Object reflectApplet(int var0, int var1) {
  748.       if (!javaInitialized) {
  749.          return null;
  750.       } else {
  751.          if (debug >= 7) {
  752.             System.err.println("# reflectApplet: contextID=" + var0 + " appletID=" + var1);
  753.          }
  754.  
  755.          MozillaAppletContext var2 = getAppletContext(var0);
  756.          return var2 == null ? null : var2.reflectApplet(var1);
  757.       }
  758.    }
  759.  
  760.    static void iconifyApplets(int var0) {
  761.       if (javaInitialized) {
  762.          if (debug >= 7) {
  763.             System.err.println("# iconifyApplets: contextID=" + var0);
  764.          }
  765.  
  766.          MozillaAppletContext var1 = getAppletContext(var0);
  767.          if (var1 != null) {
  768.             var1.iconifyApplets();
  769.          }
  770.       }
  771.    }
  772.  
  773.    static void uniconifyApplets(int var0) {
  774.       if (javaInitialized) {
  775.          if (debug >= 7) {
  776.             System.err.println("# uniconifyApplets: contextID=" + var0);
  777.          }
  778.  
  779.          MozillaAppletContext var1 = getAppletContext(var0);
  780.          if (var1 != null) {
  781.             var1.uniconifyApplets();
  782.          }
  783.       }
  784.    }
  785.  
  786.    static void destroyApplets(int var0) {
  787.       if (javaInitialized) {
  788.          if (debug >= 7) {
  789.             System.err.println("# destroyApplets: contextID=" + var0);
  790.          }
  791.  
  792.          MozillaAppletContext var1 = getAppletContext(var0);
  793.          if (var1 == null) {
  794.             if (debug >= 7) {
  795.                System.out.println("# Failed to find context " + var0);
  796.             }
  797.  
  798.          } else {
  799.             var1.destroy();
  800.          }
  801.       }
  802.    }
  803.  
  804.    static void destroyAll() {
  805.       if (debug >= 7) {
  806.          System.err.println("# destroyAll");
  807.       }
  808.  
  809.       int var0 = appletContexts.size();
  810.  
  811.       for(int var1 = var0 - 1; var1 >= 0; --var1) {
  812.          MozillaAppletContext var2 = (MozillaAppletContext)appletContexts.elementAt(var1);
  813.          var2.destroy();
  814.       }
  815.  
  816.    }
  817.  
  818.    static void dumpState(PrintStream var0) {
  819.       int var1 = appletContexts.size();
  820.       boolean var2 = false;
  821.  
  822.       for(int var3 = 0; var3 < var1; ++var3) {
  823.          if (!var2) {
  824.             var0.println("# Active applets and applet contexts:");
  825.             var2 = true;
  826.          }
  827.  
  828.          MozillaAppletContext var4 = (MozillaAppletContext)appletContexts.elementAt(var3);
  829.          var4.dumpState(var0, 0);
  830.       }
  831.  
  832.       if (!var2) {
  833.          var0.println("# No active applets or applet contexts.");
  834.       }
  835.  
  836.       if (killer != null) {
  837.          killer.dumpState(var0);
  838.       }
  839.  
  840.    }
  841.  
  842.    Applet[] getContextAppletArray() {
  843.       Mapping var2 = this.appletFrames;
  844.       synchronized(var2){}
  845.  
  846.       Applet[] var1;
  847.       try {
  848.          int var4 = this.appletFrames.size();
  849.          Applet[] var5 = new Applet[var4];
  850.  
  851.          for(int var6 = var4 - 1; var6 >= 0; --var6) {
  852.             DerivedAppletFrame var7 = (DerivedAppletFrame)this.appletFrames.elementAt(var6);
  853.             var5[var6] = var7.applet;
  854.          }
  855.  
  856.          var1 = var5;
  857.       } catch (Throwable var9) {
  858.          throw var9;
  859.       }
  860.  
  861.       return var1;
  862.    }
  863.  
  864.    static Applet[] getAppletArray() {
  865.       int var0 = 0;
  866.       Mapping var2 = appletContexts;
  867.       synchronized(var2){}
  868.  
  869.       Applet[][] var1;
  870.       try {
  871.          int var4 = appletContexts.size();
  872.          var1 = new Applet[var4][];
  873.  
  874.          for(int var5 = var4 - 1; var5 >= 0; --var5) {
  875.             MozillaAppletContext var6 = (MozillaAppletContext)appletContexts.elementAt(var5);
  876.             var1[var5] = var6.getContextAppletArray();
  877.             var0 += var1[var5].length;
  878.          }
  879.       } catch (Throwable var8) {
  880.          throw var8;
  881.       }
  882.  
  883.       Applet[] var9 = new Applet[var0];
  884.       int var3 = 0;
  885.  
  886.       for(int var10 = 0; var10 < var1.length; ++var10) {
  887.          for(int var11 = 0; var11 < var1[var10].length; ++var11) {
  888.             var9[var3++] = var1[var10][var11];
  889.          }
  890.       }
  891.  
  892.       return var9;
  893.    }
  894.  
  895.    static MozillaAppletContext[] getAppletContexts() {
  896.       Mapping var1 = appletContexts;
  897.       synchronized(var1){}
  898.  
  899.       MozillaAppletContext[] var0;
  900.       try {
  901.          int var3 = appletContexts.size();
  902.          var0 = new MozillaAppletContext[var3];
  903.  
  904.          for(int var4 = var3 - 1; var4 >= 0; --var4) {
  905.             var0[var4] = (MozillaAppletContext)appletContexts.elementAt(var4);
  906.          }
  907.       } catch (Throwable var6) {
  908.          throw var6;
  909.       }
  910.  
  911.       return var0;
  912.    }
  913.  
  914.    EmbeddedAppletFrame getAppletFrame(Applet var1) {
  915.       Mapping var3 = this.appletFrames;
  916.       synchronized(var3){}
  917.  
  918.       try {
  919.          int var5 = this.appletFrames.size();
  920.  
  921.          for(int var6 = var5 - 1; var6 >= 0; --var6) {
  922.             DerivedAppletFrame var7 = (DerivedAppletFrame)this.appletFrames.elementAt(var6);
  923.             if (var7.applet == var1) {
  924.                DerivedAppletFrame var2 = var7;
  925.                return var2;
  926.             }
  927.          }
  928.  
  929.          return null;
  930.       } catch (Throwable var9) {
  931.          throw var9;
  932.       }
  933.    }
  934. }
  935.