FreedomScientific / standards-support

Contains documentation for Vispero software support of Web standards
https://freedomscientific.github.io/standards-support/
GNU General Public License v3.0
111 stars 12 forks source link

JAWS is not reading the first element in the dropdown list #547

Closed emshedu closed 3 years ago

emshedu commented 3 years ago

Summary

With the highlight cursor activated on Chrome or FireFox, JAWS fails to read the first item of an autogenerated dropdown list. JAWS reads the hidden alert messages and title of the dropdown first and fails to eventually read the first item on the list even if it is currently being highlighted. If one pushes the down button (in attempt to traverse the list), and goes back up, JAWS then reads the first item.

Expected result

After reading the alert 'n items were loaded", Jaws should recognize and read the first item it is currently highlighting

Actual result

JAWS only reads the alert and ignores the first item being highlighted

Additional Information

JAWS version: JAWS 2020.2013.13.ILM & JAWS 2021.2102.34.ILM

We tried including Aria-live="polite" to force JAWS to recognize and prioritze changes n the UI but this partially solves the issue; 1 out of 10 times it reads the first item completely, 9 out of 10 times it jumble the words and even if it reads the items completely it is out of order. Expected behavior, read the alerts first then the first item Actual behavior (1/10): It reads the first item completely then the alert Actual behavior (9/10): It reads the first item incompletely (jumbles up the item with the alert) then the alert

Operating System and version

Windows

Browser and version:

Chrome Version 91.0.4472.106

menovak commented 3 years ago

hi emshedu

could you please share some source code or a working autogenerated dropdown in a codepen so we may evaluate locally please?

thanks mark

emshedu commented 3 years ago

Hi Thank you for the very prompt reply. I am not sure I can provide the source code, here is the autogenerated code: `

`

menovak commented 3 years ago

hi emshedu,

whatever you provided (the code appeared to be a checkboxes and DIV with role="presentation" - with some resultant text ) - will not be adequate for us to test locally

Is your drop down from a combo box, or a listbox or something else for example, without seeing code or being able to access a website it is very difficult to help.

Is your drop down totally custom or are you using a library or frameworks component?

Are you using an aria-live with 'assertive' which could cancel cause a race condition and cancel the list item announcement??

Are you using aria-activedescendent for the drop down???

As you can see it is hard to understand if we can't see or have access to the actual code...

thanks Mark

ps: Note that is one of the items asked for in the Reporting Issues -> Test case that demonstrates the issue - provide linked test case codepen/JSbin etc. <-

emshedu commented 3 years ago

Hi, I apologize for the inconvenience. I cannot provide the source code because it is proprietary. I can however provide a replica of the source code which will contain relevant information pertaining to JAWS functionality, answer your above questions and i have also created a screen recorded video of the behavior with and without aria-live attribute

Is your drop down from a combo box, or a list box or something else for example, without seeing code or being able to access a website it is very difficult to help? The Dropdown is a combo box that houses a DataGrid of type dojox/grid (refer to the code for more information)

Is your drop down totally custom or are you using a library or frameworks component? The dropdown is not totally custom but modifications has been made to it to suite the needed functionality. Its base is a widget gotten from dojo

Are you using an aria-live with 'assertive' which could cancel cause a race condition and cancel the list item announcement??

Are you using aria-activedescendent for the drop down??? We are currently not using any aria-live attribute, however, for testing purposes, we tried aria-live="polite" within as an attribute of the widget, but its behavior is erratic and not reliable

I understand the difficulty in this situation; I do hope the information I have provided in this reply will be sufficient to begin to understand the issue.

USERSELECTOR.js contains the definition of the widget. NOTE this is incomplete/partial psuedocode that still demonstrates the structure of the dropdown and the parent widgets used to build it

