私のeclipseプラグインでは、内部(および可能であれば外部の)Eclipseブラウザで開かれたすべてのURLをトラッキングしたいと思います。内部Eclipseブラウザにフックする方法は?
これまでのところ私は
org.eclipse.swt.browser.Browser;
と
addLocationListener(...)
を使用しかし、私はそれが内部Eclipseのブラウザのためにも機能することを好むだろう。それをどうすれば実現できますか?
私のeclipseプラグインでは、内部(および可能であれば外部の)Eclipseブラウザで開かれたすべてのURLをトラッキングしたいと思います。内部Eclipseブラウザにフックする方法は?
これまでのところ私は
org.eclipse.swt.browser.Browser;
と
addLocationListener(...)
を使用しかし、私はそれが内部Eclipseのブラウザのためにも機能することを好むだろう。それをどうすれば実現できますか?
Eclipse内部ブラウザの1つの解決策は、IStartup拡張機能を登録するEclipseプラグインを作成することです。 earlyStartup()メソッドでは、workbenchPageにIPartListenerを登録します。次に、内部ブラウザ部分が作成されると、WebBrowserEditor(またはWebBrowserView)への参照を含むコールバックを受け取ります。直接的なAPIがないので、内部のSWT Browserインスタンスを取得するためにちょっとハックしてリフレクションを使用する必要があります。これを済ませたら、ロケーションリスナーを追加することができます。
起動時にアクティブなWorkbenchウィンドウがまだ存在しないため、既存のすべてのワークベンチウィンドウ(通常は1つ)とそれぞれのワークベンチページをループしてパーツリスナーを追加する必要があります。
ここに、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);
}
一つの細部は、それがWebBrowserEditorクラスへのアクセス権を持っているorg.eclipse.ui.browserプラグインへの依存性を必要とすることです。
ありがとう、それは素晴らしいとそれは大丈夫に見えます。私には1つの問題があります。開いている部分はWebBrowserEditorではなくWebBrowserViewです。 – RoflcoptrException
私は自分で問題を解決することができました.WebBrowserViewにはビューアと呼ばれるフィールドがあり、Reflection呼び出しで使用できます。あなたはあなたの答えにそれを加えたいかもしれません http://www.cct.lsu.edu/~rguidry/ecl31docs/api/org/eclipse/ui/internal/browser/WebBrowserView.html – RoflcoptrException
ありがとう、私は追加します答えにWebBrowserViewのケース。 – gamerson