Skip to content

Commit 78463b3

Browse files
implement message handling and browser interaction services along with vite build
1 parent bd877fa commit 78463b3

File tree

12 files changed

+865
-251
lines changed

12 files changed

+865
-251
lines changed

package-lock.json

Lines changed: 551 additions & 169 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22
"name": "auto-browse-agent-extension",
33
"version": "0.0.1",
44
"description": "",
5-
"main": "index.js",
5+
"type": "module",
66
"scripts": {
77
"clean": "rm -rf dist",
8-
"build": "rollup -c && cp manifest.json dist/"
8+
"build": "npm run clean && vite build",
9+
"dev": "vite build --watch"
910
},
1011
"keywords": [],
1112
"author": "",
1213
"license": "MIT",
1314
"devDependencies": {
14-
"@rollup/plugin-node-resolve": "^15.2.3",
15-
"rollup": "^4.22.4"
15+
"vite": "^5.1.0"
1616
},
1717
"dependencies": {
1818
"puppeteer-core": "^24.3.0"
1919
}
20-
}
20+
}

src/actions/actionTypes.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// Action type constants for message communication
2+
export const TEST_CONNECTION = "TEST_CONNECTION";
3+
export const HIGHLIGHT_LINKS = "HIGHLIGHT_LINKS";

src/actions/messageHandler.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { TEST_CONNECTION, HIGHLIGHT_LINKS } from "./actionTypes.js";
2+
import { browserService } from "../services/browserService.js";
3+
import { highlightService } from "../services/highlightService.js";
4+
import { handleError } from "../utils/browserUtils.js";
5+
6+
/**
7+
* Handle incoming messages from the extension
8+
* @param {Object} request - The message request
9+
* @returns {Promise<string>} Response message
10+
*/
11+
export const handleMessage = async (request) => {
12+
try {
13+
switch (request.action) {
14+
case TEST_CONNECTION:
15+
return await browserService.getPageTitle();
16+
case HIGHLIGHT_LINKS:
17+
return await highlightService.highlightLinks();
18+
default:
19+
throw new Error(`Unknown action: ${request.action}`);
20+
}
21+
} catch (error) {
22+
return handleError(error);
23+
}
24+
};

src/background/background.js

Lines changed: 5 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,9 @@
1-
import {
2-
connect,
3-
ExtensionTransport
4-
} from "puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser.js";
5-
6-
globalThis.testConnect = async (url) => {
7-
// Get the current active tab instead of creating a new one
8-
const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
9-
10-
const browser = await connect({
11-
transport: await ExtensionTransport.connectTab(tab.id)
12-
});
13-
14-
const [page] = await browser.pages();
15-
const title = await page.title();
16-
17-
await browser.disconnect();
18-
return title;
19-
};
20-
21-
globalThis.highlightLinks = async () => {
22-
const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
23-
24-
const browser = await connect({
25-
transport: await ExtensionTransport.connectTab(tab.id)
26-
});
27-
28-
const [page] = await browser.pages();
29-
30-
await page.evaluate(() => {
31-
const links = document.querySelectorAll("a");
32-
links.forEach((link) => {
33-
link.style.backgroundColor = "yellow";
34-
link.style.border = "2px solid red";
35-
});
36-
return `Highlighted ${links.length} links`;
37-
});
38-
39-
await browser.disconnect();
40-
return `Highlighted all links on the page`;
41-
};
1+
import { handleMessage } from "../actions/messageHandler.js";
422

433
// Add message listener
444
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
45-
if (request.action === "testConnection") {
46-
globalThis
47-
.testConnect(request.url)
48-
.then((title) => sendResponse(`Current page title: ${title}`))
49-
.catch((error) => sendResponse(`Error: ${error.message}`));
50-
return true; // Will respond asynchronously
51-
} else if (request.action === "highlightLinks") {
52-
globalThis
53-
.highlightLinks()
54-
.then(sendResponse)
55-
.catch((error) => sendResponse(`Error: ${error.message}`));
56-
return true;
57-
}
5+
handleMessage(request)
6+
.then(sendResponse)
7+
.catch((error) => sendResponse(`Error: ${error.message}`));
8+
return true; // Will respond asynchronously
589
});

src/popup/popup.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
<button id="testButton">Get Current Page Title</button>
3232
<button id="highlightButton">Highlight All Links</button>
3333
<div id="result"></div>
34-
<script src="popup.js"></script>
34+
<script src="popup.js" type="module"></script>
3535
</body>
3636

3737
</html>

