Review of "Copyous" version 2.1.2 (12)

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

Shexli found 6 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:74
    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:271
    		this._entry = new MultilineEntry({
    			style_class: 'clipboard-item-edit-dialog-entry',
    			can_focus: true,
    		})
  • lib/ui/components/editDialog.js:266
    this._languageButton = new LanguageButton(ext, metadata.language)
  • lib/ui/items/characterItem.js:21
    		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:35
    		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:41
    this._effect = new Clutter.BrightnessContrastEffect({ enabled: false })
  • lib/ui/items/fileItem.js:48
    		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:284
    this._linkPreview = new LinkPreview(ext, this.entry.content.trim())
  • lib/ui/items/linkItem.js:286
    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:271
    		this._entry = new MultilineEntry({
    			style_class: 'clipboard-item-edit-dialog-entry',
    			can_focus: true,
    		})
  • lib/ui/components/editDialog.js:266
    this._languageButton = new LanguageButton(ext, metadata.language)
  • lib/ui/items/characterItem.js:21
    		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:35
    		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:41
    this._effect = new Clutter.BrightnessContrastEffect({ enabled: false })
  • lib/ui/items/fileItem.js:48
    		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:284
    this._linkPreview = new LinkPreview(ext, this.entry.content.trim())
  • lib/ui/items/linkItem.js:286
    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:112
    this._clearButton.connect('clicked', () => this.emit('clear-history'))
  • lib/ui/clipboardDialog.js:96
    this._settingsButton.connect('clicked', () => this.emit('open-settings'))
  • lib/ui/clipboardDialog.js:103
    this.searchEntry.clutter_text.connect('key-focus-in', () => this.updateHeader(true))
  • lib/ui/components/editDialog.js:112
    		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:143
    this._leftArrow.connect('clicked', () => this._tagsBox.previousPage())
  • lib/ui/components/tagsItem.js:144
    this._rightArrow.connect('clicked', () => this._tagsBox.nextPage())
  • lib/ui/components/tagsItem.js:120
    this._tagsBox.hadjustment.connect('changed', this.updateButtons.bind(this))
  • lib/ui/components/tagsItem.js:119
    this._tagsBox.hadjustment.connect('notify::value', this.updateButtons.bind(this))
  • lib/ui/effects/holeEffect.js:97
    target.connect('notify::allocation', () => this.queue_repaint())
  • lib/ui/indicator.js:223
    dialog.connect('clear-history', (_dialog, history) => this.emit('clear-history', history))
  • lib/ui/items/clipboardItemHeader.js:331
    		this._titleEntry.clutter_text.connect('key-focus-out', () => {
    			if (this._isEditing) {
    				this.finishEditing(true);
    			}
    		})
  • lib/ui/items/clipboardItemHeader.js:320
    		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:60
    		this._code.connect('notify::language', () => {
    			this.entry.metadata = { language: this._code.language };
    		})
  • lib/ui/searchEntry.js:182
    		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:297
    		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:327
    		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:323
    		this._menu.connect('tag-changed', (_menu, tag) => {
    			this.tag = tag;
    			return undefined;
    		})
  • lib/ui/searchEntry.js:368
    this.clutter_text.connect('key-press-event', (_text, event) => this._keyPressEvent(event))

EGO-M-004 error

metadata shell-version must only include plausible stable releases and at most one development release

Field `shell-version` contains invalid values, more than one development release, or implausible future releases.

metadata.json must be well-formed

  • metadata.json
    shell-version=['48', '49', '50', '51']

All Versions

Version Status
2.1.2 (12) Active
2.1.1 (11) Inactive
2.1.0.HEAD (10) Rejected
2.0.1 (9) Inactive
2.0.0 (8) Inactive
1.3.0 (7) Inactive
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

GdH active