Review of "Spotify Widgets" version 1

Details Page Preview

Adds a Spotify panel widget, customizable desktop widgets, and optional Spotify ad muting.

Extension Homepage
https://github.com/Rubikexe/Spotify-widgets

No comments.

FAQ

Files

Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.

Shexli (experimental) warning 4

Shexli found 4 issues that may need reviewer attention.

EGO-P-006 warning

unnecessary build and translation artifacts should not be shipped

Package contains files that often should not be shipped for review.

Don't include unnecessary files

  • locale/pl/LC_MESSAGES/spotify-widgets@rubik.po
    locale/pl/LC_MESSAGES/spotify-widgets@rubik.po

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:4125
    this.settings = this.getSettings()

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:2572
                actor.connect('button-press-event', (actor, event) => {
                    if (event.get_button() !== 1 || state.locked)
                        return Clutter.EVENT_PROPAGATE;
    
                    let source = event.get_source?.() || null;
    
                    while (source) {
                        if (
  • extension.js:2615
                actor.connect('button-release-event', () => {
                    if (!state.dragging)
                        return Clutter.EVENT_PROPAGATE;
    
                    state.dragging = false;
                    let [x, y] = actor.get_position();
                    this._updateDesktopWidgetConfig(config.id, {
    
  • extension.js:1433
                actor.connect("destroy", () => {
                    this._backgroundActors.delete(actor);
                })
  • extension.js:2595
                actor.connect('motion-event', (actor, event) => {
                    if (!state.dragging)
                        return Clutter.EVENT_PROPAGATE;
    
                    let eventState = event.get_state();
    
                    if (!(eventState & Clutter.ModifierType.BUTTON1_MASK)) {
                        st
  • extension.js:3538
                    btn.connect('button-press-event', () => {
                        btn.ease({
                            scale_x: 1.2,
                            scale_y: 1.2,
                            duration: 140,
                            mode: Clutter.AnimationMode.EASE_OUT_QUAD
                        });
    
         
  • extension.js:3548
                    btn.connect('button-release-event', () => {
                        resetScale();
                        return Clutter.EVENT_PROPAGATE;
                    })
  • extension.js:3552
    btn.connect('clicked', resetScale)
  • extension.js:3510
                    btn.connect('enter-event', () => {
                        bg.ease({
                            opacity: 255,
                            duration: 150,
                            mode: Clutter.AnimationMode.EASE_OUT_QUAD
                        });
                    })
  • extension.js:3517
                    btn.connect('leave-event', () => {
                        bg.ease({
                            opacity: 0,
                            duration: 150,
                            mode: Clutter.AnimationMode.EASE_OUT_QUAD
                        });
                    })
  • extension.js:3553
    btn.connect('leave-event', resetScale)
  • extension.js:2553
                state.progressBar.connect('button-press-event', (actor, event) => {
                    this._beginMultiSeek(event, state);
    
                    return Clutter.EVENT_STOP;
                })
  • extension.js:2263
                    compact.button.connect('button-release-event', (actor, event) => {
                        if (event.get_button() !== 1)
                            return Clutter.EVENT_PROPAGATE;
    
                        actor.remove_all_transitions();
                        actor.set_scale(1, 1);
    
                  
  • extension.js:2559
                state.progressBar.connect('button-release-event', (actor, event) => {
                    this._finishMultiSeek(event);
    
                    return Clutter.EVENT_STOP;
                })
  • extension.js:2523
                state.progressBar.connect('enter-event', (actor, event) => {
                    if (state.progressThumb)
                        state.progressThumb.visible = true;
                    if (state.progressTooltip)
                        state.progressTooltip.visible = true;
                    this._updateM
  • extension.js:2532
                state.progressBar.connect('leave-event', () => {
                    if (this._multiSeekingState === state)
                        return Clutter.EVENT_PROPAGATE;
    
                    if (state.progressThumb)
                        state.progressThumb.visible = false;
                    if (state.progres
  • extension.js:2544
                state.progressBar.connect('motion-event', (actor, event) => {
                    if (this._multiSeekingState === state)
                        this._updateMultiSeekDrag(event);
                    else
                        this._updateMultiProgressTooltip(event, state);
    
                    return Clut
  • extension.js:2032
            state.lyricsViewport.connect('scroll-event', (actor, event) => {
                let direction = event.get_scroll_direction();
                let delta = 0;
    
                if (direction === Clutter.ScrollDirection.DOWN)
                    delta = 36;
                else if (direction === Clutter.ScrollDire

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:678
    this.settings = this.getSettings()

All Versions

Version Status
3 Unreviewed
2 Rejected
1 Rejected

Previous Reviews on this Version

Rubik auto- rejected
Auto-rejected because of new version 2 was uploaded