Review of "Copyous" version 2.0.1 (9)

Details Page Preview

Modern Clipboard Manager for GNOME

Extension Homepage
https://github.com/boerdereinar/copyous

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) error 1 warning 3 manual_review 1

Shexli found 5 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/misc/clipboard.js:73
    St.Clipboard.get_default()

EGO-P-004 error

GSettings schema XML filename must match schema id

GSettings schema filename must match `<schema-id>.gschema.xml`.

GSettings Schemas

  • schemas/org.gnome.shell.extensions.copyous.gschema.xml
    id='org.gnome.shell.extensions.copyous.text-item' path='/org/gnome/shell/extensions/copyous/text-item/'
  • schemas/org.gnome.shell.extensions.copyous.gschema.xml
    id='org.gnome.shell.extensions.copyous.code-item' path='/org/gnome/shell/extensions/copyous/code-item/'
  • schemas/org.gnome.shell.extensions.copyous.gschema.xml
    id='org.gnome.shell.extensions.copyous.image-item' path='/org/gnome/shell/extensions/copyous/image-item/'
  • schemas/org.gnome.shell.extensions.copyous.gschema.xml
    id='org.gnome.shell.extensions.copyous.file-item' path='/org/gnome/shell/extensions/copyous/file-item/'
  • schemas/org.gnome.shell.extensions.copyous.gschema.xml
    id='org.gnome.shell.extensions.copyous.link-item' path='/org/gnome/shell/extensions/copyous/link-item/'
  • schemas/org.gnome.shell.extensions.copyous.gschema.xml
    id='org.gnome.shell.extensions.copyous.character-item' path='/org/gnome/shell/extensions/copyous/character-item/'
  • schemas/org.gnome.shell.extensions.copyous.gschema.xml
    id='org.gnome.shell.extensions.copyous.theme' path='/org/gnome/shell/extensions/copyous/theme/'

EGO-L-002 warning

objects created by extension should be destroyed in disable()

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

Destroy all objects

  • lib/ui/components/editDialog.js:282
    		this._entry = new MultilineEntry({
    			style_class: 'clipboard-item-edit-dialog-entry',
    			can_focus: true,
    		})
  • lib/ui/components/editDialog.js:277
    this._languageButton = new LanguageButton(ext, metadata.language)
  • lib/ui/items/characterItem.js:34
    		this._character = new St.Label({
    			style_class: 'character-item-content',
    			text: entry.content.trim(),
    			min_width: 0,
    			x_align: Clutter.ActorAlign.CENTER,
    			y_align: Clutter.ActorAlign.CENTER,
    			y_expand: true,
    			style: 'font-size: 16px',
    		})
  • lib/ui/items/characterItem.js:48
    		this._chars = new St.Label({
    			style_class: 'character-item-chars',
    			text: chars,
    			x_align: Clutter.ActorAlign.CENTER,
    			y_align: Clutter.ActorAlign.END,
    		})
  • lib/ui/items/colorItem.js:54
    this._effect = new Clutter.BrightnessContrastEffect({ enabled: false })
  • lib/ui/items/fileItem.js:61
    		this._file = new St.Label({
    			style_class: 'file-item-file',
    			text: formatFile(Gio.File.new_for_uri(this.entry.content)),
    			y_align: Clutter.ActorAlign.START,
    			y_expand: true,
    		})
  • lib/ui/items/linkItem.js:297
    this._linkPreview = new LinkPreview(ext, this.entry.content.trim())
  • lib/ui/items/linkItem.js:299
    this._url = new St.Label({ style_class: 'link-url', text: this.entry.content.trim() })

EGO-L-005 warning

owned object references should be released in disable()

Owned references that are cleaned up in `disable()` should also be released with `null` or `undefined`.

