use of com.gargoylesoftware.htmlunit.javascript.background.JavaScriptJob in project htmlunit by HtmlUnit.
the class WorkerJob method loadAndExecute.
void loadAndExecute(final WebClient webClient, final String url, final Context context, final boolean checkMimeType) throws IOException {
final HtmlPage page = (HtmlPage) owningWindow_.getDocument().getPage();
final URL fullUrl = page.getFullyQualifiedUrl(url);
final WebRequest webRequest = new WebRequest(fullUrl);
final WebResponse response = webClient.loadWebResponse(webRequest);
if (checkMimeType && !MimeType.isJavascriptMimeType(response.getContentType())) {
throw Context.reportRuntimeError("NetworkError: importScripts response is not a javascript response");
}
final String scriptCode = response.getContentAsString();
final JavaScriptEngine javaScriptEngine = (JavaScriptEngine) webClient.getJavaScriptEngine();
final DedicatedWorkerGlobalScope thisScope = this;
final ContextAction<Object> action = cx -> {
final Script script = javaScriptEngine.compile(page, thisScope, scriptCode, fullUrl.toExternalForm(), 1);
// script might be null here e.g. if there is a syntax error
if (script != null) {
return javaScriptEngine.execute(page, thisScope, script);
}
return null;
};
final ContextFactory cf = javaScriptEngine.getContextFactory();
if (context != null) {
action.run(context);
} else {
final JavaScriptJob job = new WorkerJob(cf, action, "loadAndExecute " + url);
owningWindow_.getWebWindow().getJobManager().addJob(job, page);
}
}
use of com.gargoylesoftware.htmlunit.javascript.background.JavaScriptJob in project htmlunit by HtmlUnit.
the class Geolocation method getCurrentPosition.
/**
* Gets the current position.
* @param successCallback success callback
* @param errorCallback optional error callback
* @param options optional options
*/
@JsxFunction
public void getCurrentPosition(final Function successCallback, final Object errorCallback, final Object options) {
successHandler_ = successCallback;
final WebWindow webWindow = getWindow().getWebWindow();
if (webWindow.getWebClient().getOptions().isGeolocationEnabled()) {
final JavaScriptJob job = BackgroundJavaScriptFactory.theFactory().createJavaScriptJob(0, null, () -> doGetPosition());
webWindow.getJobManager().addJob(job, webWindow.getEnclosedPage());
}
}
use of com.gargoylesoftware.htmlunit.javascript.background.JavaScriptJob in project htmlunit by HtmlUnit.
the class XMLHttpRequest method send.
/**
* Sends the specified content to the server in an HTTP request and receives the response.
* @param content the body of the message being sent with the request
*/
@JsxFunction
public void send(final Object content) {
if (webRequest_ == null) {
return;
}
if (!async_ && timeout_ > 0) {
Context.throwAsScriptRuntimeEx(new RuntimeException("Synchronous requests must not set a timeout."));
return;
}
prepareRequestContent(content);
if (timeout_ > 0) {
webRequest_.setTimeout(timeout_);
}
final Window w = getWindow();
final WebWindow ww = w.getWebWindow();
final WebClient client = ww.getWebClient();
final AjaxController ajaxController = client.getAjaxController();
final HtmlPage page = (HtmlPage) ww.getEnclosedPage();
final boolean synchron = ajaxController.processSynchron(page, webRequest_, async_);
if (synchron) {
doSend();
} else {
// Create and start a thread in which to execute the request.
final ContextFactory cf = ((JavaScriptEngine) client.getJavaScriptEngine()).getContextFactory();
final ContextAction<Object> action = new ContextAction<Object>() {
@Override
public Object run(final Context cx) {
// KEY_STARTING_SCOPE maintains a stack of scopes
@SuppressWarnings("unchecked") Deque<Scriptable> stack = (Deque<Scriptable>) cx.getThreadLocal(JavaScriptEngine.KEY_STARTING_SCOPE);
if (null == stack) {
stack = new ArrayDeque<>();
cx.putThreadLocal(JavaScriptEngine.KEY_STARTING_SCOPE, stack);
}
stack.push(w);
try {
doSend();
} finally {
stack.pop();
}
return null;
}
@Override
public String toString() {
return "XMLHttpRequest " + webRequest_.getHttpMethod() + " '" + webRequest_.getUrl() + "'";
}
};
final JavaScriptJob job = BackgroundJavaScriptFactory.theFactory().createJavascriptXMLHttpRequestJob(cf, action);
if (LOG.isDebugEnabled()) {
LOG.debug("Starting XMLHttpRequest thread for asynchronous request");
}
jobID_ = ww.getJobManager().addJob(job, page);
if (getBrowserVersion().hasFeature(XHR_FIRE_STATE_OPENED_AGAIN_IN_ASYNC_MODE)) {
// quite strange but IE seems to fire state loading twice
// in async mode (at least with HTML of the unit tests)
fireJavascriptEvent(Event.TYPE_READY_STATE_CHANGE);
}
if (!getBrowserVersion().hasFeature(XHR_LOAD_START_ASYNC)) {
fireJavascriptEvent(Event.TYPE_LOAD_START);
}
}
}
Aggregations