Review of "Clipboard Indicator" version 72

Details Page Preview

The most popular clipboard manager for GNOME, with over 1M downloads

Extension Homepage
https://github.com/Tudmotu/gnome-shell-extension-clipboard-indicator

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 3 manual_review 1

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

  • extension.js:70
    St.Clipboard.get_default()

EGO-A-004 warning

extension files should not contain excessive ungated console logging

File contains 8 ungated console.log/warn/error calls (threshold: 5).

No excessive logging

  • extension.js:173
    console.error('Clipboard Indicator: _buildMenu failed', e)
  • extension.js:1048
    console.error('Clipboard Indicator: Failed to refresh indicator')
  • extension.js:1049
    console.error(e)
  • extension.js:1356
    console.error(e)
  • extension.js:1457
    console.error('Clipboard Indicator: Failed to update registry')
  • extension.js:1458
    console.error(e)
  • extension.js:1740
    console.error('Clipboard Indicator: failed to load image preview')
  • extension.js:1741
    console.error(e)

EGO-X-003 warning

extensions should not call run_dispose in extension code

Extension code should not call `run_dispose()`.

GObject.Object.run_dispose

  • keyboard.js:19
    this.#device.run_dispose()

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:1249
                this._notifSource.connect('destroy', () => {
                    this._notifSource = null;
                })
  • extension.js:374
    this.clearMenuItem.connect('activate', this._removeAll.bind(this))
  • extension.js:716
    menuItem.imagePreviewBtn.connect('clicked', () => this.#showImagePreview(entry))
  • extension.js:734
    menuItem.editBtn.connect('clicked', () => this.#showEditDialog(menuItem))
  • extension.js:773
            menuItem.pasteBtn.connect('clicked',
                () => this.#pasteItem(menuItem)
            )
  • extension.js:793
    menuItem.tagBtn.connect('clicked', () => this.#showTagDialog(menuItem))
  • extension.js:632
            menuItem.actor.connect('key-press-event', (actor, event) => {
                switch (event.get_key_symbol()) {
                    case Clutter.KEY_Delete:
                        if (menuItem.entry.isFavorite()) {
                            if (CONFIRM_ON_PINNED_DELETE) {
                                this
  • extension.js:116
            this.menu.connect('open-state-changed', (menu, isOpen) => {
                if (!isOpen)
                    this.menu.sourceActor = this;
            })
  • extension.js:256
            this.menu.connect('open-state-changed', (self, open) => {
                this._setFocusOnOpenTimeout = setTimeout(() => {
                    if (!open) return;
    
                    if (this._focusItemOnOpen) {
                        const item = this._focusItemOnOpen;
                        this._focusItemO
  • extension.js:366
            this.resetTimerButton.connect('clicked', () => {
                this._scheduleNextHistoryClear();
            })
  • extension.js:386
    this.settingsMenuItem.connect('activate', this._openSettings.bind(this))

All Versions

Previous Reviews on this Version

GdH active