diff options
| author | Stephen Blott | 2014-12-15 09:02:23 +0000 |
|---|---|---|
| committer | Stephen Blott | 2014-12-15 09:02:23 +0000 |
| commit | 48520ed14042a4cca9bdb5fbf72c6a2e62e17f42 (patch) | |
| tree | 400ae0dcc3e0ec3e37779c066a969fcb69673037 | |
| parent | 5ec7f490b5e9e68bddb415b66b6cae86841a3d52 (diff) | |
| parent | 82f8ccd6a8376aa854f21bf13d3649f548422fdf (diff) | |
| download | vimium-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.coffee | 53 |
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() |
