From 189932f6cbdc3fa971a9a53e2e7cd068d94a096e Mon Sep 17 00:00:00 2001 From: Moriel Schottlender Date: Fri, 10 Feb 2017 17:44:36 -0800 Subject: [PATCH] RCFilters UI: Destroy CapsuleItemWidget when it is removed The widget is recreated when an item is reinserted, so we should clean up the external elements it creates (like the popup) and disconnect from events. Bug: T157852 Change-Id: I8e6eaac7b1a3062d156d4c0b5b912d1a6bfae7de --- .../ui/mw.rcfilters.ui.CapsuleItemWidget.js | 12 ++++++++++++ ...filters.ui.FilterCapsuleMultiselectWidget.js | 17 +++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js index 525f7186ac..40d31c54a3 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js @@ -107,4 +107,16 @@ mw.rcfilters.ui.CapsuleItemWidget.prototype.onCapsuleRemovedByUser = function () { this.controller.updateFilter( this.model.getName(), false ); }; + + /** + * Remove and destroy external elements of this widget + */ + mw.rcfilters.ui.CapsuleItemWidget.prototype.destroy = function () { + // Destroy the popup + this.popup.$element.detach(); + + // Disconnect events + this.model.disconnect( this ); + this.closeButton.disconnect( this ); + }; }( mediaWiki, jQuery ) ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js index 56303d5d07..9bb1a98d79 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js @@ -230,4 +230,21 @@ this.menu.selectItem(); this.menu.highlightItem(); }; + + /** + * @inheritdoc + */ + mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.removeItems = function ( items ) { + // Parent call + mw.rcfilters.ui.FilterCapsuleMultiselectWidget.parent.prototype.removeItems.call( this, items ); + + // Destroy the item widget when it is removed + // This is done because we re-add items by recreating them, rather than hiding them + // and items include popups, that will just continue to be created and appended + // unnecessarily. + items.forEach( function ( widget ) { + widget.destroy(); + } ); + }; + }( mediaWiki, jQuery ) ); -- 2.20.1