1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.javascript.host.geo;
16
17 import org.htmlunit.WebClient;
18 import org.htmlunit.WebWindow;
19 import org.htmlunit.corejs.javascript.Function;
20 import org.htmlunit.html.HtmlPage;
21 import org.htmlunit.javascript.HtmlUnitScriptable;
22 import org.htmlunit.javascript.JavaScriptEngine;
23 import org.htmlunit.javascript.background.BackgroundJavaScriptFactory;
24 import org.htmlunit.javascript.background.JavaScriptJob;
25 import org.htmlunit.javascript.configuration.JsxClass;
26 import org.htmlunit.javascript.configuration.JsxConstructor;
27 import org.htmlunit.javascript.configuration.JsxFunction;
28
29
30
31
32
33
34
35 @JsxClass
36 public class Geolocation extends HtmlUnitScriptable {
37
38
39
40 private Function successHandler_;
41 private Function errorHandler_;
42
43
44
45
46 @JsxConstructor
47 public void jsConstructor() {
48 throw JavaScriptEngine.typeErrorIllegalConstructor();
49 }
50
51
52
53
54
55
56
57 @JsxFunction
58 public void getCurrentPosition(final Function successCallback, final Function errorCallback,
59 final Object options) {
60 successHandler_ = successCallback;
61 errorHandler_ = errorCallback;
62
63 final WebWindow webWindow = getWindow().getWebWindow();
64 if (webWindow.getWebClient().getOptions().isGeolocationEnabled()) {
65 final JavaScriptJob job = BackgroundJavaScriptFactory.theFactory()
66 .createJavaScriptJob(0, null, () -> doGetPosition());
67 webWindow.getJobManager().addJob(job, webWindow.getEnclosedPage());
68 }
69 }
70
71
72
73
74
75
76
77
78 @JsxFunction
79 public int watchPosition(final Function successCallback, final Object errorCallback,
80 final Object options) {
81 return 0;
82 }
83
84
85
86
87
88 @JsxFunction
89 public void clearWatch(final int watchId) {
90
91 }
92
93 void doGetPosition() {
94 final WebWindow ww = getWindow().getWebWindow();
95 final WebClient webClient = ww.getWebClient();
96
97 final org.htmlunit.WebClientOptions.Geolocation geolocation = webClient.getOptions().getGeolocation();
98
99 final GeolocationCoordinates coordinates = new GeolocationCoordinates(
100 geolocation.getLatitude(), geolocation.getLongitude(), geolocation.getAccuracy());
101 coordinates.setPrototype(getPrototype(coordinates.getClass()));
102
103 final GeolocationPosition position = new GeolocationPosition(coordinates);
104 position.setPrototype(getPrototype(position.getClass()));
105
106 final JavaScriptEngine jsEngine = (JavaScriptEngine) ww.getWebClient().getJavaScriptEngine();
107 jsEngine.callFunction((HtmlPage) ww.getEnclosedPage(), successHandler_,
108 getParentScope(), this, new Object[] {position});
109 }
110 }