summaryrefslogtreecommitdiffstats
path: root/Lib/webbrowser.py
diff options
context:
space:
mode:
authorDavid Steele <davesteele@users.noreply.github.com>2017-02-25 04:47:38 (GMT)
committerNick Coghlan <ncoghlan@gmail.com>2017-02-25 04:47:38 (GMT)
commite3ce69522ffd7c0354d6e70d18f42bce325ed97e (patch)
treec63c55d06086facce580a3cd30690aee890c097d /Lib/webbrowser.py
parente3bf4cdd3db9004220d3ec7f5db4e7d16a99c743 (diff)
downloadcpython-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-xLib/webbrowser.py37
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