Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 104 additions & 0 deletions submissions/Open all this Tabs/background-firefox.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
// Background script for Firefox
// Handle extension installation
browser.runtime.onInstalled.addListener((details) => {
console.log('Multi Tab Opener extension installed/updated');

if (details.reason === 'install') {
// Set default custom URLs on first install
const defaultCustomUrls = [];
browser.storage.local.set({ customUrls: defaultCustomUrls });
}
});

// Handle messages from popup or content scripts
browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.action === 'openTabs') {
openMultipleTabs(request.urls).then(result => {
sendResponse({ success: true, count: result });
}).catch(error => {
console.error('Error opening tabs:', error);
sendResponse({ success: false, error: error.message });
});
return true; // Will respond asynchronously
}
});

// Function to open multiple tabs
async function openMultipleTabs(urls) {
if (!urls || !Array.isArray(urls) || urls.length === 0) {
throw new Error('No valid URLs provided');
}

let successCount = 0;
const errors = [];

for (const url of urls) {
try {
// Validate URL
new URL(url); // This will throw if URL is invalid

// Create new tab
await browser.tabs.create({
url: url,
active: false // Don't make the new tab active
});

successCount++;
} catch (error) {
console.error(`Failed to open tab for URL: ${url}`, error);
errors.push({ url, error: error.message });
}
}

if (errors.length > 0) {
console.warn('Some tabs failed to open:', errors);
}

return successCount;
}

// Handle browser action click (fallback)
browser.browserAction.onClicked.addListener(async (tab) => {
console.log('Browser action clicked, opening default tabs');

const defaultUrls = [
'https://www.google.com',
'https://www.github.com',
'https://www.stackoverflow.com',
'https://www.youtube.com',
'https://www.wikipedia.org'
];

try {
await openMultipleTabs(defaultUrls);
} catch (error) {
console.error('Error in fallback tab opening:', error);
}
});

// Handle context menu
browser.runtime.onInstalled.addListener(() => {
browser.contextMenus.create({
id: 'openMultipleTabs',
title: 'Open Multiple Tabs',
contexts: ['page', 'selection']
});
});

browser.contextMenus.onClicked.addListener(async (info, tab) => {
if (info.menuItemId === 'openMultipleTabs') {
const defaultUrls = [
'https://www.google.com',
'https://www.github.com',
'https://www.stackoverflow.com',
'https://www.youtube.com',
'https://www.wikipedia.org'
];

try {
await openMultipleTabs(defaultUrls);
} catch (error) {
console.error('Error opening tabs from context menu:', error);
}
}
});
113 changes: 113 additions & 0 deletions submissions/Open all this Tabs/background.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
// Background script for Chrome Extension
// Cross-browser compatibility
const isFirefox = typeof browser !== 'undefined';
const browserAPI = isFirefox ? browser : chrome;

// Handle extension installation
browserAPI.runtime.onInstalled.addListener((details) => {
console.log('Multi Tab Opener extension installed/updated');

if (details.reason === 'install') {
// Set default custom URLs on first install
const defaultCustomUrls = [];
browserAPI.storage.local.set({ customUrls: defaultCustomUrls });
}
});

// Handle messages from popup or content scripts
browserAPI.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.action === 'openTabs') {
openMultipleTabs(request.urls).then(result => {
sendResponse({ success: true, count: result });
}).catch(error => {
console.error('Error opening tabs:', error);
sendResponse({ success: false, error: error.message });
});
return true; // Will respond asynchronously
}
});

// Function to open multiple tabs
async function openMultipleTabs(urls) {
if (!urls || !Array.isArray(urls) || urls.length === 0) {
throw new Error('No valid URLs provided');
}

let successCount = 0;
const errors = [];

for (const url of urls) {
try {
// Validate URL
new URL(url); // This will throw if URL is invalid

// Create new tab
await browserAPI.tabs.create({
url: url,
active: false // Don't make the new tab active
});

successCount++;
} catch (error) {
console.error(`Failed to open tab for URL: ${url}`, error);
errors.push({ url, error: error.message });
}
}

if (errors.length > 0) {
console.warn('Some tabs failed to open:', errors);
}

return successCount;
}

// Handle browser action click (fallback for browsers that don't support popups)
if (browserAPI.action && browserAPI.action.onClicked) {
browserAPI.action.onClicked.addListener(async (tab) => {
// This is a fallback in case popup fails to load
console.log('Browser action clicked, opening default tabs');

const defaultUrls = [
'https://www.google.com',
'https://www.github.com',
'https://www.stackoverflow.com',
'https://www.youtube.com',
'https://www.wikipedia.org'
];

try {
await openMultipleTabs(defaultUrls);
} catch (error) {
console.error('Error in fallback tab opening:', error);
}
});
}

// Handle context menu (optional feature)
if (browserAPI.contextMenus) {
browserAPI.runtime.onInstalled.addListener(() => {
browserAPI.contextMenus.create({
id: 'openMultipleTabs',
title: 'Open Multiple Tabs',
contexts: ['page', 'selection']
});
});

browserAPI.contextMenus.onClicked.addListener(async (info, tab) => {
if (info.menuItemId === 'openMultipleTabs') {
const defaultUrls = [
'https://www.google.com',
'https://www.github.com',
'https://www.stackoverflow.com',
'https://www.youtube.com',
'https://www.wikipedia.org'
];

try {
await openMultipleTabs(defaultUrls);
} catch (error) {
console.error('Error opening tabs from context menu:', error);
}
}
});
}
1 change: 1 addition & 0 deletions submissions/Open all this Tabs/icons/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Open all this Tabs icons
30 changes: 30 additions & 0 deletions submissions/Open all this Tabs/manifest-firefox.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"manifest_version": 2,
"name": "Multi Tab Opener",
"version": "1.0",
"description": "Open multiple tabs with one click",
"permissions": [
"tabs",
"activeTab",
"storage"
],
"browser_action": {
"default_popup": "popup.html",
"default_title": "Open Multiple Tabs"
},
"icons": {
"16": "icon16.png",
"48": "icon48.png",
"128": "icon128.png"
},
"background": {
"scripts": ["background-firefox.js"],
"persistent": false
},
"browser_specific_settings": {
"gecko": {
"id": "multi-tab-opener@example.com",
"strict_min_version": "57.0"
}
}
}
27 changes: 27 additions & 0 deletions submissions/Open all this Tabs/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"manifest_version": 3,
"name": "Multi Tab Opener",
"version": "1.0",
"description": "Open multiple tabs with one click",
"permissions": [
"tabs",
"activeTab"
],
"action": {
"default_popup": "popup.html",
"default_title": "Open Multiple Tabs"
},
"icons": {
"16": "icon16.png",
"48": "icon48.png",
"128": "icon128.png"
},
"background": {
"service_worker": "background.js"
},
"browser_specific_settings": {
"gecko": {
"id": "multi-tab-opener@example.com"
}
}
}
Loading