MouseEvent.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  1. "use strict";
  2. const conversions = require("webidl-conversions");
  3. const utils = require("./utils.js");
  4. const MouseEventInit = require("./MouseEventInit.js");
  5. const EventTarget = require("./EventTarget.js");
  6. const implSymbol = utils.implSymbol;
  7. const ctorRegistrySymbol = utils.ctorRegistrySymbol;
  8. const UIEvent = require("./UIEvent.js");
  9. const interfaceName = "MouseEvent";
  10. exports.is = value => {
  11. return utils.isObject(value) && Object.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
  12. };
  13. exports.isImpl = value => {
  14. return utils.isObject(value) && value instanceof Impl.implementation;
  15. };
  16. exports.convert = (globalObject, value, { context = "The provided value" } = {}) => {
  17. if (exports.is(value)) {
  18. return utils.implForWrapper(value);
  19. }
  20. throw new globalObject.TypeError(`${context} is not of type 'MouseEvent'.`);
  21. };
  22. function makeWrapper(globalObject, newTarget) {
  23. let proto;
  24. if (newTarget !== undefined) {
  25. proto = newTarget.prototype;
  26. }
  27. if (!utils.isObject(proto)) {
  28. proto = globalObject[ctorRegistrySymbol]["MouseEvent"].prototype;
  29. }
  30. return Object.create(proto);
  31. }
  32. exports.create = (globalObject, constructorArgs, privateData) => {
  33. const wrapper = makeWrapper(globalObject);
  34. return exports.setup(wrapper, globalObject, constructorArgs, privateData);
  35. };
  36. exports.createImpl = (globalObject, constructorArgs, privateData) => {
  37. const wrapper = exports.create(globalObject, constructorArgs, privateData);
  38. return utils.implForWrapper(wrapper);
  39. };
  40. exports._internalSetup = (wrapper, globalObject) => {
  41. UIEvent._internalSetup(wrapper, globalObject);
  42. };
  43. exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
  44. privateData.wrapper = wrapper;
  45. exports._internalSetup(wrapper, globalObject);
  46. Object.defineProperty(wrapper, implSymbol, {
  47. value: new Impl.implementation(globalObject, constructorArgs, privateData),
  48. configurable: true
  49. });
  50. wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
  51. if (Impl.init) {
  52. Impl.init(wrapper[implSymbol]);
  53. }
  54. return wrapper;
  55. };
  56. exports.new = (globalObject, newTarget) => {
  57. const wrapper = makeWrapper(globalObject, newTarget);
  58. exports._internalSetup(wrapper, globalObject);
  59. Object.defineProperty(wrapper, implSymbol, {
  60. value: Object.create(Impl.implementation.prototype),
  61. configurable: true
  62. });
  63. wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
  64. if (Impl.init) {
  65. Impl.init(wrapper[implSymbol]);
  66. }
  67. return wrapper[implSymbol];
  68. };
  69. const exposed = new Set(["Window"]);
  70. exports.install = (globalObject, globalNames) => {
  71. if (!globalNames.some(globalName => exposed.has(globalName))) {
  72. return;
  73. }
  74. const ctorRegistry = utils.initCtorRegistry(globalObject);
  75. class MouseEvent extends globalObject.UIEvent {
  76. constructor(type) {
  77. if (arguments.length < 1) {
  78. throw new globalObject.TypeError(
  79. `Failed to construct 'MouseEvent': 1 argument required, but only ${arguments.length} present.`
  80. );
  81. }
  82. const args = [];
  83. {
  84. let curArg = arguments[0];
  85. curArg = conversions["DOMString"](curArg, {
  86. context: "Failed to construct 'MouseEvent': parameter 1",
  87. globals: globalObject
  88. });
  89. args.push(curArg);
  90. }
  91. {
  92. let curArg = arguments[1];
  93. curArg = MouseEventInit.convert(globalObject, curArg, {
  94. context: "Failed to construct 'MouseEvent': parameter 2"
  95. });
  96. args.push(curArg);
  97. }
  98. return exports.setup(Object.create(new.target.prototype), globalObject, args);
  99. }
  100. getModifierState(keyArg) {
  101. const esValue = this !== null && this !== undefined ? this : globalObject;
  102. if (!exports.is(esValue)) {
  103. throw new globalObject.TypeError(
  104. "'getModifierState' called on an object that is not a valid instance of MouseEvent."
  105. );
  106. }
  107. if (arguments.length < 1) {
  108. throw new globalObject.TypeError(
  109. `Failed to execute 'getModifierState' on 'MouseEvent': 1 argument required, but only ${arguments.length} present.`
  110. );
  111. }
  112. const args = [];
  113. {
  114. let curArg = arguments[0];
  115. curArg = conversions["DOMString"](curArg, {
  116. context: "Failed to execute 'getModifierState' on 'MouseEvent': parameter 1",
  117. globals: globalObject
  118. });
  119. args.push(curArg);
  120. }
  121. return esValue[implSymbol].getModifierState(...args);
  122. }
  123. initMouseEvent(typeArg) {
  124. const esValue = this !== null && this !== undefined ? this : globalObject;
  125. if (!exports.is(esValue)) {
  126. throw new globalObject.TypeError(
  127. "'initMouseEvent' called on an object that is not a valid instance of MouseEvent."
  128. );
  129. }
  130. if (arguments.length < 1) {
  131. throw new globalObject.TypeError(
  132. `Failed to execute 'initMouseEvent' on 'MouseEvent': 1 argument required, but only ${arguments.length} present.`
  133. );
  134. }
  135. const args = [];
  136. {
  137. let curArg = arguments[0];
  138. curArg = conversions["DOMString"](curArg, {
  139. context: "Failed to execute 'initMouseEvent' on 'MouseEvent': parameter 1",
  140. globals: globalObject
  141. });
  142. args.push(curArg);
  143. }
  144. {
  145. let curArg = arguments[1];
  146. if (curArg !== undefined) {
  147. curArg = conversions["boolean"](curArg, {
  148. context: "Failed to execute 'initMouseEvent' on 'MouseEvent': parameter 2",
  149. globals: globalObject
  150. });
  151. } else {
  152. curArg = false;
  153. }
  154. args.push(curArg);
  155. }
  156. {
  157. let curArg = arguments[2];
  158. if (curArg !== undefined) {
  159. curArg = conversions["boolean"](curArg, {
  160. context: "Failed to execute 'initMouseEvent' on 'MouseEvent': parameter 3",
  161. globals: globalObject
  162. });
  163. } else {
  164. curArg = false;
  165. }
  166. args.push(curArg);
  167. }
  168. {
  169. let curArg = arguments[3];
  170. if (curArg !== undefined) {
  171. if (curArg === null || curArg === undefined) {
  172. curArg = null;
  173. } else {
  174. curArg = utils.tryImplForWrapper(curArg);
  175. }
  176. } else {
  177. curArg = null;
  178. }
  179. args.push(curArg);
  180. }
  181. {
  182. let curArg = arguments[4];
  183. if (curArg !== undefined) {
  184. curArg = conversions["long"](curArg, {
  185. context: "Failed to execute 'initMouseEvent' on 'MouseEvent': parameter 5",
  186. globals: globalObject
  187. });
  188. } else {
  189. curArg = 0;
  190. }
  191. args.push(curArg);
  192. }
  193. {
  194. let curArg = arguments[5];
  195. if (curArg !== undefined) {
  196. curArg = conversions["long"](curArg, {
  197. context: "Failed to execute 'initMouseEvent' on 'MouseEvent': parameter 6",
  198. globals: globalObject
  199. });
  200. } else {
  201. curArg = 0;
  202. }
  203. args.push(curArg);
  204. }
  205. {
  206. let curArg = arguments[6];
  207. if (curArg !== undefined) {
  208. curArg = conversions["long"](curArg, {
  209. context: "Failed to execute 'initMouseEvent' on 'MouseEvent': parameter 7",
  210. globals: globalObject
  211. });
  212. } else {
  213. curArg = 0;
  214. }
  215. args.push(curArg);
  216. }
  217. {
  218. let curArg = arguments[7];
  219. if (curArg !== undefined) {
  220. curArg = conversions["long"](curArg, {
  221. context: "Failed to execute 'initMouseEvent' on 'MouseEvent': parameter 8",
  222. globals: globalObject
  223. });
  224. } else {
  225. curArg = 0;
  226. }
  227. args.push(curArg);
  228. }
  229. {
  230. let curArg = arguments[8];
  231. if (curArg !== undefined) {
  232. curArg = conversions["long"](curArg, {
  233. context: "Failed to execute 'initMouseEvent' on 'MouseEvent': parameter 9",
  234. globals: globalObject
  235. });
  236. } else {
  237. curArg = 0;
  238. }
  239. args.push(curArg);
  240. }
  241. {
  242. let curArg = arguments[9];
  243. if (curArg !== undefined) {
  244. curArg = conversions["boolean"](curArg, {
  245. context: "Failed to execute 'initMouseEvent' on 'MouseEvent': parameter 10",
  246. globals: globalObject
  247. });
  248. } else {
  249. curArg = 0;
  250. }
  251. args.push(curArg);
  252. }
  253. {
  254. let curArg = arguments[10];
  255. if (curArg !== undefined) {
  256. curArg = conversions["boolean"](curArg, {
  257. context: "Failed to execute 'initMouseEvent' on 'MouseEvent': parameter 11",
  258. globals: globalObject
  259. });
  260. } else {
  261. curArg = 0;
  262. }
  263. args.push(curArg);
  264. }
  265. {
  266. let curArg = arguments[11];
  267. if (curArg !== undefined) {
  268. curArg = conversions["boolean"](curArg, {
  269. context: "Failed to execute 'initMouseEvent' on 'MouseEvent': parameter 12",
  270. globals: globalObject
  271. });
  272. } else {
  273. curArg = 0;
  274. }
  275. args.push(curArg);
  276. }
  277. {
  278. let curArg = arguments[12];
  279. if (curArg !== undefined) {
  280. curArg = conversions["boolean"](curArg, {
  281. context: "Failed to execute 'initMouseEvent' on 'MouseEvent': parameter 13",
  282. globals: globalObject
  283. });
  284. } else {
  285. curArg = 0;
  286. }
  287. args.push(curArg);
  288. }
  289. {
  290. let curArg = arguments[13];
  291. if (curArg !== undefined) {
  292. curArg = conversions["short"](curArg, {
  293. context: "Failed to execute 'initMouseEvent' on 'MouseEvent': parameter 14",
  294. globals: globalObject
  295. });
  296. } else {
  297. curArg = 0;
  298. }
  299. args.push(curArg);
  300. }
  301. {
  302. let curArg = arguments[14];
  303. if (curArg !== undefined) {
  304. if (curArg === null || curArg === undefined) {
  305. curArg = null;
  306. } else {
  307. curArg = EventTarget.convert(globalObject, curArg, {
  308. context: "Failed to execute 'initMouseEvent' on 'MouseEvent': parameter 15"
  309. });
  310. }
  311. } else {
  312. curArg = null;
  313. }
  314. args.push(curArg);
  315. }
  316. return esValue[implSymbol].initMouseEvent(...args);
  317. }
  318. get screenX() {
  319. const esValue = this !== null && this !== undefined ? this : globalObject;
  320. if (!exports.is(esValue)) {
  321. throw new globalObject.TypeError(
  322. "'get screenX' called on an object that is not a valid instance of MouseEvent."
  323. );
  324. }
  325. return esValue[implSymbol]["screenX"];
  326. }
  327. get screenY() {
  328. const esValue = this !== null && this !== undefined ? this : globalObject;
  329. if (!exports.is(esValue)) {
  330. throw new globalObject.TypeError(
  331. "'get screenY' called on an object that is not a valid instance of MouseEvent."
  332. );
  333. }
  334. return esValue[implSymbol]["screenY"];
  335. }
  336. get clientX() {
  337. const esValue = this !== null && this !== undefined ? this : globalObject;
  338. if (!exports.is(esValue)) {
  339. throw new globalObject.TypeError(
  340. "'get clientX' called on an object that is not a valid instance of MouseEvent."
  341. );
  342. }
  343. return esValue[implSymbol]["clientX"];
  344. }
  345. get clientY() {
  346. const esValue = this !== null && this !== undefined ? this : globalObject;
  347. if (!exports.is(esValue)) {
  348. throw new globalObject.TypeError(
  349. "'get clientY' called on an object that is not a valid instance of MouseEvent."
  350. );
  351. }
  352. return esValue[implSymbol]["clientY"];
  353. }
  354. get ctrlKey() {
  355. const esValue = this !== null && this !== undefined ? this : globalObject;
  356. if (!exports.is(esValue)) {
  357. throw new globalObject.TypeError(
  358. "'get ctrlKey' called on an object that is not a valid instance of MouseEvent."
  359. );
  360. }
  361. return esValue[implSymbol]["ctrlKey"];
  362. }
  363. get shiftKey() {
  364. const esValue = this !== null && this !== undefined ? this : globalObject;
  365. if (!exports.is(esValue)) {
  366. throw new globalObject.TypeError(
  367. "'get shiftKey' called on an object that is not a valid instance of MouseEvent."
  368. );
  369. }
  370. return esValue[implSymbol]["shiftKey"];
  371. }
  372. get altKey() {
  373. const esValue = this !== null && this !== undefined ? this : globalObject;
  374. if (!exports.is(esValue)) {
  375. throw new globalObject.TypeError(
  376. "'get altKey' called on an object that is not a valid instance of MouseEvent."
  377. );
  378. }
  379. return esValue[implSymbol]["altKey"];
  380. }
  381. get metaKey() {
  382. const esValue = this !== null && this !== undefined ? this : globalObject;
  383. if (!exports.is(esValue)) {
  384. throw new globalObject.TypeError(
  385. "'get metaKey' called on an object that is not a valid instance of MouseEvent."
  386. );
  387. }
  388. return esValue[implSymbol]["metaKey"];
  389. }
  390. get button() {
  391. const esValue = this !== null && this !== undefined ? this : globalObject;
  392. if (!exports.is(esValue)) {
  393. throw new globalObject.TypeError(
  394. "'get button' called on an object that is not a valid instance of MouseEvent."
  395. );
  396. }
  397. return esValue[implSymbol]["button"];
  398. }
  399. get buttons() {
  400. const esValue = this !== null && this !== undefined ? this : globalObject;
  401. if (!exports.is(esValue)) {
  402. throw new globalObject.TypeError(
  403. "'get buttons' called on an object that is not a valid instance of MouseEvent."
  404. );
  405. }
  406. return esValue[implSymbol]["buttons"];
  407. }
  408. get relatedTarget() {
  409. const esValue = this !== null && this !== undefined ? this : globalObject;
  410. if (!exports.is(esValue)) {
  411. throw new globalObject.TypeError(
  412. "'get relatedTarget' called on an object that is not a valid instance of MouseEvent."
  413. );
  414. }
  415. return utils.tryWrapperForImpl(esValue[implSymbol]["relatedTarget"]);
  416. }
  417. get pageX() {
  418. const esValue = this !== null && this !== undefined ? this : globalObject;
  419. if (!exports.is(esValue)) {
  420. throw new globalObject.TypeError("'get pageX' called on an object that is not a valid instance of MouseEvent.");
  421. }
  422. return esValue[implSymbol]["pageX"];
  423. }
  424. get pageY() {
  425. const esValue = this !== null && this !== undefined ? this : globalObject;
  426. if (!exports.is(esValue)) {
  427. throw new globalObject.TypeError("'get pageY' called on an object that is not a valid instance of MouseEvent.");
  428. }
  429. return esValue[implSymbol]["pageY"];
  430. }
  431. get x() {
  432. const esValue = this !== null && this !== undefined ? this : globalObject;
  433. if (!exports.is(esValue)) {
  434. throw new globalObject.TypeError("'get x' called on an object that is not a valid instance of MouseEvent.");
  435. }
  436. return esValue[implSymbol]["x"];
  437. }
  438. get y() {
  439. const esValue = this !== null && this !== undefined ? this : globalObject;
  440. if (!exports.is(esValue)) {
  441. throw new globalObject.TypeError("'get y' called on an object that is not a valid instance of MouseEvent.");
  442. }
  443. return esValue[implSymbol]["y"];
  444. }
  445. get offsetX() {
  446. const esValue = this !== null && this !== undefined ? this : globalObject;
  447. if (!exports.is(esValue)) {
  448. throw new globalObject.TypeError(
  449. "'get offsetX' called on an object that is not a valid instance of MouseEvent."
  450. );
  451. }
  452. return esValue[implSymbol]["offsetX"];
  453. }
  454. get offsetY() {
  455. const esValue = this !== null && this !== undefined ? this : globalObject;
  456. if (!exports.is(esValue)) {
  457. throw new globalObject.TypeError(
  458. "'get offsetY' called on an object that is not a valid instance of MouseEvent."
  459. );
  460. }
  461. return esValue[implSymbol]["offsetY"];
  462. }
  463. get movementX() {
  464. const esValue = this !== null && this !== undefined ? this : globalObject;
  465. if (!exports.is(esValue)) {
  466. throw new globalObject.TypeError(
  467. "'get movementX' called on an object that is not a valid instance of MouseEvent."
  468. );
  469. }
  470. return esValue[implSymbol]["movementX"];
  471. }
  472. get movementY() {
  473. const esValue = this !== null && this !== undefined ? this : globalObject;
  474. if (!exports.is(esValue)) {
  475. throw new globalObject.TypeError(
  476. "'get movementY' called on an object that is not a valid instance of MouseEvent."
  477. );
  478. }
  479. return esValue[implSymbol]["movementY"];
  480. }
  481. }
  482. Object.defineProperties(MouseEvent.prototype, {
  483. getModifierState: { enumerable: true },
  484. initMouseEvent: { enumerable: true },
  485. screenX: { enumerable: true },
  486. screenY: { enumerable: true },
  487. clientX: { enumerable: true },
  488. clientY: { enumerable: true },
  489. ctrlKey: { enumerable: true },
  490. shiftKey: { enumerable: true },
  491. altKey: { enumerable: true },
  492. metaKey: { enumerable: true },
  493. button: { enumerable: true },
  494. buttons: { enumerable: true },
  495. relatedTarget: { enumerable: true },
  496. pageX: { enumerable: true },
  497. pageY: { enumerable: true },
  498. x: { enumerable: true },
  499. y: { enumerable: true },
  500. offsetX: { enumerable: true },
  501. offsetY: { enumerable: true },
  502. movementX: { enumerable: true },
  503. movementY: { enumerable: true },
  504. [Symbol.toStringTag]: { value: "MouseEvent", configurable: true }
  505. });
  506. ctorRegistry[interfaceName] = MouseEvent;
  507. Object.defineProperty(globalObject, interfaceName, {
  508. configurable: true,
  509. writable: true,
  510. value: MouseEvent
  511. });
  512. };
  513. const Impl = require("../../jsdom/living/events/MouseEvent-impl.js");