diff options
Diffstat (limited to 'catapult/third_party/polymer/components/google-apis/google-client-loader.html')
-rw-r--r-- | catapult/third_party/polymer/components/google-apis/google-client-loader.html | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/catapult/third_party/polymer/components/google-apis/google-client-loader.html b/catapult/third_party/polymer/components/google-apis/google-client-loader.html new file mode 100644 index 00000000..0257a86b --- /dev/null +++ b/catapult/third_party/polymer/components/google-apis/google-client-loader.html @@ -0,0 +1,232 @@ +<!-- +Copyright (c) 2014 The Polymer Project Authors. All rights reserved. +This code may only be used under the BSD style license found at https://polymer.github.io/LICENSE.txt +The complete set of authors may be found at https://polymer.github.io/AUTHORS.txt +The complete set of contributors may be found at https://polymer.github.io/CONTRIBUTORS.txt +Code distributed by Google as part of the polymer project is also +subject to an additional IP rights grant found at https://polymer.github.io/PATENTS.txt +--> + +<link rel="import" href="../polymer/polymer.html"> +<link rel="import" href="google-js-api.html"> + +<!-- +Element for loading a specific client Google API with the JavaScript client library. + +For loading `gapi.client` libraries + +##### Example + + <google-client-loader id="shortener" + name="urlshortener" + version="v1"></google-client-loader> + + <script> + var shortener = document.getElementById('shortener'); + shortener.addEventListener('google-api-load', function(event) { + var request = shortener.api.url.get({ + shortUrl: 'http://goo.gl/fbsS' + }); + request.execute(function(resp) { + console.log(resp); + }); + }); + </script> + +@demo +--> + +<script> + (function() { + 'use strict'; + + // Stores whether the API client is done loading. + var _clientLoaded = false; + + // Loaders and loading statuses for all APIs, indexed by API name. + // This helps prevent multiple loading requests being fired at the same time + // by multiple google-api-loader elements. + var _statuses = {}; + var _loaders = {}; + + Polymer({ + + is: 'google-client-loader', + + /** + * Fired when the requested API is loaded. Override this name + * by setting `successEventName`. + * @event google-api-load + */ + + /** + * Fired if an error occurs while loading the requested API. Override this name + * by setting `errorEventName`. + * @event google-api-load-error + */ + + properties: { + /** + * Name of the API to load, e.g. 'urlshortener'. + * + * You can find the full list of APIs on the + * <a href="https://developers.google.com/apis-explorer"> Google APIs + * Explorer</a>. + */ + name: String, + + /** + * Version of the API to load, e.g. 'v1'. + */ + version: String, + + /** + * App Engine application ID for loading a Google Cloud Endpoints API. + */ + appId: String, + + /** + * Root URL where to load the API from, e.g. 'http://host/apis'. + * For App Engine dev server this would be something like: + * 'http://localhost:8080/_ah/api'. + * Overrides 'appId' if both are specified. + */ + apiRoot: String, + + /** + * Name of the event fired when API library is loaded. + */ + successEventName: { + type: String, + value: 'google-api-load' + }, + + /** + * Name of the event fired when there is an error loading the library. + */ + errorEventName: { + type: String, + value: 'google-api-load-error' + } + }, + + hostAttributes: { + hidden: true // remove from rendering tree. + }, + + // Used to fix events potentially being fired multiple times by + // iron-jsonp-library. + _waiting: false, + + /** + * Returns the loaded API. + */ + get api() { + if (window.gapi && window.gapi.client && + window.gapi.client[this.name]) { + return window.gapi.client[this.name]; + } else { + return undefined; + } + }, + + /** + * Wrapper for `gapi.auth`. + */ + get auth() { + return gapi.auth; + }, + + ready: function() { + this._loader = document.createElement('google-js-api'); + this.listen(this._loader, 'js-api-load', '_loadClient'); + }, + + detached: function() { + this.unlisten(this._loader, 'js-api-load', '_loadClient'); + }, + + _loadClient: function() { + gapi.load('client', this._doneLoadingClient.bind(this)); + }, + + _handleLoadResponse: function(response) { + if (response && response.error) { + _statuses[this.name] = 'error'; + this._fireError(response); + } else { + _statuses[this.name] = 'loaded'; + this._fireSuccess(); + } + }, + + _fireSuccess: function() { + this.fire(this.successEventName, + { 'name': this.name, 'version': this.version }); + }, + + _fireError: function(response) { + if (response && response.error) { + this.fire(this.errorEventName, { + 'name': this.name, + 'version': this.version, + 'error': response.error }); + } else { + this.fire(this.errorEventName, { + 'name': this.name, + 'version': this.version }); + } + }, + + _doneLoadingClient: function() { + _clientLoaded = true; + // Fix for API client load event being fired multiple times by + // iron-jsonp-library. + if (!this._waiting) { + this._loadApi(); + } + }, + + _createSelfRemovingListener: function(eventName) { + var handler = function () { + _loaders[this.name].removeEventListener(eventName, handler); + this._loadApi(); + }.bind(this); + + return handler; + }, + + _loadApi: function() { + if (_clientLoaded && this.name && this.version) { + this._waiting = false; + // Is this API already loaded? + if (_statuses[this.name] == 'loaded') { + this._fireSuccess(); + // Is a different google-api-loader already loading this API? + } else if (_statuses[this.name] == 'loading') { + this._waiting = true; + _loaders[this.name].addEventListener(this.successEventName, + this._createSelfRemovingListener(this.successEventName)); + _loaders[this.name].addEventListener(this.errorEventName, + this._createSelfRemovingListener(this.errorEventName)); + // Did we get an error when we tried to load this API before? + } else if (_statuses[this.name] == 'error') { + this._fireError(null); + // Otherwise, looks like we're loading a new API. + } else { + var root; + if (this.apiRoot) { + root = this.apiRoot; + } else if (this.appId) { + root = 'https://' + this.appId + '.appspot.com/_ah/api'; + } + _statuses[this.name] = 'loading'; + _loaders[this.name] = this; + gapi.client.load(this.name, this.version, + this._handleLoadResponse.bind(this), root); + } + } + } + }); + })(); +</script> |