aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Blott2016-04-08 07:55:13 +0100
committerStephen Blott2016-04-08 07:55:16 +0100
commitd1c230cabb051a5429242c98e67d37b65edc58b8 (patch)
treecd7daec940a9a77041a1955ae7133d54148a7db8
parentbee5ee8416be776f379beb1bf772665a19cd3fa4 (diff)
downloadvimium-d1c230cabb051a5429242c98e67d37b65edc58b8.tar.bz2
Do not post hint descriptors back to the frame itself.
When distributing hint descriptors, do not post a frame's own hint descriptors back to the frame itself. It already has them. With regard to the message-passing cost only, this represents a speedup of approximately 3/2 for link-busy sites like reddit -- several tens of milliseconds for me. There are other costs too (such as processing the hint descriptors) bu these are not affected.
-rw-r--r--background_scripts/main.coffee36
-rw-r--r--content_scripts/link_hints.coffee8
-rw-r--r--tests/dom_tests/dom_tests.coffee4
3 files changed, 32 insertions, 16 deletions
diff --git a/background_scripts/main.coffee b/background_scripts/main.coffee
index 829b0abb..cac35100 100644
--- a/background_scripts/main.coffee
+++ b/background_scripts/main.coffee
@@ -355,35 +355,45 @@ HintCoordinator =
# If there's no handler here, then the message is forwarded to all frames in the sender's tab.
@sendMessage request.messageType, tabId, request
+ # Post a link-hints message to a particular frame's port. We catch errors in case the frame has gone away.
+ postMessage: (tabId, frameId, messageType, port, request = {}) ->
+ try
+ port.postMessage extend request, {handler: "linkHintsMessage", messageType}
+ catch
+ @unregisterFrame tabId, frameId
+
+ # Post a link-hints message to all participating frames.
sendMessage: (messageType, tabId, request = {}) ->
- extend request, {handler: "linkHintsMessage", messageType}
for own frameId, port of @tabState[tabId].ports
- try
- port.postMessage request
- catch
- @unregisterFrame tabId, parseInt frameId
+ @postMessage tabId, parseInt(frameId), messageType, port, request
prepareToActivateMode: (tabId, originatingFrameId, {modeIndex}) ->
- @tabState[tabId] = {frameIds: frameIdsForTab[tabId][..], hintDescriptors: [], originatingFrameId, modeIndex}
+ @tabState[tabId] = {frameIds: frameIdsForTab[tabId][..], hintDescriptors: {}, originatingFrameId, modeIndex}
@tabState[tabId].ports = extend {}, portsForTab[tabId]
@sendMessage "getHintDescriptors", tabId, {modeIndex}
# Receive hint descriptors from all frames and activate link-hints mode when we have them all.
postHintDescriptors: (tabId, frameId, {hintDescriptors}) ->
if frameId in @tabState[tabId].frameIds
- @tabState[tabId].hintDescriptors.push hintDescriptors...
+ @tabState[tabId].hintDescriptors[frameId] = hintDescriptors
@tabState[tabId].frameIds = @tabState[tabId].frameIds.filter (fId) -> fId != frameId
if @tabState[tabId].frameIds.length == 0
- @sendMessage "activateMode", tabId,
- originatingFrameId: @tabState[tabId].originatingFrameId
- hintDescriptors: @tabState[tabId].hintDescriptors
- modeIndex: @tabState[tabId].modeIndex
+ for own frameId, port of @tabState[tabId].ports
+ if frameId of @tabState[tabId].hintDescriptors
+ hintDescriptors = extend {}, @tabState[tabId].hintDescriptors
+ # We do not send back the frame's own hint descriptors. This is faster (approx. speedup 3/2) for
+ # link-busy sites like reddit.
+ delete hintDescriptors[frameId]
+ @postMessage tabId, parseInt(frameId), "activateMode", port,
+ originatingFrameId: @tabState[tabId].originatingFrameId
+ hintDescriptors: hintDescriptors
+ modeIndex: @tabState[tabId].modeIndex
# If an unregistering frame is participating in link-hints mode, then we need to tidy up after it.
unregisterFrame: (tabId, frameId) ->
delete @tabState[tabId]?.ports?[frameId]
- # We fake "postHintDescriptors" for an unregistering frame, if necessary.
- @postHintDescriptors tabId, frameId, hintDescriptors: [] if @tabState[tabId]?.frameIds
+ # We fake "postHintDescriptors" for an unregistering frame.
+ @postHintDescriptors tabId, frameId, hintDescriptors: []
# Port handler mapping
portHandlers =
diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee
index 56cea78d..70c51eac 100644
--- a/content_scripts/link_hints.coffee
+++ b/content_scripts/link_hints.coffee
@@ -82,13 +82,17 @@ HintCoordinator =
DomUtils.documentReady => Settings.onLoaded =>
requireHref = availableModes[modeIndex] in [COPY_LINK_URL, OPEN_INCOGNITO]
@localHints = LocalHints.getLocalHints requireHref
- @sendMessage "postHintDescriptors", hintDescriptors:
- @localHints.map ({linkText}, localIndex) -> {frameId, localIndex, linkText}
+ @localHintDescriptors = @localHints.map ({linkText}, localIndex) -> {frameId, localIndex, linkText}
+ @sendMessage "postHintDescriptors", hintDescriptors: @localHintDescriptors
# We activate LinkHintsMode() in every frame and provide every frame with exactly the same hint descriptors.
# We also propagate the key state between frames. Therefore, the hint-selection process proceeds in lock
# step in every frame, and @linkHintsMode is in the same state in every frame.
activateMode: ({hintDescriptors, modeIndex, originatingFrameId}) ->
+ # We do not receive the frame's own hint descritors back from the background page. Instead, we merge them
+ # with the hint descriptors from other frames here.
+ [hintDescriptors[frameId], @localHintDescriptors] = [@localHintDescriptors, null]
+ hintDescriptors = [].concat (hintDescriptors[fId] for fId in (fId for own fId of hintDescriptors).sort())...
# Ensure that the document is ready and that the settings are loaded.
DomUtils.documentReady => Settings.onLoaded =>
@suppressKeyboardEvents.exit() if @suppressKeyboardEvents?.modeIsActive
diff --git a/tests/dom_tests/dom_tests.coffee b/tests/dom_tests/dom_tests.coffee
index 3977d046..76c09f13 100644
--- a/tests/dom_tests/dom_tests.coffee
+++ b/tests/dom_tests/dom_tests.coffee
@@ -64,7 +64,9 @@ getHintMarkers = ->
stubSettings = (key, value) -> stub Settings.cache, key, JSON.stringify value
HintCoordinator.sendMessage = (name, request = {}) -> HintCoordinator[name]? request; request
-activateLinkHintsMode = -> HintCoordinator.activateMode HintCoordinator.getHintDescriptors {modeIndex: 0}
+activateLinkHintsMode = ->
+ HintCoordinator.getHintDescriptors modeIndex: 0
+ HintCoordinator.activateMode hintDescriptors: {}, modeIndex: 0, originatingFrameId: frameId,
#
# Generate tests that are common to both default and filtered