]> granicus.if.org Git - python/commitdiff
Issue #8232: webbrowser support incomplete on Windows. Patch by Brandon Milam
authorSteve Dower <steve.dower@microsoft.com>
Mon, 8 Jun 2015 04:35:39 +0000 (21:35 -0700)
committerSteve Dower <steve.dower@microsoft.com>
Mon, 8 Jun 2015 04:35:39 +0000 (21:35 -0700)
Lib/webbrowser.py
Misc/NEWS

index 845f1d004c0b48d4b86d9fec57becc6cf18d3497..5a356587c005800c1dde5d56b71eb90a43377fa6 100755 (executable)
@@ -495,10 +495,23 @@ if os.environ.get("TERM"):
 #
 
 if sys.platform[:3] == "win":
+
     class WindowsDefault(BaseBrowser):
+        # Windows Default opening arguments.
+
+        cmd = "start"
+        newwindow = ""
+        newtab = ""
+
         def open(self, url, new=0, autoraise=True):
+            # Format the command for optional arguments and add the url.
+            if new == 1:
+                self.cmd += " " + self.newwindow
+            elif new == 2:
+                self.cmd += " " + self.newtab
+            self.cmd += " " + url
             try:
-                os.startfile(url)
+                subprocess.call(self.cmd, shell=True)
             except OSError:
                 # [Error 22] No application is associated with the specified
                 # file for this operation: '<URL>'
@@ -506,19 +519,108 @@ if sys.platform[:3] == "win":
             else:
                 return True
 
+
+    # Windows Sub-Classes for commonly used browsers.
+
+    class InternetExplorer(WindowsDefault):
+        """Launcher class for Internet Explorer browser"""
+
+        cmd = "start iexplore.exe"
+        newwindow = ""
+        newtab = ""
+
+
+    class WinChrome(WindowsDefault):
+        """Launcher class for windows specific Google Chrome browser"""
+
+        cmd = "start chrome.exe"
+        newwindow = "-new-window"
+        newtab = "-new-tab"
+
+
+    class WinFireFox(WindowsDefault):
+        """Launcher class for windows specific Firefox browser"""
+
+        cmd = "start firefox.exe"
+        newwindow = "-new-window"
+        newtab = "-new-tab"
+
+
+    class WinOpera(WindowsDefault):
+        """Launcher class for windows specific Opera browser"""
+
+        cmd = "start opera"
+        newwindow = ""
+        newtab = ""
+
+
+    class WinSeaMonkey(WindowsDefault):
+        """Launcher class for windows specific SeaMonkey browser"""
+
+        cmd = "start seamonkey"
+        newwinow = ""
+        newtab = ""
+
+
     _tryorder = []
     _browsers = {}
 
-    # First try to use the default Windows browser
+    # First try to use the default Windows browser.
     register("windows-default", WindowsDefault)
 
-    # Detect some common Windows browsers, fallback to IE
-    iexplore = os.path.join(os.environ.get("PROGRAMFILES", "C:\\Program Files"),
-                            "Internet Explorer\\IEXPLORE.EXE")
-    for browser in ("firefox", "firebird", "seamonkey", "mozilla",
-                    "netscape", "opera", iexplore):
-        if shutil.which(browser):
-            register(browser, None, BackgroundBrowser(browser))
+    def find_windows_browsers():
+        """ Access the windows registry to determine
+        what browsers are on the system.
+        """
+
+        import winreg
+        HKLM = winreg.HKEY_LOCAL_MACHINE
+        subkey = r'Software\Clients\StartMenuInternet'
+        read32 = winreg.KEY_READ | winreg.KEY_WOW64_32KEY
+        read64 = winreg.KEY_READ | winreg.KEY_WOW64_64KEY
+        key32 = winreg.OpenKey(HKLM, subkey, access=read32)
+        key64 = winreg.OpenKey(HKLM, subkey, access=read64)
+
+        # Return a list of browsers found in the registry
+        # Check if there are any different browsers in the
+        # 32 bit location instead of the 64 bit location.
+        browsers = []
+        i = 0
+        while True:
+            try:
+                browsers.append(winreg.EnumKey(key32, i))
+            except EnvironmentError:
+                break
+            i += 1
+
+        i = 0
+        while True:
+            try:
+                browsers.append(winreg.EnumKey(key64, i))
+            except EnvironmentError:
+                break
+            i += 1
+
+        winreg.CloseKey(key32)
+        winreg.CloseKey(key64)
+
+        return browsers
+
+    # Detect some common windows browsers
+    for browser in find_windows_browsers():
+        browser = browser.lower()
+        if "iexplore" in browser:
+            register("iexplore", None, InternetExplorer("iexplore"))
+        elif "chrome" in browser:
+            register("chrome", None, WinChrome("chrome"))
+        elif "firefox" in browser:
+            register("firefox", None, WinFireFox("firefox"))
+        elif "opera" in browser:
+            register("opera", None, WinOpera("opera"))
+        elif "seamonkey" in browser:
+            register("seamonkey", None, WinSeaMonkey("seamonkey"))
+        else:
+            register(browser, None, WindowsDefault(browser))
 
 #
 # Platform support for MacOS
index 5dea7f3605669fbe994c392559b2eb3252fbf2d9..03b8631a4a26c50ea062e64bbad461f56889bce8 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -15,6 +15,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #8232: webbrowser support incomplete on Windows. Patch by Brandon
+  Milam
+
 - Issue #24347: Set KeyError if PyDict_GetItemWithError returns NULL.
 
 - Issue #24348: Drop superfluous incref/decref.