function(ContentPane, _TemplatedMixin, _WidgetsInTemplateMixin, Tooltip, Select, Button, RadioButton, TextBox, DataGrid, idxHtml, _ModelStore, Repository, Directory, User, UserGroup, Common, _MoveUpDownMixin, template) {

/**
 * @name UserGroupSelector
 * @class Provides a widget that is used to select a user or group. This widget can be configured to display both
 *        users and groups or only users. The widget can also be configured to support multiple selections or only
 *        single selections.
 * @augments dijit._Widget
 */
     var UserGroupSelector = declare("mmo.widget.UserGroupSelector", [
ContentPane,
_TemplatedMixin,
_WidgetsInTemplateMixin,
_MoveUpDownMixin
    ],{
    templateString: template,
    widgetsInTemplate: true,

    constructor: function(args) {
        this._directoriesById = {};
        if (!this._availableGridItems) {
            this._availableGridItems = [];
        }
        if (!this._selectedGridItems) {
            this._selectedGridItems = [];
        }
        if (args) {
            if (args.selectedItems)
                this._selectedGridItems = lang.clone(args.selectedItems);
            this.queryAcrossDomains = args["queryAcrossDomains"] != true ? false : true;
            this.excludeICMAdmin = !!args["excludeCMAdminAccounts"];
        }
    },

    postCreate: function() {
        this.inherited(arguments);
        this.textDir = has("text-direction");
        domAttr.set(this._addButton.focusNode, "aria-label", this._messages.add_tooltip);
        domAttr.set(this._removeButton.focusNode, "aria-label", this._messages.remove_tooltip);

        // Render the available and selected grids
        this._renderResultGrid();
        if (this.queryMode == this._QUERY_MODE.USERS) {
            domClass.add(this._scopeSection, "dijitHidden");
            domStyle.set(this._nameType, "display", "none");
            this._addNameLabel.innerHTML = this._messages.add_user_label;
        } else {
            this._scope.set("value", this.defaultScope);
            if (this.showPseudoGroups) {
                this._scope.addOption({
                    label: idxHtml.escapeHTML(this._messages.pseudo_group_label),
                    value: "pseudogroups"
                });
            }
        }

        if (this.selectionMode == this._SELECTION_MODE.SINGLE) {
            domClass.add(this._centerPane, "dijitHidden");
            domClass.add(this._buttonPane, "dijitHidden");
            domStyle.set(this._moveUpDownButtonContainer, "display", "none");
        } else {
            if (!this.hasSorting) { // hide the up down arrows pane if sorting is disabled
                domStyle.set(this._moveUpDownButtonContainer, "display", "none");
            } else {
                domClass.add(this._selectedDataGridContainer, "hasSorting");
            }
            this._renderSelectedGrid();

            // create a tooltip for the add button
            var toolTip = new dijit.Tooltip({
                connectId: [
                    this._addButton.domNode
                ],
                label: idxHtml.escapeHTML(this._messages.add_tooltip)
            });
            toolTip.startup();
            // create a tooltip for the remove button
            toolTip = new dijit.Tooltip({
                connectId: [
                    this._removeButton.domNode
                ],
                label: idxHtml.escapeHTML(this._messages.remove_tooltip),
                showDelay: 700
            });
            toolTip.startup();
        }

        if( this.dialogMode == this._DIALOG_MODE.ADMIN_LDAP_GROUP ){
            domClass.add(this._directorySection, "dijitHidden");
            domClass.add(this._buttonPane2, "dijitHidden");
        }

        if (this.showPseudoUsers)
            this._pseudoUserOptionsNode.style.display = "block";
    },

    /**
     * Renders the user group selector pane
     */
    createRendering: function(repository) {
        // If the repository allows searching of users/groups, show the search fields.  Otherwise, show arbitrary add fields.
        if (repository) {
            this.repository = repository;
            if (repository.privileges.findUsersAndGroups) {
                domClass.add(this._addSection, "dijitHidden");
                if (this.queryMode != this._QUERY_MODE.USERS) {
                    domClass.remove(this._scopeSection, "dijitHidden");
                }
                domClass.remove(this._searchSection, "dijitHidden");
                domClass.add(this._buttonPane2, "dijitHidden");

                if( mmo.model.desktop && mmo.model.desktop._isPlatform() && this.repository && this.repository._isSolution() && this._scope ){
                    this._scopeSectionLabel.innerHTML = this._messages.scope_filter_label + " " + this._messages.teams_label;// set to Filter by:

                    if( this._scope.options && this._scope.options.length && this._scope.options.length > 0 ){      
                        var newOptions = [];        
                        newOptions.push( dojo.fromJson("{ disabled: false, label: \"" + this._messages.teams_label + "\", selected: true, value: \"teams\"}" ) );       
                        this._scope.options = newOptions;       
                        this.defaultScope = "teams";        
                        this._scope.set("value", this.defaultScope);
                        this._scope.domNode.classList.add("dijitHidden");
                    }       
                }       

            } else {
                this._abitraryMode = true;
                if (!this._selectedGrid) {
                    domClass.remove(this._centerPane, "dijitHidden");
                    this.renderSelectedGrid();
                }

                domClass.add(this._leadingPane, "dijitHidden");
                domClass.add(this._buttonPane, "dijitHidden");
                domClass.remove(this._addSection, "dijitHidden");
                domClass.add(this._scopeSection, "dijitHidden");
                domClass.add(this._searchSection, "dijitHidden");
                domClass.remove(this._buttonPane2, "dijitHidden");
                this._nameTypeUserRadioButton.set("checked", true);
            }
            if (repository._isP8()) {
                this.getDirectories(lang.hitch(this, function(domains) {
                    this._directoriesById = {};
                    array.forEach(domains, function(dir) {
                        this._directoriesById[dir.id] = dir;
                    }, this);

                    this.renderDomains(domains);

                    // Don't display the realm selector if there is only one realm listed.
                    if (this._directoryName.options.length < 2) {
                        domClass.add(this._directorySection, "dijitHidden");
                    }
                }));
            } else {
                domClass.add(this._directorySection, "dijitHidden");
                this.onLoaded();
            }

            this.setUserSearchLabel();
        }
        if( this.dialogMode == this._DIALOG_MODE.ADMIN_LDAP_GROUP ){
            var newOptions = [];        
            newOptions.push( dojo.fromJson("{ disabled: false, label: \"" + this._messages.groups_label + "\", selected: true, value: \"groups\"}" ) );     
            this._scope.options = newOptions;       
            this.defaultScope = this._QUERY_MODE.GROUPS;        
            this._scope.set("value", this.defaultScope);
            this._scope.set("disabled", true);
        }
    },

    renderResultGrid: function() {
        // Initialize result grid data store
        this._resultStore = new mmo.model._ModelStore(this, this._getAvailableStore, function(item) {
            return this._newItem(this._availableGridItems, item);
        }, function(item) {
            return this._deleteItem(this._availableGridItems, item);
        });

        var layout = [
            {
                field: "name",
                name: this._messages.available_heading,
                width: "100%",
                formatter: lang.hitch(this, function(data, rowIndex) {
                    return this._getCellValue(this._resultGrid.getItem(rowIndex));
                })
            }
        ];

        // Renders available grid.
        this._resultGrid = new DataGrid({
            canSort: function() {
                return false;
            },
            selectionMode: this.selectionMode,
            store: this._resultStore,
            structure: layout,
            textDir: this.textDir
        });

        // fix DAP violation - An interactive element/widget must have an accessible name.
        this._resultGrid.domNode.setAttribute("aria-label", this._messages.available_label);

        this._resultDataGrid.appendChild(this._resultGrid.domNode);
        this._resultGrid.startup(); // Call startup to render the grid
        this._connectGridTooltip(this._resultGrid);
        if (this.selectionMode == this._SELECTION_MODE.MULTIPLE) {
            connect.connect(this._resultGrid, "onRowDblClick", this, function(e) {
                if (domClass.contains(this._resultGrid.domNode, "dijitDisabled"))
                    return;

                this._hideTooltip();
                var item = this._resultGrid.getItem(e.rowIndex);
                this._addItems([
                    item
                ]);
            });
            connect.connect(this._resultGrid, "onSelected", this, function(index) {
                this._addButton.set("disabled", false);
            });
            connect.connect(this._resultGrid, "onDeselected", this, function(index) {
                this._addButton.set("disabled", true);
            });
        } else {
            connect.connect(this._resultGrid, "onRowDblClick", this, function(e) {
                this._hideTooltip();
                this.onChange();
            });
            connect.connect(this._resultGrid, "onSelected", this, function(index) {
                this.onSelectionChanged(this._resultGrid.selection.getSelected());
            });
            connect.connect(this._resultGrid, "onDeselected", this, function(index) {
                this.onSelectionChanged();
            });
        }
    },

    renderSelectedGrid: function() {
        // Initialize result grid data store
        this._selectedStore = new mmo.model._ModelStore(this, this._getSelectedStore, function(item) {
            return this._newItem(this._selectedGridItems, item);
        }, function(item) {
            return this._deleteItem(this._selectedGridItems, item);
        });
        this._selectedStore._arrayOfTopLevelItems = this._selectedGridItems;

        var layout = [
            {
                field: "name",
                name: this._messages.selected_heading,
                formatter: lang.hitch(this, function(data, rowIndex) {
                    return this._getCellValue(this._selectedGrid.getItem(rowIndex));
                }),
                width: "100%"
            }
        ];

        // Renders available grid.
        this._selectedGrid = new DataGrid({
            canSort: function() {
                return false;
            },
            selectionMode: "extended",
            store: this._selectedStore,
            structure: layout,
            textDir: this.textDir
        });

        // fix DAP violation - An interactive element/widget must have an accessible name.
        this._selectedGrid.domNode.setAttribute("aria-label", this._messages.selected_label);

        this._selectedDataGrid.appendChild(this._selectedGrid.domNode);
        this._selectedGrid.startup(); // Call startup to render the grid
        this._connectGridTooltip(this._selectedGrid);
        this.connect(this._selectedGrid, "onRowDblClick", function(e) {
            if (domClass.contains(this._selectedGrid.domNode, "dijitDisabled"))
                return;

            this._hideTooltip();
            var item = this._selectedGrid.getItem(e.rowIndex);
            this._removeItems([
                item
            ], e.rowIndex);
        });
        this.connect(this._selectedGrid, "onSelected", function(index) {
            this._removeButton.set("disabled", false);
            this._removeButton2.set("disabled", false);
        });
        connect.connect(this._selectedGrid, "onDeselected", this, function(index) {
            this._removeButton.set("disabled", true);
            this._removeButton2.set("disabled", true);
        });
        if (this.hasSorting) {
            this.connect(this._selectedGrid.selection, "onChanged", function() {
                this._upButton.set('disabled', !this._hasRowsToMoveUp(this._selectedGrid));
                this._downButton.set('disabled', !this._hasRowsToMoveDown(this._selectedGrid));
            });
        }
    },

    _nop: null
});

/**
 * This is a special pseudo user called Me.
 */
UserGroupSelector.PSEUDO_USER_ME = new User({
    id: "{ME}",
    name: mmo.messages.me,
    shortName: "{ME}",
    displayName: mmo.messages.me
});

return UserGroupSelector;

});

UserGroupSeletor.html is the corresponding html page for the above script. This has also beenstripped to contain the minimum data needed

<div data-dojo-attach-point="_leadingPane" class="leadingPane" >                                        
      <div data-dojo-attach-point="_resultGridContainer">                         
          <div class="resultGrid" data-dojo-attach-point="_resultDataGrid"></div>             
      </div>                                         
   </div>          
   <div data-dojo-attach-point="_centerPane" class="centerPane" >
        <div class="buttonPane" data-dojo-attach-point="_buttonPane">
            <div>
                <div id="ADD_${id}" showLabel="false" iconClass="addButton" data-dojo-attach-point="_addButton" data-dojo-type="ecm.widget.Button" data-dojo-attach-event="onClick: _onAdd" disabled="disabled"></div>                                          
            </div>
        </div>
        <div class="selectedGridContainer" data-dojo-attach-point="_selectedDataGridContainer">                     
            <div data-dojo-attach-point="_selectedDataGrid" class="selectedGrid"></div>
        </div>   
        </div>
    </div>

I hope this helps!

menovak commented 3 years ago

hi emshedu,

1 - so if this is a widget from dojo, can you provide the URL for that at least so I grab the same widget, then I could test what dojo offers as a start.

2 - am i understanding correct then, the dropdown from dojo (as is) did not announce something about the number of results so you attempted to adde aria-live and that is where you get the erratic results (does not always announce) and that is the issue you would like to correct?

3 - screen images may make help show the issue as well ...

thanks mark

emshedu commented 3 years ago

1 - so if this is a widget from dojo, can you provide the URL for that at least so I grab the same widget, then I could test what dojo offers as a start. -> https://dojotoolkit.org/reference-guide/1.9/dojox/grid/DataGrid.html

2 - am i understanding correct then, the dropdown from dojo (as is) did not announce something about the number of results so you attempted to adde aria-live and that is where you get the erratic results (does not always announce) and that is the issue you would like to correct? -> It does announce the number of entry the issue is that it does not announce the first item in the result set. When is do add the aria-live attribute it recognizes and read the first item but it seems to be overractive (as-in it jumbles up the words, does not fully read the first list before it continues reading the previous alerts) I have a video recording of the behavior but i am not sure how to send it

3 - screen images may make help show the issue as well -> How do I attach these images/video

menovak commented 3 years ago

hi emshedu,

you should be able to drag and drop a file here, but if that doesn't work, you can email to me directly at: mnovak@paciellogroup.com

thanks mark

menovak commented 3 years ago

hi emshedu,

i did a quick glance at the content in the URL you provided and it seems to be all about grids - i'm confused about where is the dropdown part now?

thanks mark

emshedu commented 3 years ago

JAWS without aria-live. My apologies, because of the platform it is recorded on, it isnt very clear:

https://user-images.githubusercontent.com/25491329/123304758-2b53ce80-d4d4-11eb-86aa-698d1dadb355.mp4

JAWS with aria-live polite. This video is audible and you can hear the inconsistency:

https://user-images.githubusercontent.com/25491329/123305876-74585280-d4d5-11eb-8aba-92479379f62d.mp4

To answer the question above, the grid is contained within the dropdown. I think the grid contained within the dropdown is where the main source of the issue

menovak commented 3 years ago

thanks for trying to share video - the first one I really can't make out the audio, but the second one is more understandable.

I hear 'button menu' announced which leads me to believe this is NOT a combo box - JAWS would (or should ) announce role="combobox" for the proper pattern per the APG, so that is my first concern. Either way, if a combobox or a menu button, I did not hear aria-expanded announced, do you hear that (expanded/collapsed) or can you find if that attribute is used in the source code ?

Second, I'm totally not sure why your dropdown w/should be a a grid widget - as you said that maybe contributing to the issue. For example I know grid popup/dropdown can be part of a combobox, but I don't believe it is supported under menu button.

Third, the dojo site you provided a URL to talks about accessibility and "" (Firefox 3.5+ and IE 8) and screen readers (JAWS 11) "" which is way out of date, so I'm not feeling real good about the accessibility when using any components from there, if there hasn't been any updates or changes.

If you goto Sarah's site and test the very last codepen examples (3 of them) using JAWS you should hear the proper announcements, and maybe her source code can provide some clues?

emshedu commented 3 years ago

Hi, I apologize for the confusion I might have caused above. Here is a better explanation of the situation. We have a text area, that allows users to enter any text to search, The result of the search is generated in a table as you see in the above video. The issue is that when focus changes from the text area to the first row of the generated table, JAWS reads it as "Title (Available) column grid, Column 1 Row 2 available" instead of "Title (Available) column grid, actual name available" which it does if we manually traversed the table list down and then back up to the first item.

I hope this helps clarify. I do not think the dojo framework has anything to do with it, if it works on manual focus

** - item of concern

menovak commented 3 years ago

well you've totally confused what I thought the issue was...

can you run the same test with NVDA with the speech viewer tool enabled and cut&paste the text output from NVDA and share it ?

please include the keypresses if you can add it.

emshedu commented 3 years ago

s u alert The search returned 7 users. Available: table Available row 2 Available column 1 Available row 3 Available column 1 Available row 2 Available column 1

emshedu commented 3 years ago

NVDA does not ever read the content manually or not

menovak commented 3 years ago

hmnn, if NVDA doesn't announce correctly, then perhaps this is poor/incorrect code versus any screen reader issue, but again I'm guessing.

are you just arrowing up or down to product that output?

if this is a table, have you tried to navigate it using the screen reader's table navigation keys? JAWS (and NVDA) have the ability to announce the current cell in a table - JAWS hot keys to do this are ctrl+alt+numpad 5. After a search, and you TAB to the table first cell, what does JAWS announce if you try that keyboard command?

