diff --git a/submissions/Open all this Tabs/background-firefox.js b/submissions/Open all this Tabs/background-firefox.js new file mode 100644 index 00000000..8e4187ec --- /dev/null +++ b/submissions/Open all this Tabs/background-firefox.js @@ -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); + } + } +}); diff --git a/submissions/Open all this Tabs/background.js b/submissions/Open all this Tabs/background.js new file mode 100644 index 00000000..6d208d47 --- /dev/null +++ b/submissions/Open all this Tabs/background.js @@ -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); + } + } + }); +} diff --git a/submissions/Open all this Tabs/icons/readme.md b/submissions/Open all this Tabs/icons/readme.md new file mode 100644 index 00000000..ef625f89 --- /dev/null +++ b/submissions/Open all this Tabs/icons/readme.md @@ -0,0 +1 @@ +Open all this Tabs icons diff --git a/submissions/Open all this Tabs/manifest-firefox.json b/submissions/Open all this Tabs/manifest-firefox.json new file mode 100644 index 00000000..468fd9c0 --- /dev/null +++ b/submissions/Open all this Tabs/manifest-firefox.json @@ -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" + } + } +} diff --git a/submissions/Open all this Tabs/manifest.json b/submissions/Open all this Tabs/manifest.json new file mode 100644 index 00000000..1c5d8aca --- /dev/null +++ b/submissions/Open all this Tabs/manifest.json @@ -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" + } + } +} diff --git a/submissions/Open all this Tabs/popup.html b/submissions/Open all this Tabs/popup.html new file mode 100644 index 00000000..5bcf4e4a --- /dev/null +++ b/submissions/Open all this Tabs/popup.html @@ -0,0 +1,142 @@ + + +
+ + + + +