OLD | NEW |
| (Empty) |
1 #!mojo mojo:js_content_handler | |
2 | |
3 define("main", [ | |
4 "console", | |
5 "examples/js/maps/geocoder.mojom", | |
6 "mojo/public/js/core", | |
7 "mojo/public/js/unicode", | |
8 "mojo/services/public/js/application", | |
9 "mojo/services/network/public/interfaces/network_service.mojom", | |
10 "mojo/services/network/public/interfaces/url_loader.mojom", | |
11 "third_party/js/url", | |
12 ], function(console, geocoder, core, unicode, application, network, loader, url)
{ | |
13 | |
14 const Application = application.Application; | |
15 const Bounds = geocoder.Bounds; | |
16 const Geocoder = geocoder.Geocoder; | |
17 const Geometry = geocoder.Geometry; | |
18 const Location = geocoder.Location; | |
19 const NetworkService = network.NetworkService; | |
20 const Result = geocoder.Result; | |
21 const Status = geocoder.Status; | |
22 const URLRequest = loader.URLRequest; | |
23 const URL = url.URL; | |
24 | |
25 var netService; | |
26 | |
27 Location.prototype.queryString = function() { | |
28 // TBD: format floats to 6 decimal places | |
29 return this.latitude + ", " + this.longitude; | |
30 } | |
31 | |
32 Location.fromJSON = function(json) { | |
33 return !json ? null : new Location({ | |
34 latitude: json.lat, | |
35 longitude: json.lng, | |
36 }); | |
37 } | |
38 | |
39 Bounds.fromJSON = function(json) { | |
40 return !json ? null : new Bounds({ | |
41 northeast: Location.fromJSON(json.northeast), | |
42 southwest: Location.fromJSON(json.southwest), | |
43 }); | |
44 } | |
45 | |
46 Geometry.fromJSON = function(json) { | |
47 return !json ? null : new Geometry({ | |
48 location: Location.fromJSON(json.location), | |
49 location_type: json.location_type, | |
50 viewport: Bounds.fromJSON(json.viewport), | |
51 bounds: Bounds.fromJSON(json.bounds), | |
52 }); | |
53 } | |
54 | |
55 Result.fromJSON = function(json) { | |
56 return !json ? null : new Result({ | |
57 partial_match: !!json.partial_match, | |
58 formatted_address: json.formatted_address, | |
59 geometry: Geometry.fromJSON(json.geometry), | |
60 types: json.types, | |
61 // TBD: address_components | |
62 }); | |
63 } | |
64 | |
65 function parseGeocodeResponse(arrayBuffer) { | |
66 return JSON.parse(unicode.decodeUtf8String(new Uint8Array(arrayBuffer))); | |
67 } | |
68 | |
69 function geocodeRequest(url) { | |
70 return new Promise(function(resolveRequest) { | |
71 var urlLoader; | |
72 netService.createURLLoader(function(urlLoaderProxy) { | |
73 urlLoader = urlLoaderProxy; | |
74 }); | |
75 | |
76 var urlRequest = new URLRequest({ | |
77 url: url.format(), | |
78 method: "GET", | |
79 auto_follow_redirects: true | |
80 }); | |
81 | |
82 urlLoader.start(urlRequest).then(function(urlLoaderResult) { | |
83 core.drainData(urlLoaderResult.response.body).then( | |
84 function(drainDataResult) { | |
85 // TBD: handle drainData failure | |
86 var value = parseGeocodeResponse(drainDataResult.buffer); | |
87 resolveRequest({ | |
88 status: value.status, | |
89 results: value.results.map(Result.fromJSON), | |
90 }); | |
91 }); | |
92 }); | |
93 }); | |
94 } | |
95 | |
96 function geocodeURL(key, value, options) { | |
97 var url = new URL("https://maps.googleapis.com/maps/api/geocode/json"); | |
98 url.query = {}; | |
99 url.query[key] = value; | |
100 // TBD: add options url.query | |
101 return url; | |
102 } | |
103 | |
104 class GeocoderImpl { | |
105 addressToLocation(address, options) { | |
106 return geocodeRequest(geocodeURL("address", address, options)); | |
107 } | |
108 | |
109 locationToAddress(location, options) { | |
110 return geocodeRequest( | |
111 geocodeURL("latlng", location.queryString(), options)); | |
112 } | |
113 } | |
114 | |
115 class GeocoderService extends Application { | |
116 initialize() { | |
117 netService = this.shell.connectToService( | |
118 "mojo:network_service", NetworkService); | |
119 } | |
120 | |
121 acceptConnection(initiatorURL, serviceProvider) { | |
122 serviceProvider.provideService(Geocoder, GeocoderImpl); | |
123 } | |
124 } | |
125 | |
126 return GeocoderService; | |
127 }); | |
128 | |
OLD | NEW |