forked from mirrors/gecko-dev
		
	 e496f85edc
			
		
	
	
		e496f85edc
		
	
	
	
	
		
			
			On macOS, launch native messaging helper apps with a new "Transparency, Consent, and Control" (TCC) attribution chain using the undocumented disclaim posix_spawn attribute. Differential Revision: https://phabricator.services.mozilla.com/D48028 --HG-- extra : moz-landing-system : lando
		
			
				
	
	
		
			104 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 | |
| /* vim: set sts=2 sw=2 et tw=80: */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| "use strict";
 | |
| 
 | |
| /* exported Library, SubprocessConstants */
 | |
| 
 | |
| if (!ArrayBuffer.transfer) {
 | |
|   /**
 | |
|    * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/transfer
 | |
|    *
 | |
|    * @param {ArrayBuffer} buffer
 | |
|    * @param {integer} [size = buffer.byteLength]
 | |
|    * @returns {ArrayBuffer}
 | |
|    */
 | |
|   ArrayBuffer.transfer = function(buffer, size = buffer.byteLength) {
 | |
|     let u8out = new Uint8Array(size);
 | |
|     let u8buffer = new Uint8Array(buffer, 0, Math.min(size, buffer.byteLength));
 | |
| 
 | |
|     u8out.set(u8buffer);
 | |
| 
 | |
|     return u8out.buffer;
 | |
|   };
 | |
| }
 | |
| 
 | |
| var libraries = {};
 | |
| 
 | |
| class Library {
 | |
|   constructor(name, names, definitions) {
 | |
|     if (name in libraries) {
 | |
|       return libraries[name];
 | |
|     }
 | |
| 
 | |
|     for (let name of names) {
 | |
|       try {
 | |
|         if (!this.library) {
 | |
|           this.library = ctypes.open(name);
 | |
|         }
 | |
|       } catch (e) {
 | |
|         // Ignore errors until we've tried all the options.
 | |
|       }
 | |
|     }
 | |
|     if (!this.library) {
 | |
|       throw new Error("Could not load libc");
 | |
|     }
 | |
| 
 | |
|     libraries[name] = this;
 | |
| 
 | |
|     for (let symbol of Object.keys(definitions)) {
 | |
|       this.declare(symbol, ...definitions[symbol]);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   declare(name, ...args) {
 | |
|     Object.defineProperty(this, name, {
 | |
|       configurable: true,
 | |
|       get() {
 | |
|         Object.defineProperty(this, name, {
 | |
|           configurable: true,
 | |
|           value: this.library.declare(name, ...args),
 | |
|         });
 | |
| 
 | |
|         return this[name];
 | |
|       },
 | |
|     });
 | |
|   }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Holds constants which apply to various Subprocess operations.
 | |
|  * @namespace
 | |
|  * @lends Subprocess
 | |
|  */
 | |
| const SubprocessConstants = {
 | |
|   /**
 | |
|    * @property {integer} ERROR_END_OF_FILE
 | |
|    *           The operation failed because the end of the file was reached.
 | |
|    *           @constant
 | |
|    */
 | |
|   ERROR_END_OF_FILE: 0xff7a0001,
 | |
|   /**
 | |
|    * @property {integer} ERROR_INVALID_JSON
 | |
|    *           The operation failed because an invalid JSON was encountered.
 | |
|    *           @constant
 | |
|    */
 | |
|   ERROR_INVALID_JSON: 0xff7a0002,
 | |
|   /**
 | |
|    * @property {integer} ERROR_BAD_EXECUTABLE
 | |
|    *           The operation failed because the given file did not exist, or
 | |
|    *           could not be executed.
 | |
|    *           @constant
 | |
|    */
 | |
|   ERROR_BAD_EXECUTABLE: 0xff7a0003,
 | |
|   /**
 | |
|    * @property {integer} ERROR_INVALID_OPTION
 | |
|    *           The operation failed because an invalid option was provided.
 | |
|    *           @constant
 | |
|    */
 | |
|   ERROR_INVALID_OPTION: 0xff7a0004,
 | |
| };
 | |
| 
 | |
| Object.freeze(SubprocessConstants);
 |