This file is indexed.

/usr/share/xul-ext/lightbeam/resources/lightbeam/lib/shared/unload+.js is in xul-ext-lightbeam 1.2.1+dfsg-1ubuntu2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/* 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/. */
/* global require, console, exports */
'use strict';

const {
  Class
} = require("sdk/core/heritage");
const unloadNS = require("sdk/core/namespace").ns();
const {
  when: unload
} = require("sdk/system/unload");

var Unloader = exports.Unloader = Class({
  initialize: function Unloader() {
    unloadNS(this).unloaders = [];
    unloadNS(this).unloadersUnload = unloadersUnload.bind(null, unloadNS(this).unloaders);

    // run the unloaders on unload
    unload(unloadNS(this).unloadersUnload);
  },
  unload: function unload(callback, container) {
    // Calling with no arguments runs all the unloader callbacks
    if (!callback) {
      unloadNS(this).unloadersUnload();
      return null;
    }

    let windowRemover = windowUnloader.bind(null, unloader, unloadNS(this).unloaders);

    // The callback is bound to the lifetime of the container if we have one
    if (container) {
      // Remove the unloader when the container unloads
      container.addEventListener("unload", windowRemover, false);

      // Wrap the callback to additionally remove the unload listener
      let origCallback = callback;
      callback = function () {
        container.removeEventListener("unload", windowRemover, false);
        origCallback();
      };
    }

    // Wrap the callback in a function that ignores failures
    function unloader() {
      try {
        callback();
      } catch (e) {
        console.error(e);
      }
    }
    unloadNS(this).unloaders.push(unloader);

    // Provide a way to remove the unloader
    return removeUnloader.bind(null, unloader, unloadNS(this).unloaders);
  }
});

function sliceUnloader(unloader, unloaders) {
  let index = unloaders.indexOf(unloader);
  if (index < 0)
    return [];
  return unloaders.splice(index, 1);
}
// wraps sliceUnloader and doesn't return anything
function removeUnloader(unloader, unloaders) {
  sliceUnloader.apply(null, arguments);
}

function windowUnloader(unloader, unloaders) {
  sliceUnloader.apply(null, arguments).forEach(function (u) u());
}

function unloadersUnload(unloaders) {
  // run all the pending unloaders
  unloaders.slice().forEach(function (u) u());
  // clear the unload array
  unloaders.length = 0;
}

/**
 * Save callbacks to run when unloading. Optionally scope the callback to a
 * container, e.g., window. Provide a way to run all the callbacks.
 *
 * @usage unload(): Run all callbacks and release them.
 *
 * @usage unload(callback): Add a callback to run on unload.
 * @param [function] callback: 0-parameter function to call on unload.
 * @return [function]: A 0-parameter function that undoes adding the callback.
 *
 * @usage unload(callback, container) Add a scoped callback to run on unload.
 * @param [function] callback: 0-parameter function to call on unload.
 * @param [node] container: Remove the callback when this container unloads.
 * @return [function]: A 0-parameter function that undoes adding the callback.
 */
const gUnload = Unloader();
exports.unload = gUnload.unload.bind(gUnload);