summaryrefslogtreecommitdiffstats
path: root/browser/components/preferences/dialogs/siteDataRemoveSelected.js
blob: 2e7e6227cab9178877c517dd71f7f1c162b58805 (plain)
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
/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
/* 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";

const { SiteDataManager } = ChromeUtils.import(
  "resource:///modules/SiteDataManager.jsm"
);

/**
 * This dialog will ask the user to confirm that they really want to delete
 * all site data for a number of hosts. Displaying the hosts can be done in
 * two different ways by passing options in the arguments object.
 *
 * - Passing a "baseDomain" will cause the dialog to search for all applicable
 *   host names with that baseDomain using the SiteDataManager and populate the list
 *   asynchronously. As a side effect, the SiteDataManager will update. Thus it is
 *   safe to call SiteDataManager methods that require a manual updateSites call
 *   after spawning this dialog. However, you need to ensure that the SiteDataManager
 *   has finished updating.
 *
 * - Passing a "hosts" array allows you to manually specify the hosts to be displayed.
 *   The SiteDataManager will not be updated by spawning this dialog in that case.
 *
 *   The two options are mutually exclusive. You must specify one.
 **/
let gSiteDataRemoveSelected = {
  init() {
    document.addEventListener("dialogaccept", function() {
      window.arguments[0].allowed = true;
    });
    document.addEventListener("dialogcancel", function() {
      window.arguments[0].allowed = false;
    });

    let list = document.getElementById("removalList");

    let baseDomain = window.arguments[0].baseDomain;
    if (baseDomain) {
      let hosts = new Set();
      SiteDataManager.updateSites((host, site) => {
        // Disregard local files.
        if (!host) {
          return;
        }

        if (site.baseDomain != baseDomain) {
          return;
        }

        // Avoid listing duplicate hosts.
        if (hosts.has(host)) {
          return;
        }
        hosts.add(host);

        let listItem = document.createXULElement("richlistitem");
        let label = document.createXULElement("label");
        label.setAttribute("value", host);
        listItem.appendChild(label);
        list.appendChild(listItem);
      });
      return;
    }

    let hosts = window.arguments[0].hosts;
    if (hosts) {
      hosts.sort();
      let fragment = document.createDocumentFragment();
      for (let host of hosts) {
        let listItem = document.createXULElement("richlistitem");
        let label = document.createXULElement("label");
        if (host) {
          label.setAttribute("value", host);
        } else {
          document.l10n.setAttributes(label, "site-data-local-file-host");
        }
        listItem.appendChild(label);
        fragment.appendChild(listItem);
      }
      list.appendChild(fragment);
      return;
    }

    throw new Error(
      "Must specify either a hosts or baseDomain option in arguments."
    );
  },
};