String scriptEncoding = charset;
final String pageEncoding = getPageEncoding();
final WebRequestSettings referringRequest = getWebResponse().getRequestSettings();
final WebClient client = getWebClient();
final Cache cache = client.getCache();
final WebRequestSettings request = new WebRequestSettings(url);
request.setAdditionalHeaders(new HashMap<String, String>(referringRequest.getAdditionalHeaders()));
request.setAdditionalHeader("Referer", referringRequest.getUrl().toString());
final Object cachedScript = cache.getCachedObject(request);
if (cachedScript instanceof Script) {
return (Script) cachedScript;
}
final WebResponse response = client.loadWebResponse(request);
client.printContentIfNecessary(response);
client.throwFailingHttpStatusCodeExceptionIfNecessary(response);
final int statusCode = response.getStatusCode();
final boolean successful = (statusCode >= HttpStatus.SC_OK && statusCode < HttpStatus.SC_MULTIPLE_CHOICES);
final boolean noContent = (statusCode == HttpStatus.SC_NO_CONTENT);
if (!successful || noContent) {
throw new IOException("Unable to download JavaScript from '" + url + "' (status " + statusCode + ").");
}
//http://www.ietf.org/rfc/rfc4329.txt
final String contentType = response.getContentType();
if (!contentType.equalsIgnoreCase("application/javascript")
&& !contentType.equalsIgnoreCase("application/ecmascript")) {
if (contentType.equals("text/javascript") || contentType.equals("text/ecmascript")) {
getWebClient().getIncorrectnessListener().notify(
"Obsolete content type encountered: '" + contentType + "'.", this);
}
else {
getWebClient().getIncorrectnessListener().notify(
"Expected content type of 'application/javascript' or 'application/ecmascript' for "
+ "remotely loaded JavaScript element at '" + url + "', "
+ "but got '" + contentType + "'.", this);
}
}
if (StringUtils.isEmpty(scriptEncoding)) {
final String contentCharset = response.getContentCharset();
if (!contentCharset.equals(TextUtil.DEFAULT_CHARSET)) {
scriptEncoding = contentCharset;
}
else if (!pageEncoding.equals(TextUtil.DEFAULT_CHARSET)) {
scriptEncoding = pageEncoding;
}
else {
scriptEncoding = TextUtil.DEFAULT_CHARSET;
}
}
final String scriptCode = response.getContentAsString(scriptEncoding);
final JavaScriptEngine javaScriptEngine = client.getJavaScriptEngine();
final Script script = javaScriptEngine.compile(this, scriptCode, url.toExternalForm(), 1);
if (script != null) {
cache.cacheIfPossible(request, response, script);
}
return script;
}