Review of "All-in-One Clipboard" version 21

Details Page Preview

A powerful clipboard manager that combines your clipboard history, emojis, GIFs, kaomojis, and symbols into a single, searchable interface. External Services: • Klipy & Tenor - GIF search and browsing • Google S2 Favicons - Favicon fallback for URLs • Cloudflare Workers - API key storage Extension Homepage: https://github.com/NiffirgkcaJ/all-in-one-clipboard https://gitlab.com/NiffirgkcaJ/all-in-one-clipboard

Extension Homepage
https://github.com/NiffirgkcaJ/all-in-one-clipboard

No comments.

Diff Against

Files

Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.

Shexli (experimental) warning 1 manual_review 1

Shexli found 2 issues that may need reviewer attention.

EGO-A-005 manual_review

extensions should not access the clipboard directly

Direct clipboard access via `St.Clipboard.get_default()` requires reviewer scrutiny.

Review Guidelines

  • shared/utilities/utilityClipboard.js:10
    St.Clipboard.get_default()
  • shared/utilities/utilityClipboard.js:23
    St.Clipboard.get_default()
  • shared/utilities/utilityClipboard.js:36
    St.Clipboard.get_default()
  • shared/utilities/utilityClipboard.js:51
    St.Clipboard.get_default()

EGO-P-007 warning

JavaScript files should be reachable from extension.js or prefs.js

Some JavaScript files are not reachable from `extension.js` or `prefs.js` imports.

Don't include unnecessary files

  • features/Clipboard/constants/clipboardLayoutConstants.js
  • features/Clipboard/integrations/clipboardMenuDefinition.js
  • features/Clipboard/integrations/clipboardSearchProvider.js
  • features/Clipboard/services/clipboardSearchService.js
  • features/Clipboard/services/clipboardSelectionService.js
  • features/Clipboard/tabClipboard.js
  • features/Clipboard/utilities/clipboardKeyboardShortcuts.js
  • features/Clipboard/utilities/clipboardSearchUtils.js
  • features/Clipboard/view/clipboardActionBar.js
  • features/Clipboard/view/clipboardBaseItemConfig.js
  • features/Clipboard/view/clipboardBaseView.js
  • features/Clipboard/view/clipboardBaseWidgetFactory.js
  • features/Clipboard/view/clipboardGridItemFactory.js
  • features/Clipboard/view/clipboardGridView.js
  • features/Clipboard/view/clipboardListItemFactory.js
  • features/Clipboard/view/clipboardListView.js
  • features/Emoji/constants/emojiConstants.js
  • features/Emoji/integrations/emojiMenuDefinition.js
  • features/Emoji/integrations/emojiSearchProvider.js
  • features/Emoji/logic/emojiModifier.js

All Versions

Version Status
30 Active
29 Active
28 Active
27 Active
26 Active
25 Active
24 Active
23 Active
22 Rejected
21 Rejected
20 Rejected
19 Active
18 Rejected
17 Rejected
16 Rejected
15 Active
14 Rejected
13 Active
12 Rejected
11 Rejected
10 Active
9 Rejected
8 Active
7 Active
6 Rejected
5 Active
4 Rejected
3 Rejected
2 Rejected
1 Rejected

Previous Reviews on this Version

NiffirgkcaJ posted a review
1. EGO-P-007: Reachability of JavaScript Files Message: "Some JavaScript files are not reachable from extension.js or prefs.js imports." Explanation: These warnings are false positives resulting from a limitation in static analysis. The files are not "unnecessary"; they are loaded dynamically to optimize performance. - Mechanism: The extension uses a Modular Registry Pattern. Instead of statically importing every feature tab at startup (which would increase memory overhead), the extension uses the asynchronous import() function. - Implementation: - shared/menu/menuOrder.js defines the module paths as strings. - shared/menu/menuRegistry.js iterates through these paths and calls await import(modulePath). - Conclusion: Static linters like shexli cannot follow string-based dynamic imports. All flagged files are vital components of the extension’s UI and logic that are loaded on demand. 2. EGO-A-005: Direct Clipboard Access Message: "Direct clipboard access via St.Clipboard.get_default() requires reviewer scrutiny." Explanation: This warning is triggered because the extension interacts with the system clipboard. Since the core purpose of this extension is to be a Clipboard Manager, this access is mandatory. - Transparency: To assist the manual review process, all clipboard read/write operations have been abstracted and centralized into a single, dedicated utility file: gnome-extensions/extension/shared/utilities/utilityClipboard.js. - Data Integrity: The implementation uses standard GJS/Shell APIs (St.Clipboard) to listen for selection changes and provide the user the ability to cycle through their clipboard history. - Scope: Clipboard access is strictly limited to capturing new entries for the history and restoring selected historical entries back to the system clipboard at the user's request.
JustPerfection rejected
1. Shouldn't delay destroy (line 882 `features/Clipboard/view/clipboardBaseView.js`). GNOME Shell doesn't expect the disable function to be async. Also delaying destroy is a bad idea since GNOME Shell needs to re-base in lock screen. 2. You cannot create instance of objects in global scope: - Line 9 `features/Emoji/integrations/emojiSearchProvider.js` - Line 11 `features/GIF/integrations/gifSearchProvider.js` - Line 194 `features/RecentlyUsed/definitions/recentlyUsedDefinitionClipboard.js` - Line 262 `features/RecentlyUsed/definitions/recentlyUsedDefinitionGif.js` - Line 159 `features/RecentlyUsed/definitions/recentlyUsedDefinitionKaomoji.js` - Line 204 `features/RecentlyUsed/definitions/recentlyUsedDefinitionPinned.js` - Line 188 `features/RecentlyUsed/definitions/recentlyUsedDefinitionSymbols.js` - Line 5-7 `shared/menu/menuRegistry.js` [EGO Review Guidelines: Destroy](https://gjs.guide/extensions/review-guidelines/review-guidelines.html#destroy-all-objects) 3. Many lines using `typeof`, `=== 'function'` and unnecessary try-catch wrappers which is the indication of AI usage. 4. The code base is really large for importing to the shell process. I highly recommend to move the logic to an app and move it out of the extension and just make that app as a dependency of this extension. Then you can use d-bus to communicate between the app and this extension. That way, the extension code base will be really small.