From 78a2dcb992ffa691bd598caa77b5079bdb7caad6 Mon Sep 17 00:00:00 2001 From: Ronald Brill Date: Sun, 2 Mar 2025 12:57:52 +0100 Subject: [PATCH 1/2] remove addAfterLoadAction support --- .../java/org/htmlunit/html/HtmlImage.java | 4 +-- src/main/java/org/htmlunit/html/HtmlPage.java | 26 ------------------- .../htmlunit/html/ScriptElementSupport.java | 3 +-- 3 files changed, 3 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/htmlunit/html/HtmlImage.java b/src/main/java/org/htmlunit/html/HtmlImage.java index 0695114fa4b..db96b54b8ba 100644 --- a/src/main/java/org/htmlunit/html/HtmlImage.java +++ b/src/main/java/org/htmlunit/html/HtmlImage.java @@ -163,7 +163,7 @@ public void execute() { doOnLoad(); } }; - htmlPage.addAfterLoadAction(action); + htmlPage.getWebClient().getJavaScriptEngine().addPostponedAction(action); return; } doOnLoad(); @@ -313,7 +313,7 @@ public void execute() { HtmlImage.this.fireEvent(event); } }; - htmlPage.addAfterLoadAction(action); + htmlPage.getWebClient().getJavaScriptEngine().addPostponedAction(action); } else { final AbstractJavaScriptEngine jsEngine = client.getJavaScriptEngine(); diff --git a/src/main/java/org/htmlunit/html/HtmlPage.java b/src/main/java/org/htmlunit/html/HtmlPage.java index c5a2710eac1..33a67560c69 100644 --- a/src/main/java/org/htmlunit/html/HtmlPage.java +++ b/src/main/java/org/htmlunit/html/HtmlPage.java @@ -74,7 +74,6 @@ import org.htmlunit.javascript.AbstractJavaScriptEngine; import org.htmlunit.javascript.HtmlUnitScriptable; import org.htmlunit.javascript.JavaScriptEngine; -import org.htmlunit.javascript.PostponedAction; import org.htmlunit.javascript.host.Window; import org.htmlunit.javascript.host.event.BeforeUnloadEvent; import org.htmlunit.javascript.host.event.Event; @@ -159,7 +158,6 @@ public class HtmlPage extends SgmlPage { private int snippetParserCount_; private int inlineSnippetParserCount_; private Collection attributeListeners_; - private List afterLoadActions_ = Collections.synchronizedList(new ArrayList<>()); private boolean cleaning_; private HtmlBase base_; private URL baseUrl_; @@ -316,28 +314,6 @@ && hasFeature(EVENT_FOCUS_ON_LOAD)) { } } } - - try { - while (!afterLoadActions_.isEmpty()) { - final PostponedAction action = afterLoadActions_.remove(0); - action.execute(); - } - } - catch (final IOException e) { - throw e; - } - catch (final Exception e) { - throw new RuntimeException(e); - } - executeRefreshIfNeeded(); - } - - /** - * Adds an action that should be executed once the page has been loaded. - * @param action the action - */ - void addAfterLoadAction(final PostponedAction action) { - afterLoadActions_.add(action); } /** @@ -1977,8 +1953,6 @@ public HtmlPage cloneNode(final boolean deep) { result.attributeListeners_ = null; result.selectionRanges_ = new ArrayList<>(3); - // the original one is synchronized so we should do that here too, shouldn't we? - result.afterLoadActions_ = Collections.synchronizedList(new ArrayList<>()); result.frameElements_ = new ArrayList<>(); for (DomNode child = getFirstChild(); child != null; child = child.getNextSibling()) { result.appendChild(child.cloneNode(true)); diff --git a/src/main/java/org/htmlunit/html/ScriptElementSupport.java b/src/main/java/org/htmlunit/html/ScriptElementSupport.java index 29b9639952e..dde7087c9f4 100644 --- a/src/main/java/org/htmlunit/html/ScriptElementSupport.java +++ b/src/main/java/org/htmlunit/html/ScriptElementSupport.java @@ -120,8 +120,7 @@ public void execute() { final AbstractJavaScriptEngine engine = webClient.getJavaScriptEngine(); if (element.hasAttribute("async") && !engine.isScriptRunning()) { - final HtmlPage owningPage = element.getHtmlPageOrNull(); - owningPage.addAfterLoadAction(action); + engine.addPostponedAction(action); } else if (element.hasAttribute("async") || postponed && StringUtils.isBlank(element.getTextContent())) { From 1e73c3194bf328c60842b580b77e1f966b2c702d Mon Sep 17 00:00:00 2001 From: Ronald Brill Date: Mon, 3 Mar 2025 16:07:23 +0100 Subject: [PATCH 2/2] Revert "remove addAfterLoadAction support" This reverts commit 78a2dcb992ffa691bd598caa77b5079bdb7caad6. --- .../java/org/htmlunit/html/HtmlImage.java | 4 +-- src/main/java/org/htmlunit/html/HtmlPage.java | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/htmlunit/html/HtmlImage.java b/src/main/java/org/htmlunit/html/HtmlImage.java index db96b54b8ba..0695114fa4b 100644 --- a/src/main/java/org/htmlunit/html/HtmlImage.java +++ b/src/main/java/org/htmlunit/html/HtmlImage.java @@ -163,7 +163,7 @@ public void execute() { doOnLoad(); } }; - htmlPage.getWebClient().getJavaScriptEngine().addPostponedAction(action); + htmlPage.addAfterLoadAction(action); return; } doOnLoad(); @@ -313,7 +313,7 @@ public void execute() { HtmlImage.this.fireEvent(event); } }; - htmlPage.getWebClient().getJavaScriptEngine().addPostponedAction(action); + htmlPage.addAfterLoadAction(action); } else { final AbstractJavaScriptEngine jsEngine = client.getJavaScriptEngine(); diff --git a/src/main/java/org/htmlunit/html/HtmlPage.java b/src/main/java/org/htmlunit/html/HtmlPage.java index 33a67560c69..c5a2710eac1 100644 --- a/src/main/java/org/htmlunit/html/HtmlPage.java +++ b/src/main/java/org/htmlunit/html/HtmlPage.java @@ -74,6 +74,7 @@ import org.htmlunit.javascript.AbstractJavaScriptEngine; import org.htmlunit.javascript.HtmlUnitScriptable; import org.htmlunit.javascript.JavaScriptEngine; +import org.htmlunit.javascript.PostponedAction; import org.htmlunit.javascript.host.Window; import org.htmlunit.javascript.host.event.BeforeUnloadEvent; import org.htmlunit.javascript.host.event.Event; @@ -158,6 +159,7 @@ public class HtmlPage extends SgmlPage { private int snippetParserCount_; private int inlineSnippetParserCount_; private Collection attributeListeners_; + private List afterLoadActions_ = Collections.synchronizedList(new ArrayList<>()); private boolean cleaning_; private HtmlBase base_; private URL baseUrl_; @@ -314,6 +316,28 @@ && hasFeature(EVENT_FOCUS_ON_LOAD)) { } } } + + try { + while (!afterLoadActions_.isEmpty()) { + final PostponedAction action = afterLoadActions_.remove(0); + action.execute(); + } + } + catch (final IOException e) { + throw e; + } + catch (final Exception e) { + throw new RuntimeException(e); + } + executeRefreshIfNeeded(); + } + + /** + * Adds an action that should be executed once the page has been loaded. + * @param action the action + */ + void addAfterLoadAction(final PostponedAction action) { + afterLoadActions_.add(action); } /** @@ -1953,6 +1977,8 @@ public HtmlPage cloneNode(final boolean deep) { result.attributeListeners_ = null; result.selectionRanges_ = new ArrayList<>(3); + // the original one is synchronized so we should do that here too, shouldn't we? + result.afterLoadActions_ = Collections.synchronizedList(new ArrayList<>()); result.frameElements_ = new ArrayList<>(); for (DomNode child = getFirstChild(); child != null; child = child.getNextSibling()) { result.appendChild(child.cloneNode(true));