Review of "Clippo" version 2.0.0 (1)

Details Page Preview

Clipboard history manager integrated into GNOME. Captures text and images you copy and opens the history at the pointer with a shortcut you choose (e.g. Super+V), with search, pinned items, type detection with quick actions, edit, QR codes, a private mode and persistence across sessions. Everything stays on your computer: no network access, no telemetry.

Extension Homepage
https://github.com/DanielFreitasDev/clippo

No comments.

FAQ

Files

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

Shexli (experimental) warning 2 manual_review 1

Shexli found 3 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

  • lib/clipboardManager.js:40
    St.Clipboard.get_default()

EGO-X-004 warning

extensions should avoid synchronous file IO in shell code

Shell code should avoid synchronous file IO APIs like `GLib.file_get_contents()` and `Gio.File.load_contents()`.

File Operations

  • lib/historyStore.js:77
    file.load_contents(null)

EGO-L-003 warning

signals connected by extension should be disconnected in disable()

Signals assigned in `enable()` are missing matching disconnect calls in `disable()` or its helper methods.

Disconnect all signals

  • extension.js:50
            this._clipboard.connect('image-copied', (_m, img) => {
                this._resetCycle();
                this._store.addImage(img.bytes, img.hash, { width: img.width, height: img.height });
                this._refreshPopup();
            })
  • extension.js:45
            this._clipboard.connect('text-copied', (_m, text) => {
                this._resetCycle();
                this._store.addText(text);
                this._refreshPopup();
            })
  • extension.js:80
    this._popup.connect('action-invoked', (_p, id, action) => this._invokeAction(id, action))
  • extension.js:76
            this._popup.connect('clear-requested', () => {
                this._store.clear();
                this._refreshPopup();
            })
  • extension.js:82
            this._popup.connect('item-edited', (_p, id, text) => {
                this._store.editText(id, text);
                this._clipboard.setClipboard(text);
                this._popup.dismiss();
            })
  • extension.js:68
            this._popup.connect('item-pin-toggled', (_p, id) => {
                this._store.togglePin(id);
                this._refreshPopup();
            })
  • extension.js:72
            this._popup.connect('item-removed', (_p, id) => {
                this._store.remove(id);
                this._refreshPopup();
            })
  • extension.js:58
            this._popup.connect('item-selected', (_p, id) => {
                const entry = this._store.getEntry(id);
                if (!entry)
                    return;
                if (entry.type === 'text')
                    this._clipboard.setClipboard(entry.text);
                else if (entry.type === 'image')
  • extension.js:81
    this._popup.connect('open-with-invoked', (_p, id, appId) => this._openWith(id, appId))

All Versions

Version Status
2.0.0 (1) Unreviewed