Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

bpo-24241: Preferred X browser#85

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
ncoghlan merged 2 commits intopython:masterfromdavesteele:preferred_browser
Feb 25, 2017

Conversation

davesteele
Copy link
Contributor

When calling webbrowser.open*(), the module goes through a list of installed browsers, and uses the first one that succeeds, to process the request.

The first 'browsers' in the 'X' list are 'xdg-open' and others of that ilk. The problem is that they only have one 'open' behavior - the 'new' parameter is ignored ('same window', 'new window', 'new tab').

These commits move the default web browser to the front of the tryorder list, allowing get() behavior to match the documentation.

This same problem was recently fixed in Windows via Issue#8232

@the-knights-who-say-ni

Hello, and thanks for your contribution!

I'm a bot set up to make sure that the project can legally accept your contribution by verifying you have signed thePSF contributor agreement (CLA).

Unfortunately we couldn't find an account corresponding to your GitHub username onbugs.python.org (b.p.o) to verify you have signed the CLA. This is necessary for legal reasons before we can look at your contribution. Please follow these steps to help rectify the issue:

  1. If you don't have an account on b.p.o, pleasecreate one
  2. Make sure your GitHub username is listed in"Your Details" at b.p.o
  3. If you have not already done so, please sign thePSF contributor agreement
  4. If you just signed the CLA, pleasewait at least one US business day and then check "Your Details" onbugs.python.org to see if your account has been marked as having signed the CLA (the delay is due to a person having to manually check your signed CLA)
  5. Reply here saying you have completed the above steps

Thanks again to your contribution and we look forward to looking at it!

@davesteeledavesteele changed the titleIssue #24241: Preferred X browserbpo-24241: Preferred X browserFeb 14, 2017
@davesteele
Copy link
ContributorAuthor

I've tied my bpo 'daves' account to github 'davesteele'. The contributor form was received 2015-07-17.00:00:00.

@codecov
Copy link

codecovbot commentedFeb 14, 2017

Codecov Report

Merging#85 intomaster willdecrease coverage by-0.01%.
The diff coverage is14.28%.

@@            Coverage Diff             @@##           master      #85      +/-   ##==========================================- Coverage   82.38%   82.38%   -0.01%==========================================  Files        1428     1428                Lines      351138   351143       +5     ==========================================- Hits       289291   289275      -16- Misses      61847    61868      +21

Continue to review full report at Codecov.

Legend -Click here to learn more
Δ = absolute <relative> (impact),ø = not affected,? = missing data
Powered byCodecov. Last updateb692dc8...602ba9f. Read thecomment docs.

Copy link
Contributor

@ultimatecoderultimatecoder left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Found improvements to the code.

cmd = "xdg-settings get default-web-browser".split()
_preferred_browser = subprocess.check_output(cmd).decode().strip()
except (FileNotFoundError, subprocess.CalledProcessError):
pass
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I am not sure you shouldpass the exceptions silently.

Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I'm not sure what to report, otherwise. Passing on the FileNotFoundError feels right to me.

I could drop catching CalledProcessError?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

You could use shutil.which to determine if xdg-settings exists before trying to call it (LBYL). But here ignoring the exception (EAFP) seems right to me.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

With a_preferred_browsers set, this would become:

try:    cmd = "xdg-settings get default-web-browser".split()    _xdg_default_browser = subprocess.check_output(cmd).decode().strip()except (FileNotFoundError, subprocess.CalledProcessError):     passelse:    _preferred_browsers.add(_xdg_default_browser)

