Skip to content

events: allow an event to be dispatched multiple times #39395

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Closed
wants to merge 1 commit into from

Conversation

lpinca
Copy link
Member

@lpinca lpinca commented Jul 15, 2021

Use a different flag to prevent recursive dispatching.

@nodejs-github-bot nodejs-github-bot added the needs-ci PRs that need a full CI run. label Jul 15, 2021
Use a different flag to prevent recursive dispatching.
@lpinca lpinca force-pushed the fix/target-reset branch from 38a7c5c to 8a78837 Compare July 21, 2021 09:26
@lpinca lpinca changed the title events: reset the event target to null events: allow an event to be dispatched multiple times Jul 21, 2021
@lpinca
Copy link
Member Author

lpinca commented Jul 21, 2021

@aduh95 PTAL.

@@ -151,12 +153,12 @@ class Event {
// These are not supported in Node.js and are provided purely for
// API completeness.

composedPath() { return this[kTarget] ? [this[kTarget]] : []; }
composedPath() { return this[kIsBeingDispatched] ? [this[kTarget]] : []; }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unrelated to this PR: Chromium and Safari both return an empty array when dispatching an event. Firefox has the same behavior as Node.js. I couldn't find which behavior is spec compliant.

{
  // Same event dispatched multiple times.
  const event = new Event('foo');
  const eventTarget1 = new EventTarget();
  const eventTarget2 = new EventTarget();

  eventTarget1.addEventListener('foo', ((event) => {
    console.log(event.target===eventTarget1, event.eventPhase===Event.AT_TARGET); // true true
    const path = event.composedPath();
    console.log(path.length === 1, path[0]===eventTarget1); // depends on the browser:
    // On Firefox + Node.js: true true
    // On Safari + Chromium : false false
  }));

  eventTarget2.addEventListener('foo', ((event) => {
    console.log(event.target===eventTarget2, event.eventPhase===Event.AT_TARGET); // true true
    const path = event.composedPath();
    console.log(path.length === 1, path[0]===eventTarget2); // depends on the browser
  }));

  eventTarget1.dispatchEvent(event);
  console.log(event.target===eventTarget1, event.eventPhase===Event.NONE); // true true
  console.log(event.composedPath().length === 0); // true

  eventTarget2.dispatchEvent(event);
  console.log(event.target===eventTarget2, event.eventPhase===Event.NONE); // true true
  console.log(event.composedPath().length === 0); // true
}

@aduh95 aduh95 added author ready PRs that have at least one approval, no pending requests for changes, and a CI started. request-ci Add this label to start a Jenkins CI on a PR. labels Jul 21, 2021
@github-actions github-actions bot removed the request-ci Add this label to start a Jenkins CI on a PR. label Jul 21, 2021
@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

@lpinca lpinca added the eventtarget Issues and PRs related to the EventTarget implementation. label Jul 25, 2021
lpinca added a commit that referenced this pull request Jul 25, 2021
Use a different flag to prevent recursive dispatching.

PR-URL: #39395
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
@lpinca
Copy link
Member Author

lpinca commented Jul 25, 2021

Landed in 5c4e673.

@lpinca lpinca closed this Jul 25, 2021
@lpinca lpinca deleted the fix/target-reset branch July 25, 2021 14:18
targos pushed a commit that referenced this pull request Jul 26, 2021
Use a different flag to prevent recursive dispatching.

PR-URL: #39395
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
@BethGriggs BethGriggs mentioned this pull request Jul 26, 2021
richardlau pushed a commit that referenced this pull request Jul 29, 2021
Use a different flag to prevent recursive dispatching.

PR-URL: #39395
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
BethGriggs pushed a commit that referenced this pull request Jul 29, 2021
Use a different flag to prevent recursive dispatching.

PR-URL: #39395
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
mrbbot added a commit to mrbbot/node that referenced this pull request Aug 15, 2021
Fast path for EventTarget dispatch with no listeners didn't reset
kIsBeingDispatched flag, meaning same event couldn't be dispatched
multiple times.

Refs: nodejs#39395
mrbbot added a commit to mrbbot/node that referenced this pull request Aug 15, 2021
Fast path for EventTarget dispatch with no listeners didn't reset
kIsBeingDispatched flag, meaning same event couldn't be dispatched
multiple times.

Refs: nodejs#39395
lpinca pushed a commit that referenced this pull request Sep 26, 2021
Fast path for EventTarget dispatch with no listeners didn't reset
kIsBeingDispatched flag, meaning same event couldn't be dispatched
multiple times.

PR-URL: #39772
Refs: #39395
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
targos pushed a commit that referenced this pull request Oct 4, 2021
Fast path for EventTarget dispatch with no listeners didn't reset
kIsBeingDispatched flag, meaning same event couldn't be dispatched
multiple times.

PR-URL: #39772
Refs: #39395
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
author ready PRs that have at least one approval, no pending requests for changes, and a CI started. eventtarget Issues and PRs related to the EventTarget implementation. needs-ci PRs that need a full CI run.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants