| 1 | // Copyright 2011 Software Freedom Conservancy. All Rights Reserved. |
| 2 | // |
| 3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | // you may not use this file except in compliance with the License. |
| 5 | // You may obtain a copy of the License at |
| 6 | // |
| 7 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | // |
| 9 | // Unless required by applicable law or agreed to in writing, software |
| 10 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | // See the License for the specific language governing permissions and |
| 13 | // limitations under the License. |
| 14 | |
| 15 | /** |
| 16 | * @fileoverview Provides access to the current process' environment variables. |
| 17 | * When running in node, this is simply a wrapper for {@code process.env}. |
| 18 | * When running in a browser, environment variables are loaded by parsing the |
| 19 | * current URL's query string. Variables that have more than one variable will |
| 20 | * be initialized to the JSON representation of the array of all values, |
| 21 | * otherwise the variable will be initialized to a sole string value. If a |
| 22 | * variable does not have any values, but is nonetheless present in the query |
| 23 | * string, it will be initialized to an empty string. |
| 24 | * After the initial parsing, environment variables must be queried and set |
| 25 | * through the API defined in this file. |
| 26 | */ |
| 27 | |
| 28 | goog.provide('webdriver.process'); |
| 29 | |
| 30 | goog.require('goog.Uri'); |
| 31 | goog.require('goog.array'); |
| 32 | goog.require('goog.json'); |
| 33 | |
| 34 | |
| 35 | /** |
| 36 | * @return {boolean} Whether the current process is Node's native process |
| 37 | * object. |
| 38 | */ |
| 39 | webdriver.process.isNative = function() { |
| 40 | return webdriver.process.IS_NATIVE_PROCESS_; |
| 41 | }; |
| 42 | |
| 43 | |
| 44 | /** |
| 45 | * Queries for a named environment variable. |
| 46 | * @param {string} name The name of the environment variable to look up. |
| 47 | * @param {string=} opt_default The default value if the named variable is not |
| 48 | * defined. |
| 49 | * @return {string} The queried environment variable. |
| 50 | */ |
| 51 | webdriver.process.getEnv = function(name, opt_default) { |
| 52 | var value = webdriver.process.PROCESS_.env[name]; |
| 53 | return goog.isDefAndNotNull(value) ? value : opt_default; |
| 54 | }; |
| 55 | |
| 56 | |
| 57 | /** |
| 58 | * Sets an environment value. If the new value is either null or undefined, the |
| 59 | * environment variable will be cleared. |
| 60 | * @param {string} name The value to set. |
| 61 | * @param {*} value The new value; will be coerced to a string. |
| 62 | */ |
| 63 | webdriver.process.setEnv = function(name, value) { |
| 64 | webdriver.process.PROCESS_.env[name] = |
| 65 | goog.isDefAndNotNull(value) ? value + '' : null; |
| 66 | }; |
| 67 | |
| 68 | |
| 69 | /** |
| 70 | * Whether the current environment is using Node's native process object. |
| 71 | * @private {boolean} |
| 72 | * @const |
| 73 | */ |
| 74 | webdriver.process.IS_NATIVE_PROCESS_ = typeof process !== 'undefined'; |
| 75 | |
| 76 | |
| 77 | /** |
| 78 | * Initializes a process object for use in a browser window. |
| 79 | * @param {!Window=} opt_window The window object to initialize the process |
| 80 | * from; if not specified, will default to the current window. Should only |
| 81 | * be set for unit testing. |
| 82 | * @return {!Object} The new process object. |
| 83 | * @private |
| 84 | */ |
| 85 | webdriver.process.initBrowserProcess_ = function(opt_window) { |
| 86 | var process = {'env': {}}; |
| 87 | |
| 88 | var win = opt_window; |
| 89 | if (!win && typeof window != 'undefined') { |
| 90 | win = window; |
| 91 | } |
| 92 | |
| 93 | // Initialize the global error handler. |
| 94 | if (win) { |
| 95 | // Initialize the environment variable map by parsing the current URL query |
| 96 | // string. |
| 97 | if (win.location) { |
| 98 | var data = new goog.Uri(win.location).getQueryData(); |
| 99 | goog.array.forEach(data.getKeys(), function(key) { |
| 100 | var values = data.getValues(key); |
| 101 | process.env[key] = values.length == 0 ? '' : |
| 102 | values.length == 1 ? values[0] : |
| 103 | goog.json.serialize(values); |
| 104 | }); |
| 105 | } |
| 106 | } |
| 107 | |
| 108 | return process; |
| 109 | }; |
| 110 | |
| 111 | |
| 112 | /** |
| 113 | * The global process object to use. Will either be Node's global |
| 114 | * {@code process} object, or an approximation of it for use in a browser |
| 115 | * environment. |
| 116 | * @private {!Object} |
| 117 | * @const |
| 118 | */ |
| 119 | webdriver.process.PROCESS_ = webdriver.process.IS_NATIVE_PROCESS_ ? process : |
| 120 | webdriver.process.initBrowserProcess_(); |