package es.ladyr.javaxpcom.browser;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.ProgressEvent;
import org.eclipse.swt.browser.ProgressListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.mozilla.interfaces.*;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.SWTError;
public class SimpleBrowser {
public static void main(String args[]) {
final Browser browser;
Display display = new Display();
Shell shell = new Shell(display);
shell.setSize(800, 600);
shell.open();
//Initiating the browser using SWT
try {
browser = new Browser(shell, SWT.MOZILLA);
} catch (SWTError e) {
System.out.println("Could not instantiate Browser: " + e.getMessage());
return;
}
// Adapt browser size to shell size
browser.setBounds(shell.getClientArea());
// Load an URL into the web browser
browser.setUrl("http://www.google.com");
// Listens for page loading status.
browser.addProgressListener(new ProgressListener() {
public void changed(ProgressEvent event) {
}
public void completed(ProgressEvent event) {
nsIWebBrowser webBrowser = (nsIWebBrowser)browser.getWebBrowser();
nsIDOMWindow window = webBrowser.getContentDOMWindow();
nsIDOMDocument document = window.getDocument();
System.out.println(document);
}
});
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
}
4 在java代码里嵌入Firefox3
现在可以去用一下有用的例子了。首先我们在一个java程序里使用SWT来嵌入一个Mozilla浏览器。现在,我们可以使用
org.eclipse.swt.browser.Browser类来实例化:browser = new Browser(shell, SWT.MOZILLA); 在这之前,我们需要使用ATF项目
,以及一下ATF插件。非常幸运,现在我们不需要这些补丁了。
4.1 配置环境
为了在java程序里嵌入Mozilla浏览器,我们需要使用SWT来创建窗口和嵌入浏览器。
4.1.1 安装swt
下载对应操作系统的swt,加到classpath就好了
4.1.2 配置swt
运行后面例子需要的jar包:
javaxpcom.jar
MozillaInterfaces.jar
MozillaGlue.jar
swt.jar
src.zip
4.2 Web Browser例子
接下来,我们将增加一下SWT widgets来实现通常的交换,比如输入url,前进与后退,菜单,和两种类型:
传入一个参数制定XULRunner的路径
不传入参数使用系统安装的XULRunner
package es.ladyr.javaxpcom.browser;
import java.io.IOException;
import java.io.InputStream;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.ProgressEvent;
import org.eclipse.swt.browser.ProgressListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
public class LadyrBrowser {
private static final int WIDTH = 800;
private static final int HEIGHT = 600;
Browser browser;
private Combo uriCombo;
private final ToolItem backItem;
private final ToolItem forwardItem;
/**
*
* @param xulrunnerPath if you have a XULRunner valid version in your system, but not
* installed, you can use that version to run the browser. This param must contain
* its path, or null in other case.
*/
public LadyrBrowser(String xulrunnerPath) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setSize(WIDTH, HEIGHT);
GridLayout gridLayout = new GridLayout(1, true);
shell.setLayout(gridLayout);
// Set the menu bar
// create the menu
Menu menuBar = new Menu(shell, SWT.BAR);
// create a file menu and add an exit item
final MenuItem file = new MenuItem(menuBar, SWT.CASCADE);
file.setText("&File");
final Menu filemenu = new Menu(shell, SWT.DROP_DOWN);
file.setMenu(filemenu);
final MenuItem exitMenuItem = new MenuItem(filemenu, SWT.PUSH);
exitMenuItem.setText("&Exit/tCTRL+E");
exitMenuItem.setAccelerator(SWT.CTRL + 'E');
exitMenuItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
System.exit(0);
}
});
// create a Help menu and add an about item
final MenuItem helpMenuItem = new MenuItem(menuBar, SWT.CASCADE);
helpMenuItem.setText("&Help");
final Menu helpmenu = new Menu(shell, SWT.DROP_DOWN);
helpMenuItem.setMenu(helpmenu);
final MenuItem aboutMenuItem = new MenuItem(helpmenu, SWT.PUSH);
aboutMenuItem.setText("&About");
shell.setMenuBar(menuBar);
// Set the toolbar
ToolBar toolbar = new ToolBar(shell, SWT.FLAT);
backItem = new ToolItem(toolbar, SWT.PUSH);
backItem.setImage(getImage("resources/back.png"));
backItem.setEnabled(false);
forwardItem = new ToolItem(toolbar, SWT.PUSH);
forwardItem.setImage(getImage("resources/forward.png"));
forwardItem.setEnabled(false);
backItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
if (browser.isBackEnabled()) {
browser.back();
}
}
});
forwardItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
if (browser.isForwardEnabled()) {
browser.forward();
}
}
});
final ToolItem refreshItem = new ToolItem(toolbar, SWT.PUSH);
refreshItem.setImage(getImage("resources/refresh.png"));
refreshItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
browser.refresh();
}
});
final ToolItem stopItem = new ToolItem(toolbar, SWT.PUSH);
stopItem.setImage(getImage("resources/stop.png"));
stopItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
browser.stop();
}
});
uriCombo = new Combo(toolbar, SWT.NONE);
uriCombo.setItems(new String[] { "www.ladyr.com", "www.urjc.es",
"www.mozilla.org" });
uriCombo.setText("http://www.google.es");
uriCombo.setBounds(0, 0, 3 * (WIDTH / 4), 0);
uriCombo.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
Combo c = (Combo) e.widget;
browser.setUrl(c.getText());
System.out.println(c.getText());
}
public void widgetDefaultSelected(SelectionEvent e) {
Combo c = (Combo) e.widget;
browser.setUrl(c.getText());
System.out.println(c.getText());
}
});
final ToolItem uriComboItem = new ToolItem(toolbar, SWT.SEPARATOR);
uriComboItem.setWidth(uriCombo.getSize().x);
uriComboItem.setControl(uriCombo);
final ToolItem goItem = new ToolItem(toolbar, SWT.PUSH);
goItem.setImage(getImage("resources/go.png"));
goItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
browser.setUrl(uriCombo.getText());
}
});
GridData data = new GridData();
data.horizontalAlignment = SWT.FILL;
toolbar.setLayoutData(data);
toolbar.pack();
// Set the page visualization area
Canvas canvas = new Canvas(shell, SWT.BORDER);
data = new GridData();
// Set the same dimensions than shell, after we will call pack method
// to fit the canvas size to the shell size.
data.horizontalAlignment = SWT.FILL;
data.verticalAlignment = SWT.FILL;
data.widthHint = WIDTH;
data.heightHint = HEIGHT;
canvas.setLayoutData(data);
shell.pack();
shell.open();
// Browser code
initMozillaBrowser(uriCombo.getText(), canvas, xulrunnerPath);
// End of browser code
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
/**
*
* @param uri
* @param canvas
* @param xulrunnerPath if you have a XULRunner valid version in your system, but not
* installed, you can use that version to run the browser. This param must contain
* its path, or null in other case.
*/
private void initMozillaBrowser(String uri, Canvas canvas,
String xulrunnerPath) {
browser = new Browser(canvas, SWT.MOZILLA);
//nsIWebBrowser webBrowser = (nsIWebBrowser)browser.getWebBrowser();
browser.setBounds(canvas.getClientArea());
browser.setUrl(uri);
browser.addProgressListener(new ProgressListener() {
public void changed(ProgressEvent event) {
uriCombo.setText(browser.getUrl());
updateToolItemsState();
}
public void completed(ProgressEvent event) {
updateToolItemsState();
}
});
}
private Image getImage(String path) {
InputStream sourceStream = this.getClass().getResourceAsStream(path);
ImageData source = new ImageData(sourceStream);
Image image = new Image(null, source);
try {
sourceStream.close();
} catch (IOException e) {
e.printStackTrace();
}
return image;
}
private void updateToolItemsState() {
if (!backItem.isEnabled() && browser.isBackEnabled()) {
backItem.setEnabled(true);
} else if (backItem.isEnabled() && !browser.isBackEnabled()) {
backItem.setEnabled(false);
}
if (!forwardItem.isEnabled() && browser.isForwardEnabled()) {
forwardItem.setEnabled(true);
} else if (forwardItem.isEnabled() && !browser.isForwardEnabled()) {
forwardItem.setEnabled(false);
}
}
public static void main(String[] args) {
if (args.length > 0) {
new LadyrBrowser(args[0]);
} else {
new LadyrBrowser(null);
}
}
}
5. 在浏览器里访问JavaXPCOM
这一节里我们将讨论一下通过WebBrowser访问的功能。比如,改变浏览器的属性或者观察浏览器请求与响应。
首先我们改变用户的preferences
注:我只列出增加的部分代码。
public class SimpleBrowserWithPrefs {
// Obtain preferences service
String contractID = "@mozilla.org/preferences-service;1";
nsIPrefService prefService = (nsIPrefService) serviceManager
.getServiceByContractID(contractID,
nsIPrefService.NS_IPREFSERVICE_IID);
// Get a branch to access to the entire preference tree
nsIPrefBranch branch = prefService.getBranch("");
// Set some preferences
// Warn before submitting a form to an insecure area ? -> False
branch.setBoolPref("security.warn_submit_insecure", 0);
// Select direction of text:
// 1 : Left-to-right
// 2 : Right-to-left
branch.setIntPref("bidi.direction", 2);
// Allow current document to specify colors to use?
// (If false, background images will also not be loaded)
branch.setBoolPref("browser.display.use_document_colors", 0);
}
另外一下Service也能被使用。我们已经可以改变Mozilla的属性来改变浏览器的行为,但是通过利用Service我们可以完成更有用的
任务。在下面的例子里我们将观察浏览器的请求和响应。在XPCOM里存在一个接口叫nsIObserver,它运行观察一个topic相关的event
,只要它被添加到observer Service里了。添加的方法是使用 void nsIObserverService.addObserver(nsIObserver anObserver,
String aTopic, boolean ownsWeak) 这个方法对一个特定的topic注册一个listener。anObserver是用来接受通知的一个接口,
aTopic是通知的topic,ownsWeak当nsIObserverService hold anObserver的一个strong的引用时设为false,否则设置为true。因此
,为了创建一个observer,我们必需实现nsIObserver接口,这个接口包含了一个方法 public void observe(nsISupports
aSubject, String aTopic, String aData)。
下面的例子的4个步骤:
1,获得Service Manager
2,获得Observer Service
3,创建一个简单的HTTP observer
4,把这个observer添加到监听请求和响应的Service里