Closed Bug 1125325 Opened 11 years ago Closed 10 years ago

Web content is not rescaled when OS X moves browser window from HiDPI laptop display to external display.

Categories

(Core :: Widget: Cocoa, defect)

x86
macOS
defect
Not set
normal

Tracking

()

VERIFIED FIXED
mozilla41
Tracking Status
e10s m5+ ---
firefox37 + wontfix
firefox38 + wontfix
firefox39 + wontfix
firefox40 + wontfix
firefox41 + verified

People

(Reporter: cpeterson, Assigned: handyman)

References

(Blocks 1 open bug)

Details

(Keywords: regression)

Attachments

(6 files, 21 obsolete files)

251.75 KB, image/png
Details
299.96 KB, image/png
Details
27.75 KB, patch
Details | Diff | Splinter Review
11.61 KB, patch
Details | Diff | Splinter Review
2.23 KB, patch
kats
: review+
Details | Diff | Splinter Review
1.85 KB, patch
smaug
: review+
handyman
: feedback+
Details | Diff | Splinter Review
STR: 1. Open Firefox window on Retina/HiDPI laptop. 2. Connect external display but leave Firefox window on the laptop's display. 3. Close laptop lid. RESULT: OS X will move the windows from laptop display to external display, but Firefox does not rescale web content for open pages. See the attached screenshot. Pages loaded in new tabs are rendered correctly. If I change window settings, like resizing the window or toggling the Bookmarks toolbar, then Firefox rescales the web content correctly. This is not an e10s only bug, but I suspect it is a regression from e10s HiDPI bug 1111957. I started noticing this problem in the past 2–4 weeks (and bug 1111957 was fixed 4 weeks ago).
Attached image screenshot.png
Attaching screenshot.
Assignee: nobody → davidp99
Status: NEW → ASSIGNED
Hey Chris, I'm not having any luck reproducing this now. I figured that maybe it's been fixed but I also don't see this behavior in the last nightly build still available - 1/25. Can you try this again?
Flags: needinfo?(cpeterson)
This bug is not fixed. I see it everyday on Nightly, with or without e10s.
Flags: needinfo?(cpeterson)
Here is the about:support info from one of my MBPs that reproduce the problem. I do not have reliable STR. Application Basics ------------------ Name: Firefox Version: 39.0a1 Build ID: 20150224030228 Update Channel: nightly User Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:39.0) Gecko/20100101 Firefox/39.0 Multiprocess Windows: 0/1 (default: false) Crash Reports for the Last 3 Days --------------------------------- Report ID: bp-05d66a61-00dc-44db-8247-dc4592150225 Submitted: 15 hours ago Report ID: bp-910969b7-70eb-4d51-857b-24b8d2150224 Submitted: 2 days ago All Crash Reports Extensions ---------- Name: Bugzilla Tweaks Version: 1.12.1.1 Enabled: true ID: jid0-qBnIpLfDFa4LpdrjhAC6vBqN20Q@jetpack Name: BugzillaJS Version: 3.3.1 Enabled: true ID: jid0-NgMDcEu2B88AbzZ6ulHodW9sJzA@jetpack Name: Charles Autoconfiguration Version: 3.6.4 Enabled: true ID: {3e9a3920-1b27-11da-8cd6-0800200c9a66} Name: Gecko Profiler Version: 1.10.17 Enabled: true ID: jid0-edalmuivkozlouyij0lpdx548bc@jetpack Name: is.gd Creator (fork) Version: 0.3 Enabled: true ID: isgdcreator@mrkschan.at.gmail.com Name: Mass Password Reset Version: 1.05 Enabled: true ID: masspasswordreset@johnathan.nightingale Name: Quora Share Version: 0.1 Enabled: true ID: jid1-roegsJ40q6CsFg@jetpack Name: User Agent Switcher Version: 0.7.3 Enabled: true ID: {e968fc70-8f95-4ab9-9e79-304de2a71ee1} Name: µBlock Version: 0.8.6.0 Enabled: true ID: {2b10c1c8-a11f-4bad-fe9c-1c11e82cac42} Name: Adblock Plus Version: 2.6.7 Enabled: false ID: {d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d} Name: Cloud To Butt Version: 1.1 Enabled: false ID: cloud-to-butt-mozilla@github.com Name: DownloadHelper Version: 4.9.24 Enabled: false ID: {b9db16a4-6edc-47ec-a1f4-b86292ed211d} Name: FindBar Tweak Version: 1.4.18 Enabled: false ID: fbt@quicksaver Name: Firefox Interest Dashboard Version: 0.9.1 Enabled: false ID: firefox.interest.dashboard@up.mozilla Name: Flip or Rotate Image Version: 0.9 Enabled: false ID: jid0-AGJXXzyS0rT1UudxcYiNRjbGttc@jetpack Name: HTTPS-Everywhere Version: 5.0development.2 Enabled: false ID: https-everywhere@eff.org Name: JSONView Version: 0.9 Enabled: false ID: jsonview@brh.numbera.com Name: Lightbeam Version: 1.2.1 Enabled: false ID: jid1-F9UJ2thwoAm5gQ@jetpack Name: Modify Headers Version: 0.7.1.1 Enabled: false ID: {b749fc7c-e949-447f-926c-3f4eed6accfe} Name: Privacy Badger Firefox Version: 0.2.5 Enabled: false ID: jid1-MnnxcxisBPnSXQ@jetpack Name: Reader Version: 35.2 Enabled: false ID: {20068ab2-1901-4140-9f3c-81207d4dacc4} Name: Shumway Version: 0.10.182 Enabled: false ID: shumway@research.mozilla.org Name: SPDY indicator Version: 2.2 Enabled: false ID: spdyindicator@chengsun.github.com Name: Test Pilot Version: 1.2.3 Enabled: false ID: testpilot@labs.mozilla.com Name: YouTube High Definition Version: 35.5 Enabled: false ID: {7b1bf0b6-a1b9-42b0-b75d-252036438bdc} Name: YouTube Video and Audio Downloader Version: 0.4.3 Enabled: false ID: feca4b87-3be4-43da-a1b1-137c24220968@jetpack Graphics -------- Device ID: 0x fd5 GPU Accelerated Windows: 1/1 OpenGL (OMTC) Vendor ID: 0x10de WebGL Renderer: NVIDIA Corporation -- NVIDIA GeForce GT 650M OpenGL Engine windowLayerManagerRemote: true AzureCanvasBackend: quartz AzureContentBackend: quartz AzureFallbackCanvasBackend: none AzureSkiaAccelerated: 0 Important Modified Preferences ------------------------------ accessibility.typeaheadfind.flashBar: 0 browser.cache.disk.capacity: 358400 browser.cache.disk.filesystem_reported: 1 browser.cache.disk.smart_size_cached_value: 358400 browser.cache.disk.smart_size.first_run: false browser.cache.disk.smart_size.use_old_max: false browser.cache.frecency_experiment: 2 browser.download.importedFromSqlite: true browser.places.smartBookmarksVersion: 7 browser.search.useDBForOrder: true browser.sessionstore.upgradeBackup.latestBuildID: 20150224030228 browser.startup.homepage: about:blank browser.startup.homepage_override.buildID: 20150224030228 browser.startup.homepage_override.mstone: 39.0a1 browser.tabs.drawInTitlebar: false browser.tabs.loadDivertedInBackground: true browser.tabs.remote.autostart.1: false dom.disable_open_during_load: false dom.ipc.plugins.asyncInit: true dom.max_script_run_time: 0 dom.mozApps.used: true extensions.lastAppVersion: 39.0a1 font.internaluseonly.changed: false media.gmp-gmpopenh264.lastUpdate: 1422504377 media.gmp-gmpopenh264.path: /Users/chris/Library/Application Support/Firefox/Profiles/7r7ocnh1.default-1404923350651/gmp-gmpopenh264 media.gmp-gmpopenh264.version: 1.3 media.gmp-manager.lastCheck: 1424836936 media.mediasource.webm.enabled: true mousewheel.with_alt.action: 1 mousewheel.with_meta.action: 1 network.cookie.prefsMigrated: true network.predictor.cleaned-up: true places.database.lastMaintenance: 1424837927 places.history.expiration.transient_current_max_pages: 104858 plugin.disable_full_page_plugin_for_types: application/pdf plugin.importedState: true plugin.state.directorshockwave: 0 plugin.state.silverlight: 2 plugin.state.unity web player: 0 print.print_bgcolor: false print.print_bgimages: false print.print_colorspace: print.print_command: print.print_downloadfonts: false print.print_duplex: 1515870810 print.print_evenpages: true print.print_in_color: true print.print_margin_bottom: 0.5 print.print_margin_left: 0.5 print.print_margin_right: 0.5 print.print_margin_top: 0.5 print.print_oddpages: true print.print_orientation: 0 print.print_page_delay: 50 print.print_paper_data: 0 print.print_paper_height: 11.00 print.print_paper_name: print.print_paper_size_type: 1 print.print_paper_size_unit: 0 print.print_paper_width: 8.50 print.print_plex_name: print.print_resolution: 1515870810 print.print_resolution_name: print.print_reversed: false print.print_scaling: 1.00 print.print_shrink_to_fit: true print.print_to_file: false print.print_unwriteable_margin_bottom: 56 print.print_unwriteable_margin_left: 25 print.print_unwriteable_margin_right: 25 print.print_unwriteable_margin_top: 25 privacy.donottrackheader.enabled: true privacy.sanitize.migrateFx3Prefs: true security.dialog_enable_delay: 0 security.disable_button.openCertManager: false security.ssl.errorReporting.automatic: true storage.vacuum.last.index: 1 storage.vacuum.last.places.sqlite: 1424414981 Important Locked Preferences ---------------------------- JavaScript ---------- Incremental GC: true Accessibility ------------- Activated: false Prevent Accessibility: 0 Library Versions ---------------- NSPR Expected minimum version: 4.10.8 Version in use: 4.10.8 NSS Expected minimum version: 3.17.4 Basic ECC Version in use: 3.17.4 Basic ECC NSSSMIME Expected minimum version: 3.17.4 Basic ECC Version in use: 3.17.4 Basic ECC NSSSSL Expected minimum version: 3.17.4 Basic ECC Version in use: 3.17.4 Basic ECC NSSUTIL Expected minimum version: 3.17.4 Version in use: 3.17.4 Experimental Features --------------------- Name: Invisible test of the experiment branching system. ID: experiment-branch-test-nightly@experiments.mozilla.org Description: An experiment using branches just to test whether branches get saved correctly. Active: false End Date: 1409120193510 Homepage:
Thanks, Chris. Turns out you are on the same hardware as me so that's not the reason I'm not seeing this. You mentioned there is no reliable STR -- so the steps in comment 0 aren't 100% reliable? I tried dozens of times without seeing the issue once. How often should I expect to see it? I was thinking this would be dom related but its starting to sound like it might be something else. For the record, when I run the STR, I see the messed up screen on the external display for a fraction of a second before the browser redraws (with no intervention from me).
Flags: needinfo?(cpeterson)
I don't remember if the STR were 100% reliable when I reported the bug, but they are definitely not now. I always see the messed up screen for a fraction of a second when connecting or disconnecting my external display. This feels like a race condition involving lost DOM events.
Flags: needinfo?(cpeterson)
Keywords: reproducible
[Tracking Requested - why for this release]: Seeing this on 37.0b2 too, simply dragging the window between displays.
Turns out I can't reproduce this with a fresh profile, or after restarting 37.0b2. There's a graphical glitch when transferring the window between displays, but then the window is rerendered afterwards and looks correct. Perhaps it's a state which develops after running for some time.
I can reproduce this reliably on my machine using 37 Beta 2 and Nightly 39. This occurs every time I plug in the monitor at my desk. I filed bug 1118290, which may be a dup of this one. Tracking as this is quite annoying and reflects poorly on the browser. (Content renders incorrectly.) Given that other people are seeing this, I would prefer to have a fix. However, I will also say I don't think this is a stop ship issue as there is a simple workaround.
We can't make any headway here until we have STR good enough for *everyone* to be able to reproduce it, close to 100% of the time, starting from a clean profile.
I suspect we'll only be able to fix this bug by fixing the temporary glitches and artifacts. Safari never had them, of course (thanks to it's knowledge of OS X internals). And fairly recently Chrome stopped having them (see bug 962528 comment #33). So in principle we should be able to do the same. But it will be a *major* project, and require *lots* of reverse engineering (of Safari, Chrome, and OS X). I'm not sure I'll ever have time for it. If/when I do, though, I'll probably work on it at bug 962528.
Changing the component given the last comment; I'd also suggest we should stop tracking for 37, and perhaps completely, or start tracking and prioritize bug 962528.
Component: Graphics → Widget: Cocoa
(In reply to Steven Michaud from comment #12) > We can't make any headway here until we have STR good enough for *everyone* > to be able to reproduce it, close to 100% of the time, starting from a clean > profile. My STR that happens 100% is: 1. Set 2nd screen as primary in OSX when it is connected 2. disconnect 2nd display 3. Resize firefox to be maximum on Laptop screen. I have 15" MBP with retina that is 2 1/2 years old 4. Close lib so laptop goes to sleep 5. connect 2nd display 6. Open lib so laptop wakes up. I regularly then see what I showed in comment 11 7. Refresh page so it becomes usuable again :/
Doesn't work for me. I assume there should be a step 0, "Start Firefox". I tested on OS X 10.7.5. What version did you test on?
Another question, David: Do you have OS X set to ask for a password when waking from sleep? I do (and I believe it's the default).
David, your STR doesn't work for me on OS X 10.10.2, either. For both tests I used a "Mid 2012" 15" Retina MacBook Pro (possibly exactly the same as what you have).
(In reply to Steven Michaud from comment #16) > Doesn't work for me. I assume there should be a step 0, "Start Firefox". That is definitely step 0 :) (In reply to Steven Michaud from comment #17) > Another question, David: > > Do you have OS X set to ask for a password when waking from sleep? I do > (and I believe it's the default). Yes I do (In reply to Steven Michaud from comment #18) > David, your STR doesn't work for me on OS X 10.10.2, either. > > For both tests I used a "Mid 2012" 15" Retina MacBook Pro (possibly exactly > the same as what you have). I am using OSX Software OS X 10.9.5 (13F34) System Version: OS X 10.9.5 (13F34) Kernel Version: Darwin 13.4.0 Boot Volume: Macintosh HD Boot Mode: Normal Computer Name: AutomatedTester User Name: dburns (dburns) Secure Virtual Memory: Enabled Time since boot: 4 days 6:31 The site that regularly shows this for me is github but I have seen it with about:home so don't think it's site specific.
> Time since boot: 4 days 6:31 Just for the fun of it, try rebooting your computer. I've seen all kinds of weird problems go away when people do this at my request. (For myself, I always turn my OS X client machines off overnight. I don't do this for servers, but frankly OS X is a lot flakier when used as a client (as most people use it).)
I restarted my machine, used it for a bit, put it to sleep overnight and then was able to reproduce it today by doing 0. Start firefox 1. Set 2nd screen as primary in OSX when it is connected 2. disconnect 2nd display 3. Resize firefox to be maximum on Laptop screen. I have 15" MBP with retina that is 2 1/2 years old 4. Close lib so laptop goes to sleep 5. connect 2nd display 6. Open lib so laptop wakes up. 7. cmd/crtl + T to load a new tab I got https://www.evernote.com/shard/s63/sh/eacfd3a7-201c-4e9d-b32b-1bbdddeabe34/1d2c8136ba3c3acdd1032aee60fdd8c4 when the new tab loaded. Screenshot has most details you might want
I just tried your STR on OS X 10.9.5 and it didn't "work" -- I didn't see the bug. I tested with Firefox 36.0.1 (the current release). I didn't first let my laptop sleep overnight. For obvious reasons including that step in your STR makes in unusable -- it may be necessary to exercise the STR a hundred or more times in order to figure out how to fix the bug or work around it.
This reproduces for me constantly. Resizing the window a single pixel is enough to fix it. I get this through various orders of the following operations: 1) plugging in non-hidpi monitor 2) closing lid 3) moving windows between screens When any of these three things happens, I'm likely to get a window that has a content area either four times too big or four times too small.
If you really can reproduce this so easily, please look for a regression range in mozilla-central nightlies.
John, can you do the bisect that Steven asked for?
Flags: needinfo?(jhford)
I can reliably reproduce this on my laptop and external monitor. Although the sizing is incorrect for just a flicker, the browser content immediately repaints to correct size. Most easily seen with about:home. - Move browser from laptop to external monitor: a larger than expected content flickers once. - Move browser from external monitor to laptop screen; a smaller than expected content flickers once. I'll bisect for a regression window.
Flags: needinfo?(twalker)
This has been around since at least Jan. 1, 2014. It doesn't appear to me to be e10s isolated, as I can reproduce (in variations) with current Nightly, current release and old Nightlies with e10s disabled. I noticed that at times (upon moving the browser from one screen to the other) it seems to flicker content from some other source, perhaps the cache? (probably should be noted I am running Nightly and release side by side)
Flags: needinfo?(twalker)
Tracy, don't bother to try to find a regression range for the temporary artifacts. They've been around since we starting supporting HiDPI mode. However, we really do need someone to try to find a regression range (or ranges) for the "permanent" artifacts (those which only disappear after a manually triggered refresh). This will, of course, need to be someone who can reproduce them.
(In reply to Brad Lassey [:blassey] (use needinfo?) from comment #25) > John, can you do the bisect that Steven asked for? I can't remember when this problem began... I think it's been there since I got a retina screen years ago. For me to get that range, I'd probably need to spend days trying to reproduce. The interesting thing to me is that any resizing event post-hidpi-switch, even a single pixel resize will fix the problem. The problem happens with switching both directions. It sounds like whatever is listening for an event to resize the content area is not getting the event, since a manual resize will fix the problem. If I knew how to hack on gecko, I'd look into it myself, but I don't really know how to.
Flags: needinfo?(jhford)
This reproduced again this morning. I was using my macbook with only the retina screen at home thing morning. I closed the lid, went to work and plugged in my monitor before unlocking the screen. Firefox was back on the non-hidpi monitor and with content at 1/4 scale but chrome at correct scale.
There's no need here for any more me-too comments. We know this is a real problem. But unless we get good STR (which seems very unlikely at this point), there's nothing we can do about it. So as I said in comment #13, we'll probably only be able to fix this bug by fixing the temporary glitches (at bug 962528). I'm currently the only Mozilla developer really qualified to work on that bug, and I won't have time for it for a while. It will be a major project (probably requiring several weeks of work). I intend to get to it within the next few months. When I do I'll be working on it with another Mozilla developer, as part of an effort to train someone up in my reverse engineering skills. My motivation is that I'll be retiring sometime this year :-)
Following the STR's in comment #11 I am able to reproduce this bug as reported. So I dug in for regression window finding. It turns out there are two regression windows. The first where we went from good working build of 20140212, which regressed the next day, 201404213, as a build when simply moving browser from external browser to the laptop screen causes the content to shrink (bug 978913). The pushlog for that regression window is: http://hg.mozilla.org/mozilla-central/pushloghtml?fromchange=802d87c77e76&tochange=a62bde1d6efe The behavior remains that way until the build of 20140524 when it begins displaying this bug as reported. The pushlog for this regression window is: http://hg.mozilla.org/mozilla-central/pushloghtml?fromchange=e9b2b72f4e6c&tochange=f2f81e83f4ff Fix bug 978913 jumps out at me here.
or could be? Kartikaya Gupta — Bug 1014034 - Use the root bounds to get the page size rather than scrollWidth/height which seem to not always work. r=Cwiiis Kartikaya Gupta — Bug 1014054 - Use the right screen size when computing the displayport margins. r=Cwiiis
The obvious thing to try next is to back out bug 978913 (and its followup bug 111957) in current trunk code, and test with that. Can you do that, Tracy, in a tryserver build? If not I'll do it. After that we can try backing out bug 1014034 and bug 1014054 on current trunk.
Steven, I don't know how to trigger a try server build with particular patches. But if you can do it and point me to the build, I'll test it.
Actually, before I do the tryserver build I have a question for you, Tracy: Did you test in e10s mode? If so try testing in non-e10s mode and see if that makes a difference.
I see bug with e10s on and with it turned off.
Then the trigger isn't bug 978913 (which only effects e10s mode). And bug 1014034 and bug 1014054 only effect Android. I'll pick over your regression ranges more carefully, and hopefully come up with other things to try.
> I see bug with e10s on and with it turned off. Do you see the same regression ranges with and without e10s?
Yes, same. But just to make sure, browser.tabs.remote is the config to flip, yes? Also, in your first comment in bug 978913, you say it can happen even in non-e10s windows due to bug 974616.
> Then the trigger isn't bug 978913 (which only effects e10s mode). I should have said that the patch for bug 978913 only effects e10s mode.
> But just to make sure, browser.tabs.remote is the config to flip, yes? This needs to be true. But for e10s mode to be used "automatically" (for each new window to default to being an e10s window), browser.tabs.remote.autostart also needs to be true. There's also a browser.tabs.remote.autostart.1 -- but I think that's only relevant for builds that have a way to turn e10s mode on and off in the UI (Preferences : General). Note that all this applies only to m-c nightlies. On other branches (like aurora, beta and release) there's also code that tries to prevent e10s mode from ever being used at all.
Ok, so yes, I've been correctly flipping the switch as needed. Sorry I can't help with any of the code analysis to sort out what to try next.
I looked again at your first regression range from comment #32, Tracy, and I don't see anything that stands out. So let me try, once again, to get decent STR for this bug. Please write out an extremely detailed description of your STR. Tell me what version of OS X you're running, and at least something about your hardware (for example is it a Retina MacBook Pro?). Make sure your STR works from a clean profile.
hmmm, I can't reproduce this in a completely fresh profile.
> hmmm, I can't reproduce this in a completely fresh profile. Then please try to figure out (if at all possible) which setting in your unclean profile allows you to trigger this bug.
We're at the end of the 37 Beta cycle. Although irritating, there is a simple workaround (manually resize the window) so I don't think this is critical for the release. I have marked this bug as wontfix for 37.
(In reply to [:tracy] Tracy Walker - QA Mentor from comment #45) > hmmm, I can't reproduce this in a completely fresh profile. Check that, I can actually reproduced this with a fresh profile on Latest Nightly. The critical step, for me to be able to reproduce this, is putting the browser in full screen mode after the system has moved the browser to the laptop screen when you disconnect the external monitor. (step #3)
When I say Fullscreen, I mean use the expand arrows in upper right corner of the browser, not the Mac green max window size button. my System info: MacBook Pro Retina, 15-inch, Late 2013 Processor 2.3 GHz Intel Core i7 Memory 16 GB 1600 MHz DDR3 Graphics NVIDIA GeForce GT 750M 2048 MB Software OS X 10.9.5 (13F34)
> step #3 Which comment does this refer to? Better still, please write out your full STR in detail.
Pretty much as in comment #11. But I'll spell out the STR's with a bit more detail. setup: - Modern MacBook Pro laptop and external monitor (I have 25" HP) - In System Prefs > Displays: -- Display: Both screens have "Best for display" selected. -- Arrangement: External monitor is directly above laptop screen. External display has the Menu Bar. Mirror Displays is not selected. - Have latest build of Nightly running with the browser window in the external monitor. I just run with about:home loaded in a single tab. STR's: 1. Disconnect the external monitor by removing HDMI cable from the Macbook port. 2. Wait for the browser to appear on Macbook display. 3. Then, resize Nightly to Full Screen mode (use expand arrows in upper right corner of browser window or shift+command+f) 4. Close the Macbook so it goes to sleep 5. Reconnect the external monitor by plugging the HDMI cable back into the external display port. 6. Open the Macbook so it wakes up and wait for Nightly to appear on the external monitor. tested results: The browser content is about 1/4th of the expected size and is located in the upper left corner of the content pane. note: sometimes, but less reliably than the full steps, after step 2, the content of about:home appears enlarged. expected results: Normal sized content.
Yes! Thanks to you, Tracy, I've now got working STR! As you said, it's crucial to go to fullscreen mode in step 3 (not just to "resize firefox to be maximum on Laptop screen", which must reasonably be interpreted as zooming up the Firefox browser window). I'll double-check your ranges from comment #32, and hopefully be able to find exactly which patches triggered those changes.
Interestingly, though, I can only reproduce in e10s mode.
Tracy, can you still reproduce in non-e10s mode? The fact that I can't means that I'm stuck once again. Your first range from comment #32 was also the range in which e10s support was first turned on as an option (bug 960783).
Flags: needinfo?(twalker)
Tracy, I find that your first range from comment #32 is invalid in e10s mode. In m-c builds before 2014-02-13 you need to explicitly set browser.tabs.remote and browser.tabs.remote.autostart to true to get e10s mode. When I do that I see the "content too small" bug in the 2014-02-12 m-c nightly (and m-c nightlies much earlier than that). I suspect that bug goes back to the earliest days of e10s support.
(In reply to Steven Michaud from comment #54) > Tracy, can you still reproduce in non-e10s mode? The fact that I can't > means that I'm stuck once again. Your first range from comment #32 was also > the range in which e10s support was first turned on as an option (bug > 960783). fwiw, I can reproduce with latest release channel firefox, which doesn't have e10s. I've also started to see content going to 4x normal size on the retina display.
I really need to be able to reproduce in non-e10s mode with m-c nightlies.
(In reply to Steven Michaud from comment #57) > I really need to be able to reproduce in non-e10s mode with m-c nightlies. Steven, if you need to reproduce in non-e10s mode to bisect with mozregression, you can use the "File > New non-e10s Window" menu item to open a non-e10s window without needing to change a pref or restart the browser.
Yes, but I need to be able to reproduce this bug in a non-e10s window running a mozilla-central nightly -- no matter how I get that window. I currently can't.
Sorry I haven't been paying attention to what's been going on in this bug for a bit. I didn't notice the flood of messages and it sounds like I could've saved some people some time. I'm turning my attention back to it now and expect to have a patch today. The issue is the asynchronous way we call nsPresContext::UIResolutionChangedInternal. The OS sends the viewDidChangeBackingProperties message before the resize but, since we handle it asynchronously (adding it to the back of the event queue), the UIResolutionChanged actually happens after the resize (i.e. TabParent::UpdateDimensions). So the TabChild reflows and redraws with the wrong scale. I think the best option is to recognize when this is happening in TabParent::UpdateDimensions and correct it right there.
I am unable to reliably reproduce in non-e10s mode.
Flags: needinfo?(twalker)
Attachment #8581735 - Flags: review?(bugs)
Comment on attachment 8581735 [details] [diff] [review] Detect stale display properties when resizing tabs So we'd send UIResolutionChange messages twice, once in TabParent::UpdateDimensions, and once in nsPresContext::UIResolutionChangedInternal(). Latter should be enough. Why isn't receiving UIResolutionChange once in TabChild enough? If the bug happens on non-e10s too, sounds like either we don't get UIResolutionChange even in the parent process when we should, or that AppUnitsPerDevPixelChanged() doesn't end up causing a new repaint.
Attachment #8581735 - Flags: review?(bugs) → review-
AppUnitsPerDevPixelChanged doesn't initiate a repaint. That would also fix the bug since we have correct display stats at that point. I'll look into finding a way to request repaint in AppUnitsPerDevPixelChanged.
Notes to self: The UIResolutionChange handler is repainting the screen. The tiny screen is the result. The issue is layer math. After the UpdateDimensions call but before the UIResolutionChange call, layers are resized to adapt to the new dimensions. Some telling Layer log info from this point: 1985741584[109d1c070]: Layer::Mutated(11b82b000) LayerBounds 1985741584[109d1c070]: Layer::Mutated(111b8b000) VisibleRegion was [] is [1649,0,1680,971] 1985741584[109d1c070]: Layer::Mutated(11b82b000) ClipRect was <none> is 0,0,1650,971 1985741584[109d1c070]: Layer::Mutated(11b82b000) VisibleRegion was [0,0,2880,1642] is [0,0,1650,971] 1985741584[109d1c070]: Layer::Mutated(11b82ac00) ContentFlags 1985741584[109d1c070]: Layer::Mutated(11b82ac00) VisibleRegion was [0,0,2880,1642] is [0,0,1680,971] What happened here is that the tab's visible region resized from 2880x1642 (2x hidpi coords for 2x hidpi display 1) to 1680x971 (lowdpi coords for lowdpi display 2). But the graphics system doesn't know that it is on a lowdpi display at this point - it still thinks its hidpi. When it gets the UIResolutionChange message, indicating a shift to lowdpi, it assumes the 1680x971 was for hidpi and dutifully scales it by 1/2 here: 1985741584[109d1c070]: Layer::Mutated(11b82b000) LayerBounds 1985741584[109d1c070]: Layer::Mutated(111b8b000) VisibleRegion was [1649,0,1680,971] is [824,0,840,486] 1985741584[109d1c070]: Layer::Mutated(11b82b000) ClipRect was <none> is 0,0,825,486 1985741584[109d1c070]: Layer::Mutated(11b82b000) VisibleRegion was [0,0,1650,971] is [0,0,825,486] 1985741584[109d1c070]: Layer::Mutated(11b82ac00) VisibleRegion was [0,0,1680,971] is [0,0,840,486] The original sin is the misinterpretation of the UpdateDimensions setting but there is logic to it. Instinct is to normalize the coordinates sent by UpdateDimensions (say, scaled by 1/display_scale) and rescale them in UpdateDimensions and UIResolutionChange based on the PuppetWidget's display scale. Currently, this fixes the issue but breaks everything else.
The assessment in comment 65 was valid and the bugs have been dealt with. With this patch, the display does an incorrect rendering after the UpdateDimensions call and then a correct rendering after the UIResolutionChanged call. This doesn't look too bad. Tests: https://treeherder.mozilla.org/#/jobs?repo=try&revision=85ce8df8c978
Attachment #8581735 - Attachment is obsolete: true
I prefer this patch. It uses app coordinates instead of 1x dpi coordinates so it avoids float math. Tests: https://treeherder.mozilla.org/#/jobs?repo=try&revision=968c2acd99a5
Attachment #8585767 - Attachment is obsolete: true
I should mention that the difference between the attachment in 67 and the one in 68 - that fixed the B2G failures - is mainly about AppUnitsPerDevPixel vs AppUnitsPerDevPixelAtUnitFullZoom.
(In reply to David Parks [:handyman] from comment #66) > The assessment in comment 65 was valid and the bugs have been dealt with. > With this patch, the display does an incorrect rendering after the > UpdateDimensions call and then a correct rendering after the > UIResolutionChanged call. This doesn't look too bad. Really? It sounds bad :-). What would it take to fix that glitch?
What I meant by 'not that bad' is that the behavior seems usually to be invisible -- pretty often, the display stays dark until the new layout is available (admittedly, this is true on my old Dell monitor and may not be true in general). I'm not sure why the nsPresContext::UIResolutionChanged calls are made asynchronously: https://mxr.mozilla.org/mozilla-central/source/layout/base/nsPresContext.cpp#1774 I suspect its for performance in the case where the browser is dragged between monitors. So making this synchronous would also fix this bug (without the glitch) but would probably break... something. The alternative is to adapt either TabChild::RecvUpdateDimensions or TabChild::RecvUIResolutionChanged to ID this case and handle it. I'll try this in UpdateDimensions but it will take some bookkeeping. The TabParent can remember the last backingScale value it gave the child and, if it doesn't match the value in the widget when the SendUpdateDimensions call is happening, it can send a boolean to the child telling it to invalidate its backingScale cache value. (Since the async UIResolutionChanged calls happen, I believe, on the same thread, we won't end up in a race condition.) I could send the value but the child requests that from the parent by itself when the cache is invalidated (and there are potentially other things that happen so I won't reinvent it). This is a little involved but it wouldn't be fragile. This may be a better implementation -- it should work even without the current patch. I'll sit on the checkin until you have a chance to chime in so let me know what you prefer.
Flags: needinfo?(roc)
Attached patch WIP: Alternative solution (obsolete) — Splinter Review
So... I decided to try for the alternative. Its probably the better solution. But its not perfect... This patch does what I suggested in the last comment, and it fixes the original issue (without any graphics glitch in the STR), but it still has an additional glitch when going from the external display back to the laptop. The laptop screen wakes up much faster (I dont know if this is relevant). My total guess as to what is happening is that the compositor is still running while the UpdateDimensions stuff is happening and the compositor blits an image from the ext display's form factor and scale... so on the laptop I see a small version of the screen in a big window before it is corrected. So I'd need to stop the compositor when the displayChanged message came in and restart it... sometime? I guess start it asynchronously once the child processed its UpdateDimesions call. Assuming thats possible. But this is jumping the gun... I dont know if any of that is the cause. At any rate, I'd probably bug that rather than fix it right away. So, roc... preference?
Comment on attachment 8587139 [details] [diff] [review] WIP: Alternative solution Review of attachment 8587139 [details] [diff] [review]: ----------------------------------------------------------------- How about combining the UpdateDimensions and UIResolutionChanged calls, and always pass the UI resolution along with the dimensions? Then the other thing we should do, to avoid obvious glitching, is to label the TabChild's layer tree with the UI resolution used to generate it, and in the compositor, scale it if necessary. That means, if the content process doesn't paint in time for whatever reason, we still render something reasonable.
(In reply to Robert O'Callahan (:roc) (Mozilla Corporation) from comment #73) > Comment on attachment 8587139 [details] [diff] [review] > WIP: Alternative solution > > Review of attachment 8587139 [details] [diff] [review]: > ----------------------------------------------------------------- > > How about combining the UpdateDimensions and UIResolutionChanged calls, and > always pass the UI resolution along with the dimensions? > > Then the other thing we should do, to avoid obvious glitching, is to label > the TabChild's layer tree with the UI resolution used to generate it, and in > the compositor, scale it if necessary. That means, if the content process > doesn't paint in time for whatever reason, we still render something > reasonable. This sounds like it adds a lot of complexity, how about we land this roughly as is and do that in a follow up?
Sure, feel free to land the patch I already r+ed.
Flags: needinfo?(roc)
Unfortunately, this is getting late for 38. I am going to mark it as wontfix for 38. However, if you think that David's patch is really low risk, we might reconsider this.
Comment on attachment 8587139 [details] [diff] [review] WIP: Alternative solution I'll obsolete this WIP patch and land the r+ed patch. I'll leave it to others to decide on submission for 38.
Attachment #8587139 - Attachment is obsolete: true
De-bitrot. r+ed at comment 69. Updated tests are here: https://treeherder.mozilla.org/#/jobs?repo=try&revision=df2c2249a643 I've filed a new bug for the extraneous resize: bug 1156339.
Keywords: checkin-needed
Hi, seems this failed to apply: adding 1125325 to series file renamed 1125325 -> extdisp.final2.patch applying extdisp.final2.patch patching file dom/ipc/TabChild.cpp Hunk #3 FAILED at 273 1 out of 10 hunks FAILED -- saving rejects to file dom/ipc/TabChild.cpp.rej patch failed, unable to continue (try -v) patch failed, rejects left in working dir errors during apply, please fix and refresh extdisp.final2.patch could you take a look, thanks!
Flags: needinfo?(davidp99)
Keywords: checkin-needed
This should do it...
Attachment #8586866 - Attachment is obsolete: true
Attachment #8594834 - Attachment is obsolete: true
Flags: needinfo?(davidp99)
Keywords: checkin-needed
Comment on attachment 8595458 [details] [diff] [review] Make TabParent/TabChild UpdateDimensions messages aware of the display scale (r+ed by roc) Review of attachment 8595458 [details] [diff] [review]: ----------------------------------------------------------------- A few drive-by comments from a cursory glance at this code, and I really hope you've tested this on b2g... ::: dom/ipc/TabChild.cpp @@ +3151,5 @@ > nsCOMPtr<nsIPresShell> presShell = document->GetShell(); > nsRefPtr<nsPresContext> presContext = presShell->GetPresContext(); > presContext->UIResolutionChanged(); > + > + ScreenIntSize devPixelSize = GetInnerSizeInDevPixels(); This doesn't make sense. If it's in layout device pixels, then use LayoutDeviceIntSize. ::: dom/ipc/TabParent.cpp @@ +941,5 @@ > + appPixelRect.ScaleRoundOut(appPerDev); > + appPixelSize = appPixelSize * appPerDev; > + } > + nsIntPoint chromeOffset = -LayoutDevicePixel::ToUntyped(GetChildProcessOffset()); > + unused << SendUpdateDimensions(appPixelRect, appPixelSize, mOrientation, chromeOffset); Why are you not using mChromeOffset here? Also you need to rebase on top of bug 1153023 on inbound, because this won't apply on that.
I've cleaned up the coordinate system use but a new sync issue has snuck into the code base that causes the viewport to get fubar the second time you change monitors. I'm looking into that now.
This deals with the incorrect use of coordinate system typedefs in general and kats' two concerns specifically (the first directly, the second was an unnecessary variable that resulted from an hg merge). It also deals with the new issue I reported in comment 82. The problem was that the nsPresContext was asynchronously invalidating the scale/dpi. This should be unnecessary in the TabChild::RecvUIResolutionChanged IPDL message handler. I now invalidate the values synchronously there. Tests: https://treeherder.mozilla.org/#/jobs?repo=try&revision=bc39e5a846bd
Attachment #8595458 - Attachment is obsolete: true
Comment on attachment 8597398 [details] [diff] [review] Make TabParent/TabChild UpdateDimensions messages aware of the display scale Tests look good. A quick check of B2G on Flame ran fine. And the coordinate systems should be lined up correctly.
Attachment #8597398 - Attachment description: Make TabParent/TabChild UpdateDimensions messages aware of the display scale (r+ed by roc) → Make TabParent/TabChild UpdateDimensions messages aware of the display scale
Attachment #8597398 - Flags: review?(bugmail.mozilla)
Comment on attachment 8597398 [details] [diff] [review] Make TabParent/TabChild UpdateDimensions messages aware of the display scale Review of attachment 8597398 [details] [diff] [review]: ----------------------------------------------------------------- Sorry for the delay, this was hard to review for me. Based on my gut feeling I would r- this patch, but honestly I don't know enough about the UpdateDimensions call and the units of the variables being passed around to definitively point to something as wrong. I've braindumped my thoughts below so you can address what you want and land with roc's r+ if you like. ::: dom/ipc/TabChild.cpp @@ +3216,5 @@ > + nsCOMPtr<nsIDocument> document(GetDocument()); > + nsIPresShell* presShell = document ? document->GetShell() : nullptr; > + nsPresContext* presContext = presShell ? presShell->GetPresContext() : nullptr; > + presContext = presContext ? presContext->GetDisplayRootPresContext() : presContext; > + return presContext ? presContext->DeviceContext()->AppUnitsPerDevPixelAtUnitFullZoom() : 1; You should probably MOZ_RELEASE_ASSERT things here so that you never actually fall through and return 1. If that ever happens then it's going to result in badness. ::: dom/ipc/TabChild.h @@ +221,5 @@ > + int32_t AppUnitsPerDevPixelAtUnitFullZoom(); > + > + ScreenIntSize GetInnerSizeInScreenUnits() { > + int32_t scale = AppUnitsPerDevPixelAtUnitFullZoom(); > + return ScreenIntSize(mInnerSize.width / scale, mInnerSize.height / scale); Not clear to me how you can convert from app units to ScreenPixels using AppUnitsPerDevPixelAtUnitFullZoom, because that converts from app units into a coordinate space that we haven't given a name. This needs some explanation. See my other comments later. Also given the function is returning a ScreenIntSize, the "InScreenUnits" part of the function name is redundant. I'd rather just have it as GetInnerSize(), and make sure that mInnerSize is a private variable so it can only be accessed via this getter. ::: dom/ipc/TabParent.cpp @@ +978,5 @@ > + int32_t appPerScreen = presContext->DeviceContext()->AppUnitsPerDevPixelAtUnitFullZoom(); > + appPixelRect.ScaleRoundOut(appPerScreen); > + appPixelSize = appPixelSize * appPerScreen; > + } > + unused << SendUpdateDimensions(appPixelRect, appPixelSize, mOrientation, chromeOffset); So a few things here: - For consistency, please stick with using either the member variables or the local variables. For example you use |mRect| but also |size| (as opposed to mDimensions). The SendUpdateDimensions call also uses |mOrientation| with |chromeOffset| - I would prefer either |orientation| or |mChromeOffset|. - If presContext is nullptr, then I think you should just return instead of sending an update dimensions call with what amounts to garbage values (they will be sent in one coordinate space and interpeted in a different one). - "appPixelRect" and "appPixelSize" are not great names. There is no such thing as an "appPixel" - there's various kinds of pixels, and there's app units. I would prefer the names "appUnitsRect" and "appUnitsSize". - Since you're converting to app units, the types should be nsRect and nsSize, because those store app units. The nsInt* types are for pixels (typically LayoutDevicePixels, but depends on the particular use). PBrowser.ipdl should be updated to use nsRect and nsSize as well. - It's not clear to me why you're using AppUnitsPerDevPixelAtUnitFullZoom() instead of just AppUnitsPerDevPixel() here. Do the rect/size values change when full-zoom is applied? If so, please add a comment to that effect. - In bug 1144940, dzbarsky changes the |rect| argument to this function from nsIntRect to a ScreenIntRect. If he's correct and the value is in ScreenPixels (quite possibly not the case) then you'll need to justify a little bit better why you can convert it to app units using AppUnitsPerDevPixelAtUnitFullZoom, because it's not clear to me. If you haven't taken a look at the documentation in layout/base/Units.h you might want to do that.
Attachment #8597398 - Flags: review?(bugmail.mozilla)
I will definitely re-ping roc in case he wants to refresh his r+ but first lets try to iron out a few things. The central problem is that we are updating data in the UpdateDimensions call that is combined with the data in the UIResolutionChanged call. The algebra of the patch works by separating the information in the UpdateDimensions message. In UIResolutionChanged, we update the scale (X) and in UpdateDimensions, we were updating the *scaled* display size (X*Y). During a period where we’ve updated X*Y without updating X, some calculations do ‘Y/X’ to get Y but they are using the wrong X. At its core, the change just passes Y instead of X*Y, which it computes using the cached X. So e.g. we were passing ScreenIntSize (as dzbarsky wrote) and I’ve changed it to app units. There were a few ways that this could be represented. I chose app units because they are widget-scale-agnostic but, rereading the coordinate stuff, I might have been able to use LayoutDevicePixel units. However, they are supposed to be widget-scale-sensitive [1]. So I went with app units. Since the app units describe the screen dimensions with no scale or zoom, AppUnitsPerDevPixelAtUnitFullZoom seemed like the right way to do the conversion. Additionally, AppUnitsPerDevPixel fails here — it’s readily apparent on B2G. We do use this function for screen coords (for example, Event::GetScreenCoords [2]). Let me know if there is a better way. The rest of your comments seem cosmetic and should be easy enough to fix. I'll put together a new patch if this sounds acceptable. [1] https://mxr.mozilla.org/mozilla-central/source/layout/base/Units.h#230 [2] https://mxr.mozilla.org/mozilla-central/source/dom/events/Event.cpp#907
Flags: needinfo?(bugmail.mozilla)
Attached image Different widget areas
Most of what you say makes sense. However my understanding of the widget-world coordinate systems isn't complete enough to convince myself that the value being passed in to UpdateDimensions is actually in ScreenPixels, and that it's reasonable to turn it into app units by using AppUnitsPerDevPixelAtUnitFullZoom. I looked at the GetWindowDimensions function that provides the rect that's passed to UpdateDimensions but I don't know what nsIBaseWindow actually represents and what coordinate system it's GetPosition/Size values are in. I'm attaching a picture that shows what my mental model is. Can you tell me what the UpdateDimensions rect would correspond to in this picture?
Flags: needinfo?(bugmail.mozilla)
The rect in UpdateDimensions (currently) represents the widget's screen location and size, scaled by the display device-scale. The whole widget. So zoom isn't relevant to it. The value of GetWindowDimensions should therefore not be affected by any zoom (content, chrome, whatever). The PuppetWidget's position/size therefore exactly reflects the OS's widget. It just considers the browser chrome to be part of the 'non-client' region (which normally is the region where the OS puts window decorations). This stuff is key for things like Event::GetScreenCoordinates. So, on my retina MBP, the screen is 1440x900 in unscaled units and 2880x1800 in scaled units. UpdateDimensions's rect (in fullscreen) is therefore 2880x1800. The size parameter (poorly named) reflects what I've been referring to as the content area (aka "???" in your picture). Does that help?
Flags: needinfo?(bugmail.mozilla)
Thanks, that helps too. So I'm reasonably convinced now that there are issues with the code but they only occur in scenarios that we don't care about right now. Specifically if the root presshell on the TabParent side has a resolution set on it, I think there will be problems because that's when the LayoutDevicePixels don't equal the ScreenPixels. However as far as I know that's not something that will happen until either we allow pinch-zooming the entire browser chrome (unlikely) or nested content processes in B2G finally is enabled (which has been in the works but AFAIK is stalled right now). Also if the root presShell does have a resolution, then a lot of other stuff will break too so I don't think it's a problem if this is broken too, it won't even be noticeable until we clean up the mountain of other stuff. For example the cast from LayoutDevice to Screen pixels at [1] (which is where the size parameter appears to be coming from) probably needs to take into account the resolution too. Just one more question for now: At [2] when we add the client offset, don't we need to truncate the width/height of the rect by the same amount? Otherwise the rect will "leak" outside the widget area. The only remaining case that I'm slightly worried about is if the root presshell in the child process has a resolution set. So for example if you go into the B2G browser, load a page, and zoom in/out. Rotating the device should then also trigger UpdateDimensions calls, and if the screenX/screenY coordinates of events all come out correctly in those scenarios (or at least no differently than without the patch) then I'm fine with landing this. You can use my test page at http://people.mozilla.org/~kgupta/grid.html to check this (it will log touch events to logcat). Thanks for being so patient and helping me understand how this stuff works! [1] http://mxr.mozilla.org/mozilla-central/source/layout/generic/nsSubDocumentFrame.cpp?rev=a8963c3c2c56#289 [2] http://mxr.mozilla.org/mozilla-central/source/dom/ipc/TabParent.cpp?rev=a8963c3c2c56#951
Flags: needinfo?(bugmail.mozilla)
(In reply to Kartikaya Gupta (email:kats@mozilla.com) from comment #89) > Thanks, that helps too. So I'm reasonably convinced now that there are > issues with the code but they only occur in scenarios that we don't care > about right now. Specifically if the root presshell on the TabParent side > has a resolution set on it, I think there will be problems because that's > when the LayoutDevicePixels don't equal the ScreenPixels. OK, this is about to get hairy... What you say about the size in the presshell's dimensions is right but it actually is the *cause* of this issue and the reason there is still the minor issue of an incorrect resize before the correct resize is actually done (i.e. we still resize twice and the first one is wrong). During that period, the presshell has the right dimensions but the wrong scale (so, the flip of what you said, but really the same issue). This is laid out with data in comment 65. It might be most clearly shows by example: Legend: r1/r2 - window rect before the first/after the final reflow, respectively s1/s2 - window display scale before the first/after the final reflow, respectively Currently (buggy version -- sounds like all of this is already clear): 1. UpdateDimensions sends r2*s2 (new rect/scale) 1a. A reflow is initiated that sizes the widget to r2*s2. The logic thinks its doing r2*s1. 2. UIResolutionChanged invalidates s1 3. UIResolutionChanged synchronously fetches s2 3a. A reflow is initiated that sizes the window to r2*s2*(s2/s1) == r2*s2^2*s1. This is wrong. With patch: 1. UpdateDimensions sends r2 (new rect) 1a. A reflow is initiated that sizes the widget to r2*s1. The logic thinks its doing r2*s1... and its right. 2. UIResolutionChanged invalidates s1 3. UIResolutionChanged synchronously fetches s2 3a. A reflow is initiated that sizes the window to r2*s1*(s2/s1) == r2*s2. Joy! So, we *do* hit the case you mention in step 1a... but its not a big deal. As long as the logic is consistent with the math (and the final reflow happens in a timely manner), we get "eventual consistency". "Actual consistency" is the bug I filed in comment 78 (bug 1156339). I haven't done it yet but I'll look at your B2G case before landing.
I think the "window display scale" you're referring to is different from the "resolution" I was referring to. The thing I was talking about is this thing: http://mxr.mozilla.org/mozilla-central/source/layout/base/nsIPresShell.h?rev=d47f66ce3822#1375 which is different from the BackingScaleFactor() thing that drives the UIResolutionChanged notification.
Yes, I was confused - I thought you meant the rect of the view in the presshell. I've not encountered the resolution property before. I'll keep an eye out for it when I look at B2G again.
> So for example if you > go into the B2G browser, load a page, and zoom in/out. Rotating the device > should then also trigger UpdateDimensions calls, and if the screenX/screenY > coordinates of events all come out correctly in those scenarios (or at least > no differently than without the patch) then I'm fine with landing this. You > can use my test page at http://people.mozilla.org/~kgupta/grid.html to check > this (it will log touch events to logcat). I was expecting the logged screen coordinates *not* to scale with the zoom but they did... then I tried without this patch and they show the same behavior (they line up with the grid, modulo the titlebar, regardless of zoom). The behavior was the same with various combinations of zooming and rotating. This was on Flame. I'll make the rest of kats' changes and ping roc to refresh the review.
Includes changes suggested by kats. roc, this is just to give you the opportunity to re-review since your earlier r+. The logic of the bug hasn't changed -- but I've made a number of changes to the unit-types of the rect/size used (and the functions used to cast between them). Tests: https://treeherder.mozilla.org/#/jobs?repo=try&revision=c94c73d7e0fa
Attachment #8597398 - Attachment is obsolete: true
Attachment #8600060 - Flags: review?(roc)
Comment on attachment 8600060 [details] [diff] [review] Make TabParent/TabChild UpdateDimensions messages aware of the display scale Review of attachment 8600060 [details] [diff] [review]: ----------------------------------------------------------------- Kats has thought about this a lot more than I have :-)
Attachment #8600060 - Flags: review?(roc) → review?(bugmail.mozilla)
Comment on attachment 8600060 [details] [diff] [review] Make TabParent/TabChild UpdateDimensions messages aware of the display scale Review of attachment 8600060 [details] [diff] [review]: ----------------------------------------------------------------- ::: dom/ipc/TabChild.cpp @@ +3237,5 @@ > + nsIPresShell* presShell = document->GetShell(); > + MOZ_RELEASE_ASSERT(presShell); > + nsPresContext* presContext = presShell->GetPresContext(); > + MOZ_RELEASE_ASSERT(presContext); > + presContext = presContext->GetDisplayRootPresContext() ? nit: trailing whitespace
Attachment #8600060 - Flags: review?(bugmail.mozilla) → review+
Blocks: 1096550
Kicks... to the face. The issue addressed now is that the code was not non-e10s only so I hadn't run enough tests. Remote PBrowsers in non-e10s code were failing as they were not found by nsContentUtils::CallOnAllRemoteChildren. On smaug's recommendation, I've added the set of TabParents to the top-level window of their top-level document. I've also changed CallOnAllRemoteChildren to iterate over that set instead of TabParents. This patch basically covers this half of the bug. smaug, we had conjectured that the Tabs could attach to the top-level win on construction and then we'd be done but we forgot about dragging tabs between windows. Since dragging tabs changes the top-level window, I changed to register/unregister when the Tab's nsIContent changes. Tests are coming here: https://treeherder.mozilla.org/#/jobs?repo=try&revision=e46d05b42023 FYI, as tests come in, an earlier WIP test shows this approach should fix the issues: https://treeherder.mozilla.org/#/jobs?repo=try&revision=e74cf1a3238b
Attachment #8600060 - Attachment is obsolete: true
Attachment #8602206 - Attachment is obsolete: true
Attachment #8604220 - Flags: review?(bugs)
This is the second half of the patch from the previous comment -- this is the same principle as the previous version but I had to change the units so I went back to the version I had in comment 66 before I had a stroke of geniustupid in comment 67. kats, much of what we discussed was about the coordinates used to communicate between TabParent and TabChild for UpdateDimensions. Before comment 67, I was simply dividing the content scale out of the dimensions... which doesn't reflect units we use but is what Apple calls "Points". This has exactly the same algebraic properties we needed before but is simpler -- it just involves the dimensions and that scale value. The rest of the behavior is the same. (Most of the other patch is extraneous to this part of the problem but that patch does have some of the relevant TabParent stuff.)
Attachment #8604225 - Flags: review?(bugmail.mozilla)
oops -- needed to de-bitrot
Attachment #8604220 - Attachment is obsolete: true
Attachment #8604220 - Flags: review?(bugs)
Attachment #8604286 - Flags: review?(bugs)
Attachment #8604225 - Attachment is obsolete: true
Attachment #8604225 - Flags: review?(bugmail.mozilla)
Attachment #8604288 - Flags: review?(bugmail.mozilla)
Attachment #8604286 - Attachment description: 1. Make TabParent/TabChild UpdateDimensions messages aware of the display scale → 1. Store TabParents with their root window
Comment on attachment 8604286 [details] [diff] [review] 1. Store TabParents with their root window Review of attachment 8604286 [details] [diff] [review]: ----------------------------------------------------------------- ::: dom/ipc/TabParent.cpp @@ +1000,5 @@ > + } > + nsRect normalizedRect(mRect.x, mRect.y, mRect.width, mRect.height); > + normalizedRect.ScaleInverseRoundOut(widgetScale); > + nsSize normalizedSize(static_cast<double>(mDimensions.width) / widgetScale, > + static_cast<double>(mDimensions.height) / widgetScale); This is wrong. mRect and mDimensions are in ScreenPixels (which here are equivalent to LayoutDevicePixels) and widget->GetDefaultScale is a CSSToLayoutDeviceScale. So "normalizedRect" and "normalizedSize" are in CSSPixels and should not be stored in nsRect/nsSize (which are for app units only). Please rewrite this like so: CSSToLayoutDeviceScale widgetScale; if (widget) { widgetScale = widget->GetDefaultScale(); } CSSRect normalizedRect = ViewAs<LayoutDevicePixel>(mRect) / widgetScale; CSSSize normalizedSize = ViewAs<LayoutDevicePixel>(mDimensions) / widgetScale; I'm not a huge fan of "normalizedRect" and "normalizedSize" either but whatever. And shouldn't this hunk be in the part 2 patch?
Comment on attachment 8604288 [details] [diff] [review] 2. Make TabParent/TabChild UpdateDimensions messages aware of the display scale Review of attachment 8604288 [details] [diff] [review]: ----------------------------------------------------------------- The good news is that none of my suggested changes should actually change the mathematics of the values flowing around, they just updated variables to have the right types :) I'd like to see the updated patch with the changes so minusing for now. ::: dom/ipc/PBrowser.ipdl @@ +44,5 @@ > using class mozilla::WidgetMouseEvent from "ipc/nsGUIEventIPC.h"; > using class mozilla::WidgetWheelEvent from "ipc/nsGUIEventIPC.h"; > using class mozilla::WidgetDragEvent from "ipc/nsGUIEventIPC.h"; > using struct nsRect from "nsRect.h"; > +using struct nsSize from "nsSize.h"; Won't need this @@ +544,5 @@ > LoadURL(nsCString uri, BrowserConfiguration config); > > CacheFileDescriptor(nsString path, FileDescriptor fd); > > + UpdateDimensions(nsRect rect, nsSize size, ScreenOrientation orientation, Based on the changes in part 1, these are CSSRect and CSSSize ::: dom/ipc/TabChild.h @@ +320,5 @@ > const uint64_t& aLayersId, > PRenderFrameChild* aRenderFrame, > const bool& aParentIsActive) override; > + virtual bool RecvUpdateDimensions(const nsRect& rect, > + const nsSize& size, CSSRect, CSSSize @@ +502,5 @@ > } > > + virtual ScreenIntSize GetInnerSize() { > + float scale = mWidget->GetDefaultScale().scale; > + return ScreenIntSize(mNormalizedInnerSize.width * scale, mNormalizedInnerSize.height * scale); Same changes here as what I say for GetOuterRect below @@ +596,5 @@ > void SetTabId(const TabId& aTabId); > > + ScreenIntRect GetOuterRect() { > + nsIntRect rect = mNormalizedOuterRect.ToNearestPixels(mWidget->GetDefaultScale().scale); > + return ScreenIntRect::FromUnknownRect(rect); LayoutDeviceIntRect outerRect = RoundedToInt(mNormalizedOuterRect * mWidget->GetDefaultScale()); return ViewAs<ScreenPixel>(outerRect, PixelCastJustification::LayoutDeviceIsScreenForOuter); (You'll need to add the LayoutDeviceIsScreenForOuter value to the PixelCastJustfication enum) @@ +599,5 @@ > + nsIntRect rect = mNormalizedOuterRect.ToNearestPixels(mWidget->GetDefaultScale().scale); > + return ScreenIntRect::FromUnknownRect(rect); > + } > + > + void SetNormalizedInnerSize(const nsSize& size) { CSSSize @@ +615,5 @@ > RenderFrameChild* mRemoteFrame; > nsRefPtr<nsIContentChild> mManager; > uint32_t mChromeFlags; > uint64_t mLayersId; > + nsRect mNormalizedOuterRect; CSSRect @@ +649,5 @@ > float mDPI; > double mDefaultScale; > bool mIPCOpen; > bool mParentIsActive; > + nsSize mNormalizedInnerSize; CSSSize ::: gfx/ipc/GfxMessageUtils.h @@ +445,5 @@ > > +template<> > +struct ParamTraits<nsSize> > +{ > + typedef nsSize paramType; Won't need this any more
Attachment #8604288 - Flags: review?(bugmail.mozilla) → review-
I haven't made kats' changes yet (they don't look controversial) -- I've been dealing with the orange that showed up in the tests. Good news is that the orange has been dealt with -- tests for these two patches are in: https://treeherder.mozilla.org/#/jobs?repo=try&revision=7e7bc7c7ccc9 Bad news is that I had to undo the change to nsContentUtils as the iteration was happening over some unwanted elements, causing new use-after-destroy actor bugs (not a use-after-free memory bug). Restricting the TabParent change that smaug proposed to the nsPresContext routine instead turns us back to green.
Attachment #8604286 - Attachment is obsolete: true
Attachment #8604288 - Attachment is obsolete: true
Attachment #8604286 - Flags: review?(bugs)
In addition to all of the basic changes: (In reply to Kartikaya Gupta (email:kats@mozilla.com) from comment #106) > Comment on attachment 8604286 [details] [diff] [review] > 1. Store TabParents with their root window > > Review of attachment 8604286 [details] [diff] [review]: > ----------------------------------------------------------------- > Please rewrite this like so: > > CSSToLayoutDeviceScale widgetScale; > if (widget) { > widgetScale = widget->GetDefaultScale(); > } > CSSRect normalizedRect = ViewAs<LayoutDevicePixel>(mRect) / widgetScale; > CSSSize normalizedSize = ViewAs<LayoutDevicePixel>(mDimensions) / > widgetScale; I went a little wordier and used the PixelCastJustification I've switched the units. > And shouldn't this hunk be in the part 2 patch? Indeed. Fixed.
Attachment #8604690 - Attachment is obsolete: true
Attachment #8606572 - Flags: review?(bugmail.mozilla)
The comments from the old patch (comment 101) are still valid: > smaug, we had conjectured that the Tabs could attach to the top-level win on > construction and then we'd be done but we forgot about dragging tabs between > windows. Since dragging tabs changes the top-level window, I changed to > register/unregister when the Tab's nsIContent changes. Additionally, I had to add the line in TabParent::UIResolutionChanged for tests. I ran this past mconley, who wrote the original behavior, and he says it shouldn't break any contracts -- the only way this could create unexpected behavior is if we invalidate a tab's resolution for a widget change before changing the tab's widget, which would be odd. Tests (with both patches applied): https://treeherder.mozilla.org/#/jobs?repo=try&revision=586b940296f5
Attachment #8604689 - Attachment is obsolete: true
Attachment #8606574 - Flags: review?(bugs)
Comment on attachment 8606572 [details] [diff] [review] 1. Make TabParent/TabChild UpdateDimensions messages aware of the display scale Review of attachment 8606572 [details] [diff] [review]: ----------------------------------------------------------------- LGTM ::: dom/ipc/TabChild.cpp @@ +860,5 @@ > , mRemoteFrame(nullptr) > , mManager(aManager) > , mChromeFlags(aChromeFlags) > , mLayersId(0) > + , mUnscaledOuterRect(0, 0, 0, 0) Technically not needed since CSSRect gets initialized to zeros anyway @@ +878,5 @@ > , mDPI(0) > , mDefaultScale(0) > , mIPCOpen(true) > , mParentIsActive(false) > + , mUnscaledInnerSize(0, 0) Ditto ::: dom/ipc/TabChild.h @@ +594,5 @@ > void SetTabId(const TabId& aTabId); > > + ScreenIntRect GetOuterRect(); > + > + void SetUnscaledInnerSize(const CSSSize& size) { s/size/aSize/
Attachment #8606572 - Flags: review?(bugmail.mozilla) → review+
(In reply to David Parks [:handyman] from comment #111) > 2. Store TabParents with their root window WindowRoot, not root window.
Comment on attachment 8606574 [details] [diff] [review] 2. Store TabParents with their root window >exporting patch: ># HG changeset patch ># User David Parks <davidp99@gmail.com> ># Date 1431545429 25200 ># Wed May 13 12:30:29 2015 -0700 ># Node ID e3c821fd5a6117b606c7a958705c8c08333f741a ># Parent 40863f35a1f48b8fdd83e8a17adcc9e369597855 >Bug 1125325 - Store TabParents with their root window > >nsContentUtils::CallOnAllRemoteChildren calls a callback on all tabs >connected to a given window but it has only worked in Firefox e10s tabs. >This patch adds a list of (weak) references to each top-level document's >top-level window so that e.g. the nsPresContext can access them instead of >using nsContentUtils. not top-level window, but WindowRoot. Very different object. >+namespace dom { >+class TabParent; >+} >+} >+ >+// A set of weak references to dom::TabParents >+typedef std::set<nsWeakPtr> WeakTabParents; Please no. We want O(1) access here. nsTHashtable<nsRefPtrHashKey<nsIWeakReference>> might work. >+nsWindowRoot::AddBrowser(mozilla::dom::TabParent* browser) { aBrowser and { goes to its worn line >+void >+nsWindowRoot::RemoveBrowser(mozilla::dom::TabParent* browser) { ditto >+ const WeakTabParents GetRegisteredBrowsers() { { to its own line >+static already_AddRefed<nsPIWindowRoot> >+GetTopLevelDocumentWindow(nsIDocument* doc) aDoc And the method name is wrong. It is about WindowRoot, not Window >+ while (doc->GetParentDocument()) { >+ doc = doc->GetParentDocument(); >+ } Why you need this loop? win->GetTopWindowRoot() should work just fine. >+static already_AddRefed<nsPIWindowRoot> >+GetTopLevelDocumentWindow(nsIDocument* doc) aDoc >+{ >+ if (!doc) { >+ return nullptr; >+ } >+ while (doc->GetParentDocument()) { >+ doc = doc->GetParentDocument(); >+ } >+ nsCOMPtr<nsPIDOMWindow> win = doc->GetWindow(); >+ return win ? win->GetTopWindowRoot() : nullptr; >+} ... but you have exactly the same method already in TabParent.cpp. Please add this kind of helper methods to nsContentUtils
Attachment #8606574 - Flags: review?(bugs) → review-
Includes kats requested changes.
Attachment #8606572 - Attachment is obsolete: true
Includes the stuff from review in comment 114. No big surprises here. Tests (both patches): https://treeherder.mozilla.org/#/jobs?repo=try&revision=8183c19bb372
Attachment #8606574 - Attachment is obsolete: true
Attachment #8611540 - Flags: review?(bugs)
Comment on attachment 8611540 [details] [diff] [review] 2. Store TabParents with their WindowRoot >+already_AddRefed<nsPIWindowRoot> >+nsContentUtils::GetWindowRoot(nsIDocument* aDoc) >+{ >+ while (aDoc) { >+ nsCOMPtr<nsPIDOMWindow> win = aDoc->GetWindow(); >+ if (win) { >+ return win->GetTopWindowRoot(); >+ } >+ aDoc = aDoc->GetParentDocument(); >+ } Actually, if (aDoc) { nsPIDOMWindow* win = aDoc->GetWindow(); if (win) { return win->GetTopWindowRoot(); } } return nullptr; should be enough. > #define NS_IWINDOWROOT_IID \ > { 0x728a2682, 0x55c0, 0x4860, \ > { 0x82, 0x6b, 0x0c, 0x30, 0x0a, 0xac, 0xaa, 0x60 } } Update this IID >+ typedef void (*BrowserEnumerator)(mozilla::dom::TabParent *aTab, void *aArg); >+ >+ // Enumerate all stored browsers that for which the weak reference is valid. >+ virtual void EnumerateBrowsers(BrowserEnumerator aEnumFunc, void *aArg) = 0; * goes with the type, not with argument name Same also elsewhere. >+static PLDHashOperator >+WeakBrowserEnumFunc(nsRefPtrHashKey<nsIWeakReference> *aKey, void *aArg) >+{ >+ WeakBrowserCallback* callback = static_cast<WeakBrowserCallback*>(aArg); >+ nsCOMPtr<nsITabParent> opener(do_QueryReferent((*aKey).GetKey())); opener? >+ TabParent* tab = TabParent::GetFrom(opener); >+ if (tab) { >+ callback->mUserFunc(tab, callback->mUserArg); >+ } >+ return PL_DHASH_NEXT; >+} >+ >+void >+nsWindowRoot::EnumerateBrowsers(BrowserEnumerator aEnumFunc, void *aArg) >+{ >+ WeakBrowserCallback callback; >+ callback.mUserFunc = aEnumFunc; >+ callback.mUserArg = aArg; >+ mWeakBrowsers.EnumerateEntries(WeakBrowserEnumFunc, &callback); I think this could would be a bit simpler and safer if you collected TabBrowsers to nsTArray<nsRefPtr<TabParent>> tabParents; using EnumerateEntries() static PLDHashOperator WeakBrowserEnumFunc(nsRefPtrHashKey<nsIWeakReference>* aKey, void* aArg) { nsTArray<nsRefPtr<TabParent>>* tabParents = static_cast<nsTArray<nsRefPtr<TabParent>>*>(aArgs); nsCOMPtr<nsITabParent> tabParent(do_QueryReferent((*aKey).GetKey())); if (tabParent) { tabParents->AppendElement(tabParent); } } nsTArray<nsRefPtr<TabParent>> tabParents; mWeakBrowsers.EnumerateEntries(WeakBrowserEnumFunc, &tabParent); and then just for (var i = 0; i < tabParents.Length(); ++i) { aEnumFunc(tabParents[i], aArg); } This way it would be ok for aEnumFunc to end up causing changes to mWeakBrowsers (for example to remove TabParent) You could then drop struct WeakBrowserCallback too. Sure, it is O(2n) vs O(n), but I don't think that is an issue. With those changes r+. (if you think the change to enumeration needs a new review, feel free to ask such)
Attachment #8611540 - Flags: review?(bugs) → review+
If this lands soon in m-c, let's verify the fix in nightly and uplift it to aurora. David when that's the case can you request upplift? Depending on how that goes we might also want to uplift to beta.
Flags: qe-verify+
Flags: needinfo?(florin.mezei)
Originally r+ed in comment 118. Includes smaug's requested changes. (In reply to Liz Henry (:lizzard) from comment #119) > If this lands soon in m-c, let's verify the fix in nightly and uplift it to > aurora. David when that's the case can you request upplift? Sure thing, Liz. (In reply to Olli Pettay [:smaug] from comment #118) > Comment on attachment 8611540 [details] [diff] [review] > 2. Store TabParents with their WindowRoot > > (if you think the change to enumeration needs a new review, feel free to ask > such) Eh, it was basically cutting and pasting from your review. I'm just going to check it in. Tests: https://treeherder.mozilla.org/#/jobs?repo=try&revision=321463ea63b4
Attachment #8611540 - Attachment is obsolete: true
Keywords: checkin-needed
Hi, this patch failed to apply: patching file dom/ipc/TabChild.cpp Hunk #1 FAILED at 234 1 out of 2 hunks FAILED -- saving rejects to file dom/ipc/TabChild.cpp.rej could you take a look, thanks!
Flags: needinfo?(davidp99)
Keywords: checkin-needed
de-bitrot and try again...
Attachment #8611533 - Attachment is obsolete: true
Flags: needinfo?(davidp99)
de-bitrot
Attachment #8614858 - Attachment is obsolete: true
Keywords: checkin-needed
Quoting part 1: >+++ b/dom/ipc/TabChild.h > class TabChild final : public TabChildBase, [...] >+ virtual ScreenIntSize GetInnerSize(); >+ This declaration was missing an 'override' annotation, which causes clang 3.6 & newer to spam a "-Winconsistent-missing-override" build warning, which busts --enable-warnings-as-errors builds (with clang 3.6+). (TabChild's new GetInnerSize method overrides a pure virtual method of the same name, in TabChildBase, added elsewhere in this patch.) Quoting part 2: >+ // Stores a weak reference to the browser. >+ virtual void AddBrowser(mozilla::dom::TabParent* aBrowser) = 0; >+ virtual void RemoveBrowser(mozilla::dom::TabParent* aBrowser) = 0; [...] >+ virtual void EnumerateBrowsers(BrowserEnumerator aEnumFunc, void* aArg) = 0; [...] >+ virtual void AddBrowser(mozilla::dom::TabParent* aBrowser); >+ virtual void RemoveBrowser(mozilla::dom::TabParent* aBrowser); >+ virtual void EnumerateBrowsers(BrowserEnumerator aEnumFunc, void *aArg); These were missing 'override' as well (in nsWindowRoot, overriding the new pure virtual versions in superclass nsPIWindowRoot). I pushed a followup to add the 'override' keyword, with blanket r+ that ehsan granted me for fixes of this sort over in bug 1126447 comment 2: https://hg.mozilla.org/integration/mozilla-inbound/rev/706987998e8e
Blocks: 1173224
Status: RESOLVED → REOPENED
Resolution: FIXED → ---
I can reproduce bug 1173224 on Aries with the patches reapplied on master. I'm investigating.
So the problem is that sometimes when SendUpdateDimensions is called on the TabParent, the GetWidget() returns null, and so we just use 1 for the widget scale. This ends up sending bad values over the pipe to the child. I later see the right values flowing through again, but it seems like the damage is done and the TabChild lays out the keyboard based on the bad values that came through earlier. So there might be a couple of bugs here; one is the fact that we're sending over bad values, and the other is that the child process doesn't relayout when the transiently-bad values are corrected to good values. I can write a simple patch to fix the first issue and assuming everything is green/it fixes this bug I think we should land it. I don't know how involved it will be to fix the second issue.
Comment on attachment 8621730 [details] [diff] [review] 4. Fix for sending over bad data when widget is null It is totally bizarre state to not have widget. Do you know when that happens? Sounds like a bug elsewhere. Perhaps add NS_WARNING to if (!widget) But I guess we can take this anyhow.
Attachment #8621730 - Flags: review?(bugs) → review+
Comment on attachment 8621730 [details] [diff] [review] 4. Fix for sending over bad data when widget is null > the child > process doesn't relayout when the transiently-bad values are corrected to > good values. This could be an issue with the HasValidInnerSize() flag, although I was never clear on the reason for that initialization case (size == 0,0) either. There is special handling for both the null TabParent widget case and the size = 0,0 case -- if the point of still making the RPC call in those cases is to do some early initialization then maybe they should be conflated... ie send size=0,0 when the TabParent's widget is null, thereby not setting HasValidInnerSize, which, objectively, it does not. But thats just a brainstorm. If cutting it out as done in this patch works, that's even better.
Attachment #8621730 - Flags: review?(davidp99) → feedback+
(In reply to Olli Pettay [:smaug] > It is totally bizarre state to not have widget. Do you know when that > happens? Not really sure. Seems to happen during startup of the keyboard process. > Sounds like a bug elsewhere. > Perhaps add NS_WARNING to if (!widget) Added NS_WARNING. (In reply to David Parks [:handyman] from comment #135) > This could be an issue with the HasValidInnerSize() flag, although I was > never clear on the reason for that initialization case (size == 0,0) either. > There is special handling for both the null TabParent widget case and the > size = 0,0 case -- if the point of still making the RPC call in those cases > is to do some early initialization then maybe they should be conflated... ie > send size=0,0 when the TabParent's widget is null, thereby not setting > HasValidInnerSize, which, objectively, it does not. > > But thats just a brainstorm. If cutting it out as done in this patch works, > that's even better. Yeah I'm not really sure. I just went with the most straightforward fix that got the job done.
Depends on: 1175631
Tracking this for 40+. This might be good to uplift to aurora. Wontfix for 39 as I think this is too big of a change and not crucial enough fix to land in the last beta cycle before release.
FWIW I think this is a pretty high-risk change and would be strongly opposed to uplifting it. It's already been backed out multiple times and may very well be the cause of other regressions that have cropped up recently.
I was able to reliably reproduce the original issue on a MacBook Pro Retina, 15-inch, Late 2013, with an external monitor, using Nightly from 2015-05-25, and the following steps: 1. Have the external monitor disconnected from the MacBook. 2. Start Nightly and leave just the default about:home tab open. 3. Resize Nightly to Full Screen mode (use expand arrows in upper right corner of browser window or shift+command+f). 4. Connect the external monitor by plugging the HDMI cable into the external display port. 5. Once the external monitor is connected, close the MacBook's lid -> Nightly is moved to the external monitor and resizes incorrectly showing about 1/4 of the actual page. 6. Open the MacBook's lid again -> Nightly is moved back to the MacBook screen, but the page is still incorrectly resized. I was able to reproduce the above issue only with e10s enabled, and was able to verify the fix (with e10s enabled) on latest Nightly 41 (BuildID=20150618134629). I see the temporary resizing animation on various pages, but the pages are never stuck displaying at incorrect size. Since I am not able to reproduce in non-e10s mode, I'll keep the needinfo around to try again if I get some time, and I'll keep the bug Resolved to see if anyone else still sees this issue.
David, we are early in the Beta cycle. What is the status of this bug currently, and do you have any intention to uplift to Beta 40?
Flags: needinfo?(davidp99)
Note that this bug regressed bug 1164406 as a result of a rebase error, and this regression is being fixed in 1178847. However, the regression only affects APZ, so it's probably irrelevant for uplift purposes.
I believe handyman will be AFK for some time - so I don't think he'll be able to weigh in here.
(In reply to Kate Glazko from comment #142) > David, we are early in the Beta cycle. What is the status of this bug > currently, and do you have any intention to uplift to Beta 40? Mike's right -- I'll only be able to devote a little free time to this (and am currently on vacation) so I'm sure I wouldn't be the best person to support critical uplift issues. After me, kats knows the most about this patch (and this corner of the code base) so I'd defer to him and he's suggesting no uplift (comment 140).
Flags: needinfo?(davidp99)
OK. Let it ride the train then. The patches are too big for an uplift in beta...
I've tried again today to reproduce the issue using the latest Firefox 43 Nightly (e10s enabled) and Firefox 41 Beta 4, but I could not reproduce the issue. Since it's been more than a month without any regressions, or any additional reports of this happening, I'm closing it as verified.
Status: RESOLVED → VERIFIED
Flags: needinfo?(florin.mezei)
Blocks: 1215659
btw, I still see this HiDPI issue in Firefox 41 intermittently, though I don't have consistent STR.
I still have this issue on OSX on betas of Fx 45 and have been having it for a long time. For me, steps to reproduction: 0: Fx open on my Macbook Pro Retina, no monitor plugged in 1: Plug in monitor (doesn't matter if MbP is open or closed) 2: All open tabs now look like this: http://imgur.com/GDinbku I've been triggering UI reloads by invoking the search UI (command + F)
(In reply to Miles Crabill from comment #149) > I still have this issue on OSX on betas of Fx 45 and have been having it for > a long time. For me, steps to reproduction: > > 0: Fx open on my Macbook Pro Retina, no monitor plugged in > 1: Plug in monitor (doesn't matter if MbP is open or closed) > 2: All open tabs now look like this: http://imgur.com/GDinbku > > I've been triggering UI reloads by invoking the search UI (command + F) Hey Miles - are you able to reproduce if you have your add-ons disabled[1]? [1]: https://support.mozilla.org/en-US/kb/troubleshoot-firefox-issues-using-safe-mode#w_how-to-start-firefox-in-safe-mode
Flags: needinfo?(mcrabill)
I too have started experiencing this bug again recently. It appeared to be fixed for a while but either my recent upgrade to OS X 10.11.4 or Firefox 45.0.1 has caused it to return. Manually resizing the window seems to cure it.
I experience this almost every time I drag Firefox (45.0.1) between iMac Retina and external display. External display is permanently connected, no connecting or disconnecting involved. (I can't quantify the "almost" I'm afraid)
This is not fixed. Unfortunately it makes Firefox unusable. So I am now using Chrome which works fine. Basically I have the new Mac Laptop with Retina display. I select the option to mirror my display. My external display is a Dell2407WFP (1920 resolution). And Firefox is gigantic. And the native firefox popups that appear aren't sized right and sometimes you can see the "ok/cancel" buttons. I believe it's basically rendering the display using the retina resolution size, and not the external display size. All other apps on my computer are sized fine. Just not Firefox.
(In reply to md from comment #153) > This is not fixed. Unfortunately it makes Firefox unusable. So I am now > using Chrome which works fine. > > Basically I have the new Mac Laptop with Retina display. I select the > option to mirror my display. My external display is a Dell2407WFP (1920 > resolution). And Firefox is gigantic. And the native firefox popups that > appear aren't sized right and sometimes you can see the "ok/cancel" buttons. > > > I believe it's basically rendering the display using the retina resolution > size, and not the external display size. All other apps on my computer are > sized fine. Just not Firefox. I should add I'm running these versions: Firefox 46.0.1 OSX: 10.11.4 MacBook Pro (Retina, 15-inch, Mid 2015) Mac Graphics: AMD Radeon R9 M370X 2048 MB External Monitor: Dell 2407WFP 24inch (1920x1200) And again I am running this mirror, with the Mac lid shut. Problem persists if I reboot with the mac lid open - this doesn't seem to matter. Problem persists if I restart with the mac lid open or mac lid shut. Thanks--
(In reply to md from comment #154) > (In reply to md from comment #153) > > This is not fixed. Unfortunately it makes Firefox unusable. So I am now > > using Chrome which works fine. > > > > Basically I have the new Mac Laptop with Retina display. I select the > > option to mirror my display. My external display is a Dell2407WFP (1920 > > resolution). And Firefox is gigantic. And the native firefox popups that > > appear aren't sized right and sometimes you can see the "ok/cancel" buttons. > > > > > > I believe it's basically rendering the display using the retina resolution > > size, and not the external display size. All other apps on my computer are > > sized fine. Just not Firefox. > > I should add I'm running these versions: > Firefox 46.0.1 > OSX: 10.11.4 > MacBook Pro (Retina, 15-inch, Mid 2015) > Mac Graphics: AMD Radeon R9 M370X 2048 MB > External Monitor: Dell 2407WFP 24inch (1920x1200) > And again I am running this mirror, with the Mac lid shut. Problem persists > if I reboot with the mac lid open - this doesn't seem to matter. Problem > persists if I restart with the mac lid open or mac lid shut. > > Thanks-- Hello md, This bug was strictly for the case where multiprocess mode ("e10s") is enabled in the browser. Have you somehow enabled e10s in your profile? You can check by going to about:support, and seeing if "Multiprocess Windows" under the "Application Basics" section is showing a value greater than 0 for the number of multiprocess windows. If not, then I think this is a separate bug.
Flags: needinfo?(mdunnerstick)
I went to about support. This is what it says: Multiprocess Windows: 0/1 (Disabled) Below is raw data: { "application": { "name": "Firefox", "version": "46.0.1", "buildID": "20160502172042", "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:46.0) Gecko/20100101 Firefox/46.0", "safeMode": false, "updateChannel": "release", "supportURL": "https://support.mozilla.org/1/firefox/46.0.1/Darwin/en-US/", "numTotalWindows": 1, "numRemoteWindows": 0, "remoteAutoStart": false, "autoStartStatus": 2 }, "modifiedPreferences": { "accessibility.typeaheadfind.flashBar": 0, "browser.cache.disk.hashstats_reported": 1, "browser.cache.frecency_experiment": 3, "browser.cache.disk.smart_size.first_run": false, "browser.cache.disk.capacity": 358400, "browser.cache.disk.filesystem_reported": 1, "browser.download.importedFromSqlite": true, "browser.download.useDownloadDir": false, "browser.places.smartBookmarksVersion": 7, "browser.search.suggest.enabled": false, "browser.sessionstore.upgradeBackup.latestBuildID": "20160502172042", "browser.startup.homepage": "https://news.google.com/news?ned=es_mx", "browser.startup.homepage_override.buildID": "20160502172042", "browser.startup.homepage_override.mstone": "46.0.1", "browser.tabs.warnOnClose": false, "dom.push.userAgentID": "e4a5add0f7fe49f492de2f9941c6f769", "dom.apps.reset-permissions": true, "dom.mozApps.used": true, "extensions.lastAppVersion": "46.0.1", "font.internaluseonly.changed": true, "gfx.crash-guard.status.glcontext": 2, "gfx.crash-guard.glcontext.deviceID": "0x0d26", "gfx.crash-guard.glcontext.appVersion": "45.0.2", "gfx.blacklist.direct2d": 3, "gfx.blacklist.layers.direct3d9": 3, "media.webrtc.debug.aec_log_dir": "/tmp/", "media.webrtc.debug.log_file": "/tmp/WebRTC.log", "media.gmp-gmpopenh264.version": "1.5.3", "media.youtube-ua.override.to": "43", "media.gmp-gmpopenh264.abi": "x86_64-gcc3-u-i386-x86_64", "media.gmp-manager.buildID": "20160502172042", "media.gmp-gmpopenh264.lastUpdate": 1451555675, "media.gmp-manager.lastCheck": 1463699935, "network.auth.allow-subresource-auth": 2, "network.cookie.prefsMigrated": true, "network.predictor.cleaned-up": true, "places.history.expiration.transient_current_max_pages": 104858, "places.database.lastMaintenance": 1463503931, "plugin.state.silverlight": 1, "plugin.importedState": true, "plugin.disable_full_page_plugin_for_types": "application/pdf", "plugin.state.flash": 1, "print.print_plex_name": "", "print.print_margin_top": "0.5", "print.print_paper_width": " 8.50", "print.print_to_file": false, "print.print_evenpages": true, "print.print_orientation": 0, "print.print_unwriteable_margin_right": 25, "print.print_unwriteable_margin_left": 25, "print.print_margin_left": "0.5", "print.print_command": "", "print.print_reversed": false, "print.print_unwriteable_margin_bottom": 56, "print.print_resolution_name": "", "print.print_duplex": 1515870810, "print.print_scaling": " 1.00", "print.print_margin_right": "0.5", "print.print_oddpages": true, "print.print_bgcolor": false, "print.print_colorspace": "", "print.print_bgimages": false, "print.print_downloadfonts": false, "print.print_paper_height": " 11.00", "print.print_shrink_to_fit": true, "print.print_unwriteable_margin_top": 25, "print.print_paper_name": "", "print.print_page_delay": 50, "print.print_margin_bottom": "0.5", "print.print_in_color": true, "print.print_paper_size_type": 1, "print.print_paper_data": 0, "print.print_paper_size_unit": 0, "print.print_resolution": 1515870810, "privacy.cpd.sessions": false, "privacy.sanitize.timeSpan": 0, "privacy.sanitize.sanitizeOnShutdown": true, "privacy.clearOnShutdown.sessions": false, "privacy.clearOnShutdown.cookies": false, "privacy.sanitize.migrateFx3Prefs": true, "privacy.sanitize.migrateClearSavedPwdsOnExit": true, "services.sync.declinedEngines": "", "services.sync.lastPing": 1463698708, "services.sync.lastSync": "Thu May 19 2016 19:34:36 GMT-0700 (PDT)", "services.sync.numClients": 1, "services.sync.engine.prefs.modified": false, "storage.vacuum.last.places.sqlite": 1462749394, "storage.vacuum.last.index": 1 }, "lockedPreferences": {}, "graphics": { "numTotalWindows": 1, "numAcceleratedWindows": 1, "windowLayerManagerType": "OpenGL", "windowLayerManagerRemote": true, "supportsHardwareH264": "No; ", "adapterDescription": "", "adapterVendorID": "0x1002", "adapterDeviceID": "0x6821", "adapterRAM": "", "adapterDrivers": "", "driverVersion": "", "driverDate": "", "webglRenderer": "ATI Technologies Inc. -- AMD Radeon R9 M370X OpenGL Engine", "info": { "AzureCanvasBackend": "skia", "AzureSkiaAccelerated": 1, "AzureFallbackCanvasBackend": "none", "AzureContentBackend": "quartz" } }, "javaScript": { "incrementalGCEnabled": true }, "accessibility": { "isActive": false, "forceDisabled": 0 }, "libraryVersions": { "NSPR": { "minVersion": "4.12", "version": "4.12" }, "NSS": { "minVersion": "3.22.3 Basic ECC", "version": "3.22.3 Basic ECC" }, "NSSUTIL": { "minVersion": "3.22.3", "version": "3.22.3" }, "NSSSSL": { "minVersion": "3.22.3 Basic ECC", "version": "3.22.3 Basic ECC" }, "NSSSMIME": { "minVersion": "3.22.3 Basic ECC", "version": "3.22.3 Basic ECC" } }, "userJS": { "exists": false }, "crashes": { "submitted": [], "pending": 0 }, "extensions": [ { "name": "BrowserStack", "version": "22.0", "isActive": true, "id": "{6cc0f0f7-a6e2-4834-9682-24de2229b51e}" }, { "name": "Charles Proxy Auto-configuration", "version": "3.11", "isActive": true, "id": "{3e9a3920-1b27-11da-8cd6-0800200c9a66}" }, { "name": "CodeBurner for Firebug", "version": "1.6.1-signed.1-signed", "isActive": true, "id": "firebug@tools.sitepoint.com" }, { "name": "Empty Cache Button", "version": "2.7.1-signed.1-signed", "isActive": true, "id": "{4cc4a13b-94a6-7568-370d-5f9de54a9c7f}" }, { "name": "Firebug", "version": "3.0.0-beta.3", "isActive": true, "id": "firebug@software.joehewitt.com" }, { "name": "Firefox Hello", "version": "1.2.6", "isActive": true, "id": "loop@mozilla.org" }, { "name": "Multi-process staged rollout", "version": "1.0", "isActive": true, "id": "e10srollout@mozilla.org" }, { "name": "Pocket", "version": "1.0", "isActive": true, "id": "firefox@getpocket.com" }, { "name": "anonymoX", "version": "2.5.2", "isActive": false, "id": "client@anonymox.net" }, { "name": "Autofill Forms", "version": "1.1.0.1", "isActive": false, "id": "autofillForms@blueimp.net" }, { "name": "Geolocater", "version": "1.7.1.1-signed.1-signed", "isActive": false, "id": "geolocater@3liz.com" }, { "name": "Reddit Enhancement Suite", "version": "4.6.1", "isActive": false, "id": "jid1-xUfzOsOFlzSOXg@jetpack" } ], "experiments": [] }
Whoops - I'm totally wrong. comment 0 makes it pretty clear that this wasn't intended to be an e10s-only bug. Hey jfkthame - do you know if there are any outstanding bugs for Retina scaling stuff, like what md is reporting in comment 153?
ni'ing for comment 157.
Flags: needinfo?(mdunnerstick) → needinfo?(jfkthame)
There's bug 1279470, but that was originally filed for Windows; I think we should track the platforms separately as this is likely to be an issue in the platform-specific widget layer. I've heard a couple other reports of similar issues but can't seem to reproduce locally at the moment. Filing a new bug is probably best, given the age of this one.
Flags: needinfo?(jfkthame)
I have this problem on OS X 10.11.5 Firefox 47.0.1 Thunderbird 45.1.1
I have this problem on OS X 10.11.6 MacBook Pro (Retina, 13-inch, Early 2015) Firefox 47.0 I was recently using a Macbook Air on the same OS and Firefox version and this problem did not exist there, fwiw.
Hi, I just wanted to add that I was using my laptop to connect to a TV over Apple Airplay. And the same issue has occurred there. You have all my specs in Comment 153 & 154. I just want to also say that I fully switched to Chrome now. It kind of bums me out, since I have been using Firefox since before Firefox back when it was still Mozilla. And really believe in the product. But this is a major deal breaker. Firefox is unusable when connecting to another monitor. So I had to switch. I hope people will escalate the priority of this. The status still says "VERIFIED FIXED" even though it is not and others are logging issues. Thanks.
I suspect you may have been seeing bug 1154125, which showed a lot of the same symptoms as this issue, and was only fixed quite recently. Current versions of Nightly[1] or Firefox Developer Edition[2] should have that fix, and no longer exhibit this kind of bug. That fix is currently on track to ship to the Release channel in Firefox 49. [1] https://nightly.mozilla.org/ [2] https://www.mozilla.org/en-US/firefox/developer/
Flags: needinfo?(miles)
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: