Skip to content

Commit

Permalink
feat: remove Vivaldi support
Browse files Browse the repository at this point in the history
Vivaldi removed the grouping support for their tabs 👎
  • Loading branch information
borsini committed May 5, 2024
1 parent 17c407f commit 2d14ae2
Show file tree
Hide file tree
Showing 6 changed files with 16 additions and 98 deletions.
15 changes: 6 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,20 @@ It needs regular manual intervention to keep a clean browser. That is why I crea

## Compatibility

Otto Tabs works with all chromium based browsers ([Chrome](https://www.google.fr/chrome), [Opera](https://www.opera.com), [Vivaldi](https://vivaldi.com)) that support extensions.
Otto Tabs works with all chromium based browsers that implement the [chrome.tabs api](https://developer.chrome.com/docs/extensions/reference/api/tabs).

Tested on Chrome 124.0.6367.119, Opera 109.0.5097.68, Brave 1.65.126

## Features

Those feature can be toggled on and off. By default the first two are enabled.

### Group/stack tabs automatically

Tabs from same domain are grouped next to each other or stacked (Vivaldi).
Tabs from same domain are grouped next to each other.

Behavior in Chrome
![](pictures/grouped.gif)


Behavior in Vivaldi
![](pictures/stacked.gif)

### Remove duplicate tabs

Tabs with the same url are closed. Only last open tab is kept.
Expand All @@ -48,6 +45,6 @@ Feel free to fill a ticket [here](https://github.com/Benlenem/chrome-otto-tabs/i
* Download or clone the project
* Using a terminal go to the project root folder
* Type `yarn archive`. This will execute the unit tests and create a `build` folder. This folder contains all the extension files.
* Go to either vivaldi://extensions/ or chrome://extensions/ according to your browser
* Go to either [chrome://extensions](chrome://extensions), [opera://extensions](opera://extensions) or [brave://extensions](brave://extensions) according to your browser
* Install the extension as unpacked by selecting the `build` folder

dz
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@
"@types/node": "Peer dependency of ts-node"
},
"dependencies": {
"@types/chrome": "^0.0.242"
"@types/chrome": "^0.0.267"
}
}
Binary file removed pictures/stacked.gif
Binary file not shown.
81 changes: 5 additions & 76 deletions src/tabs_helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,33 +15,13 @@ export interface RulesConfig {

export type ChromeTab = chrome.tabs.Tab

interface VivaldiTab extends ChromeTab {
readonly vivExtData: string;
}


interface VivaldiUpdateProperties extends chrome.tabs.UpdateProperties {
vivExtData?: string;
}

export type RemovePromise = (tabId: number) => Promise<any>
export type UpdatePromise = (tabId: number, data: chrome.tabs.UpdateProperties | VivaldiUpdateProperties) => Promise<any>
export type UpdatePromise = (tabId: number, data: chrome.tabs.UpdateProperties) => Promise<any>
export type GroupPromise = (options: chrome.tabs.GroupOptions) => Promise<any>
export type QueryPromise = (query: chrome.tabs.QueryInfo) => Promise<ChromeTab[]>
export type RegroupTabsPromise = (tabs: ChromeTab[]) => Promise<ChromeTab[]>


const isVivaldiTab = (object: any): object is VivaldiTab => {
return object && 'vivExtData' in object;
};

function uuidv4(): string {
return (""+1e7+-1e3+-4e3+-8e3+-1e11)
.replace(/[018]/g, c => (c as any ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> (c as any) / 4)
.toString(16)
)
}

const promiseSerial = (funcs : Array<() => Promise<any>>) =>
funcs.reduce((promise, func) =>
promise.then(result => func().then(Array.prototype.concat.bind(result))),
Expand All @@ -56,7 +36,7 @@ export const chromeTabsMovePromise = (id: number, index: number): Promise<Chrome
})
);

const chromeTabsUpdatePromise: UpdatePromise = (tabId: number, data: chrome.tabs.UpdateProperties | VivaldiUpdateProperties): Promise<any> => (
const chromeTabsUpdatePromise: UpdatePromise = (tabId: number, data: chrome.tabs.UpdateProperties): Promise<any> => (
new Promise(function(resolve, reject) {
console.log("updating tab", tabId, data);
chrome.tabs.update(tabId, data, (t) => resolve([]));
Expand Down Expand Up @@ -97,7 +77,6 @@ export const applyRulesForTab = (tab: ChromeTab, config: RulesConfig) => {
chromeTabsQueryPromise,
regroupTabsPromise(chromeTabsMovePromise),
groupChrome(),
groupVivaldi(chromeTabsUpdatePromise, uuidv4),
),
]).catch(err => console.log(err))
}
Expand All @@ -118,12 +97,6 @@ export const regroupTabsPromise = (chromeTabsMovePromise: (id: number, index: nu
.then( () => Promise.resolve(tabs))
}


const groupVivaldi = (updatePromise: UpdatePromise, getUUID: () => string): GroupVivaldiTab =>
(tabs: VivaldiTab[]) => {
return groupVivaldiTabsPromise(tabs, updatePromise, uuidv4)
}

const groupChrome = (): GroupChromeTab =>
(tabs: ChromeTab[]) => {
return groupChromeTabsPromise(tabs)
Expand All @@ -140,12 +113,12 @@ const getQueryToGroup = (url: URL, config: RulesConfig) => {
}

export const moveSameUrlHost = (
tab: ChromeTab | VivaldiTab,
tab: ChromeTab,
config: RulesConfig,
queryPromise: QueryPromise,
regroupTabsPromise: RegroupTabsPromise,
groupChromeTabsPromise: GroupChromeTab,
groupVivaldiTabsPromise: GroupVivaldiTab) => (
) => (
new Promise(function(resolve, reject) {
if(!config.group.isActivated || !tab.url) {
resolve([]);
Expand All @@ -157,13 +130,7 @@ export const moveSameUrlHost = (
const hostQuery = getQueryToGroup(new URL(tab.url), config);
queryPromise({url: hostQuery, currentWindow: true, pinned: false})
.then(regroupTabsPromise)
.then( tabs => {
if(isVivaldiTab(tab)) { //Vivaldi stacking feature is supported
return groupVivaldiTabsPromise(tabs as VivaldiTab[])
} else {
return groupChromeTabsPromise(tabs)
}
})
.then( tabs => groupChromeTabsPromise(tabs))
.then( () => resolve([]))
})
);
Expand Down Expand Up @@ -194,44 +161,6 @@ export const groupChromeTabsPromise = (tabs: ChromeTab[]) => {
})
}

export type GroupVivaldiTab = (tabs: VivaldiTab[]) => Promise<any>

export const groupVivaldiTabsPromise = (tabs: VivaldiTab[], updatePromise: UpdatePromise, getUUID: () => string ) => {
console.log("group vivaldi tabs...")

const tabsToExtData: { [k: number]: { group: string | null} } = tabs
.filter(t => t.id !== undefined)
.reduce( (old, curr) => {
var data = {}
try { data = JSON.parse(curr.vivExtData) } catch(e) {}

return {
...old,
[curr.id!]: data
}
}, {}
)

var groupIdToUse : string | null = null
if(tabs.length > 1) {
const existingGroupId = Object.values(tabsToExtData)
.map(d => d.group)
.find(g => g !== undefined);
groupIdToUse = existingGroupId ? existingGroupId : getUUID()
console.log("group id to use", groupIdToUse)
} else {
console.log("only one tab, remove its group id")
}

const updatePromises = Object.keys(tabsToExtData).map(t => parseInt(t)).map((tabId => {
const newExtData = tabsToExtData[tabId]
newExtData.group = groupIdToUse

return () => updatePromise(tabId, { vivExtData : JSON.stringify(newExtData) } );
}))
return promiseSerial(updatePromises)
}

export const removeDuplicates = (
tab: ChromeTab,
config: RulesConfig,
Expand Down
8 changes: 0 additions & 8 deletions test/tabs_helpers.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import {
removeDuplicates,
moveSameUrlHost,
RegroupTabsPromise,
GroupVivaldiTab,
regroupTabsPromise,
ChromeTab,
GroupChromeTab
Expand Down Expand Up @@ -449,15 +448,10 @@ describe('moveSameUrlHost()', function () {

const moveSpy = chai.spy(regroupTabsPromise)

const groupVivaldiTabs: GroupVivaldiTab = (tabs: ChromeTab[]) => {
return Promise.resolve([])
}

const groupChromeTabs: GroupChromeTab = (tabs: ChromeTab[]) => {
return Promise.resolve([])
}

const vivaldiSpy = chai.spy(groupVivaldiTabs)
const chromeSpy = chai.spy(groupChromeTabs)

return moveSameUrlHost(
Expand All @@ -466,11 +460,9 @@ describe('moveSameUrlHost()', function () {
queryPromise,
moveSpy,
chromeSpy,
vivaldiSpy,

).then(() => {
expect(moveSpy).not.to.have.been.called()
expect(vivaldiSpy).not.to.have.been.called()
})

})
Expand Down
8 changes: 4 additions & 4 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,10 @@
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b"
integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==

"@types/chrome@^0.0.242":
version "0.0.242"
resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.242.tgz#bb1199fb885ff6d3e8d30dd81fe97e23bd9d6ecd"
integrity sha512-SeMXBSfcAGX9ezTz7Pro7n/AiNdIH3cetkdbM+Kfg3zD24jmbnm0IAEIxzx8ccqrnJenLCfD7fR+4WIYAbeQHw==
"@types/chrome@^0.0.267":
version "0.0.267"
resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.267.tgz#eefb7d2085993437d8109eb495431dfc0e3dbda1"
integrity sha512-vnCWPpYjazSPRMNmybRH+0q4f738F+Pbbls4ZPFsPr9/4TTNJyK1OLZDpSnghnEWb4stfmIUtq/GegnlfD4sPA==
dependencies:
"@types/filesystem" "*"
"@types/har-format" "*"
Expand Down

0 comments on commit 2d14ae2

Please sign in to comment.