Closed
Bug 175893
Opened 22 years ago
Closed 20 years ago
Make XUL <tab>'s focusable
Categories
(Firefox :: Keyboard Navigation, defect, P2)
Firefox
Keyboard Navigation
Tracking
()
RESOLVED
FIXED
People
(Reporter: aaronlev, Assigned: aaronlev)
References
(Blocks 1 open bug)
Details
(Keywords: access, helpwanted)
Attachments
(3 files, 15 obsolete files)
7.70 KB,
patch
|
bryner
:
superreview+
|
Details | Diff | Splinter Review |
2.82 KB,
patch
|
neil
:
superreview+
|
Details | Diff | Splinter Review |
5.80 KB,
patch
|
Details | Diff | Splinter Review |
1. We should make xul <tab>'s focusable (the label part gets the dotted outline)
2. If a user presses Ctrl+Tab, the next <tab> gets focused if it has no
focusable content, or if the current <tab> is focused
Assignee | ||
Comment 1•22 years ago
|
||
Tab labels are usually focusable in Windows XP.
What about Mac and Unix?
Assignee | ||
Comment 2•22 years ago
|
||
Also seems to fix bug 166001 and bug 130644.
Not sure what we should do for Mac.
Why is there no tabbox.css for unix?
Needs testing. Timeless?
On Windows, if a tab has focus you can use the left/right arrows to navigate them.
Assignee | ||
Comment 4•22 years ago
|
||
Dean, that works with this patch, because we used to have this behavior in Classic.
This works pretty well. The only thing I notice is in the (Phoenix) page info
dialog. I used Ctrl+Tab to move through the tabs, without the tabs having
focus. When I got to the Security tab, focus was on Help. Pressing Ctrl+Tab
moved focus to the Security tab. Is this expected?
Assignee | ||
Comment 6•22 years ago
|
||
Dean, that's bug 166001 -- which it turns out is not fixed by this.
Working on that now.
Comment 8•22 years ago
|
||
Tabs are focusable on linux, at least in the few tabbed apps I've seen.
> Why is there no tabbox.css for unix?
It might be that it uses the Windows one.
Your patch sort-of works on unix: if I tab from the urlbar, it lands on the
current tab, and pressing right/left arrow will switch to an adjacent tab (I
expected it would focus the tab, but not switch to it unless I hit return).
Once I'm at the enw tab, left/right arrows no longer move between tabs; I'm not
sure where focus is, though the tab name is still outlined. Hitting tab again
sends focus into the page, but the name of the tab still remains outlined (so
now I have a dotted outline around the banner image in the page, and a dotted
outline around the tab text). (This is with the default classic theme, today's
build, linux.)
Comment 9•22 years ago
|
||
how would this fix affect embed apps, especially those which don't use xul? just
wondering.
Assignee | ||
Comment 10•22 years ago
|
||
This won't affect embedded apps at all, because the changes are in Mozilla's
chrome layer.
Assignee | ||
Comment 11•22 years ago
|
||
Perhaps I should change this so that tabs in the tabbed browser view are not
focusable -- just the tabs in tabbed dialogs would be. Or not?
Comment 13•22 years ago
|
||
Comment on attachment 103901 [details] [diff] [review]
Fixes problems reported by Akkana, wrt to tabbed browser tabs
>+ <xul:hbox class="dialog-button-box" pack="end" anonid="Buttons"
Since this is not part of this patch please remember not to check it in.
Attachment #103901 -
Flags: review+
Assignee | ||
Comment 14•22 years ago
|
||
Attachment #103901 -
Attachment is obsolete: true
Comment 15•22 years ago
|
||
Comment on attachment 103901 [details] [diff] [review]
Fixes problems reported by Akkana, wrt to tabbed browser tabs
r=sgehani
Comment 16•22 years ago
|
||
Comment on attachment 104198 [details] [diff] [review]
Get rid of anonid that was not part of this patch.
r=sgehani
Attachment #104198 -
Flags: review+
Comment 17•22 years ago
|
||
Just to confirm what Akkana said: tab labels do get focused on click in gtk, and
unix does use the windows tabbox.css.
Comment 18•22 years ago
|
||
Mousing down on a tab should not focus it. How are you handling that case?
Tabs are one of the reasons CSS3 was going to split the focusable properties
(what we call -moz-user-focus) into both key and mouse variants.
Comment 19•22 years ago
|
||
Sorry, I should have said "On Win32, mousing down on a tab doesn't focus it."
Comment 20•22 years ago
|
||
I would suggest implementing two new CSS properties:
-moz-user-mouse-focus
-moz-user-key-focus
with the same range of values as -moz-user-focus.
Then the CSS for tabs can be changed to
tab {
-moz-user-key-focus: normal;
#ifdef XP_UNIX
-moz-user-mouse-focus: normal;
#endif
}
The tabbing code would need to be patched to check for user-key-focus followed
by user-focus. The mouse code would need to check user-mouse-focus followed
by user-focus.
Assignee | ||
Comment 21•22 years ago
|
||
It seems like all we really need to do is modify the "click" handler in
tabbox.xml. It just needs to set the focus there.
Comment 22•22 years ago
|
||
I think we should really implement the two kinds of focus as hyatt suggets. It's
not just tabs; buttons have the same issue. Clicking a button should not give it
focus.
Assignee | ||
Comment 23•22 years ago
|
||
Buttons in windows actually take focus when you click on them.
On mac buttons don't take focus at all, so there's no need for a separate
property because of buttons.
And tabs even take focus from the mouse if another tab was focused last, or if
you were already focused on that tab.
Assignee | ||
Comment 25•22 years ago
|
||
Comment on attachment 104601 [details] [diff] [review]
Makes sure that mouse behavior is correct for tabs. Note they are focusable on windows, depending on what was focused before
Carrying r= forward
Attachment #104601 -
Flags: review+
Comment 26•22 years ago
|
||
Comment on attachment 104601 [details] [diff] [review]
Makes sure that mouse behavior is correct for tabs. Note they are focusable on windows, depending on what was focused before
>Index: mozilla/xpfe/global/resources/content/bindings/dialog.xml
>===================================================================
>RCS file: /cvsroot/mozilla/xpfe/global/resources/content/bindings/dialog.xml,v
>retrieving revision 1.21
>diff -u -r1.21 dialog.xml
>--- mozilla/xpfe/global/resources/content/bindings/dialog.xml 9 May 2002 00:04:36 -0000 1.21
>+++ mozilla/xpfe/global/resources/content/bindings/dialog.xml 30 Oct 2002 04:02:38 -0000
>@@ -187,8 +187,13 @@
> var button = buttons[dlgtype];
> buttons[dlgtype].addEventListener("command", this._handleButtonCommand, true);
> // don't override custom labels with pre-defined labels on explicit buttons
>- if (!button.hasAttribute("label"))
>+ if (!button.hasAttribute("label")) {
> button.setAttribute("label", this.mStrBundle.GetStringFromName("button-"+dlgtype));
>+ var accessKey = this.mStrBundle.GetStringFromName("accesskey-"+dlgtype);
>+ if (accessKey) {
>+ button.setAttribute("accesskey", accessKey);
>+ }
>+ }
> }
>
> // ensure that hitting enter triggers ondialogaccept
This is part of another (checked-in) patch, right?
>@@ -304,12 +309,30 @@
> </body>
> </method>
>
>+ <method name="_fireTabboxEvent">
>+ <parameter name="aEvent"/>
>+ <body>
>+ <![CDATA[
>+ var tabbox = this.ownerDocument.getElementsByTagName('tabbox');
>+ if (tabbox && tabbox.length > 0) {
>+ tabbox[0].dispatchEvent(aEvent);
>+ event.stopPropagation();
>+ event.preventDefault();
>+ }
>+ ]]>
>+ </body>
>+ </method>
>+
> </implementation>
>
> <handlers>
> <handler event="keypress" keycode="VK_ENTER" action="this._hitEnter();"/>
> <handler event="keypress" keycode="VK_RETURN" action="this._hitEnter();"/>
> <handler event="keypress" keycode="VK_ESCAPE" action="this.cancelDialog();"/>
>+ <handler event="keypress" keycode="VK_TAB" modifiers="control" action="this._fireTabboxEvent(event);"/>
>+ <handler event="keypress" keycode="VK_TAB" modifiers="control,shift" action="this._fireTabboxEvent(event);"/>
>+ <handler event="keypress" keycode="VK_PAGE_UP" modifiers="control" action="this._fireTabboxEvent(event);"/>
>+ <handler event="keypress" keycode="VK_PAGE_DOWN" modifiers="control" action="this._fireTabboxEvent(event);"/>
> </handlers>
>
> </binding>
I don't think this is the way to go. You're trying to avoid adding
eventnode="document" to all the affected <tabbox>es; probably nicer behaviour
would be to change the default in tabbox.xml:
<field name="_eventNode">
var eventNode = top.document.documentElement.localName == 'dialog' ?
top.document : this;
switch (this.getAttribute("eventnode")) {
case "top": eventNode = top.document; break;
case "this": eventNode = this; break;
case "parent": eventNode = this.parentNode; break;
case "window": eventNode = window; break;
case "document": eventNode = document; break;
}
eventNode;
</field>
Or just change the default to top.document and fix those tabs that break :-)
>Index: mozilla/xpfe/global/resources/content/bindings/tabbrowser.xml
>===================================================================
>RCS file: /cvsroot/mozilla/xpfe/global/resources/content/bindings/tabbrowser.xml,v
>retrieving revision 1.63
>diff -u -r1.63 tabbrowser.xml
>--- mozilla/xpfe/global/resources/content/bindings/tabbrowser.xml 8 Oct 2002 23:19:03 -0000 1.63
>+++ mozilla/xpfe/global/resources/content/bindings/tabbrowser.xml 30 Oct 2002 04:02:41 -0000
>@@ -438,7 +438,10 @@
> }
>
> // Focus our new content area.
>- setTimeout("window._content.focus()", 0);
>+ var focusedElt = document.commandDispatcher.focusedElement;
>+ if (!focusedElt || focusedElt.localName != 'tab' ||
>+ focusedElt.namespaceURI != 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul')
>+ setTimeout("window._content.focus()", 0);
> ]]>
> </body>
> </method>
Why not:
if (document.commandDispatcher.focusedElement != this.selectedTab)
>Index: mozilla/xpfe/global/resources/content/bindings/tabbox.xml
>===================================================================
>RCS file: /cvsroot/mozilla/xpfe/global/resources/content/bindings/tabbox.xml,v
>retrieving revision 1.26
>diff -u -r1.26 tabbox.xml
>--- mozilla/xpfe/global/resources/content/bindings/tabbox.xml 15 Oct 2002 08:50:01 -0000 1.26
>+++ mozilla/xpfe/global/resources/content/bindings/tabbox.xml 30 Oct 2002 04:02:41 -0000
>@@ -198,6 +198,7 @@
> var o = this.getAttribute("orient");
> if (!o)
> this.setAttribute("orient", "horizontal");
>+ document.commandDispatcher.advanceFocusIntoSubtree(this.selectedItem);
> ]]>
> </constructor>
>
I don't think you want to be messing about with the focus here.
>@@ -287,6 +288,8 @@
> <body>
> <![CDATA[
> var startTab = this.selectedItem;
>+ var isTabLabelFocused = startTab &&
>+ document.commandDispatcher.focusedElement == startTab;
> var next = startTab[aDir == -1 ? "previousSibling" : "nextSibling"];
>
> while (next != startTab && (!next || next.getAttribute("hidden"))) {
You don't need the startTab && test, startTab is "guaranteed".
>@@ -299,7 +302,8 @@
> if (next && next != startTab) {
> this.selectedItem = next;
> next.focus();
>- document.commandDispatcher.advanceFocusIntoSubtree(next);
>+ if (!isTabLabelFocused) // otherwise keep focusing tab labels
>+ document.commandDispatcher.advanceFocusIntoSubtree(next);
> }
> ]]>
> </body>
What I don't like about advanceFocusIntoSubtree is that it can advance the
focus right out of the tab control to the OK button (or whatever) if there are
no focusable elements in the tab panel. (Windows behaviour is to focus the tab
if there are no focusable elements in the tab panel).
>@@ -486,7 +490,17 @@
> <handlers>
> <handler event="click" button="0">
> <![CDATA[
>+ var isTabLabelFocused = document.commandDispatcher.focusedElement == this.parentNode.selectedItem;
> this.parentNode.selectedItem = this;
>+ if (!isTabLabelFocused) { // otherwise keep focusing tab labels
>+ if (window._content)
>+ window._content.focus();
>+ else
>+ document.commandDispatcher.advanceFocusIntoSubtree(this);
>+ }
>+ else
>+ this.focus();
>+
> ]]>
> </handler>
>
I don't think you need a content (not _content, anyway) check. Perhaps this and
the ctrl+tab code could be merged into a "select and focus tab" method?
>Index: mozilla/themes/classic/global/win/tabbox.css
>===================================================================
>RCS file: /cvsroot/mozilla/themes/classic/global/win/tabbox.css,v
>retrieving revision 1.10
>diff -u -r1.10 tabbox.css
>--- mozilla/themes/classic/global/win/tabbox.css 22 Jan 2002 23:07:59 -0000 1.10
>+++ mozilla/themes/classic/global/win/tabbox.css 30 Oct 2002 04:02:42 -0000
>@@ -76,9 +76,14 @@
> }
>
> tab[selected="true"] {
>+ -moz-user-focus: normal;
> margin-top: 0;
> border-bottom-color: transparent;
> padding: 1px 6px 4px 6px;
>+}
>+
>+tab:focus {
>+ -moz-outline: 1px dotted invert;
> }
>
> tab[beforeselected="true"] {
Isn't there somewhere better to put the outline, such as on the text?
>Index: mozilla/xpfe/browser/resources/content/pageInfo.xul
>===================================================================
>RCS file: /cvsroot/mozilla/xpfe/browser/resources/content/pageInfo.xul,v
>retrieving revision 1.40
>diff -u -r1.40 pageInfo.xul
>--- mozilla/xpfe/browser/resources/content/pageInfo.xul 17 Oct 2002 19:30:13 -0000 1.40
>+++ mozilla/xpfe/browser/resources/content/pageInfo.xul 30 Oct 2002 04:02:42 -0000
>@@ -37,13 +37,15 @@
> %pageInfoDTD;
> ]>
>
>-<window id="main-window"
>+<dialog buttons="help"
>+ id="main-window"
> xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
> windowtype="Browser:page-info"
> onload="onLoadPageInfo()"
> align="stretch" class="dialog"
> width="&pageInfoWindow.width;" height="&pageInfoWindow.height;"
> screenX="10" screenY="10"
>+ ondialoghelp="return doHelpButton()"
> persist="screenX screenY width height sizemode">
>
> <script type="application/x-javascript" src="chrome://communicator/content/contentAreaUtils.js"/>
>@@ -315,8 +317,4 @@
> <!-- Others added by overlay -->
> </tabpanels>
> </tabbox>
>- <box>
>- <spacer flex="1"/>
>- <button label="&helpButton;" oncommand="doHelpButton();" />
>- </box>
>-</window>
>+</dialog>
I agree with this bit :-)
Attachment #104601 -
Flags: needs-work+
Assignee | ||
Comment 27•22 years ago
|
||
Neil, your reviews are nice and thorough. I hope they make you an sr=.
Let me deal with your comments one by one:
> This is part of another (checked-in) patch, right?
Yes, I removed that part from the new patch
> I don't think this is the way to go. You're trying to avoid adding
> eventnode="document" to all the affected <tabbox>es; probably nicer behaviour
> would be to change the default in tabbox.xml:
Your way is better -- that's in the new patch.
> Why not:
> if (document.commandDispatcher.focusedElement != this.selectedTab)
I tried this. It won't work, because this.selectedTab still has the old tab
where the focus is coming from, not the new one which is in focusedElement.
>You don't need the startTab && test, startTab is "guaranteed".
Okay, fixed.
> What I don't like about advanceFocusIntoSubtree is that it can advance the
> focus right out of the tab control to the OK button (or whatever) if there
are
> no focusable elements in the tab panel. (Windows behaviour is to focus the
tab
> if there are no focusable elements in the tab panel).
Okay, now it checks to see if it ends up on a anonymous dialog button
by looking to see if the focus lands on something with the dlgtype attribute.
> I don't think you need a content (not _content, anyway) check. Perhaps this
> and the ctrl+tab code could be merged into a "select and focus tab" method?
I need this for the tabbrowser scenario. Tried merging them into a single
method and couldn't get it to work right -- don't remember why at the moment.
> Isn't there somewhere better to put the outline, such as on the text?
No, the dotted outline looks funny and lopsided then.
Seeking r=Neil
Attachment #104601 -
Attachment is obsolete: true
Comment 28•22 years ago
|
||
Comment on attachment 104817 [details] [diff] [review]
New patch based on Neil's comments
Well, the CSS is missing and I don't think you need the changes to dialog.xml
any more. I'm not even convinced you need to change tabbrowser.xml either; can
you possibly remove the tabbrowser focus code and rely on your tabbox code
instead?
Attachment #104817 -
Flags: needs-work+
Comment 29•22 years ago
|
||
This is what I was thinking of when I suggested merging the functions.
Assignee | ||
Comment 30•22 years ago
|
||
Neil, I tried your patch -- it's missing 2 things:
1) initial focus when I pull up page info should not be on the tab label itself,
but on the first item in that tab. That's what the dialog.xml changes did.
2) when you click on a tabbed browser tab, it puts a dotted outline around the
content area. We want it focused, but we don't want the dotted outline on
initial focus to a page. My changes to tabbrowser.xml kept that from occuring.
Assignee | ||
Comment 31•22 years ago
|
||
Neil, I tried to use your version of tabbrowser.xml file. Eventually I got it
to have the correct initial focus for dialogs, but I had to add a parameter
aAdvanceIfSelected. Then I ran into problem #2, where the dotted outline kept
showing around the content when a browser tab was clicked on. Finally I decided
my original patch was pretty good, because it dealt with all of these issues
correctly.
IMHO I don't really think it's worth much more of our time to play more games
with this code. I appreciate the thorough reviews, though.
Seeking r=
Attachment #104817 -
Attachment is obsolete: true
Attachment #104867 -
Attachment is obsolete: true
Comment 32•22 years ago
|
||
Comment on attachment 104887 [details] [diff] [review]
Here's the same patch with the .css and pageinfo.xul files I forgot
Thank you for explaining the dialog.xml changes. However I still have some
issues; I would appreciate it if you could clear them up.
1. The additions to tabbrowser.xml appear have no effect (i.e. simply
removing the setTimeout line appears to have the same effect).
2. If you click one of the tabs in the DOM Inspector sidebar then the
content will get focus, not (as I had hoped) the DOM Inspector panel.
3. Ctrl+Tab will still show the dotted outline around the content
(but that might just be me fiddling; I was short of time today).
4. While you're fiddling around with the focus would you mind using
Components.lookupMethod(content, 'focus').call(content); ?
Comment 33•22 years ago
|
||
ccing our team
Comment 34•22 years ago
|
||
I'm seeing a weird effect with tabbed browsing: if you have two tabs open, and
tab to links on those pages, then if you click on a <tab> to change tabs the
focus goes back to the link on the other page. So far so good. But if you then
tab to the <tab> and press an arrow key to switch tabs the link still appears to
have the focus; if you then press tab twice the focus will go to the next tab
stop after the link. (Also if the focus was on a form field then when you switch
tabs the focus doesn't appear on the form field although it is there really).
Comment 35•22 years ago
|
||
clearing milestone since 1.3a has passed.
Updated•22 years ago
|
Keywords: helpwanted
Comment 37•21 years ago
|
||
Comment on attachment 104887 [details] [diff] [review]
Here's the same patch with the .css and pageinfo.xul files I forgot
the pageInfo.xul portion has conflict with another bug, but we can ignore it
for now
Attachment #104887 -
Flags: review?(neil.parkwaycc.co.uk)
Assignee | ||
Updated•21 years ago
|
Blocks: atfmeta, aix-access
Updated•21 years ago
|
Attachment #104887 -
Attachment is obsolete: true
Attachment #104887 -
Flags: review?(neil.parkwaycc.co.uk)
Comment 38•20 years ago
|
||
Here is a version of the last patch updated to the trunk. I am not asking
reviews on it because I am seeing lots of issues with it. Among the issues:
- Sometimes tabs remain highlighted like they have the focus even though
another item has focus. I've even reproduced problems where multiple tabs show
the focused outline.
- On a AIX GTK2 build from a few days ago, I do not see the outline drawn
around focused tabs. Neil mentioned this may be a side effect of using
-moz-appearance, but I have not tracked down the problem yet.
Comment 39•20 years ago
|
||
Another note on comment 38:
I don't see the outline drawn around the focused tabs in the classic theme on a
trunk AIX GTK2 build, but it does work in the modern theme.
Comment 40•20 years ago
|
||
On linux/gtk2, it seems to work: http://nexgenmedia.net/Screenshot-18.png
Sometimes I have to click twice to get the outline though.
Comment 41•20 years ago
|
||
(In reply to comment #40)
>Sometimes I have to click twice to get the outline though.
At least on windows, if you click on a background tab then the focus gets set to
the newly selected panel, rather than the tab.
Comment 42•20 years ago
|
||
that seems to be the case. I rebuild using gtk2/xft and it still works fine.
Comment 43•20 years ago
|
||
I can sometimes get 2 tabs with an outline, trying to debug how that happens.
Comment 44•20 years ago
|
||
To fix the 2 selected tabs at once, I had to do:
tabbox.css
tab[beforeselected="true"] {
-moz-appearance: tab-left-edge;
border-right: none;
-moz-border-radius-topright: 0;
+ -moz-outline: none;
}
tab[afterselected="true"] {
-moz-appearance: tab-right-edge;
border-left: none;
-moz-border-radius-topleft: 0;
+ -moz-outline: none;
}
That seems to have done it for me.
Comment 45•20 years ago
|
||
The problem with the inverted box not displaying was due to my checkin for Bug
126066. I have backed it out until I get a better fix, but it should allow us to
proceed on this bug. The problematic -moz-outline behavior should be visible in
builds from 2004/06/18-2004/06/21.
Assignee | ||
Comment 46•20 years ago
|
||
Attachment #151148 -
Attachment is obsolete: true
Assignee | ||
Updated•20 years ago
|
Attachment #151148 -
Flags: review?(neil.parkwaycc.co.uk)
Assignee | ||
Updated•20 years ago
|
Attachment #151148 -
Flags: review?(neil.parkwaycc.co.uk)
Assignee | ||
Updated•20 years ago
|
Attachment #151547 -
Flags: review?
Assignee | ||
Comment 47•20 years ago
|
||
(In reply to comment #32)
> (From update of attachment 104887 [details] [diff] [review])
> Thank you for explaining the dialog.xml changes. However I still have some
> issues; I would appreciate it if you could clear them up.
> 1. The additions to tabbrowser.xml appear have no effect (i.e. simply
> removing the setTimeout line appears to have the same effect).
Different code now. Have a look at the new patch.
> 2. If you click one of the tabs in the DOM Inspector sidebar then the
> content will get focus, not (as I had hoped) the DOM Inspector panel.
This doesn't affect sidebar tabs. If we want to fix that it needs to be in a
different bug. The sidebar is definitely a drag on accessibility. See bug 89148.
> 3. Ctrl+Tab will still show the dotted outline around the content
> (but that might just be me fiddling; I was short of time today).
Not having a problem with that.
> 4. While you're fiddling around with the focus would you mind using
> Components.lookupMethod(content, 'focus').call(content); ?
Is that really necessary if I'm setting focus to a XUL tab?
The issue you mention in comment #34 is not present in my tests.
Assignee | ||
Updated•20 years ago
|
Attachment #151547 -
Flags: review? → review?(neil.parkwaycc.co.uk)
Comment 48•20 years ago
|
||
There is one behavior I'm seeing with the latest patch which I'm not sure is
correct. To reproduce, do the following:
1) Load Mozilla. After the home page has loaded, click Ctrl+T to create a new
tab. Load http://www.google.com/ in the new tab.
2) Make sure the text focus is on the Google search text entry in the second tab.
3) Hit Ctrl+Tab several times, and notice that the focus stays in the text entry
on the Google tab.
4) Type Ctrl+Tab until you get back to the first tab. Click on the first tab to
highlight it.
5) Now click Ctrl+Tab - notice that on the Google page, the focus has been
changed to the tab and is no longer on the text entry.
I'm not sure if this is the intended behavior or not, but I would expect that
the focus is maintained when doing Ctrl+Tab.
Assignee | ||
Comment 49•20 years ago
|
||
(In reply to comment #48)
> 5) Now click Ctrl+Tab - notice that on the Google page, the focus has been
> changed to the tab and is no longer on the text entry.
This is intentional. I'm following Windows tab behavior. Once you have focus on
a tab, other keys to navigate between tabs keeps focus on one of the tabs.
Comment 50•20 years ago
|
||
Comment on attachment 151547 [details] [diff] [review]
Patch brought up-to-date. Issues dealt with.
>+tab:focus {
>+ -moz-outline: 1px dotted invert;
>+}
You do know -moz-outline is deprecated, right ;-)
>+ -moz-outline: none;
I wonder why you think you need this...
>+ <method name="advanceFocus">
>+ <body>
>+ <![CDATA[
>+ document.commandDispatcher.advanceFocusIntoSubtree(this);
>+ // We don't want to focus on anonymous OK, Cancel, etc. buttons
>+ if (document.commandDispatcher.focusedElement.hasAttribute("dlgtype"))
>+ this.focus(); // focus label rather than focusing dialog button
>+ ]]>
>+ </body>
>+ </method>
Why is this here, and not in dialog.xml?
> <handler event="click" button="0">
> <![CDATA[
>+ var isTabLabelFocused = (document.commandDispatcher.focusedElement == this.parentNode.selectedItem);
> this.parentNode.selectedItem = this;
>+ if (!isTabLabelFocused) { // otherwise keep focusing tab labels
>+ if (window._content)
>+ window._content.focus(); // Focus the content window for tabbed browser tab
>+ else
>+ document.commandDispatcher.advanceFocusIntoSubtree(this);
>+ }
>+ else
>+ this.focus();
> ]]>
> </handler>
Shouldn't this do the same tests as the keyboard navigation version? Maybe you
should have a shared method on <tabbox>.
>+ if (this.mCurrentTab == document.commandDispatcher.focusedElement) {
Nit: I think you put document.commandDispatcher.focusedElements on the left of
your other conditions.
> // Focus the previously focused element or window
> document.commandDispatcher.suppressFocusScroll = true;
>- if (newBrowser.focusedElement) {
>+ if (newBrowser.focusedElement &&
>+ newBrowser.focusedElement.localName != "tab") {
I'm not sure that this gains - if focussing the focusedElement isn't possible
then the focusedWindow is focused, which iirc will try to focus the most
recently focused element anyway.
Assignee | ||
Comment 51•20 years ago
|
||
Assignee | ||
Updated•20 years ago
|
Attachment #151547 -
Attachment is obsolete: true
Assignee | ||
Updated•20 years ago
|
Attachment #152134 -
Flags: review?(neil.parkwaycc.co.uk)
Assignee | ||
Updated•20 years ago
|
Attachment #151547 -
Flags: review?(neil.parkwaycc.co.uk)
Assignee | ||
Comment 52•20 years ago
|
||
(In reply to comment #50)
> (From update of attachment 151547 [details] [diff] [review])
> >+tab:focus {
> >+ -moz-outline: 1px dotted invert;
> >+}
> You do know -moz-outline is deprecated, right ;-)
Not yet. When it is I'll change it.
>
> >+ -moz-outline: none;
> I wonder why you think you need this...
Luckily don't need it anymore. There were some outline ghosts it cleaned up, but
it was a hack I suppose.
>
> >+ <method name="advanceFocus">
> >+ <body>
> >+ <![CDATA[
> >+ document.commandDispatcher.advanceFocusIntoSubtree(this);
> >+ // We don't want to focus on anonymous OK, Cancel, etc. buttons
> >+ if
(document.commandDispatcher.focusedElement.hasAttribute("dlgtype"))
> >+ this.focus(); // focus label rather than focusing dialog button
> >+ ]]>
> >+ </body>
> >+ </method>
> Why is this here, and not in dialog.xml?
Right, moved to dialog.xml
>
> > <handler event="click" button="0">
> > <![CDATA[
> >+ var isTabLabelFocused = (document.commandDispatcher.focusedElement
== this.parentNode.selectedItem);
> > this.parentNode.selectedItem = this;
> >+ if (!isTabLabelFocused) { // otherwise keep focusing tab labels
> >+ if (window._content)
> >+ window._content.focus(); // Focus the content window for tabbed
browser tab
> >+ else
> >+ document.commandDispatcher.advanceFocusIntoSubtree(this);
> >+ }
> >+ else
> >+ this.focus();
> > ]]>
> > </handler>
> Shouldn't this do the same tests as the keyboard navigation version? Maybe you
> should have a shared method on <tabbox>.
You mean check to see if it's a hidden tab? It wouldn't be able to receive a
click then.
>
> >+ if (this.mCurrentTab == document.commandDispatcher.focusedElement) {
> Nit: I think you put document.commandDispatcher.focusedElements on the left of
> your other conditions.
Fixed.
>
> > // Focus the previously focused element or window
> > document.commandDispatcher.suppressFocusScroll = true;
> >- if (newBrowser.focusedElement) {
> >+ if (newBrowser.focusedElement &&
> >+ newBrowser.focusedElement.localName != "tab") {
> I'm not sure that this gains - if focussing the focusedElement isn't possible
> then the focusedWindow is focused, which iirc will try to focus the most
> recently focused element anyway.
No it will focus the document itself if that's what was focused. Without this
code, if you click on some empty space in the document and then hit Ctrl+tab and
then ctrl+shift+tab, focus ends up on the tab itself.
Comment 53•20 years ago
|
||
Comment on attachment 152134 [details] [diff] [review]
New patch addressing Neil's comments
>Index: xpfe/global/resources/content/bindings/tabbox.xml
>===================================================================
>RCS file: /cvsroot/mozilla/xpfe/global/resources/content/bindings/tabbox.xml,v
>retrieving revision 1.30
>diff -u -r1.30 tabbox.xml
>--- xpfe/global/resources/content/bindings/tabbox.xml 31 Oct 2003 03:56:22 -0000 1.30
>+++ xpfe/global/resources/content/bindings/tabbox.xml 1 Jul 2004 20:16:58 -0000
>@@ -301,11 +301,13 @@
> }
>
> if (next && next != startTab) {
>- this.selectedItem = next;
>- if (this.getAttribute("setfocus") != "false") {
>+ if (document.commandDispatcher.focusedElement == startTab) {
> next.focus();
>+ }
>+ else if (this.getAttribute("setfocus") != "false") {
> document.commandDispatcher.advanceFocusIntoSubtree(next);
> }
>+ this.selectedItem = next;
> }
> ]]>
> </body>
>@@ -499,7 +501,16 @@
> <handlers>
> <handler event="click" button="0">
> <![CDATA[
>+ var isTabLabelFocused = (document.commandDispatcher.focusedElement == this.parentNode.selectedItem);
> this.parentNode.selectedItem = this;
>+ if (!isTabLabelFocused) { // otherwise keep focusing tab labels
>+ if (window._content)
>+ window._content.focus(); // Focus the content window for tabbed browser tab
>+ else
>+ document.commandDispatcher.advanceFocusIntoSubtree(this);
>+ }
>+ else
>+ this.focus();
> ]]>
> </handler>
>
What I meant was that these two hunks use different tests to determine how to
update the focus.
>- // Focus the previously focused element or window
>+ // Focus the previously focused element or window, unless it's a tab
> document.commandDispatcher.suppressFocusScroll = true;
>- if (newBrowser.focusedElement) {
>+ if (newBrowser.focusedElement &&
>+ newBrowser.focusedElement.localName != "tab") {
> try {
> setFocus(newBrowser.focusedElement);
> } catch (e) {
I see the unwanted effect without this hunk, unfortunately this doesn't quite
fix it correctly, as the focus is moved into never-never-land just before the
urlbar. Additionally this test won't work with tabs in content, it's probably
easier to compare the focusedElement's parent against a known element.
Assignee | ||
Comment 54•20 years ago
|
||
* Added selectNewTab() to share code for selecting a new tab in click and
advanceSelectedTab()
* Instead of testing for localName=='tab', compared to known element
+ if (newBrowser.focusedElement &&
+ newBrowser.focusedElement != this.mCurrentTab) {
I was unable to duplicate any problem with focus getting lost where you click
in the empty space in page, hit Ctrl+Tab then Ctrl+Shift+Tab.
You sure that's right? If you hit arrow keys the page won't scroll? Can you
give me steps to reproduce that?
Attachment #152134 -
Attachment is obsolete: true
Assignee | ||
Updated•20 years ago
|
Attachment #152134 -
Flags: review?(neil.parkwaycc.co.uk)
Assignee | ||
Updated•20 years ago
|
Attachment #152313 -
Flags: review?(neil.parkwaycc.co.uk)
Comment 55•20 years ago
|
||
As to your latest patch, if in a normal tabbed dialog you press ctrl+tab (or
otherwise change tab to the right) then everything works fine, but if you then
press ctrl+shift+tab (or otherwise change tab to the left) then the previously
selected tab element itself gets focus.
As to your previous patch, one of the issues I had was that if you load a XUL
web page that uses tabs then I was worried that you would not restore the focus.
Unfortunately your latest patch doesn't seem to handle it at all and if you're
not careful you'll find focus going to the previous tab element (again!)
Assignee | ||
Comment 56•20 years ago
|
||
I don't see any problems with this patch and remembering focus in web pages.
Attachment #152313 -
Attachment is obsolete: true
Assignee | ||
Updated•20 years ago
|
Attachment #152313 -
Flags: review?(neil.parkwaycc.co.uk)
Assignee | ||
Updated•20 years ago
|
Attachment #152373 -
Flags: review?(neil.parkwaycc.co.uk)
Assignee | ||
Updated•20 years ago
|
Attachment #152373 -
Flags: review?(neil.parkwaycc.co.uk)
Assignee | ||
Comment 57•20 years ago
|
||
Attachment #152373 -
Attachment is obsolete: true
Assignee | ||
Comment 58•20 years ago
|
||
Attachment #152579 -
Attachment is obsolete: true
Assignee | ||
Updated•20 years ago
|
Attachment #152581 -
Flags: review?(neil.parkwaycc.co.uk)
Comment 59•20 years ago
|
||
I think that tabbrowser focus code is getting unwieldy... perhaps a variable for
what you wanted focused would help?
Assignee | ||
Updated•20 years ago
|
Attachment #152581 -
Flags: review?(neil.parkwaycc.co.uk)
Assignee | ||
Comment 60•20 years ago
|
||
A further simplification was to get rid of the try/catch. I can't think of what
we'd need it for since we have a null check.
Attachment #152581 -
Attachment is obsolete: true
Assignee | ||
Updated•20 years ago
|
Attachment #152657 -
Flags: review?(neil.parkwaycc.co.uk)
Updated•20 years ago
|
Attachment #152657 -
Flags: review?(neil.parkwaycc.co.uk) → review+
Assignee | ||
Updated•20 years ago
|
Attachment #152657 -
Flags: superreview?(bryner)
Comment 61•20 years ago
|
||
Comment on attachment 152657 [details] [diff] [review]
Use variable whatToFocus in tabbrowser.xml
add the appropriate changes under toolkit/ and sr=me
Attachment #152657 -
Flags: superreview?(bryner) → superreview+
Assignee | ||
Comment 62•20 years ago
|
||
Checking in themes/classic/global/win/tabbox.css;
/cvsroot/mozilla/themes/classic/global/win/tabbox.css,v <-- tabbox.css
new revision: 1.12; previous revision: 1.11
done
Checking in themes/modern/global/tabbox.css;
/cvsroot/mozilla/themes/modern/global/tabbox.css,v <-- tabbox.css
new revision: 1.10; previous revision: 1.9
done
Checking in xpfe/global/resources/content/bindings/dialog.xml;
/cvsroot/mozilla/xpfe/global/resources/content/bindings/dialog.xml,v <--
dialog.xml
new revision: 1.26; previous revision: 1.25
done
Checking in xpfe/global/resources/content/bindings/tabbox.xml;
/cvsroot/mozilla/xpfe/global/resources/content/bindings/tabbox.xml,v <--
tabbox.xml
new revision: 1.31; previous revision: 1.30
done
Checking in xpfe/global/resources/content/bindings/tabbrowser.xml;
/cvsroot/mozilla/xpfe/global/resources/content/bindings/tabbrowser.xml,v <--
tabbrowser.xml
new revision: 1.101; previous revision: 1.100
done
Checking in toolkit/content/widgets/dialog.xml;
/cvsroot/mozilla/toolkit/content/widgets/dialog.xml,v <-- dialog.xml
new revision: 1.13; previous revision: 1.12
done
Checking in toolkit/content/widgets/tabbox.xml;
/cvsroot/mozilla/toolkit/content/widgets/tabbox.xml,v <-- tabbox.xml
new revision: 1.11; previous revision: 1.10
done
Checking in toolkit/content/widgets/tabbrowser.xml;
/cvsroot/mozilla/toolkit/content/widgets/tabbrowser.xml,v <-- tabbrowser.xml
new revision: 1.40; previous revision: 1.39
done
Checking in toolkit/themes/qute/global/tabbox.css;
/cvsroot/mozilla/toolkit/themes/qute/global/tabbox.css,v <-- tabbox.css
new revision: 1.3; previous revision: 1.2
done
Checking in toolkit/themes/winstripe/global/tabbox.css;
/cvsroot/mozilla/toolkit/themes/winstripe/global/tabbox.css,v <-- tabbox.css
new revision: 1.3; previous revision: 1.2
done
Status: ASSIGNED → RESOLVED
Closed: 20 years ago
Resolution: --- → FIXED
Comment 63•20 years ago
|
||
Oops. Moving the focus into the timeout means that the suppressFocusScroll never
takes effect :-[
Status: RESOLVED → REOPENED
Resolution: FIXED → ---
Assignee | ||
Comment 64•20 years ago
|
||
Assignee | ||
Updated•20 years ago
|
Attachment #153697 -
Flags: superreview?(neil.parkwaycc.co.uk)
Attachment #153697 -
Flags: review?(mconnor)
Comment 65•20 years ago
|
||
Comment on attachment 153697 [details] [diff] [review]
Duh, move scrolling suppression into local setFocus() and restore missing code from mozilla/toolkit version (for when tab bar is already focused)
sr=me on the xpfe patch if you don't move the setTimeout comment away from the
setTimeout call...
Attachment #153697 -
Flags: superreview?(neil.parkwaycc.co.uk) → superreview+
Comment 66•20 years ago
|
||
Comment on attachment 153697 [details] [diff] [review]
Duh, move scrolling suppression into local setFocus() and restore missing code from mozilla/toolkit version (for when tab bar is already focused)
okay, so that's twice that I read the whole patch and didn't submit the review.
Neil therefore beat me to the comment bit.
Attachment #153697 -
Flags: review?(mconnor) → review+
Assignee | ||
Comment 67•20 years ago
|
||
Checking in toolkit/content/widgets/tabbrowser.xml;
/cvsroot/mozilla/toolkit/content/widgets/tabbrowser.xml,v <-- tabbrowser.xml
new revision: 1.42; previous revision: 1.41
done
Checking in xpfe/global/resources/content/bindings/tabbrowser.xml;
/cvsroot/mozilla/xpfe/global/resources/content/bindings/tabbrowser.xml,v <--
tabbrowser.xml
new revision: 1.102; previous revision: 1.101
done
Status: REOPENED → RESOLVED
Closed: 20 years ago → 20 years ago
Resolution: --- → FIXED
Keywords: aviary-landing
Comment 68•20 years ago
|
||
Relanding relevant parts of patch following aviary branch landing
Keywords: aviary-landing
Assignee | ||
Comment 69•20 years ago
|
||
This has regressed since aviary stuff started getting merged in. With a build
from 12/2/2004 I cannot put focus on a tab label.
Status: RESOLVED → REOPENED
Resolution: FIXED → ---
Assignee | ||
Updated•20 years ago
|
Component: Keyboard: Navigation → Keyboard Navigation
Product: Core → Firefox
Assignee | ||
Comment 70•20 years ago
|
||
Assignee | ||
Updated•20 years ago
|
Attachment #167675 -
Flags: superreview?(neil.parkwaycc.co.uk)
Attachment #167675 -
Flags: review?(bugzilla)
Keywords: aviary-landing
Comment 71•20 years ago
|
||
Comment on attachment 167675 [details] [diff] [review]
mozilla/toolkit changes that were eaten by aviary branch landing
Was previously reviewed so doesn't need doing again - sorry I missed this first
time round, I only checked in the second patch.
Attachment #167675 -
Flags: superreview?(neil.parkwaycc.co.uk)
Attachment #167675 -
Flags: review?(bugzilla)
Comment 72•20 years ago
|
||
Relanding relevant parts of first patch following landing of aviary branch -
previously reviewed
Status: REOPENED → RESOLVED
Closed: 20 years ago → 20 years ago
Keywords: aviary-landing
Resolution: --- → FIXED
Comment 73•20 years ago
|
||
Relanding missing line from tabbrowser.xml following landing of aviary branch -
previously reviewed
Comment 74•20 years ago
|
||
(In reply to comment #72)
> Relanding relevant parts of first patch following landing of aviary branch -
> previously reviewed
There are still changes from the browser.css files that are missing (and
breaking the tab loading indicator in today's builds):
http://bonsai.mozilla.org/cvsquery.cgi?date=explicit&mindate=2004-07-24+15%3A50&maxdate=2004-07-24+16%3A00
Assignee | ||
Comment 75•20 years ago
|
||
Relanding missing lines from browser.css in qute and winstripe themes following
landing of aviary branch - previously reviewed.
Should fix the missing tab loading indicators.
Comment 76•20 years ago
|
||
The only difference I see now is in tabbox.xml where the trues and falses have
been reversed:
http://bonsai.mozilla.org/cvsview2.cgi?command=DIFF&subdir=mozilla%2Ftoolkit%2Fcontent%2Fwidgets&file=tabbox.xml&rev1=1.16&rev2=1.18&whitespace_mode=ignore&diff_mode=context
Comment 77•19 years ago
|
||
> this.mCurrentBrowser.focusedElement.blur();
This throws if the focusedElement is not HTML or XUL (say an <svg:a> or an XLink), which pretty completely horks the UI... See bug 323805 and 323806
Assignee | ||
Comment 78•17 years ago
|
||
> this.mCurrentBrowser.focusedElement.blur();
This is also causing bug 382007.
You need to log in
before you can comment on or make changes to this bug.
Description
•