Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: dfa1d40876a163c5ada16695b236ad9cbdb3f4eb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*******************************************************************************
 * Copyright (c) 2018 Red Hat and others. All rights reserved.
 * The contents of this file are made available under the terms
 * of the GNU Lesser General Public License (LGPL) Version 2.1 that
 * accompanies this distribution (lgpl-v21.txt).  The LGPL is also
 * available at http://www.gnu.org/licenses/lgpl.html.  If the version
 * of the LGPL at http://www.gnu.org is different to the version of
 * the LGPL accompanying this distribution and there is any conflict
 * between the two license versions, the terms of the LGPL accompanying
 * this distribution shall govern.
 *
 * Contributors:
 *     Red Hat - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.tests.gtk.snippets;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Container;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.DeviceData;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/*
 * Title: Bug 221240 - SWT_AWT bridge crashes JVM on Linux (X error BadWindow)
 * How to run: launch snippet
 * Bug description: The JVM crashes
 * Expected results: The JVM should not crash
 * GTK Version(s): N/A
 */
public class Bug221240_AWTJVMCrash extends JFrame {

	private static final long serialVersionUID = -248424300520098295L;

protected static final String LS = System.getProperty("line.separator");

  public Bug221240_AWTJVMCrash() {
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    Canvas canvas = new Canvas() {

    private static final long serialVersionUID = -4380477744500979114L;

	@Override
      public void addNotify() {
        super.addNotify();
        final Canvas canvas_ = this;
        display.asyncExec(() -> {
            final Shell shell = SWT_AWT.new_Shell(display, canvas_);
            shell.setLayout(new FillLayout());
            Browser browser = new Browser(shell, SWT.NONE);
            browser.setText(
                "<html>" + LS +
                "  <head>" + LS +
                "    <script language=\"JavaScript\" type=\"widget.text/javascript\">" + LS +
                "      <!--" + LS +
                "      function getEmbeddedObject() {" + LS +
                "        var movieName = \"myEmbeddedObject\";" + LS +
                "        if(window.document[movieName]) {" + LS +
                "          return window.document[movieName];" + LS +
                "        }" + LS +
                "        if(navigator.appName.indexOf(\"Microsoft Internet\") == -1) {" + LS +
                "          if(document.embeds && document.embeds[movieName]) {" + LS +
                "            return document.embeds[movieName];" + LS +
                "          }" + LS +
                "        } else {" + LS +
                "          return document.getElementById(movieName);" + LS +
                "        }" + LS +
                "      }" + LS +
                "      //-->" + LS +
                "    </script>" + LS +
                "    <style type=\"widget.text/css\">" + LS +
                "      html, object, embed, div, body, widget.table { width: 100%; height: 100%; min-height: 100%; margin: 0; padding: 0; overflow: hidden; background-graphics.color: #FFFFFF; widget.text-align: center; }" + LS +
                "      object, embed, div { position: absolute; left:0; top:0;}" + LS +
                "      td { vertical-align: middle; }" + LS +
                "    </style>" + LS +
                "  </head>" + LS +
                "  <body height=\"*\">" + LS +
                "    <script language=\"JavaScript\" type=\"widget.text/javascript\">" + LS +
                "      <!--" + LS +
                getVLCPlayer() +
                "        var embeddedObject = getEmbeddedObject();" + LS +
                "        embeddedObject.style.width = '100%';" + LS +
                "        embeddedObject.style.height = '100%';" + LS +
                "      //-->" + LS +
                "    </script>" + LS +
                "  </body>" + LS +
                "</html>" + LS);
            // The initial size is wrong so we have to force it
            shell.setSize(canvas_.getWidth(), canvas_.getHeight());
          });
      }
    };
    Container contentPane = getContentPane();
    JButton swingButton = new JButton("Open a file chooser!");
    swingButton.addActionListener(e -> new JFileChooser().showOpenDialog(Bug221240_AWTJVMCrash.this));
    contentPane.add(swingButton, BorderLayout.NORTH);
    contentPane.add(canvas, BorderLayout.CENTER);
    setSize(800, 600);
  }

  private String getVLCPlayer() {
//    String escapedURL = "http://80.118.196.219/webtv-asx.cgi?channel=nrj_hits";
//    String escapedURL = "http://media.xored.com/eclipsecon2007/dltk-javascript-jdt.mov";
    String escapedURL = url != null ? url: "http://flv.thruhere.net/presentations/java-comes-home-customer-haase.flv";
    return
    "window.document.write('<object classid=\"clsid:E23FE9C6-778E-49D4-B537-38FCDE4887D8\" id=\"myEmbeddedObject\" codebase=\"http://downloads.videolan.org/pub/videolan/vlc/latest/win32/axvlc.cab\" events=\"true\">');" + LS +
    "window.document.write('  <param name=\"Src\" value=\"' + decodeURIComponent('" + escapedURL + "') + '\";\"/>');" + LS +
    "window.document.write('  <embed name=\"myEmbeddedObject\" target=\"" + escapedURL + "\" type=\"application/x-vlc-plugin\" pluginspage=\"http://www.videolan.org\">');" + LS +
    "window.document.write('  </embed>');" + LS +
    "window.document.write('</object>');" + LS;
  }

//  private String getFlashPlayer() {
//    String escapedURL = "http://www.freedominteractivedesign.com/swf/main.swf";
//    return
//    "window.document.write('<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" id=\"myEmbeddedObject\" codebase=\"http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0\" events=\"true\">');" + LS +
//    "window.document.write('  <param name=\"movie\" value=\"' + decodeURIComponent('" + escapedURL + "') + '\";\"/>');" + LS +
//    "window.document.write('  <embed name=\"myEmbeddedObject\" src=\"" + escapedURL + "\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.adobe.com/go/getflashplayer\">');" + LS +
//    "window.document.write('  </embed>');" + LS +
//    "window.document.write('</object>');" + LS;
//  }

  private static Display display;

  private static String url;

  public static void main(String[] args) {
    DeviceData data = new DeviceData();
    data.debug = true;
    display = new Display(data);
    Device.DEBUG = true;
    if(args.length > 0) {
      url = args[0];
    }
    System.setProperty("sun.awt.xembedserver", "true");
    SwingUtilities.invokeLater(() -> new Bug221240_AWTJVMCrash().setVisible(true));
    while(true) {
      if(!display.readAndDispatch()) {
        display.sleep();
      }
    }
  }

}

Back to the top