bottom line - I can just keep guessing but without access to your source code or web site, i'm not sure how we are going to get to the bottom of this issue - I can not even file a bug if I can't show the code which causes the bug. ideas?

emshedu commented 3 years ago

are you just arrowing up or down to product that output? Yes, I arrowed up and down to produce that output. In JAWS it reads correctly when I arrow down or up (It is my first time testing or trying NVDA, so I cannot speak to it)

if this is a table, have you tried to navigate it using the screen reader's table navigation keys? JAWS (and NVDA) have the ability to announce the current cell in a table - JAWS hot keys to do this are ctrl+alt+numpad 5. After a search, and you TAB to the table first cell, what does JAWS announce if you try that keyboard command? No I haven't tried that yet, I will run the test and report back

As far as getting the source code, I will look more into it. Thank you for very prompt reply. I will get back to you shortly

emshedu commented 3 years ago

Hi, I have tried most of the JAWS hot keys combination to attempt to read the first value but it doesnt work. I dont know if it is a code issue if JAWS announces the cell name when traversing wit arrow up or down key but doesnt when changing focus automatically It would be fine as a workaround but this doesnt work when there is only one item returned in the table.

menovak commented 3 years ago

hi

Good to hear from you again - I am not aware of any issues with JAWS announcing in proper coded tables, whether that table is 1 row, 1 column of 1 data cell, or tens of rows, tens of columns and hundred of data cells!

This link at WebAIM has most all of the JAWS table navigation keys. Once the table has focus, these combinations should work where applicable. Could you try the control+alt+home/end ?

https://webaim.org/resources/shortcuts/jaws#tables

thanks

emshedu commented 3 years ago

Okay, I took a look at the link. I also ran some more test. Question: What is the difference in what JAWS does on the back end between (automatically changing focus or using control+alt+home/end or tab) and (navigating using the arrow keys). In the first option JAWS does not recognize the cells, and refers to them by the aria-label of the parent (Header column). When using the arrow keys, JAWS can then read the cells. I tried the keys from the link you sent but it doesnt read the current cell. If it works for up arrow (read prior line), and down arrow (read next line), why wouldn't it work to read current cell

Also, the above behavior can only be replicated on Google Chrome but not in Firefox. In FireFox, it only refers to them by the column header name + selected status

menovak commented 3 years ago

I can address the 2nd question first, with Firefox you have to be sure JAWS running prior to the firefox browser otherwise you may not get a true representation - so if you did not test in this fashion, suggest repeating that test. Having said that, however, it sounds like JAWS with Firefox is announcing a header and content (not sure what you mean by selected status) which would be the expected output from a table date cell.

I'm not a JAWS expert, but I can suggest some ideas for what you are seeing/hearing when you test in Chrome. If I tell you something you already know, I apologize in advance...

1 - JAWS has dedicated keys for navigating data tables. When you place focus into a data table, then to navigate within the data table you should use the table navigation keys - per the link I shared, table navigation keys are the ctrl+alt+arrow keys. Just using the arrow keys may or may not navigate a data table, but for testing purposes and trying to understand what is going on, if this is a data table, you need to navigate like a data table to try to get JAWS to announce the correct information.

2 - To place focus in the data table, if you are in JAWS browse mode, pressing the "t" keys should jump from table to table down the page. If there is only one table, you may have to press 'shift+t" to reverse or navigate back up to the table. Once JAWS finds a data table it should announce the table name or caption (if it exists) and also announce the number of rows and columns. Once you hear that, JAWS virtual focus is in the data table and you can then navigate within the table using keys per my answer to question one above

3 - If you want to understand the difference of how JAWS navigates/announced when in a data table using the table navigation keys versus just the up/down arrow keys, for example, please goto the WAI tutorial page and use JAWS to test the Example 1 table here:

https://www.w3.org/WAI/tutorials/tables/one-header/

Once on the page, if you press the 't' key, you should find the Example 1 table where JAWS should announce something like: table with 3 columns and 4 rows, column one row one date

Then if I press the down arrow key only, JAWS will navigate across the top row left to right, and when it reaches the end of the row one, it will revert back to the beginning of row two and continue: event venue 12 february, etc... Pressing the up arrow key alone navigates in reverse. Pressing the left/right arrow keys alone, JAWS announces/reads character by character.

