Files
loongoffice/toolkit
Michael Weghorn bf5af7725b tdf#164783 toolkit a11y: Only send event for current cell if there's one
TableControl::commitCellEventIfAccessibleAlive sends an event
on the currently selected/active cell. So only call it in
SVTXGridControl::ProcessWindowEvent when there is one.

Use TableControl::GetCurrentRow and TableControl::GetCurrentColumn
to check that, which return a special value (of -2) for the case there
is no active cell.

For TableControl::GetCurrentRow:

        /** retrieves the current row

            The current row is the one which contains the active cell.

            @return
                the row index of the active cell, or ->ROW_INVALID
                if there is no active cell, e.g. because the table does
                not contain any rows or columns.
        */
        sal_Int32 GetCurrentRow() const override;

The previous check whether the table has any rows was insufficient
and resulted in an invalid attempt to access vector elements at
negative indices.

For the tdf#164783 scenario:

    /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/debug/vector:508:
    In function:
        reference
        std::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>>::operator[](size_type)
        [_Tp = rtl::Reference<accessibility::AccessibleGridControlTableCell>,
        _Allocator =
        std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell>>]

    Error: attempt to subscript container with out-of-bounds index -6, but
    container only holds 60 elements.

    Objects involved in the operation:
        sequence "this" @ 0x5638c74e2350 {
          type = std::debug::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>, std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell> > >;
        }
    /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/debug/vector:508:
    In function:
        reference
        std::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>>::operator[](size_type)
        [_Tp = rtl::Reference<accessibility::AccessibleGridControlTableCell>,
        _Allocator =
        std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell>>]

    Error: attempt to subscript container with out-of-bounds index -6, but
    container only holds 60 elements.

    Objects involved in the operation:
        sequence "this" @ 0x5638c74e2350 {
          type = std::debug::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>, std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell> > >;
        }
        sequence "this" @ 0x5638c74e2350 {
          type = std::debug::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>, std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell> > >;
        }

    Fatal exception: Signal 6
    Stack:
    #0 sal::backtrace_get(unsigned int) at .../libreoffice/sal/osl/unx/backtraceapi.cxx:42
    #1 (anonymous namespace)::printStack(int) at .../libreoffice/sal/osl/unx/signal.cxx:289
    #2 (anonymous namespace)::callSystemHandler(int, siginfo_t*, void*) at .../libreoffice/sal/osl/unx/signal.cxx:330
    #3 (anonymous namespace)::signalHandlerFunction(int, siginfo_t*, void*) at .../libreoffice/sal/osl/unx/signal.cxx:427
    #4 /lib/x86_64-linux-gnu/libc.so.6(+0x3fda0) [0x7f7544649da0]
    #5 __pthread_kill_implementation at ./nptl/pthread_kill.c:44 (discriminator 1)
    #6 raise at ./signal/../sysdeps/posix/raise.c:27
    #7 abort at ./stdlib/abort.c:81
    #8 std::__throw_bad_exception() in /lib/x86_64-linux-gnu/libstdc++.so.6
    #9 std::__debug::vector<rtl::Reference<accessibility::AccessibleGridControlTableCell>, std::allocator<rtl::Reference<accessibility::AccessibleGridControlTableCell>>>::operator[](unsigned long) at /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/debug/vector:508
    #10 accessibility::AccessibleGridControlTable::getAccessibleChild(long) at .../libreoffice/vcl/source/accessibility/AccessibleGridControlTable.cxx:66
    #11 accessibility::AccessibleGridControlTable::getAccessibleCellAt(int, int) at .../libreoffice/vcl/source/accessibility/AccessibleGridControlTable.cxx:191
    #12 accessibility::AccessibleGridControl::commitCellEvent(short, com::sun::uno::Any const&, com::sun::uno::Any const&) at .../libreoffice/vcl/source/accessibility/AccessibleGridControl.cxx:272
    #13 accessibility::AccessibleGridControlAccess::commitCellEvent(short, com::sun::uno::Any const&, com::sun::uno::Any const&) at .../libreoffice/vcl/inc/accessibility/AccessibleGridControl.hxx:197
    #14 svt::table::TableControl_Impl::commitCellEvent(short, com::sun::uno::Any const&, com::sun::uno::Any const&) at .../libreoffice/toolkit/source/controls/table/tablecontrol_impl.cxx:2304
    #15 svt::table::TableControl::commitCellEventIfAccessibleAlive(short, com::sun::uno::Any const&, com::sun::uno::Any const&) at .../libreoffice/toolkit/source/controls/table/tablecontrol.cxx:470
    #16 SVTXGridControl::ProcessWindowEvent(VclWindowEvent const&) at .../libreoffice/toolkit/source/controls/svtxgridcontrol.cxx:823
    #17 VCLXWindow::WindowEventListener(VclWindowEvent&) at .../libreoffice/toolkit/source/awt/vclxwindow.cxx:390
    #18 VCLXWindow::LinkStubWindowEventListener(void*, VclWindowEvent&) at .../libreoffice/toolkit/source/awt/vclxwindow.cxx:383
    #19 Link<VclWindowEvent&, void>::Call(VclWindowEvent&) const at .../libreoffice/include/tools/link.hxx:101
    #20 vcl::Window::CallEventListeners(VclEventId, void*) at .../libreoffice/vcl/source/window/event.cxx:262
    #21 Control::CallEventListeners(VclEventId, void*) at .../libreoffice/vcl/source/control/ctrl.cxx:298
    #22 Control::ImplCallEventListenersAndHandler(VclEventId, std::function<void ()> const&) at .../libreoffice/vcl/source/control/ctrl.cxx:305
    #23 Control::EventNotify(NotifyEvent&) at .../libreoffice/vcl/source/control/ctrl.cxx:247
    #24 vcl::Window::CompatNotify(NotifyEvent&) at .../libreoffice/vcl/source/window/window.cxx:3943
    #25 vcl::Window::LoseFocus() at .../libreoffice/vcl/source/window/window.cxx:1861
    #26 svt::table::TableControl::LoseFocus() at .../libreoffice/toolkit/source/controls/table/tablecontrol.cxx:94
    #27 vcl::Window::CompatLoseFocus() at .../libreoffice/vcl/source/window/window.cxx:3912
    #28 vcl::Window::ImplAsyncFocusHdl(void*) at .../libreoffice/vcl/source/window/winproc.cxx:2127
    #29 vcl::Window::LinkStubImplAsyncFocusHdl(void*, void*) at .../libreoffice/vcl/source/window/winproc.cxx:2033
    #30 Link<void*, void>::Call(void*) const at .../libreoffice/include/tools/link.hxx:101
    #31 ImplHandleUserEvent(ImplSVEvent*) at .../libreoffice/vcl/source/window/winproc.cxx:2288
    #32 ImplWindowFrameProc(vcl::Window*, SalEvent, void const*) at .../libreoffice/vcl/source/window/winproc.cxx:2849
    #33 SalFrame::CallCallback(SalEvent, void const*) const at .../libreoffice/vcl/inc/salframe.hxx:311
    #34 SalGenericDisplay::ProcessEvent(SalUserEventList::SalUserEvent) at .../libreoffice/vcl/unx/generic/app/gendisp.cxx:67
    #35 SalUserEventList::DispatchUserEvents(bool)::$_0::operator()() const at .../libreoffice/vcl/source/app/salusereventlist.cxx:119
    #36 SalUserEventList::DispatchUserEvents(bool) at .../libreoffice/vcl/source/app/salusereventlist.cxx:120
    #37 SalGenericDisplay::DispatchInternalEvent(bool) at .../libreoffice/vcl/unx/generic/app/gendisp.cxx:51
    #38 call_userEventFn(void*) at .../libreoffice/vcl/unx/gtk3/gtkdata.cxx:827
    #39 /lib/x86_64-linux-gnu/libglib-2.0.so.0(+0x5a81f) [0x7f7536f0b81f]
    #40 /lib/x86_64-linux-gnu/libglib-2.0.so.0(+0x5ca57) [0x7f7536f0da57]
    #41 g_main_loop_run in /lib/x86_64-linux-gnu/libglib-2.0.so.0
    ...

Change-Id: Iafed90e6985cf2c05d65be5f74334f58b369d945
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180661
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
(cherry picked from commit 57906dde339a71eee87437ae2d11c7474c03befd)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180680
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2025-01-24 11:40:48 +01:00
..

Abstract Windowing Toolkit

"Abstract" windowing thing. UNO implementations of windowing stuff so that it can be used from Basic or Java. But also stuff that has no connection to Basic or Java.

Notes

The "awt" here has no relation to the Java AWT, as far as I know. It might be inspired by it API-wise, perhaps. (If you know differently, feel free to improve this README.md file.)

Also note that toolkit/ is itself not really a toolkit, it is at root a reasonably simple wrapper of vcl/. If you came here looking for a toolkit, please look at vcl/ instead.