Index: chrome/browser/resources/keyboard/common.js |
diff --git a/chrome/browser/resources/keyboard/common.js b/chrome/browser/resources/keyboard/common.js |
index 7d1ee801b1813139c81be2c69b3ff527c34658ee..e4311002a39a0a1442959e61466ee6168b0ff408 100644 |
--- a/chrome/browser/resources/keyboard/common.js |
+++ b/chrome/browser/resources/keyboard/common.js |
@@ -86,33 +86,25 @@ function transitionMode(transition) { |
/** |
* Send the given key to chrome, via the experimental extension API. |
* @param {string} key The key to send. |
- * @param {string=} opt_type The type of event to send (keydown or keyup). If |
- * omitted send both keydown and keyup events. |
* @return {void} |
*/ |
-function sendKey(key, type) { |
+function sendKey(key) { |
var keyEvent = {'keyIdentifier': key}; |
- if (!type || type == 'keydown') { |
- // A keypress event is automatically generated for printable characters |
- // immediately following the keydown event. |
+ // A keypress event is automatically generated for printable characters |
+ // immediately following the keydown event. |
+ if (chrome.experimental) { |
keyEvent.type = 'keydown'; |
- if (chrome.experimental) { |
- chrome.experimental.input.sendKeyboardEvent(keyEvent); |
- } |
- // Exit shift mode after pressing any key but space. |
- if (currentMode == SHIFT_MODE && key != 'Spacebar') { |
- transitionMode(SHIFT_MODE); |
- } |
- // Enter shift mode after typing a period for a new sentence. |
- if (currentMode != SHIFT_MODE && key == '.') { |
- transitionMode(SHIFT_MODE); |
- } |
- } |
- if (!type || type == 'keyup') { |
+ chrome.experimental.input.sendKeyboardEvent(keyEvent); |
keyEvent.type = 'keyup'; |
- if (chrome.experimental) { |
- chrome.experimental.input.sendKeyboardEvent(keyEvent); |
- } |
+ chrome.experimental.input.sendKeyboardEvent(keyEvent); |
+ } |
+ // Exit shift mode after pressing any key but space. |
+ if (currentMode == SHIFT_MODE && key != 'Spacebar') { |
+ transitionMode(SHIFT_MODE); |
+ } |
+ // Enter shift mode after typing a period for a new sentence. |
+ if (currentMode != SHIFT_MODE && key == '.') { |
+ transitionMode(SHIFT_MODE); |
} |
} |
@@ -152,10 +144,11 @@ function addContent(element, opt_textContent) { |
* @param {Element} element The top-level DOM Element to set event handlers on. |
* @param {function()} keyDownHandler The event handler called when the key is |
* pressed. This will be called repeatedly when holding a repeating key. |
- * @param {function()=} opt_keyUpHandler The event handler called when the key |
+ * @param {function()=} keyUpHandler The event handler called when the key |
* is released. This is only called once per actual key press. |
*/ |
-function setupKeyEventHandlers(key, element, keyDownHandler, opt_keyUpHandler) { |
+function setupKeyEventHandlersHelper(key, element, keyDownHandler, |
+ keyUpHandler) { |
/** |
* Handle a key down event on the virtual key. |
* @param {UIEvent} evt The UI event which triggered the key down. |
@@ -205,20 +198,51 @@ function setupKeyEventHandlers(key, element, keyDownHandler, opt_keyUpHandler) { |
repeatKey.cancel(); |
} |
- if (opt_keyUpHandler) { |
- opt_keyUpHandler(); |
+ if (keyUpHandler) { |
+ keyUpHandler(); |
} |
evt.preventDefault(); |
}; |
+ var outHandler = function(evt) { |
+ // Reset key press state if the point goes out of the element. |
+ key.pressed = false; |
+ } |
+ |
// Setup mouse event handlers. |
element.addEventListener('mousedown', downHandler); |
element.addEventListener('mouseup', upHandler); |
- element.addEventListener('mouseout', upHandler); |
+ element.addEventListener('mouseout', outHandler); |
// Setup touch handlers. |
element.addEventListener('touchstart', downHandler); |
element.addEventListener('touchend', upHandler); |
+ // TODO(mazda): Add a handler for touchleave once Webkit supports it. |
+ // element.addEventListener('touchleave', outHandler); |
+} |
+ |
+/** |
+ * Set up the event handlers necessary to respond to the key down event on the |
+ * virtual keyboard. |
+ * @param {BaseKey} key The BaseKey object corresponding to this key. |
+ * @param {Element} element The top-level DOM Element to set event handlers on. |
+ * @param {function()} keyDownHandler The event handler called when the key is |
+ * pressed. This will be called repeatedly when holding a repeating key. |
+ */ |
+function setupKeyDownEventHandler(key, element, keyDownHandler) { |
+ setupKeyEventHandlersHelper(key, element, keyDownHandler, null); |
+} |
+ |
+/** |
+ * Set up the event handlers necessary to respond to the key up event on the |
+ * virtual keyboard. |
+ * @param {BaseKey} key The BaseKey object corresponding to this key. |
+ * @param {Element} element The top-level DOM Element to set event handlers on. |
+ * @param {function()=} keyUpHandler The event handler called when the key |
+ * is released. This is only called once per actual key press. |
+ */ |
+function setupKeyUpEventHandler(key, element, keyUpHandler) { |
+ setupKeyEventHandlersHelper(key, element, null, keyUpHandler); |
} |
/** |
@@ -362,9 +386,8 @@ Key.prototype = { |
this.modeElements_[mode].className = 'key'; |
addContent(this.modeElements_[mode], this.modes_[mode].display); |
- setupKeyEventHandlers(this, this.modeElements_[mode], |
- sendKeyFunction(this.modes_[mode].keyIdentifier, 'keydown'), |
- sendKeyFunction(this.modes_[mode].keyIdentifier, 'keyup')); |
+ setupKeyUpEventHandler(this, this.modeElements_[mode], |
+ sendKeyFunction(this.modes_[mode].keyIdentifier)); |
return this.modeElements_[mode]; |
} |
@@ -396,9 +419,14 @@ SvgKey.prototype = { |
this.modeElements_[mode].classList.add(this.className_); |
addContent(this.modeElements_[mode]); |
- setupKeyEventHandlers(this, this.modeElements_[mode], |
- sendKeyFunction(this.keyId_, 'keydown'), |
- sendKeyFunction(this.keyId_, 'keyup')); |
+ if (this.repeat_) { |
+ // send the key event on key down if key repeat is enabled |
+ setupKeyDownEventHandler(this, this.modeElements_[mode], |
+ sendKeyFunction(this.keyId_)); |
+ } else { |
+ setupKeyUpEventHandler(this, this.modeElements_[mode], |
+ sendKeyFunction(this.keyId_)); |
+ } |
return this.modeElements_[mode]; |
} |
@@ -429,9 +457,8 @@ SpecialKey.prototype = { |
this.modeElements_[mode].classList.add(this.className_); |
addContent(this.modeElements_[mode], this.content_); |
- setupKeyEventHandlers(this, this.modeElements_[mode], |
- sendKeyFunction(this.keyId_, 'keydown'), |
- sendKeyFunction(this.keyId_, 'keyup')); |
+ setupKeyUpEventHandler(this, this.modeElements_[mode], |
+ sendKeyFunction(this.keyId_)); |
return this.modeElements_[mode]; |
} |
@@ -471,7 +498,7 @@ ShiftKey.prototype = { |
this.modeElements_[mode].classList.remove('moddown'); |
} |
- setupKeyEventHandlers(this, this.modeElements_[mode], |
+ setupKeyDownEventHandler(this, this.modeElements_[mode], |
function() { |
transitionMode(SHIFT_MODE); |
}); |
@@ -510,7 +537,7 @@ SymbolKey.prototype = { |
this.modeElements_[mode].classList.remove('moddown'); |
} |
- setupKeyEventHandlers(this, this.modeElements_[mode], |
+ setupKeyDownEventHandler(this, this.modeElements_[mode], |
function() { |
transitionMode(NUMBER_MODE); |
}); |
@@ -538,7 +565,7 @@ DotComKey.prototype = { |
this.modeElements_[mode].className = 'key com'; |
addContent(this.modeElements_[mode], '.com'); |
- setupKeyEventHandlers(this, this.modeElements_[mode], |
+ setupKeyUpEventHandler(this, this.modeElements_[mode], |
function() { |
sendKey('.'); |
sendKey('c'); |
@@ -569,7 +596,7 @@ HideKeyboardKey.prototype = { |
this.modeElements_[mode].className = 'key hide'; |
addContent(this.modeElements_[mode]); |
- setupKeyEventHandlers(this, this.modeElements_[mode], |
+ setupKeyDownEventHandler(this, this.modeElements_[mode], |
function() { |
if (chrome.experimental) { |
chrome.experimental.input.hideKeyboard(); |