From 95dcc971b093b3b27e6572041561d7fdbd3d87d2 Mon Sep 17 00:00:00 2001 From: Gilles Dubuc Date: Wed, 24 Jun 2015 20:54:22 +0200 Subject: [PATCH] Reduce number of RL modules in MultimediaViewer Having many modules makes the startup module in the head unnecessarily longer. Things should only be in their own module if they're going to be loaded on demand on their own or are a shared dependency of separate modules that are. This change brings down the amount of modules declared by Media Viewer from 53 to 8. The ones that remain are mostly things loaded on demand. Bug: T103706 Change-Id: I5b0d29209599285b93217e96def818e641646c73 --- MultimediaViewer.php | 875 ++++-------------- MultimediaViewerHooks.php | 7 +- resources/mmv/mmv.head.js | 2 +- resources/mmv/mmv.js | 2 +- resources/mmv/ui/mmv.ui.reuse.dialog.js | 3 +- tests/qunit/mmv/mmv.lightboxinterface.test.js | 8 +- tests/qunit/mmv/mmv.test.js | 12 + tests/qunit/mmv/ui/mmv.ui.permission.test.js | 23 +- 8 files changed, 194 insertions(+), 738 deletions(-) diff --git a/MultimediaViewer.php b/MultimediaViewer.php index 41af5a7e9..f17f5b1f5 100644 --- a/MultimediaViewer.php +++ b/MultimediaViewer.php @@ -138,173 +138,29 @@ $wgMediaViewerResourceTemplate = array( ); $wgResourceModules += array( - 'mmv.lightboximage' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/mmv.lightboximage.js', - ), - - 'dependencies' => array( - 'mmv.base', - ), - ), - - 'mmv.lightboxinterface' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/mmv.lightboxinterface.js', - ), - - 'styles' => array( - 'mmv/mmv.lightboxinterface.less', - ), - - 'dependencies' => array( - 'mmv.base', - 'mmv.logging.ActionLogger', - 'mmv.ui', - 'mmv.ui.canvas', - 'mmv.ui.canvasButtons', - 'mmv.ui.description', - 'mmv.ui.download.dialog', - 'mmv.ui.metadataPanel', - 'mmv.ui.reuse.dialog', - 'mmv.ui.viewingOptions', - ), - - 'messages' => array( - 'multimediaviewer-close-popup-text', - 'multimediaviewer-fullscreen-popup-text', - 'multimediaviewer-defullscreen-popup-text', - ), - ), - - 'mmv.ThumbnailWidthCalculator' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/mmv.ThumbnailWidthCalculator.js', - ), - - 'dependencies' => array( - 'jquery.hidpi', - 'mmv.base', - 'mmv.model.ThumbnailWidth', - ), - ), - - 'mmv.HtmlUtils' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/mmv.HtmlUtils.js', - ), - - 'dependencies' => array( - 'mmv.base', - ), - ), - - 'mmv.model' => $wgMediaViewerResourceTemplate + array( + // Loaded on demand by mmv.bootstrap.js + 'mmv' => $wgMediaViewerResourceTemplate + array( 'scripts' => array( + 'mmv/logging/mmv.logging.Api.js', + 'mmv/logging/mmv.logging.AttributionLogger.js', + 'mmv/logging/mmv.logging.DimensionLogger.js', + 'mmv/logging/mmv.logging.ViewLogger.js', + 'mmv/logging/mmv.logging.PerformanceLogger.js', + 'mmv/routing/mmv.routing.js', + 'mmv/routing/mmv.routing.Route.js', + 'mmv/routing/mmv.routing.ThumbnailRoute.js', + 'mmv/routing/mmv.routing.MainFileRoute.js', + 'mmv/routing/mmv.routing.Router.js', 'mmv/model/mmv.model.js', - ), - - 'dependencies' => array( - 'mmv.base', - 'oojs', - ), - ), - - 'mmv.model.IwTitle' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( 'mmv/model/mmv.model.IwTitle.js', - ), - - 'dependencies' => array( - 'mmv.model', - ), - ), - - 'mmv.model.EmbedFileInfo' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/model/mmv.model.EmbedFileInfo.js', - ), - - 'dependencies' => array( - 'mmv.model', - ), - ), - - 'mmv.model.License' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( 'mmv/model/mmv.model.License.js', - ), - - 'dependencies' => array( - 'mmv.model', - 'mmv.HtmlUtils', - ), - ), - - 'mmv.model.Image' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( 'mmv/model/mmv.model.Image.js', - ), - - 'dependencies' => array( - 'mmv.model', - 'mmv.model.License', - ), - ), - - 'mmv.model.Repo' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( 'mmv/model/mmv.model.Repo.js', - ), - - 'dependencies' => array( - 'mmv.model', - 'oojs', - ), - ), - - 'mmv.model.Thumbnail' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( 'mmv/model/mmv.model.Thumbnail.js', - ), - - 'dependencies' => array( - 'mmv.model', - ), - ), - - 'mmv.model.ThumbnailWidth' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/model/mmv.model.ThumbnailWidth.js', - ), - - 'dependencies' => array( - 'mmv.model', - ), - ), - - 'mmv.model.User' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( 'mmv/model/mmv.model.User.js', - ), - - 'dependencies' => array( - 'mmv.model', - ), - ), - - 'mmv.model.TaskQueue' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( 'mmv/model/mmv.model.TaskQueue.js', - ), - - 'dependencies' => array( - 'mmv.model', - ), - ), - - 'mmv.provider' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( + 'mmv/model/mmv.model.ThumbnailWidth.js', + 'mmv/mmv.lightboximage.js', 'mmv/provider/mmv.provider.Api.js', 'mmv/provider/mmv.provider.ImageInfo.js', 'mmv/provider/mmv.provider.FileRepoInfo.js', @@ -312,295 +168,111 @@ $wgResourceModules += array( 'mmv/provider/mmv.provider.GuessedThumbnailInfo.js', 'mmv/provider/mmv.provider.UserInfo.js', 'mmv/provider/mmv.provider.Image.js', - ), - - 'dependencies' => array( - 'mediawiki.Title', - 'mediawiki.Uri', - 'mmv.model', - 'mmv.model.IwTitle', - 'mmv.model.Image', - 'mmv.model.Repo', - 'mmv.model.Thumbnail', - 'mmv.model.User', - 'mmv.logging.PerformanceLogger', - 'oojs', - ), - ), - - 'mmv.routing' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/routing/mmv.routing.js', - 'mmv/routing/mmv.routing.Route.js', - 'mmv/routing/mmv.routing.ThumbnailRoute.js', - 'mmv/routing/mmv.routing.MainFileRoute.js', - 'mmv/routing/mmv.routing.Router.js', - ), - - 'dependencies' => array( - 'mediawiki.Title', - 'oojs', - ), - ), - - 'mmv.base' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/mmv.base.js', - ), - ), - - 'mmv.ui' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( + 'mmv/mmv.ThumbnailWidthCalculator.js', 'mmv/ui/mmv.ui.js', - ), - - 'dependencies' => array( - 'mmv.base', - 'mmv.logging.ActionLogger', - ), - ), - - 'mmv.ui.canvas' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/ui/mmv.ui.canvas.js', - ), - - 'styles' => array( - 'mmv/ui/mmv.ui.canvas.less', - ), - - 'messages' => array( - 'multimediaviewer-thumbnail-error', - 'multimediaviewer-thumbnail-error-description', - 'multimediaviewer-thumbnail-error-retry', - 'multimediaviewer-report-issue-url', - ), - - 'dependencies' => array( - 'mmv.ui', - 'mmv.ThumbnailWidthCalculator', - 'oojs', - ), - ), - - 'mmv.ui.dialog' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( 'mmv/ui/mmv.ui.dialog.js', + 'mmv/ui/mmv.ui.reuse.dialog.js', + 'mmv/ui/mmv.ui.download.js', + 'mmv/ui/mmv.ui.download.dialog.js', + 'mmv/ui/mmv.ui.description.js', + 'mmv/ui/mmv.ui.viewingOptions.js', + 'mmv/ui/mmv.ui.canvas.js', + 'mmv/ui/mmv.ui.canvasButtons.js', + 'mmv/ui/mmv.ui.permission.js', + 'mmv/ui/mmv.ui.progressBar.js', + 'mmv/ui/mmv.ui.stripeButtons.js', + 'mmv/ui/mmv.ui.truncatableTextField.js', + 'mmv/ui/mmv.ui.metadataPanel.js', + 'mmv/ui/mmv.ui.metadataPanelScroller.js', + 'mmv/mmv.lightboxinterface.js', + 'mmv/mmv.js', ), 'styles' => array( 'mmv/ui/mmv.ui.dialog.less', - ), - - 'dependencies' => array( - 'mmv.ui', - 'oojs', - ), - ), - - 'mmv.ui.download' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/ui/mmv.ui.download.js', - ), - - 'dependencies' => array( - 'mmv.ui', - ), - ), - - 'mmv.ui.download.dialog' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/ui/mmv.ui.download.dialog.js', - ), - - 'styles' => array( + 'mmv/ui/mmv.ui.reuse.dialog.less', 'mmv/ui/mmv.ui.download.dialog.less', - ), - - 'dependencies' => array( - 'mmv.logging.ActionLogger', - 'mmv.ui.dialog', - 'mmv.ui.download', - 'oojs', - ), - ), - - 'mmv.ui.download.pane' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/ui/mmv.ui.download.pane.js', - ), - - 'styles' => array( - 'mmv/ui/mmv.ui.download.pane.less', - ), - - 'dependencies' => array( - 'mediawiki.ui', - 'mediawiki.ui.button', - 'mmv.ui', - 'mmv.ui.download', - 'mmv.ui.utils', - 'mmv.embedFileFormatter', - 'mmv.logging.ActionLogger', - 'mmv.model.EmbedFileInfo', - 'oojs', - 'oojs-ui', - ), - - 'messages' => array( - 'multimediaviewer-download-preview-link-title', - 'multimediaviewer-download-original-button-name', - 'multimediaviewer-download-small-button-name', - 'multimediaviewer-download-medium-button-name', - 'multimediaviewer-download-large-button-name', - 'multimediaviewer-embed-dimensions', - 'multimediaviewer-embed-dimensions-with-file-format', - 'multimediaviewer-download-attribution-cta-header', - 'multimediaviewer-download-optional-attribution-cta-header', - 'multimediaviewer-download-attribution-cta', - 'multimediaviewer-attr-plain', - 'multimediaviewer-attr-html', - ), - ), - - 'mmv.ui.stripeButtons' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/ui/mmv.ui.stripeButtons.js', - ), - - 'styles' => array( - 'mmv/ui/mmv.ui.stripeButtons.less', - ), - - 'dependencies' => array( - 'mediawiki.jqueryMsg', - 'mmv.ui', - 'oojs', - 'jquery.tipsy', - 'jquery.throttle-debounce', - ), - - 'messages' => array( - 'multimediaviewer-description-page-button-text', - 'multimediaviewer-description-page-popup-text', - 'multimediaviewer-description-page-popup-text-local', - 'multimediaviewer-repository-local', - ), - ), - - 'mmv.ui.description' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/ui/mmv.ui.description.js', - ), - - 'dependencies' => array( - 'mmv.ui', - 'mmv.HtmlUtils', - 'oojs', - ), - ), - - 'mmv.ui.permission' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/ui/mmv.ui.permission.js', - ), - - 'styles' => array( + 'mmv/ui/mmv.ui.viewingOptions.less', + 'mmv/ui/mmv.ui.canvas.less', + 'mmv/ui/mmv.ui.canvasButtons.less', 'mmv/ui/mmv.ui.permission.less', - ), - - 'messages' => array( - 'multimediaviewer-permission-title', - 'multimediaviewer-permission-viewmore', - ), - - 'dependencies' => array( - 'jquery.color', - 'mediawiki.jqueryMsg', - 'mmv.logging.ActionLogger', - 'mmv.ui', - 'mmv.HtmlUtils', - 'oojs', - ), - ), - - 'mmv.ui.truncatableTextField' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/ui/mmv.ui.truncatableTextField.js', - ), - - 'styles' => array( + 'mmv/ui/mmv.ui.progressBar.less', + 'mmv/ui/mmv.ui.stripeButtons.less', 'mmv/ui/mmv.ui.truncatableTextField.less', - ), - - 'dependencies' => array( - 'mmv.HtmlUtils', - 'mmv.ui', - 'oojs', - ), - ), - - 'mmv.ui.progressBar' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/ui/mmv.ui.progressBar.js', - ), - - 'styles' => array( - 'mmv/ui/mmv.ui.progressBar.less', - ), - - 'dependencies' => array( - 'mmv.ui', - 'oojs', - ), - ), - - 'mmv.ui.metadataPanel' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/ui/mmv.ui.metadataPanel.js', - 'mmv/ui/mmv.ui.metadataPanelScroller.js', - ), - - 'styles' => array( 'mmv/ui/mmv.ui.metadataPanel.less', 'mmv/ui/mmv.ui.metadataPanelScroller.less', + 'mmv/mmv.lightboxinterface.less', + // Always make this one the last of the list (Bug 61852) + 'mmv/mmv.loaded.css', ), 'dependencies' => array( - 'mediawiki.user', - 'mmv.HtmlUtils', - 'mmv.logging.ActionLogger', - 'mmv.logging.AttributionLogger', - 'mmv.ui', - 'mmv.ui.progressBar', - 'mmv.ui.stripeButtons', - 'mmv.ui.description', - 'mmv.ui.permission', - 'mmv.ui.truncatableTextField', - 'oojs', - 'jquery.tipsy', + 'mediawiki.api', + 'mediawiki.Title', + 'mediawiki.Uri', 'mediawiki.jqueryMsg', + 'mediawiki.user', + 'oojs', + 'jquery.fullscreen', + 'jquery.hidpi', + 'jquery.throttle-debounce', + 'jquery.color', + 'jquery.tipsy', + 'mmv.bootstrap', // mmv.logging.Logger.js + 'mmv.head', // mmv.base.js ), 'messages' => array( - 'multimediaviewer-commons-subtitle', + 'multimediaviewer-file-page', + // messages that are gender-dependent (we need to check if they really depend on the gender): + 'multimediaviewer-userpage-link', + + // mmv.ui.viewingOptions.js + 'multimediaviewer-options-learn-more', + 'multimediaviewer-options-dialog-header', + 'multimediaviewer-option-header-viewer', + 'multimediaviewer-option-header-filepage', + 'multimediaviewer-option-desc-viewer', + 'multimediaviewer-option-desc-filepage', + 'multimediaviewer-option-submit-button', + 'multimediaviewer-option-cancel-button', + 'multimediaviewer-options-text-header', + 'multimediaviewer-enable-alert', + 'multimediaviewer-options-text-body', + 'multimediaviewer-disable-confirmation-header', + 'multimediaviewer-disable-confirmation-text', + 'multimediaviewer-enable-dialog-header', + 'multimediaviewer-enable-text-header', + 'multimediaviewer-enable-submit-button', + 'multimediaviewer-enable-confirmation-header', + 'multimediaviewer-enable-confirmation-text', + // mmv.ui.canvas.js + 'multimediaviewer-thumbnail-error', + 'multimediaviewer-thumbnail-error-description', + 'multimediaviewer-thumbnail-error-retry', + 'multimediaviewer-report-issue-url', + // mmv.ui.canvasButtons.js + 'multimediaviewer-download-link', + 'multimediaviewer-reuse-link', + 'multimediaviewer-options-tooltip', + // mmv.lightboxinterface.js + 'multimediaviewer-close-popup-text', + 'multimediaviewer-fullscreen-popup-text', + 'multimediaviewer-defullscreen-popup-text', + // mmv.ui.metadataPanel.js + 'multimediaviewer-commons-subtitle', 'multimediaviewer-credit', 'multimediaviewer-credit-fallback', 'multimediaviewer-multiple-authors', 'multimediaviewer-multiple-authors-combine', - 'multimediaviewer-userpage-link', - 'multimediaviewer-datetime-created', 'multimediaviewer-datetime-uploaded', - // for license messages see end of file 'multimediaviewer-permission-link', 'multimediaviewer-permission-link-hide', - 'multimediaviewer-restriction-trademarked', - 'multimediaviewer-geoloc-north', 'multimediaviewer-geoloc-east', 'multimediaviewer-geoloc-south', @@ -608,7 +280,6 @@ $wgResourceModules += array( 'multimediaviewer-geoloc-coord', 'multimediaviewer-geoloc-coords', 'multimediaviewer-geolocation', - 'multimediaviewer-about-mmv', 'multimediaviewer-discuss-mmv', 'multimediaviewer-help-mmv', @@ -618,29 +289,38 @@ $wgResourceModules += array( 'multimediaviewer-optin-pending-mmv', 'multimediaviewer-optout-help', 'multimediaviewer-optin-help', - // Reuse the preferences message in the top-right menu. 'mypreferences', - 'multimediaviewer-metadata-error', - 'multimediaviewer-title-popup-text', 'multimediaviewer-credit-popup-text', 'multimediaviewer-title-popup-text-more', 'multimediaviewer-credit-popup-text-more', + // mmv.ui.permission.js + 'multimediaviewer-permission-title', + 'multimediaviewer-permission-viewmore', + // mmv.ui.stripeButtons.js + 'multimediaviewer-description-page-button-text', + 'multimediaviewer-description-page-popup-text', + 'multimediaviewer-description-page-popup-text-local', + 'multimediaviewer-repository-local', ), ), - 'mmv.embedFileFormatter' => $wgMediaViewerResourceTemplate + array( + // Dependencies shared by mmv.ui.reuse.shareembed and mmv.ui.download.pane + // Both of which are loaded on demand + 'mmv.ui.ondemandshareddependencies' => $wgMediaViewerResourceTemplate + array( 'scripts' => array( + 'mmv/model/mmv.model.EmbedFileInfo.js', 'mmv/mmv.EmbedFileFormatter.js', + 'mmv/ui/mmv.ui.utils.js', ), 'dependencies' => array( - 'mmv.base', - 'mmv.routing', + 'mmv.head', // mmv/mmv.base.js + 'mmv', // mmv/ui/mmv.ui.js 'oojs', - 'mmv.HtmlUtils', + 'oojs-ui', ), 'messages' => array( @@ -672,49 +352,60 @@ $wgResourceModules += array( ), ), - 'mmv.ui.reuse.dialog' => $wgMediaViewerResourceTemplate + array( + // Loaded on demand by mmv.ui.download.dialog.js + 'mmv.ui.download.pane' => $wgMediaViewerResourceTemplate + array( 'scripts' => array( - 'mmv/ui/mmv.ui.reuse.dialog.js', + 'mmv/ui/mmv.ui.download.pane.js', ), 'styles' => array( - 'mmv/ui/mmv.ui.reuse.dialog.less', + 'mmv/ui/mmv.ui.download.pane.less', ), 'dependencies' => array( - 'mmv.logging.ActionLogger', - 'mmv.ui.dialog', + 'mediawiki.ui', + 'mediawiki.ui.button', + 'mmv', // mmv/ui/mmv.ui.download.js + 'mmv.ui.ondemandshareddependencies', 'oojs', + 'oojs-ui', + ), + + 'messages' => array( + 'multimediaviewer-download-preview-link-title', + 'multimediaviewer-download-original-button-name', + 'multimediaviewer-download-small-button-name', + 'multimediaviewer-download-medium-button-name', + 'multimediaviewer-download-large-button-name', + 'multimediaviewer-embed-dimensions', + 'multimediaviewer-embed-dimensions-with-file-format', + 'multimediaviewer-download-attribution-cta-header', + 'multimediaviewer-download-optional-attribution-cta-header', + 'multimediaviewer-download-attribution-cta', + 'multimediaviewer-attr-plain', + 'multimediaviewer-attr-html', ), ), - 'mmv.ui.reuse.tab' => $wgMediaViewerResourceTemplate + array( + // Preloaded by mmv.js and loaded on demand by mmv.ui.reuse.dialog.js + 'mmv.ui.reuse.shareembed' => $wgMediaViewerResourceTemplate + array( 'scripts' => array( 'mmv/ui/mmv.ui.reuse.tab.js', - ), - - 'dependencies' => array( - 'mmv.ui', - 'oojs', - ), - ), - - 'mmv.ui.reuse.share' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( 'mmv/ui/mmv.ui.reuse.share.js', + 'mmv/ui/mmv.ui.reuse.embed.js', ), 'styles' => array( 'mmv/ui/mmv.ui.reuse.share.less', + 'mmv/ui/mmv.ui.reuse.embed.less', 'mmv/ui/mmv.ui.reuse.shareembed.less', ), 'dependencies' => array( - 'mmv.ui.reuse.tab', - 'mmv.routing', 'oojs', 'oojs-ui', - 'mmv.logging.ActionLogger', + 'mediawiki.user', + 'mmv.ui.ondemandshareddependencies', ), 'messages' => array( @@ -724,31 +415,7 @@ $wgResourceModules += array( 'multimediaviewer-link-to-file', 'multimediaviewer-link-to-page', - ), - ), - 'mmv.ui.reuse.embed' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/ui/mmv.ui.reuse.embed.js', - ), - - 'styles' => array( - 'mmv/ui/mmv.ui.reuse.embed.less', - 'mmv/ui/mmv.ui.reuse.shareembed.less', - ), - - 'dependencies' => array( - 'mediawiki.user', - 'mmv.ui.reuse.tab', - 'mmv.ui.utils', - 'oojs', - 'oojs-ui', - 'mmv.model.EmbedFileInfo', - 'mmv.embedFileFormatter', - 'mmv.logging.ActionLogger', - ), - - 'messages' => array( 'multimediaviewer-reuse-loading-placeholder', 'multimediaviewer-embed-tab', 'multimediaviewer-embed-html', @@ -769,180 +436,35 @@ $wgResourceModules += array( ), ), - 'mmv.ui.utils' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/ui/mmv.ui.utils.js', - ), - - 'dependencies' => array( - 'mmv.HtmlUtils', - 'mmv.ui', - 'oojs', - 'oojs-ui', - ), - ), - - 'mmv.ui.canvasButtons' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/ui/mmv.ui.canvasButtons.js', - ), - - 'styles' => array( - 'mmv/ui/mmv.ui.canvasButtons.less', - ), - - 'dependencies' => array( - 'mmv.ui', - 'mmv.ui.viewingOptions', - 'oojs', - ), - - 'messages' => array( - 'multimediaviewer-download-link', - 'multimediaviewer-reuse-link', - 'multimediaviewer-options-tooltip', - ), - ), - - 'mmv.ui.viewingOptions' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/ui/mmv.ui.viewingOptions.js', - ), - - 'styles' => array( - 'mmv/ui/mmv.ui.viewingOptions.less', - ), - - 'dependencies' => array( - 'mmv.ui', - 'mmv.ui.dialog', - 'oojs', - ), - - 'messages' => array( - 'multimediaviewer-options-learn-more', - 'multimediaviewer-options-dialog-header', - 'multimediaviewer-option-header-viewer', - 'multimediaviewer-option-header-filepage', - 'multimediaviewer-option-desc-viewer', - 'multimediaviewer-option-desc-filepage', - 'multimediaviewer-option-submit-button', - 'multimediaviewer-option-cancel-button', - 'multimediaviewer-options-text-header', - 'multimediaviewer-enable-alert', - 'multimediaviewer-options-text-body', - 'multimediaviewer-disable-confirmation-header', - 'multimediaviewer-disable-confirmation-text', - 'multimediaviewer-enable-dialog-header', - 'multimediaviewer-enable-text-header', - 'multimediaviewer-enable-submit-button', - 'multimediaviewer-enable-confirmation-header', - 'multimediaviewer-enable-confirmation-text', - ), - ), - + // Loaded on demand in mmv.bootstrap.js 'mmv.ui.tipsyDialog' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/ui/mmv.ui.tipsyDialog.js', - ), - - 'styles' => array( - 'mmv/ui/mmv.ui.tipsyDialog.less', - ), - - 'dependencies' => array( - 'mmv.ui', - 'oojs', - 'jquery.tipsy', - ), - ), - - 'mmv.logging.Logger' => $wgMediaViewerResourceTemplate + array( 'scripts' => array( - 'mmv/logging/mmv.logging.Logger.js', - ), - - 'dependencies' => array( - 'mmv.base', - ), - ), - - 'mmv.logging.PerformanceLogger' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/logging/mmv.logging.PerformanceLogger.js', - ), - - 'dependencies' => array( - 'mmv.base', - 'mmv.logging.Logger', - 'oojs', - ), - ), - - 'mmv.logging.Api' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/logging/mmv.logging.Api.js', - ), - - 'dependencies' => array( - 'mediawiki.api', - 'mmv.base', - 'mmv.logging.Logger', - 'oojs', - ), - ), - - 'mmv.Config' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/mmv.Config.js', - ), - - 'dependencies' => array( - 'mmv.base', - 'mediawiki.user', - ), - ), - - 'mmv' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/mmv.js', + 'mmv/ui/mmv.ui.tipsyDialog.js', ), 'styles' => array( - // Always make this one the last of the list (Bug 61852) - 'mmv/mmv.loaded.css', + 'mmv/ui/mmv.ui.tipsyDialog.less', ), 'dependencies' => array( - 'mmv.logging.Api', - 'mmv.base', - 'mmv.lightboximage', - 'mmv.logging.ActionLogger', - 'mmv.model.TaskQueue', - 'mmv.lightboxinterface', - 'mmv.provider', - 'mmv.routing', - 'mmv.logging.DurationLogger', - 'mmv.logging.DimensionLogger', - 'mmv.logging.ViewLogger', - 'jquery.fullscreen', - 'jquery.hidpi', - 'jquery.scrollTo', - 'jquery.throttle-debounce', - 'jquery.hidpi', - ), - - 'messages' => array( - 'multimediaviewer-file-page', - - // messages that are gender-dependent (we need to check if they really depend on the gender): - 'multimediaviewer-userpage-link', + 'mmv', // mmv/ui/mmv.ui.js + 'oojs', + 'jquery.tipsy', ), ), + // Isolated from mmv.bootstrap.autostart to allow tests running without an MMV instance + // being autostarted in the background 'mmv.bootstrap' => $wgMediaViewerResourceTemplate + array( 'scripts' => array( + 'mmv/mmv.Config.js', + 'mmv/mmv.HtmlUtils.js', 'mmv/mmv.bootstrap.js', + 'mmv/logging/mmv.logging.Logger.js', + 'mmv/logging/mmv.logging.ActionLogger.js', + 'mmv/logging/mmv.logging.DurationLogger.js', + 'jquery.hashchange/jquery.hashchange.js', + 'jquery.scrollTo/jquery.scrollTo.js', ), 'styles' => array( @@ -952,12 +474,9 @@ $wgResourceModules += array( 'dependencies' => array( 'mediawiki.ui.icon', 'mediawiki.Title', - 'mmv.Config', - 'mmv.logging.ActionLogger', - 'mmv.HtmlUtils', - 'mmv.logging.DurationLogger', - 'jquery.hashchange', - 'jquery.scrollTo', + 'mediawiki.user', + 'mmv.head', // mmv/mmv.base.js + 'oojs', ), 'messages' => array( @@ -968,103 +487,31 @@ $wgResourceModules += array( ), ), + // Loaded on demand by mmv.head.js on DOM readiness 'mmv.bootstrap.autostart' => $wgMediaViewerResourceTemplate + array( 'scripts' => array( 'mmv/mmv.bootstrap.autostart.js', ), 'dependencies' => array( - 'mmv.base', + 'mmv.head', // mmv/mmv.base.js 'mmv.bootstrap', ), ), - 'mmv.logging.ActionLogger' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/logging/mmv.logging.ActionLogger.js', - ), - - 'dependencies' => array( - 'mmv.base', - 'mmv.logging.Logger', - 'oojs' - ), - ), - - 'mmv.logging.DurationLogger' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/logging/mmv.logging.DurationLogger.js', - ), - - 'dependencies' => array( - 'mmv.base', - 'mmv.logging.Logger', - 'oojs', - 'mediawiki.user', - ), - ), - - 'mmv.logging.AttributionLogger' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/logging/mmv.logging.AttributionLogger.js', - ), - - 'dependencies' => array( - 'mmv.base', - 'mmv.logging.Logger', - 'oojs', - 'mediawiki.user', - ), - ), - - 'mmv.logging.DimensionLogger' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/logging/mmv.logging.DimensionLogger.js', - ), - - 'dependencies' => array( - 'mmv.base', - 'mmv.logging.Logger', - 'oojs', - 'jquery.hidpi', - ), - ), - - 'mmv.logging.ViewLogger' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'mmv/logging/mmv.logging.ViewLogger.js', - ), - - 'dependencies' => array( - 'mediawiki.Uri', - 'mmv.base', - ), - ), - + // Loaded in the head 'mmv.head' => $wgMediaViewerResourceTemplate + array( 'scripts' => array( + 'mmv/mmv.base.js', 'mmv/mmv.head.js', ), 'dependencies' => array( - 'mmv.base', 'mediawiki.user', ), 'position' => 'top', ), - - 'jquery.scrollTo' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'jquery.scrollTo/jquery.scrollTo.js', - ), - ), - - 'jquery.hashchange' => $wgMediaViewerResourceTemplate + array( - 'scripts' => array( - 'jquery.hashchange/jquery.hashchange.js', - ), - ), ); $wgHooks['EventLoggingRegisterSchemas'][] = function( array &$schemas ) { @@ -1082,11 +529,9 @@ $wgExtensionFunctions[] = function () { $wgMediaViewerEnableByDefault; if ( isset( $wgResourceModules['ext.eventLogging'] ) ) { - $wgResourceModules['mmv.logging.ActionLogger']['dependencies'][] = 'ext.eventLogging'; - $wgResourceModules['mmv.logging.PerformanceLogger']['dependencies'][] = 'ext.eventLogging'; - $wgResourceModules['mmv.logging.DurationLogger']['dependencies'][] = 'ext.eventLogging'; - $wgResourceModules['mmv.logging.AttributionLogger']['dependencies'][] = 'ext.eventLogging'; - $wgResourceModules['mmv.logging.DimensionLogger']['dependencies'][] = 'ext.eventLogging'; + $wgResourceModules['mmv.lightboxinterface']['dependencies'][] = 'ext.eventLogging'; + $wgResourceModules['mmv']['dependencies'][] = 'ext.eventLogging'; + $wgResourceModules['mmv.bootstrap.autostart']['dependencies'][] = 'ext.eventLogging'; } if ( $wgMediaViewerEnableByDefault ) { diff --git a/MultimediaViewerHooks.php b/MultimediaViewerHooks.php index 1c5ac533a..f619f7b26 100644 --- a/MultimediaViewerHooks.php +++ b/MultimediaViewerHooks.php @@ -248,10 +248,11 @@ class MultimediaViewerHooks { 'tests/qunit/mmv/mmv.testhelpers.js', ), 'dependencies' => array( - 'mmv', + 'mmv.head', 'mmv.bootstrap', - 'mmv.ui.reuse.share', - 'mmv.ui.reuse.embed', + 'mmv', + 'mmv.ui.ondemandshareddependencies', + 'mmv.ui.reuse.shareembed', 'mmv.ui.download.pane', 'mmv.ui.tipsyDialog', 'moment', diff --git a/resources/mmv/mmv.head.js b/resources/mmv/mmv.head.js index 5a304715e..d1fc35425 100644 --- a/resources/mmv/mmv.head.js +++ b/resources/mmv/mmv.head.js @@ -48,7 +48,7 @@ // We wait for document readiness because mw.loader.using writes to the DOM // which can cause a blank page if it happens before DOM readiness $document.ready( function () { - mw.loader.using( [ 'mmv.bootstrap.autostart', 'mmv.logging.DurationLogger' ], function () { + mw.loader.using( [ 'mmv.bootstrap.autostart' ], function () { mw.mmv.bootstrap.whenThumbsReady().then( function () { mw.mmv.durationLogger.stop( 'early-click-to-replay-click', start ).record( 'early-click-to-replay-click' ); diff --git a/resources/mmv/mmv.js b/resources/mmv/mmv.js index f5eb49cea..55b452564 100644 --- a/resources/mmv/mmv.js +++ b/resources/mmv/mmv.js @@ -976,7 +976,7 @@ * Preloads JS and CSS dependencies that aren't needed to display the first image, but could be needed later */ MMVP.preloadDependencies = function () { - mw.loader.load( [ 'mmv.ui.reuse.share', 'mmv.ui.reuse.embed', 'mmv.ui.reuse.download', 'moment' ] ); + mw.loader.load( [ 'mmv.ui.reuse.shareembed', 'moment' ] ); }; mw.mmv.MultimediaViewer = MultimediaViewer; diff --git a/resources/mmv/ui/mmv.ui.reuse.dialog.js b/resources/mmv/ui/mmv.ui.reuse.dialog.js index b41199b0c..35021665b 100644 --- a/resources/mmv/ui/mmv.ui.reuse.dialog.js +++ b/resources/mmv/ui/mmv.ui.reuse.dialog.js @@ -40,8 +40,7 @@ */ this.ooTabs = null; - this.loadDependencies.push( 'mmv.ui.reuse.share' ); - this.loadDependencies.push( 'mmv.ui.reuse.embed' ); + this.loadDependencies.push( 'mmv.ui.reuse.shareembed' ); this.$dialog.addClass( 'mw-mmv-reuse-dialog' ); diff --git a/tests/qunit/mmv/mmv.lightboxinterface.test.js b/tests/qunit/mmv/mmv.lightboxinterface.test.js index 0784952db..21137f78b 100644 --- a/tests/qunit/mmv/mmv.lightboxinterface.test.js +++ b/tests/qunit/mmv/mmv.lightboxinterface.test.js @@ -10,7 +10,13 @@ $.scrollTo = oldScrollTo; } - QUnit.module( 'mmv.lightboxInterface', QUnit.newMwEnvironment() ); + QUnit.module( 'mmv.lightboxInterface', QUnit.newMwEnvironment( { + setup: function () { + // animation would keep running, conflict with other tests + this.sandbox.stub( $.fn, 'animate' ).returnsThis(); + } + } ) ); + QUnit.test( 'Sanity test, object creation and ui construction', 20, function ( assert ) { var lightbox = new mw.mmv.LightboxInterface(); diff --git a/tests/qunit/mmv/mmv.test.js b/tests/qunit/mmv/mmv.test.js index 53fb21df2..32baa29b9 100644 --- a/tests/qunit/mmv/mmv.test.js +++ b/tests/qunit/mmv/mmv.test.js @@ -36,6 +36,9 @@ imageSrc = 'Foo bar.jpg', image = { filePageTitle: new mw.Title( 'File:' + imageSrc ) }; + // animation would keep running, conflict with other tests + this.sandbox.stub( $.fn, 'animate' ).returnsThis(); + window.location.hash = ''; viewer.setupEventHandlers(); @@ -180,6 +183,9 @@ }, viewer = new mw.mmv.MultimediaViewer( { get: $.noop } ); + // animation would keep running, conflict with other tests + this.sandbox.stub( $.fn, 'animate' ).returnsThis(); + viewer.thumbs = []; viewer.displayPlaceholderThumbnail = $.noop; viewer.setImage = $.noop; @@ -278,6 +284,9 @@ QUnit.test( 'resetBlurredThumbnailStates', 4, function ( assert ) { var viewer = new mw.mmv.MultimediaViewer( { get: $.noop } ); + // animation would keep running, conflict with other tests + this.sandbox.stub( $.fn, 'animate' ).returnsThis(); + assert.ok( !viewer.realThumbnailShown, 'Real thumbnail state is correct' ); assert.ok( !viewer.blurredThumbnailShown, 'Placeholder state is correct' ); @@ -456,6 +465,9 @@ modifiers = [ undefined, 'altKey', 'ctrlKey', 'shiftKey', 'metaKey' ], oldScrollTo = $.scrollTo; + // animation would keep running, conflict with other tests + this.sandbox.stub( $.fn, 'animate' ).returnsThis(); + $.scrollTo = function () { return { scrollTop: $.noop, on: $.noop, off: $.noop }; }; viewer.setupEventHandlers(); diff --git a/tests/qunit/mmv/ui/mmv.ui.permission.test.js b/tests/qunit/mmv/ui/mmv.ui.permission.test.js index 298588fa0..d8203802c 100644 --- a/tests/qunit/mmv/ui/mmv.ui.permission.test.js +++ b/tests/qunit/mmv/ui/mmv.ui.permission.test.js @@ -16,7 +16,12 @@ */ ( function ( mw, $ ) { - QUnit.module( 'mw.mmv.ui.Permission', QUnit.newMwEnvironment() ); + QUnit.module( 'mw.mmv.ui.Permission', QUnit.newMwEnvironment( { + setup: function () { + // animation would keep running, conflict with other tests + this.sandbox.stub( $.fn, 'animate' ).returnsThis(); + } + } ) ); QUnit.test( 'Constructor sanity check', 1, function ( assert ) { var $qf = $( '#qunit-fixture' ), @@ -68,10 +73,7 @@ QUnit.test( 'grow()', 3, function ( assert ) { var $qf = $( '#qunit-fixture' ), permission = new mw.mmv.ui.Permission( $qf ), - text = 'Nothing to see here.', - oldAnimate = $.fn.animate; // animation would keep running, conflict with other tests - - $.fn.animate = function () { return this; }; + text = 'Nothing to see here.'; permission.set( text ); permission.grow(); @@ -79,17 +81,12 @@ assert.ok( !permission.$text.is( ':visible' ), 'permission text is not visible' ); assert.ok( permission.$html.is( ':visible' ), 'permission html is visible' ); assert.ok( permission.$close.is( ':visible' ), 'close button is visible' ); - - $.fn.animate = oldAnimate; } ); QUnit.test( 'shrink()', 3, function ( assert ) { var $qf = $( '#qunit-fixture' ), permission = new mw.mmv.ui.Permission( $qf ), - text = 'Nothing to see here.', - oldAnimate = $.fn.animate; // animation would keep running, conflict with other tests - - $.fn.animate = function () { return this; }; + text = 'Nothing to see here.'; permission.set( text ); permission.grow(); @@ -98,16 +95,12 @@ assert.ok( permission.$text.is( ':visible' ), 'permission text is visible' ); assert.ok( !permission.$html.is( ':visible' ), 'permission html is not visible' ); assert.ok( !permission.$close.is( ':visible' ), 'close button is not visible' ); - - $.fn.animate = oldAnimate; } ); QUnit.test( 'isFullSize()', 3, function ( assert ) { var $qf = $( '#qunit-fixture' ), permission = new mw.mmv.ui.Permission( $qf ), text = 'Nothing to see here.'; - // animation would keep running, conflict with other tests - this.sandbox.stub( $.fn, 'animate' ).returnsThis(); permission.set( text ); assert.ok( !permission.isFullSize(), 'permission is not full-size' );