src/popup/popup.js

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,41 @@
1-
document.getElementById("testButton").addEventListener("click", async () => {
1+
import { TEST_CONNECTION, HIGHLIGHT_LINKS } from "../actions/actionTypes.js";
2+
3+
const resultElement = document.getElementById("result");
4+
if (!resultElement) {
5+
throw new Error("Result element not found");
6+
}
7+
8+
const updateResult = (message) => {
9+
resultElement.textContent = message;
10+
};
11+
12+
const sendMessage = async (action, loadingMessage) => {
213
try {
3-
document.getElementById("result").textContent = "Getting page title...";
4-
const result = await chrome.runtime.sendMessage({
5-
action: "testConnection"
6-
});
7-
document.getElementById("result").textContent = result;
14+
updateResult(loadingMessage);
15+
const result = await chrome.runtime.sendMessage({ action });
16+
updateResult(result);
817
} catch (error) {
9-
document.getElementById("result").textContent = `Error: ${error.message}`;
18+
updateResult(`Error: ${error.message}`);
1019
}
11-
});
12-
13-
document
14-
.getElementById("highlightButton")
15-
.addEventListener("click", async () => {
16-
try {
17-
document.getElementById("result").textContent = "Highlighting links...";
18-
const result = await chrome.runtime.sendMessage({
19-
action: "highlightLinks"
20-
});
21-
document.getElementById("result").textContent = result;
22-
} catch (error) {
23-
document.getElementById("result").textContent = `Error: ${error.message}`;
24-
}
25-
});
20+
};
21+
22+
// Initialize button handlers
23+
const initializeHandlers = () => {
24+
const testButton = document.getElementById("testButton");
25+
const highlightButton = document.getElementById("highlightButton");
26+
27+
if (!testButton || !highlightButton) {
28+
throw new Error("Required buttons not found");
29+
}
30+
31+
testButton.addEventListener("click", () =>
32+
sendMessage(TEST_CONNECTION, "Getting page title...")
33+
);
34+
35+
highlightButton.addEventListener("click", () =>
36+
sendMessage(HIGHLIGHT_LINKS, "Highlighting links...")
37+
);
38+
};
39+
40+
// Initialize when DOM is ready
41+
document.addEventListener("DOMContentLoaded", initializeHandlers);

src/services/browserService.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import {
2+
connect,
3+
ExtensionTransport
4+
} from "puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser.js";
5+
import { getActiveTab, handleError } from "../utils/browserUtils.js";
6+
7+
/**
8+
* Service class for managing browser operations using Puppeteer
9+
*/
10+
class BrowserService {
11+
/**
12+
* Connect to the current active tab and get its title
13+
* @returns {Promise<string>} The page title
14+
*/
15+
async getPageTitle() {
16+
try {
17+
const tab = await getActiveTab();
18+
const browser = await connect({
19+
transport: await ExtensionTransport.connectTab(tab.id)
20+
});
21+
22+
const [page] = await browser.pages();
23+
const title = await page.title();
24+
25+
await browser.disconnect();
26+
return `Current page title: ${title}`;
27+
} catch (error) {
28+
return handleError(error);
29+
}
30+
}
31+
32+
/**
33+
* Connect to browser and get the active page
34+
* @returns {Promise<{ browser: Browser, page: Page }>}
35+
*/
36+
async connectToActivePage() {
37+
const tab = await getActiveTab();
38+
const browser = await connect({
39+
transport: await ExtensionTransport.connectTab(tab.id)
40+
});
41+
const [page] = await browser.pages();
42+
return { browser, page };
43+
}
44+
}
45+
46+
export const browserService = new BrowserService();

src/services/highlightService.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { browserService } from "./browserService.js";
2+
import { handleError } from "../utils/browserUtils.js";
3+
4+
/**
5+
* Service class for managing DOM highlighting operations
6+
*/
7+
class HighlightService {
8+
/**
9+
* Highlight all links on the current page
10+
* @returns {Promise<string>} Result message
11+
*/
12+
async highlightLinks() {
13+
try {
14+
const { browser, page } = await browserService.connectToActivePage();
15+
16+
const result = await page.evaluate(() => {
17+
const links = document.querySelectorAll("a");
18+
links.forEach((link) => {
19+
link.style.backgroundColor = "yellow";
20+
link.style.border = "2px solid red";
21+
});
22+
return `Highlighted ${links.length} links`;
23+
});
24+
25+
await browser.disconnect();
26+
return result;
27+
} catch (error) {
28+
return handleError(error);
29+
}
30+
}
31+
}
32+
33+
export const highlightService = new HighlightService();

src/utils/browserUtils.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* Get the current active tab in the current window
3+
* @returns {Promise<chrome.tabs.Tab>} The active tab
4+
*/
5+
export const getActiveTab = async () => {
6+
const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
7+
return tab;
8+
};
9+
10+
/**
11+
* Handle errors in async operations
12+
* @param {Error} error - The error to handle
13+
* @returns {string} Error message
14+
*/
15+
export const handleError = (error) => {
16+
console.error("Operation failed:", error);
17+
return `Error: ${error.message}`;
18+
};

0 commit comments

Comments
 (0)