Source code

Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
/**
* Bugs 1287715 - Audio intermittently does not work.
*
* The site relies on unspecified behavior in Chromium and WebKit where
* they will defer firing loadedmetadata events until after a listener
* for the event is attached. We can mimic that behavior here.
*/
if (!window.__firefoxWebCompatFixBug1287715) {
Object.defineProperty(window, "__firefoxWebCompatFixBug1287715", {
configurable: false,
value: true,
});
console.info(
"loadedmetadata event is being deferred until GAME_READY. See https://bugzilla.mozilla.org/show_bug.cgi?id=1287715 for details."
);
let loadedmetadataEvent;
let loadedmetadataListener;
const { prototype } = EventTarget;
const { addEventListener, dispatchEvent } = prototype;
Object.defineProperty(prototype, "addEventListener", {
value(type, listener, cfg) {
if (type?.toLowerCase() === "loadedmetadata") {
loadedmetadataListener = listener;
return addEventListener.call(
this,
type,
e => {
loadedmetadataEvent = e;
},
cfg
);
}
return addEventListener.call(this, type, listener, cfg);
},
});
Object.defineProperty(prototype, "dispatchEvent", {
value(e) {
if (
e?.type === "GAME_READY" &&
loadedmetadataEvent &&
loadedmetadataListener
) {
try {
(loadedmetadataListener?.handleEvent ?? loadedmetadataListener)(
loadedmetadataEvent
);
} catch (_) {
console.trace(_);
}
loadedmetadataListener = undefined;
loadedmetadataEvent = undefined;
}
return dispatchEvent.call(this, e);
},
});
}