blob: 0a5ef7ce73ed57684bed1b83348aac0495ddad0b [file] [log] [blame]
/*******************************************************************************
* 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();
}
}
}
}