summaryrefslogtreecommitdiffstats
path: root/browser/extensions/webcompat/shims/fastclick.js
blob: ad6814c9953b7faf948d15b19109ee89aae88cfd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/* 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";

/**
 * Bug 1738220 - Shim Conversant FastClick
 *
 * Sites assuming FastClick will load can break if it is blocked.
 * This shim mitigates that breakage.
 */

// FastClick bundles nodeJS packages/core-js/internals/dom-iterables.js
// which is known to be needed by at least one site.
if (!HTMLCollection.prototype.forEach) {
  const DOMIterables = [
    "CSSRuleList",
    "CSSStyleDeclaration",
    "CSSValueList",
    "ClientRectList",
    "DOMRectList",
    "DOMStringList",
    "DOMTokenList",
    "DataTransferItemList",
    "FileList",
    "HTMLAllCollection",
    "HTMLCollection",
    "HTMLFormElement",
    "HTMLSelectElement",
    "MediaList",
    "MimeTypeArray",
    "NamedNodeMap",
    "NodeList",
    "PaintRequestList",
    "Plugin",
    "PluginArray",
    "SVGLengthList",
    "SVGNumberList",
    "SVGPathSegList",
    "SVGPointList",
    "SVGStringList",
    "SVGTransformList",
    "SourceBufferList",
    "StyleSheetList",
    "TextTrackCueList",
    "TextTrackList",
    "TouchList",
  ];

  const forEach = Array.prototype.forEach;

  const handlePrototype = proto => {
    if (!proto || proto.forEach === forEach) {
      return;
    }
    try {
      Object.defineProperty(proto, "forEach", {
        enumerable: false,
        get: () => forEach,
      });
    } catch (_) {
      proto.forEach = forEach;
    }
  };

  for (const name of DOMIterables) {
    handlePrototype(window[name]?.prototype);
  }
}

if (!window.conversant?.launch) {
  const c = (window.conversant = window.conversant || {});
  c.launch = () => {};
}