From e79ad519c7db3ab40406a5d4f0735e0f528fd987 Mon Sep 17 00:00:00 2001 From: Masayuki Nakano Date: Thu, 29 Aug 2013 13:26:43 +0900 Subject: [PATCH] Bug 892539 modifier flag database should be reset if we detect mismatch between the stored data and the latest information via key event r=smichaud --- widget/cocoa/TextInputHandler.h | 4 ++-- widget/cocoa/TextInputHandler.mm | 40 ++++++++++++++++++++------------ 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/widget/cocoa/TextInputHandler.h b/widget/cocoa/TextInputHandler.h index f60459c61eef..9c86fde58a51 100644 --- a/widget/cocoa/TextInputHandler.h +++ b/widget/cocoa/TextInputHandler.h @@ -1211,14 +1211,14 @@ protected: * GetModifierKeyForNativeKeyCode() returns the stored ModifierKey for * the key. */ - ModifierKey* + const ModifierKey* GetModifierKeyForNativeKeyCode(unsigned short aKeyCode) const; /** * GetModifierKeyForDeviceDependentFlags() returns the stored ModifierKey for * the device dependent flags. */ - ModifierKey* + const ModifierKey* GetModifierKeyForDeviceDependentFlags(NSUInteger aFlags) const; /** diff --git a/widget/cocoa/TextInputHandler.mm b/widget/cocoa/TextInputHandler.mm index c6841ed2a321..06276e9f4ea5 100644 --- a/widget/cocoa/TextInputHandler.mm +++ b/widget/cocoa/TextInputHandler.mm @@ -1665,10 +1665,20 @@ TextInputHandler::HandleFlagsChanged(NSEvent* aNativeEvent) // dependent flags. if (isKeyDown && ((diff & ~NSDeviceIndependentModifierFlagsMask) != 0)) { unsigned short keyCode = [aNativeEvent keyCode]; - ModifierKey* modifierKey = GetModifierKeyForDeviceDependentFlags(diff); - if (modifierKey) { - MOZ_ASSERT(modifierKey->keyCode == keyCode); - } else { + const ModifierKey* modifierKey = + GetModifierKeyForDeviceDependentFlags(diff); + if (modifierKey && modifierKey->keyCode != keyCode) { + // Although, we're not sure the actual cause of this case, the stored + // modifier information and the latest key event information may be + // mismatched. Then, let's reset the stored information. + // NOTE: If this happens, it may fail to handle NSFlagsChanged event + // in the default case (below). However, it's the rare case handler + // and this case occurs rarely. So, we can ignore the edge case bug. + NS_WARNING("Resetting stored modifier key information"); + mModifierKeys.Clear(); + modifierKey = nullptr; + } + if (!modifierKey) { mModifierKeys.AppendElement(ModifierKey(diff, keyCode)); } } @@ -1749,7 +1759,7 @@ TextInputHandler::HandleFlagsChanged(NSEvent* aNativeEvent) continue; } } else { - ModifierKey* modifierKey = + const ModifierKey* modifierKey = GetModifierKeyForDeviceDependentFlags(flag); if (!modifierKey) { // See the note above (in the other branch of the if statement) @@ -1764,7 +1774,7 @@ TextInputHandler::HandleFlagsChanged(NSEvent* aNativeEvent) modifiers &= ~flag; switch (keyCode) { case kVK_Shift: { - ModifierKey* modifierKey = + const ModifierKey* modifierKey = GetModifierKeyForNativeKeyCode(kVK_RightShift); if (!modifierKey || !(modifiers & modifierKey->GetDeviceDependentFlags())) { @@ -1773,7 +1783,7 @@ TextInputHandler::HandleFlagsChanged(NSEvent* aNativeEvent) break; } case kVK_RightShift: { - ModifierKey* modifierKey = + const ModifierKey* modifierKey = GetModifierKeyForNativeKeyCode(kVK_Shift); if (!modifierKey || !(modifiers & modifierKey->GetDeviceDependentFlags())) { @@ -1782,7 +1792,7 @@ TextInputHandler::HandleFlagsChanged(NSEvent* aNativeEvent) break; } case kVK_Command: { - ModifierKey* modifierKey = + const ModifierKey* modifierKey = GetModifierKeyForNativeKeyCode(kVK_RightCommand); if (!modifierKey || !(modifiers & modifierKey->GetDeviceDependentFlags())) { @@ -1791,7 +1801,7 @@ TextInputHandler::HandleFlagsChanged(NSEvent* aNativeEvent) break; } case kVK_RightCommand: { - ModifierKey* modifierKey = + const ModifierKey* modifierKey = GetModifierKeyForNativeKeyCode(kVK_Command); if (!modifierKey || !(modifiers & modifierKey->GetDeviceDependentFlags())) { @@ -1800,7 +1810,7 @@ TextInputHandler::HandleFlagsChanged(NSEvent* aNativeEvent) break; } case kVK_Control: { - ModifierKey* modifierKey = + const ModifierKey* modifierKey = GetModifierKeyForNativeKeyCode(kVK_RightControl); if (!modifierKey || !(modifiers & modifierKey->GetDeviceDependentFlags())) { @@ -1809,7 +1819,7 @@ TextInputHandler::HandleFlagsChanged(NSEvent* aNativeEvent) break; } case kVK_RightControl: { - ModifierKey* modifierKey = + const ModifierKey* modifierKey = GetModifierKeyForNativeKeyCode(kVK_Control); if (!modifierKey || !(modifiers & modifierKey->GetDeviceDependentFlags())) { @@ -1818,7 +1828,7 @@ TextInputHandler::HandleFlagsChanged(NSEvent* aNativeEvent) break; } case kVK_Option: { - ModifierKey* modifierKey = + const ModifierKey* modifierKey = GetModifierKeyForNativeKeyCode(kVK_RightOption); if (!modifierKey || !(modifiers & modifierKey->GetDeviceDependentFlags())) { @@ -1827,7 +1837,7 @@ TextInputHandler::HandleFlagsChanged(NSEvent* aNativeEvent) break; } case kVK_RightOption: { - ModifierKey* modifierKey = + const ModifierKey* modifierKey = GetModifierKeyForNativeKeyCode(kVK_Option); if (!modifierKey || !(modifiers & modifierKey->GetDeviceDependentFlags())) { @@ -1875,7 +1885,7 @@ TextInputHandler::HandleFlagsChanged(NSEvent* aNativeEvent) NS_OBJC_END_TRY_ABORT_BLOCK; } -TextInputHandler::ModifierKey* +const TextInputHandler::ModifierKey* TextInputHandler::GetModifierKeyForNativeKeyCode(unsigned short aKeyCode) const { for (ModifierKeyArray::index_type i = 0; i < mModifierKeys.Length(); ++i) { @@ -1886,7 +1896,7 @@ TextInputHandler::GetModifierKeyForNativeKeyCode(unsigned short aKeyCode) const return nullptr; } -TextInputHandler::ModifierKey* +const TextInputHandler::ModifierKey* TextInputHandler::GetModifierKeyForDeviceDependentFlags(NSUInteger aFlags) const { for (ModifierKeyArray::index_type i = 0; i < mModifierKeys.Length(); ++i) {