If you go back to the beginning of the table, however, and navigate using table navigation keys (ctrl + alt + arrow keys) - using ctrl+alt+right arrow JAWS announces/reads : Event column 2, Venue column 3, end of row. Then if I press ctrl+alt+down arrow: Main hall row 2. Then if I press ctrl+alt+left arrow: Event, Waltxz with Strauss, column 2

Note, now JAWS announced the column header and the data cell content when navigating using table navigation keys. If you navigate only using up/down arrow you do not get the row, column and header information. I hope this helps answer your questions about the difference.

(btw, I am running JAWS with all default settings, other than I speed up the announcements.)

4 - did you find out if you could allow us to visit the website and view the source code -or- is there a chance you could share a screen shot of what the Chrome developers tool reveals (right click on the dropdown table and select Inspect from the context menu) and capture a screen shot of the source code with styling from Inspect.

emshedu commented 3 years ago

Thank you for the extensive explanation and guidance. I have spent time going over them. Most of the information, I already had. To respond to your question 4, may we please schedule a webex call, we could go over any questions and i am sure it will be a better transfer of information

menovak commented 3 years ago

If we get on a call, i'll need to coordinate on my end and ask one of the JAWS developers to join in, as without being able to view source code, we've kind of exhausted what I can do to assist. What time zone (part of the world) are you in? I am in midwest USA, and I believe the person who needs to join us lives in the eastern part of USA.

Also I am in the office tomorrow, and then out of the office until next Tuesday (27th) and off hand I do not know his schedule but will inquire.

menovak commented 3 years ago

Is there any chance you can cut and paste enough of the source code which demonstrated the issue into a codepen or something like that you could share (just another thought...).

emshedu commented 3 years ago

Thank you very much. I am in the West coast. I can work with whatever time works best for your developer. I am a free slot 11am PST (2pm EST/1pm CST) till 1:30 PST (4:30 EST/ 3:30 CST). If this doesn't work. You can propose a counter offer. Thank you very much again

menovak commented 3 years ago

I just talked with the developer and as feared, without code to review they can't even get on a call, so I can still chat with you but not sure I'll be able to assist any further but we can try.

I could probably chat tomorrow after 1:30 CST - I do not have webx, we use Teams and/or Skype - is WebX something i'd need to download I assume?

Off to meetings rest of the afternoon but will check back here later...

emshedu commented 3 years ago

Is there any chance you can cut and paste enough of the source code which demonstrated the issue into a codepen or something like that you could share (just another thought...).

I am sure if what i can share publicly will be helpful. I apologize again, i understand it can be frustrating on your end. Hopefully there will be better transfer of information. Also, to speak on the performance of firefox as mentioned above, starting JAWS prior to opening Mozilla made it function like Chrome as in up and down arrow keys announce the names of the cell but every other key like tab and JAWS(insert button) + up/down doesn't recognize the cell value but refers to them by the header name and whether it is the selected option or not

I just talked with the developer and as feared, without code to review they can't even get on a call, so I can still chat with you but not sure I'll be able to assist any further but we can try.

I could probably chat tomorrow after 1:30 CST - I do not have webx, we use Teams and/or Skype - is WebX something i'd need to download I assume?

Off to meetings rest of the afternoon but will check back here later...

Webex is what i already use. it is easy to share screen. we can also meet on Teams.

menovak commented 3 years ago

I am at my computer - we use Teams so if you wish to call me there, just let me know what time.

It is 1:50 pm CST here now

mnovak@tpgi.com

emshedu commented 3 years ago

I am trying to connect right now

emshedu commented 3 years ago

I started a meeting, here is the link: https://teams.live.com/meet/9393428784006

menovak commented 3 years ago

1 - For reading about roles and what role="presentation" does: https://www.w3.org/TR/wai-aria/#presentation https://www.w3.org/TR/wai-aria/#none

2 - For reviewing custom widgets, such as grids and listboxes, and trying some examples with JAWS: https://www.w3.org/TR/wai-aria-practices-1.2/#grid https://www.w3.org/TR/wai-aria-practices-1.2/#Listbox

Enjoyed chatting, i hope this helps...

menovak commented 3 years ago

Noting from customer in over 2 months

Closing