Destroy all objects

  • extension.js:38
    this.settings = this.getSettings()
  • lib/ui/components/editDialog.js:282
    		this._entry = new MultilineEntry({
    			style_class: 'clipboard-item-edit-dialog-entry',
    			can_focus: true,
    		})
  • lib/ui/components/editDialog.js:277
    this._languageButton = new LanguageButton(ext, metadata.language)
  • lib/ui/items/characterItem.js:34
    		this._character = new St.Label({
    			style_class: 'character-item-content',
    			text: entry.content.trim(),
    			min_width: 0,
    			x_align: Clutter.ActorAlign.CENTER,
    			y_align: Clutter.ActorAlign.CENTER,
    			y_expand: true,
    			style: 'font-size: 16px',
    		})
  • lib/ui/items/characterItem.js:48
    		this._chars = new St.Label({
    			style_class: 'character-item-chars',
    			text: chars,
    			x_align: Clutter.ActorAlign.CENTER,
    			y_align: Clutter.ActorAlign.END,
    		})
  • lib/ui/items/colorItem.js:54
    this._effect = new Clutter.BrightnessContrastEffect({ enabled: false })
  • lib/ui/items/fileItem.js:61
    		this._file = new St.Label({
    			style_class: 'file-item-file',
    			text: formatFile(Gio.File.new_for_uri(this.entry.content)),
    			y_align: Clutter.ActorAlign.START,
    			y_expand: true,
    		})
  • lib/ui/items/linkItem.js:297
    this._linkPreview = new LinkPreview(ext, this.entry.content.trim())
  • lib/ui/items/linkItem.js:299
    this._url = new St.Label({ style_class: 'link-url', text: this.entry.content.trim() })

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

  • lib/ui/clipboardDialog.js:124
    this._clearButton.connect('clicked', () => this.emit('clear-history'))
  • lib/ui/clipboardDialog.js:108
    this._settingsButton.connect('clicked', () => this.emit('open-settings'))
  • lib/ui/clipboardDialog.js:115
    this.searchEntry.clutter_text.connect('key-focus-in', () => this.updateHeader(true))
  • lib/ui/components/editDialog.js:123
    		text.connect('cursor-changed', () => {
    			const [success, x, y, h] = text.position_to_coords(text.cursor_position);
    			if (success) {
    				if (x > box.allocation.get_width()) return;
    				const y1 = box.vadjustment.value;
    				const y2 = y1 + box.vadjustment.page_size;
    				if (y < y1) {
    					box.vadj
  • lib/ui/components/tagsItem.js:156
    this._leftArrow.connect('clicked', () => this._tagsBox.previousPage())
  • lib/ui/components/tagsItem.js:157
    this._rightArrow.connect('clicked', () => this._tagsBox.nextPage())
  • lib/ui/components/tagsItem.js:133
    this._tagsBox.hadjustment.connect('changed', this.updateButtons.bind(this))
  • lib/ui/components/tagsItem.js:132
    this._tagsBox.hadjustment.connect('notify::value', this.updateButtons.bind(this))
  • lib/ui/indicator.js:229
    dialog.connect('clear-history', (_dialog, history) => this.emit('clear-history', history))
  • lib/ui/items/clipboardItem.js:313
    target.connect('notify::allocation', () => this.queue_repaint())
  • lib/ui/items/clipboardItemHeader.js:344
    		this._titleEntry.clutter_text.connect('key-focus-out', () => {
    			if (this._isEditing) {
    				this.finishEditing(true);
    			}
    		})
  • lib/ui/items/clipboardItemHeader.js:333
    		this._titleEntry.clutter_text.connect('key-press-event', (_text, event) => {
    			const key = event.get_key_symbol();
    			if (key === Clutter.KEY_Return || key === Clutter.KEY_KP_Enter) {
    				this.finishEditing(true);
    				return Clutter.EVENT_STOP;
    			} else if (key === Clutter.KEY_Escape) {
    				this
  • lib/ui/items/codeItem.js:73
    		this._code.connect('notify::language', () => {
    			this.entry.metadata = { language: this._code.language };
    		})
  • lib/ui/searchEntry.js:191
    		this.actor.connect('captured-event', (_actor, event) => {
    			if (event.type() === Clutter.EventType.KEY_PRESS) {
    				const key = event.get_key_symbol();
    				const unicode = Clutter.keysym_to_unicode(key);
    				if (unicode === 0) return;
    
    				// Select tag with number
    				if (key === Clutter.KEY_0 |
  • lib/ui/searchEntry.js:305
    		this._itemButton.connect('clicked', (_btn, button) => {
    			if (button === Clutter.BUTTON_PRIMARY) {
    				this._menu.toggle();
    			} else if (button === Clutter.BUTTON_MIDDLE) {
    				this.type = null;
    				this.tag = null;
    			}
    		})
  • lib/ui/searchEntry.js:335
    		this._menu.connect('selected-changed', (_menu, type) => {
    			this.type = type;
    			if (type) {
    				searchIcon.gicon = this._icons[type];
    			} else {
    				searchIcon.gicon = this._icons.search;
    			}
    			return undefined;
    		})
  • lib/ui/searchEntry.js:331
    		this._menu.connect('tag-changed', (_menu, tag) => {
    			this.tag = tag;
    			return undefined;
    		})
  • lib/ui/searchEntry.js:376
    this.clutter_text.connect('key-press-event', (_text, event) => this._keyPressEvent(event))

All Versions

Version Status
2.0.1 (9) Active
2.0.0 (8) Active
1.3.0 (7) Active
1.2.0 (6) Inactive
1.1.3 (5) Inactive
1.1.2 (4) Inactive
1.1.1 (3) Inactive
1.1.0 (2) Inactive
1.0.0 (1) Rejected

Previous Reviews on this Version

fmuellner active