/******************************************************************************* * Copyright (c) 2005, 2016 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - Initial API and implementation *******************************************************************************/ package org.eclipse.ui.internal.browser; import java.util.HashMap; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.browser.AbstractWorkbenchBrowserSupport; import org.eclipse.ui.browser.IWebBrowser; import org.eclipse.ui.browser.IWorkbenchBrowserSupport; /** * Implementation of the workbench browser support. */ public class DefaultBrowserSupport extends AbstractWorkbenchBrowserSupport { static final String SHARED_ID = "org.eclipse.ui.browser"; //$NON-NLS-1$ static final String DEFAULT_ID_BASE = "org.eclipse.ui.defaultBrowser"; //$NON-NLS-1$ private static final String HELP_BROWSER_ID = "org.eclipse.help.ui"; //$NON-NLS-1$ protected HashMap<String, Object> browserIdMap = new HashMap<>(); protected static DefaultBrowserSupport instance; public DefaultBrowserSupport() { // do nothing instance = this; // TODO I am not sure what we should do here // The preferences have changed so maybe we should close the opened // browsers in addition to clearing the table BrowserManager.getInstance().addObserver((o, arg) -> browserIdMap.clear()); } protected static DefaultBrowserSupport getInstance() { return instance; } protected IWebBrowser getExistingWebBrowser(String browserId) { try { Object obj = browserIdMap.get(browserId); IWebBrowser browser = null; if (obj instanceof IWebBrowser) browser = (IWebBrowser) obj; else if (obj instanceof HashMap) { @SuppressWarnings("rawtypes") HashMap wmap = (HashMap) obj; IWorkbenchWindow window = PlatformUI.getWorkbench() .getActiveWorkbenchWindow(); if (window != null) { browser = (IWebBrowser) wmap.get(getWindowKey(window)); } } if (browser != null) return browser; } catch (Exception e) { // ignore } return null; } private Integer getWindowKey(IWorkbenchWindow window) { return Integer.valueOf(window.hashCode()); } @Override public IWebBrowser createBrowser(int style, String browserId, String name, String tooltip) throws PartInitException { if (browserId == null) browserId = getDefaultId(); IWebBrowser browser = getExistingWebBrowser(browserId); if (browser != null) { if (browser instanceof InternalBrowserInstance) { InternalBrowserInstance instance2 = (InternalBrowserInstance) browser; instance2.setName(name); instance2.setTooltip(tooltip); } return browser; } IWebBrowser webBrowser = null; // AS_EXTERNAL will force the external browser regardless of the user // preference // The help editor will open in an editor regardless of the user preferences boolean isHelpEditor = ((style & AS_EDITOR) != 0) && HELP_BROWSER_ID.equals(browserId); if ((style & AS_EXTERNAL) != 0 || (WebBrowserPreference.getBrowserChoice() != WebBrowserPreference.INTERNAL && !isHelpEditor) || !WebBrowserUtil.canUseInternalWebBrowser()) { IBrowserDescriptor ewb = BrowserManager.getInstance() .getCurrentWebBrowser(); if (ewb == null) throw new PartInitException(Messages.errorNoBrowser); if (ewb instanceof SystemBrowserDescriptor) webBrowser = new SystemBrowserInstance(browserId); else { IBrowserExt ext = WebBrowserUIPlugin.findBrowsers(ewb.getLocation()); if (ext != null) webBrowser = ext.createBrowser(browserId, ewb.getLocation(), ewb.getParameters()); if (webBrowser == null) webBrowser = new ExternalBrowserInstance(browserId, ewb); } } else { if ((style & IWorkbenchBrowserSupport.AS_VIEW) != 0) webBrowser = new InternalBrowserViewInstance(browserId, style, name, tooltip); else webBrowser = new InternalBrowserEditorInstance(browserId, style, name, tooltip); } if (webBrowser instanceof InternalBrowserInstance) { // we should only share internal browsers within one // workbench window. Each workbench window can have // a shared browser with the same id IWorkbenchWindow window = PlatformUI.getWorkbench() .getActiveWorkbenchWindow(); Integer key = getWindowKey(window); @SuppressWarnings("unchecked") HashMap<Integer, IWebBrowser> wmap = (HashMap<Integer, IWebBrowser>) browserIdMap.get(browserId); if (wmap == null) { wmap = new HashMap<>(); browserIdMap.put(browserId, wmap); } wmap.put(key, webBrowser); } else { // external and system browsers are shared // for the entire workbench browserIdMap.put(browserId, webBrowser); } return webBrowser; } @Override public IWebBrowser createBrowser(String browserId) throws PartInitException { return createBrowser(0, browserId, null, null); } @Override public boolean isInternalWebBrowserAvailable() { return WebBrowserUtil.canUseInternalWebBrowser(); } protected void removeBrowser(IWebBrowser browser) { String baseId = WebBrowserUtil.decodeId(browser.getId()); if (browser instanceof InternalBrowserInstance) { // Remove it from the window map and // also remove the window map itself if it is empty. Integer key = ((InternalBrowserInstance) browser).getWindowKey(); Object entry = browserIdMap.get(baseId); if (entry != null && entry instanceof HashMap) { @SuppressWarnings("rawtypes") HashMap wmap = (HashMap) entry; wmap.remove(key); if (wmap.isEmpty()) browserIdMap.remove(baseId); } } else browserIdMap.remove(baseId); } private String getDefaultId() { String id = null; for (int i = 0; i < Integer.MAX_VALUE; i++) { id = DEFAULT_ID_BASE + i; if (browserIdMap.get(id) == null) break; } return id; } }