commit 9467a9d330a20b6850f7393185aec5d08e903df1
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Fri Aug 7 18:18:04 2015 -0700
fixup! Bug 15646: Prevent keyboard layout fingerprinting in KeyboardEvent
---
dom/events/KeyCodeConsensus.h | 37 +++++++++++++++++++------------------
dom/events/KeyboardEvent.cpp | 5 +++--
2 files changed, 22 insertions(+), 20 deletions(-)
diff --git a/dom/events/KeyCodeConsensus.h b/dom/events/KeyCodeConsensus.h
index 53ec7f6..47d8341 100644
--- a/dom/events/KeyCodeConsensus.h
+++ b/dom/events/KeyCodeConsensus.h
@@ -9,9 +9,9 @@
// KEY_INTERNAL is called by KEY or SHIFT.
#define KEY_INTERNAL(key, code, keyCode, shift) \
- gCodes->Put(NS_LITERAL_STRING(key), NS_LITERAL_STRING(#code)); \
- gKeyCodes->Put(NS_LITERAL_STRING(key), keyCode); \
- gShiftStates->Put(NS_LITERAL_STRING(key), shift);
+ gCodes->Put(NS_LITERAL_STRING(key), NS_LITERAL_STRING(#code)); \
+ gKeyCodes->Put(NS_LITERAL_STRING(key), keyCode); \
+ gShiftStates->Put(NS_LITERAL_STRING(key), shift);
// KEY and SHIFT assign a consensus codeName and keyCode for the given keyName.
// KEY indicates that shift is off.
@@ -29,7 +29,7 @@ static nsDataHashtable<nsStringHashKey, bool>* gShiftStates;
static StaticMutex createKeyCodesMutex;
-// Populate the global static maps gCodes, gKeCodes, gShiftStates
+// Populate the global static maps gCodes, gKeyCodes, gShiftStates
// with their constant values.
static void createKeyCodes()
{
@@ -41,32 +41,33 @@ static void createKeyCodes()
gKeyCodes = new nsDataHashtable<nsStringHashKey, uint32_t>();
gShiftStates = new nsDataHashtable<nsStringHashKey, bool>();
- KEY("AltLeft", AltLeft, 18)
- KEY("AltRight", AltRight, 18)
+ KEY("Alt", AltLeft, 18)
+ KEY("ArrowDown", ArrowDown, 40)
+ KEY("ArrowLeft", ArrowLeft, 37)
+ KEY("ArrowRight", ArrowRight, 39)
+ KEY("ArrowUp", ArrowUp, 38)
+ KEY("Backspace", Backspace, 8)
KEY("CapsLock", CapsLock, 20)
- KEY("Control", ControlLeft, 17)
- KEY("Meta", OSLeft, 91)
- KEY("Shift", ShiftLeft, 16)
KEY("ContextMenu", ContextMenu, 93)
- KEY("Enter", Enter, 13)
- KEY(" ", Space, 32)
- KEY("Tab", Tab, 9)
+ KEY("Control", ControlLeft, 17)
KEY("Delete", Delete, 46)
KEY("End", End, 35)
+ KEY("Enter", Enter, 13)
+ KEY("Escape", Escape, 27)
KEY("Help", Help, 6)
KEY("Home", Home, 36)
KEY("Insert", Insert, 45)
+ KEY("Meta", OSLeft, 91)
KEY("PageDown", PageDown, 34)
KEY("PageUp", PageUp, 33)
- KEY("ArrowDown", ArrowDown, 40)
- KEY("ArrowLeft", ArrowLeft, 37)
- KEY("ArrowRight", ArrowRight, 39)
- KEY("ArrowUp", ArrowUp, 38)
- KEY("Escape", Escape, 27)
+ KEY("Pause", Pause, 19)
KEY("PrintScreen", PrintScreen, 44)
KEY("ScrollLock", ScrollLock, 145)
- KEY("Pause", Pause, 19)
+ KEY("Shift", ShiftLeft, 16)
+ KEY("Tab", Tab, 9)
+ // Leaving "Clear" key unimplemented; it's inconsistent between platforms.
+ KEY(" ", Space, 32)
KEY(",", Comma, 188)
SHIFT("<", Comma, 188)
KEY(".", Period, 190)
diff --git a/dom/events/KeyboardEvent.cpp b/dom/events/KeyboardEvent.cpp
index 6a68f96..19d4e73 100644
--- a/dom/events/KeyboardEvent.cpp
+++ b/dom/events/KeyboardEvent.cpp
@@ -50,8 +50,9 @@ KeyboardEvent::AltKey()
if (ResistFingerprinting()) {
nsString keyName;
GetKey(keyName);
- bool exists = gCodes->Get(keyName, nullptr);
- return exists ? false : altState;
+ bool fakeShiftState;
+ gShiftStates->Get(keyName, &fakeShiftState);
+ return fakeShiftState ? false : altState;
} else {
return altState;
}