From 5e8a7eb2f04bc05c7ce0ab484835a51726c381b0 Mon Sep 17 00:00:00 2001 From: Ronald Brill Date: Sat, 12 Oct 2024 18:29:29 +0200 Subject: [PATCH] avoid creating event objects if not really needed --- .../org/htmlunit/html/DomCharacterData.java | 2 +- src/main/java/org/htmlunit/html/DomNode.java | 40 ++++++++++++++----- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/htmlunit/html/DomCharacterData.java b/src/main/java/org/htmlunit/html/DomCharacterData.java index 74948682c60..c78d27375e1 100644 --- a/src/main/java/org/htmlunit/html/DomCharacterData.java +++ b/src/main/java/org/htmlunit/html/DomCharacterData.java @@ -60,7 +60,7 @@ public String getData() { public void setData(final String data) { final String oldData = data_; data_ = data; - fireCharacterDataChanged(new CharacterDataChangeEvent(this, oldData)); + fireCharacterDataChanged(this, oldData); } /** diff --git a/src/main/java/org/htmlunit/html/DomNode.java b/src/main/java/org/htmlunit/html/DomNode.java index a25a2bf86c1..8fba9efb539 100644 --- a/src/main/java/org/htmlunit/html/DomNode.java +++ b/src/main/java/org/htmlunit/html/DomNode.java @@ -1059,7 +1059,7 @@ private void fireAddition(final DomNode domNode) { onAddedToDocumentFragment(); } - fireNodeAdded(new DomChangeEvent(this, domNode)); + fireNodeAdded(this, domNode); } /** @@ -1177,10 +1177,9 @@ private void fireRemoval(final DomNode exParent) { } if (exParent != null) { - final DomChangeEvent event = new DomChangeEvent(exParent, this); - fireNodeDeleted(event); + fireNodeDeleted(exParent, this); // ask ex-parent to fire event (because we don't have parent now) - exParent.fireNodeDeleted(event); + exParent.fireNodeDeleted(exParent, this); } } @@ -1635,9 +1634,12 @@ public void removeDomChangeListener(final DomChangeListener listener) { * *

Note that this method recursively calls this node's parent's {@link #fireNodeAdded(DomChangeEvent)}.

* - * @param event the DomChangeEvent to be propagated + * @param parentNode the parent of the node that was changed + * @param addedNode the node that has been added */ - protected void fireNodeAdded(final DomChangeEvent event) { + protected void fireNodeAdded(final DomNode parentNode, final DomNode addedNode) { + DomChangeEvent event = null; + DomNode toInform = this; while (toInform != null) { if (toInform.domListeners_ != null) { @@ -1645,6 +1647,10 @@ protected void fireNodeAdded(final DomChangeEvent event) { synchronized (toInform) { listeners = new ArrayList<>(toInform.domListeners_); } + + if (event == null) { + event = new DomChangeEvent(parentNode, addedNode); + } for (final DomChangeListener domChangeListener : listeners) { domChangeListener.nodeAdded(event); } @@ -1694,9 +1700,12 @@ public void removeCharacterDataChangeListener(final CharacterDataChangeListener * *

Note that this method recursively calls this node's parent's {@link #fireCharacterDataChanged}.

* - * @param event the CharacterDataChangeEvent to be propagated + * @param characterData the character data which is changed + * @param oldValue the old value */ - protected void fireCharacterDataChanged(final CharacterDataChangeEvent event) { + protected void fireCharacterDataChanged(final DomCharacterData characterData, final String oldValue) { + CharacterDataChangeEvent event = null; + DomNode toInform = this; while (toInform != null) { if (toInform.characterDataListeners_ != null) { @@ -1704,6 +1713,10 @@ protected void fireCharacterDataChanged(final CharacterDataChangeEvent event) { synchronized (toInform) { listeners = new ArrayList<>(toInform.characterDataListeners_); } + + if (event == null) { + event = new CharacterDataChangeEvent(characterData, oldValue); + } for (final CharacterDataChangeListener domChangeListener : listeners) { domChangeListener.characterDataChanged(event); } @@ -1719,9 +1732,12 @@ protected void fireCharacterDataChanged(final CharacterDataChangeEvent event) { * *

Note that this method recursively calls this node's parent's {@link #fireNodeDeleted(DomChangeEvent)}.

* - * @param event the DomChangeEvent to be propagated + * @param parentNode the parent of the node that was changed + * @param deletedNode the node that has been deleted */ - protected void fireNodeDeleted(final DomChangeEvent event) { + protected void fireNodeDeleted(final DomNode parentNode, final DomNode deletedNode) { + DomChangeEvent event = null; + DomNode toInform = this; while (toInform != null) { if (toInform.domListeners_ != null) { @@ -1729,6 +1745,10 @@ protected void fireNodeDeleted(final DomChangeEvent event) { synchronized (toInform) { listeners = new ArrayList<>(toInform.domListeners_); } + + if (event == null) { + event = new DomChangeEvent(parentNode, deletedNode); + } for (final DomChangeListener domChangeListener : listeners) { domChangeListener.nodeDeleted(event); }