jenkins-bot has submitted this change and it was merged.
Change subject: Don't directly use #addEventListener for compatibility with IE 8
......................................................................
Don't directly use #addEventListener for compatibility with IE 8
Introduces two methods:
* OO.ui.addCaptureEventListener( node, eventName, handler ), to be
used instead of node.addEventListener( eventName, handler, true ).
* OO.ui.removeCaptureEventListener( node, eventName, handler ), to be
used instead of node.removeEventListener( eventName, handler, true ).
On IE 8, fall back to using #attachEvent, which does not support
capturing event listeners, but should still mostly work and at least
won't throw exceptions.
For non-capturing event listeners, we already use jQuery's .on()
method everywhere.
Change-Id: I3967d893b9afd6dbe94186cba808ac656e70b9fe
---
M src/ToolGroup.js
M src/core.js
M src/mixins/ButtonElement.js
M src/toolgroups/PopupToolGroup.js
M src/widgets/MenuSelectWidget.js
M src/widgets/PopupWidget.js
M src/widgets/SelectWidget.js
7 files changed, 64 insertions(+), 42 deletions(-)
Approvals:
Catrope: Looks good to me, approved
Jforrester: Looks good to me, but someone else must approve
jenkins-bot: Verified
diff --git a/src/ToolGroup.js b/src/ToolGroup.js
index 4e6e845..bb1b56c 100644
--- a/src/ToolGroup.js
+++ b/src/ToolGroup.js
@@ -175,8 +175,8 @@
this.pressed = this.getTargetTool( e );
if ( this.pressed ) {
this.pressed.setActive( true );
- this.getElementDocument().addEventListener( 'mouseup',
this.onCapturedMouseKeyUpHandler, true );
- this.getElementDocument().addEventListener( 'keyup',
this.onCapturedMouseKeyUpHandler, true );
+ OO.ui.addCaptureEventListener(
this.getElementDocument(), 'mouseup', this.onCapturedMouseKeyUpHandler );
+ OO.ui.addCaptureEventListener(
this.getElementDocument(), 'keyup', this.onCapturedMouseKeyUpHandler );
}
return false;
}
@@ -189,8 +189,8 @@
* @param {Event} e Mouse up or key up event
*/
OO.ui.ToolGroup.prototype.onCapturedMouseKeyUp = function ( e ) {
- this.getElementDocument().removeEventListener( 'mouseup',
this.onCapturedMouseKeyUpHandler, true );
- this.getElementDocument().removeEventListener( 'keyup',
this.onCapturedMouseKeyUpHandler, true );
+ OO.ui.removeCaptureEventListener( this.getElementDocument(), 'mouseup',
this.onCapturedMouseKeyUpHandler );
+ OO.ui.removeCaptureEventListener( this.getElementDocument(), 'keyup',
this.onCapturedMouseKeyUpHandler );
// onMouseKeyUp may be called a second time, depending on where the
mouse is when the button is
// released, but since `this.pressed` will no longer be true, the
second call will be ignored.
this.onMouseKeyUp( e );
diff --git a/src/core.js b/src/core.js
index 433e65a..b4bf0e3 100644
--- a/src/core.js
+++ b/src/core.js
@@ -185,6 +185,38 @@
};
/**
+ * Proxy for `node.addEventListener( eventName, handler, true )`, if the
browser supports it.
+ * Otherwise falls back to non-capturing event listeners.
+ *
+ * @param {HTMLElement} node
+ * @param {string} eventName
+ * @param {Function} handler
+ */
+OO.ui.addCaptureEventListener = function ( node, eventName, handler ) {
+ if ( node.addEventListener ) {
+ node.addEventListener( eventName, handler, true );
+ } else {
+ node.attachEvent( 'on' + eventName, handler );
+ }
+};
+
+/**
+ * Proxy for `node.removeEventListener( eventName, handler, true )`, if the
browser supports it.
+ * Otherwise falls back to non-capturing event listeners.
+ *
+ * @param {HTMLElement} node
+ * @param {string} eventName
+ * @param {Function} handler
+ */
+OO.ui.removeCaptureEventListener = function ( node, eventName, handler ) {
+ if ( node.addEventListener ) {
+ node.removeEventListener( eventName, handler, true );
+ } else {
+ node.detachEvent( 'on' + eventName, handler );
+ }
+};
+
+/**
* Reconstitute a JavaScript object corresponding to a widget created by
* the PHP implementation.
*
diff --git a/src/mixins/ButtonElement.js b/src/mixins/ButtonElement.js
index 44e8606..1099ceb 100644
--- a/src/mixins/ButtonElement.js
+++ b/src/mixins/ButtonElement.js
@@ -113,7 +113,7 @@
this.$element.addClass( 'oo-ui-buttonElement-pressed' );
// Run the mouseup handler no matter where the mouse is when the button
is let go, so we can
// reliably remove the pressed class
- this.getElementDocument().addEventListener( 'mouseup',
this.onMouseUpHandler, true );
+ OO.ui.addCaptureEventListener( this.getElementDocument(), 'mouseup',
this.onMouseUpHandler );
// Prevent change of focus unless specifically configured otherwise
if ( this.constructor.static.cancelButtonMouseDownEvents ) {
return false;
@@ -132,7 +132,7 @@
}
this.$element.removeClass( 'oo-ui-buttonElement-pressed' );
// Stop listening for mouseup, since we only needed this once
- this.getElementDocument().removeEventListener( 'mouseup',
this.onMouseUpHandler, true );
+ OO.ui.removeCaptureEventListener( this.getElementDocument(), 'mouseup',
this.onMouseUpHandler );
};
/**
@@ -163,7 +163,7 @@
this.$element.addClass( 'oo-ui-buttonElement-pressed' );
// Run the keyup handler no matter where the key is when the button is
let go, so we can
// reliably remove the pressed class
- this.getElementDocument().addEventListener( 'keyup',
this.onKeyUpHandler, true );
+ OO.ui.addCaptureEventListener( this.getElementDocument(), 'keyup',
this.onKeyUpHandler );
};
/**
@@ -178,7 +178,7 @@
}
this.$element.removeClass( 'oo-ui-buttonElement-pressed' );
// Stop listening for keyup, since we only needed this once
- this.getElementDocument().removeEventListener( 'keyup',
this.onKeyUpHandler, true );
+ OO.ui.removeCaptureEventListener( this.getElementDocument(), 'keyup',
this.onKeyUpHandler );
};
/**
diff --git a/src/toolgroups/PopupToolGroup.js b/src/toolgroups/PopupToolGroup.js
index 16844f1..fdaf280 100644
--- a/src/toolgroups/PopupToolGroup.js
+++ b/src/toolgroups/PopupToolGroup.js
@@ -168,8 +168,8 @@
if ( this.active !== value ) {
this.active = value;
if ( value ) {
- this.getElementDocument().addEventListener( 'mouseup',
this.onBlurHandler, true );
- this.getElementDocument().addEventListener( 'keyup',
this.onBlurHandler, true );
+ OO.ui.addCaptureEventListener(
this.getElementDocument(), 'mouseup', this.onBlurHandler );
+ OO.ui.addCaptureEventListener(
this.getElementDocument(), 'keyup', this.onBlurHandler );
this.$clippable.css( 'left', '' );
// Try anchoring the popup to the left first
@@ -197,8 +197,8 @@
} );
}
} else {
- this.getElementDocument().removeEventListener(
'mouseup', this.onBlurHandler, true );
- this.getElementDocument().removeEventListener( 'keyup',
this.onBlurHandler, true );
+ OO.ui.removeCaptureEventListener(
this.getElementDocument(), 'mouseup', this.onBlurHandler );
+ OO.ui.removeCaptureEventListener(
this.getElementDocument(), 'keyup', this.onBlurHandler );
this.$element.removeClass(
'oo-ui-popupToolGroup-active
oo-ui-popupToolGroup-left oo-ui-popupToolGroup-right'
);
diff --git a/src/widgets/MenuSelectWidget.js b/src/widgets/MenuSelectWidget.js
index 0a85e3a..a7a71be 100644
--- a/src/widgets/MenuSelectWidget.js
+++ b/src/widgets/MenuSelectWidget.js
@@ -293,16 +293,12 @@
// Auto-hide
if ( this.autoHide ) {
- this.getElementDocument().addEventListener(
- 'mousedown',
this.onDocumentMouseDownHandler, true
- );
+ OO.ui.addCaptureEventListener(
this.getElementDocument(), 'mousedown', this.onDocumentMouseDownHandler );
}
} else {
this.unbindKeyDownListener();
this.unbindKeyPressListener();
- this.getElementDocument().removeEventListener(
- 'mousedown', this.onDocumentMouseDownHandler,
true
- );
+ OO.ui.removeCaptureEventListener(
this.getElementDocument(), 'mousedown', this.onDocumentMouseDownHandler );
this.toggleClipping( false );
}
}
diff --git a/src/widgets/PopupWidget.js b/src/widgets/PopupWidget.js
index a542aa8..f3f26c6 100644
--- a/src/widgets/PopupWidget.js
+++ b/src/widgets/PopupWidget.js
@@ -144,7 +144,7 @@
*/
OO.ui.PopupWidget.prototype.bindMouseDownListener = function () {
// Capture clicks outside popup
- this.getElementWindow().addEventListener( 'mousedown',
this.onMouseDownHandler, true );
+ OO.ui.addCaptureEventListener( this.getElementWindow(), 'mousedown',
this.onMouseDownHandler );
};
/**
@@ -164,7 +164,7 @@
* @private
*/
OO.ui.PopupWidget.prototype.unbindMouseDownListener = function () {
- this.getElementWindow().removeEventListener( 'mousedown',
this.onMouseDownHandler, true );
+ OO.ui.removeCaptureEventListener( this.getElementWindow(), 'mousedown',
this.onMouseDownHandler );
};
/**
@@ -190,7 +190,7 @@
* @private
*/
OO.ui.PopupWidget.prototype.bindKeyDownListener = function () {
- this.getElementWindow().addEventListener( 'keydown',
this.onDocumentKeyDownHandler, true );
+ OO.ui.addCaptureEventListener( this.getElementWindow(), 'keydown',
this.onDocumentKeyDownHandler );
};
/**
@@ -199,7 +199,7 @@
* @private
*/
OO.ui.PopupWidget.prototype.unbindKeyDownListener = function () {
- this.getElementWindow().removeEventListener( 'keydown',
this.onDocumentKeyDownHandler, true );
+ OO.ui.removeCaptureEventListener( this.getElementWindow(), 'keydown',
this.onDocumentKeyDownHandler );
};
/**
diff --git a/src/widgets/SelectWidget.js b/src/widgets/SelectWidget.js
index 14b71f2..c4d8f3c 100644
--- a/src/widgets/SelectWidget.js
+++ b/src/widgets/SelectWidget.js
@@ -161,15 +161,15 @@
if ( item && item.isSelectable() ) {
this.pressItem( item );
this.selecting = item;
- this.getElementDocument().addEventListener(
+ OO.ui.addCaptureEventListener(
+ this.getElementDocument(),
'mouseup',
- this.onMouseUpHandler,
- true
+ this.onMouseUpHandler
);
- this.getElementDocument().addEventListener(
+ OO.ui.addCaptureEventListener(
+ this.getElementDocument(),
'mousemove',
- this.onMouseMoveHandler,
- true
+ this.onMouseMoveHandler
);
}
}
@@ -198,16 +198,10 @@
this.selecting = null;
}
- this.getElementDocument().removeEventListener(
- 'mouseup',
- this.onMouseUpHandler,
- true
- );
- this.getElementDocument().removeEventListener(
- 'mousemove',
- this.onMouseMoveHandler,
- true
- );
+ OO.ui.removeCaptureEventListener( this.getElementDocument(), 'mouseup',
+ this.onMouseUpHandler );
+ OO.ui.removeCaptureEventListener( this.getElementDocument(),
'mousemove',
+ this.onMouseMoveHandler );
return false;
};
@@ -327,7 +321,7 @@
* @protected
*/
OO.ui.SelectWidget.prototype.bindKeyDownListener = function () {
- this.getElementWindow().addEventListener( 'keydown',
this.onKeyDownHandler, true );
+ OO.ui.addCaptureEventListener( this.getElementWindow(), 'keydown',
this.onKeyDownHandler );
};
/**
@@ -336,7 +330,7 @@
* @protected
*/
OO.ui.SelectWidget.prototype.unbindKeyDownListener = function () {
- this.getElementWindow().removeEventListener( 'keydown',
this.onKeyDownHandler, true );
+ OO.ui.removeCaptureEventListener( this.getElementWindow(), 'keydown',
this.onKeyDownHandler );
};
/**
@@ -445,7 +439,7 @@
* @protected
*/
OO.ui.SelectWidget.prototype.bindKeyPressListener = function () {
- this.getElementWindow().addEventListener( 'keypress',
this.onKeyPressHandler, true );
+ OO.ui.addCaptureEventListener( this.getElementWindow(), 'keypress',
this.onKeyPressHandler );
};
/**
@@ -457,7 +451,7 @@
* @protected
*/
OO.ui.SelectWidget.prototype.unbindKeyPressListener = function () {
- this.getElementWindow().removeEventListener( 'keypress',
this.onKeyPressHandler, true );
+ OO.ui.removeCaptureEventListener( this.getElementWindow(), 'keypress',
this.onKeyPressHandler );
this.clearKeyPressBuffer();
};
--
To view, visit https://gerrit.wikimedia.org/r/230566
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I3967d893b9afd6dbe94186cba808ac656e70b9fe
Gerrit-PatchSet: 3
Gerrit-Project: oojs/ui
Gerrit-Branch: master
Gerrit-Owner: Bartosz Dziewoński <[email protected]>
Gerrit-Reviewer: Bartosz Dziewoński <[email protected]>
Gerrit-Reviewer: Catrope <[email protected]>
Gerrit-Reviewer: Esanders <[email protected]>
Gerrit-Reviewer: Jforrester <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits