Technical details Log's referral number: 3403c49e-7d24-4de1-84ee-fa7acbbd126c Cause Referer URL: https://bugreports.qt.io/browse/QTBUG-79280 com.atlassian.jira.exception.DataAccessException: org.ofbiz.core.entity.GenericEntityException: while updating: [GenericEntity:Action][updateauthor,mitch_curtis][issue,286964][level,null][author,mitch_curtis][created,2022-02-22 05:26:02.0][rolelevel,null][id,647661][type,comment][body,After some discussion with Richard, it seems we should separate Z order from focus: [https://codereview.qt-project.org/c/qt/qtquickcontrols2/+/288523/8..10/src/quicktemplates2/qquickpopup.cpp#2426] h4. One possible fix The simplest fix that came to mind was to only return true in isBlockedByPopup if the popup in question had activeFocus: {code:java} if (popup->isModal() || (popup->closePolicy() & QQuickPopup::CloseOnEscape && popup->hasActiveFocus())) { return item != popup->popupItem() && !popup->popupItem()->isAncestorOf(item); } {code} However, that breaks one test function: {code:java} FAIL! : tst_QQuickPopup::Basic::closeOnEscapeWithNestedPopups() 'settingsDialog->isVisible()' returned FALSE. () Loc: [/Users/mitch/dev/qt-dev/qtdeclarative/tests/auto/quickcontrols2/qquickpopup/tst_qquickpopup.cpp(1246)] {code} The relevant code from the test (in case the line numbers are off): {code:java} // Close the combo box popup with the escape key. The settings dialog should still be visible. QTest::keyClick(window, Qt::Key_Escape); QTRY_VERIFY(!comboBox->popup()->isVisible()); QVERIFY(settingsDialog->isVisible()); {code} h4. How it currently works To help myself understand the escape shortcut handling, I've documented how it currently works for the use case tested by tests/auto/quickcontrols2/qquickpopup/data/closeOnEscapeWithNestedPopups.qml. When the Escape key is pressed (on macOS) with the ComboBox popup open, this is the stack trace leading up to isBlockedByPopup: {noformat} 1 isBlockedByPopup(QQuickItem *) qquickshortcutcontext.cpp 57 0x10cc0c96d 2 QQuickShortcutContext::matcher(QObject *, Qt::ShortcutContext) qquickshortcutcontext.cpp 95 0x10cc0c902 3 QShortcutEntry::correctContext() const qshortcutmap.cpp 79 0x103473bcb 4 QShortcutMap::find(QKeyEvent *, int) qshortcutmap.cpp 460 0x103473bbf 5 QShortcutMap::nextState(QKeyEvent *) qshortcutmap.cpp 375 0x103472ada 6 QShortcutMap::tryShortcut(QKeyEvent *) qshortcutmap.cpp 331 0x1034729bb 7 QWindowSystemInterface::handleShortcutEvent(QWindow *, unsigned long, int, QFlags, unsigned int, unsigned int, unsigned int, QString const&, bool, unsigned short) qwindowsysteminterface.cpp 498 0x103176648 8 KeyEvent::sendWindowSystemEvent(QWindow *) const qnsview_keys.mm 282 0x1018c9b45 9 -[QNSView(Keys) handleKeyEvent:] qnsview_keys.mm 63 0x1018c87e5 10 -[QNSView(Keys) keyDown:] qnsview_keys.mm 126 0x1018c9cb3 11 -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] (x86_64) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff817006328 12 -[NSWindow(NSEventRouting) sendEvent:] (x86_64) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff81700451a 13 -[QNSWindow sendEvent:] qnswindow.mm 382 0x1018d289f 14 -[NSApplication(NSEvent) sendEvent:] (x86_64) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff817003356 15 -[QNSApplication sendEvent:] qcocoaapplication.mm 176 0x1018651aa 16 -[NSApplication _handleEvent:] (x86_64) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff8172bb89f 17 -[NSApplication run] (x86_64) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff816e835ce 18 QCocoaEventDispatcher::processEvents(QFlags) qcocoaeventdispatcher.mm 430 0x1018730cc 19 QEventLoop::processEvents(QFlags) qeventloop.cpp 136 0x103c1bc96 20 QEventLoop::exec(QFlags) qeventloop.cpp 218 0x103c1bc78 ... {noformat} I'm using this example app based on the test's QML file: {code:java} import QtQuick 2.14 import QtQuick.Controls 2.14 import QtQuick.Layouts 1.14 ApplicationWindow { id: root width: 600 height: 400 visible: true title: "activeFocusItem: " + activeFocusItem onActiveFocusItemChanged: print("activeFocusItem:", activeFocusItem) header: ToolBar { ToolButton { objectName: "optionsToolButton" text: "Options" onClicked: optionsMenu.open() Menu { id: optionsMenu Component.onCompleted: optionsMenu.setObjectNames("optionsMenu") x: parent.width - width transformOrigin: Menu.TopRight MenuItem { objectName: "settingsMenuItem" text: "Settings" onTriggered: settingsDialog.open() } } } } Shortcut { sequence: "Esc" enabled: stackView.depth > 1 onActivated: stackView.pop() } Component { id: itemComponent Item {} } StackView { id: stackView objectName: "stackView" anchors.fill: parent initialItem: Item { objectName: "initialStackViewItem" } Component.onCompleted: push(itemComponent) } Dialog { id: settingsDialog objectName: "settingsDialog" modal: true Component.onCompleted: settingsDialog.setObjectNames("settingsDialog") contentItem: ComboBox { objectName: "comboBox" model: 10 Component.onCompleted: popup.setObjectNames("comboBoxPopup") } } } {code} Debugging output with [https://codereview.qt-project.org/c/qt/qtdeclarative/+/393888/6] and QT_LOGGING_RULES=qt.gui.shortcutmap=true after opening the ComboBox, pressing escape to close it, and then quitting the app: {noformat} 13:12:996 itemChange QQuickPopup(0x6000009201c0) is ungrabbing 13:12:997 itemChange QQuickPopup(0x6000009396c0) is ungrabbing 13:13:031 itemChange QQuickPopup(0x600000928fc0) is ungrabbing 13:13:036 QShortcutMap::addShortcut(QQuickShortcut(0x7f9ef37df490), QKeySequence("Esc"), Qt::WindowShortcut) added shortcut with ID -1 13:13:818 activeFocusItem: QQuickContentItem(0x600003007d00, "ApplicationWindow") 13:16:746 itemChange Menu_QMLTYPE_3(0x6000009201c0, name = "optionsMenu") is grabbing 13:16:746 QShortcutMap::addShortcut(QQuickPopupItem(0x6000030243e0, name = "optionsMenu"), QKeySequence("Back"), Qt::WindowShortcut) added shortcut with ID -2 13:16:746 QShortcutMap::addShortcut(QQuickPopupItem(0x6000030243e0, name = "optionsMenu"), QKeySequence("Esc"), Qt::WindowShortcut) added shortcut with ID -3 13:16:746 activeFocusItem: QQuickPopupItem(0x6000030243e0, "optionsMenu") 13:16:765 activeFocusItem: MenuItem_QMLTYPE_1(0x600000939420, "settingsMenuItem") 13:18:246 itemChange Dialog_QMLTYPE_13(0x6000009396c0, name = "settingsDialog") is grabbing 13:18:246 QShortcutMap::addShortcut(QQuickPopupItem(0x6000030391e0, name = "settingsDialog"), QKeySequence("Back"), Qt::WindowShortcut) added shortcut with ID -4 13:18:246 QShortcutMap::addShortcut(QQuickPopupItem(0x6000030391e0, name = "settingsDialog"), QKeySequence("Esc"), Qt::WindowShortcut) added shortcut with ID -5 13:18:246 activeFocusItem: QQuickRootItem(0x6000030078a0) 13:18:247 itemChange Menu_QMLTYPE_3(0x6000009201c0, name = "optionsMenu") is ungrabbing 13:18:247 QShortcutMap::removeShortcut(-2, QQuickPopupItem(0x6000030243e0, name = "optionsMenu"), QKeySequence("")) removed 1 shortcuts(s) 13:18:247 QShortcutMap::removeShortcut(-3, QQuickPopupItem(0x6000030243e0, name = "optionsMenu"), QKeySequence("")) removed 1 shortcuts(s) 13:18:248 activeFocusItem: QQuickContentItem(0x600003007d00, "ApplicationWindow") 13:19:729 activeFocusItem: ComboBox_QMLTYPE_8(0x60000093a140, "comboBox") 13:19:737 itemChange QQuickPopup(0x600000928fc0, name = "comboBoxPopup") is grabbing 13:19:737 QShortcutMap::addShortcut(QQuickPopupItem(0x600003016960, name = "comboBoxPopup"), QKeySequence("Back"), Qt::WindowShortcut) added shortcut with ID -6 13:19:737 QShortcutMap::addShortcut(QQuickPopupItem(0x600003016960, name = "comboBoxPopup"), QKeySequence("Esc"), Qt::WindowShortcut) added shortcut with ID -7 13:20:942 Creating new sequences for QKeyEvent(ShortcutOverride, Key_Escape, text="\u001B") with ignoredModifiers= QFlags(NoModifier) 13:20:942 Possible shortcut key sequences: QList(QKeySequence("Esc")) 13:20:942 @@@ checking if blocked 13:20:942 checking if any of our popups block QQuickContentItem(0x600003007d00, name="ApplicationWindow", parent=0x6000030078a0, geometry=0,40 600x360) whose parent is QQuickRootItem(0x6000030078a0, parent=0x0, geometry=0,0 600x400 🖼) 13:20:942 - popup QQuickPopup(0x600000928fc0, name = "comboBoxPopup") popup->isModal() false popup->closePolicy() QFlags(CloseOnPressOutsideParent|CloseOnEscape) popup->hasActiveFocus() false 13:20:942 @@@ blocked: true 13:20:942 @@@ checking if blocked 13:20:942 checking if any of our popups block QQuickPopupItem(0x6000030391e0, name="settingsDialog", parent=0x600003078320, geometry=0,40 164x64) whose parent is QQuickOverlay(0x600003078320, parent=0x6000030078a0, geometry=0,0 600x400, z=1e+06) 13:20:942 - popup QQuickPopup(0x600000928fc0, name = "comboBoxPopup") popup->isModal() false popup->closePolicy() QFlags(CloseOnPressOutsideParent|CloseOnEscape) popup->hasActiveFocus() false 13:20:942 @@@ blocked: true 13:20:942 @@@ checking if blocked 13:20:942 checking if any of our popups block QQuickPopupItem(0x600003016960, name="comboBoxPopup", parent=0x600003078320, geometry=12,6 140x388) whose parent is QQuickOverlay(0x600003078320, parent=0x6000030078a0, geometry=0,0 600x400, z=1e+06) 13:20:942 - popup QQuickPopup(0x600000928fc0, name = "comboBoxPopup") popup->isModal() false popup->closePolicy() QFlags(CloseOnPressOutsideParent|CloseOnEscape) popup->hasActiveFocus() false 13:20:942 @@@ blocked: false 13:20:942 Found better match ( QList(QKeySequence("Esc")) ), clearing key sequence list 13:20:942 Added ok key sequence QList(QKeySequence("Esc")) 13:20:942 Returning shortcut match == 2 13:20:942 QShortcutMap::nextState(QKeyEvent(ShortcutOverride, Key_Escape, text="\u001B")) = 2 13:20:942 QShortcutMap::dispatchEvent(): Sending QShortcutEvent(""Esc"", -7, false) to object(QQuickPopupItem(0x600003016960, name = "comboBoxPopup")) 13:20:943 itemChange QQuickPopup(0x600000928fc0, name = "comboBoxPopup") is ungrabbing 13:20:943 QShortcutMap::removeShortcut(-6, QQuickPopupItem(0x600003016960, name = "comboBoxPopup"), QKeySequence("")) removed 1 shortcuts(s) 13:20:943 QShortcutMap::removeShortcut(-7, QQuickPopupItem(0x600003016960, name = "comboBoxPopup"), QKeySequence("")) removed 1 shortcuts(s) 13:21:985 activeFocusItem: null 13:21:998 itemChange Dialog_QMLTYPE_13(0x6000009396c0, name = "settingsDialog") is ungrabbing 13:21:998 QShortcutMap::removeShortcut(-4, QQuickPopupItem(0x6000030391e0, name = "settingsDialog"), QKeySequence("")) removed 1 shortcuts(s) 13:21:999 QShortcutMap::removeShortcut(-5, QQuickPopupItem(0x6000030391e0, name = "settingsDialog"), QKeySequence("")) removed 1 shortcuts(s) 13:21:999 QShortcutMap::removeShortcut(-1, QQuickShortcut(0x7f9ef37df490), QKeySequence("")) removed 1 shortcuts(s) 13:21:999 ~QQuickPopup() Dialog_QMLTYPE_13(0x6000009396c0, name = "settingsDialog") is ungrabbing 13:21:999 ~QQuickPopup() QQuickPopup(0x600000928fc0, name = "comboBoxPopup") is ungrabbing 13:21:999 ~QQuickPopup() Menu_QMLTYPE_3(0x6000009201c0, name = "optionsMenu") is ungrabbing {noformat} The ApplicationWindow has an Escape Shortcut, and that is the first one to add its shortcut to the shortcut map. isBlockedByPopup() checks the open popups via stackingOrderPopups, which has the top-most popups first. In this case that is the ComboBox popup, so that's checked first. The ComboBox popup is not modal, but its closePolicy has CloseOnEscape, so then this line is checked: {code:java} return item != popup->popupItem() && !popup->popupItem()->isAncestorOf(item); {code} - The item (QQuickContentItem) is not the QQuickPopupItem that belongs to the popup in question (ComboBox's popup) => true. - The popupItem is not an ancestor of the item => true. So the ComboBox's popup prevents ApplicationWindow from getting the shortcut, and QQuickShortcutContext::matcher() returns false. SettingsDialog's QQuickPopupItem is the next shortcut owner to be checked, and that is also blocked by the ComboBox's popup. Finally, the ComboBox's QQuickPopupItem is checked. Since it is the QQuickPopupItem of the popup, the "item != popup->popupItem()" returns false and the function returns false, causing QQuickShortcutContext::matcher() to return true. h4. The failing test As mentioned, the closeOnEscapeWithNestedPopups test fails with the fix. The reason is that the ComboBox's popup doesn't have activeFocus, even though the ComboBox control itself is the activeFocusItem. I would imagine that it's done this way so that QQuickComboBox can handle the up/down stuff itself rather than ListView doing it, because it has its own currentIndex property and should be the authoritative source for that. It also apparently needs to set a keyNavigating property while navigating with keys, which allows an early return in QQuickComboBoxPrivate::itemHovered(). QQuickComboBox does handle Escape itself via regular key events: {code:java} void QQuickComboBox::keyPressEvent(QKeyEvent *event) { Q_D(QQuickComboBox); QQuickControl::keyPressEvent(event); switch (event->key()) { case Qt::Key_Escape: case Qt::Key_Back: if (d->isPopupVisible()) event->accept(); [...] void QQuickComboBox::keyReleaseEvent(QKeyEvent *event) { [...] case Qt::Key_Escape: case Qt::Key_Back: if (d->isPopupVisible()) { d->hidePopup(false); setPressed(false); event->accept(); } break; default: break; } } {code} However, if shortcuts are handled before regular events, these functions won't be called, since there are other objects (e.g. settingsDialog) that will get the Escape shortcut first. It seems like the ideal fix would be to ensure that the ComboBox popup gets active focus. I don't yet know if that will break anything though. A more hackier but quicker fix could be to somehow check if the popup belongs to ComboBox, and if so, check if that has active focus instead of the popup.][numvalue,null][updated,2022-02-22 05:28:53.788] (SQL Exception while executing the following:UPDATE jiraaction SET issueid=?, AUTHOR=?, actiontype=?, actionlevel=?, rolelevel=?, actionbody=?, CREATED=?, UPDATEAUTHOR=?, UPDATED=?, actionnum=? WHERE ID=? (Incorrect string value: '\xF0\x9F\x96\xBC)\x0D...' for column 'actionbody' at row 1)) com.atlassian.jira.exception.DataAccessException: org.ofbiz.core.entity.GenericEntityException: while updating: [GenericEntity:Action][updateauthor,mitch_curtis][issue,286964][level,null][author,mitch_curtis][created,2022-02-22 05:26:02.0][rolelevel,null][id,647661][type,comment][body,After some discussion with Richard, it seems we should separate Z order from focus: [https://codereview.qt-project.org/c/qt/qtquickcontrols2/+/288523/8..10/src/quicktemplates2/qquickpopup.cpp#2426] h4. One possible fix The simplest fix that came to mind was to only return true in isBlockedByPopup if the popup in question had activeFocus: {code:java} if (popup->isModal() || (popup->closePolicy() & QQuickPopup::CloseOnEscape && popup->hasActiveFocus())) { return item != popup->popupItem() && !popup->popupItem()->isAncestorOf(item); } {code} However, that breaks one test function: {code:java} FAIL! : tst_QQuickPopup::Basic::closeOnEscapeWithNestedPopups() 'settingsDialog->isVisible()' returned FALSE. () Loc: [/Users/mitch/dev/qt-dev/qtdeclarative/tests/auto/quickcontrols2/qquickpopup/tst_qquickpopup.cpp(1246)] {code} The relevant code from the test (in case the line numbers are off): {code:java} // Close the combo box popup with the escape key. The settings dialog should still be visible. QTest::keyClick(window, Qt::Key_Escape); QTRY_VERIFY(!comboBox->popup()->isVisible()); QVERIFY(settingsDialog->isVisible()); {code} h4. How it currently works To help myself understand the escape shortcut handling, I've documented how it currently works for the use case tested by tests/auto/quickcontrols2/qquickpopup/data/closeOnEscapeWithNestedPopups.qml. When the Escape key is pressed (on macOS) with the ComboBox popup open, this is the stack trace leading up to isBlockedByPopup: {noformat} 1 isBlockedByPopup(QQuickItem *) qquickshortcutcontext.cpp 57 0x10cc0c96d 2 QQuickShortcutContext::matcher(QObject *, Qt::ShortcutContext) qquickshortcutcontext.cpp 95 0x10cc0c902 3 QShortcutEntry::correctContext() const qshortcutmap.cpp 79 0x103473bcb 4 QShortcutMap::find(QKeyEvent *, int) qshortcutmap.cpp 460 0x103473bbf 5 QShortcutMap::nextState(QKeyEvent *) qshortcutmap.cpp 375 0x103472ada 6 QShortcutMap::tryShortcut(QKeyEvent *) qshortcutmap.cpp 331 0x1034729bb 7 QWindowSystemInterface::handleShortcutEvent(QWindow *, unsigned long, int, QFlags, unsigned int, unsigned int, unsigned int, QString const&, bool, unsigned short) qwindowsysteminterface.cpp 498 0x103176648 8 KeyEvent::sendWindowSystemEvent(QWindow *) const qnsview_keys.mm 282 0x1018c9b45 9 -[QNSView(Keys) handleKeyEvent:] qnsview_keys.mm 63 0x1018c87e5 10 -[QNSView(Keys) keyDown:] qnsview_keys.mm 126 0x1018c9cb3 11 -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] (x86_64) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff817006328 12 -[NSWindow(NSEventRouting) sendEvent:] (x86_64) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff81700451a 13 -[QNSWindow sendEvent:] qnswindow.mm 382 0x1018d289f 14 -[NSApplication(NSEvent) sendEvent:] (x86_64) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff817003356 15 -[QNSApplication sendEvent:] qcocoaapplication.mm 176 0x1018651aa 16 -[NSApplication _handleEvent:] (x86_64) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff8172bb89f 17 -[NSApplication run] (x86_64) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff816e835ce 18 QCocoaEventDispatcher::processEvents(QFlags) qcocoaeventdispatcher.mm 430 0x1018730cc 19 QEventLoop::processEvents(QFlags) qeventloop.cpp 136 0x103c1bc96 20 QEventLoop::exec(QFlags) qeventloop.cpp 218 0x103c1bc78 ... {noformat} I'm using this example app based on the test's QML file: {code:java} import QtQuick 2.14 import QtQuick.Controls 2.14 import QtQuick.Layouts 1.14 ApplicationWindow { id: root width: 600 height: 400 visible: true title: "activeFocusItem: " + activeFocusItem onActiveFocusItemChanged: print("activeFocusItem:", activeFocusItem) header: ToolBar { ToolButton { objectName: "optionsToolButton" text: "Options" onClicked: optionsMenu.open() Menu { id: optionsMenu Component.onCompleted: optionsMenu.setObjectNames("optionsMenu") x: parent.width - width transformOrigin: Menu.TopRight MenuItem { objectName: "settingsMenuItem" text: "Settings" onTriggered: settingsDialog.open() } } } } Shortcut { sequence: "Esc" enabled: stackView.depth > 1 onActivated: stackView.pop() } Component { id: itemComponent Item {} } StackView { id: stackView objectName: "stackView" anchors.fill: parent initialItem: Item { objectName: "initialStackViewItem" } Component.onCompleted: push(itemComponent) } Dialog { id: settingsDialog objectName: "settingsDialog" modal: true Component.onCompleted: settingsDialog.setObjectNames("settingsDialog") contentItem: ComboBox { objectName: "comboBox" model: 10 Component.onCompleted: popup.setObjectNames("comboBoxPopup") } } } {code} Debugging output with [https://codereview.qt-project.org/c/qt/qtdeclarative/+/393888/6] and QT_LOGGING_RULES=qt.gui.shortcutmap=true after opening the ComboBox, pressing escape to close it, and then quitting the app: {noformat} 13:12:996 itemChange QQuickPopup(0x6000009201c0) is ungrabbing 13:12:997 itemChange QQuickPopup(0x6000009396c0) is ungrabbing 13:13:031 itemChange QQuickPopup(0x600000928fc0) is ungrabbing 13:13:036 QShortcutMap::addShortcut(QQuickShortcut(0x7f9ef37df490), QKeySequence("Esc"), Qt::WindowShortcut) added shortcut with ID -1 13:13:818 activeFocusItem: QQuickContentItem(0x600003007d00, "ApplicationWindow") 13:16:746 itemChange Menu_QMLTYPE_3(0x6000009201c0, name = "optionsMenu") is grabbing 13:16:746 QShortcutMap::addShortcut(QQuickPopupItem(0x6000030243e0, name = "optionsMenu"), QKeySequence("Back"), Qt::WindowShortcut) added shortcut with ID -2 13:16:746 QShortcutMap::addShortcut(QQuickPopupItem(0x6000030243e0, name = "optionsMenu"), QKeySequence("Esc"), Qt::WindowShortcut) added shortcut with ID -3 13:16:746 activeFocusItem: QQuickPopupItem(0x6000030243e0, "optionsMenu") 13:16:765 activeFocusItem: MenuItem_QMLTYPE_1(0x600000939420, "settingsMenuItem") 13:18:246 itemChange Dialog_QMLTYPE_13(0x6000009396c0, name = "settingsDialog") is grabbing 13:18:246 QShortcutMap::addShortcut(QQuickPopupItem(0x6000030391e0, name = "settingsDialog"), QKeySequence("Back"), Qt::WindowShortcut) added shortcut with ID -4 13:18:246 QShortcutMap::addShortcut(QQuickPopupItem(0x6000030391e0, name = "settingsDialog"), QKeySequence("Esc"), Qt::WindowShortcut) added shortcut with ID -5 13:18:246 activeFocusItem: QQuickRootItem(0x6000030078a0) 13:18:247 itemChange Menu_QMLTYPE_3(0x6000009201c0, name = "optionsMenu") is ungrabbing 13:18:247 QShortcutMap::removeShortcut(-2, QQuickPopupItem(0x6000030243e0, name = "optionsMenu"), QKeySequence("")) removed 1 shortcuts(s) 13:18:247 QShortcutMap::removeShortcut(-3, QQuickPopupItem(0x6000030243e0, name = "optionsMenu"), QKeySequence("")) removed 1 shortcuts(s) 13:18:248 activeFocusItem: QQuickContentItem(0x600003007d00, "ApplicationWindow") 13:19:729 activeFocusItem: ComboBox_QMLTYPE_8(0x60000093a140, "comboBox") 13:19:737 itemChange QQuickPopup(0x600000928fc0, name = "comboBoxPopup") is grabbing 13:19:737 QShortcutMap::addShortcut(QQuickPopupItem(0x600003016960, name = "comboBoxPopup"), QKeySequence("Back"), Qt::WindowShortcut) added shortcut with ID -6 13:19:737 QShortcutMap::addShortcut(QQuickPopupItem(0x600003016960, name = "comboBoxPopup"), QKeySequence("Esc"), Qt::WindowShortcut) added shortcut with ID -7 13:20:942 Creating new sequences for QKeyEvent(ShortcutOverride, Key_Escape, text="\u001B") with ignoredModifiers= QFlags(NoModifier) 13:20:942 Possible shortcut key sequences: QList(QKeySequence("Esc")) 13:20:942 @@@ checking if blocked 13:20:942 checking if any of our popups block QQuickContentItem(0x600003007d00, name="ApplicationWindow", parent=0x6000030078a0, geometry=0,40 600x360) whose parent is QQuickRootItem(0x6000030078a0, parent=0x0, geometry=0,0 600x400 🖼) 13:20:942 - popup QQuickPopup(0x600000928fc0, name = "comboBoxPopup") popup->isModal() false popup->closePolicy() QFlags(CloseOnPressOutsideParent|CloseOnEscape) popup->hasActiveFocus() false 13:20:942 @@@ blocked: true 13:20:942 @@@ checking if blocked 13:20:942 checking if any of our popups block QQuickPopupItem(0x6000030391e0, name="settingsDialog", parent=0x600003078320, geometry=0,40 164x64) whose parent is QQuickOverlay(0x600003078320, parent=0x6000030078a0, geometry=0,0 600x400, z=1e+06) 13:20:942 - popup QQuickPopup(0x600000928fc0, name = "comboBoxPopup") popup->isModal() false popup->closePolicy() QFlags(CloseOnPressOutsideParent|CloseOnEscape) popup->hasActiveFocus() false 13:20:942 @@@ blocked: true 13:20:942 @@@ checking if blocked 13:20:942 checking if any of our popups block QQuickPopupItem(0x600003016960, name="comboBoxPopup", parent=0x600003078320, geometry=12,6 140x388) whose parent is QQuickOverlay(0x600003078320, parent=0x6000030078a0, geometry=0,0 600x400, z=1e+06) 13:20:942 - popup QQuickPopup(0x600000928fc0, name = "comboBoxPopup") popup->isModal() false popup->closePolicy() QFlags(CloseOnPressOutsideParent|CloseOnEscape) popup->hasActiveFocus() false 13:20:942 @@@ blocked: false 13:20:942 Found better match ( QList(QKeySequence("Esc")) ), clearing key sequence list 13:20:942 Added ok key sequence QList(QKeySequence("Esc")) 13:20:942 Returning shortcut match == 2 13:20:942 QShortcutMap::nextState(QKeyEvent(ShortcutOverride, Key_Escape, text="\u001B")) = 2 13:20:942 QShortcutMap::dispatchEvent(): Sending QShortcutEvent(""Esc"", -7, false) to object(QQuickPopupItem(0x600003016960, name = "comboBoxPopup")) 13:20:943 itemChange QQuickPopup(0x600000928fc0, name = "comboBoxPopup") is ungrabbing 13:20:943 QShortcutMap::removeShortcut(-6, QQuickPopupItem(0x600003016960, name = "comboBoxPopup"), QKeySequence("")) removed 1 shortcuts(s) 13:20:943 QShortcutMap::removeShortcut(-7, QQuickPopupItem(0x600003016960, name = "comboBoxPopup"), QKeySequence("")) removed 1 shortcuts(s) 13:21:985 activeFocusItem: null 13:21:998 itemChange Dialog_QMLTYPE_13(0x6000009396c0, name = "settingsDialog") is ungrabbing 13:21:998 QShortcutMap::removeShortcut(-4, QQuickPopupItem(0x6000030391e0, name = "settingsDialog"), QKeySequence("")) removed 1 shortcuts(s) 13:21:999 QShortcutMap::removeShortcut(-5, QQuickPopupItem(0x6000030391e0, name = "settingsDialog"), QKeySequence("")) removed 1 shortcuts(s) 13:21:999 QShortcutMap::removeShortcut(-1, QQuickShortcut(0x7f9ef37df490), QKeySequence("")) removed 1 shortcuts(s) 13:21:999 ~QQuickPopup() Dialog_QMLTYPE_13(0x6000009396c0, name = "settingsDialog") is ungrabbing 13:21:999 ~QQuickPopup() QQuickPopup(0x600000928fc0, name = "comboBoxPopup") is ungrabbing 13:21:999 ~QQuickPopup() Menu_QMLTYPE_3(0x6000009201c0, name = "optionsMenu") is ungrabbing {noformat} The ApplicationWindow has an Escape Shortcut, and that is the first one to add its shortcut to the shortcut map. isBlockedByPopup() checks the open popups via stackingOrderPopups, which has the top-most popups first. In this case that is the ComboBox popup, so that's checked first. The ComboBox popup is not modal, but its closePolicy has CloseOnEscape, so then this line is checked: {code:java} return item != popup->popupItem() && !popup->popupItem()->isAncestorOf(item); {code} - The item (QQuickContentItem) is not the QQuickPopupItem that belongs to the popup in question (ComboBox's popup) => true. - The popupItem is not an ancestor of the item => true. So the ComboBox's popup prevents ApplicationWindow from getting the shortcut, and QQuickShortcutContext::matcher() returns false. SettingsDialog's QQuickPopupItem is the next shortcut owner to be checked, and that is also blocked by the ComboBox's popup. Finally, the ComboBox's QQuickPopupItem is checked. Since it is the QQuickPopupItem of the popup, the "item != popup->popupItem()" returns false and the function returns false, causing QQuickShortcutContext::matcher() to return true. h4. The failing test As mentioned, the closeOnEscapeWithNestedPopups test fails with the fix. The reason is that the ComboBox's popup doesn't have activeFocus, even though the ComboBox control itself is the activeFocusItem. I would imagine that it's done this way so that QQuickComboBox can handle the up/down stuff itself rather than ListView doing it, because it has its own currentIndex property and should be the authoritative source for that. It also apparently needs to set a keyNavigating property while navigating with keys, which allows an early return in QQuickComboBoxPrivate::itemHovered(). QQuickComboBox does handle Escape itself via regular key events: {code:java} void QQuickComboBox::keyPressEvent(QKeyEvent *event) { Q_D(QQuickComboBox); QQuickControl::keyPressEvent(event); switch (event->key()) { case Qt::Key_Escape: case Qt::Key_Back: if (d->isPopupVisible()) event->accept(); [...] void QQuickComboBox::keyReleaseEvent(QKeyEvent *event) { [...] case Qt::Key_Escape: case Qt::Key_Back: if (d->isPopupVisible()) { d->hidePopup(false); setPressed(false); event->accept(); } break; default: break; } } {code} However, if shortcuts are handled before regular events, these functions won't be called, since there are other objects (e.g. settingsDialog) that will get the Escape shortcut first. It seems like the ideal fix would be to ensure that the ComboBox popup gets active focus. I don't yet know if that will break anything though. A more hackier but quicker fix could be to somehow check if the popup belongs to ComboBox, and if so, check if that has active focus instead of the popup.][numvalue,null][updated,2022-02-22 05:28:53.788] (SQL Exception while executing the following:UPDATE jiraaction SET issueid=?, AUTHOR=?, actiontype=?, actionlevel=?, rolelevel=?, actionbody=?, CREATED=?, UPDATEAUTHOR=?, UPDATED=?, actionnum=? WHERE ID=? (Incorrect string value: '\xF0\x9F\x96\xBC)\x0D...' for column 'actionbody' at row 1)) at com.atlassian.jira.issue.comments.DefaultCommentManager.update(DefaultCommentManager.java:337) [classes/:?] at com.atlassian.jira.bc.issue.comment.DefaultCommentService.lambda$update$0(DefaultCommentService.java:176) [classes/:?] at io.atlassian.fugue.Effect.accept(Effect.java:43) [fugue-4.7.2.jar:?] at io.atlassian.fugue.Option$Some.forEach(Option.java:468) [fugue-4.7.2.jar:?] at io.atlassian.fugue.Option$Some.foreach(Option.java:464) [fugue-4.7.2.jar:?] at com.atlassian.jira.bc.issue.comment.DefaultCommentService.update(DefaultCommentService.java:175) [classes/:?] at com.atlassian.jira.web.action.issue.EditComment.doExecute(EditComment.java:72) [classes/:?] at webwork.action.ActionSupport.execute(ActionSupport.java:165) [webwork-1.4-atlassian-30.jar:?] at com.atlassian.jira.action.JiraActionSupport.execute(JiraActionSupport.java:63) [jira-api-8.13.4.jar:?] at webwork.interceptor.DefaultInterceptorChain.proceed(DefaultInterceptorChain.java:39) [webwork-1.4-atlassian-30.jar:?] at webwork.interceptor.NestedInterceptorChain.proceed(NestedInterceptorChain.java:31) [webwork-1.4-atlassian-30.jar:?] at webwork.interceptor.ChainedInterceptor.intercept(ChainedInterceptor.java:16) [webwork-1.4-atlassian-30.jar:?] at webwork.interceptor.DefaultInterceptorChain.proceed(DefaultInterceptorChain.java:35) [webwork-1.4-atlassian-30.jar:?] at webwork.dispatcher.GenericDispatcher.executeAction(GenericDispatcher.java:225) [webwork-1.4-atlassian-30.jar:?] at webwork.dispatcher.GenericDispatcher.executeAction(GenericDispatcher.java:154) [webwork-1.4-atlassian-30.jar:?] at com.atlassian.jira.web.dispatcher.JiraWebworkActionDispatcher.service(JiraWebworkActionDispatcher.java:138) [classes/:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) [servlet-api.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.jira.web.filters.JiraLastFilter.lambda$doFilter$0(JiraLastFilter.java:39) [classes/:?] at com.atlassian.jira.web.filters.steps.ChainedFilterStepRunner.doFilter(ChainedFilterStepRunner.java:74) [classes/:?] at com.atlassian.jira.web.filters.JiraLastFilter.doFilter(JiraLastFilter.java:36) [classes/:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.core.filters.HeaderSanitisingFilter.doFilter(HeaderSanitisingFilter.java:37) [atlassian-core-7.0.2.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:39) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.jira.onboarding.postsetup.ui.PostSetupAnnouncementsFilter.doFilter(PostSetupAnnouncementsFilter.java:51) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.jira.tzdetect.IncludeResourcesFilter.doFilter(IncludeResourcesFilter.java:77) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.jira.baseurl.IncludeResourcesFilter.doFilter(IncludeResourcesFilter.java:34) [?:?] at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32) [atlassian-core-7.0.2.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.greenhopper.jira.filters.ClassicBoardRouter.doFilter(ClassicBoardRouter.java:56) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.mywork.client.filter.ServingRequestsFilter.doFilter(ServingRequestsFilter.java:32) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.jira.plugin.mobile.web.filter.MobileAppRequestFilter.doFilter(MobileAppRequestFilter.java:59) [?:?] at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32) [atlassian-core-7.0.2.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.jira.plugin.mobile.login.MobileLoginSuccessFilter.doFilter(MobileLoginSuccessFilter.java:54) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.diagnostics.internal.platform.monitor.http.HttpRequestMonitoringFilter.doFilter(HttpRequestMonitoringFilter.java:55) [atlassian-diagnostics-platform-1.1.10.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.analytics.client.filter.UniversalAnalyticsFilter.doFilter(UniversalAnalyticsFilter.java:75) [?:?] at com.atlassian.analytics.client.filter.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:33) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21) [?:?] at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32) [atlassian-core-7.0.2.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.prettyurls.filter.PrettyUrlsSiteMeshFixupFilter.doFilter(PrettyUrlsSiteMeshFixupFilter.java:32) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.prettyurls.filter.PrettyUrlsDispatcherFilter.doFilter(PrettyUrlsDispatcherFilter.java:55) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.prettyurls.filter.PrettyUrlsSiteMeshFilter.doFilter(PrettyUrlsSiteMeshFilter.java:80) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.prettyurls.filter.PrettyUrlsMatcherFilter.doFilter(PrettyUrlsMatcherFilter.java:51) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.labs.botkiller.BotKillerFilter.doFilter(BotKillerFilter.java:35) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:55) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:43) [atlassian-plugins-servlet-5.3.11.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.jira.web.filters.MobileAppRequestFilter.doFilter(MobileAppRequestFilter.java:36) [classes/:?] at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32) [atlassian-core-7.0.2.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.jira.web.filters.accesslog.AccessLogFilter.executeRequest(AccessLogFilter.java:93) [classes/:?] at com.atlassian.jira.web.filters.accesslog.AccessLogFilter.doFilter(AccessLogFilter.java:79) [classes/:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:181) [sitemesh-2.5-atlassian-11.jar:?] at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:85) [sitemesh-2.5-atlassian-11.jar:?] at com.atlassian.jira.web.filters.SitemeshPageFilter.doFilter(SitemeshPageFilter.java:112) [classes/:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.jira.web.filters.pagebuilder.PageBuilderFilter.doFilter(PageBuilderFilter.java:81) [classes/:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.jira.web.filters.CommittedResponseHtmlErrorRecoveryFilter.doFilter(CommittedResponseHtmlErrorRecoveryFilter.java:55) [classes/:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:39) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.prettyurls.filter.PrettyUrlsCombinedMatchDispatcherFilter.doFilter(PrettyUrlsCombinedMatchDispatcherFilter.java:56) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:55) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:43) [atlassian-plugins-servlet-5.3.11.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.jira.security.xsrf.XsrfTokenAdditionRequestFilter.doFilter(XsrfTokenAdditionRequestFilter.java:46) [classes/:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.jira.web.filters.MauEventFilter.doFilter(MauEventFilter.java:49) [classes/:?] at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32) [atlassian-core-7.0.2.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.jira.security.JiraSecurityFilter.lambda$doFilter$0(JiraSecurityFilter.java:66) [classes/:?] at com.atlassian.seraph.filter.SecurityFilter.doFilter(SecurityFilter.java:242) [atlassian-seraph-4.0.4.jar:?] at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:64) [classes/:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.security.auth.trustedapps.filter.TrustedApplicationsFilter.doFilter(TrustedApplicationsFilter.java:94) [atlassian-trusted-apps-core-5.0.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.seraph.filter.BaseLoginFilter.doFilter(BaseLoginFilter.java:148) [atlassian-seraph-4.0.4.jar:?] at com.atlassian.jira.web.filters.JiraLoginFilter.doFilter(JiraLoginFilter.java:77) [classes/:?] at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32) [atlassian-core-7.0.2.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:39) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.oauth.serviceprovider.internal.servlet.OAuthFilter.doFilter(OAuthFilter.java:67) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.prettyurls.filter.PrettyUrlsCombinedMatchDispatcherFilter.doFilter(PrettyUrlsCombinedMatchDispatcherFilter.java:56) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:55) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:43) [atlassian-plugins-servlet-5.3.11.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.util.profiling.filters.RequestProfilingFilter.doFilter(RequestProfilingFilter.java:62) [atlassian-profiling-3.2.0.jar:?] at com.atlassian.jira.web.filters.JIRAProfilingFilter.doFilter(JIRAProfilingFilter.java:29) [classes/:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.jira.web.filters.johnson.JiraJohnson503Filter.doFilter(JiraJohnson503Filter.java:79) [classes/:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.jira.web.filters.johnson.JiraJohnsonFilter.doFilter(JiraJohnsonFilter.java:72) [classes/:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) [urlrewritefilter-4.0.3.jar:4.0.3] at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) [urlrewritefilter-4.0.3.jar:4.0.3] at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) [urlrewritefilter-4.0.3.jar:4.0.3] at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394) [urlrewritefilter-4.0.3.jar:4.0.3] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.jira.servermetrics.CorrelationIdPopulatorFilter.doFilter(CorrelationIdPopulatorFilter.java:30) [classes/:?] at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32) [atlassian-core-7.0.2.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:39) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.analytics.client.filter.JiraAnalyticsFilter.doFilter(JiraAnalyticsFilter.java:30) [?:?] at com.atlassian.analytics.client.filter.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:33) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21) [?:?] at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32) [atlassian-core-7.0.2.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.web.servlet.plugin.LocationCleanerFilter.doFilter(LocationCleanerFilter.java:36) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.prettyurls.filter.PrettyUrlsCombinedMatchDispatcherFilter.doFilter(PrettyUrlsCombinedMatchDispatcherFilter.java:56) [?:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.lambda$doFilter$0(DelegatingPluginFilter.java:57) [atlassian-plugins-servlet-5.3.11.jar:?] at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:239) [jira-confluence-javamelody-1.86.0.jar:1.86.0] at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:215) [jira-confluence-javamelody-1.86.0.jar:1.86.0] at net.bull.javamelody.PluginMonitoringFilter.doFilter(PluginMonitoringFilter.java:88) [jira-confluence-javamelody-1.86.0.jar:1.86.0] at net.bull.javamelody.JiraMonitoringFilter.doFilter(JiraMonitoringFilter.java:137) [jira-confluence-javamelody-1.86.0.jar:1.86.0] at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:62) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:37) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:55) [atlassian-plugins-servlet-5.3.11.jar:?] at com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:43) [atlassian-plugins-servlet-5.3.11.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.jira.web.filters.steps.ChainedFilterStepRunner.doFilter(ChainedFilterStepRunner.java:74) [classes/:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.core.filters.cache.AbstractCachingFilter.doFilter(AbstractCachingFilter.java:31) [atlassian-core-7.0.2.jar:?] at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32) [atlassian-core-7.0.2.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.core.filters.encoding.AbstractEncodingFilter.doFilter(AbstractEncodingFilter.java:39) [atlassian-core-7.0.2.jar:?] at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32) [atlassian-core-7.0.2.jar:?] at com.atlassian.jira.web.filters.JiraStaticResourceAwareEncodingFilter.doFilterInternal(JiraStaticResourceAwareEncodingFilter.java:20) [classes/:?] at com.atlassian.jira.web.filters.AbstractStaticResourceAwareFilter.doFilter(AbstractStaticResourceAwareFilter.java:59) [classes/:?] at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32) [atlassian-core-7.0.2.jar:?] at com.atlassian.jira.web.filters.PathMatchingEncodingFilter.doFilter(PathMatchingEncodingFilter.java:41) [classes/:?] at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32) [atlassian-core-7.0.2.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.jira.web.filters.MultipartBoundaryCheckFilter.doFilter(MultipartBoundaryCheckFilter.java:36) [classes/:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.jira.servermetrics.MetricsCollectorFilter.doFilter(MetricsCollectorFilter.java:25) [classes/:?] at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32) [atlassian-core-7.0.2.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.jira.web.filters.steps.ChainedFilterStepRunner.doFilter(ChainedFilterStepRunner.java:74) [classes/:?] at com.atlassian.jira.web.filters.JiraFirstFilter.doFilter(JiraFirstFilter.java:61) [classes/:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at com.atlassian.gzipfilter.GzipFilter.doFilterInternal(GzipFilter.java:115) [atlassian-gzipfilter-3.0.0.jar:?] at com.atlassian.gzipfilter.GzipFilter.doFilter(GzipFilter.java:92) [atlassian-gzipfilter-3.0.0.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.57] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.57] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) [catalina.jar:8.5.57] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:8.5.57] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543) [catalina.jar:8.5.57] at org.apache.catalina.valves.StuckThreadDetectionValve.invoke(StuckThreadDetectionValve.java:206) [catalina.jar:8.5.57] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [catalina.jar:8.5.57] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [catalina.jar:8.5.57] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [catalina.jar:8.5.57] at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690) [catalina.jar:8.5.57] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [catalina.jar:8.5.57] at org.apache.coyote.ajp.AjpProcessor.service(AjpProcessor.java:524) [tomcat-coyote.jar:8.5.57] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-coyote.jar:8.5.57] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818) [tomcat-coyote.jar:8.5.57] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1626) [tomcat-coyote.jar:8.5.57] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:8.5.57] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_275] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_275] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.5.57] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_275] Caused by: org.ofbiz.core.entity.GenericEntityException: while updating: [GenericEntity:Action][updateauthor,mitch_curtis][issue,286964][level,null][author,mitch_curtis][created,2022-02-22 05:26:02.0][rolelevel,null][id,647661][type,comment][body,After some discussion with Richard, it seems we should separate Z order from focus: [https://codereview.qt-project.org/c/qt/qtquickcontrols2/+/288523/8..10/src/quicktemplates2/qquickpopup.cpp#2426] h4. One possible fix The simplest fix that came to mind was to only return true in isBlockedByPopup if the popup in question had activeFocus: {code:java} if (popup->isModal() || (popup->closePolicy() & QQuickPopup::CloseOnEscape && popup->hasActiveFocus())) { return item != popup->popupItem() && !popup->popupItem()->isAncestorOf(item); } {code} However, that breaks one test function: {code:java} FAIL! : tst_QQuickPopup::Basic::closeOnEscapeWithNestedPopups() 'settingsDialog->isVisible()' returned FALSE. () Loc: [/Users/mitch/dev/qt-dev/qtdeclarative/tests/auto/quickcontrols2/qquickpopup/tst_qquickpopup.cpp(1246)] {code} The relevant code from the test (in case the line numbers are off): {code:java} // Close the combo box popup with the escape key. The settings dialog should still be visible. QTest::keyClick(window, Qt::Key_Escape); QTRY_VERIFY(!comboBox->popup()->isVisible()); QVERIFY(settingsDialog->isVisible()); {code} h4. How it currently works To help myself understand the escape shortcut handling, I've documented how it currently works for the use case tested by tests/auto/quickcontrols2/qquickpopup/data/closeOnEscapeWithNestedPopups.qml. When the Escape key is pressed (on macOS) with the ComboBox popup open, this is the stack trace leading up to isBlockedByPopup: {noformat} 1 isBlockedByPopup(QQuickItem *) qquickshortcutcontext.cpp 57 0x10cc0c96d 2 QQuickShortcutContext::matcher(QObject *, Qt::ShortcutContext) qquickshortcutcontext.cpp 95 0x10cc0c902 3 QShortcutEntry::correctContext() const qshortcutmap.cpp 79 0x103473bcb 4 QShortcutMap::find(QKeyEvent *, int) qshortcutmap.cpp 460 0x103473bbf 5 QShortcutMap::nextState(QKeyEvent *) qshortcutmap.cpp 375 0x103472ada 6 QShortcutMap::tryShortcut(QKeyEvent *) qshortcutmap.cpp 331 0x1034729bb 7 QWindowSystemInterface::handleShortcutEvent(QWindow *, unsigned long, int, QFlags, unsigned int, unsigned int, unsigned int, QString const&, bool, unsigned short) qwindowsysteminterface.cpp 498 0x103176648 8 KeyEvent::sendWindowSystemEvent(QWindow *) const qnsview_keys.mm 282 0x1018c9b45 9 -[QNSView(Keys) handleKeyEvent:] qnsview_keys.mm 63 0x1018c87e5 10 -[QNSView(Keys) keyDown:] qnsview_keys.mm 126 0x1018c9cb3 11 -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] (x86_64) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff817006328 12 -[NSWindow(NSEventRouting) sendEvent:] (x86_64) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff81700451a 13 -[QNSWindow sendEvent:] qnswindow.mm 382 0x1018d289f 14 -[NSApplication(NSEvent) sendEvent:] (x86_64) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff817003356 15 -[QNSApplication sendEvent:] qcocoaapplication.mm 176 0x1018651aa 16 -[NSApplication _handleEvent:] (x86_64) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff8172bb89f 17 -[NSApplication run] (x86_64) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x7ff816e835ce 18 QCocoaEventDispatcher::processEvents(QFlags) qcocoaeventdispatcher.mm 430 0x1018730cc 19 QEventLoop::processEvents(QFlags) qeventloop.cpp 136 0x103c1bc96 20 QEventLoop::exec(QFlags) qeventloop.cpp 218 0x103c1bc78 ... {noformat} I'm using this example app based on the test's QML file: {code:java} import QtQuick 2.14 import QtQuick.Controls 2.14 import QtQuick.Layouts 1.14 ApplicationWindow { id: root width: 600 height: 400 visible: true title: "activeFocusItem: " + activeFocusItem onActiveFocusItemChanged: print("activeFocusItem:", activeFocusItem) header: ToolBar { ToolButton { objectName: "optionsToolButton" text: "Options" onClicked: optionsMenu.open() Menu { id: optionsMenu Component.onCompleted: optionsMenu.setObjectNames("optionsMenu") x: parent.width - width transformOrigin: Menu.TopRight MenuItem { objectName: "settingsMenuItem" text: "Settings" onTriggered: settingsDialog.open() } } } } Shortcut { sequence: "Esc" enabled: stackView.depth > 1 onActivated: stackView.pop() } Component { id: itemComponent Item {} } StackView { id: stackView objectName: "stackView" anchors.fill: parent initialItem: Item { objectName: "initialStackViewItem" } Component.onCompleted: push(itemComponent) } Dialog { id: settingsDialog objectName: "settingsDialog" modal: true Component.onCompleted: settingsDialog.setObjectNames("settingsDialog") contentItem: ComboBox { objectName: "comboBox" model: 10 Component.onCompleted: popup.setObjectNames("comboBoxPopup") } } } {code} Debugging output with [https://codereview.qt-project.org/c/qt/qtdeclarative/+/393888/6] and QT_LOGGING_RULES=qt.gui.shortcutmap=true after opening the ComboBox, pressing escape to close it, and then quitting the app: {noformat} 13:12:996 itemChange QQuickPopup(0x6000009201c0) is ungrabbing 13:12:997 itemChange QQuickPopup(0x6000009396c0) is ungrabbing 13:13:031 itemChange QQuickPopup(0x600000928fc0) is ungrabbing 13:13:036 QShortcutMap::addShortcut(QQuickShortcut(0x7f9ef37df490), QKeySequence("Esc"), Qt::WindowShortcut) added shortcut with ID -1 13:13:818 activeFocusItem: QQuickContentItem(0x600003007d00, "ApplicationWindow") 13:16:746 itemChange Menu_QMLTYPE_3(0x6000009201c0, name = "optionsMenu") is grabbing 13:16:746 QShortcutMap::addShortcut(QQuickPopupItem(0x6000030243e0, name = "optionsMenu"), QKeySequence("Back"), Qt::WindowShortcut) added shortcut with ID -2 13:16:746 QShortcutMap::addShortcut(QQuickPopupItem(0x6000030243e0, name = "optionsMenu"), QKeySequence("Esc"), Qt::WindowShortcut) added shortcut with ID -3 13:16:746 activeFocusItem: QQuickPopupItem(0x6000030243e0, "optionsMenu") 13:16:765 activeFocusItem: MenuItem_QMLTYPE_1(0x600000939420, "settingsMenuItem") 13:18:246 itemChange Dialog_QMLTYPE_13(0x6000009396c0, name = "settingsDialog") is grabbing 13:18:246 QShortcutMap::addShortcut(QQuickPopupItem(0x6000030391e0, name = "settingsDialog"), QKeySequence("Back"), Qt::WindowShortcut) added shortcut with ID -4 13:18:246 QShortcutMap::addShortcut(QQuickPopupItem(0x6000030391e0, name = "settingsDialog"), QKeySequence("Esc"), Qt::WindowShortcut) added shortcut with ID -5 13:18:246 activeFocusItem: QQuickRootItem(0x6000030078a0) 13:18:247 itemChange Menu_QMLTYPE_3(0x6000009201c0, name = "optionsMenu") is ungrabbing 13:18:247 QShortcutMap::removeShortcut(-2, QQuickPopupItem(0x6000030243e0, name = "optionsMenu"), QKeySequence("")) removed 1 shortcuts(s) 13:18:247 QShortcutMap::removeShortcut(-3, QQuickPopupItem(0x6000030243e0, name = "optionsMenu"), QKeySequence("")) removed 1 shortcuts(s) 13:18:248 activeFocusItem: QQuickContentItem(0x600003007d00, "ApplicationWindow") 13:19:729 activeFocusItem: ComboBox_QMLTYPE_8(0x60000093a140, "comboBox") 13:19:737 itemChange QQuickPopup(0x600000928fc0, name = "comboBoxPopup") is grabbing 13:19:737 QShortcutMap::addShortcut(QQuickPopupItem(0x600003016960, name = "comboBoxPopup"), QKeySequence("Back"), Qt::WindowShortcut) added shortcut with ID -6 13:19:737 QShortcutMap::addShortcut(QQuickPopupItem(0x600003016960, name = "comboBoxPopup"), QKeySequence("Esc"), Qt::WindowShortcut) added shortcut with ID -7 13:20:942 Creating new sequences for QKeyEvent(ShortcutOverride, Key_Escape, text="\u001B") with ignoredModifiers= QFlags(NoModifier) 13:20:942 Possible shortcut key sequences: QList(QKeySequence("Esc")) 13:20:942 @@@ checking if blocked 13:20:942 checking if any of our popups block QQuickContentItem(0x600003007d00, name="ApplicationWindow", parent=0x6000030078a0, geometry=0,40 600x360) whose parent is QQuickRootItem(0x6000030078a0, parent=0x0, geometry=0,0 600x400 🖼) 13:20:942 - popup QQuickPopup(0x600000928fc0, name = "comboBoxPopup") popup->isModal() false popup->closePolicy() QFlags(CloseOnPressOutsideParent|CloseOnEscape) popup->hasActiveFocus() false 13:20:942 @@@ blocked: true 13:20:942 @@@ checking if blocked 13:20:942 checking if any of our popups block QQuickPopupItem(0x6000030391e0, name="settingsDialog", parent=0x600003078320, geometry=0,40 164x64) whose parent is QQuickOverlay(0x600003078320, parent=0x6000030078a0, geometry=0,0 600x400, z=1e+06) 13:20:942 - popup QQuickPopup(0x600000928fc0, name = "comboBoxPopup") popup->isModal() false popup->closePolicy() QFlags(CloseOnPressOutsideParent|CloseOnEscape) popup->hasActiveFocus() false 13:20:942 @@@ blocked: true 13:20:942 @@@ checking if blocked 13:20:942 checking if any of our popups block QQuickPopupItem(0x600003016960, name="comboBoxPopup", parent=0x600003078320, geometry=12,6 140x388) whose parent is QQuickOverlay(0x600003078320, parent=0x6000030078a0, geometry=0,0 600x400, z=1e+06) 13:20:942 - popup QQuickPopup(0x600000928fc0, name = "comboBoxPopup") popup->isModal() false popup->closePolicy() QFlags(CloseOnPressOutsideParent|CloseOnEscape) popup->hasActiveFocus() false 13:20:942 @@@ blocked: false 13:20:942 Found better match ( QList(QKeySequence("Esc")) ), clearing key sequence list 13:20:942 Added ok key sequence QList(QKeySequence("Esc")) 13:20:942 Returning shortcut match == 2 13:20:942 QShortcutMap::nextState(QKeyEvent(ShortcutOverride, Key_Escape, text="\u001B")) = 2 13:20:942 QShortcutMap::dispatchEvent(): Sending QShortcutEvent(""Esc"", -7, false) to object(QQuickPopupItem(0x600003016960, name = "comboBoxPopup")) 13:20:943 itemChange QQuickPopup(0x600000928fc0, name = "comboBoxPopup") is ungrabbing 13:20:943 QShortcutMap::removeShortcut(-6, QQuickPopupItem(0x600003016960, name = "comboBoxPopup"), QKeySequence("")) removed 1 shortcuts(s) 13:20:943 QShortcutMap::removeShortcut(-7, QQuickPopupItem(0x600003016960, name = "comboBoxPopup"), QKeySequence("")) removed 1 shortcuts(s) 13:21:985 activeFocusItem: null 13:21:998 itemChange Dialog_QMLTYPE_13(0x6000009396c0, name = "settingsDialog") is ungrabbing 13:21:998 QShortcutMap::removeShortcut(-4, QQuickPopupItem(0x6000030391e0, name = "settingsDialog"), QKeySequence("")) removed 1 shortcuts(s) 13:21:999 QShortcutMap::removeShortcut(-5, QQuickPopupItem(0x6000030391e0, name = "settingsDialog"), QKeySequence("")) removed 1 shortcuts(s) 13:21:999 QShortcutMap::removeShortcut(-1, QQuickShortcut(0x7f9ef37df490), QKeySequence("")) removed 1 shortcuts(s) 13:21:999 ~QQuickPopup() Dialog_QMLTYPE_13(0x6000009396c0, name = "settingsDialog") is ungrabbing 13:21:999 ~QQuickPopup() QQuickPopup(0x600000928fc0, name = "comboBoxPopup") is ungrabbing 13:21:999 ~QQuickPopup() Menu_QMLTYPE_3(0x6000009201c0, name = "optionsMenu") is ungrabbing {noformat} The ApplicationWindow has an Escape Shortcut, and that is the first one to add its shortcut to the shortcut map. isBlockedByPopup() checks the open popups via stackingOrderPopups, which has the top-most popups first. In this case that is the ComboBox popup, so that's checked first. The ComboBox popup is not modal, but its closePolicy has CloseOnEscape, so then this line is checked: {code:java} return item != popup->popupItem() && !popup->popupItem()->isAncestorOf(item); {code} - The item (QQuickContentItem) is not the QQuickPopupItem that belongs to the popup in question (ComboBox's popup) => true. - The popupItem is not an ancestor of the item => true. So the ComboBox's popup prevents ApplicationWindow from getting the shortcut, and QQuickShortcutContext::matcher() returns false. SettingsDialog's QQuickPopupItem is the next shortcut owner to be checked, and that is also blocked by the ComboBox's popup. Finally, the ComboBox's QQuickPopupItem is checked. Since it is the QQuickPopupItem of the popup, the "item != popup->popupItem()" returns false and the function returns false, causing QQuickShortcutContext::matcher() to return true. h4. The failing test As mentioned, the closeOnEscapeWithNestedPopups test fails with the fix. The reason is that the ComboBox's popup doesn't have activeFocus, even though the ComboBox control itself is the activeFocusItem. I would imagine that it's done this way so that QQuickComboBox can handle the up/down stuff itself rather than ListView doing it, because it has its own currentIndex property and should be the authoritative source for that. It also apparently needs to set a keyNavigating property while navigating with keys, which allows an early return in QQuickComboBoxPrivate::itemHovered(). QQuickComboBox does handle Escape itself via regular key events: {code:java} void QQuickComboBox::keyPressEvent(QKeyEvent *event) { Q_D(QQuickComboBox); QQuickControl::keyPressEvent(event); switch (event->key()) { case Qt::Key_Escape: case Qt::Key_Back: if (d->isPopupVisible()) event->accept(); [...] void QQuickComboBox::keyReleaseEvent(QKeyEvent *event) { [...] case Qt::Key_Escape: case Qt::Key_Back: if (d->isPopupVisible()) { d->hidePopup(false); setPressed(false); event->accept(); } break; default: break; } } {code} However, if shortcuts are handled before regular events, these functions won't be called, since there are other objects (e.g. settingsDialog) that will get the Escape shortcut first. It seems like the ideal fix would be to ensure that the ComboBox popup gets active focus. I don't yet know if that will break anything though. A more hackier but quicker fix could be to somehow check if the popup belongs to ComboBox, and if so, check if that has active focus instead of the popup.][numvalue,null][updated,2022-02-22 05:28:53.788] (SQL Exception while executing the following:UPDATE jiraaction SET issueid=?, AUTHOR=?, actiontype=?, actionlevel=?, rolelevel=?, actionbody=?, CREATED=?, UPDATEAUTHOR=?, UPDATED=?, actionnum=? WHERE ID=? (Incorrect string value: '\xF0\x9F\x96\xBC)\x0D...' for column 'actionbody' at row 1)) at org.ofbiz.core.entity.GenericDAO.singleUpdate(GenericDAO.java:364) [entityengine-1.5.0.jar:?] at org.ofbiz.core.entity.GenericDAO.customUpdate(GenericDAO.java:286) [entityengine-1.5.0.jar:?] at org.ofbiz.core.entity.GenericDAO.update(GenericDAO.java:266) [entityengine-1.5.0.jar:?] at org.ofbiz.core.entity.GenericDAO.update(GenericDAO.java:236) [entityengine-1.5.0.jar:?] at org.ofbiz.core.entity.GenericHelperDAO.store(GenericHelperDAO.java:257) [entityengine-1.5.0.jar:?] at org.ofbiz.core.entity.GenericDelegator.store(GenericDelegator.java:1744) [entityengine-1.5.0.jar:?] at org.ofbiz.core.entity.GenericDelegator.store(GenericDelegator.java:1725) [entityengine-1.5.0.jar:?] at org.ofbiz.core.entity.GenericValue.store(GenericValue.java:118) [entityengine-1.5.0.jar:?] at com.atlassian.jira.issue.comments.DefaultCommentManager.update(DefaultCommentManager.java:335) [classes/:?] ... 278 more Caused by: org.ofbiz.core.entity.GenericDataSourceException: SQL Exception while executing the following:UPDATE jiraaction SET issueid=?, AUTHOR=?, actiontype=?, actionlevel=?, rolelevel=?, actionbody=?, CREATED=?, UPDATEAUTHOR=?, UPDATED=?, actionnum=? WHERE ID=? (Incorrect string value: '\xF0\x9F\x96\xBC)\x0D...' for column 'actionbody' at row 1) at org.ofbiz.core.entity.jdbc.SQLProcessor.executeUpdate(SQLProcessor.java:570) [entityengine-1.5.0.jar:?] at org.ofbiz.core.entity.GenericDAO.singleUpdate(GenericDAO.java:358) [entityengine-1.5.0.jar:?] ... 286 more Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x96\xBC)\x0D...' for column 'actionbody' at row 1 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) [mysql-connector-java-8.0.22.jar:8.0.22] at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) [mysql-connector-java-8.0.22.jar:8.0.22] at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) [mysql-connector-java-8.0.22.jar:8.0.22] at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) [mysql-connector-java-8.0.22.jar:8.0.22] at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092) [mysql-connector-java-8.0.22.jar:8.0.22] at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040) [mysql-connector-java-8.0.22.jar:8.0.22] at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1347) [mysql-connector-java-8.0.22.jar:8.0.22] at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025) [mysql-connector-java-8.0.22.jar:8.0.22] at org.apache.commons.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:98) [commons-dbcp2-2.1.jar:2.1] at org.apache.commons.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:98) [commons-dbcp2-2.1.jar:2.1] at com.atlassian.jira.ofbiz.sql.PreparedStatementWrapper.executeUpdate(PreparedStatementWrapper.java:47) [classes/:?] at com.atlassian.jira.diagnostic.connection.DiagnosticPreparedStatement.lambda$executeUpdate$7(DiagnosticPreparedStatement.java:69) [classes/:?] at com.atlassian.diagnostics.internal.platform.monitor.db.DefaultDatabaseDiagnosticsCollector.recordExecutionTime(DefaultDatabaseDiagnosticsCollector.java:69) [atlassian-diagnostics-platform-1.1.10.jar:?] at com.atlassian.jira.diagnostic.connection.DatabaseDiagnosticsCollectorDelegate.recordExecutionTime(DatabaseDiagnosticsCollectorDelegate.java:55) [classes/:?] at com.atlassian.jira.diagnostic.connection.DiagnosticPreparedStatement.executeUpdate(DiagnosticPreparedStatement.java:69) [classes/:?] at org.ofbiz.core.entity.jdbc.SQLProcessor.executeUpdate(SQLProcessor.java:562) [entityengine-1.5.0.jar:?] ... 287 more