From a1d01c8bcb3f1d3a43e7e9a82c2730735506bb3d Mon Sep 17 00:00:00 2001 From: Anthonin Date: Fri, 14 Feb 2020 13:24:51 +0100 Subject: [PATCH 1/3] Improve list command performance. This is done by initally storing all tabs titles/urls in double entries arrays (matching windows/tabs indexes) instead of requesting the values in a double for loop. --- chrome.js | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/chrome.js b/chrome.js index 3431054..ee77384 100755 --- a/chrome.js +++ b/chrome.js @@ -97,27 +97,28 @@ function chromeControl(argv) { // List all open tabs function list() { // Iterate all tabs in all windows - let urlToTitle = {} - chrome.windows().forEach((window, winIdx) => { - window.tabs().forEach((tab, tabIdx) => { - urlToTitle[tab.url()] = { - 'title': tab.title() || 'No Title', - 'url': tab.url(), + // Double entries arrays matching windows/tabs indexes (Using this improves a lot the performances) + let allTabsTitle = chrome.windows.tabs.title() + let allTabsUrls = chrome.windows.tabs.url() + + var titleToUrl = {} + for (var winIdx = 0; winIdx < allTabsTitle.length; winIdx++) { + for (var tabIdx = 0; tabIdx < allTabsTitle[winIdx].length; tabIdx ++) { + let title = allTabsTitle[winIdx][tabIdx] + let url = allTabsUrls[winIdx][tabIdx] + + titleToUrl[title] = { + 'title': title || 'No Title', + 'url': url, 'winIdx': winIdx, 'tabIdx': tabIdx, // Alfred specific properties 'arg': `${winIdx},${tabIdx}`, - 'subtitle': tab.url(), + 'subtitle': url, } - }) - }) - - // Create a title to url map - let titleToUrl = {} - Object.keys(urlToTitle).forEach(url => { - titleToUrl[urlToTitle[url].title] = urlToTitle[url] - }) + } + } // Generate output out = { 'items': [] } From 6520d8e0bf94e5729aca3768d3b047ea852003a9 Mon Sep 17 00:00:00 2001 From: Yogesh Patel Date: Mon, 3 Aug 2020 13:06:01 -0500 Subject: [PATCH 2/3] merged add copy functionality and quicker list search --- chrome.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/chrome.js b/chrome.js index ee77384..0b1de48 100755 --- a/chrome.js +++ b/chrome.js @@ -83,6 +83,10 @@ function chromeControl(argv) { if (argv.length !== 2) { usage() } const arg = argv[1] focus(arg) + } else if (cmd === 'copy') { + if (argv.length !== 2) { usage() } + const arg = argv[1] + copy(arg) } else { usage() } @@ -183,6 +187,22 @@ function focus(arg) { chrome.activate() } +// Focus on a specific tab +function copy(arg) { + let { winIdx, tabIdx } = parseWinTabIdx(arg) + let urlToTitle = {} + let selectedTab = tabIdx; + + chrome.windows().forEach((window, winIdx) => { + window.tabs().forEach((tab, tabIdx) => { + if (tabIdx === selectedTab) { + urlToTitle = tab.url(); + } + }) + }) + println(urlToTitle) +} + // Close duplicate tabs function dedup() { let urls = {} From fadbc15ebd7ccfb4a0775010297e7bde66d329c1 Mon Sep 17 00:00:00 2001 From: Yogesh Patel Date: Mon, 3 Aug 2020 13:14:33 -0500 Subject: [PATCH 3/3] updated alfred integration --- .../Alfred/Chrome Control.alfredworkflow | Bin 35856 -> 40228 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/integrations/Alfred/Chrome Control.alfredworkflow b/integrations/Alfred/Chrome Control.alfredworkflow index dc2f5834e80a160597f53f6742e515f40c156ed2..1b3ee672b8754d038a70f4bec3aa4ac70273bc84 100644 GIT binary patch delta 9796 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 b{{Zz$azMC$27v>>Ap!3Hj)Rx>&-MQRFkYJj delta 5371 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