Skip to content

Commit

Permalink
avoid creating event objects if not really needed
Browse files Browse the repository at this point in the history
  • Loading branch information
rbri committed Oct 12, 2024
1 parent 8eff58b commit 5e8a7eb
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 11 deletions.
2 changes: 1 addition & 1 deletion src/main/java/org/htmlunit/html/DomCharacterData.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/**
Expand Down
40 changes: 30 additions & 10 deletions src/main/java/org/htmlunit/html/DomNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -1059,7 +1059,7 @@ private void fireAddition(final DomNode domNode) {
onAddedToDocumentFragment();
}

fireNodeAdded(new DomChangeEvent(this, domNode));
fireNodeAdded(this, domNode);
}

/**
Expand Down Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -1635,16 +1634,23 @@ public void removeDomChangeListener(final DomChangeListener listener) {
*
* <p>Note that this method recursively calls this node's parent's {@link #fireNodeAdded(DomChangeEvent)}.</p>
*
* @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) {
final List<DomChangeListener> listeners;
synchronized (toInform) {
listeners = new ArrayList<>(toInform.domListeners_);
}

if (event == null) {
event = new DomChangeEvent(parentNode, addedNode);
}
for (final DomChangeListener domChangeListener : listeners) {
domChangeListener.nodeAdded(event);
}
Expand Down Expand Up @@ -1694,16 +1700,23 @@ public void removeCharacterDataChangeListener(final CharacterDataChangeListener
*
* <p>Note that this method recursively calls this node's parent's {@link #fireCharacterDataChanged}.</p>
*
* @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) {
final List<CharacterDataChangeListener> listeners;
synchronized (toInform) {
listeners = new ArrayList<>(toInform.characterDataListeners_);
}

if (event == null) {
event = new CharacterDataChangeEvent(characterData, oldValue);
}
for (final CharacterDataChangeListener domChangeListener : listeners) {
domChangeListener.characterDataChanged(event);
}
Expand All @@ -1719,16 +1732,23 @@ protected void fireCharacterDataChanged(final CharacterDataChangeEvent event) {
*
* <p>Note that this method recursively calls this node's parent's {@link #fireNodeDeleted(DomChangeEvent)}.</p>
*
* @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) {
final List<DomChangeListener> listeners;
synchronized (toInform) {
listeners = new ArrayList<>(toInform.domListeners_);
}

if (event == null) {
event = new DomChangeEvent(parentNode, deletedNode);
}
for (final DomChangeListener domChangeListener : listeners) {
domChangeListener.nodeDeleted(event);
}
Expand Down

0 comments on commit 5e8a7eb

Please sign in to comment.