Skip to content
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 our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

webbrowser module broken with Firefox 36+ #67451

Closed
ssokolow mannequin opened this issue Jan 18, 2015 · 47 comments
Closed

webbrowser module broken with Firefox 36+ #67451

ssokolow mannequin opened this issue Jan 18, 2015 · 47 comments
Labels
3.7 only security fixes stdlib Python modules in the Lib dir type-bug An unexpected behavior, bug, or error

Comments

@ssokolow
Copy link
Mannequin

ssokolow mannequin commented Jan 18, 2015

BPO 23262
Nosy @phdru, @ssokolow, @ezio-melotti, @lilydjwg, @berkerpeksag, @serhiy-storchaka, @wyz23x2, @Syaifulnizamshamsudin
Files
  • webbrowser.py-3.5.patch
  • webbrowser.py-3.5.patch: Regenerated for review
  • webbrowser.py-3.5-2.patch
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = <Date 2021-10-12.14:20:03.194>
    created_at = <Date 2015-01-18.04:16:56.445>
    labels = ['3.7', 'type-bug', 'library']
    title = 'webbrowser module broken with Firefox 36+'
    updated_at = <Date 2021-10-12.14:20:03.192>
    user = 'https://github.com/ssokolow'

    bugs.python.org fields:

    activity = <Date 2021-10-12.14:20:03.192>
    actor = 'serhiy.storchaka'
    assignee = 'none'
    closed = True
    closed_date = <Date 2021-10-12.14:20:03.194>
    closer = 'serhiy.storchaka'
    components = ['Library (Lib)']
    creation = <Date 2015-01-18.04:16:56.445>
    creator = 'ssokolow'
    dependencies = []
    files = ['45228', '45236', '45237']
    hgrepos = []
    issue_num = 23262
    keywords = ['patch']
    message_count = 47.0
    messages = ['234218', '234248', '234256', '234284', '234285', '234289', '234290', '234291', '234292', '234293', '236529', '236727', '236737', '236826', '236838', '270554', '270555', '270556', '270563', '270565', '270566', '270567', '270569', '278340', '278341', '278346', '279381', '279384', '279390', '279392', '279399', '279400', '279403', '279407', '279491', '279492', '279529', '279541', '279544', '279545', '279735', '279766', '279767', '279989', '280130', '403574', '403731']
    nosy_count = 10.0
    nosy_names = ['phd', 'bazwal', 'ssokolow', 'ezio.melotti', 'python-dev', 'lilydjwg', 'berker.peksag', 'serhiy.storchaka', 'wyz23x2', 'Syaifulnizam']
    pr_nums = []
    priority = 'normal'
    resolution = 'fixed'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = 'behavior'
    url = 'https://bugs.python.org/issue23262'
    versions = ['Python 3.5', 'Python 3.6', 'Python 3.7']

    @ssokolow
    Copy link
    Mannequin Author

    ssokolow mannequin commented Jan 18, 2015

    As of Firefox 36 (currently in beta channel), the -remote option has been removed.

    https://www.mozilla.org/en-US/firefox/36.0a2/auroranotes/
    https://www.mozilla.org/en-US/firefox/36.0beta/releasenotes/

    As such, attempting to open http://www.example.com/ using webbrowser.open() or webbrowser.open_new_tab() results in "File not Found" tabs pointing to these two URLs, respectively:

    file:///home/ssokolow/openURL%28http://www.example.com/%29
    file:///home/ssokolow/openURL%28http://www.example.com/,new-tab%29

    As I happen to have the Dead Snakes PPA set up on Lubuntu 14.04 for use with tox, I was able to confirm this as an issue in Python 2.7, 3.1, 3.2, 3.3, and 3.4.

    @ssokolow ssokolow mannequin added stdlib Python modules in the Lib dir type-bug An unexpected behavior, bug, or error labels Jan 18, 2015
    @pitrou
    Copy link
    Member

    pitrou commented Jan 18, 2015

    What is the right way to do it then? It should also remain compatible with Firefox < 36.

    @serhiy-storchaka
    Copy link
    Member

    @ssokolow
    Copy link
    Mannequin Author

    ssokolow mannequin commented Jan 18, 2015

    The proper solution is to prefer start (Windows), open (OSX), or xdg-open (everything else... usually but not always present) when present instead of calling the browser directly.

    That way, you're using the same "delegate to the desktop's associations system and let the user's preferences control new window vs. new tab" behaviour on all OSes where it's reliably possible.

    (Yes, it would guarantee that all open* functions are equivalent, but that's already the norm in a lot of cases... especially with Firefox where one of the guiding design principles is ensuring that the user retains control of their browsing experience.)

    @pitrou
    Copy link
    Member

    pitrou commented Jan 18, 2015

    That doesn't really answer the question. The webbrowser module is already able to use "xdg-open" (though not "open"), but it has a fallback on various concrete browsers (including Firefox) in case xdg-open doesn't work / doesn't exist.

    @ssokolow
    Copy link
    Mannequin Author

    ssokolow mannequin commented Jan 18, 2015

    Well, then the code which chooses a backend is broken because I have xdg-open and, according to WinPdb, it's using the Mozilla backend.

    This was my local workaround:

        if os.name == 'posix' and not platform.mac_ver()[0]:
            with open(os.devnull, 'wb') as nul:
                subprocess.Popen(['xdg-open', request_url], stdout=nul, stderr=nul)
        else:
            webbrowser.open_new_tab(request_url)

    (This retrofit branch hasn't yet reached the point where it'll be tested on Windows. I may still add another branch which calls start directly if it proves to have the same priority bug on Windows.)

    @pitrou
    Copy link
    Member

    pitrou commented Jan 18, 2015

    Well, then the code which chooses a backend is broken because I have
    xdg-open and, according to WinPdb, it's using the Mozilla backend.

    You have xdg-open under Windows?

    @ssokolow
    Copy link
    Mannequin Author

    ssokolow mannequin commented Jan 18, 2015

    WinPdb = Windowed Pdb, not MS Windows Pdb.

    sudo apt-get install winpdb

    @pitrou
    Copy link
    Member

    pitrou commented Jan 18, 2015

    Oops, sorry. The best way forward would be for you to investigate and find out why xdg-open isn't preferred in your setting.

    @ssokolow
    Copy link
    Mannequin Author

    ssokolow mannequin commented Jan 18, 2015

    Noted. I'm not sure what my schedule will be like, but I'll try.

    (I may get back to you with an answer later today or I may not within the week.)

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Feb 24, 2015

    I created the attached module to work with new FF in Python 2.7. You can convert it to proper patch for webbrowser.py.

    @bazwal
    Copy link
    Mannequin

    bazwal mannequin commented Feb 27, 2015

    I arrived at an almost identical solution to the one given by Oleg. It works for me with FF 28, 35 & 36 - but presumably there are earlier versions where it does not, otherise why have the -remote option at all?

    The gist of the Mozilla bug report is that the option has existed for a very long time, but there are now other command-line options that do exactly the same thing. So the only question seems to be whether Python should still support those older versions of FF that actually require it (if any exist).

    On the xdg-open issue: the $BROWSER env var has priority over the default list of browsers to try, so that might explain why xdg-open is not being used on some systems (that is how I originally became aware of this problem).

    @serhiy-storchaka
    Copy link
    Member

    --new-window and --new-tab are Firefox and SeaMonkey2.x only. [1] So this will break the support of IceApe on Debian Etch (iceape v.1.0.13 [2]).

    [1] https://developer.mozilla.org/en-US/docs/Mozilla/Command_Line_Options
    [2] http://archive.debian.net/etch/devel/iceape

    @bazwal
    Copy link
    Mannequin

    bazwal mannequin commented Feb 27, 2015

    this will break the support of IceApe on Debian Etch

    Is Python committed to supporting obsolete Debian releases? The latest oldstable Debian release (6.0 Squeeze) has iceape-2.0.11 [1], which does seem to support the -new-window and -new-tab options (I haven't actually tested this, though - I just looked at the source code [2]).

    The iceweasel/iceape products are just rebranded versions of Firefox and Seamonkey. The webbrowser module currently supports them via the generic Mozilla class - so Python should only be concerned about which versions of the common Mozilla codebase it needs to continue support for.

    [1] https://packages.debian.org/search?suite=squeeze&searchon=names&keywords=iceape
    [2] http://anonscm.debian.org/cgit/pkg-mozilla/iceape.git/tree/mozilla/browser/components/nsBrowserContentHandler.js?h=squeeze#n419

    @serhiy-storchaka
    Copy link
    Member

    May it is time to drop support of SeaMonkey 1.x and systems released 8 years ago. But then we should drop the support of browsers "netsape", "mozilla", "firebird". And this should be documented somewhere.

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Jul 16, 2016

    Patch for Python 2.7 to support Firefox >= 36.0, with version test.

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Jul 16, 2016

    Patch for Python 3.4 and 3.5 to support Firefox >= 36.0, with version test.

    @berkerpeksag
    Copy link
    Member

    Thanks for the patches! Can't you just use a function from the high level subprocess API (like subprocess.run()?

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Jul 16, 2016

    Not subprocess.run() as I'm aiming to Python 2.7. Perhaps subprocess.check_output(). I'll try it.

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Jul 16, 2016

    Updated patch for Python 2.7 with subprocess.check_output().

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Jul 16, 2016

    Updated patch for Python 3.4+ with subprocess.check_output().

    @berkerpeksag
    Copy link
    Member

    I was talking about webbrowser.py-3.4-newfox.patch

    3.4 is now in security-fix-only mode so we can't push the patch to the 3.4 branch.

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Jul 16, 2016

    I am on Debian 8 "jessie" that only has Python 3.4, so I want to patch webbrowser.py in a backward-compatible way.

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Oct 9, 2016

    Add NewFox class to webbrowser for Py 2.7 (added raise_opts — Mozilla no longer supports autoraise).

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Oct 9, 2016

    Add NewFox class to webbrowser for Py 3.4 (added raise_opts — Mozilla no longer supports autoraise).

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Oct 9, 2016

    Remove empty args (backported from 3.4).

    @serhiy-storchaka
    Copy link
    Member

    Would not be easier to drop a support of SeaMonkey 1.x and other ancient browsers?

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Oct 25, 2016

    I don't think Firefox versions <36 are too old to be dropped.

    @serhiy-storchaka
    Copy link
    Member

    I don't think Firefox versions <36 are too old to be dropped.

    Just Firefox versions <1.5.

    Firefox 1.5 released 11 years ago supported options -new-window and -new-tab [1].

    [1] http://website-archive.mozilla.org/www.mozilla.org/firefox_releasenotes/en-US/firefox/releases/1.5.html

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Oct 25, 2016

    Ah, I see. Ok then, see the new patch.

    @serhiy-storchaka
    Copy link
    Member

    Tests are failed with webbrowser.py-3.5-newfox.patch.

    @serhiy-storchaka serhiy-storchaka added the 3.7 only security fixes label Oct 25, 2016
    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Oct 25, 2016

    What's the error? Buildbot URL?

    @serhiy-storchaka
    Copy link
    Member

    $ ./python -m test.regrtest -vuall test_webbrowser
    ...

    ======================================================================
    FAIL: test_open (test.test_webbrowser.MozillaCommandTest)
    ----------------------------------------------------------------------

    Traceback (most recent call last):
      File "/home/serhiy/py/cpython-3.5/Lib/test/test_webbrowser.py", line 99, in test_open
        arguments=['openURL({})'.format(URL)])
      File "/home/serhiy/py/cpython-3.5/Lib/test/test_webbrowser.py", line 42, in _test
        self.assertIn(option, popen_args)
    AssertionError: '-raise' not found in ['http://www.example.com']

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Oct 25, 2016

    Oops, yes, mea culpa, sorry. Patch for the test added.

    @serhiy-storchaka
    Copy link
    Member

    Could you please provide a patch including all changes in unified format?

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Oct 26, 2016

    Done.

    @serhiy-storchaka
    Copy link
    Member

    The problem is that this class is used for Netscape and old Mozilla browsers. What if rename old Mozilla class to Netscape and use it for old browsers?

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Oct 27, 2016

    I'd rather rename the new class to something like Firefox. So there will be 3 classes — Netscape, Mozilla and Firefox. Firefox only for firefox executable.

    @serhiy-storchaka
    Copy link
    Member

    Currently Netscape is just an alias to Mozilla. Since SeaMonkey is synchronized with Firefox, I suppose it dropped the support of the -remote option at the same time. Debian rebranded Firefox and SeaMonkey at 2006, therefore IceWeasel and IceApe always supported -new-win and -new-tab options. The last IceWeasel version was 38, it didn't supported the -remote option.

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Oct 27, 2016

    Then I don't have any objections. But I also couldn't test the change — I only use Firefox (and sometimes Chrome).

    @serhiy-storchaka serhiy-storchaka self-assigned this Oct 30, 2016
    @python-dev
    Copy link
    Mannequin

    python-dev mannequin commented Oct 30, 2016

    New changeset dacb52577c1c by Serhiy Storchaka in branch '3.5':
    Issue bpo-23262: The webbrowser module now supports Firefox 36+ and derived
    https://hg.python.org/cpython/rev/dacb52577c1c

    New changeset f1abc92a756a by Serhiy Storchaka in branch '3.6':

    New changeset cade42bd0ee0 by Serhiy Storchaka in branch 'default':
    Issue bpo-23262: The webbrowser module now supports Firefox 36+ and derived
    https://hg.python.org/cpython/rev/cade42bd0ee0

    @serhiy-storchaka
    Copy link
    Member

    What to do with 2.7? We can just backport the patch from 3.5, but also can use the version check from earlier Oleg's patches. 2.7 was released long time ago and still can be used on systems with old browsers (however it is very unlikely that Python is updated, but browsers are not).

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Oct 31, 2016

    Let's me disagree because Python 2.7 is a very special case. One can easily update a browser — they are perfectly compatible. But one cannot just update Python 2.7 because Python 3 is rather a different language that requires a lot of porting effort. So I can imagine Python 2.7 with new browser on the same computer.

    @serhiy-storchaka
    Copy link
    Member

    I don't understand with what you disagree. I can imagine old Python 2.7 with old browser, old Python 2.7 with new browser, new Python 2.7 with new browser, and even new Python 2.7 with old browser on the same computer (but the latter is very unlikely).

    Old Python 2.7 don't work with new browser and we can't do anything with this. We can make new Python 2.7.12 working with new browser. But I'm not sure that we can break the compatibility with old browser that could be installed when Python 2.7 was first installed on the same computer.

    @phdru
    Copy link
    Mannequin

    phdru mannequin commented Nov 6, 2016

    I'm not sure that we can break the compatibility with old browser

    I agree with this.

    @serhiy-storchaka serhiy-storchaka removed their assignment Dec 16, 2016
    @Syaifulnizamshamsudin
    Copy link
    Mannequin

    Syaifulnizamshamsudin mannequin commented Oct 10, 2021

    Processo webbrowser.3.5-2.patch

    @wyz23x2
    Copy link
    Mannequin

    wyz23x2 mannequin commented Oct 12, 2021

    I think this six year old issue can be closed. All patches for 3.x are committed, and Python 2.7 is EOL.

    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    3.7 only security fixes stdlib Python modules in the Lib dir type-bug An unexpected behavior, bug, or error
    Projects
    None yet
    Development

    No branches or pull requests

    4 participants
    @berkerpeksag @pitrou @serhiy-storchaka and others