Review of "Aurora Shell" version 51 (33)

Details Page Preview

A customizable GNOME Shell extension that enhances the user experience with various modules and features. Clipboard History reads and stores clipboard content locally so it can be browsed and restored. Capture Tools writes captured images and locally recognized text to the clipboard when requested. No clipboard or OCR data is shared with third parties, and the Clipboard History shortcut is unset by default.

Extension Homepage
https://github.com/luminusOS/aurora-shell

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

  • capture/captureOcrSession.js:164
    St.Clipboard.get_default()
  • capture/screenshotCapture.js:38
    St.Clipboard.get_default()
  • clipboard/clipboardHistory.js:170
    St.Clipboard.get_default()
  • clipboard/clipboardHistory.js:181
    St.Clipboard.get_default()
  • clipboard/clipboardMonitor.js:58
    St.Clipboard.get_default()

EGO-X-006 warning

extensions should not use lookupByURL or lookupByUUID for current extension access

Use `this`, `this.getSettings()` or `this.path` instead of `lookupByURL()` or `lookupByUUID()` for the current extension.

`extensionUtils`

  • core/logger.js:8
    Extension.lookupByURL(import.meta.url)

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

  • clipboard/clipboardItem.js:38
          this._actions = new St.BoxLayout({
            orientation: Clutter.Orientation.HORIZONTAL,
            y_align: Clutter.ActorAlign.START,
            style_class: 'aurora-clipboard-item-actions',
          })
  • desktop/trayIcons/trayContainer.js:107
          this._scrollController = new Clutter.ScrollController({
            flags:
              Clutter.ScrollControllerFlags.SCROLL_HORIZONTAL |
              Clutter.ScrollControllerFlags.SCROLL_VERTICAL,
          })
  • dock/externalStorageIcon.js:96
    this._ejectItem = new PopupMenu.PopupMenuItem(ejectLabel)
  • dock/externalStorageIcon.js:74
          this._iconActor = new St.Icon({
            gicon: this._item.icon,
            icon_size: size,
            style_class: 'show-apps-icon',
            track_hover: true,
          })
  • dock/externalStorageIcon.js:88
    this._menuManager = new PopupMenu.PopupMenuManager(this.toggleButton)
  • dock/externalStorageIcon.js:90
          this._openItem = new PopupMenu.PopupMenuItem(
            this._item.mount ? _('Open') : _('Mount and Open'),
          )
  • dock/externalStorageIcon.js:25
          this.toggleButton = new St.Button({
            style_class: 'show-apps',
            track_hover: true,
            can_focus: true,
            reactive: true,
          })
  • dock/trashIcon.js:105
    this._emptyItem = new PopupMenu.PopupMenuItem(_('Empty Trash'))
  • dock/trashIcon.js:86
          this._iconActor = new St.Icon({
            icon_name: this._empty ? ICON_EMPTY : ICON_FULL,
            icon_size: size,
            style_class: 'show-apps-icon',
            track_hover: true,
          })
  • dock/trashIcon.js:100
    this._menuManager = new PopupMenu.PopupMenuManager(this.toggleButton)
  • dock/trashIcon.js:32
          this.toggleButton = new St.Button({
            style_class: 'show-apps',
            track_hover: true,
            can_focus: true,
            reactive: true,
          })
  • panel/clock/calendarReminders/calendarRemindersPill.js:29
        this._label = new St.Label({
          style_class: 'clock-label aurora-calendar-reminders-label',
          y_align: Clutter.ActorAlign.CENTER,
        })
  • privacy/privacyPanel.js:32
    this._panelMotionController = new Clutter.MotionController()

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

  • clipboard/clipboardItem.js:38
          this._actions = new St.BoxLayout({
            orientation: Clutter.Orientation.HORIZONTAL,
            y_align: Clutter.ActorAlign.START,
            style_class: 'aurora-clipboard-item-actions',
          })
  • desktop/trayIcons/trayContainer.js:107
          this._scrollController = new Clutter.ScrollController({
            flags:
              Clutter.ScrollControllerFlags.SCROLL_HORIZONTAL |
              Clutter.ScrollControllerFlags.SCROLL_VERTICAL,
          })
  • dock/externalStorageIcon.js:25
          this.toggleButton = new St.Button({
            style_class: 'show-apps',
            track_hover: true,
            can_focus: true,
            reactive: true,
          })
  • dock/trashIcon.js:32
          this.toggleButton = new St.Button({
            style_class: 'show-apps',
            track_hover: true,
            can_focus: true,
            reactive: true,
          })
  • panel/clock/calendarReminders/calendarRemindersPill.js:29
        this._label = new St.Label({
          style_class: 'clock-label aurora-calendar-reminders-label',
          y_align: Clutter.ActorAlign.CENTER,
        })
  • panel/clock/calendarReminders/calendarRemindersPill.js:21
        this._widget = new St.BoxLayout({
          style_class: 'aurora-calendar-reminders-widget',
          y_align: Clutter.ActorAlign.CENTER,
          y_expand: true,
          visible: false,
          opacity: 0,
          reactive: false,
        })

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

  • capture/captureOcrSession.js:31
    this._scope.connect(_settings, `changed::${OCR_ENABLED_KEY}`, () => this.syncButton(false))
  • capture/captureTools.js:229
    entry.clutter_text.connect('activate', () => this._commitText(true))
  • capture/captureTools.js:238
    entry.clutter_text.connect('key-focus-out', () => this._commitText(true))
  • capture/captureTools.js:123
    scope.connect(ui, 'closed', () => this._resetSession())
  • capture/captureTools.js:125
    scope.connect(button, 'notify::checked', () => this._syncVisibility())
  • capture/captureTools.js:127
        scope.connect(ui._castButton, 'notify::checked', () => {
          if (ui._castButton.checked) ui._showPointerButton.checked = true;
        })
  • capture/captureTools.js:131
    scope.connect(button, 'notify::checked', () => ocr.clear())
  • capture/captureTools.js:133
        scope.connect(ui._selectionButton, 'notify::checked', () => {
          toolbarPositioner.sync(this._portalMode);
        })
  • capture/captureTools.js:136
        scope.connect(ui._areaSelector, 'drag-started', () => {
          ocr.clear();
          this._setInteractionState('selection');
        })
  • capture/captureTools.js:140
        scope.connect(ui._areaSelector, 'drag-ended', () => {
          this._setInteractionState('idle');
          toolbarPositioner.sync(this._portalMode);
        })
  • capture/captureTools.js:145
    scope.connect(toolbar, signal, () => toolbarPositioner.sync(this._portalMode))
  • clipboard/clipboardHistory.js:77
        lifecycle.connect(rawSettings, 'changed::clipboard-history-poll-interval', () => {
          monitor.setInterval(rawSettings.get_int('clipboard-history-poll-interval'));
        })
  • clipboard/clipboardPanel.js:36
          this._lifecycle.connect(this, 'notify::mapped', () =>
            this._unredirectInhibitor.setInhibited(this.mapped),
          )
  • desktop/trayIcons/trayContainer.js:112
          this._scrollController.connect('scroll', (_controller, _sprite, source, dx, dy) =>
            this._onScroll(source, dx, dy),
          )
  • desktop/trayIcons/trayIcons.js:100
        this._lifecycle.connect(settings, 'changed::tray-icons-icon-size', () => {
          this._container?.setIconSize(settings.get_int('tray-icons-icon-size'));
        })
  • desktop/trayIcons/trayIcons.js:103
        this._lifecycle.connect(settings, 'changed::tray-icons-attention-timeout', () => {
          this._container?.setAttentionTimeout(settings.get_int('tray-icons-attention-timeout'));
        })
  • desktop/trayIcons/trayIcons.js:106
        this._lifecycle.connect(settings, 'changed::tray-icons-dedup-bg-apps', () => {
          this._dedupBgApps = settings.get_boolean('tray-icons-dedup-bg-apps');
          if (this._dedupBgApps) {
            for (const [appId, entry] of [...this._bgItemAppIds]) {
              this._sniCoversApp(appId, entry.app)
  • desktop/trayIcons/trayIcons.js:125
        this._lifecycle.connect(settings, 'changed::tray-icons-hide-bg-quick-settings', () => {
          if (settings.get_boolean('tray-icons-hide-bg-quick-settings')) {
            this._hideBgAppsQuickSettings();
          } else {
            this._restoreBgAppsQuickSettings();
          }
        })
  • desktop/trayIcons/trayIcons.js:132
        this._lifecycle.connect(settings, 'changed::tray-icons-recolor-symbolic-pixmaps', () => {
          logger.debug(
            `Recolor symbolic SNI pixmaps=${settings.get_boolean('tray-icons-recolor-symbolic-pixmaps')}; refreshing SNI icons`,
            { prefix: LOG_PREFIX },
          );
          this._sniHost?
  • desktop/trayIcons/trayIcons.js:77
        this._lifecycle.connect(desktopSettings, 'changed::color-scheme', () => {
          const scheme = desktopSettings.getString('color-scheme');
          logger.debug(`Color scheme changed to ${scheme}; refreshing SNI icons`, {
            prefix: LOG_PREFIX,
          });
          sniHost.refreshIcons('color-scheme
  • desktop/trayIcons/trayIcons.js:97
        this._lifecycle.connect(settings, 'changed::tray-icons-limit', () => {
          this._container?.setLimit(settings.get_int('tray-icons-limit'));
        })
  • panel/auroraMenu.js:104
    this._lifecycle.connect(settings, `changed::${MENU_ICON_KEY}`, () => this._syncPanelIcon())
  • panel/auroraMenu.js:105
    this._lifecycle.connect(settings, `changed::${APP_STORE_COMMAND_KEY}`, rebuildMenu)
  • panel/auroraMenu.js:106
    this._lifecycle.connect(settings, `changed::${CUSTOM_ITEMS_KEY}`, rebuildMenu)
  • panel/auroraMenu.js:107
    this._lifecycle.connect(settings, `changed::${CUSTOM_ENABLED_KEY}`, rebuildMenu)
  • panel/auroraMenu.js:108
    this._lifecycle.connect(settings, `changed::${CUSTOM_LABEL_KEY}`, rebuildMenu)
  • panel/auroraMenu.js:109
    this._lifecycle.connect(settings, `changed::${CUSTOM_COMMAND_KEY}`, rebuildMenu)
  • panel/auroraMenu.js:110
    this._lifecycle.connect(settings, `changed::${SHOW_ABOUT_KEY}`, rebuildMenu)
  • panel/auroraMenu.js:111
    this._lifecycle.connect(settings, `changed::${SHOW_HOME_KEY}`, rebuildMenu)
  • panel/auroraMenu.js:112
    this._lifecycle.connect(settings, `changed::${SHOW_DOWNLOADS_KEY}`, rebuildMenu)
  • panel/auroraMenu.js:113
    this._lifecycle.connect(settings, `changed::${SHOW_RECENT_KEY}`, rebuildMenu)
  • panel/auroraMenu.js:114
    this._lifecycle.connect(settings, `changed::${SHOW_SETTINGS_KEY}`, rebuildMenu)
  • panel/auroraMenu.js:115
    this._lifecycle.connect(settings, `changed::${SHOW_SOFTWARE_KEY}`, rebuildMenu)
  • panel/auroraMenu.js:116
    this._lifecycle.connect(settings, `changed::${SHOW_EXTENSIONS_KEY}`, rebuildMenu)
  • panel/auroraMenu.js:117
        this._lifecycle.connect(settings, `changed::${HIDE_ACTIVITIES_KEY}`, () =>
          this._syncActivitiesButton(),
        )
  • panel/bluetoothMenu/deviceItem.js:61
        this._lifecycle.connect(item._spinner, 'notify::visible', () => {
          if (item._spinner.visible) {
            this._updateStateIcon();
            this._updateBatteryLabel();
          } else {
            this._scheduleUpdate();
          }
        })
  • panel/bluetoothMenu/deviceItem.js:72
        this._lifecycle.connect(item._device, 'notify::battery-percentage', () => {
          this._updateBatteryLabel();
        })
  • panel/bluetoothMenu/deviceItem.js:75
        this._lifecycle.connect(item._device, 'notify::connected', () => {
          this._updateBatteryLabel();
          this._updateStateIcon();
        })
  • panel/clock/calendarReminders/calendarReminders.js:89
        lifecycle.connect(settings, `changed::${ALERTS_ENABLED_KEY}`, () =>
          this._syncReminderBackend(),
        )
  • panel/clock/calendarReminders/calendarReminders.js:92
        lifecycle.connect(settings, `changed::${FORCE_REMINDERS_KEY}`, () =>
          this._syncStartReminders(),
        )
  • panel/clock/calendarReminders/calendarReminders.js:95
        lifecycle.connect(settings, `changed::${PANEL_REVEAL_INTERVAL_MINUTES_KEY}`, () =>
          this._schedulePanelRevealTimer(),
        )
  • panel/clock/calendarReminders/calendarReminders.js:98
    lifecycle.connect(settings, `changed::${PANEL_LOOKAHEAD_MINUTES_KEY}`, () => this._render())
  • panel/clock/calendarReminders/calendarReminders.js:99
        lifecycle.connect(settings, `changed::${EXCLUDE_ALL_DAY_KEY}`, () => {
          this._render();
        })
  • panel/clock/weatherClock/weatherClock.js:159
    this._lifecycle.connect(this._weatherClient, 'changed', () => this._onWeatherChanged())
  • panel/clock/weatherClock/weatherClock.js:160
        this._lifecycle.connect(this._weatherClient, 'notify::available', () =>
          this._onWeatherChanged(),
        )
  • panel/clock/weatherClock/weatherClock.js:164
          this._lifecycle.connect(this._monitor, 'notify::connectivity', () =>
            this._onConnectivityChanged(),
          )
  • panel/clock/weatherClock/weatherClock.js:50
          this._lifecycle.connect(this._gweatherSettings, `changed::${TEMPERATURE_UNIT_KEY}`, () =>
            this._onWeatherChanged(),
          )
  • panel/clock/weatherClock/weatherClock.js:56
        this._lifecycle.connect(this.context.settings, `changed::${AFTER_CLOCK_KEY}`, () =>
          this._registerClockWidget(),
        )
  • panel/lockKeyIndicators.js:42
    this._lifecycle.connect(this._keymap, 'state-changed', () => this._sync())
  • panel/lowBatteryPercentage.js:35
    this._lifecycle.connect(this._proxy, 'g-properties-changed', () => this._sync())
  • panel/volumeMixer/streamSlider.js:34
          this._lifecycle.connect(this, 'icon-clicked', () => {
            if (!this._stream) return;
            this._stream.change_is_muted(!this._stream.is_muted);
          })
  • panel/volumeMixer/streamSlider.js:42
          this._lifecycle.connect(this.slider, 'drag-begin', () => {
            this._inDrag = true;
          })
  • panel/volumeMixer/streamSlider.js:45
          this._lifecycle.connect(this.slider, 'drag-end', () => {
            this._inDrag = false;
          })
  • panel/volumeMixer/streamSlider.js:39
          this._sliderChangedId = this._lifecycle.connect(this.slider, 'notify::value', () =>
            this._sliderChanged(),
          )
  • panel/volumeMixer/volumeMixer.js:102
    this._lifecycle.connect(this._panel, 'notify::should-show', syncToggleVisibility)
  • panel/volumeMixer/volumeMixer.js:103
        this._lifecycle.connect(
          this.context.settings,
          `changed::${ALWAYS_SHOW_KEY}`,
          syncToggleVisibility,
        )
  • patches/appSearchTooltip.js:38
    this._lifecycle.connect(Main.overview, 'hiding', () => this._hideTooltip())
  • privacy/privacy.js:24
    this._lifecycle.connect(settings, `changed::${DND_KEY}`, () => this._applyDnd())
  • privacy/privacy.js:25
    this._lifecycle.connect(settings, `changed::${PANEL_KEY}`, () => this._applyPanel())
  • privacy/privacyPanel.js:33
    this._panelMotionController.connect('enter', () => this._onPanelEnter())
  • privacy/privacyPanel.js:34
    this._panelMotionController.connect('leave', () => this._onPanelLeave())
  • theme/autoThemeSwitcher.js:29
    this._lifecycle.connect(settings, `changed::${LIGHT_HOURS_KEY}`, () => this._tick())
  • theme/autoThemeSwitcher.js:30
    this._lifecycle.connect(settings, `changed::${LIGHT_MINUTES_KEY}`, () => this._tick())
  • theme/autoThemeSwitcher.js:31
    this._lifecycle.connect(settings, `changed::${DARK_HOURS_KEY}`, () => this._tick())
  • theme/autoThemeSwitcher.js:32
    this._lifecycle.connect(settings, `changed::${DARK_MINUTES_KEY}`, () => this._tick())
  • theme/themeChanger.js:22
        this._lifecycle.connect(this._settings, 'changed::color-scheme', () => {
          this._onColorSchemeChanged();
        })

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=['51']

All Versions

Version Status
51 (35) Active
51 (34) Rejected
51 (33) Rejected
50.13 (32) Active
50.12 (31) Active
50.12 (30) Rejected
50.11 (29) Active
50.11 (28) Rejected
50.10 (27) Rejected
50.9 (26) Active
50.8 (25) Active
50.6 (24) Active
50.5 (23) Rejected
50.4 (22) Rejected
50.2 (21) Rejected
50.3 (20) Rejected
50.2 (19) Rejected
18 Rejected
17 Active
16 Active
15 Rejected
14 Rejected
13 Rejected
12 Rejected
11 Rejected
10 Active
9 Rejected
8 Active
7 Rejected
6 Active
5 Active
4 Rejected
3 Rejected
2 Rejected
1 Rejected

Previous Reviews on this Version

JustPerfection rejected
Need to call clear on disable (line 56, 74 and 80 `panel/clock/calendarReminders/calendarReminders.js`).
leandromqrs posted a review
Thanks for the fast review! I will fix this soon and upload a new version :)