Review of "Orrery" version 1.3.1 (2)

Details Page Preview

A live, OLED-black solar system as your wallpaper: planets in their real positions, spinning at their relative speeds, with the spacecraft of the space age replaying their gravity-assist journeys and fact cards about distances, speeds and the worlds themselves. Moons, asteroids, comets and Lagrange points, planned missions into the 2030s, ambient music, and the overview shows it too. Click anything to pin a card, scrub through history on the timeline, and switch to a sunlight view.

Extension Homepage
https://github.com/fqazzazee/orrery

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

Shexli found 7 issues that may need reviewer attention.

EGO-C49-004 error

extensions targeting GNOME 49 must not call Meta.Window.get_maximized

This extension explicitly targets GNOME Shell 49 but still calls removed `Meta.Window.get_maximized()`.

Meta.Window

  • extension.js:2807
    w.get_maximized()

EGO-A-001 manual_review

extension code must not be minified or obfuscated

File appears obfuscated: 55% of identifiers are 1–2 characters (avg length 3.2).

Code must not be obfuscated

  • lib/focus.js
    short identifier ratio: 55%, identifiers scored: 745

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

  • extension.js:121
    this.area = new St.DrawingArea({visible: false})
  • extension.js:1027
            this._backButton = new St.Button({style_class: 'orrery-pill orrery-back', label: '‹  Back to the solar system',
                can_focus: false, visible: false})
  • extension.js:204
    this._backdrop = new St.DrawingArea()
  • extension.js:199
    this._content = new Clutter.Actor()
  • extension.js:217
    this._craftLayer = new Clutter.Actor()
  • extension.js:960
    this._dateBox = new St.BoxLayout({style_class: 'orrery-datebox', orientation: Clutter.Orientation.VERTICAL})
  • extension.js:221
    this._focusLayer = new Clutter.Actor()
  • extension.js:223
    this._hud = new Clutter.Actor()
  • extension.js:218
    this._labels = new Clutter.Actor()
  • extension.js:971
    this._legend = new St.BoxLayout({style_class: 'orrery-legend', orientation: Clutter.Orientation.VERTICAL, visible: false})
  • extension.js:974
    this._legendBar = new St.DrawingArea({width: 200, height: 9})
  • extension.js:216
    this._markerLayer = new Clutter.Actor()
  • extension.js:965
    this._missionBox = new St.BoxLayout({style_class: 'orrery-missions', orientation: Clutter.Orientation.VERTICAL})
  • extension.js:214
    this._smallLayer = new Clutter.Actor()
  • extension.js:208
    this._sunLayer = new Clutter.Actor()
  • extension.js:202
    this._system = new Clutter.Actor()
  • extension.js:215
    this._world = new Clutter.Actor()

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:93
    this.area = new St.DrawingArea({width: size, height: size})
  • extension.js:121
    this.area = new St.DrawingArea({visible: false})
  • extension.js:1027
            this._backButton = new St.Button({style_class: 'orrery-pill orrery-back', label: '‹  Back to the solar system',
                can_focus: false, visible: false})
  • extension.js:204
    this._backdrop = new St.DrawingArea()
  • extension.js:199
    this._content = new Clutter.Actor()
  • extension.js:217
    this._craftLayer = new Clutter.Actor()
  • extension.js:960
    this._dateBox = new St.BoxLayout({style_class: 'orrery-datebox', orientation: Clutter.Orientation.VERTICAL})
  • extension.js:221
    this._focusLayer = new Clutter.Actor()
  • extension.js:223
    this._hud = new Clutter.Actor()
  • extension.js:218
    this._labels = new Clutter.Actor()
  • extension.js:971
    this._legend = new St.BoxLayout({style_class: 'orrery-legend', orientation: Clutter.Orientation.VERTICAL, visible: false})
  • extension.js:974
    this._legendBar = new St.DrawingArea({width: 200, height: 9})
  • extension.js:216
    this._markerLayer = new Clutter.Actor()
  • extension.js:965
    this._missionBox = new St.BoxLayout({style_class: 'orrery-missions', orientation: Clutter.Orientation.VERTICAL})
  • extension.js:214
    this._smallLayer = new Clutter.Actor()
  • extension.js:208
    this._sunLayer = new Clutter.Actor()
  • extension.js:202
    this._system = new Clutter.Actor()
  • extension.js:215
    this._world = new Clutter.Actor()
  • extension.js:198
    this.actor = new St.Widget({style_class: 'orrery', reactive: false, clip_to_allocation: true})

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:94
            this.area.connect('repaint', area => {
                const cr = area.get_context();
                paint(cr, size);
                cr.$dispose();
            })
  • extension.js:124
            this.area.connect('repaint', area => {
                const cr = area.get_context();
                cr.translate(-this._origin[0], -this._origin[1]);
                this._paint?.(cr);
                cr.$dispose();
            })
  • extension.js:1029
            this._backButton.connect('clicked', () => {
                if (this._focus)
                    this._leaveFocus();
                else
                    this._zoomTarget = 0;
                this._syncTimelineState();
            })
  • extension.js:205
    this._backdrop.connect('repaint', area => this._paintBackdrop(area))
  • extension.js:975
            this._legendBar.connect('repaint', area => {
                const cr = area.get_context();
                R.drawSunlightLegend(cr, ...area.get_surface_size(), marks);
                cr.$dispose();
            })
  • extension.js:1010
            this._timeline.actor.connect('enter-event', () => {
                this._setHover(null);
                return Clutter.EVENT_PROPAGATE;
            })
  • extension.js:2203
            this.actor.connect('button-press-event', (_a, event) => {
                if (!own(event))
                    return Clutter.EVENT_PROPAGATE;
                this._press = event.get_coords();
                if (event.get_button() === Clutter.BUTTON_SECONDARY)
                    this._openBackgroundMenu(...th
  • extension.js:2211
            this.actor.connect('button-release-event', (_a, event) => {
                if (!own(event))
                    return Clutter.EVENT_PROPAGATE;
                const [sx, sy] = event.get_coords();
                if (event.get_button() !== Clutter.BUTTON_PRIMARY || !this._press ||
                    Math.hypo
  • extension.js:2197
            this.actor.connect('leave-event', () => {
                this._setHover(null);
                return Clutter.EVENT_PROPAGATE;
            })
  • extension.js:2188
            this.actor.connect('motion-event', (_a, event) => {
                const [sx, sy] = event.get_coords();
                const [, x, y] = this.actor.transform_stage_point(sx, sy);
                this._activity();
                // Over a card or the timeline, nothing in the scene is hovered.
                c
  • extension.js:2238
            this.actor.connect('scroll-event', (_a, event) => {
                if (!own(event) || !this._interactive())
                    return Clutter.EVENT_PROPAGATE;
                const dir = event.get_scroll_direction();
                let steps = 0;
                if (dir === Clutter.ScrollDirection.UP)
          
  • extension.js:1246
    row.box.connect('clicked', () => this._select({tr}, {toggle: true}))
  • extension.js:1247
    row.box.connect('notify::hover', () => this._setHover(row.box.hover ? {tr} : null, {fromList: true}))

EGO-L-004 warning

main loop sources should be removed in disable()

Main loop sources assigned in `enable()` are missing matching removals in `disable()` or its helper methods.

Remove main loop sources

  • extension.js:2611
            this._raiseId = GLib.idle_add(GLib.PRIORITY_LOW, () => {
                this._raiseId = 0;
                if (this._scene)
                    Main.layoutManager._backgroundGroup.set_child_above_sibling(this._scene.actor, null);
                return GLib.SOURCE_REMOVE;
            })
  • extension.js:2677
            this._recheckId = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
                this._recheckId = 0;
                if (this._check())
                    this._schedule();
                return GLib.SOURCE_REMOVE;
            })
  • extension.js:2623
            this._relayoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 120, () => {
                this._relayoutId = 0;
                this._relayout();
                return GLib.SOURCE_REMOVE;
            })

EGO-L-006 warning

preferences classes should not retain window-scoped objects on instance fields without close-request cleanup

Preferences code stores window-scoped objects on the exported prefs class without `close-request` cleanup.

Destroy all objects

  • prefs.js:12
    this._settings = this.getSettings()

All Versions

Version Status
1.3.2 (3) Unreviewed
1.3.1 (2) Rejected
1.3.0 (1) Rejected

Previous Reviews on this Version

fqazzazee auto- rejected
Auto-rejected because of new version 1.3.2 (3) was uploaded