Skip to content

Commit

Permalink
add more tests and a few more EventTarget interface features
Browse files Browse the repository at this point in the history
  • Loading branch information
romainmenke authored and JakeChampion committed Aug 2, 2021
1 parent c6c7275 commit c844665
Show file tree
Hide file tree
Showing 9 changed files with 478 additions and 27 deletions.
15 changes: 0 additions & 15 deletions polyfills/MediaQueryList/prototype/EventTarget/polyfill.js

This file was deleted.

8 changes: 0 additions & 8 deletions polyfills/MediaQueryList/prototype/EventTarget/tests.js

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
aliases = [
"MediaQueryList.prototype.addEventListener",
"MediaQueryList.prototype.removeEventListener",
"MediaQueryList.prototype.dispatchEvent",
]
dependencies = [ "matchMedia" ]

dependencies = [
"matchMedia",
"Object.defineProperty"
]
docs = "https://developer.mozilla.org/en-US/docs/Web/API/MediaQueryList"
spec = "http://dev.w3.org/csswg/cssom-view/#the-mediaquerylist-interface"
license = "MIT"
notes = [
"Does not implement the full EventTarget interface. Misses 'dispatchEvent', 'capture' option.",
"Does not differentiate between listeners added with different options.",
"onchange property only works in browsers with Object setter support."
]

[browsers]
android = "2.1 - 4.4.4"
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
'MediaQueryList' in self && 'addEventListener' in self.MediaQueryList
'MediaQueryList' in self && 'addEventListener' in self.MediaQueryList.prototype
88 changes: 88 additions & 0 deletions polyfills/MediaQueryList/prototype/addEventListener/polyfill.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
(function(global) {
"use strict";

var _addListener = global.MediaQueryList.prototype.addListener;
var _removeListener = global.MediaQueryList.prototype.removeListener;

global.MediaQueryList.prototype.addListener = function addListener(listener) {
var handler = listener;
if (handler.handleEvent) {
handler = handler.handleEvent;
}

_addListener.call(this, handler);
};

global.MediaQueryList.prototype.removeListener = function removeListener(listener) {
var handler = listener;
if (handler.handleEvent) {
handler = handler.handleEvent;
}

_removeListener.call(this, handler);
};

global.MediaQueryList.prototype.addEventListener = function addEventListener(type, listener) {
if (type === 'change') {
this.addListener(listener);
}

if (arguments[2] && arguments[2].once) {
var _this = this;
var remover = function () {
_this.removeListener(remover);
_this.removeListener(listener);
}
this.addListener(remover);
}
};

global.MediaQueryList.prototype.removeEventListener = function removeEventListener(type, listener) {
if (type === 'change') {
this.removeListener(listener);
}
};

// Best effort.
// Some browsers don't support setters.
if ((function () {
// supports setters (not IE8)
try {
var a = {};
global.Object.defineProperty(a, 't', {
configurable: true,
enumerable: false,
get: function () { return this._v; },
set: function (v) { this._v = v + v; }
});
a.t = 1;
return (a.t === 2);
} catch (e) {
return false;
}
}())) {
global.Object.defineProperty(global.MediaQueryList.prototype, "onchange", {
enumerable: true,
configurable: true,
get: function () {
return this._onchangeHandler || null;
},
set: function (listener) {
var _this = this;
if (!_this._onchangeListener) {
_this._onchangeListener = function () {
if (typeof _this._onchangeHandler !== 'function') {
return;
}

_this._onchangeHandler.call(_this, arguments[0]);
};

_this.addEventListener('change', _this._onchangeListener);
}

_this._onchangeHandler = listener;
}
});
}
}(self));

0 comments on commit c844665

Please sign in to comment.