1 /*
2 * Copyright (c) 2002-2025 Gargoyle Software Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 * https://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 package org.htmlunit.javascript;
16
17 import org.htmlunit.Page;
18 import org.htmlunit.WebWindow;
19 import org.htmlunit.corejs.javascript.Scriptable;
20 import org.htmlunit.html.HtmlPage;
21 import org.htmlunit.javascript.configuration.JavaScriptConfiguration;
22
23 /**
24 * An interface for {@code JavaScriptEngine}.
25 *
26 * @param <SCRIPT> the script type
27 *
28 * @author Mike Bowler
29 * @author Chen Jun
30 * @author David K. Taylor
31 * @author Chris Erskine
32 * @author Ben Curren
33 * @author David D. Kilzer
34 * @author Marc Guillemot
35 * @author Daniel Gredler
36 * @author Ahmed Ashour
37 * @author Amit Manjhi
38 * @author Ronald Brill
39 * @author Frank Danek
40 */
41 public interface AbstractJavaScriptEngine<SCRIPT> {
42
43 /**
44 * Gets the associated configuration.
45 * @return the configuration
46 */
47 JavaScriptConfiguration getJavaScriptConfiguration();
48
49 /**
50 * Adds an action that should be executed first when the script currently being executed has finished.
51 * @param action the action
52 */
53 void addPostponedAction(PostponedAction action);
54
55 /**
56 * <span style="color:red">INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.</span><br>
57 * Process postponed actions, if any.
58 */
59 void processPostponedActions();
60
61 /**
62 * Register WebWindow with the JavaScriptExecutor.
63 * @param webWindow the WebWindow to be registered.
64 */
65 void registerWindowAndMaybeStartEventLoop(WebWindow webWindow);
66
67 /**
68 * Performs initialization for the given webWindow and page.
69 * @param webWindow the web window to initialize for
70 * @param page the page that will become the enclosing page
71 */
72 void initialize(WebWindow webWindow, Page page);
73
74 /**
75 * Sets the number of milliseconds that a script is allowed to execute before being terminated.
76 * A value of 0 or less means no timeout.
77 *
78 * @param timeout the timeout value, in milliseconds
79 */
80 void setJavaScriptTimeout(long timeout);
81
82 /**
83 * Returns the number of milliseconds that a script is allowed to execute before being terminated.
84 * A value of 0 or less means no timeout.
85 *
86 * @return the timeout value, in milliseconds
87 */
88 long getJavaScriptTimeout();
89
90 /**
91 * Disable starting of new js threads.
92 */
93 void prepareShutdown();
94
95 /**
96 * Shutdown the JavaScriptEngine.
97 */
98 void shutdown();
99
100 /**
101 * Indicates if JavaScript is running in current thread.
102 * This allows code to know if their own evaluation has been triggered by some JS code.
103 * @return {@code true} if JavaScript is running
104 */
105 boolean isScriptRunning();
106
107 /**
108 * <span style="color:red">INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.</span><br>
109 * Indicates that no postponed action should be executed.
110 */
111 void holdPosponedActions();
112
113 /**
114 * Compiles the specified JavaScript code in the context of a given scope.
115 *
116 * @param owningPage the page from which the code started
117 * @param scope the scope in which to execute the javascript code
118 * @param sourceCode the JavaScript code to execute
119 * @param sourceName the name that will be displayed on error conditions
120 * @param startLine the line at which the script source starts
121 * @return the result of executing the specified code
122 */
123 SCRIPT compile(HtmlPage owningPage, Scriptable scope, String sourceCode, String sourceName, int startLine);
124
125 /**
126 * Executes the specified JavaScript code in the context of a given page.
127 *
128 * @param page the page that the code will execute within
129 * @param scope the scope in which to execute
130 * @param script the script to execute
131 * @return the result of executing the specified code
132 */
133 Object execute(HtmlPage page, Scriptable scope, SCRIPT script);
134
135 /**
136 * Executes the specified JavaScript code in the context of a given page.
137 *
138 * @param page the page that the code will execute within
139 * @param scope the scope in which to execute
140 * @param sourceCode the JavaScript code to execute
141 * @param sourceName the name that will be displayed on error conditions
142 * @param startLine the line at which the script source starts
143 * @return the result of executing the specified code
144 */
145 Object execute(HtmlPage page,
146 Scriptable scope,
147 String sourceCode,
148 String sourceName,
149 int startLine);
150
151 /**
152 * @return this JavaScript engine's {@link HtmlUnitContextFactory}
153 */
154 HtmlUnitContextFactory getContextFactory();
155
156 }