adding examples
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
// Import helper functions from background-commands
|
||||
import { getFromContentScript, respondWith, respondWithError } from './background-commands.js';
|
||||
|
||||
// Check if URL is allowed for extension
|
||||
const isAllowedUrl = (url) => !!url && (url.startsWith('http://') || url.startsWith('https://'));
|
||||
|
||||
// Wait for content script to be ready
|
||||
async function waitForContentScriptReady(tabId, timeout = 5000) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const timer = setTimeout(() => {
|
||||
chrome.runtime.onMessage.removeListener(listener);
|
||||
reject(new Error('Timeout waiting for content script'));
|
||||
}, timeout);
|
||||
|
||||
const listener = (request, sender) => {
|
||||
if (request.type === 'contentScriptReady' && sender.tab?.id === tabId) {
|
||||
clearTimeout(timer);
|
||||
chrome.runtime.onMessage.removeListener(listener);
|
||||
resolve();
|
||||
}
|
||||
};
|
||||
|
||||
chrome.runtime.onMessage.addListener(listener);
|
||||
});
|
||||
}
|
||||
|
||||
// Execute navigation and wait for content script
|
||||
async function executeNavigation(tabId, navigationFn) {
|
||||
try {
|
||||
await navigationFn();
|
||||
await waitForContentScriptReady(tabId);
|
||||
return await respondWith(tabId, {});
|
||||
} catch (error) {
|
||||
return respondWithError(tabId, 'NAVIGATION_FAILED', error.message);
|
||||
}
|
||||
}
|
||||
|
||||
// Navigation commands
|
||||
export async function navigate({tabId}, { url }) {
|
||||
if (!isAllowedUrl(url)) {
|
||||
return respondWithError(tabId, 'NAVIGATION_BLOCKED', `Navigation to ${url} is not allowed`);
|
||||
}
|
||||
return executeNavigation(tabId, async () => getFromContentScript(tabId, '_navigate', { url }));
|
||||
}
|
||||
|
||||
export async function back({tabId}) {
|
||||
return executeNavigation(tabId, () => chrome.tabs.goBack(tabId));
|
||||
}
|
||||
|
||||
export async function forward({tabId}) {
|
||||
return executeNavigation(tabId, () => chrome.tabs.goForward(tabId));
|
||||
}
|
||||
|
||||
export async function close({tabId}) {
|
||||
try {
|
||||
await chrome.tabs.remove(tabId);
|
||||
return { success: true, closed: true };
|
||||
} catch (error) {
|
||||
return { success: false, error: { code: 'CLOSE_FAILED', message: error.message } };
|
||||
}
|
||||
}
|
||||
|
||||
export async function reload({tabId}) {
|
||||
return executeNavigation(tabId, () => chrome.tabs.reload(tabId));
|
||||
}
|
||||
|
||||
export async function show({tabId}) {
|
||||
try {
|
||||
// Get the tab to find its window ID
|
||||
const tab = await chrome.tabs.get(tabId);
|
||||
|
||||
// Bring the window to the front
|
||||
await chrome.windows.update(tab.windowId, { focused: true });
|
||||
|
||||
// Make the tab active in the window
|
||||
await chrome.tabs.update(tabId, { active: true });
|
||||
|
||||
return await respondWith(tabId, { shown: true });
|
||||
} catch (error) {
|
||||
return respondWithError(tabId, 'SHOW_FAILED', error.message);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user