aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Blott2014-12-15 09:02:23 +0000
committerStephen Blott2014-12-15 09:02:23 +0000
commit48520ed14042a4cca9bdb5fbf72c6a2e62e17f42 (patch)
tree400ae0dcc3e0ec3e37779c066a969fcb69673037
parent5ec7f490b5e9e68bddb415b66b6cae86841a3d52 (diff)
parent82f8ccd6a8376aa854f21bf13d3649f548422fdf (diff)
downloadvimium-48520ed14042a4cca9bdb5fbf72c6a2e62e17f42.tar.bz2
Merge pull request #1313 from smblott-github/mrmr1993-stop-memory-leak-for-keydown-repeats
Mrmr1993 stop memory leak for keydown repeats
-rw-r--r--content_scripts/vimium_frontend.coffee53
1 files changed, 33 insertions, 20 deletions
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index 31f0eab5..16783bda 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -342,7 +342,29 @@ extend window,
isPassKey = ( keyChar ) ->
return !keyQueue and passKeys and 0 <= passKeys.indexOf(keyChar)
-handledKeydownEvents = []
+# Track which keydown events we have handled, so that we can subsequently suppress the corresponding keyup
+# event.
+KeydownEvents =
+ handledEvents: {}
+
+ stringify: (event) ->
+ JSON.stringify
+ metaKey: event.metaKey
+ altKey: event.altKey
+ ctrlKey: event.ctrlKey
+ keyIdentifier: event.keyIdentifier
+ keyCode: event.keyCode
+
+ push: (event) ->
+ @handledEvents[@stringify event] = true
+
+ # Yields truthy or falsy depending upon whether a corresponding keydown event is present (and removes that
+ # event).
+ pop: (event) ->
+ detailString = @stringify event
+ value = @handledEvents[detailString]
+ delete @handledEvents[detailString]
+ value
#
# Sends everything except i & ESC to the handler in background_page. i & ESC are special because they control
@@ -416,38 +438,38 @@ onKeydown = (event) ->
event.srcElement.blur()
exitInsertMode()
DomUtils.suppressEvent event
- handledKeydownEvents.push event
+ KeydownEvents.push event
else if (findMode)
if (KeyboardUtils.isEscape(event))
handleEscapeForFindMode()
DomUtils.suppressEvent event
- handledKeydownEvents.push event
+ KeydownEvents.push event
else if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey)
handleDeleteForFindMode()
DomUtils.suppressEvent event
- handledKeydownEvents.push event
+ KeydownEvents.push event
else if (event.keyCode == keyCodes.enter)
handleEnterForFindMode()
DomUtils.suppressEvent event
- handledKeydownEvents.push event
+ KeydownEvents.push event
else if (!modifiers)
DomUtils.suppressPropagation(event)
- handledKeydownEvents.push event
+ KeydownEvents.push event
else if (isShowingHelpDialog && KeyboardUtils.isEscape(event))
hideHelpDialog()
DomUtils.suppressEvent event
- handledKeydownEvents.push event
+ KeydownEvents.push event
else if (!isInsertMode() && !findMode)
if (keyChar)
if (currentCompletionKeys.indexOf(keyChar) != -1 or isValidFirstKey(keyChar))
DomUtils.suppressEvent event
- handledKeydownEvents.push event
+ KeydownEvents.push event
keyPort.postMessage({ keyChar:keyChar, frameId:frameId })
@@ -468,23 +490,14 @@ onKeydown = (event) ->
(currentCompletionKeys.indexOf(KeyboardUtils.getKeyChar(event)) != -1 ||
isValidFirstKey(KeyboardUtils.getKeyChar(event))))
DomUtils.suppressPropagation(event)
- handledKeydownEvents.push event
+ KeydownEvents.push event
onKeyup = (event) ->
+ handledKeydown = KeydownEvents.pop event
return unless handlerStack.bubbleEvent("keyup", event)
- return if isInsertMode()
# Don't propagate the keyup to the underlying page if Vimium has handled it. See #733.
- for keydown, i in handledKeydownEvents
- if event.metaKey == keydown.metaKey and
- event.altKey == keydown.altKey and
- event.ctrlKey == keydown.ctrlKey and
- event.keyIdentifier == keydown.keyIdentifier and
- event.keyCode == keydown.keyCode
-
- handledKeydownEvents.splice i, 1
- DomUtils.suppressPropagation(event)
- break
+ DomUtils.suppressPropagation(event) if handledKeydown
checkIfEnabledForUrl = ->
url = window.location.toString()