I believe that would be more self-explanatory as to the purpose of ignoring the exceptions here (if we fail to find the xdg default browser, we simply don't add it to the preferred browser set)

Copy link
Contributor

@ultimatecoderultimatecoder left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I will suggest updating the documentation for methodregister atDoc/library/webbrowser.rst


def register(name, klass, instance=None, update_tryorder=1):
"""Register a browser connector and, optionally, connection."""
def register(name, klass, instance=None, priority=False):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I wonder if it’s good to change the signature here. Is it impossible to give high priority to the browser found with xdg-settings, if any, with the update_tryorder param?

Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I took the opportunity to make what I thought was an improvement. The tri-state definition of the old parameter seemed a bit clumsy and unnecessary (note that it was left out of the documentation).

I can back out the change to update_tryorder if it is deemed appropriate.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I'd suggest making the parameterpreferred rather thanpriority and making it keyword-only.

@davesteele
Copy link
ContributorAuthor

I've added documentation for the register() priority argument.

Copy link
Contributor

@ncoghlanncoghlan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I like the general idea of this patch, but think it would be more self-explanatory with some changes to the specific implementation details.

@@ -15,14 +15,15 @@ class Error(Exception):

_browsers = {} # Dictionary of available browser controllers
_tryorder = [] # Preference order of available browsers
_preferred_browser = None # The preferred browser for the current environment
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Rather than only allowing a single preferred browser, perhaps it would make sense to make this a_preferred_browsers set? That would have a ripple effect on the other updates below.

Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

My original implementation did this, but I didn't find the enhancement useful. There weren't any ripples.

That said, I'll make the change if this is considered a blocker.

if update_tryorder > 0:
_tryorder.append(name)
elif update_tryorder < 0:
if priority or (_preferred_browser and name in _preferred_browser):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

With a set, this condition would becomeif priority or name in _preferred_browsers:

Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

'preferred' is a better name. I'll make the change.

Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I had managed to make it to this point without encountering the keyword-only concept in the library (or elsewhere, for that matter). Would this cause unnecessary confusion?

Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Note that 'name in _preferred_browsers' is not enough. xdg-settings returns e.g. 'firefox.desktop'.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

keyword-only is our preferred approach to handling boolean arguments in Python 3, as otherwise you end up with code that's ambiguous at the point of calling (as here, where theTrue conveys no info to a reader that doesn't already know the signature, whilepreferred=True is a lot more descriptive)

Regarding_preferred_browser potentially needing to match things likefirefox againstfirefox.desktop, that belongs in an explanatory comment in the code itself. I'm fine with dropping the idea of switching to a set, though.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

A slight name tweak may help convey the difference between this field and the new parameter toregister though: what do you think about renaming it to_os_preferred_browser?

cmd = "xdg-settings get default-web-browser".split()
_preferred_browser = subprocess.check_output(cmd).decode().strip()
except (FileNotFoundError, subprocess.CalledProcessError):
pass
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

With a_preferred_browsers set, this would become:

try:    cmd = "xdg-settings get default-web-browser".split()    _xdg_default_browser = subprocess.check_output(cmd).decode().strip()except (FileNotFoundError, subprocess.CalledProcessError):     passelse:    _preferred_browsers.add(_xdg_default_browser)

I believe that would be more self-explanatory as to the purpose of ignoring the exceptions here (if we fail to find the xdg default browser, we simply don't add it to the preferred browser set)


def register(name, klass, instance=None, update_tryorder=1):
"""Register a browser connector and, optionally, connection."""
def register(name, klass, instance=None, priority=False):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I'd suggest making the parameterpreferred rather thanpriority and making it keyword-only.

register("firefox", None, MacOSXOSAScript('firefox'), -1)
register("chrome", None, MacOSXOSAScript('chrome'), -1)
register("MacOSX", None, MacOSXOSAScript('default'), -1)
register("safari", None, MacOSXOSAScript('safari'), True)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

With the above suggested change to the signature ofregister, this and the other options below would become:

register("safari", None, MacOSXOSAScript('safari'), preferred=True)

Copy link
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

I'll add the 'else' construct.

@codecov-io
Copy link

Codecov Report

Merging#85 intomaster willdecrease coverage by-0.01%.
The diff coverage is13.33%.

@@            Coverage Diff             @@##           master      #85      +/-   ##==========================================- Coverage   82.38%   82.37%   -0.01%==========================================  Files        1428     1428                Lines      351138   351206      +68     ==========================================+ Hits       289291   289317      +26- Misses      61847    61889      +42

Continue to review full report at Codecov.

Legend -Click here to learn more
Δ = absolute <relative> (impact),ø = not affected,? = missing data
Powered byCodecov. Last updateb692dc8...795ee09. Read thecomment docs.

@davesteele
Copy link
ContributorAuthor

@ncoghlan, I've made some changes based on your review, and pushed back on a few others. You be the final arbiter on the issues. Let me know.

@ncoghlan
Copy link
Contributor

+1 on leaving the helper variable as a single string - I've suggested a name change and an additional explanatory comment to cover some of the subtleties for future maintainers.

For thepreferred change, I still think keyword-only arguments will be clearer, aspreferred=True conveys a lot more information at the call sites than a bareTrue.

The commit message also still needs adjustment to better cover the changes being made (i.e. both thepreferred parameter being added towebbrowser.register, and the module being updated to usexdg-settings to find the appropriate preferred browser on Linux).

If you're so inclined, you could also add an entry to the 3.7 What's New for this change (otherwise I'll just add it along with the NEWS entry when pushing the change)

Replace the existing undocumented tri-state 'try_order' parameter withthe boolean keyword-only 'preferred' parameter. Setting it to Trueplaces the browser at the front of the list, preferring it as the returnto a subsequent get() call.'preferred' is added to the documentation.
The traditional first entry in the tryorder queue is xdg-open, whichdoesn't support new window. Make the default browser firstin the try list, to properly support these options.
@davesteele
Copy link
ContributorAuthor

@ncoghlan, I've reworked, reworded, and rebased the commits based on your suggestions.

@ncoghlan
Copy link
Contributor

The codecov complaints are due to CI not running on Mac OS X, so this looks good to me now - merging!

@ncoghlanncoghlan merged commite3ce695 intopython:masterFeb 25, 2017
@davesteele
Copy link
ContributorAuthor

Thanks for your help on this.

@ncoghlan
Copy link
Contributor

Added the sprint label, as this PR was submitted at the PyCon Pune 2017 core development sprint.

akruis pushed a commit to akruis/cpython that referenced this pull requestSep 9, 2017
…WatchdogExFix issuepython#85: don't schedule already scheduled tasklets.Ensure that the internal watchdog list is empty before and afterall test cases of class TestNewWatchdog.Fix test case TestNewWatchdog.test_watchdog_priority_{hard|soft}. Thetimeout value was much to short to build up a list of watchdogs.The new test cases TestNewWatchdog.test_schedule_deeper_{hard|soft}triggers the assertion failure reliably. They are skipped for now.https://bitbucket.org/stackless-dev/stackless/issues/85(grafted from 2235702eb90cb0709dd40544b3952a956f2032a9 and 3fb55ce5b2d4)
akruis pushed a commit to akruis/cpython that referenced this pull requestSep 9, 2017
akruis pushed a commit to akruis/cpython that referenced this pull requestSep 9, 2017
colesbury referenced this pull request in colesbury/nogilOct 6, 2021
Sometimes we need to acquire locks before the current PyThreadStateis set. This moves the waiter data to it's own struct. It's sharedbetween PyThreadStates on the same thread, such as in multi-interpretersettings.Fixes#85
jaraco pushed a commit that referenced this pull requestDec 2, 2022
markshannon pushed a commit to faster-cpython/cpython that referenced this pull requestJan 10, 2023
Add github workflow to build and publish docker image
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Reviewers

@merwokmerwokmerwok left review comments

@ultimatecoderultimatecoderultimatecoder requested changes

@ncoghlanncoghlanncoghlan approved these changes

Assignees
No one assigned
Labels
Projects
None yet
Milestone
No milestone
Development

Successfully merging this pull request may close these issues.

7 participants
@davesteele@the-knights-who-say-ni@codecov-io@ncoghlan@merwok@ultimatecoder@zware

[8]ページ先頭

©2009-2025 Movatter.jp