Bug 1933479 - Add tab close button on hover to vertical tabs when sidebar is collapse...
[gecko.git] / toolkit / modules / subprocess / subprocess_shared.js
blobd59a14a35132ba21c5abff10cdb24c511670be51
1 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
2 /* vim: set sts=2 sw=2 et tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 "use strict";
8 /* exported ArrayBuffer_transfer, Library, SubprocessConstants */
10 // ctypes is either already available in the chrome worker scope, or defined
11 // in scope via loadSubScript.
12 /* global ctypes */
14 /**
15  * Returns a new ArrayBuffer whose contents have been taken from the `buffer`'s
16  * data and then is either truncated or zero-extended by `size`. If `size` is
17  * undefined, the `byteLength` of the `buffer` is used. This operation leaves
18  * `buffer` in a detached state.
19  *
20  * @param {ArrayBuffer} buffer
21  * @param {integer} [size = buffer.byteLength]
22  * @returns {ArrayBuffer}
23  */
24 var ArrayBuffer_transfer = function (buffer, size = buffer.byteLength) {
25   let u8out = new Uint8Array(size);
26   let u8buffer = new Uint8Array(buffer, 0, Math.min(size, buffer.byteLength));
27   u8out.set(u8buffer);
28   return u8out.buffer;
31 var libraries = {};
33 var Library = class Library {
34   constructor(name, names, definitions) {
35     if (name in libraries) {
36       return libraries[name];
37     }
39     for (let name of names) {
40       try {
41         if (!this.library) {
42           this.library = ctypes.open(name);
43         }
44       } catch (e) {
45         // Ignore errors until we've tried all the options.
46       }
47     }
48     if (!this.library) {
49       throw new Error("Could not load libc");
50     }
52     libraries[name] = this;
54     for (let symbol of Object.keys(definitions)) {
55       this.declare(symbol, ...definitions[symbol]);
56     }
57   }
59   declare(name, ...args) {
60     Object.defineProperty(this, name, {
61       configurable: true,
62       get() {
63         Object.defineProperty(this, name, {
64           configurable: true,
65           value: this.library.declare(name, ...args),
66         });
68         return this[name];
69       },
70     });
71   }
74 /**
75  * Holds constants which apply to various Subprocess operations.
76  *
77  * @namespace
78  * @lends Subprocess
79  */
80 var SubprocessConstants = {
81   /**
82    * @property {integer} ERROR_END_OF_FILE
83    *           The operation failed because the end of the file was reached.
84    *           @constant
85    */
86   ERROR_END_OF_FILE: 0xff7a0001,
87   /**
88    * @property {integer} ERROR_INVALID_JSON
89    *           The operation failed because an invalid JSON was encountered.
90    *           @constant
91    */
92   ERROR_INVALID_JSON: 0xff7a0002,
93   /**
94    * @property {integer} ERROR_BAD_EXECUTABLE
95    *           The operation failed because the given file did not exist, or
96    *           could not be executed.
97    *           @constant
98    */
99   ERROR_BAD_EXECUTABLE: 0xff7a0003,
100   /**
101    * @property {integer} ERROR_INVALID_OPTION
102    *           The operation failed because an invalid option was provided.
103    *           @constant
104    */
105   ERROR_INVALID_OPTION: 0xff7a0004,
108 Object.freeze(SubprocessConstants);