diff -r dfe62f685538 Lib/webbrowser.py --- a/Lib/webbrowser.py Wed May 27 22:00:46 2015 -0700 +++ b/Lib/webbrowser.py Thu May 28 08:23:04 2015 -0500 @@ -495,10 +495,29 @@ # if sys.platform[:3] == "win": + # Access the windows registry to later determine what browsers are on the system + import winreg, platform + 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) + 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: '' @@ -506,19 +525,60 @@ else: return True + # Windows Sub-Classes for commonly used browsers + class InternetExplorer(WindowsDefault): + cmd = "start iexplore.exe" + newwindow = "" + newtab = "" + + class WinChrome(WindowsDefault): + cmd = "start chrome.exe" + newwindow = "-new-window" + newtab = "-new-tab" + + class WinFireFox(WindowsDefault): + cmd = "start firefox.exe" + newwindow = "-new-window" + newtab = "-new-tab" + + class WinOpera(WindowsDefault): + cmd = "start opera" + newwindow = "" + newtab = "" + + class WinSeaMonkey(WindowsDefault): + cmd = "start seamonkey" + newwinow = "" + newtab = "" + _tryorder = [] _browsers = {} # 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)) + # Detect some common Windows browsers + # Check both 64 bit and 32 bit location if vista os is being used + if platform.win32_ver()[0] == "Vista": + browsers = set([winreg.EnumKey(key32,i) for i in range(winreg.QueryInfoKey(key32)[0])]) + browsers = browsers|set([winreg.EnumKey(key64,i) for i in range(winreg.QueryInfoKey(key64)[0])]) + else: + browsers = [winreg.EnumKey(key64,i) for i in range(winreg.QueryInfoKey(key64)[0])] + + for browser in 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