mediawiki.util: Remove redundant file closures
Modules loaded with packageFiles are always executed in module scope (with a closure), even in debug mode. The behaviour of non-packageFiles debug mode is the only reason files have closures. Bug: T50886 Change-Id: I4c553961eab0f665e4ae123e11c92b255367fcfb
This commit is contained in:
parent
8697ba8354
commit
6f5535d3cc
3 changed files with 749 additions and 750 deletions
5
resources/src/mediawiki.util/.eslintrc.json
Normal file
5
resources/src/mediawiki.util/.eslintrc.json
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"parserOptions": {
|
||||
"sourceType": "module"
|
||||
}
|
||||
}
|
||||
|
|
@ -3,237 +3,234 @@
|
|||
*
|
||||
* @class jQuery.plugin.accessKeyLabel
|
||||
*/
|
||||
( function () {
|
||||
|
||||
// Cached access key modifiers for used browser
|
||||
var cachedAccessKeyModifiers,
|
||||
// Cached access key modifiers for used browser
|
||||
var cachedAccessKeyModifiers,
|
||||
|
||||
// Whether to use 'test-' instead of correct prefix (used for testing)
|
||||
useTestPrefix = false,
|
||||
// Whether to use 'test-' instead of correct prefix (used for testing)
|
||||
useTestPrefix = false,
|
||||
|
||||
// tag names which can have a label tag
|
||||
// https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#Form-associated_content
|
||||
labelable = 'button, input, textarea, keygen, meter, output, progress, select';
|
||||
// tag names which can have a label tag
|
||||
// https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#Form-associated_content
|
||||
labelable = 'button, input, textarea, keygen, meter, output, progress, select';
|
||||
|
||||
/**
|
||||
* Find the modifier keys that need to be pressed together with the accesskey to trigger the input.
|
||||
*
|
||||
* The result is dependant on the ua paramater or the current platform.
|
||||
* For browsers that support accessKeyLabel, #getAccessKeyLabel never calls here.
|
||||
* Valid key values that are returned can be: ctrl, alt, option, shift, esc
|
||||
*
|
||||
* @private
|
||||
* @param {Object} [ua] An object with a 'userAgent' and 'platform' property.
|
||||
* @return {Array} Array with 1 or more of the string values, in this order: ctrl, option, alt, shift, esc
|
||||
*/
|
||||
function getAccessKeyModifiers( ua ) {
|
||||
var profile, accessKeyModifiers;
|
||||
/**
|
||||
* Find the modifier keys that need to be pressed together with the accesskey to trigger the input.
|
||||
*
|
||||
* The result is dependant on the ua paramater or the current platform.
|
||||
* For browsers that support accessKeyLabel, #getAccessKeyLabel never calls here.
|
||||
* Valid key values that are returned can be: ctrl, alt, option, shift, esc
|
||||
*
|
||||
* @private
|
||||
* @param {Object} [ua] An object with a 'userAgent' and 'platform' property.
|
||||
* @return {Array} Array with 1 or more of the string values, in this order: ctrl, option, alt, shift, esc
|
||||
*/
|
||||
function getAccessKeyModifiers( ua ) {
|
||||
var profile, accessKeyModifiers;
|
||||
|
||||
// use cached prefix if possible
|
||||
if ( !ua && cachedAccessKeyModifiers ) {
|
||||
return cachedAccessKeyModifiers;
|
||||
}
|
||||
// use cached prefix if possible
|
||||
if ( !ua && cachedAccessKeyModifiers ) {
|
||||
return cachedAccessKeyModifiers;
|
||||
}
|
||||
|
||||
profile = $.client.profile( ua );
|
||||
profile = $.client.profile( ua );
|
||||
|
||||
switch ( profile.name ) {
|
||||
case 'chrome':
|
||||
case 'opera':
|
||||
if ( profile.name === 'opera' && profile.versionNumber < 15 ) {
|
||||
accessKeyModifiers = [ 'shift', 'esc' ];
|
||||
} else if ( profile.platform === 'mac' ) {
|
||||
accessKeyModifiers = [ 'ctrl', 'option' ];
|
||||
switch ( profile.name ) {
|
||||
case 'chrome':
|
||||
case 'opera':
|
||||
if ( profile.name === 'opera' && profile.versionNumber < 15 ) {
|
||||
accessKeyModifiers = [ 'shift', 'esc' ];
|
||||
} else if ( profile.platform === 'mac' ) {
|
||||
accessKeyModifiers = [ 'ctrl', 'option' ];
|
||||
} else {
|
||||
// Chrome/Opera on Windows or Linux
|
||||
// (both alt- and alt-shift work, but alt with E, D, F etc does not
|
||||
// work since they are browser shortcuts)
|
||||
accessKeyModifiers = [ 'alt', 'shift' ];
|
||||
}
|
||||
break;
|
||||
case 'firefox':
|
||||
case 'iceweasel':
|
||||
if ( profile.versionBase < 2 ) {
|
||||
// Before v2, Firefox used alt, though it was rebindable in about:config
|
||||
accessKeyModifiers = [ 'alt' ];
|
||||
} else {
|
||||
if ( profile.platform === 'mac' ) {
|
||||
if ( profile.versionNumber < 14 ) {
|
||||
accessKeyModifiers = [ 'ctrl' ];
|
||||
} else {
|
||||
accessKeyModifiers = [ 'ctrl', 'option' ];
|
||||
}
|
||||
} else {
|
||||
// Chrome/Opera on Windows or Linux
|
||||
// (both alt- and alt-shift work, but alt with E, D, F etc does not
|
||||
// work since they are browser shortcuts)
|
||||
accessKeyModifiers = [ 'alt', 'shift' ];
|
||||
}
|
||||
break;
|
||||
case 'firefox':
|
||||
case 'iceweasel':
|
||||
if ( profile.versionBase < 2 ) {
|
||||
// Before v2, Firefox used alt, though it was rebindable in about:config
|
||||
accessKeyModifiers = [ 'alt' ];
|
||||
} else {
|
||||
if ( profile.platform === 'mac' ) {
|
||||
if ( profile.versionNumber < 14 ) {
|
||||
accessKeyModifiers = [ 'ctrl' ];
|
||||
} else {
|
||||
accessKeyModifiers = [ 'ctrl', 'option' ];
|
||||
}
|
||||
} else {
|
||||
accessKeyModifiers = [ 'alt', 'shift' ];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'safari':
|
||||
case 'konqueror':
|
||||
if ( profile.platform === 'win' ) {
|
||||
accessKeyModifiers = [ 'alt' ];
|
||||
} else {
|
||||
if ( profile.layoutVersion > 526 ) {
|
||||
// Non-Windows Safari with webkit_version > 526
|
||||
accessKeyModifiers = [ 'ctrl', profile.platform === 'mac' ? 'option' : 'alt' ];
|
||||
} else {
|
||||
accessKeyModifiers = [ 'ctrl' ];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'msie':
|
||||
case 'edge':
|
||||
}
|
||||
break;
|
||||
case 'safari':
|
||||
case 'konqueror':
|
||||
if ( profile.platform === 'win' ) {
|
||||
accessKeyModifiers = [ 'alt' ];
|
||||
break;
|
||||
default:
|
||||
accessKeyModifiers = profile.platform === 'mac' ? [ 'ctrl' ] : [ 'alt' ];
|
||||
break;
|
||||
}
|
||||
|
||||
// cache modifiers
|
||||
if ( !ua ) {
|
||||
cachedAccessKeyModifiers = accessKeyModifiers;
|
||||
}
|
||||
return accessKeyModifiers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the access key label for an element.
|
||||
*
|
||||
* Will use native accessKeyLabel if available (currently only in Firefox 8+),
|
||||
* falls back to #getAccessKeyModifiers.
|
||||
*
|
||||
* @private
|
||||
* @param {HTMLElement} element Element to get the label for
|
||||
* @return {string} Access key label
|
||||
*/
|
||||
function getAccessKeyLabel( element ) {
|
||||
// abort early if no access key
|
||||
if ( !element.accessKey ) {
|
||||
return '';
|
||||
}
|
||||
// use accessKeyLabel if possible
|
||||
// https://html.spec.whatwg.org/multipage/interaction.html#dom-accesskeylabel
|
||||
if ( !useTestPrefix && element.accessKeyLabel ) {
|
||||
return element.accessKeyLabel;
|
||||
}
|
||||
return ( useTestPrefix ? 'test' : getAccessKeyModifiers().join( '-' ) ) + '-' + element.accessKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the title for an element (on the element with the access key or it's label) to show
|
||||
* the correct access key label.
|
||||
*
|
||||
* @private
|
||||
* @param {HTMLElement} element Element with the accesskey
|
||||
* @param {HTMLElement} titleElement Element with the title to update (may be the same as `element`)
|
||||
*/
|
||||
function updateTooltipOnElement( element, titleElement ) {
|
||||
var oldTitle, parts, regexp, newTitle, accessKeyLabel,
|
||||
separatorMsg = mw.message( 'word-separator' ).plain();
|
||||
|
||||
oldTitle = titleElement.title;
|
||||
if ( !oldTitle ) {
|
||||
// don't add a title if the element didn't have one before
|
||||
return;
|
||||
}
|
||||
|
||||
parts = ( separatorMsg + mw.message( 'brackets' ).plain() ).split( '$1' );
|
||||
regexp = new RegExp( parts.map( mw.util.escapeRegExp ).join( '.*?' ) + '$' );
|
||||
newTitle = oldTitle.replace( regexp, '' );
|
||||
accessKeyLabel = getAccessKeyLabel( element );
|
||||
|
||||
if ( accessKeyLabel ) {
|
||||
// Should be build the same as in Linker::titleAttrib
|
||||
newTitle += separatorMsg + mw.message( 'brackets', accessKeyLabel ).plain();
|
||||
}
|
||||
if ( oldTitle !== newTitle ) {
|
||||
titleElement.title = newTitle;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the title for an element to show the correct access key label.
|
||||
*
|
||||
* @private
|
||||
* @param {HTMLElement} element Element with the accesskey
|
||||
*/
|
||||
function updateTooltip( element ) {
|
||||
var id, $element, $label, $labelParent;
|
||||
updateTooltipOnElement( element, element );
|
||||
|
||||
// update associated label if there is one
|
||||
$element = $( element );
|
||||
if ( $element.is( labelable ) ) {
|
||||
// Search it using 'for' attribute
|
||||
id = element.id.replace( /"/g, '\\"' );
|
||||
if ( id ) {
|
||||
$label = $( 'label[for="' + id + '"]' );
|
||||
if ( $label.length === 1 ) {
|
||||
updateTooltipOnElement( element, $label[ 0 ] );
|
||||
} else {
|
||||
if ( profile.layoutVersion > 526 ) {
|
||||
// Non-Windows Safari with webkit_version > 526
|
||||
accessKeyModifiers = [ 'ctrl', profile.platform === 'mac' ? 'option' : 'alt' ];
|
||||
} else {
|
||||
accessKeyModifiers = [ 'ctrl' ];
|
||||
}
|
||||
}
|
||||
|
||||
// Search it as parent, because the form control can also be inside the label element itself
|
||||
$labelParent = $element.parents( 'label' );
|
||||
if ( $labelParent.length === 1 ) {
|
||||
updateTooltipOnElement( element, $labelParent[ 0 ] );
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'msie':
|
||||
case 'edge':
|
||||
accessKeyModifiers = [ 'alt' ];
|
||||
break;
|
||||
default:
|
||||
accessKeyModifiers = profile.platform === 'mac' ? [ 'ctrl' ] : [ 'alt' ];
|
||||
break;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the titles for all elements in a jQuery selection.
|
||||
*
|
||||
* @return {jQuery}
|
||||
* @chainable
|
||||
*/
|
||||
$.fn.updateTooltipAccessKeys = function () {
|
||||
return this.each( function () {
|
||||
updateTooltip( this );
|
||||
} );
|
||||
};
|
||||
// cache modifiers
|
||||
if ( !ua ) {
|
||||
cachedAccessKeyModifiers = accessKeyModifiers;
|
||||
}
|
||||
return accessKeyModifiers;
|
||||
}
|
||||
|
||||
/**
|
||||
* getAccessKeyModifiers
|
||||
*
|
||||
* @method updateTooltipAccessKeys_getAccessKeyModifiers
|
||||
* @inheritdoc #getAccessKeyModifiers
|
||||
*/
|
||||
$.fn.updateTooltipAccessKeys.getAccessKeyModifiers = getAccessKeyModifiers;
|
||||
/**
|
||||
* Get the access key label for an element.
|
||||
*
|
||||
* Will use native accessKeyLabel if available (currently only in Firefox 8+),
|
||||
* falls back to #getAccessKeyModifiers.
|
||||
*
|
||||
* @private
|
||||
* @param {HTMLElement} element Element to get the label for
|
||||
* @return {string} Access key label
|
||||
*/
|
||||
function getAccessKeyLabel( element ) {
|
||||
// abort early if no access key
|
||||
if ( !element.accessKey ) {
|
||||
return '';
|
||||
}
|
||||
// use accessKeyLabel if possible
|
||||
// https://html.spec.whatwg.org/multipage/interaction.html#dom-accesskeylabel
|
||||
if ( !useTestPrefix && element.accessKeyLabel ) {
|
||||
return element.accessKeyLabel;
|
||||
}
|
||||
return ( useTestPrefix ? 'test' : getAccessKeyModifiers().join( '-' ) ) + '-' + element.accessKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* getAccessKeyLabel
|
||||
*
|
||||
* @method updateTooltipAccessKeys_getAccessKeyLabel
|
||||
* @inheritdoc #getAccessKeyLabel
|
||||
*/
|
||||
$.fn.updateTooltipAccessKeys.getAccessKeyLabel = getAccessKeyLabel;
|
||||
/**
|
||||
* Update the title for an element (on the element with the access key or it's label) to show
|
||||
* the correct access key label.
|
||||
*
|
||||
* @private
|
||||
* @param {HTMLElement} element Element with the accesskey
|
||||
* @param {HTMLElement} titleElement Element with the title to update (may be the same as `element`)
|
||||
*/
|
||||
function updateTooltipOnElement( element, titleElement ) {
|
||||
var oldTitle, parts, regexp, newTitle, accessKeyLabel,
|
||||
separatorMsg = mw.message( 'word-separator' ).plain();
|
||||
|
||||
/**
|
||||
* getAccessKeyPrefix
|
||||
*
|
||||
* @method updateTooltipAccessKeys_getAccessKeyPrefix
|
||||
* @deprecated since 1.27 Use #getAccessKeyModifiers
|
||||
* @param {Object} [ua] An object with a 'userAgent' and 'platform' property.
|
||||
* @return {string}
|
||||
*/
|
||||
$.fn.updateTooltipAccessKeys.getAccessKeyPrefix = function ( ua ) {
|
||||
return getAccessKeyModifiers( ua ).join( '-' ) + '-';
|
||||
};
|
||||
oldTitle = titleElement.title;
|
||||
if ( !oldTitle ) {
|
||||
// don't add a title if the element didn't have one before
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch test mode on and off.
|
||||
*
|
||||
* @method updateTooltipAccessKeys_setTestMode
|
||||
* @param {boolean} mode New mode
|
||||
*/
|
||||
$.fn.updateTooltipAccessKeys.setTestMode = function ( mode ) {
|
||||
useTestPrefix = mode;
|
||||
};
|
||||
parts = ( separatorMsg + mw.message( 'brackets' ).plain() ).split( '$1' );
|
||||
regexp = new RegExp( parts.map( mw.util.escapeRegExp ).join( '.*?' ) + '$' );
|
||||
newTitle = oldTitle.replace( regexp, '' );
|
||||
accessKeyLabel = getAccessKeyLabel( element );
|
||||
|
||||
/**
|
||||
* @class jQuery
|
||||
* @mixins jQuery.plugin.accessKeyLabel
|
||||
*/
|
||||
if ( accessKeyLabel ) {
|
||||
// Should be build the same as in Linker::titleAttrib
|
||||
newTitle += separatorMsg + mw.message( 'brackets', accessKeyLabel ).plain();
|
||||
}
|
||||
if ( oldTitle !== newTitle ) {
|
||||
titleElement.title = newTitle;
|
||||
}
|
||||
}
|
||||
|
||||
}() );
|
||||
/**
|
||||
* Update the title for an element to show the correct access key label.
|
||||
*
|
||||
* @private
|
||||
* @param {HTMLElement} element Element with the accesskey
|
||||
*/
|
||||
function updateTooltip( element ) {
|
||||
var id, $element, $label, $labelParent;
|
||||
updateTooltipOnElement( element, element );
|
||||
|
||||
// update associated label if there is one
|
||||
$element = $( element );
|
||||
if ( $element.is( labelable ) ) {
|
||||
// Search it using 'for' attribute
|
||||
id = element.id.replace( /"/g, '\\"' );
|
||||
if ( id ) {
|
||||
$label = $( 'label[for="' + id + '"]' );
|
||||
if ( $label.length === 1 ) {
|
||||
updateTooltipOnElement( element, $label[ 0 ] );
|
||||
}
|
||||
}
|
||||
|
||||
// Search it as parent, because the form control can also be inside the label element itself
|
||||
$labelParent = $element.parents( 'label' );
|
||||
if ( $labelParent.length === 1 ) {
|
||||
updateTooltipOnElement( element, $labelParent[ 0 ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the titles for all elements in a jQuery selection.
|
||||
*
|
||||
* @return {jQuery}
|
||||
* @chainable
|
||||
*/
|
||||
$.fn.updateTooltipAccessKeys = function () {
|
||||
return this.each( function () {
|
||||
updateTooltip( this );
|
||||
} );
|
||||
};
|
||||
|
||||
/**
|
||||
* getAccessKeyModifiers
|
||||
*
|
||||
* @method updateTooltipAccessKeys_getAccessKeyModifiers
|
||||
* @inheritdoc #getAccessKeyModifiers
|
||||
*/
|
||||
$.fn.updateTooltipAccessKeys.getAccessKeyModifiers = getAccessKeyModifiers;
|
||||
|
||||
/**
|
||||
* getAccessKeyLabel
|
||||
*
|
||||
* @method updateTooltipAccessKeys_getAccessKeyLabel
|
||||
* @inheritdoc #getAccessKeyLabel
|
||||
*/
|
||||
$.fn.updateTooltipAccessKeys.getAccessKeyLabel = getAccessKeyLabel;
|
||||
|
||||
/**
|
||||
* getAccessKeyPrefix
|
||||
*
|
||||
* @method updateTooltipAccessKeys_getAccessKeyPrefix
|
||||
* @deprecated since 1.27 Use #getAccessKeyModifiers
|
||||
* @param {Object} [ua] An object with a 'userAgent' and 'platform' property.
|
||||
* @return {string}
|
||||
*/
|
||||
$.fn.updateTooltipAccessKeys.getAccessKeyPrefix = function ( ua ) {
|
||||
return getAccessKeyModifiers( ua ).join( '-' ) + '-';
|
||||
};
|
||||
|
||||
/**
|
||||
* Switch test mode on and off.
|
||||
*
|
||||
* @method updateTooltipAccessKeys_setTestMode
|
||||
* @param {boolean} mode New mode
|
||||
*/
|
||||
$.fn.updateTooltipAccessKeys.setTestMode = function ( mode ) {
|
||||
useTestPrefix = mode;
|
||||
};
|
||||
|
||||
/**
|
||||
* @class jQuery
|
||||
* @mixins jQuery.plugin.accessKeyLabel
|
||||
*/
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue