From f42521aa7b9542b194305c840deb6a6d3ca0c02c Mon Sep 17 00:00:00 2001 From: Ananay Date: Sat, 24 Feb 2024 00:49:13 +0530 Subject: [PATCH 01/11] Update chrome.management sample #1102 --- api-samples/management/README.md | 44 ++++++++++++++++++++++ api-samples/management/background.js | 10 +++++ api-samples/management/manifest.json | 17 +++++++++ api-samples/management/popup.html | 14 +++++++ api-samples/management/popup.js | 43 +++++++++++++++++++++ api-samples/management/sample.png | Bin 0 -> 471 bytes api-samples/management/style.css | 54 +++++++++++++++++++++++++++ 7 files changed, 182 insertions(+) create mode 100644 api-samples/management/README.md create mode 100644 api-samples/management/background.js create mode 100644 api-samples/management/manifest.json create mode 100644 api-samples/management/popup.html create mode 100644 api-samples/management/popup.js create mode 100644 api-samples/management/sample.png create mode 100644 api-samples/management/style.css diff --git a/api-samples/management/README.md b/api-samples/management/README.md new file mode 100644 index 000000000..10819a3c6 --- /dev/null +++ b/api-samples/management/README.md @@ -0,0 +1,44 @@ +# chrome.management Extension + +The [`chrome.management`](https://developer.chrome.com/docs/extensions/reference/api/management) API provides ways to manage the list of extensions/apps that are installed and running. It is particularly useful for extensions that [override](https://developer.chrome.com/extensions/develop/ui/override-chrome-pages) the built-in New Tab page. + +## Features + +- List all installed extensions. +- Display extension icons, names, and versions. +- Provide an "Uninstall" button for each extension. + +## Installation + +1. Clone or download this repository. +2. Load the extension in Chrome as an [unpacked extension](https://developer.chrome.com/docs/extensions/mv3/getstarted/development-basics/#load-unpacked). + +## Usage + +1. Click on the extension icon to open the extension manager. +2. The manager will list all installed extensions. +3. Each extension entry includes its icon, name, and version. +4. Click the "Uninstall" button next to an extension to remove it. + +## Code Overview + +### `popup.js` + +- Uses `chrome.management.getAll` to get a list of all installed extensions. +- Creates a list item for each extension, including its icon, name, version, and an "Uninstall" button. +- Sends a message to background script (`background.js`) to uninstall an extension when the "Uninstall" button is clicked. + +### `background.js` + +- Listens for messages from the popup. +- Handles uninstallation requests by calling `chrome.management.uninstall` with the extension id. +- Sends a response back to the popup after uninstalling the extension. + +## Known Issues + +- The extension does not handle errors that may occur during uninstallation. +- There is no confirmation dialog before uninstalling an extension. + +## License + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. diff --git a/api-samples/management/background.js b/api-samples/management/background.js new file mode 100644 index 000000000..6961aeebd --- /dev/null +++ b/api-samples/management/background.js @@ -0,0 +1,10 @@ +chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + if (message.action === 'uninstall') { + // Uninstall the extension with the given id + chrome.management.uninstall(message.id, (result) => { + console.log('Uninstall result:', result); + sendResponse(result); // Send response back to the popup + }); + } + return true; // Keep the message channel open for sendResponse +}); diff --git a/api-samples/management/manifest.json b/api-samples/management/manifest.json new file mode 100644 index 000000000..f073e7f94 --- /dev/null +++ b/api-samples/management/manifest.json @@ -0,0 +1,17 @@ +{ + "manifest_version": 3, + "name": "Extension Manager", + "version": "1.0", + "permissions": ["management"], + "background": { + "service_worker": "background.js" + }, + "action": { + "default_popup": "popup.html", + "default_icon": { + "16": "sample.png", + "48": "sample.png", + "128": "sample.png" + } + } +} diff --git a/api-samples/management/popup.html b/api-samples/management/popup.html new file mode 100644 index 000000000..97511b234 --- /dev/null +++ b/api-samples/management/popup.html @@ -0,0 +1,14 @@ + + + + Extension Manager + + + + + +
+ +
+ + diff --git a/api-samples/management/popup.js b/api-samples/management/popup.js new file mode 100644 index 000000000..1e52f2716 --- /dev/null +++ b/api-samples/management/popup.js @@ -0,0 +1,43 @@ +chrome.management.getAll((extensions) => { + const extensionList = document.getElementById('extensionList'); + + extensions.forEach((extension) => { + // Create list item for each extension + const li = document.createElement('li'); + + // Create and set icon for the extension + const icon = document.createElement('img'); + icon.src = extension.icons ? extension.icons[0].url : 'history32.png'; // Use default icon if not available + icon.width = 24; + icon.height = 24; + li.appendChild(icon); + + // Create and set name of the extension + const name = document.createElement('span'); + name.textContent = extension.name; + li.appendChild(name); + + // Create and set version of the extension + const version = document.createElement('span'); + version.textContent = ` (v${extension.version})`; + li.appendChild(version); + + // Create and set uninstall button for the extension + const button = document.createElement('button'); + button.textContent = 'Uninstall'; + button.addEventListener('click', () => { + // Send message to background script to uninstall extension + chrome.runtime.sendMessage( + { action: 'uninstall', id: extension.id }, + () => { + // Remove the extension from the list after uninstalling + li.remove(); + } + ); + }); + li.appendChild(button); + + // Append the list item to the extension list + extensionList.appendChild(li); + }); +}); diff --git a/api-samples/management/sample.png b/api-samples/management/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..a732e383f196ad065e2e7dac1fa90a2aee541ef3 GIT binary patch literal 471 zcmV;|0Vw{7P)QphR^o zlCVWYx}T4oNVt=MCotM|chUZJ@Ss8y&O+(yH5$=Go^l8Bnj)JqWP#SI!Mi5FL9tS- z5;;Zen1P{df49_HF0yY*wbP3LdQ}C#0!2~Yj0Ygnix`;nCdr-trXQ<_38`j_{~iDU N002ovPDHLkV1jxB(|P~^ literal 0 HcmV?d00001 diff --git a/api-samples/management/style.css b/api-samples/management/style.css new file mode 100644 index 000000000..7631ccb38 --- /dev/null +++ b/api-samples/management/style.css @@ -0,0 +1,54 @@ +body { + font-family: Arial, sans-serif; + margin: 0; + padding: 0; + min-width: 300px; + /* Set a minimum width for the popup */ + background-color: #b4bdef; + /* Set background color for the entire body */ +} + +.container { + padding: 16px; + max-height: 400px; + /* Limit the maximum height of the popup */ + overflow-y: auto; + /* Enable vertical scrolling if needed */ +} + +ul { + list-style-type: none; + padding: 0; + margin: 0; +} + +li { + display: flex; + align-items: center; + padding: 8px; + border-bottom: 1px solid #ddd; +} + +img { + margin-right: 8px; + width: 24px; + height: 24px; + object-fit: cover; + border-radius: 4px; +} + +button { + margin-left: auto; + margin-right: 10px; + + padding: 4px 8px; + background-color: #f44336; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; +} + +button:hover { + background-color: #d32f2f; +} \ No newline at end of file From 8aa41cee8b7a8645efbcabcd3a31eec2cd2c5fd2 Mon Sep 17 00:00:00 2001 From: Ananay Date: Sat, 24 Feb 2024 01:03:56 +0530 Subject: [PATCH 02/11] Update chrome.management sample #1102 --- api-samples/management/README.md | 7 ++----- api-samples/management/background.js | 12 ++++++++++-- api-samples/management/{ => images}/sample.png | Bin api-samples/management/images/screenshot.png | Bin 0 -> 42884 bytes api-samples/management/manifest.json | 6 +++--- api-samples/management/popup.js | 2 +- 6 files changed, 16 insertions(+), 11 deletions(-) rename api-samples/management/{ => images}/sample.png (100%) create mode 100644 api-samples/management/images/screenshot.png diff --git a/api-samples/management/README.md b/api-samples/management/README.md index 10819a3c6..1fe25957c 100644 --- a/api-samples/management/README.md +++ b/api-samples/management/README.md @@ -4,6 +4,8 @@ The [`chrome.management`](https://developer.chrome.com/docs/extensions/reference ## Features +![Screenshot](images/screenshot.png) + - List all installed extensions. - Display extension icons, names, and versions. - Provide an "Uninstall" button for each extension. @@ -34,11 +36,6 @@ The [`chrome.management`](https://developer.chrome.com/docs/extensions/reference - Handles uninstallation requests by calling `chrome.management.uninstall` with the extension id. - Sends a response back to the popup after uninstalling the extension. -## Known Issues - -- The extension does not handle errors that may occur during uninstallation. -- There is no confirmation dialog before uninstalling an extension. - ## License This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. diff --git a/api-samples/management/background.js b/api-samples/management/background.js index 6961aeebd..c86ebc96d 100644 --- a/api-samples/management/background.js +++ b/api-samples/management/background.js @@ -2,8 +2,16 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { if (message.action === 'uninstall') { // Uninstall the extension with the given id chrome.management.uninstall(message.id, (result) => { - console.log('Uninstall result:', result); - sendResponse(result); // Send response back to the popup + if (chrome.runtime.lastError) { + // Handle error during uninstallation + sendResponse({ + success: false, + error: chrome.runtime.lastError.message + }); + } else { + // Show confirmation message when extension is successfully uninstalled + sendResponse({ success: true }); + } }); } return true; // Keep the message channel open for sendResponse diff --git a/api-samples/management/sample.png b/api-samples/management/images/sample.png similarity index 100% rename from api-samples/management/sample.png rename to api-samples/management/images/sample.png diff --git a/api-samples/management/images/screenshot.png b/api-samples/management/images/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..0138088045f2ce5ae188affaa429872e22dc3b95 GIT binary patch literal 42884 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 Vt5XjfIpY976~#viC2~&#{s(9-j@1AF literal 0 HcmV?d00001 diff --git a/api-samples/management/manifest.json b/api-samples/management/manifest.json index f073e7f94..5365a27f5 100644 --- a/api-samples/management/manifest.json +++ b/api-samples/management/manifest.json @@ -9,9 +9,9 @@ "action": { "default_popup": "popup.html", "default_icon": { - "16": "sample.png", - "48": "sample.png", - "128": "sample.png" + "16": "images/sample.png", + "48": "images/sample.png", + "128": "images/sample.png" } } } diff --git a/api-samples/management/popup.js b/api-samples/management/popup.js index 1e52f2716..fe9469f02 100644 --- a/api-samples/management/popup.js +++ b/api-samples/management/popup.js @@ -7,7 +7,7 @@ chrome.management.getAll((extensions) => { // Create and set icon for the extension const icon = document.createElement('img'); - icon.src = extension.icons ? extension.icons[0].url : 'history32.png'; // Use default icon if not available + icon.src = extension.icons ? extension.icons[0].url : 'images/sample.png'; // Use default icon if not available icon.width = 24; icon.height = 24; li.appendChild(icon); From 3555c4f7fc24f270fa741b4bd7e03340eed83121 Mon Sep 17 00:00:00 2001 From: Ananay Date: Mon, 26 Feb 2024 22:56:33 +0530 Subject: [PATCH 03/11] Update api-samples/management/README.md Co-authored-by: Joe Medley --- api-samples/management/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-samples/management/README.md b/api-samples/management/README.md index 1fe25957c..79044aa2f 100644 --- a/api-samples/management/README.md +++ b/api-samples/management/README.md @@ -1,6 +1,6 @@ # chrome.management Extension -The [`chrome.management`](https://developer.chrome.com/docs/extensions/reference/api/management) API provides ways to manage the list of extensions/apps that are installed and running. It is particularly useful for extensions that [override](https://developer.chrome.com/extensions/develop/ui/override-chrome-pages) the built-in New Tab page. +The [`chrome.management`](https://developer.chrome.com/docs/extensions/reference/api/management) API provides ways to manage the list of extensions that are installed and running. It is particularly useful for extensions that [override](https://developer.chrome.com/extensions/develop/ui/override-chrome-pages) the built-in New Tab page. ## Features From 3d2241dfafb716c3565f3925fa95141cc17c8d1e Mon Sep 17 00:00:00 2001 From: Ananay Date: Mon, 26 Feb 2024 22:57:09 +0530 Subject: [PATCH 04/11] Update api-samples/management/README.md Co-authored-by: Joe Medley --- api-samples/management/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/api-samples/management/README.md b/api-samples/management/README.md index 79044aa2f..d5a9e897f 100644 --- a/api-samples/management/README.md +++ b/api-samples/management/README.md @@ -17,9 +17,7 @@ The [`chrome.management`](https://developer.chrome.com/docs/extensions/reference ## Usage -1. Click on the extension icon to open the extension manager. -2. The manager will list all installed extensions. -3. Each extension entry includes its icon, name, and version. +1. Click the extension icon to open the extension manager. The manager will list all installed extensions. Each extension entry includes its icon, name, and version. 4. Click the "Uninstall" button next to an extension to remove it. ## Code Overview From ea29dc243be92cf8c88ff64806d8f8830a76d302 Mon Sep 17 00:00:00 2001 From: Ananay Date: Mon, 26 Feb 2024 22:57:23 +0530 Subject: [PATCH 05/11] Update api-samples/management/README.md Co-authored-by: Joe Medley --- api-samples/management/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api-samples/management/README.md b/api-samples/management/README.md index d5a9e897f..afd3e3015 100644 --- a/api-samples/management/README.md +++ b/api-samples/management/README.md @@ -6,9 +6,9 @@ The [`chrome.management`](https://developer.chrome.com/docs/extensions/reference ![Screenshot](images/screenshot.png) -- List all installed extensions. -- Display extension icons, names, and versions. -- Provide an "Uninstall" button for each extension. +- Lists all installed extensions. +- Displays extension icons, names, and versions. +- Provides an **Uninstall** button for each extension. ## Installation From 962cdebbd954c6637ebd4e8e5b9ec2a8ba227bee Mon Sep 17 00:00:00 2001 From: Ananay Date: Mon, 26 Feb 2024 22:57:34 +0530 Subject: [PATCH 06/11] Update api-samples/management/README.md Co-authored-by: Joe Medley --- api-samples/management/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-samples/management/README.md b/api-samples/management/README.md index afd3e3015..ca1f27108 100644 --- a/api-samples/management/README.md +++ b/api-samples/management/README.md @@ -24,7 +24,7 @@ The [`chrome.management`](https://developer.chrome.com/docs/extensions/reference ### `popup.js` -- Uses `chrome.management.getAll` to get a list of all installed extensions. +- Uses `chrome.management.getAll()` to get a list of all installed extensions. - Creates a list item for each extension, including its icon, name, version, and an "Uninstall" button. - Sends a message to background script (`background.js`) to uninstall an extension when the "Uninstall" button is clicked. From e53c5aeca6612223dfa8ecdf43140437c929a115 Mon Sep 17 00:00:00 2001 From: Ananay Date: Mon, 26 Feb 2024 22:57:52 +0530 Subject: [PATCH 07/11] Update api-samples/management/README.md Co-authored-by: Joe Medley --- api-samples/management/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-samples/management/README.md b/api-samples/management/README.md index ca1f27108..fef0c4ae1 100644 --- a/api-samples/management/README.md +++ b/api-samples/management/README.md @@ -31,7 +31,7 @@ The [`chrome.management`](https://developer.chrome.com/docs/extensions/reference ### `background.js` - Listens for messages from the popup. -- Handles uninstallation requests by calling `chrome.management.uninstall` with the extension id. +- Handles uninstallation requests by calling `chrome.management.uninstall()` with the extension ID. - Sends a response back to the popup after uninstalling the extension. ## License From 426f1b00d6c7c1c59131794c131606ae71cb5d5e Mon Sep 17 00:00:00 2001 From: Ananay Date: Mon, 26 Feb 2024 22:58:05 +0530 Subject: [PATCH 08/11] Update api-samples/management/README.md Co-authored-by: Joe Medley --- api-samples/management/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-samples/management/README.md b/api-samples/management/README.md index fef0c4ae1..c210272d2 100644 --- a/api-samples/management/README.md +++ b/api-samples/management/README.md @@ -18,7 +18,7 @@ The [`chrome.management`](https://developer.chrome.com/docs/extensions/reference ## Usage 1. Click the extension icon to open the extension manager. The manager will list all installed extensions. Each extension entry includes its icon, name, and version. -4. Click the "Uninstall" button next to an extension to remove it. +2. Click the **Uninstall** button next to an extension to remove it. ## Code Overview From 24db132150e4380f3a8074f25027f888f9243afa Mon Sep 17 00:00:00 2001 From: Ananay Date: Mon, 26 Feb 2024 22:58:18 +0530 Subject: [PATCH 09/11] Update api-samples/management/README.md Co-authored-by: Joe Medley --- api-samples/management/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-samples/management/README.md b/api-samples/management/README.md index c210272d2..b0d489e31 100644 --- a/api-samples/management/README.md +++ b/api-samples/management/README.md @@ -25,7 +25,7 @@ The [`chrome.management`](https://developer.chrome.com/docs/extensions/reference ### `popup.js` - Uses `chrome.management.getAll()` to get a list of all installed extensions. -- Creates a list item for each extension, including its icon, name, version, and an "Uninstall" button. +- Creates a list item for each extension, including its icon, name, version, and an **Uninstall** button. - Sends a message to background script (`background.js`) to uninstall an extension when the "Uninstall" button is clicked. ### `background.js` From 9863bf05ef5ea86c84a6f0c12497c081ab896e58 Mon Sep 17 00:00:00 2001 From: Ananay Date: Mon, 26 Feb 2024 22:58:34 +0530 Subject: [PATCH 10/11] Update api-samples/management/README.md Co-authored-by: Joe Medley --- api-samples/management/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-samples/management/README.md b/api-samples/management/README.md index b0d489e31..2081fea20 100644 --- a/api-samples/management/README.md +++ b/api-samples/management/README.md @@ -26,7 +26,7 @@ The [`chrome.management`](https://developer.chrome.com/docs/extensions/reference - Uses `chrome.management.getAll()` to get a list of all installed extensions. - Creates a list item for each extension, including its icon, name, version, and an **Uninstall** button. -- Sends a message to background script (`background.js`) to uninstall an extension when the "Uninstall" button is clicked. +- Sends a message to the extension service worker (`background.js`) to uninstall an extension when the **Uninstall** button is clicked. ### `background.js` From f3f9d901961b8cc738dd082c46ecbb206cc4d8ae Mon Sep 17 00:00:00 2001 From: Ananay Date: Mon, 26 Feb 2024 23:07:34 +0530 Subject: [PATCH 11/11] Update README.md wrt requested changes --- api-samples/management/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api-samples/management/README.md b/api-samples/management/README.md index 2081fea20..cc39cdb6c 100644 --- a/api-samples/management/README.md +++ b/api-samples/management/README.md @@ -4,11 +4,11 @@ The [`chrome.management`](https://developer.chrome.com/docs/extensions/reference ## Features -![Screenshot](images/screenshot.png) - - Lists all installed extensions. - Displays extension icons, names, and versions. - Provides an **Uninstall** button for each extension. + + ![Screenshot](images/screenshot.png) ## Installation