diff --git a/extension.json b/extension.json index 3c0ab2d6..27ad0caf 100644 --- a/extension.json +++ b/extension.json @@ -1,445 +1,442 @@ { "name": "MultimediaViewer", "author": [ "MarkTraceur (Mark Holmquist)", "Gilles Dubuc", "Gergő Tisza", "Aaron Arcos", "Zeljko Filipin", "Pau Giner", "theopolisme", "MatmaRex", "apsdehal", "vldandrew", "Ebrahim Byagowi", "Dereckson", "Brion VIBBER", "Yuki Shira", "Yaroslav Melnychuk", "tonythomas01", "Raimond Spekking", "Kunal Mehta", "Jeff Hall", "Christian Aistleitner", "Amir E. Aharoni" ], "url": "https://www.mediawiki.org/wiki/Extension:MultimediaViewer", "descriptionmsg": "multimediaviewer-desc", "license-name": "GPL-2.0-or-later", "type": "other", "requires": { "MediaWiki": ">= 1.32.0" }, - "ExtensionFunctions": [ - "MultimediaViewerHooks::onExtensionFunctions" - ], "MessagesDirs": { "MultimediaViewer": [ "i18n" ] }, "AutoloadClasses": { "MultimediaViewerHooks": "includes/MultimediaViewerHooks.php" }, "ResourceModules": { "mmv": { "scripts": [ "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", "mmv/model/mmv.model.IwTitle.js", "mmv/model/mmv.model.License.js", "mmv/model/mmv.model.Image.js", "mmv/model/mmv.model.Repo.js", "mmv/model/mmv.model.Thumbnail.js", "mmv/model/mmv.model.TaskQueue.js", "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", "mmv/provider/mmv.provider.ThumbnailInfo.js", "mmv/provider/mmv.provider.GuessedThumbnailInfo.js", "mmv/provider/mmv.provider.Image.js", "mmv/mmv.ThumbnailWidthCalculator.js", "mmv/ui/mmv.ui.js", "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": [ "mmv/ui/mmv.ui.dialog.less", "mmv/ui/mmv.ui.reuse.dialog.less", "mmv/ui/mmv.ui.download.dialog.less", "mmv/ui/mmv.ui.viewingOptions.less", "mmv/ui/mmv.ui.canvas.less", "mmv/ui/mmv.ui.canvasButtons.less", "mmv/ui/mmv.ui.permission.less", "mmv/ui/mmv.ui.progressBar.less", "mmv/ui/mmv.ui.stripeButtons.less", "mmv/ui/mmv.ui.truncatableTextField.less", "mmv/ui/mmv.ui.metadataPanel.less", "mmv/ui/mmv.ui.metadataPanelScroller.less", "mmv/mmv.lightboxinterface.less" ], "dependencies": [ "mediawiki.api", "mediawiki.Title", "mediawiki.Uri", "mediawiki.jqueryMsg", "mediawiki.storage", "oojs", "jquery.fullscreen", "jquery.hidpi", "jquery.throttle-debounce", "jquery.color", "jquery.tipsy", "mmv.bootstrap", "mmv.head" ], "messages": [ "multimediaviewer-file-page", "multimediaviewer-options-learn-more", "multimediaviewer-options-dialog-header", "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", "multimediaviewer-thumbnail-error", "multimediaviewer-thumbnail-error-description", "multimediaviewer-thumbnail-error-retry", "multimediaviewer-report-issue-url", "multimediaviewer-thumbnail-error-report", "multimediaviewer-errorreport-privacywarning", "multimediaviewer-download-link", "multimediaviewer-reuse-link", "multimediaviewer-options-tooltip", "multimediaviewer-close-popup-text", "multimediaviewer-fullscreen-popup-text", "multimediaviewer-defullscreen-popup-text", "multimediaviewer-next-image-alt-text", "multimediaviewer-prev-image-alt-text", "multimediaviewer-commons-subtitle", "multimediaviewer-credit", "multimediaviewer-credit-fallback", "multimediaviewer-multiple-authors", "multimediaviewer-multiple-authors-combine", "multimediaviewer-datetime-created", "multimediaviewer-datetime-uploaded", "multimediaviewer-permission-link", "multimediaviewer-permission-link-hide", "multimediaviewer-restriction-2257", "multimediaviewer-restriction-aus-reserve", "multimediaviewer-restriction-communist", "multimediaviewer-restriction-costume", "multimediaviewer-restriction-currency", "multimediaviewer-restriction-design", "multimediaviewer-restriction-fan-art", "multimediaviewer-restriction-ihl", "multimediaviewer-restriction-insignia", "multimediaviewer-restriction-ita-mibac", "multimediaviewer-restriction-nazi", "multimediaviewer-restriction-personality", "multimediaviewer-restriction-trademarked", "multimediaviewer-restriction-default", "multimediaviewer-restriction-default-and-others", "multimediaviewer-reuse-warning-deletion", "multimediaviewer-reuse-warning-nonfree", "multimediaviewer-reuse-warning-noattribution", "multimediaviewer-reuse-warning-generic", "multimediaviewer-geoloc-north", "multimediaviewer-geoloc-east", "multimediaviewer-geoloc-south", "multimediaviewer-geoloc-west", "multimediaviewer-geoloc-coord", "multimediaviewer-geoloc-coords", "multimediaviewer-geolocation", "multimediaviewer-about-mmv", "multimediaviewer-discuss-mmv", "multimediaviewer-help-mmv", "multimediaviewer-optout-mmv", "multimediaviewer-optin-mmv", "multimediaviewer-optout-pending-mmv", "multimediaviewer-optin-pending-mmv", "multimediaviewer-optout-help", "multimediaviewer-optin-help", "mypreferences", "multimediaviewer-metadata-error", "multimediaviewer-title-popup-text", "multimediaviewer-credit-popup-text", "multimediaviewer-title-popup-text-more", "multimediaviewer-credit-popup-text-more", "multimediaviewer-permission-title", "multimediaviewer-permission-viewmore", "multimediaviewer-description-page-button-text", "multimediaviewer-description-page-popup-text", "multimediaviewer-repository-local", "multimediaviewer-license-cc-by-1.0", "multimediaviewer-license-cc-sa-1.0", "multimediaviewer-license-cc-by-sa-1.0", "multimediaviewer-license-cc-by-2.0", "multimediaviewer-license-cc-by-sa-2.0", "multimediaviewer-license-cc-by-2.1", "multimediaviewer-license-cc-by-sa-2.1", "multimediaviewer-license-cc-by-2.5", "multimediaviewer-license-cc-by-sa-2.5", "multimediaviewer-license-cc-by-3.0", "multimediaviewer-license-cc-by-sa-3.0", "multimediaviewer-license-cc-by-4.0", "multimediaviewer-license-cc-by-sa-4.0", "multimediaviewer-license-cc-pd", "multimediaviewer-license-cc-zero", "multimediaviewer-license-pd", "multimediaviewer-license-default" ] }, "mmv.ui.ondemandshareddependencies": { "scripts": [ "mmv/model/mmv.model.EmbedFileInfo.js", "mmv/mmv.EmbedFileFormatter.js", "mmv/ui/mmv.ui.utils.js" ], "dependencies": [ "mmv.head", "mmv", "oojs", "oojs-ui" ], "messages": [ "multimediaviewer-credit", "multimediaviewer-text-embed-credit-text-bl", "multimediaviewer-text-embed-credit-text-b", "multimediaviewer-text-embed-credit-text-l", "multimediaviewer-html-embed-credit-text-bl", "multimediaviewer-html-embed-credit-text-b", "multimediaviewer-html-embed-credit-text-l", "multimediaviewer-html-embed-credit-link-text" ] }, "mmv.ui.download.pane": { "scripts": [ "mmv/ui/mmv.ui.download.pane.js" ], "styles": [ "mmv/ui/mmv.ui.download.pane.less" ], "dependencies": [ "mediawiki.ui", "mediawiki.ui.button", "mmv", "mmv.ui.ondemandshareddependencies", "oojs", "oojs-ui" ], "messages": [ "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-download-attribution-copy", "multimediaviewer-attr-plain", "multimediaviewer-attr-html" ] }, "mmv.ui.reuse.shareembed": { "scripts": [ "mmv/ui/mmv.ui.reuse.tab.js", "mmv/ui/mmv.ui.reuse.share.js", "mmv/ui/mmv.ui.reuse.embed.js" ], "styles": [ "mmv/ui/mmv.ui.reuse.share.less", "mmv/ui/mmv.ui.reuse.embed.less", "mmv/ui/mmv.ui.reuse.shareembed.less" ], "dependencies": [ "jquery.tipsy", "oojs", "oojs-ui", "mediawiki.user", "mmv.ui.ondemandshareddependencies" ], "messages": [ "multimediaviewer-reuse-loading-placeholder", "multimediaviewer-share-tab", "multimediaviewer-share-explanation", "multimediaviewer-link-to-file", "multimediaviewer-link-to-page", "multimediaviewer-reuse-loading-placeholder", "multimediaviewer-reuse-copy-share", "multimediaviewer-reuse-copy-embed", "multimediaviewer-embed-tab", "multimediaviewer-embed-html", "multimediaviewer-embed-wt", "multimediaviewer-embed-explanation", "multimediaviewer-embed-byline", "multimediaviewer-embed-license", "multimediaviewer-embed-via", "multimediaviewer-default-embed-dimensions", "multimediaviewer-original-embed-dimensions", "multimediaviewer-large-embed-dimensions", "multimediaviewer-medium-embed-dimensions", "multimediaviewer-small-embed-dimensions", "multimediaviewer-embed-dimensions", "multimediaviewer-embed-dimensions-separated" ] }, "mmv.ui.tipsyDialog": { "scripts": [ "mmv/ui/mmv.ui.tipsyDialog.js" ], "styles": [ "mmv/ui/mmv.ui.tipsyDialog.less" ], "dependencies": [ "mmv", "oojs", "jquery.tipsy" ] }, "mmv.bootstrap": { "scripts": [ "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" ], "styles": [ "mmv/mmv.bootstrap.less" ], "dependencies": [ "mediawiki.api", "mediawiki.ui.button", "mediawiki.ui.icon", "mediawiki.Title", "mediawiki.user", "mediawiki.storage", "mmv.head", "oojs" ], "messages": [ "multimediaviewer-view-expanded", "multimediaviewer-view-config", "multimediaviewer-disable-info-title", "multimediaviewer-disable-info" ] }, "mmv.bootstrap.autostart": { "scripts": [ "mmv/mmv.bootstrap.autostart.js" ], "dependencies": [ "mmv.head", "mmv.bootstrap" ] }, "mmv.head": { "scripts": [ "mmv/mmv.base.js", "mmv/mmv.head.js" ], "dependencies": [ "mediawiki.user", "mediawiki.storage" ], "position": "top" } }, "ResourceFileModulePaths": { "localBasePath": "resources", "remoteExtPath": "MultimediaViewer/resources" }, "Hooks": { "EventLoggingRegisterSchemas": [ "MultimediaViewerHooks::onEventLoggingRegisterSchemas" ], "UserGetDefaultOptions": [ "MultimediaViewerHooks::onUserGetDefaultOptions" ], "GetPreferences": [ "MultimediaViewerHooks::getPreferences" ], "GetBetaFeaturePreferences": [ "MultimediaViewerHooks::getBetaPreferences" ], "BeforePageDisplay": [ "MultimediaViewerHooks::getModulesForArticle" ], "CategoryPageView": [ "MultimediaViewerHooks::getModulesForCategory" ], "ResourceLoaderGetConfigVars": [ "MultimediaViewerHooks::resourceLoaderGetConfigVars" ], "MakeGlobalVariablesScript": [ "MultimediaViewerHooks::makeGlobalVariablesScript" ], "ResourceLoaderTestModules": [ "MultimediaViewerHooks::getTestModules" ], "ThumbnailBeforeProduceHTML": [ "MultimediaViewerHooks::thumbnailBeforeProduceHTML" ] }, "config": { "MediaViewerExtensions": { "jpg": "default", "jpeg": "default", "gif": "default", "svg": "default", "png": "default", "tiff": "default", "tif": "default" }, "MediaViewerNetworkPerformanceSamplingFactor": false, "MediaViewerDurationLoggingSamplingFactor": false, "MediaViewerDurationLoggingLoggedinSamplingFactor": false, "MediaViewerAttributionLoggingSamplingFactor": false, "MediaViewerDimensionLoggingSamplingFactor": false, "MediaViewerActionLoggingSamplingFactorMap": false, "MediaViewerIsInBeta": false, "MediaViewerUseThumbnailGuessing": false, "MediaViewerEnableByDefault": true, "MediaViewerEnableByDefaultForAnonymous": null, "MediaViewerImageQueryParameter": false, "MediaViewerRecordVirtualViewBeaconURI": false }, "manifest_version": 1 } diff --git a/includes/MultimediaViewerHooks.php b/includes/MultimediaViewerHooks.php index 80a18816..9e6abbe7 100644 --- a/includes/MultimediaViewerHooks.php +++ b/includes/MultimediaViewerHooks.php @@ -1,349 +1,339 @@ . * * @file * @ingroup extensions * @author Mark Holmquist * @copyright Copyright © 2013, Mark Holmquist */ class MultimediaViewerHooks { /** Link to more information about this module */ protected static $infoLink = 'https://mediawiki.org/wiki/Special:MyLanguage/Extension:Media_Viewer/About'; /** Link to a page where this module can be discussed */ protected static $discussionLink = 'https://mediawiki.org/wiki/Special:MyLanguage/Extension_talk:Media_Viewer/About'; /** Link to help about this module */ protected static $helpLink = 'https://mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Media_Viewer'; public static function onUserGetDefaultOptions( &$defaultOptions ) { global $wgMediaViewerEnableByDefault; if ( $wgMediaViewerEnableByDefault ) { $defaultOptions['multimediaviewer-enable'] = 1; } return true; } - public static function onExtensionFunctions() { - global $wgResourceModules; - - if ( isset( $wgResourceModules['ext.eventLogging'] ) ) { - $wgResourceModules['mmv.lightboxinterface']['dependencies'][] = 'ext.eventLogging'; - $wgResourceModules['mmv']['dependencies'][] = 'ext.eventLogging'; - $wgResourceModules['mmv.bootstrap.autostart']['dependencies'][] = 'ext.eventLogging'; - } - } - public static function onEventLoggingRegisterSchemas( array &$schemas ) { $schemas += [ 'MediaViewer' => 10867062, 'MultimediaViewerNetworkPerformance' => 15573630, 'MultimediaViewerDuration' => 10427980, 'MultimediaViewerAttribution' => 9758179, 'MultimediaViewerDimensions' => 10014238, ]; } /** * Checks the context for whether to load the viewer. * @param User $user * @return bool */ protected static function shouldHandleClicks( $user ) { global $wgMediaViewerIsInBeta, $wgMediaViewerEnableByDefaultForAnonymous, $wgMediaViewerEnableByDefault; if ( $wgMediaViewerIsInBeta && class_exists( 'BetaFeatures' ) ) { return BetaFeatures::isFeatureEnabled( $user, 'multimedia-viewer' ); } if ( $wgMediaViewerEnableByDefaultForAnonymous === null ) { $enableByDefaultForAnons = $wgMediaViewerEnableByDefault; } else { $enableByDefaultForAnons = $wgMediaViewerEnableByDefaultForAnonymous; } if ( !$user->isLoggedIn() ) { return (bool)$enableByDefaultForAnons; } else { return (bool)$user->getOption( 'multimediaviewer-enable' ); } } /** * Handler for all places where we add the modules * Could be on article pages or on Category pages * @param OutputPage &$out * @return bool */ protected static function getModules( &$out ) { $out->addModules( [ 'mmv.head', 'mmv.bootstrap.autostart' ] ); return true; } /** * Handler for BeforePageDisplay hook * Add JavaScript to the page when an image is on it * and the user has enabled the feature if BetaFeatures is installed * @param OutputPage &$out * @param Skin &$skin * @return bool */ public static function getModulesForArticle( &$out, &$skin ) { $pageHasThumbnails = count( $out->getFileSearchOptions() ) > 0; $pageIsFilePage = $out->getTitle()->inNamespace( NS_FILE ); $fileRelatedSpecialPages = [ 'NewFiles', 'ListFiles', 'MostLinkedFiles', 'MostGloballyLinkedFiles', 'UncategorizedFiles', 'UnusedFiles', 'Search' ]; $pageIsFileRelatedSpecialPage = $out->getTitle()->inNamespace( NS_SPECIAL ) && in_array( $out->getTitle()->getText(), $fileRelatedSpecialPages ); if ( $pageHasThumbnails || $pageIsFilePage || $pageIsFileRelatedSpecialPage ) { return self::getModules( $out ); } return true; } /** * Handler for CategoryPageView hook * Add JavaScript to the page if there are images in the category * @param CategoryPage &$catPage * @return bool */ public static function getModulesForCategory( &$catPage ) { $title = $catPage->getTitle(); $cat = Category::newFromTitle( $title ); if ( $cat->getFileCount() > 0 ) { $out = $catPage->getContext()->getOutput(); return self::getModules( $out ); } return true; } /** * Add a beta preference to gate the feature * @param User $user * @param array &$prefs * @return true */ public static function getBetaPreferences( $user, &$prefs ) { global $wgExtensionAssetsPath, $wgMediaViewerIsInBeta; if ( !$wgMediaViewerIsInBeta ) { return true; } $prefs['multimedia-viewer'] = [ 'label-message' => 'multimediaviewer-pref', 'desc-message' => 'multimediaviewer-pref-desc', 'info-link' => self::$infoLink, 'discussion-link' => self::$discussionLink, 'help-link' => self::$helpLink, 'screenshot' => [ 'ltr' => "$wgExtensionAssetsPath/MultimediaViewer/viewer-ltr.svg", 'rtl' => "$wgExtensionAssetsPath/MultimediaViewer/viewer-rtl.svg", ], ]; return true; } /** * Adds a default-enabled preference to gate the feature on non-beta sites * @param User $user * @param array &$prefs * @return true */ public static function getPreferences( $user, &$prefs ) { global $wgMediaViewerIsInBeta; if ( !$wgMediaViewerIsInBeta ) { $prefs['multimediaviewer-enable'] = [ 'type' => 'toggle', 'label-message' => 'multimediaviewer-optin-pref', 'section' => 'rendering/files', ]; } return true; } /** * Export variables used in both PHP and JS to keep DRY * @param array &$vars * @return bool */ public static function resourceLoaderGetConfigVars( &$vars ) { global $wgMediaViewerActionLoggingSamplingFactorMap, $wgMediaViewerNetworkPerformanceSamplingFactor, $wgMediaViewerDurationLoggingSamplingFactor, $wgMediaViewerDurationLoggingLoggedinSamplingFactor, $wgMediaViewerAttributionLoggingSamplingFactor, $wgMediaViewerDimensionLoggingSamplingFactor, $wgMediaViewerIsInBeta, $wgMediaViewerUseThumbnailGuessing, $wgMediaViewerExtensions, $wgMediaViewerImageQueryParameter, $wgMediaViewerRecordVirtualViewBeaconURI; $vars['wgMultimediaViewer'] = [ 'infoLink' => self::$infoLink, 'discussionLink' => self::$discussionLink, 'helpLink' => self::$helpLink, 'useThumbnailGuessing' => (bool)$wgMediaViewerUseThumbnailGuessing, 'durationSamplingFactor' => $wgMediaViewerDurationLoggingSamplingFactor, 'durationSamplingFactorLoggedin' => $wgMediaViewerDurationLoggingLoggedinSamplingFactor, 'networkPerformanceSamplingFactor' => $wgMediaViewerNetworkPerformanceSamplingFactor, 'actionLoggingSamplingFactorMap' => $wgMediaViewerActionLoggingSamplingFactorMap, 'attributionSamplingFactor' => $wgMediaViewerAttributionLoggingSamplingFactor, 'dimensionSamplingFactor' => $wgMediaViewerDimensionLoggingSamplingFactor, 'imageQueryParameter' => $wgMediaViewerImageQueryParameter, 'recordVirtualViewBeaconURI' => $wgMediaViewerRecordVirtualViewBeaconURI, 'tooltipDelay' => 1000, 'extensions' => $wgMediaViewerExtensions, ]; $vars['wgMediaViewer'] = true; $vars['wgMediaViewerIsInBeta'] = $wgMediaViewerIsInBeta; return true; } /** * Export variables which depend on the current user * @param array &$vars * @param OutputPage $out */ public static function makeGlobalVariablesScript( &$vars, OutputPage $out ) { $defaultUserOptions = User::getDefaultOptions(); $user = $out->getUser(); $vars['wgMediaViewerOnClick'] = self::shouldHandleClicks( $user ); // needed because of bug 69942; could be different for anon and logged-in $vars['wgMediaViewerEnabledByDefault'] = !empty( $defaultUserOptions['multimediaviewer-enable'] ); } /** * Get modules for testing our JavaScript * @param array &$testModules * @param ResourceLoader &$resourceLoader * @return bool */ public static function getTestModules( array &$testModules, ResourceLoader &$resourceLoader ) { $testModules['qunit']['mmv.tests'] = [ 'scripts' => [ 'tests/qunit/mmv/mmv.bootstrap.test.js', 'tests/qunit/mmv/mmv.test.js', 'tests/qunit/mmv/mmv.lightboxinterface.test.js', 'tests/qunit/mmv/mmv.lightboximage.test.js', 'tests/qunit/mmv/mmv.ThumbnailWidthCalculator.test.js', 'tests/qunit/mmv/mmv.EmbedFileFormatter.test.js', 'tests/qunit/mmv/mmv.Config.test.js', 'tests/qunit/mmv/mmv.HtmlUtils.test.js', 'tests/qunit/mmv/logging/mmv.logging.DurationLogger.test.js', 'tests/qunit/mmv/logging/mmv.logging.PerformanceLogger.test.js', 'tests/qunit/mmv/logging/mmv.logging.ActionLogger.test.js', 'tests/qunit/mmv/logging/mmv.logging.AttributionLogger.test.js', 'tests/qunit/mmv/logging/mmv.logging.DimensionLogger.test.js', 'tests/qunit/mmv/logging/mmv.logging.ViewLogger.test.js', 'tests/qunit/mmv/model/mmv.model.test.js', 'tests/qunit/mmv/model/mmv.model.IwTitle.test.js', 'tests/qunit/mmv/model/mmv.model.TaskQueue.test.js', 'tests/qunit/mmv/model/mmv.model.License.test.js', 'tests/qunit/mmv/model/mmv.model.Image.test.js', 'tests/qunit/mmv/model/mmv.model.Repo.test.js', 'tests/qunit/mmv/model/mmv.model.EmbedFileInfo.test.js', 'tests/qunit/mmv/provider/mmv.provider.Api.test.js', 'tests/qunit/mmv/provider/mmv.provider.ImageInfo.test.js', 'tests/qunit/mmv/provider/mmv.provider.FileRepoInfo.test.js', 'tests/qunit/mmv/provider/mmv.provider.ThumbnailInfo.test.js', 'tests/qunit/mmv/provider/mmv.provider.GuessedThumbnailInfo.test.js', 'tests/qunit/mmv/provider/mmv.provider.Image.test.js', 'tests/qunit/mmv/routing/mmv.routing.MainFileRoute.test.js', 'tests/qunit/mmv/routing/mmv.routing.ThumbnailRoute.test.js', 'tests/qunit/mmv/routing/mmv.routing.Router.test.js', 'tests/qunit/mmv/ui/mmv.ui.test.js', 'tests/qunit/mmv/ui/mmv.ui.canvas.test.js', 'tests/qunit/mmv/ui/mmv.ui.canvasButtons.test.js', 'tests/qunit/mmv/ui/mmv.ui.description.test.js', 'tests/qunit/mmv/ui/mmv.ui.download.pane.test.js', 'tests/qunit/mmv/ui/mmv.ui.metadataPanel.test.js', 'tests/qunit/mmv/ui/mmv.ui.metadataPanelScroller.test.js', 'tests/qunit/mmv/ui/mmv.ui.progressBar.test.js', 'tests/qunit/mmv/ui/mmv.ui.permission.test.js', 'tests/qunit/mmv/ui/mmv.ui.stripeButtons.test.js', 'tests/qunit/mmv/ui/mmv.ui.reuse.dialog.test.js', 'tests/qunit/mmv/ui/mmv.ui.reuse.embed.test.js', 'tests/qunit/mmv/ui/mmv.ui.reuse.share.test.js', 'tests/qunit/mmv/ui/mmv.ui.reuse.tab.test.js', 'tests/qunit/mmv/ui/mmv.ui.reuse.utils.test.js', 'tests/qunit/mmv/ui/mmv.ui.tipsyDialog.test.js', 'tests/qunit/mmv/ui/mmv.ui.truncatableTextField.test.js', 'tests/qunit/mmv/ui/mmv.ui.viewingOptions.test.js', 'tests/qunit/mmv/mmv.testhelpers.js', ], 'dependencies' => [ 'mmv.head', 'mmv.bootstrap', 'mmv', 'mmv.ui.ondemandshareddependencies', 'mmv.ui.reuse.shareembed', 'mmv.ui.download.pane', 'mmv.ui.tipsyDialog', 'moment', ], 'localBasePath' => dirname( __DIR__ ), 'remoteExtPath' => 'MultimediaViewer', ]; return true; } /** * Modify thumbnail DOM * @param ThumbnailImage $thumbnail * @param array &$attribs Attributes of the element * @param array|bool &$linkAttribs Attributes of the wrapping element * @return true */ public static function thumbnailBeforeProduceHTML( ThumbnailImage $thumbnail, array &$attribs, &$linkAttribs ) { $file = $thumbnail->getFile(); if ( $file ) { // At the moment all classes that extend File have getWidth() and getHeight() // but since the File class doesn't have these methods defined, this check // is more future-proof if ( method_exists( $file, 'getWidth' ) ) { $attribs['data-file-width'] = $file->getWidth(); } if ( method_exists( $file, 'getHeight' ) ) { $attribs['data-file-height'] = $file->getHeight(); } } return true; } }