// Copyright (C) 2016 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. (function() { 'use strict'; var HLJS_PATH = 'bower_components/highlightjs/highlight.min.js'; var LIB_ROOT_PATTERN = /(.+\/)elements\/gr-app\.html/; Polymer({ is: 'gr-syntax-lib-loader', properties: { _state: { type: Object, // NOTE: intended singleton. value: { loaded: false, loading: false, callbacks: [], }, } }, get: function() { return new Promise(function(resolve) { // If the lib is totally loaded, resolve immediately. if (this._state.loaded) { resolve(this._getHighlightLib()); return; } // If the library is not currently being loaded, then start loading it. if (!this._state.loading) { this._state.loading = true; this._loadHLJS().then(this._onLibLoaded.bind(this)); } this._state.callbacks.push(resolve); }.bind(this)); }, _onLibLoaded: function() { var lib = this._getHighlightLib(); this._state.loaded = true; this._state.loading = false; this._state.callbacks.forEach(function(cb) { cb(lib); }); this._state.callbacks = []; }, _getHighlightLib: function() { return window.hljs; }, _configureHighlightLib: function() { this._getHighlightLib().configure( {classPrefix: 'gr-diff gr-syntax gr-syntax-'}); }, _getLibRoot: function() { if (this._cachedLibRoot) { return this._cachedLibRoot; } return this._cachedLibRoot = document.head .querySelector('link[rel=import][href$="gr-app.html"]') .href .match(LIB_ROOT_PATTERN)[1]; }, _cachedLibRoot: null, _loadHLJS: function() { return new Promise(function(resolve) { var script = document.createElement('script'); script.src = this._getLibRoot() + HLJS_PATH; script.onload = function() { this._configureHighlightLib(); resolve(); }.bind(this); Polymer.dom(document.head).appendChild(script); }.bind(this)); }, }); })();