diff --git a/ide/extbrowser/nbproject/project.xml b/ide/extbrowser/nbproject/project.xml index f537787a0a36..487c24af1d4d 100644 --- a/ide/extbrowser/nbproject/project.xml +++ b/ide/extbrowser/nbproject/project.xml @@ -124,6 +124,15 @@ 8.0 + + org.netbeans.libs.jna.platform + + + + 2 + 2.17 + + diff --git a/ide/extbrowser/src/org/netbeans/modules/extbrowser/NbDdeBrowserImpl.java b/ide/extbrowser/src/org/netbeans/modules/extbrowser/NbDdeBrowserImpl.java index 6c88131f1dd5..5d1d371d3d23 100644 --- a/ide/extbrowser/src/org/netbeans/modules/extbrowser/NbDdeBrowserImpl.java +++ b/ide/extbrowser/src/org/netbeans/modules/extbrowser/NbDdeBrowserImpl.java @@ -19,6 +19,10 @@ package org.netbeans.modules.extbrowser; +import com.sun.jna.platform.win32.Advapi32Util; +import com.sun.jna.platform.win32.WinReg; +import java.util.Locale; + import java.awt.EventQueue; import java.net.*; @@ -61,6 +65,9 @@ * here. * * @author Radim Kubacki + * + * @author James Pollard + * year: 2023 */ public class NbDdeBrowserImpl extends ExtBrowserImpl { @@ -127,6 +134,59 @@ public NbDdeBrowserImpl (ExtWebBrowser extBrowserFactory) { */ public static native String getDefaultOpenCommand() throws NbBrowserException; + /** + * Get the default browser name using Java JNA library + * @return String + */ + private static String getDefaultWindowsBrowser() { + String userChoice = Advapi32Util + .registryGetStringValue( + WinReg.HKEY_CURRENT_USER, + "SOFTWARE\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\https\\UserChoice", + "ProgId" + ) + .toUpperCase(Locale.ROOT); + + // done this way so that values like FirefoxURL-308046B0AF4A39CB can be handled + if (userChoice == null || userChoice.trim().isEmpty()) { + return ExtWebBrowser.IEXPLORE; + } + else if (userChoice.contains(ExtWebBrowser.FIREFOX)) { + return ExtWebBrowser.FIREFOX; + } + else if (userChoice.contains(ExtWebBrowser.CHROME)) { + return ExtWebBrowser.CHROME; + } else if (userChoice.contains(ExtWebBrowser.CHROMIUM)) { + return ExtWebBrowser.CHROMIUM; + } else if (userChoice.contains(ExtWebBrowser.MOZILLA)) { + return ExtWebBrowser.MOZILLA; + } else { + //may not be needed + return ExtWebBrowser.IEXPLORE; + } + } + + /** + * Retrieves the browser execution path from the registry using the java JNA library + * @param browser + * @return String + */ + private static String getDefaultWindowsOpenCommandPath(String browser) { + String executionCommand = Advapi32Util + .registryGetStringValue( + WinReg.HKEY_CLASSES_ROOT, + "Applications\\" + browser.toLowerCase() + ".exe\\shell\\open\\command", + "" + ); + + + return executionCommand; + } + + public static String getDefaultWindowsOpenCommand() { + return getDefaultWindowsOpenCommandPath(getDefaultWindowsBrowser()); + } + /** Sets current URL. * * @param url URL to show in the browser. @@ -212,7 +272,15 @@ private String realDDEServer () { } try { - String cmd = getDefaultOpenCommand (); + String cmd = getDefaultWindowsOpenCommand(); + + /** if not found with getDefaultWindowsOpenCommand function + * fallback to previous method + */ + if (cmd == null || cmd.trim().isEmpty()) { + cmd = getDefaultOpenCommand(); + } + if (cmd != null) { cmd = cmd.toUpperCase(); if (cmd.contains(ExtWebBrowser.IEXPLORE)) { diff --git a/ide/extbrowser/test/unit/src/org/netbeans/modules/extbrowser/NbDdeBrowserImplTest.java b/ide/extbrowser/test/unit/src/org/netbeans/modules/extbrowser/NbDdeBrowserImplTest.java index 51f81a43130c..a97a92de2723 100644 --- a/ide/extbrowser/test/unit/src/org/netbeans/modules/extbrowser/NbDdeBrowserImplTest.java +++ b/ide/extbrowser/test/unit/src/org/netbeans/modules/extbrowser/NbDdeBrowserImplTest.java @@ -30,6 +30,9 @@ /** * * @author rk109395 + * + * @author James + * year: 2023 */ public class NbDdeBrowserImplTest extends NbTestCase { @@ -52,7 +55,15 @@ public void testGetBrowserPath () throws NbBrowserException { public void testGetDefaultOpenCommand () throws NbBrowserException { if (!org.openide.util.Utilities.isWindows ()) return; - getDDEBrowserImpl().getDefaultOpenCommand (); + getDDEBrowserImpl().getDefaultWindowsOpenCommand(); + + /** if not found with getDefaultWindowsOpenCommand function + * fallback to previous method + */ + if (getDDEBrowserImpl().getDefaultWindowsOpenCommand().isEmpty()) + { + getDDEBrowserImpl().getDefaultOpenCommand(); + } } /** Test of backward method, of class org.netbeans.modules.extbrowser.NbDdeBrowserImpl. */