1

对于我的 Eclipse 插件,我想跟踪使用内部(如果可能还有外部)Eclipse 浏览器打开的每个 URL。

到目前为止,我使用

org.eclipse.swt.browser.Browser;

addLocationListener(...)

但我更希望它也适用于内部 Eclipse 浏览器。我怎样才能做到这一点?

4

1 回答 1

2

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 类。

于 2012-05-03T02:24:08.323 回答