私の Eclipse プラグインでは、内部 (および可能であれば外部) Eclipse ブラウザーで開かれるすべての URL を追跡したいと考えています。
これまでのところ私は使用しています
org.eclipse.swt.browser.Browser;
と
addLocationListener(...)
しかし、内部の Eclipse ブラウザーでも機能することを望みます。どうすればそれを達成できますか?
私の Eclipse プラグインでは、内部 (および可能であれば外部) Eclipse ブラウザーで開かれるすべての URL を追跡したいと考えています。
これまでのところ私は使用しています
org.eclipse.swt.browser.Browser;
と
addLocationListener(...)
しかし、内部の Eclipse ブラウザーでも機能することを望みます。どうすればそれを達成できますか?
Eclipse 内部ブラウザーの考えられる解決策の 1 つは、IStartup 拡張機能を登録する Eclipse プラグインを作成することです。EarlyStartup() メソッドで、workbenchPage に IPartListener を登録します。次に、内部ブラウザー パーツが作成されると、WebBrowserEditor (または WebBrowserView) への参照を含むコールバックを受け取ります。直接的な API がないため、少しハックし、リフレクションを使用して内部 SWT ブラウザー インスタンスを取得する必要があります。それができたら、ロケーションリスナーを追加できます。
初期の起動時にアクティブなワークベンチ ウィンドウがまだない場合があるため、既存のすべてのワークベンチ ウィンドウ (通常は 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 プラグインに依存する必要があることです。