Hello dev-platform,

TL;DR: TabChild's don't seem to care about the nsIBaseWindow visibility
attribute that they implement. In fact, they often lie about it.

What should we do about that? What's the best way to detect and tell the
TabChild that it's visible or invisible?

Also, what's the difference between DocShell visibility and activeness?


Longer story:

In bug 1353013, I'm dealing with a permanent failure that I've tracked down
to Marionette's listener.js causing focus to be pulled in the hidden,
preloaded about:newtab that is running in the content process.

With e10s disabled, nsGlobalWindow::Focus bails out early, because the
function checks its visibility (via the nsIBaseWindow interface), and
determines that it is invisible (because of this function[1] that sees if
the frame is in the selected frame of a deck).

With e10s enabled, visibility seems to be a lot less useful - TabChild
implements nsIBaseWindow, and ignores attempts to set visibility[2] and
always reports that it is visible[3]. This means that nsGlobalWindow::Focus
decides that focus is indeed something that the preloaded about:newtab can
do, and that causes my test failures.

It seems to me that a TabChild always reporting that it's visible isn't
amazing. For a browser window with a number of tabs open, it's the case
that only one of those tabs really is visible, naturally; so the rest of
those TabChild's are straight-up lying. I have no idea what the
ramifications of that lying are. Perhaps we're doing more work than we need
to because we're skipping some "don't do it if we're invisible"
optimizations. I'm not sure.

At any rate, it seems to me that the solution to my problem is to have the
TabChild report the truth about whether or not it's visible. Using a sync
IPC message to ask the parent is asking for trouble, so instead, I suspect
we'll want the TabChild to be _told_ when it's made visible and invisible.

What is the best way of doing that? Is there a clean way of having the
nsFrameLoader / TabParent be told when they've been set as the active frame
in a deck or not? Or is this something that the front-end needs to take
responsibility for (like we do for DocShell active-ness) and we need to
have tabbrowser.xml tell the TabChild that it has become visible?

Or, alternatively, should I tie the activeness of the TabChild's DocShell
to its visibility? That would be a change in behaviour between e10s and
non-e10s; in non-e10s, it appears to be possible to have a non-visible but
active DocShell (despite the documentation [4]). Perhaps somebody here can
shed some light on the relationship (or lack thereof) between active-ness
and visibility?

Thanks,

-Mike

[1]:
http://searchfox.org/mozilla-central/rev/d08b24e613cac8c9c5a4131452459241010701e0/layout/generic/nsFrame.cpp#405-409
[2]:
http://searchfox.org/mozilla-central/rev/d08b24e613cac8c9c5a4131452459241010701e0/dom/ipc/TabChild.cpp#936-942
[3]:
http://searchfox.org/mozilla-central/rev/d08b24e613cac8c9c5a4131452459241010701e0/dom/ipc/TabChild.cpp#929-934
[4]:
http://searchfox.org/mozilla-central/rev/d08b24e613cac8c9c5a4131452459241010701e0/docshell/base/nsIDocShell.idl#659-664
_______________________________________________
dev-platform mailing list
dev-platform@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-platform

Reply via email to