diff options
| author | Jez Ng | 2012-08-04 18:46:31 -0700 |
|---|---|---|
| committer | Jez Ng | 2012-08-04 18:48:21 -0700 |
| commit | e8a3b0c1b156a3ac1bae7bfe16054aa4687468bb (patch) | |
| tree | e887e14a13de89b3b83ebe218d14ae029da0baf0 | |
| parent | d5086c5f781dfefac23d30a89256dd2e8ca22464 (diff) | |
| download | vimium-e8a3b0c1b156a3ac1bae7bfe16054aa4687468bb.tar.bz2 | |
Convert one-shot ports to requests. Closes #8 (!!)
| -rw-r--r-- | background_scripts/main.js | 41 | ||||
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 93 |
2 files changed, 58 insertions, 76 deletions
diff --git a/background_scripts/main.js b/background_scripts/main.js index d770bb56..41fb3441 100644 --- a/background_scripts/main.js +++ b/background_scripts/main.js @@ -16,13 +16,13 @@ var namedKeyRegex = /^(<(?:[amc]-.|(?:[amc]-)?[a-z0-9]{2,5})>)(.*)$/; // Port handler mapping var portHandlers = { keyDown: handleKeyDown, - getCurrentTabUrl: getCurrentTabUrl, settings: handleSettings, filterCompleter: filterCompleter }; var sendRequestHandlers = { getCompletionKeys: getCompletionKeysRequest, + getCurrentTabUrl: getCurrentTabUrl, openUrlInNewTab: openUrlInNewTab, openUrlInCurrentTab: openUrlInCurrentTab, openOptionsPageInNewTab: openOptionsPageInNewTab, @@ -84,15 +84,16 @@ chrome.extension.onRequest.addListener(function (request, sender, sendResponse) var senderTabId = sender.tab ? sender.tab.id : null; if (sendRequestHandlers[request.handler]) sendResponse(sendRequestHandlers[request.handler](request, sender)); + // Ensure the sendResponse callback is freed. + return false; }); /* * Used by the content scripts to get their full URL. This is needed for URLs like "view-source:http:// .." * because window.location doesn't know anything about the Chrome-specific "view-source:". */ -function getCurrentTabUrl(args, port) { - var returnPort = chrome.tabs.connect(port.sender.tab.id, { name: "returnCurrentTabUrl" }); - returnPort.postMessage({ url: port.sender.tab.url }); +function getCurrentTabUrl(request, sender) { + return sender.tab.url; } /* @@ -134,7 +135,7 @@ function saveHelpDialogSettings(request) { function showHelp(callback, frameId) { chrome.tabs.getSelected(null, function(tab) { chrome.tabs.sendRequest(tab.id, - { name: "showHelpDialog", dialogHtml: helpDialogHtml(), frameId:frameId }); + { name: "toggleHelpDialog", dialogHtml: helpDialogHtml(), frameId:frameId }); }); } @@ -366,8 +367,7 @@ function updateActiveState(tabId) { // Default to disabled state in case we can't connect to Vimium, primarily for the "New Tab" page. // TODO(philc): Re-enable once we've restyled the browser action icon. // chrome.browserAction.setIcon({ path: disabledIcon }); - var returnPort = chrome.tabs.connect(tabId, { name: "getActiveState" }); - returnPort.onMessage.addListener(function(response) { + chrome.tabs.sendRequest(tabId, { name: "getActiveState" }, function(response) { var isCurrentlyEnabled = response.enabled; var shouldBeEnabled = isEnabledForUrl({url: tab.url}).isEnabledForUrl; @@ -376,13 +376,12 @@ function updateActiveState(tabId) { chrome.browserAction.setIcon({ path: enabledIcon }); } else { chrome.browserAction.setIcon({ path: disabledIcon }); - chrome.tabs.connect(tabId, { name: "disableVimium" }).postMessage(); + chrome.tabs.sendRequest(tabId, { name: "disableVimium" }); } } else { chrome.browserAction.setIcon({ path: disabledIcon }); } }); - returnPort.postMessage(); }); } @@ -462,10 +461,12 @@ function restoreTab(callback) { // wait until that's over before we can call setScrollPosition. chrome.tabs.create({ url: tabQueueEntry.url, index: tabQueueEntry.positionIndex }, function(tab) { tabLoadedHandlers[tab.id] = function() { - var scrollPort = chrome.tabs.connect(tab.id, {name: "setScrollPosition"}); - scrollPort.postMessage({ scrollX: tabQueueEntry.scrollX, scrollY: tabQueueEntry.scrollY }); + var scrollPort = chrome.tabs.sendRequest(tab.id, { + name: "setScrollPosition", + scrollX: tabQueueEntry.scrollX, + scrollY: tabQueueEntry.scrollY + }); }; - callback(); }); } @@ -584,14 +585,14 @@ function checkKeyQueue(keysToCheck, tabId, frameId) { registryEntry = Commands.keyToCommandRegistry[command]; if (!registryEntry.isBackgroundCommand) { - var port = chrome.tabs.connect(tabId, { name: "executePageCommand" }); - port.postMessage({ command: registryEntry.command, - frameId: frameId, - count: count, - passCountToFunction: registryEntry.passCountToFunction, - completionKeys: generateCompletionKeys("") - }); - + chrome.tabs.sendRequest(tabId, { + name: "executePageCommand", + command: registryEntry.command, + frameId: frameId, + count: count, + passCountToFunction: registryEntry.passCountToFunction, + completionKeys: generateCompletionKeys("") + }); refreshedCompletionKeys = true; } else { if(registryEntry.passCountToFunction){ diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index 8ba59b5c..0fc8d518 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -4,8 +4,6 @@ # background page that we're in domReady and ready to accept normal commands by connectiong to a port named # "domReady". # -getCurrentUrlHandlers = [] # function(url) - insertModeLock = null findMode = false findModeQuery = { rawQuery: "" } @@ -104,53 +102,23 @@ initializePreDomReady = -> # Send the key to the key handler in the background page. keyPort = chrome.extension.connect({ name: "keyDown" }) - chrome.extension.onRequest.addListener (request, sender, sendResponse) -> - if (request.name == "hideUpgradeNotification") - HUD.hideUpgradeNotification() - else if (request.name == "showUpgradeNotification" && isEnabledForUrl) - HUD.showUpgradeNotification(request.version) - else if (request.name == "showHelpDialog") - if (isShowingHelpDialog) - hideHelpDialog() - else - showHelpDialog(request.dialogHtml, request.frameId) - else if (request.name == "focusFrame") - if (frameId == request.frameId) - focusThisFrame(request.highlight) - else if (request.name == "refreshCompletionKeys") - refreshCompletionKeys(request) - else if (request.name == "getScrollPosition") - sendResponse - scrollX: window.scrollX - scrollY: window.scrollY + requestHandlers = + hideUpgradeNotification: -> HUD.hideUpgradeNotification() + showUpgradeNotification: -> HUD.showUpgradeNotification() + toggleHelpDialog: (request) -> toggleHelpDialog(request.dialogHtml, request.frameId) + focusFrame: (request) -> if (frameId == request.frameId) then focusThisFrame(request.highlight) + refreshCompletionKeys: refreshCompletionKeys + getScrollPosition: -> scrollX: window.scrollX, scrollY: window.scrollY + setScrollPosition: (request) -> setScrollPosition request.scrollX, request.scrollY + executePageCommand: executePageCommand + getActiveState: -> { enabled: isEnabledForUrl } + disableVimium: disableVimium + chrome.extension.onRequest.addListener (request, sender, sendResponse) -> + sendResponse requestHandlers[request.name](request, sender) # Ensure the sendResponse callback is freed. false - chrome.extension.onConnect.addListener (port, name) -> - if (port.name == "executePageCommand") - port.onMessage.addListener (args) -> - if (frameId == args.frameId) - if (args.passCountToFunction) - Utils.invokeCommandString(args.command, [args.count]) - else - Utils.invokeCommandString(args.command) for i in [0...args.count] - - refreshCompletionKeys(args) - else if (port.name == "setScrollPosition") - port.onMessage.addListener (args) -> - if (args.scrollX > 0 || args.scrollY > 0) - DomUtils.documentReady(-> window.scrollBy(args.scrollX, args.scrollY)) - else if (port.name == "returnCurrentTabUrl") - port.onMessage.addListener (args) -> - getCurrentUrlHandlers.pop()(args.url) if (getCurrentUrlHandlers.length > 0) - else if (port.name == "refreshCompletionKeys") - port.onMessage.addListener (args) -> refreshCompletionKeys(args.completionKeys) - else if (port.name == "getActiveState") - port.onMessage.addListener (args) -> port.postMessage({ enabled: isEnabledForUrl }) - else if (port.name == "disableVimium") - port.onMessage.addListener (args) -> disableVimium() - # # This is called once the background page has told us that Vimium should be enabled for the current URL. # @@ -216,6 +184,16 @@ enterInsertModeIfElementIsFocused = -> onDOMActivate = (event) -> activatedElement = event.target +executePageCommand = (request) -> + return unless frameId == request.frameId + + if (request.passCountToFunction) + Utils.invokeCommandString(request.command, [request.count]) + else + Utils.invokeCommandString(request.command) for i in [0...request.count] + + refreshCompletionKeys(request) + # # activatedElement is different from document.activeElement -- the latter seems to be reserved mostly for # input elements. This mechanism allows us to decide whether to scroll a div or to scroll the whole document. @@ -260,6 +238,10 @@ scrollActivatedElementBy = (direction, amount) -> if (rect.bottom < 0 || rect.top > window.innerHeight || rect.right < 0 || rect.left > window.innerWidth) activatedElement = lastElement +setScrollPosition = (scrollX, scrollY) -> + if (scrollX > 0 || scrollY > 0) + DomUtils.documentReady(-> window.scrollBy(scrollX, scrollY)) + # # Called from the backend in order to change frame focus. # @@ -302,26 +284,19 @@ extend window, window.location.href = urlsplit.join('/') toggleViewSource: -> - toggleViewSourceCallback = (url) -> + chrome.extension.sendRequest { handler: "getCurrentTabUrl" }, (url) -> if (url.substr(0, 12) == "view-source:") url = url.substr(12, url.length - 12) else url = "view-source:" + url chrome.extension.sendRequest({ handler: "openUrlInNewTab", url: url, selected: true }) - getCurrentUrlHandlers.push(toggleViewSourceCallback) - getCurrentUrlPort = chrome.extension.connect({ name: "getCurrentTabUrl" }) - getCurrentUrlPort.postMessage({}) copyCurrentUrl: -> # TODO(ilya): When the following bug is fixed, revisit this approach of sending back to the background page # to copy. # http://code.google.com/p/chromium/issues/detail?id=55188 - # getCurrentUrlHandlers.push(function (url) { Clipboard.copy(url); }) - getCurrentUrlHandlers.push((url) -> chrome.extension.sendRequest({ handler: "copyToClipboard", data: url })) - - # TODO(ilya): Convert to sendRequest. - getCurrentUrlPort = chrome.extension.connect({ name: "getCurrentTabUrl" }) - getCurrentUrlPort.postMessage({}) + chrome.extension.sendRequest { handler: "getCurrentTabUrl" }, (url) -> + chrome.extension.sendRequest { handler: "copyToClipboard", data: url } HUD.showForDuration("Yanked URL", 1000) @@ -863,7 +838,7 @@ exitFindMode = -> findMode = false HUD.hide() -window.showHelpDialog = (html, fid) -> +showHelpDialog = (html, fid) -> return if (isShowingHelpDialog || !document.body || fid != frameId) isShowingHelpDialog = true container = document.createElement("div") @@ -890,6 +865,12 @@ hideHelpDialog = (clickEvent) -> if (clickEvent) clickEvent.preventDefault() +toggleHelpDialog = (html, fid) -> + if (isShowingHelpDialog) + hideHelpDialog() + else + showHelpDialog(html, fid) + # # A heads-up-display (HUD) for showing Vimium page operations. # Note: you cannot interact with the HUD until document.body is available. |
