Review of "Copyous" version 2.1.0.HEAD (10)

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:87
    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:284
    		this._entry = new MultilineEntry({
    			style_class: 'clipboard-item-edit-dialog-entry',
    			can_focus: true,
    		})
  • lib/ui/components/editDialog.js:279
    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:284
    		this._entry = new MultilineEntry({
    			style_class: 'clipboard-item-edit-dialog-entry',
    			can_focus: true,
    		})
  • lib/ui/components/editDialog.js:279
    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:125
    this._clearButton.connect('clicked', () => this.emit('clear-history'))
  • lib/ui/clipboardDialog.js:109
    this._settingsButton.connect('clicked', () => this.emit('open-settings'))
  • lib/ui/clipboardDialog.js:116
    this.searchEntry.clutter_text.connect('key-focus-in', () => this.updateHeader(true))
  • lib/ui/components/editDialog.js:125
    		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/effects/holeEffect.js:110
    target.connect('notify::allocation', () => this.queue_repaint())
  • lib/ui/indicator.js:236
    dialog.connect('clear-history', (_dialog, history) => this.emit('clear-history', history))
  • 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:194
    		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:309
    		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:339
    		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:335
    		this._menu.connect('tag-changed', (_menu, tag) => {
    			this.tag = tag;
    			return undefined;
    		})
  • lib/ui/searchEntry.js:380
    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.0.HEAD (10) Unreviewed
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