View Javadoc
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.background;
16  
17  import org.htmlunit.WebClient;
18  import org.htmlunit.WebWindow;
19  import org.htmlunit.corejs.javascript.ContextAction;
20  import org.htmlunit.corejs.javascript.ContextFactory;
21  import org.htmlunit.corejs.javascript.Function;
22  
23  /**
24   * A factory for all the things we have to construct from outside the
25   * JavaScript engine.
26   *
27   * @author Ronald Brill
28   * @author Atsushi Nakagawa
29   */
30  public class BackgroundJavaScriptFactory {
31  
32      private static BackgroundJavaScriptFactory Factory_ = new BackgroundJavaScriptFactory();
33  
34      /**
35       * Returns the current factory.
36       *
37       * @return the active factory
38       */
39      public static BackgroundJavaScriptFactory theFactory() {
40          return Factory_;
41      }
42  
43      /**
44       * Set the factory to a new one.
45       *
46       * @param factory the new factory.
47       */
48      public static void setFactory(final BackgroundJavaScriptFactory factory) {
49          Factory_ = factory;
50      }
51  
52      /**
53       * Creates a new JavaScript execution job, where the JavaScript code to execute is a string.
54       * @param initialDelay the initial amount of time to wait before executing this job
55       * @param period the amount of time to wait between executions of this job (maybe {@code null})
56       * @param label the label for the job
57       * @param window the window to which the job belongs
58       * @param script the JavaScript code to execute
59       *
60       * @return JavaScriptJob the created job
61       */
62      public JavaScriptJob createJavaScriptJob(final int initialDelay, final Integer period, final String label,
63              final WebWindow window, final String script) {
64          return new JavaScriptStringJob(initialDelay, period, label, window, script);
65      }
66  
67      /**
68       * Creates a new JavaScript execution job, where the JavaScript code to execute is a function.
69       * @param initialDelay the initial amount of time to wait before executing this job
70       * @param period the amount of time to wait between executions of this job (maybe {@code null})
71       * @param label the label for the job
72       * @param window the window to which the job belongs
73       * @param function the JavaScript code to execute
74       * @param args the arguments to pass into the function call
75       *
76       * @return JavaScriptJob the created job
77       */
78      public JavaScriptFunctionJob createJavaScriptJob(final int initialDelay,
79              final Integer period, final String label,
80              final WebWindow window, final Function function, final Object[] args) {
81          return new JavaScriptFunctionJob(initialDelay, period, label, window, function, args);
82      }
83  
84      /**
85       * Creates a new job for XMLHttpRequestProcessing.
86       * @param contextFactory the ContextFactory
87       * @param action the action
88       *
89       * @return JavaScriptJob the created job
90       */
91      public JavaScriptJob createJavascriptXMLHttpRequestJob(final ContextFactory contextFactory,
92              final ContextAction<Object> action) {
93          return new JavascriptXMLHttpRequestJob(contextFactory, action);
94      }
95  
96      /**
97       * Creates a new job.
98       * @param initialDelay the initial amount of time to wait before executing this job
99       * @param period the amount of time to wait between executions of this job (maybe {@code null})
100      * @param runnable the runnable to run
101      *
102      * @return JavaScriptJob the created job
103      */
104     public JavaScriptJob createJavaScriptJob(final int initialDelay, final Integer period, final Runnable runnable) {
105         return new BasicJavaScriptJob(initialDelay, period) {
106             @Override
107             public void run() {
108                 runnable.run();
109             }
110         };
111     }
112 
113     /**
114      * Creates the {@link JavaScriptExecutor} that will be used to handle JS.
115      * @param webClient the WebClient of the executor
116      * @return the executor.
117      */
118     public JavaScriptExecutor createJavaScriptExecutor(final WebClient webClient) {
119         return new DefaultJavaScriptExecutor(webClient);
120     }
121 
122     /**
123      * Creates a new JavaScriptJobManager for the given window.
124      * @param webWindow the window the JavaScriptJobManager will work for
125      * @return the new JavaScriptJobManager
126      */
127     public JavaScriptJobManager createJavaScriptJobManager(final WebWindow webWindow) {
128         return new JavaScriptJobManagerImpl(webWindow);
129     }
130 
131     /**
132      * The constructor.
133      */
134     protected BackgroundJavaScriptFactory() {
135         super();
136     }
137 }