summaryrefslogtreecommitdiffstats
path: root/browser/base/content/browser-tabsintitlebar.js
blob: 3184f7b4488d51bd073ebaadfc00b2ba1bd0a70b (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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
 * 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/. */

var TabsInTitlebar;

{
  // start private TabsInTitlebar scope
  TabsInTitlebar = {
    init() {
      this._readPref();
      Services.prefs.addObserver(this._prefName, this);

      dragSpaceObserver.init();
      this._initialized = true;
      this._update();
    },

    allowedBy(condition, allow) {
      if (allow) {
        if (condition in this._disallowed) {
          delete this._disallowed[condition];
          this._update();
        }
      } else if (!(condition in this._disallowed)) {
        this._disallowed[condition] = null;
        this._update();
      }
    },

    get systemSupported() {
      let isSupported = false;
      switch (AppConstants.MOZ_WIDGET_TOOLKIT) {
        case "windows":
        case "cocoa":
          isSupported = true;
          break;
        case "gtk":
          isSupported = window.matchMedia("(-moz-gtk-csd-available)").matches;
          break;
      }
      delete this.systemSupported;
      return (this.systemSupported = isSupported);
    },

    get enabled() {
      return document.documentElement.getAttribute("tabsintitlebar") == "true";
    },

    observe(subject, topic, data) {
      if (topic == "nsPref:changed") {
        this._readPref();
      }
    },

    _initialized: false,
    _disallowed: {},
    _prefName: "browser.tabs.drawInTitlebar",

    _readPref() {
      let hiddenTitlebar = Services.prefs.getBoolPref(
        "browser.tabs.drawInTitlebar",
        window.matchMedia("(-moz-gtk-csd-hide-titlebar-by-default)").matches
      );
      this.allowedBy("pref", hiddenTitlebar);
    },

    _update() {
      if (!this._initialized) {
        return;
      }

      let allowed =
        this.systemSupported &&
        !window.fullScreen &&
        !Object.keys(this._disallowed).length;
      if (allowed) {
        document.documentElement.setAttribute("tabsintitlebar", "true");
        if (AppConstants.platform == "macosx") {
          document.documentElement.setAttribute("chromemargin", "0,-1,-1,-1");
          document.documentElement.removeAttribute("drawtitle");
        } else {
          document.documentElement.setAttribute("chromemargin", "0,2,2,2");
        }
      } else {
        document.documentElement.removeAttribute("tabsintitlebar");
        document.documentElement.removeAttribute("chromemargin");
        if (AppConstants.platform == "macosx") {
          document.documentElement.setAttribute("drawtitle", "true");
        }
      }

      ToolbarIconColor.inferFromText("tabsintitlebar", allowed);
    },

    uninit() {
      Services.prefs.removeObserver(this._prefName, this);
      dragSpaceObserver.uninit();
    },
  };

  // Adds additional drag space to the window by listening to
  // the corresponding preference.
  let dragSpaceObserver = {
    pref: "browser.tabs.extraDragSpace",

    init() {
      Services.prefs.addObserver(this.pref, this);
      this.observe();
    },

    uninit() {
      Services.prefs.removeObserver(this.pref, this);
    },

    observe() {
      if (Services.prefs.getBoolPref(this.pref)) {
        document.documentElement.setAttribute("extradragspace", "true");
      } else {
        document.documentElement.removeAttribute("extradragspace");
      }
    },
  };
} // end private TabsInTitlebar scope