对于我的 Eclipse 插件,我想跟踪使用内部(如果可能还有外部)Eclipse 浏览器打开的每个 URL。
到目前为止,我使用
org.eclipse.swt.browser.Browser;
和
addLocationListener(...)
但我更希望它也适用于内部 Eclipse 浏览器。我怎样才能做到这一点?
对于我的 Eclipse 插件,我想跟踪使用内部(如果可能还有外部)Eclipse 浏览器打开的每个 URL。
到目前为止,我使用
org.eclipse.swt.browser.Browser;
和
addLocationListener(...)
但我更希望它也适用于内部 Eclipse 浏览器。我怎样才能做到这一点?
Eclipse 内部浏览器的一种可能解决方案是创建一个注册 IStartup 扩展的 Eclipse 插件。在您的 earlyStartup() 方法中,您将在 workbenchPage 上注册一个 IPartListener。然后在创建内部浏览器部件时,您将收到一个回调,其中包含对 WebBrowserEditor(或 WebBrowserView)的引用。由于没有直接的 API,您将不得不稍微修改一下并使用反射来获取内部 SWT 浏览器实例。一旦你有了它,你可以添加你的位置监听器。
有时在早期启动期间还没有活动的 Workbench 窗口,因此您必须遍历所有现有的 Workbench 窗口(通常只有一个)及其每个 Workbench 页面以添加部分侦听器。
这是 earlyStartup() 例程的代码片段。请注意,我在处理窗口/页面期间省略了任何侦听器的清理,因此仍然需要完成。
//Add this code to an IStartup.earlyStartup() method
final IPartListener partListener = new IPartListener() {
@Override
public void partOpened(IWorkbenchPart part) {
if (part instanceof WebBrowserEditor)
{
WebBrowserEditor editor = (WebBrowserEditor) part;
try {
Field webBrowser = editor.getClass().getDeclaredField("webBrowser");
webBrowser.setAccessible(true);
BrowserViewer viewer = (BrowserViewer)webBrowser.get(editor);
Field browser = viewer.getClass().getDeclaredField("browser");
browser.setAccessible(true);
Browser swtBrowser = (Browser) browser.get(viewer);
swtBrowser.addLocationListener(new LocationListener() {
@Override
public void changed(LocationEvent event) {
System.out.println(event.location);
}
});
} catch (Exception e) {
}
}
else if (part instanceof WebBrowserView)
{
WebBrowserView view = (WebBrowserView) part;
try {
Field webBrowser = editor.getClass().getDeclaredField("viewer");
webBrowser.setAccessible(true);
BrowserViewer viewer = (BrowserViewer)webBrowser.get(view);
Field browser = viewer.getClass().getDeclaredField("browser");
browser.setAccessible(true);
Browser swtBrowser = (Browser) browser.get(viewer);
swtBrowser.addLocationListener(new LocationListener() {
@Override
public void changed(LocationEvent event) {
System.out.println(event.location);
}
});
} catch (Exception e) {
}
}
}
...
};
final IPageListener pageListener = new IPageListener() {
@Override
public void pageOpened(IWorkbenchPage page) {
page.addPartListener(partListener);
}
...
};
final IWindowListener windowListener = new IWindowListener() {
@Override
public void windowOpened(IWorkbenchWindow window) {
window.addPageListener(pageListener);
}
...
};
IWorkbenchWindow activeWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (activeWindow != null)
{
IWorkbenchPage activePage = activeWindow.getActivePage();
if (activePage != null)
{
activePage.addPartListener(partListener);
}
else
{
activeWindow.addPageListener(pageListener);
}
}
else
{
for (IWorkbenchWindow window : PlatformUI.getWorkbench().getWorkbenchWindows())
{
for (IWorkbenchPage page : window.getPages()) {
page.addPartListener(partListener);
}
window.addPageListener(pageListener);
}
PlatformUI.getWorkbench().addWindowListener(windowListener);
}
关于此代码片段的最后一个细节是,它需要依赖 org.eclipse.ui.browser 插件才能访问 WebBrowserEditor 类。