@Override public void runTest(TestRun run) throws IOException { if (++runs == 50) { runs = 0; cleanUp(); init(); } try { page.set(webClient.get().getPage("about:blank")); } catch (IOException e) { throw new RuntimeException(e); } HtmlPage pageRef = page.get(); pageRef.executeJavaScript(readFile(new File(run.getBaseDirectory(), run.getFileName()))); boolean decodeStack = Boolean.parseBoolean(System.getProperty(TeaVMTestRunner.JS_DECODE_STACK, "true")); File debugFile = decodeStack ? new File(run.getBaseDirectory(), run.getFileName() + ".teavmdbg") : null; RhinoResultParser resultParser = new RhinoResultParser(debugFile); AsyncResult asyncResult = new AsyncResult(); Function function = (Function) page.get().executeJavaScript(readResource("teavm-htmlunit-adapter.js")) .getJavaScriptResult(); Object[] args = new Object[] { decodeStack ? createStackDecoderFunction(resultParser) : null, new NativeJavaObject(function, asyncResult, AsyncResult.class) }; pageRef.executeJavaScriptFunction(function, function, args, page.get()); resultParser.parseResult((Scriptable) asyncResult.getResult(), run.getCallback()); }
if (newResult != null && !ScriptResult.isUndefined(newResult)) { jsResult = newResult.getJavaScriptResult(); jsResult = originalResult.getJavaScriptResult(); if (ScriptResult.isFalse(newResult)) { jsResult = newResult.getJavaScriptResult(); jsResult = originalResult.getJavaScriptResult(); page = newResult.getNewPage(); page = originalResult.getNewPage(); return null; return new ScriptResult(jsResult, page);
/** * <p class="changed_added_4_0">Run JavaScript expression in page context and returns result</p> * @param script * @return */ public Object runScript(String script){ ScriptResult scriptResult = page.executeJavaScript(script); page = (HtmlPage) scriptResult.getNewPage(); return scriptResult.getJavaScriptResult(); }
if (htmlPage.getWebClient().isJavaScriptEnabled()) { if (submitElement != null) { isPreventDefault_ = false; final ScriptResult scriptResult = fireEvent(Event.TYPE_SUBMIT); if (isPreventDefault_) { return scriptResult.getNewPage(); return htmlPage.executeJavaScriptIfPossible(action, "Form action", getStartLineNumber()).getNewPage(); final BrowserVersion browserVersion = getPage().getWebClient().getBrowserVersion(); if (!(browserVersion.isIE() && browserVersion.getBrowserVersionNumeric() >= 7) || queryFromFields.length() > 0) { try { if (actionUrl.length() == 0) { url = htmlPage.getWebResponse().getRequestSettings().getUrl(); final WebWindow webWindow = htmlPage.getEnclosingWindow(); return htmlPage.getWebClient().getPage( webWindow, htmlPage.getResolvedTarget(getTargetAttribute()),
final String href = getHrefAttribute() + hrefSuffix; if (LOG.isDebugEnabled()) { final String w = defaultPage.getEnclosingWindow().getName(); LOG.debug("do click action in window '" + w + "', using href '" + href + "'"); return page.executeJavaScriptIfPossible(href, "javascript url", getStartLineNumber()).getNewPage(); final URL url = page.getFullyQualifiedUrl(href); final WebRequestSettings wrs = new WebRequestSettings(url); wrs.setAdditionalHeader("Referer", page.getWebResponse().getRequestSettings().getUrl().toExternalForm()); if (LOG.isDebugEnabled()) { LOG.debug( + page.getWebResponse().getRequestSettings().getUrl()); return page.getWebClient().getPage( page.getEnclosingWindow(), page.getResolvedTarget(getTargetAttribute()),
protected Page doClickAction(final Page defaultPage) throws IOException { final HtmlPage enclosingPage = (HtmlPage) getPage(); final WebClient webClient = enclosingPage.getWebClient(); final HtmlPage page = (HtmlPage) getPage(); if (TextUtil.startsWithIgnoreCase(href, JAVASCRIPT_PREFIX)) { return page.executeJavaScriptIfPossible( href, "javascript url", getStartLineNumber()).getNewPage(); url = enclosingPage.getFullyQualifiedUrl(getHrefAttribute()); final WebWindow webWindow = enclosingPage.getEnclosingWindow(); return webClient.getPage( webWindow, enclosingPage.getResolvedTarget(getTargetAttribute()),
private WebResponse makeWebResponseForJavaScriptUrl(final WebWindow webWindow, final URL url, final String charset) throws FailingHttpStatusCodeException, IOException { final HtmlPage page; if (webWindow instanceof FrameWindow) { final FrameWindow frameWindow = (FrameWindow) webWindow; page = frameWindow.getEnclosingPage(); } else { Page currentPage = webWindow.getEnclosedPage(); if (currentPage == null) { // Starting with a JavaScript URL; quickly fill an "about:blank". currentPage = getPage(webWindow, new WebRequestSettings(WebClient.URL_ABOUT_BLANK)); } page = (HtmlPage) currentPage; } final ScriptResult r = page.executeJavaScriptIfPossible(url.toExternalForm(), "JavaScript URL", 1); if ((r != null && r.getJavaScriptResult() == null) || ScriptResult.isUndefined(r)) { // No new WebResponse to produce. return webWindow.getEnclosedPage().getWebResponse(); } final String contentString = r.getJavaScriptResult().toString(); return new StringWebResponse(contentString, charset, url); }
private WebResponse makeWebResponseForJavaScriptUrl(final WebWindow webWindow, final URL url, final Charset charset) throws FailingHttpStatusCodeException, IOException { HtmlPage page = null; if (webWindow instanceof FrameWindow) { final FrameWindow frameWindow = (FrameWindow) webWindow; page = (HtmlPage) frameWindow.getEnclosedPage(); } else { final Page currentPage = webWindow.getEnclosedPage(); if (currentPage instanceof HtmlPage) { page = (HtmlPage) currentPage; } } if (page == null) { page = getPage(webWindow, new WebRequest(WebClient.URL_ABOUT_BLANK)); } final ScriptResult r = page.executeJavaScript(url.toExternalForm(), "JavaScript URL", 1); if (r.getJavaScriptResult() == null || ScriptResult.isUndefined(r)) { // No new WebResponse to produce. return webWindow.getEnclosedPage().getWebResponse(); } final String contentString = r.getJavaScriptResult().toString(); final StringWebResponse response = new StringWebResponse(contentString, charset, url); response.setFromJavascript(true); return response; }
/** * <span style="color:red">INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.</span><br/> * * Execute a Function in the given context. * * @param function the JavaScript Function to call * @param thisObject the "this" object to be used during invocation * @param args the arguments to pass into the call * @param htmlElementScope the HTML element for which this script is being executed * This element will be the context during the JavaScript execution. If null, * the context will default to the page. * @return a ScriptResult which will contain both the current page (which may be different than * the previous page and a JavaScript result object. */ public ScriptResult executeJavaScriptFunctionIfPossible(final Function function, final Scriptable thisObject, final Object[] args, final DomNode htmlElementScope) { if (!getWebClient().isJavaScriptEnabled()) { return new ScriptResult(null, this); } final JavaScriptEngine engine = getWebClient().getJavaScriptEngine(); final Object result = engine.callFunction(this, function, thisObject, args, htmlElementScope); return new ScriptResult(result, getWebClient().getCurrentWindow().getEnclosedPage()); }
@Override public String runTest(TestRun run) throws IOException { if (++runs == 50) { runs = 0; cleanUp(); init(); } try { page.set(webClient.get().<HtmlPage>getPage("about:blank")); } catch (IOException e) { throw new RuntimeException(e); } page.get().executeJavaScript(readFile(new File(run.getBaseDirectory(), "runtime.js"))); page.get().executeJavaScript(readFile(new File(run.getBaseDirectory(), "test.js"))); AsyncResult asyncResult = new AsyncResult(); Function function = (Function) page.get().executeJavaScript(readResource("teavm-htmlunit-adapter.js")) .getJavaScriptResult(); Object[] args = new Object[] { new NativeJavaObject(function, asyncResult, AsyncResult.class) }; page.get().executeJavaScriptFunctionIfPossible(function, function, args, page.get()); return (String) asyncResult.getResult(); }
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3); webClient.setJavaScriptEnabled(true); HtmlPage page = webClient.getPage("http://www.google.com/ncr"); ScriptResult scriptResult = page.executeJavaScript("document.title"); System.out.println(scriptResult.getJavaScriptResult());
@Override public Object executeScript(String script, final Object... args) { HtmlPage page = getPageToInjectScriptInto(); script = "function() {" + script + "\n};"; ScriptResult result = page.executeJavaScript(script); Function func = (Function) result.getJavaScriptResult(); Object[] parameters = convertScriptArgs(page, args); try { result = page.executeJavaScriptFunctionIfPossible( func, (ScriptableObject) getCurrentWindow().getScriptObject(), parameters, page.getDocumentElement()); } catch (Throwable ex) { throw new WebDriverException(ex); } return parseNativeJavascriptResult(result); }
if (!getWebClient().getOptions().isJavaScriptEnabled()) { return new ScriptResult(Undefined.instance); final Object result = getWebClient().getJavaScriptEngine().execute(this, sourceCode, sourceName, startLine); return new ScriptResult(result);
/** * Executes the onchange script code for this element if this is appropriate. * This means that the element must have an onchange script, script must be enabled * and the change in the element must not have been triggered by a script. * * @param htmlElement the element that contains the onchange attribute * @return the page that occupies this window after this method completes (may or * may not be the same as the original page) */ static Page executeOnChangeHandlerIfAppropriate(final HtmlElement htmlElement) { final SgmlPage page = htmlElement.getPage(); final JavaScriptEngine engine = htmlElement.getPage().getWebClient().getJavaScriptEngine(); if (engine.isScriptRunning()) { return page; } final ScriptResult scriptResult = htmlElement.fireEvent(Event.TYPE_CHANGE); if (page.getWebClient().getWebWindows().contains(page.getEnclosingWindow())) { return page.getEnclosingWindow().getEnclosedPage(); // may be itself or a newly loaded one } else if (scriptResult != null) { // current window doesn't exist anymore return scriptResult.getNewPage(); } return page; } }
/** * <span style="color:red">INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.</span><br> * * Execute a Function in the given context. * * @param function the JavaScript Function to call * @param thisObject the "this" object to be used during invocation * @param args the arguments to pass into the call * @param htmlElementScope the HTML element for which this script is being executed * This element will be the context during the JavaScript execution. If null, * the context will default to the page. * @return a ScriptResult which will contain both the current page (which may be different than * the previous page and a JavaScript result object. */ public ScriptResult executeJavaScriptFunction(final Object function, final Object thisObject, final Object[] args, final DomNode htmlElementScope) { if (!getWebClient().getOptions().isJavaScriptEnabled()) { return new ScriptResult(null); } return executeJavaScriptFunction((Function) function, (Scriptable) thisObject, args, htmlElementScope); }
/** * Evaluates a JavaScript expression. * The expression is a string of JavaScript source code which will be evaluated in the context given by "this". * * @param expression the JavaScript expression * @return result Object * @throws JSException in case or error */ public Object eval(final String expression) throws JSException { if (LOG.isInfoEnabled()) { LOG.info("JSObject eval '" + expression + "'"); } final Page page = Window_.getWebWindow().getEnclosedPage(); if (page instanceof HtmlPage) { final HtmlPage htmlPage = (HtmlPage) page; final ScriptResult result = htmlPage.executeJavaScript(expression); final Object jsResult = result.getJavaScriptResult(); if (jsResult instanceof ScriptableObject) { return new JSObject((ScriptableObject) jsResult); } if (jsResult instanceof ConsString) { return ((ConsString) jsResult).toString(); } return jsResult; } return null; }
private ScriptResult executeEventListeners(final boolean useCapture, final Event event, final Object[] args) { final boolean ie = jsNode_.getWindow().getWebWindow().getWebClient().getBrowserVersion().isIE(); ScriptResult allResult = null; final List<Function> handlers = getHandlers(event.jsxGet_type(), useCapture); if (handlers != null && !handlers.isEmpty()) { event.setCurrentTarget(jsNode_); final DomNode node = jsNode_.getDomNodeOrDie(); final HtmlPage page = (HtmlPage) node.getPage(); // make a copy of the list as execution of an handler may (de-)register handlers final List<Function> handlersToExecute = new ArrayList<Function>(handlers); for (final Function listener : handlersToExecute) { final ScriptResult result = page.executeJavaScriptFunctionIfPossible(listener, jsNode_, args, node); if (event.isPropagationStopped()) { allResult = result; } if (ie) { if (ScriptResult.isFalse(result)) { allResult = result; } else { final Object eventReturnValue = event.jsxGet_returnValue(); if (eventReturnValue instanceof Boolean && !((Boolean) eventReturnValue).booleanValue()) { allResult = new ScriptResult(false, page); } } } } } return allResult; }
final HtmlPage page = (HtmlPage) getDomNodeOrDie().getPage(); final boolean ie = getBrowserVersion().isIE(); final Window window = (Window) page.getEnclosingWindow().getScriptObject(); final Object[] args = new Object[] {event}; if (elc != null) { final ScriptResult r = elc.executeCapturingListeners(event, args); result = ScriptResult.combine(r, result, ie); if (event.isPropagationStopped()) { return result; if (elc != null) { final ScriptResult r = elc.executeBubblingListeners(event, args, propHandlerArgs); result = ScriptResult.combine(r, result, ie); if (event.isPropagationStopped()) { return result; result = ScriptResult.combine(r, result, ie);
/** * Resets this form to its initial values, returning the page contained by this form's window after the * reset. Note that the returned page may or may not be the same as the original page, based on JavaScript * event handlers, etc. * * @return the page contained by this form's window after the reset */ public Page reset() { final SgmlPage htmlPage = getPage(); final ScriptResult scriptResult = fireEvent(Event.TYPE_RESET); if (ScriptResult.isFalse(scriptResult)) { return htmlPage.getWebClient().getCurrentWindow().getEnclosedPage(); } for (final HtmlElement next : getHtmlElementDescendants()) { if (next instanceof SubmittableElement) { ((SubmittableElement) next).reset(); } } return htmlPage; }
private String compileAndCache(String input) { ScriptResult scriptResult = htmlPage.get().executeJavaScript(String.format("CoffeeScript.compile(\"%s\");", input)); String result = (String) scriptResult.getJavaScriptResult(); cache.put(input, result); return result; }