Issue #8232: webbrowser support incomplete on Windows. Patch by Brandon Milam

This commit is contained in:
Steve Dower 2015-06-07 21:36:26 -07:00
commit 7386235f13
2 changed files with 114 additions and 9 deletions

View File

@ -495,10 +495,23 @@ if os.environ.get("TERM"):
# #
if sys.platform[:3] == "win": if sys.platform[:3] == "win":
class WindowsDefault(BaseBrowser): class WindowsDefault(BaseBrowser):
# Windows Default opening arguments.
cmd = "start"
newwindow = ""
newtab = ""
def open(self, url, new=0, autoraise=True): 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: try:
os.startfile(url) subprocess.call(self.cmd, shell=True)
except OSError: except OSError:
# [Error 22] No application is associated with the specified # [Error 22] No application is associated with the specified
# file for this operation: '<URL>' # file for this operation: '<URL>'
@ -506,19 +519,108 @@ if sys.platform[:3] == "win":
else: else:
return True 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 = [] _tryorder = []
_browsers = {} _browsers = {}
# First try to use the default Windows browser # First try to use the default Windows browser.
register("windows-default", WindowsDefault) register("windows-default", WindowsDefault)
# Detect some common Windows browsers, fallback to IE def find_windows_browsers():
iexplore = os.path.join(os.environ.get("PROGRAMFILES", "C:\\Program Files"), """ Access the windows registry to determine
"Internet Explorer\\IEXPLORE.EXE") what browsers are on the system.
for browser in ("firefox", "firebird", "seamonkey", "mozilla", """
"netscape", "opera", iexplore):
if shutil.which(browser): import winreg
register(browser, None, BackgroundBrowser(browser)) 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 # Platform support for MacOS

View File

@ -27,6 +27,9 @@ Core and Builtins
Library Library
------- -------
- Issue #8232: webbrowser support incomplete on Windows. Patch by Brandon
Milam
- Issue #24347: Set KeyError if PyDict_GetItemWithError returns NULL. - Issue #24347: Set KeyError if PyDict_GetItemWithError returns NULL.
- Issue #24348: Drop superfluous incref/decref. - Issue #24348: Drop superfluous incref/decref.