From 8bcb2b0e7447152fa817f94e3391d1bd27d96c26 Mon Sep 17 00:00:00 2001 From: James Pollard Date: Thu, 26 Oct 2023 14:11:41 +1100 Subject: [PATCH] Add JNA code to retrieve default browser from Windows registry update testGetDefaultOpenCommand to use new JNA based method update testGetDefaultOpenCommand to use new JNA based method update testGetDefaultOpenCommand to use new JNA based method Add JNA code to retrieve default browser from Windows registry add JNA dependency Add JNA code to retrieve default browser from Windows registry correct ID10t errors made by me Add JNA code to retrieve default browser from Windows registry fix syntax errors fix errors Add JNA code to retrieve default browser from Windows registry --- ide/extbrowser/nbproject/project.xml | 9 +++ .../modules/extbrowser/NbDdeBrowserImpl.java | 70 ++++++++++++++++++- .../extbrowser/NbDdeBrowserImplTest.java | 13 +++- 3 files changed, 90 insertions(+), 2 deletions(-) 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. */