| /** |
| * @license |
| * Copyright (C) 2019 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. |
| */ |
| |
| /** |
| * This defines the Gerrit instance. All methods directly attached to Gerrit |
| * should be defined or linked here. |
| */ |
| |
| import {pluginLoader} from './gr-plugin-loader.js'; |
| import {getRestAPI, send} from './gr-api-utils.js'; |
| import {appContext} from '../../../services/app-context.js'; |
| |
| /** |
| * Trigger the preinstalls for bundled plugins. |
| * This needs to happen before Gerrit as plugin bundle overrides the Gerrit. |
| */ |
| function flushPreinstalls() { |
| if (window.Gerrit.flushPreinstalls) { |
| window.Gerrit.flushPreinstalls(); |
| } |
| } |
| export const _testOnly_flushPreinstalls = flushPreinstalls; |
| |
| export function initGerritPluginApi() { |
| window.Gerrit = window.Gerrit || {}; |
| flushPreinstalls(); |
| initGerritPluginsMethods(window.Gerrit); |
| // Preloaded plugins should be installed after Gerrit.install() is set, |
| // since plugin preloader substitutes Gerrit.install() temporarily. |
| // (Gerrit.install() is set in initGerritPluginsMethods) |
| pluginLoader.installPreloadedPlugins(); |
| } |
| |
| export function _testOnly_initGerritPluginApi() { |
| initGerritPluginApi(); |
| return window.Gerrit; |
| } |
| |
| export function deprecatedDelete(url, opt_callback) { |
| console.warn('.delete() is deprecated! Use plugin.restApi().delete()'); |
| return getRestAPI().send('DELETE', url) |
| .then(response => { |
| if (response.status !== 204) { |
| return response.text().then(text => { |
| if (text) { |
| return Promise.reject(new Error(text)); |
| } else { |
| return Promise.reject(new Error(response.status)); |
| } |
| }); |
| } |
| if (opt_callback) { |
| opt_callback(response); |
| } |
| return response; |
| }); |
| } |
| |
| function initGerritPluginsMethods(globalGerritObj) { |
| /** |
| * @deprecated Use plugin.styles().css(rulesStr) instead. Please, consult |
| * the documentation how to replace it accordingly. |
| */ |
| globalGerritObj.css = function(rulesStr) { |
| console.warn('Gerrit.css(rulesStr) is deprecated!', |
| 'Use plugin.styles().css(rulesStr)'); |
| if (!globalGerritObj._customStyleSheet) { |
| const styleEl = document.createElement('style'); |
| document.head.appendChild(styleEl); |
| globalGerritObj._customStyleSheet = styleEl.sheet; |
| } |
| |
| const name = '__pg_js_api_class_' + |
| globalGerritObj._customStyleSheet.cssRules.length; |
| globalGerritObj._customStyleSheet |
| .insertRule('.' + name + '{' + rulesStr + '}', 0); |
| return name; |
| }; |
| |
| globalGerritObj.install = function(callback, opt_version, opt_src) { |
| pluginLoader.install(callback, opt_version, opt_src); |
| }; |
| |
| globalGerritObj.getLoggedIn = function() { |
| console.warn('Gerrit.getLoggedIn() is deprecated! ' + |
| 'Use plugin.restApi().getLoggedIn()'); |
| return document.createElement('gr-rest-api-interface').getLoggedIn(); |
| }; |
| |
| globalGerritObj.get = function(url, callback) { |
| console.warn('.get() is deprecated! Use plugin.restApi().get()'); |
| send('GET', url, callback); |
| }; |
| |
| globalGerritObj.post = function(url, payload, callback) { |
| console.warn('.post() is deprecated! Use plugin.restApi().post()'); |
| send('POST', url, callback, payload); |
| }; |
| |
| globalGerritObj.put = function(url, payload, callback) { |
| console.warn('.put() is deprecated! Use plugin.restApi().put()'); |
| send('PUT', url, callback, payload); |
| }; |
| |
| globalGerritObj.delete = function(url, opt_callback) { |
| deprecatedDelete(url, opt_callback); |
| }; |
| |
| globalGerritObj.awaitPluginsLoaded = function() { |
| return pluginLoader.awaitPluginsLoaded(); |
| }; |
| |
| // TODO(taoalpha): consider removing these proxy methods |
| // and using pluginLoader directly |
| globalGerritObj._loadPlugins = function(plugins, opt_option) { |
| pluginLoader.loadPlugins(plugins, opt_option); |
| }; |
| |
| globalGerritObj._arePluginsLoaded = function() { |
| return pluginLoader.arePluginsLoaded(); |
| }; |
| |
| globalGerritObj._isPluginPreloaded = function(url) { |
| return pluginLoader.isPluginPreloaded(url); |
| }; |
| |
| globalGerritObj._isPluginEnabled = function(pathOrUrl) { |
| return pluginLoader.isPluginEnabled(pathOrUrl); |
| }; |
| |
| globalGerritObj._isPluginLoaded = function(pathOrUrl) { |
| return pluginLoader.isPluginLoaded(pathOrUrl); |
| }; |
| |
| const eventEmitter = appContext.eventEmitter; |
| |
| // TODO(taoalpha): List all internal supported event names. |
| // Also convert this to inherited class once we move Gerrit to class. |
| globalGerritObj._eventEmitter = eventEmitter; |
| ['addListener', |
| 'dispatch', |
| 'emit', |
| 'off', |
| 'on', |
| 'once', |
| 'removeAllListeners', |
| 'removeListener', |
| ].forEach(method => { |
| /** |
| * Enabling EventEmitter interface on Gerrit. |
| * |
| * This will enable to signal across different parts of js code without relying on DOM, |
| * including core to core, plugin to plugin and also core to plugin. |
| * |
| * @example |
| * |
| * // Emit this event from pluginA |
| * Gerrit.install(pluginA => { |
| * fetch("some-api").then(() => { |
| * Gerrit.on("your-special-event", {plugin: pluginA}); |
| * }); |
| * }); |
| * |
| * // Listen on your-special-event from pluignB |
| * Gerrit.install(pluginB => { |
| * Gerrit.on("your-special-event", ({plugin}) => { |
| * // do something, plugin is pluginA |
| * }); |
| * }); |
| */ |
| globalGerritObj[method] = eventEmitter[method] |
| .bind(eventEmitter); |
| }); |
| } |