aboutsummaryrefslogtreecommitdiff
path: root/catapult/third_party/polymer/components/google-apis/google-client-loader.html
diff options
context:
space:
mode:
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.html232
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>