| Index: examples/js/maps/geocoder_service.js
|
| diff --git a/examples/js/maps/geocoder_service.js b/examples/js/maps/geocoder_service.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..351a4606dfa894448880934268352da78256ad85
|
| --- /dev/null
|
| +++ b/examples/js/maps/geocoder_service.js
|
| @@ -0,0 +1,128 @@
|
| +#!mojo mojo:js_content_handler
|
| +
|
| +define("main", [
|
| + "console",
|
| + "examples/js/maps/geocoder.mojom",
|
| + "mojo/public/js/core",
|
| + "mojo/public/js/unicode",
|
| + "mojo/services/public/js/application",
|
| + "mojo/services/network/public/interfaces/network_service.mojom",
|
| + "mojo/services/network/public/interfaces/url_loader.mojom",
|
| + "third_party/js/url",
|
| +], function(console, geocoder, core, unicode, application, network, loader, url) {
|
| +
|
| + const Application = application.Application;
|
| + const Bounds = geocoder.Bounds;
|
| + const Geocoder = geocoder.Geocoder;
|
| + const Geometry = geocoder.Geometry;
|
| + const Location = geocoder.Location;
|
| + const NetworkService = network.NetworkService;
|
| + const Result = geocoder.Result;
|
| + const Status = geocoder.Status;
|
| + const URLRequest = loader.URLRequest;
|
| + const URL = url.URL;
|
| +
|
| + var netService;
|
| +
|
| + Location.prototype.queryString = function() {
|
| + // TBD: format floats to 6 decimal places
|
| + return this.latitude + ", " + this.longitude;
|
| + }
|
| +
|
| + Location.fromJSON = function(json) {
|
| + return !json ? null : new Location({
|
| + latitude: json.lat,
|
| + longitude: json.lng,
|
| + });
|
| + }
|
| +
|
| + Bounds.fromJSON = function(json) {
|
| + return !json ? null : new Bounds({
|
| + northeast: Location.fromJSON(json.northeast),
|
| + southwest: Location.fromJSON(json.southwest),
|
| + });
|
| + }
|
| +
|
| + Geometry.fromJSON = function(json) {
|
| + return !json ? null : new Geometry({
|
| + location: Location.fromJSON(json.location),
|
| + location_type: json.location_type,
|
| + viewport: Bounds.fromJSON(json.viewport),
|
| + bounds: Bounds.fromJSON(json.bounds),
|
| + });
|
| + }
|
| +
|
| + Result.fromJSON = function(json) {
|
| + return !json ? null : new Result({
|
| + partial_match: !!json.partial_match,
|
| + formatted_address: json.formatted_address,
|
| + geometry: Geometry.fromJSON(json.geometry),
|
| + types: json.types,
|
| + // TBD: address_components
|
| + });
|
| + }
|
| +
|
| + function parseGeocodeResponse(arrayBuffer) {
|
| + return JSON.parse(unicode.decodeUtf8String(new Uint8Array(arrayBuffer)));
|
| + }
|
| +
|
| + function geocodeRequest(url) {
|
| + return new Promise(function(resolveRequest) {
|
| + var urlLoader;
|
| + netService.createURLLoader(function(urlLoaderProxy) {
|
| + urlLoader = urlLoaderProxy;
|
| + });
|
| +
|
| + var urlRequest = new URLRequest({
|
| + url: url.format(),
|
| + method: "GET",
|
| + auto_follow_redirects: true
|
| + });
|
| +
|
| + urlLoader.start(urlRequest).then(function(urlLoaderResult) {
|
| + core.drainData(urlLoaderResult.response.body).then(
|
| + function(drainDataResult) {
|
| + // TBD: handle drainData failure
|
| + var value = parseGeocodeResponse(drainDataResult.buffer);
|
| + resolveRequest({
|
| + status: value.status,
|
| + results: value.results.map(Result.fromJSON),
|
| + });
|
| + });
|
| + });
|
| + });
|
| + }
|
| +
|
| + function geocodeURL(key, value, options) {
|
| + var url = new URL("https://maps.googleapis.com/maps/api/geocode/json");
|
| + url.query = {};
|
| + url.query[key] = value;
|
| + // TBD: add options url.query
|
| + return url;
|
| + }
|
| +
|
| + class GeocoderImpl {
|
| + addressToLocation(address, options) {
|
| + return geocodeRequest(geocodeURL("address", address, options));
|
| + }
|
| +
|
| + locationToAddress(location, options) {
|
| + return geocodeRequest(
|
| + geocodeURL("latlng", location.queryString(), options));
|
| + }
|
| + }
|
| +
|
| + class GeocoderService extends Application {
|
| + initialize() {
|
| + netService = this.shell.connectToService(
|
| + "mojo:network_service", NetworkService);
|
| + }
|
| +
|
| + acceptConnection(initiatorURL, serviceProvider) {
|
| + serviceProvider.provideService(Geocoder, GeocoderImpl);
|
| + }
|
| + }
|
| +
|
| + return GeocoderService;
|
| +});
|
| +
|
|
|