diff options
author | David Steele <davesteele@users.noreply.github.com> | 2017-02-25 04:47:38 (GMT) |
---|---|---|
committer | Nick Coghlan <ncoghlan@gmail.com> | 2017-02-25 04:47:38 (GMT) |
commit | e3ce69522ffd7c0354d6e70d18f42bce325ed97e (patch) | |
tree | c63c55d06086facce580a3cd30690aee890c097d /Lib/webbrowser.py | |
parent | e3bf4cdd3db9004220d3ec7f5db4e7d16a99c743 (diff) | |
download | cpython-e3ce69522ffd7c0354d6e70d18f42bce325ed97e.zip cpython-e3ce69522ffd7c0354d6e70d18f42bce325ed97e.tar.gz cpython-e3ce69522ffd7c0354d6e70d18f42bce325ed97e.tar.bz2 |
bpo-24241: Improve preferred webbrowser handling (#85)
- Add 'preferred' argument to webbrowser.register
- Use xdg-settings to specify preferred X browser
The first change replaces the existing undocumented tri-state
'try_order' parameter with the documented boolean keyword-only
'preferred' parameter. Setting it to True places the browser at the
front of the list, preferring it as the return to a subsequent get() call.
The second change adds a private `_os_preferred_browser` setting
and then uses that to make the default browser reported by
`xdg-settings` first in the try list when running under X (or
another environment that sets the `DISPLAY` variable).
This avoids the problem where the first entry in the tryorder
queue otherwise defaults to xdg-open, which doesn't support
the "new window" option.
Diffstat (limited to 'Lib/webbrowser.py')
-rwxr-xr-x | Lib/webbrowser.py | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/Lib/webbrowser.py b/Lib/webbrowser.py index 6f43b7f..a9eac69 100755 --- a/Lib/webbrowser.py +++ b/Lib/webbrowser.py @@ -13,16 +13,21 @@ __all__ = ["Error", "open", "open_new", "open_new_tab", "get", "register"] class Error(Exception): pass -_browsers = {} # Dictionary of available browser controllers -_tryorder = [] # Preference order of available browsers +_browsers = {} # Dictionary of available browser controllers +_tryorder = [] # Preference order of available browsers +_os_preferred_browser = None # The preferred browser -def register(name, klass, instance=None, update_tryorder=1): - """Register a browser connector and, optionally, connection.""" +def register(name, klass, instance=None, *, preferred=False): + """Register a browser connector.""" _browsers[name.lower()] = [klass, instance] - if update_tryorder > 0: - _tryorder.append(name) - elif update_tryorder < 0: + + # Preferred browsers go to the front of the list. + # Need to match to the default browser returned by xdg-settings, which + # may be of the form e.g. "firefox.desktop". + if preferred or (_os_preferred_browser and name in _os_preferred_browser): _tryorder.insert(0, name) + else: + _tryorder.append(name) def get(using=None): """Return a browser launcher instance appropriate for the environment.""" @@ -484,6 +489,14 @@ def register_X_browsers(): # Prefer X browsers if present if os.environ.get("DISPLAY"): + try: + cmd = "xdg-settings get default-web-browser".split() + result = subprocess.check_output(cmd).decode().strip() + except (FileNotFoundError, subprocess.CalledProcessError): + pass + else: + _os_preferred_browser = result + register_X_browsers() # Also try console browsers @@ -610,10 +623,10 @@ if sys.platform == 'darwin': # Don't clear _tryorder or _browsers since OS X can use above Unix support # (but we prefer using the OS X specific stuff) - register("safari", None, MacOSXOSAScript('safari'), -1) - register("firefox", None, MacOSXOSAScript('firefox'), -1) - register("chrome", None, MacOSXOSAScript('chrome'), -1) - register("MacOSX", None, MacOSXOSAScript('default'), -1) + register("safari", None, MacOSXOSAScript('safari'), preferred=True) + register("firefox", None, MacOSXOSAScript('firefox'), preferred=True) + register("chrome", None, MacOSXOSAScript('chrome'), preferred=True) + register("MacOSX", None, MacOSXOSAScript('default'), preferred=True) # OK, now that we know what the default preference orders for each @@ -628,7 +641,7 @@ if "BROWSER" in os.environ: if cmdline != '': cmd = _synthesize(cmdline, -1) if cmd[1] is None: - register(cmdline, None, GenericBrowser(cmdline), -1) + register(cmdline, None, GenericBrowser(cmdline), preferred=True) cmdline = None # to make del work if _userchoices was empty del cmdline del _userchoices |