Bug 1119609 part.7 Make TextInputProcerros possible to share modifier state r=smaug, sr=smaug

This commit is contained in:
Masayuki Nakano 2015-02-19 15:50:19 +09:00
parent f461315911
commit 8a60028480
7 changed files with 226 additions and 52 deletions

View File

@ -596,6 +596,38 @@ TextInputProcessor::Keyup(nsIDOMKeyEvent* aDOMKeyEvent,
return NS_OK;
}
NS_IMETHODIMP
TextInputProcessor::GetModifierState(const nsAString& aModifierKeyName,
bool* aActive)
{
MOZ_RELEASE_ASSERT(aActive, "aActive must not be null");
MOZ_RELEASE_ASSERT(nsContentUtils::IsCallerChrome());
if (!mModifierKeyDataArray) {
*aActive = false;
return NS_OK;
}
Modifiers activeModifiers = mModifierKeyDataArray->GetActiveModifiers();
Modifiers modifier = WidgetInputEvent::GetModifier(aModifierKeyName);
*aActive = ((activeModifiers & modifier) != 0);
return NS_OK;
}
NS_IMETHODIMP
TextInputProcessor::ShareModifierStateOf(nsITextInputProcessor* aOther)
{
MOZ_RELEASE_ASSERT(nsContentUtils::IsCallerChrome());
if (!aOther) {
mModifierKeyDataArray = nullptr;
return NS_OK;
}
TextInputProcessor* other = static_cast<TextInputProcessor*>(aOther);
if (!other->mModifierKeyDataArray) {
other->mModifierKeyDataArray = new ModifierKeyDataArray();
}
mModifierKeyDataArray = other->mModifierKeyDataArray;
return NS_OK;
}
/******************************************************************************
* TextInputProcessor::ModifierKeyData
******************************************************************************/

View File

@ -8,6 +8,7 @@
#include "mozilla/EventForwards.h"
#include "mozilla/TextEventDispatcherListener.h"
#include "nsAutoPtr.h"
#include "nsITextInputProcessor.h"
#include "nsITextInputProcessorCallback.h"
#include "nsTArray.h"
@ -78,33 +79,51 @@ private:
class ModifierKeyDataArray : public nsTArray<ModifierKeyData>
{
NS_INLINE_DECL_REFCOUNTING(ModifierKeyDataArray)
public:
Modifiers GetActiveModifiers() const;
void ActivateModifierKey(const ModifierKeyData& aModifierKeyData);
void InactivateModifierKey(const ModifierKeyData& aModifierKeyData);
void ToggleModifierKey(const ModifierKeyData& aModifierKeyData);
private:
virtual ~ModifierKeyDataArray() { }
};
Modifiers GetActiveModifiers() const
{
return mModifierKeyDataArray.GetActiveModifiers();
return mModifierKeyDataArray ?
mModifierKeyDataArray->GetActiveModifiers() : 0;
}
void EnsureModifierKeyDataArray()
{
if (mModifierKeyDataArray) {
return;
}
mModifierKeyDataArray = new ModifierKeyDataArray();
}
void ActivateModifierKey(const ModifierKeyData& aModifierKeyData)
{
mModifierKeyDataArray.ActivateModifierKey(aModifierKeyData);
EnsureModifierKeyDataArray();
mModifierKeyDataArray->ActivateModifierKey(aModifierKeyData);
}
void InactivateModifierKey(const ModifierKeyData& aModifierKeyData)
{
mModifierKeyDataArray.InactivateModifierKey(aModifierKeyData);
if (!mModifierKeyDataArray) {
return;
}
mModifierKeyDataArray->InactivateModifierKey(aModifierKeyData);
}
void ToggleModifierKey(const ModifierKeyData& aModifierKeyData)
{
mModifierKeyDataArray.ToggleModifierKey(aModifierKeyData);
EnsureModifierKeyDataArray();
mModifierKeyDataArray->ToggleModifierKey(aModifierKeyData);
}
TextEventDispatcher* mDispatcher; // [Weak]
nsCOMPtr<nsITextInputProcessorCallback> mCallback;
ModifierKeyDataArray mModifierKeyDataArray;
nsRefPtr<ModifierKeyDataArray> mModifierKeyDataArray;
bool mForTests;
};

View File

@ -1155,6 +1155,11 @@ function runKeyTests()
}
// Modifier state tests
var sharedTIP = createTIP();
ok(sharedTIP.beginInputTransactionForTests(otherWindow),
description + "sharedTIP.beginInputTransactionForTests(otherWindow) should return true");
TIP.shareModifierStateOf(sharedTIP);
var independentTIP = createTIP();
const kModifierKeys = [
{ key: "Alt", code: "AltLeft", isLockable: false },
{ key: "Alt", code: "AltRight", isLockable: false },
@ -1204,6 +1209,18 @@ function runKeyTests()
}
}
function checkAllTIPModifiers(aTestDesc, aModifiers)
{
for (var i = 0; i < kModifiers.length; i++) {
is(TIP.getModifierState(kModifiers[i]), aModifiers.indexOf(kModifiers[i]) >= 0,
aTestDesc + ", TIP.getModifierState(\"" + kModifiers[i] + "\") returns wrong value");
is(sharedTIP.getModifierState(kModifiers[i]), TIP.getModifierState(kModifiers[i]),
aTestDesc + ", sharedTIP.getModifierState(\"" + kModifiers[i] + "\") returns different value from TIP");
is(independentTIP.getModifierState(kModifiers[i]), false,
aTestDesc + ", independentTIP.getModifierState(\"" + kModifiers[i] + "\") should return false");
}
}
// First, all modifiers must be false.
reset();
doPreventDefaults = [ "keypress" ];
@ -1224,9 +1241,13 @@ function runKeyTests()
var testDesc = "A modifier key \"" + kModifierKeys[i].key + "\" (\"" + kModifierKeys[i].code + "\") and a printable key";
if (!kModifierKeys[i].isLockable) {
TIP.keydown(modKey);
checkAllTIPModifiers(testDesc + ", \"" + kModifierKeys[i].key + "\" keydown", [ kModifierKeys[i].key ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown", [ kModifierKeys[i].key ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup", [ kModifierKeys[i].key ]);
TIP.keyup(modKey);
checkAllTIPModifiers(testDesc + ", \"" + kModifierKeys[i].key + "\" keyup", [ ]);
is(events.length, 5,
description + testDesc + " should cause 5 events");
checkModifiers(testDesc, events[0], "keydown", kModifierKeys[i].key, kModifierKeys[i].code, [ kModifierKeys[i].key ]);
@ -1236,11 +1257,17 @@ function runKeyTests()
checkModifiers(testDesc, events[4], "keyup", kModifierKeys[i].key, kModifierKeys[i].code, [ ]);
} else {
TIP.keydown(modKey);
checkAllTIPModifiers(testDesc + ", \"" + kModifierKeys[i].key + "\" first keydown", [ kModifierKeys[i].key ]);
TIP.keyup(modKey);
checkAllTIPModifiers(testDesc + ", \"" + kModifierKeys[i].key + "\" first keyup", [ kModifierKeys[i].key ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown", [ kModifierKeys[i].key ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup", [ kModifierKeys[i].key ]);
TIP.keydown(modKey);
checkAllTIPModifiers(testDesc + ", \"" + kModifierKeys[i].key + "\" second keydown", [ ]);
TIP.keyup(modKey);
checkAllTIPModifiers(testDesc + ", \"" + kModifierKeys[i].key + "\" second keyup", [ ]);
is(events.length, 7,
description + testDesc + " should cause 7 events");
checkModifiers(testDesc, events[0], "keydown", kModifierKeys[i].key, kModifierKeys[i].code, [ kModifierKeys[i].key ]);
@ -1258,18 +1285,27 @@ function runKeyTests()
var shiftRight = new KeyboardEvent("", { key: "Shift", code: "ShiftRight" });
var shiftVirtual = new KeyboardEvent("", { key: "Shift", code: "" });
var altGrVirtual = new KeyboardEvent("", { key: "AltGraph", code: "" });
var ctrlVirtual = new KeyboardEvent("", { key: "Control", code: "" });
var testDesc = "ShiftLeft press -> ShiftRight press -> ShiftRight release -> ShiftLeft release";
reset();
doPreventDefaults = [ "keypress" ];
TIP.keydown(shiftLeft);
checkAllTIPModifiers(testDesc + ", Left-Shift keydown", [ "Shift" ]);
TIP.keydown(shiftRight);
checkAllTIPModifiers(testDesc + ", Right-Shift keydown", [ "Shift" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown", [ "Shift" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup", [ "Shift" ]);
TIP.keyup(shiftRight);
checkAllTIPModifiers(testDesc + ", Right-Shift keyup", [ "Shift" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown (after Right-Shift keyup)", [ "Shift" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup (after Right-Shift keyup)", [ "Shift" ]);
TIP.keyup(shiftLeft);
checkAllTIPModifiers(testDesc + ", Left-Shift keyup", [ ]);
is(events.length, 10,
description + testDesc + " should cause 10 events");
@ -1288,13 +1324,21 @@ function runKeyTests()
reset();
doPreventDefaults = [ "keypress" ];
TIP.keydown(shiftLeft);
checkAllTIPModifiers(testDesc + ", Left-Shift keydown", [ "Shift" ]);
TIP.keydown(shiftRight);
checkAllTIPModifiers(testDesc + ", Right-Shift keydown", [ "Shift" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown", [ "Shift" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup", [ "Shift" ]);
TIP.keyup(shiftLeft);
checkAllTIPModifiers(testDesc + ", Left-Shift keyup", [ "Shift" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown (after Left-Shift keyup)", [ "Shift" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup (after Left-Shift keyup)", [ "Shift" ]);
TIP.keyup(shiftRight);
checkAllTIPModifiers(testDesc + ", Right-Shift keyup", [ ]);
is(events.length, 10,
description + testDesc + " should cause 10 events");
@ -1313,13 +1357,21 @@ function runKeyTests()
reset();
doPreventDefaults = [ "keypress" ];
TIP.keydown(shiftLeft);
checkAllTIPModifiers(testDesc + ", Left-Shift keydown", [ "Shift" ]);
TIP.keydown(shiftVirtual);
checkAllTIPModifiers(testDesc + ", Virtual-Shift keydown", [ "Shift" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown", [ "Shift" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup", [ "Shift" ]);
TIP.keyup(shiftVirtual);
checkAllTIPModifiers(testDesc + ", Virtual-Shift keyup", [ "Shift" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown (after Virtual-Shift keyup)", [ "Shift" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup (after Virtual-Shift keyup)", [ "Shift" ]);
TIP.keyup(shiftLeft);
checkAllTIPModifiers(testDesc + ", Left-Shift keyup", [ ]);
is(events.length, 10,
description + testDesc + " should cause 10 events");
@ -1338,13 +1390,21 @@ function runKeyTests()
reset();
doPreventDefaults = [ "keypress" ];
TIP.keydown(shiftVirtual);
checkAllTIPModifiers(testDesc + ", Virtual-Shift keydown", [ "Shift" ]);
TIP.keydown(shiftRight);
checkAllTIPModifiers(testDesc + ", Right-Shift keydown", [ "Shift" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown", [ "Shift" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup", [ "Shift" ]);
TIP.keyup(shiftRight);
checkAllTIPModifiers(testDesc + ", Right-Shift keyup", [ "Shift" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown (after Right-Shift keyup)", [ "Shift" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup (after Right-Shift keyup)", [ "Shift" ]);
TIP.keyup(shiftVirtual);
checkAllTIPModifiers(testDesc + ", Virtual-Shift keyup", [ ]);
is(events.length, 10,
description + testDesc + " should cause 10 events");
@ -1363,16 +1423,27 @@ function runKeyTests()
reset();
doPreventDefaults = [ "keypress" ];
TIP.keydown(shiftLeft);
checkAllTIPModifiers(testDesc + ", Left-Shift keydown", [ "Shift" ]);
TIP.keydown(shiftRight);
checkAllTIPModifiers(testDesc + ", Right-Shift keydown", [ "Shift" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown", [ "Shift" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup", [ "Shift" ]);
TIP.keyup(shiftRight);
checkAllTIPModifiers(testDesc + ", Right-Shift keyup", [ "Shift" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown (after Virtual-Shift keyup)", [ "Shift" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup (after Virtual-Shift keyup)", [ "Shift" ]);
TIP.keyup(shiftRight);
checkAllTIPModifiers(testDesc + ", Right-Shift keyup again", [ "Shift" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown (after Virtual-Shift keyup again)", [ "Shift" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup (after Virtual-Shift keyup again)", [ "Shift" ]);
TIP.keyup(shiftLeft);
checkAllTIPModifiers(testDesc + ", Left-Shift keyup", [ ]);
is(events.length, 14,
description + testDesc + " should cause 14 events");
@ -1395,15 +1466,25 @@ function runKeyTests()
reset();
doPreventDefaults = [ "keypress" ];
TIP.keydown(shiftLeft);
checkAllTIPModifiers(testDesc + ", Left-Shift keydown", [ "Shift" ]);
TIP.keydown(shiftLeft);
checkAllTIPModifiers(testDesc + ", Left-Shift keydown again", [ "Shift" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown", [ "Shift" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup", [ "Shift" ]);
TIP.keyup(shiftLeft);
checkAllTIPModifiers(testDesc + ", Left-Shift keyup", [ ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown (after Left-Shift keyup)", [ ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup (after Left-Shift keyup)", [ ]);
TIP.keyup(shiftLeft);
checkAllTIPModifiers(testDesc + ", Left-Shift keyup again", [ ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown (after Left-Shift keyup again)", [ ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup (after Left-Shift keyup again)", [ ]);
is(events.length, 13,
description + testDesc + " should cause 13 events");
@ -1425,13 +1506,21 @@ function runKeyTests()
reset();
doPreventDefaults = [ "keypress" ];
TIP.keydown(shiftVirtual);
checkAllTIPModifiers(testDesc + ", Virtual-Shift keydown", [ "Shift" ]);
TIP.keydown(altGrVirtual);
checkAllTIPModifiers(testDesc + ", Virtual-AltGraph keydown", [ "Shift", "AltGraph" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown", [ "Shift", "AltGraph" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup", [ "Shift", "AltGraph" ]);
TIP.keyup(altGrVirtual);
checkAllTIPModifiers(testDesc + ", Virtual-AltGraph keyup", [ "Shift" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown (after Virtual-AltGraph keyup)", [ "Shift" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup (after Virtual-AltGraph keyup)", [ "Shift" ]);
TIP.keyup(shiftVirtual);
checkAllTIPModifiers(testDesc + ", Virtual-Shift keyup", [ ]);
is(events.length, 10,
description + testDesc + " should cause 10 events");
@ -1450,13 +1539,21 @@ function runKeyTests()
reset();
doPreventDefaults = [ "keypress" ];
TIP.keydown(shiftVirtual);
checkAllTIPModifiers(testDesc + ", Virtual-Shift keydown", [ "Shift" ]);
TIP.keydown(altGrVirtual);
checkAllTIPModifiers(testDesc + ", Virtual-AltGraph keydown", [ "Shift", "AltGraph" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown", [ "Shift", "AltGraph" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup", [ "Shift", "AltGraph" ]);
TIP.keyup(shiftVirtual);
checkAllTIPModifiers(testDesc + ", Virtual-Shift keyup", [ "AltGraph" ]);
TIP.keydown(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keydown (after Virtual-Shift keyup)", [ "AltGraph" ]);
TIP.keyup(keyA);
checkAllTIPModifiers(testDesc + ", \"a\" keyup (after Virtual-Shift keyup)", [ "AltGraph" ]);
TIP.keyup(altGrVirtual);
checkAllTIPModifiers(testDesc + ", Virtual-AltGraph keyup", [ ]);
is(events.length, 10,
description + testDesc + " should cause 10 events");
@ -1471,6 +1568,39 @@ function runKeyTests()
checkModifiers(testDesc, events[8], "keyup", "a", "KeyA", [ "AltGraph" ]);
checkModifiers(testDesc, events[9], "keyup", "AltGraph", "", [ ]);
// shareModifierStateOf(null) should cause resetting the modifier state
function checkTIPModifiers(aTestDesc, aTIP, aModifiers)
{
for (var i = 0; i < kModifiers.length; i++) {
is(aTIP.getModifierState(kModifiers[i]), aModifiers.indexOf(kModifiers[i]) >= 0,
description + aTestDesc + ", aTIP.getModifierState(\"" + kModifiers[i] + "\") returns wrong value");
}
}
TIP.keydown(shiftVirtual);
TIP.keydown(altGrVirtual);
sharedTIP.shareModifierStateOf(null);
checkTIPModifiers("sharedTIP.sharedModifierStateOf(null) shouldn't cause TIP's modifiers reset", TIP, [ "Shift", "AltGraph" ]);
checkTIPModifiers("sharedTIP.sharedModifierStateOf(null) should cause sharedTIP modifiers reset", sharedTIP, [ ]);
// sharedTIP.shareModifierStateOf(null) should be unlinked from TIP.
TIP.keydown(ctrlVirtual);
checkTIPModifiers("TIP.keydown(ctrlVirtual) should cause TIP's modifiers set", TIP, [ "Shift", "AltGraph", "Control" ]);
checkTIPModifiers("TIP.keydown(ctrlVirtual) shouldn't cause sharedTIP modifiers set", sharedTIP, [ ]);
// beginInputTransactionForTests() shouldn't cause modifier state reset.
ok(TIP.beginInputTransactionForTests(otherWindow),
description + "TIP.beginInputTransactionForTests(otherWindow) should return true");
checkTIPModifiers("TIP.beginInputTransactionForTests(otherWindow) shouldn't cause TIP's modifiers set", TIP, [ "Shift", "AltGraph", "Control" ]);
TIP.keyup(shiftLeft);
TIP.keyup(altGrVirtual);
TIP.keyup(ctrlVirtual);
checkTIPModifiers("TIP should keep modifier's physical key state", TIP, [ "Shift" ]);
ok(TIP.beginInputTransactionForTests(window),
description + "TIP.beginInputTransactionForTests(window) should return true");
checkTIPModifiers("TIP.beginInputTransactionForTests(window) shouldn't cause TIP's modifiers set", TIP, [ "Shift" ]);
TIP.keyup(shiftVirtual);
checkTIPModifiers("TIP should keep modifier's physical key state", TIP, [ ]);
window.removeEventListener("keydown", handler, false);
window.removeEventListener("keypress", handler, false);
window.removeEventListener("keyup", handler, false);

View File

@ -452,52 +452,7 @@ UIEvent::GetModifierStateInternal(const nsAString& aKey)
{
WidgetInputEvent* inputEvent = mEvent->AsInputEvent();
MOZ_ASSERT(inputEvent, "mEvent must be WidgetInputEvent or derived class");
if (aKey.EqualsLiteral("Accel")) {
return inputEvent->IsAccel();
}
if (aKey.EqualsLiteral(NS_DOM_KEYNAME_SHIFT)) {
return inputEvent->IsShift();
}
if (aKey.EqualsLiteral(NS_DOM_KEYNAME_CONTROL)) {
return inputEvent->IsControl();
}
if (aKey.EqualsLiteral(NS_DOM_KEYNAME_META)) {
return inputEvent->IsMeta();
}
if (aKey.EqualsLiteral(NS_DOM_KEYNAME_ALT)) {
return inputEvent->IsAlt();
}
if (aKey.EqualsLiteral(NS_DOM_KEYNAME_ALTGRAPH)) {
return inputEvent->IsAltGraph();
}
if (aKey.EqualsLiteral(NS_DOM_KEYNAME_OS)) {
return inputEvent->IsOS();
}
if (aKey.EqualsLiteral(NS_DOM_KEYNAME_CAPSLOCK)) {
return inputEvent->IsCapsLocked();
}
if (aKey.EqualsLiteral(NS_DOM_KEYNAME_NUMLOCK)) {
return inputEvent->IsNumLocked();
}
if (aKey.EqualsLiteral(NS_DOM_KEYNAME_FN)) {
return inputEvent->IsFn();
}
if (aKey.EqualsLiteral(NS_DOM_KEYNAME_FNLOCK)) {
return inputEvent->IsFnLocked();
}
if (aKey.EqualsLiteral(NS_DOM_KEYNAME_SCROLLLOCK)) {
return inputEvent->IsScrollLocked();
}
if (aKey.EqualsLiteral(NS_DOM_KEYNAME_SYMBOL)) {
return inputEvent->IsSymbol();
}
if (aKey.EqualsLiteral(NS_DOM_KEYNAME_SYMBOLLOCK)) {
return inputEvent->IsSymbolLocked();
}
return false;
return ((inputEvent->modifiers & WidgetInputEvent::GetModifier(aKey)) != 0);
}
} // namespace dom

View File

@ -224,7 +224,7 @@ interface nsITextInputProcessorCallback;
* TIP.keyup(leftShift);
*/
[scriptable, builtinclass, uuid(16144d6e-a97a-4733-aa6a-3a1287cfe539)]
[scriptable, builtinclass, uuid(c8b5d3fb-5bed-4b77-b67f-77aee6ac5081)]
interface nsITextInputProcessor : nsISupports
{
/**
@ -464,6 +464,28 @@ interface nsITextInputProcessor : nsISupports
[optional_argc]
boolean keyup(in nsIDOMKeyEvent aKeyboardEvent,
[optional] in unsigned long aKeyFlags);
/**
* getModifierState() returns modifier state managed by this instance.
*
* @param aModifier One of modifier key names. This doesn't support
* virtual modifiers like "Accel".
* @return true if the modifier key is active. Otherwise,
* false.
*/
boolean getModifierState(in DOMString aModifierKey);
/**
* shareModifierStateOf() makes the instance shares modifier state of
* another instance. When this is called, the instance refers the modifier
* state of another instance. After that, changes to either this and the
* other instance's modifier state is synchronized.
*
* @param aOther Another instance which will be referred by the
* instance. If this is null, the instance restarts
* to manage modifier state independently.
*/
void shareModifierStateOf(in nsITextInputProcessor aOther);
};
%{C++

View File

@ -1016,6 +1016,11 @@ public:
*/
static Modifier AccelModifier();
/**
* GetModifier() returns a modifier flag which is activated by aDOMKeyName.
*/
static Modifier GetModifier(const nsAString& aDOMKeyName);
// true indicates the accel key on the environment is down
bool IsAccel() const
{

View File

@ -254,6 +254,17 @@ WidgetEvent::IsAllowedToDispatchDOMEvent() const
* mozilla::WidgetInputEvent
******************************************************************************/
/* static */
Modifier
WidgetInputEvent::GetModifier(const nsAString& aDOMKeyName)
{
if (aDOMKeyName.EqualsLiteral("Accel")) {
return AccelModifier();
}
KeyNameIndex keyNameIndex = WidgetKeyboardEvent::GetKeyNameIndex(aDOMKeyName);
return WidgetKeyboardEvent::GetModifierForKeyName(keyNameIndex);
}
/* static */
Modifier
WidgetInputEvent::AccelModifier()