Fix JSO dependencies

This commit is contained in:
Alexey Andreev 2015-09-09 15:11:23 +03:00
parent 0064abeab7
commit e717adcd84
10 changed files with 70 additions and 101 deletions

View File

@ -13,10 +13,18 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.teavm.samples.benchmark.teavm; package org.teavm.jso.browser;
import org.teavm.jso.JSBody;
import org.teavm.jso.JSObject; import org.teavm.jso.JSObject;
public interface Performance extends JSObject { public final class Performance implements JSObject {
double now(); private Performance() {
}
@JSBody(params = {}, script = "return Performance.now();")
public static native double now();
@JSBody(params = {}, script = "return typeof(Performance) !== 'undefined';")
public static native boolean isSupported();
} }

View File

@ -19,7 +19,9 @@ import java.lang.annotation.Annotation;
import org.teavm.dependency.PluggableDependency; import org.teavm.dependency.PluggableDependency;
import org.teavm.javascript.spi.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
import org.teavm.javascript.spi.InjectedBy; import org.teavm.javascript.spi.InjectedBy;
import org.teavm.jso.plugin.JS; import org.teavm.jso.JSBody;
import org.teavm.jso.JSObject;
import org.teavm.jso.browser.Window;
import org.teavm.platform.metadata.ClassResource; import org.teavm.platform.metadata.ClassResource;
import org.teavm.platform.metadata.StaticFieldResource; import org.teavm.platform.metadata.StaticFieldResource;
import org.teavm.platform.plugin.PlatformGenerator; import org.teavm.platform.plugin.PlatformGenerator;
@ -32,19 +34,21 @@ public final class Platform {
private Platform() { private Platform() {
} }
public static PlatformObject getPlatformObject(Object obj) { @InjectedBy(PlatformGenerator.class)
return (PlatformObject) JS.marshall(obj); public static native PlatformObject getPlatformObject(Object obj);
}
@GeneratedBy(PlatformGenerator.class) @GeneratedBy(PlatformGenerator.class)
@PluggableDependency(PlatformGenerator.class) @PluggableDependency(PlatformGenerator.class)
public static native Object clone(Object obj); public static native Object clone(Object obj);
public static boolean isInstance(PlatformObject obj, PlatformClass cls) { public static boolean isInstance(PlatformObject obj, PlatformClass cls) {
return obj != null && !JS.isUndefined(obj.getPlatformClass().getMetadata()) return obj != null && !isUndefined(obj.getPlatformClass().getMetadata())
&& isAssignable(obj.getPlatformClass(), cls); && isAssignable(obj.getPlatformClass(), cls);
} }
@JSBody(params = "object", script = "return typeof object === 'undefined';")
private static native boolean isUndefined(JSObject object);
public static boolean isAssignable(PlatformClass from, PlatformClass to) { public static boolean isAssignable(PlatformClass from, PlatformClass to) {
if (from == to) { if (from == to) {
return true; return true;
@ -63,15 +67,15 @@ public final class Platform {
public static native Class<?> asJavaClass(PlatformObject obj); public static native Class<?> asJavaClass(PlatformObject obj);
public static PlatformPrimitives getPrimitives() { public static PlatformPrimitives getPrimitives() {
return (PlatformPrimitives) JS.getGlobal(); return (PlatformPrimitives) Window.current();
} }
public static PlatformConsole getConsole() { public static PlatformConsole getConsole() {
return (PlatformConsole) JS.getGlobal(); return (PlatformConsole) Window.current();
} }
public static int nextObjectId() { public static int nextObjectId() {
return ((PlatformHelper) JS.getGlobal()).nextId(); return ((PlatformHelper) Window.current()).nextId();
} }
public static <T> T newInstance(PlatformClass cls) { public static <T> T newInstance(PlatformClass cls) {
@ -127,14 +131,14 @@ public final class Platform {
public static native int schedule(PlatformRunnable runnable, int timeout); public static native int schedule(PlatformRunnable runnable, int timeout);
public static void killSchedule(int id) { public static void killSchedule(int id) {
((PlatformHelper) JS.getGlobal()).killSchedule(id); ((PlatformHelper) Window.current()).killSchedule(id);
} }
public static <T> PlatformQueue<T> createQueue() { public static <T> PlatformQueue<T> createQueue() {
return ((PlatformHelper) JS.getGlobal()).newQueue(); return ((PlatformHelper) Window.current()).newQueue();
} }
public static PlatformString stringFromCharCode(int charCode) { public static PlatformString stringFromCharCode(int charCode) {
return ((PlatformHelper) JS.getGlobal()).getStringClass().fromCharCode(charCode); return ((PlatformHelper) Window.current()).getStringClass().fromCharCode(charCode);
} }
} }

View File

@ -69,6 +69,7 @@ public class PlatformGenerator implements Generator, Injector, DependencyPlugin
case "asJavaClass": case "asJavaClass":
case "classFromResource": case "classFromResource":
case "objectFromResource": case "objectFromResource":
case "marshall":
context.writeExpr(context.getArgument(0)); context.writeExpr(context.getArgument(0));
break; break;
} }

View File

@ -22,13 +22,12 @@ import org.jbox2d.collision.shapes.ShapeType;
import org.jbox2d.common.Vec2; import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Body; import org.jbox2d.dynamics.Body;
import org.jbox2d.dynamics.Fixture; import org.jbox2d.dynamics.Fixture;
import org.teavm.jso.browser.TimerHandler; import org.teavm.jso.browser.Performance;
import org.teavm.jso.browser.Window; import org.teavm.jso.browser.Window;
import org.teavm.jso.canvas.CanvasRenderingContext2D; import org.teavm.jso.canvas.CanvasRenderingContext2D;
import org.teavm.jso.dom.html.HTMLCanvasElement; import org.teavm.jso.dom.html.HTMLCanvasElement;
import org.teavm.jso.dom.html.HTMLDocument; import org.teavm.jso.dom.html.HTMLDocument;
import org.teavm.jso.dom.html.HTMLElement; import org.teavm.jso.dom.html.HTMLElement;
import org.teavm.jso.plugin.JS;
import org.teavm.samples.benchmark.Scene; import org.teavm.samples.benchmark.Scene;
/** /**
@ -36,11 +35,9 @@ import org.teavm.samples.benchmark.Scene;
* @author Alexey Andreev * @author Alexey Andreev
*/ */
public final class BenchmarkStarter { public final class BenchmarkStarter {
private static Window window = (Window) JS.getGlobal(); private static HTMLDocument document = Window.current().getDocument();
private static HTMLDocument document = window.getDocument();
private static HTMLCanvasElement canvas = (HTMLCanvasElement) document.getElementById("benchmark-canvas"); private static HTMLCanvasElement canvas = (HTMLCanvasElement) document.getElementById("benchmark-canvas");
private static HTMLElement resultTableBody = document.getElementById("result-table-body"); private static HTMLElement resultTableBody = document.getElementById("result-table-body");
private static Performance performance = (Performance) JS.get(window, JS.wrap("performance"));
private static Scene scene = new Scene(); private static Scene scene = new Scene();
private static int currentSecond; private static int currentSecond;
private static long startMillisecond; private static long startMillisecond;
@ -55,9 +52,9 @@ public final class BenchmarkStarter {
} }
private static void makeStep() { private static void makeStep() {
double start = performance.now(); double start = Performance.now();
scene.calculate(); scene.calculate();
double end = performance.now(); double end = Performance.now();
int second = (int) ((System.currentTimeMillis() - startMillisecond) / 1000); int second = (int) ((System.currentTimeMillis() - startMillisecond) / 1000);
if (second > currentSecond) { if (second > currentSecond) {
HTMLElement row = document.createElement("tr"); HTMLElement row = document.createElement("tr");
@ -74,11 +71,7 @@ public final class BenchmarkStarter {
} }
timeSpentCalculating += end - start; timeSpentCalculating += end - start;
render(); render();
window.setTimeout(new TimerHandler() { Window.setTimeout(() -> makeStep(), scene.timeUntilNextStep());
@Override public void onTimer() {
makeStep();
}
}, scene.timeUntilNextStep());
} }
private static void render() { private static void render() {

View File

@ -20,12 +20,10 @@ import org.teavm.jso.browser.Window;
import org.teavm.jso.dom.html.HTMLButtonElement; import org.teavm.jso.dom.html.HTMLButtonElement;
import org.teavm.jso.dom.html.HTMLDocument; import org.teavm.jso.dom.html.HTMLDocument;
import org.teavm.jso.dom.html.HTMLElement; import org.teavm.jso.dom.html.HTMLElement;
import org.teavm.jso.plugin.JS;
public final class Client { public final class Client {
private static Window window = (Window) JS.getGlobal(); private static HTMLDocument document = Window.current().getDocument();
private static HTMLDocument document = window.getDocument(); private static HTMLButtonElement helloButton = document.getElementById("hello-button").cast();
private static HTMLButtonElement helloButton = (HTMLButtonElement) document.getElementById("hello-button");
private static HTMLElement responsePanel = document.getElementById("response-panel"); private static HTMLElement responsePanel = document.getElementById("response-panel");
private static HTMLElement thinkingPanel = document.getElementById("thinking-panel"); private static HTMLElement thinkingPanel = document.getElementById("thinking-panel");
@ -39,7 +37,7 @@ public final class Client {
private static void sayHello() { private static void sayHello() {
helloButton.setDisabled(true); helloButton.setDisabled(true);
thinkingPanel.getStyle().setProperty("display", ""); thinkingPanel.getStyle().setProperty("display", "");
final XMLHttpRequest xhr = window.createXMLHttpRequest(); XMLHttpRequest xhr = XMLHttpRequest.create();
xhr.setOnReadyStateChange(() -> { xhr.setOnReadyStateChange(() -> {
if (xhr.getReadyState() == XMLHttpRequest.DONE) { if (xhr.getReadyState() == XMLHttpRequest.DONE) {
receiveResponse(xhr.getResponseText()); receiveResponse(xhr.getResponseText());

View File

@ -21,45 +21,42 @@ import org.teavm.jso.dom.html.HTMLButtonElement;
import org.teavm.jso.dom.html.HTMLDocument; import org.teavm.jso.dom.html.HTMLDocument;
import org.teavm.jso.dom.html.HTMLElement; import org.teavm.jso.dom.html.HTMLElement;
import org.teavm.jso.dom.html.HTMLInputElement; import org.teavm.jso.dom.html.HTMLInputElement;
import org.teavm.jso.plugin.JS;
/** /**
* *
* @author Junji Takakura * @author Junji Takakura
*/ */
public final class Application { public final class Application {
private static HTMLDocument document = Window.current().getDocument();
private static Window window = (Window) JS.getGlobal(); private static Storage storage = Window.current().getSessionStorage();
private static HTMLDocument document = window.getDocument();
private static Storage storage = window.getSessionStorage();
private Application() { private Application() {
} }
public static void main(String[] args) { public static void main(String[] args) {
if (storage == null) { if (storage == null) {
window.alert("storage is not supported."); Window.alert("storage is not supported.");
} }
HTMLButtonElement saveButton = (HTMLButtonElement) document.getElementById("save-button"); HTMLButtonElement saveButton = document.getElementById("save-button").cast();
saveButton.addEventListener("click", e -> { saveButton.addEventListener("click", e -> {
String key = ((HTMLInputElement) document.getElementById("key")).getValue(); String key = document.getElementById("key").<HTMLInputElement>cast().getValue();
String value = ((HTMLInputElement) document.getElementById("value")).getValue(); String value = document.getElementById("value").<HTMLInputElement>cast().getValue();
if (key != null && key.length() > 0 && value != null && value.length() > 0) { if (key != null && key.length() > 0 && value != null && value.length() > 0) {
storage.setItem(key, value); storage.setItem(key, value);
draw(); draw();
} }
}); });
HTMLButtonElement deleteButton = (HTMLButtonElement) document.getElementById("delete-button"); HTMLButtonElement deleteButton = document.getElementById("delete-button").cast();
deleteButton.addEventListener("click", e -> { deleteButton.addEventListener("click", e -> {
String key = ((HTMLInputElement) document.getElementById("key")).getValue(); String key = document.getElementById("key").<HTMLInputElement>cast().getValue();
if (key != null && key.length() > 0) { if (key != null && key.length() > 0) {
storage.removeItem(key); storage.removeItem(key);
draw(); draw();
} }
}); });
HTMLButtonElement deleteAllButton = (HTMLButtonElement) document.getElementById("delete-all-button"); HTMLButtonElement deleteAllButton = document.getElementById("delete-all-button").cast();
deleteAllButton.addEventListener("click", e -> { deleteAllButton.addEventListener("click", e -> {
storage.clear(); storage.clear();
draw(); draw();

View File

@ -22,28 +22,25 @@ import org.teavm.jso.dom.html.HTMLDocument;
import org.teavm.jso.dom.html.HTMLElement; import org.teavm.jso.dom.html.HTMLElement;
import org.teavm.jso.dom.html.HTMLSourceElement; import org.teavm.jso.dom.html.HTMLSourceElement;
import org.teavm.jso.dom.html.HTMLVideoElement; import org.teavm.jso.dom.html.HTMLVideoElement;
import org.teavm.jso.plugin.JS;
public final class Player { public final class Player {
private static HTMLDocument document = Window.current().getDocument();
private static Window window = (Window) JS.getGlobal();
private static HTMLDocument document = window.getDocument();
private Player() { private Player() {
} }
public static void main(String[] args) { public static void main(String[] args) {
HTMLSourceElement sourceMp4 = (HTMLSourceElement) document.createElement("source"); HTMLSourceElement sourceMp4 = document.createElement("source").cast();
sourceMp4.setAttribute("id", "mp4"); sourceMp4.setAttribute("id", "mp4");
sourceMp4.setSrc("http://media.w3.org/2010/05/sintel/trailer.mp4"); sourceMp4.setSrc("http://media.w3.org/2010/05/sintel/trailer.mp4");
sourceMp4.setAttribute("type", "video/mp4"); sourceMp4.setAttribute("type", "video/mp4");
HTMLSourceElement sourceWebm = (HTMLSourceElement) document.createElement("source"); HTMLSourceElement sourceWebm = document.createElement("source").cast();
sourceWebm.setAttribute("id", "webm"); sourceWebm.setAttribute("id", "webm");
sourceWebm.setSrc("http://media.w3.org/2010/05/sintel/trailer.webm"); sourceWebm.setSrc("http://media.w3.org/2010/05/sintel/trailer.webm");
sourceWebm.setAttribute("type", "video/webm"); sourceWebm.setAttribute("type", "video/webm");
HTMLSourceElement sourceOgv = (HTMLSourceElement) document.createElement("source"); HTMLSourceElement sourceOgv = document.createElement("source").cast();
sourceOgv.setAttribute("id", "ogv"); sourceOgv.setAttribute("id", "ogv");
sourceOgv.setSrc("http://media.w3.org/2010/05/sintel/trailer.ogv"); sourceOgv.setSrc("http://media.w3.org/2010/05/sintel/trailer.ogv");
sourceOgv.setAttribute("type", "video/ogg"); sourceOgv.setAttribute("type", "video/ogg");
@ -51,7 +48,7 @@ public final class Player {
HTMLElement p = document.createElement("p"); HTMLElement p = document.createElement("p");
p.appendChild(document.createTextNode("Your user agent does not support the HTML5 Video element.")); p.appendChild(document.createTextNode("Your user agent does not support the HTML5 Video element."));
HTMLVideoElement video = (HTMLVideoElement) document.createElement("video"); HTMLVideoElement video = document.createElement("video").cast();
video.setAttribute("id", "video"); video.setAttribute("id", "video");
video.setControls(true); video.setControls(true);
video.setPreload("none"); video.setPreload("none");
@ -65,61 +62,61 @@ public final class Player {
HTMLElement divVideo = document.createElement("div"); HTMLElement divVideo = document.createElement("div");
divVideo.appendChild(video); divVideo.appendChild(video);
HTMLButtonElement loadButton = (HTMLButtonElement) document.createElement("button"); HTMLButtonElement loadButton = document.createElement("button").cast();
loadButton.appendChild(document.createTextNode("load()")); loadButton.appendChild(document.createTextNode("load()"));
loadButton.addEventListener("click", evt -> video.load()); loadButton.addEventListener("click", evt -> video.load());
HTMLButtonElement playButton = (HTMLButtonElement) document.createElement("button"); HTMLButtonElement playButton = document.createElement("button").cast();
playButton.appendChild(document.createTextNode("play()")); playButton.appendChild(document.createTextNode("play()"));
playButton.addEventListener("click", evt -> video.play()); playButton.addEventListener("click", evt -> video.play());
HTMLButtonElement pauseButton = (HTMLButtonElement) document.createElement("button"); HTMLButtonElement pauseButton = document.createElement("button").cast();
pauseButton.appendChild(document.createTextNode("pause()")); pauseButton.appendChild(document.createTextNode("pause()"));
pauseButton.addEventListener("click", evt -> video.pause()); pauseButton.addEventListener("click", evt -> video.pause());
HTMLButtonElement currentTimePlusButton = (HTMLButtonElement) document.createElement("button"); HTMLButtonElement currentTimePlusButton = document.createElement("button").cast();
currentTimePlusButton.appendChild(document.createTextNode("currentTime+=10")); currentTimePlusButton.appendChild(document.createTextNode("currentTime+=10"));
currentTimePlusButton.addEventListener("click", evt -> video.setCurrentTime(video.getCurrentTime() + 10)); currentTimePlusButton.addEventListener("click", evt -> video.setCurrentTime(video.getCurrentTime() + 10));
HTMLButtonElement currentTimeMinusButton = (HTMLButtonElement) document.createElement("button"); HTMLButtonElement currentTimeMinusButton = document.createElement("button").cast();
currentTimeMinusButton.appendChild(document.createTextNode("currentTime-=10")); currentTimeMinusButton.appendChild(document.createTextNode("currentTime-=10"));
currentTimeMinusButton.addEventListener("click", evt -> video.setCurrentTime(video.getCurrentTime() - 10)); currentTimeMinusButton.addEventListener("click", evt -> video.setCurrentTime(video.getCurrentTime() - 10));
HTMLButtonElement currentTime50Button = (HTMLButtonElement) document.createElement("button"); HTMLButtonElement currentTime50Button = document.createElement("button").cast();
currentTime50Button.appendChild(document.createTextNode("currentTime=50")); currentTime50Button.appendChild(document.createTextNode("currentTime=50"));
currentTime50Button.addEventListener("click", evt -> video.setCurrentTime(50)); currentTime50Button.addEventListener("click", evt -> video.setCurrentTime(50));
HTMLButtonElement playbackRateIncrementButton = (HTMLButtonElement) document.createElement("button"); HTMLButtonElement playbackRateIncrementButton = document.createElement("button").cast();
playbackRateIncrementButton.appendChild(document.createTextNode("playbackRate++")); playbackRateIncrementButton.appendChild(document.createTextNode("playbackRate++"));
playbackRateIncrementButton.addEventListener("click", evt -> video.setPlaybackRate( playbackRateIncrementButton.addEventListener("click", evt -> video.setPlaybackRate(
video.getPlaybackRate() + 1)); video.getPlaybackRate() + 1));
HTMLButtonElement playbackRateDecrementButton = (HTMLButtonElement) document.createElement("button"); HTMLButtonElement playbackRateDecrementButton = document.createElement("button").cast();
playbackRateDecrementButton.appendChild(document.createTextNode("playbackRate--")); playbackRateDecrementButton.appendChild(document.createTextNode("playbackRate--"));
playbackRateDecrementButton.addEventListener("click", evt -> video.setPlaybackRate( playbackRateDecrementButton.addEventListener("click", evt -> video.setPlaybackRate(
video.getPlaybackRate() - 1)); video.getPlaybackRate() - 1));
HTMLButtonElement playbackRatePlusButton = (HTMLButtonElement) document.createElement("button"); HTMLButtonElement playbackRatePlusButton = document.createElement("button").cast();
playbackRatePlusButton.appendChild(document.createTextNode("playbackRate+=0.1")); playbackRatePlusButton.appendChild(document.createTextNode("playbackRate+=0.1"));
playbackRatePlusButton.addEventListener("click", evt -> video.setPlaybackRate(video.getPlaybackRate() + 0.1)); playbackRatePlusButton.addEventListener("click", evt -> video.setPlaybackRate(video.getPlaybackRate() + 0.1));
HTMLButtonElement playbackRateMinusButton = (HTMLButtonElement) document.createElement("button"); HTMLButtonElement playbackRateMinusButton = document.createElement("button").cast();
playbackRateMinusButton.appendChild(document.createTextNode("playbackRate-=0.1")); playbackRateMinusButton.appendChild(document.createTextNode("playbackRate-=0.1"));
playbackRateMinusButton.addEventListener("click", evt -> video.setPlaybackRate(video.getPlaybackRate() - 0.1)); playbackRateMinusButton.addEventListener("click", evt -> video.setPlaybackRate(video.getPlaybackRate() - 0.1));
HTMLButtonElement volumePlusButton = (HTMLButtonElement) document.createElement("button"); HTMLButtonElement volumePlusButton = document.createElement("button").cast();
volumePlusButton.appendChild(document.createTextNode("volume+=0.1")); volumePlusButton.appendChild(document.createTextNode("volume+=0.1"));
volumePlusButton.addEventListener("click", evt -> video.setVolume(video.getVolume() + 0.1f)); volumePlusButton.addEventListener("click", evt -> video.setVolume(video.getVolume() + 0.1f));
HTMLButtonElement volumeMinusButton = (HTMLButtonElement) document.createElement("button"); HTMLButtonElement volumeMinusButton = document.createElement("button").cast();
volumeMinusButton.appendChild(document.createTextNode("volume-=0.1")); volumeMinusButton.appendChild(document.createTextNode("volume-=0.1"));
volumeMinusButton.addEventListener("click", evt -> video.setVolume(video.getVolume() - 0.1f)); volumeMinusButton.addEventListener("click", evt -> video.setVolume(video.getVolume() - 0.1f));
HTMLButtonElement muteButton = (HTMLButtonElement) document.createElement("button"); HTMLButtonElement muteButton = document.createElement("button").cast();
muteButton.appendChild(document.createTextNode("muted=true")); muteButton.appendChild(document.createTextNode("muted=true"));
muteButton.addEventListener("click", evt -> video.setMuted(true)); muteButton.addEventListener("click", evt -> video.setMuted(true));
HTMLButtonElement unmuteButton = (HTMLButtonElement) document.createElement("button"); HTMLButtonElement unmuteButton = document.createElement("button").cast();
unmuteButton.appendChild(document.createTextNode("muted=false")); unmuteButton.appendChild(document.createTextNode("muted=false"));
unmuteButton.addEventListener("click", evt -> video.setMuted(false)); unmuteButton.addEventListener("click", evt -> video.setMuted(false));

View File

@ -19,7 +19,6 @@ import static org.junit.Assert.*;
import org.junit.Test; import org.junit.Test;
import org.teavm.jso.JSBody; import org.teavm.jso.JSBody;
import org.teavm.jso.JSObject; import org.teavm.jso.JSObject;
import org.teavm.jso.plugin.JS;
/** /**
* *
@ -28,14 +27,10 @@ import org.teavm.jso.plugin.JS;
public class JSOTest { public class JSOTest {
@Test @Test
public void complexConstructorParenthesized() { public void complexConstructorParenthesized() {
RegExp regexp = getWindow().createRegExp("."); RegExp regexp = RegExp.create();
assertEquals(".", regexp.getSource()); assertEquals(".", regexp.getSource());
} }
private static Window getWindow() {
return (Window)JS.getGlobal();
}
@Test @Test
public void externalMethodsResolved() { public void externalMethodsResolved() {
int r = jsMethod(new Callback() { int r = jsMethod(new Callback() {

View File

@ -15,6 +15,7 @@
*/ */
package org.teavm.jso.test; package org.teavm.jso.test;
import org.teavm.jso.JSBody;
import org.teavm.jso.JSObject; import org.teavm.jso.JSObject;
import org.teavm.jso.JSProperty; import org.teavm.jso.JSProperty;
@ -22,7 +23,10 @@ import org.teavm.jso.JSProperty;
* *
* @author Alexey Andreev * @author Alexey Andreev
*/ */
public interface RegExp extends JSObject { public abstract class RegExp implements JSObject {
@JSProperty @JSProperty
String getSource(); public abstract String getSource();
@JSBody(params = {}, script = "return new RegExp();")
public static native RegExp create();
} }

View File

@ -1,28 +0,0 @@
/*
* Copyright 2015 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.jso.test;
import org.teavm.jso.JSConstructor;
import org.teavm.jso.JSObject;
/**
*
* @author Alexey Andreev
*/
public interface Window extends JSObject {
@JSConstructor("RegExp")
RegExp createRegExp(String regex);
}