Bug 1349552 - Part 2 - Add an extra drag space setting to customize mode. r=nhnt11
MozReview-Commit-ID: IWxdOeRwDeu
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -5517,16 +5517,20 @@ function setToolbarVisibility(toolbar, i
visible: isVisible
},
bubbles: true
};
let event = new CustomEvent("toolbarvisibilitychange", eventParams);
toolbar.dispatchEvent(event);
BookmarkingUI.onToolbarVisibilityChange();
+
+ if (toolbar.getAttribute("type") == "menubar" && CustomizationHandler.isCustomizing()) {
+ gCustomizeMode._updateDragSpaceCheckbox();
+ }
}
function updateToggleControlLabel(control) {
if (!control.hasAttribute("label-checked")) {
return;
}
if (!control.hasAttribute("label-unchecked")) {
--- a/browser/components/customizableui/CustomizableUI.jsm
+++ b/browser/components/customizableui/CustomizableUI.jsm
@@ -33,16 +33,17 @@ XPCOMUtils.defineLazyServiceGetter(this,
const kNSXUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
const kSpecialWidgetPfx = "customizableui-special-";
const kPrefCustomizationState = "browser.uiCustomization.state";
const kPrefCustomizationAutoAdd = "browser.uiCustomization.autoAdd";
const kPrefCustomizationDebug = "browser.uiCustomization.debug";
const kPrefDrawInTitlebar = "browser.tabs.drawInTitlebar";
+const kPrefExtraDragSpace = "browser.tabs.extraDragSpace";
const kPrefUIDensity = "browser.uidensity";
const kPrefAutoTouchMode = "browser.touchmode.auto";
const kPrefAutoHideDownloadsButton = "browser.download.autohideButton";
const kExpectedWindowURL = "chrome://browser/content/browser.xul";
/**
* The keys are the handlers that are fired when the event type (the value)
@@ -148,16 +149,17 @@ var gBuildWindows = new Map();
var gNewElementCount = 0;
var gGroupWrapperCache = new Map();
var gSingleWrapperCache = new WeakMap();
var gListeners = new Set();
var gUIStateBeforeReset = {
uiCustomizationState: null,
drawInTitlebar: null,
+ extraDragSpace: null,
currentTheme: null,
uiDensity: null,
autoTouchMode: null,
};
var gDefaultPanelPlacements = null;
XPCOMUtils.defineLazyGetter(this, "log", () => {
@@ -2620,28 +2622,30 @@ var CustomizableUIInternal = {
}
gResetting = false;
},
_resetUIState() {
try {
gUIStateBeforeReset.drawInTitlebar = Services.prefs.getBoolPref(kPrefDrawInTitlebar);
+ gUIStateBeforeReset.extraDragSpace = Services.prefs.getBoolPref(kPrefExtraDragSpace);
gUIStateBeforeReset.uiCustomizationState = Services.prefs.getCharPref(kPrefCustomizationState);
gUIStateBeforeReset.uiDensity = Services.prefs.getIntPref(kPrefUIDensity);
gUIStateBeforeReset.autoTouchMode = Services.prefs.getBoolPref(kPrefAutoTouchMode);
gUIStateBeforeReset.currentTheme = LightweightThemeManager.currentTheme;
gUIStateBeforeReset.autoHideDownloadsButton = Services.prefs.getBoolPref(kPrefAutoHideDownloadsButton);
gUIStateBeforeReset.newElementCount = gNewElementCount;
} catch (e) { }
this._resetExtraToolbars();
Services.prefs.clearUserPref(kPrefCustomizationState);
Services.prefs.clearUserPref(kPrefDrawInTitlebar);
+ Services.prefs.clearUserPref(kPrefExtraDragSpace);
Services.prefs.clearUserPref(kPrefUIDensity);
Services.prefs.clearUserPref(kPrefAutoTouchMode);
Services.prefs.clearUserPref(kPrefAutoHideDownloadsButton);
LightweightThemeManager.currentTheme = null;
gNewElementCount = 0;
log.debug("State reset");
// Reset placements to make restoring default placements possible.
@@ -2705,26 +2709,27 @@ var CustomizableUIInternal = {
if (gUIStateBeforeReset.uiCustomizationState == null ||
gUIStateBeforeReset.drawInTitlebar == null) {
return;
}
gUndoResetting = true;
const {
uiCustomizationState, drawInTitlebar, currentTheme, uiDensity,
- autoTouchMode, autoHideDownloadsButton,
+ autoTouchMode, autoHideDownloadsButton, extraDragSpace,
} = gUIStateBeforeReset;
gNewElementCount = gUIStateBeforeReset.newElementCount;
// Need to clear the previous state before setting the prefs
// because pref observers may check if there is a previous UI state.
this._clearPreviousUIState();
Services.prefs.setCharPref(kPrefCustomizationState, uiCustomizationState);
Services.prefs.setBoolPref(kPrefDrawInTitlebar, drawInTitlebar);
+ Services.prefs.setBoolPref(kPrefExtraDragSpace, extraDragSpace);
Services.prefs.setIntPref(kPrefUIDensity, uiDensity);
Services.prefs.setBoolPref(kPrefAutoTouchMode, autoTouchMode);
Services.prefs.setBoolPref(kPrefAutoHideDownloadsButton, autoHideDownloadsButton);
LightweightThemeManager.currentTheme = currentTheme;
this.loadSavedState();
// If the user just customizes toolbar/titlebar visibility, gSavedState will be null
// and we don't need to do anything else here:
if (gSavedState) {
@@ -2913,16 +2918,21 @@ var CustomizableUIInternal = {
return false;
}
if (Services.prefs.prefHasUserValue(kPrefDrawInTitlebar)) {
log.debug(kPrefDrawInTitlebar + " pref is non-default");
return false;
}
+ if (Services.prefs.prefHasUserValue(kPrefExtraDragSpace)) {
+ log.debug(kPrefExtraDragSpace + " pref is non-default");
+ return false;
+ }
+
if (LightweightThemeManager.currentTheme) {
log.debug(LightweightThemeManager.currentTheme + " theme is non-default");
return false;
}
return true;
},
@@ -3654,16 +3664,17 @@ this.CustomizableUI = {
* Can the last Restore Defaults operation be undone.
*
* @return A boolean stating whether an undo of the
* Restore Defaults can be performed.
*/
get canUndoReset() {
return gUIStateBeforeReset.uiCustomizationState != null ||
gUIStateBeforeReset.drawInTitlebar != null ||
+ gUIStateBeforeReset.extraDragSpace != null ||
gUIStateBeforeReset.currentTheme != null ||
gUIStateBeforeReset.autoTouchMode != null ||
gUIStateBeforeReset.uiDensity != null;
},
/**
* Get the placement of a widget. This is by far the best way to obtain
* information about what the state of your widget is. The internals of
--- a/browser/components/customizableui/CustomizeMode.jsm
+++ b/browser/components/customizableui/CustomizeMode.jsm
@@ -10,16 +10,17 @@ const {classes: Cc, interfaces: Ci, util
const kPrefCustomizationDebug = "browser.uiCustomization.debug";
const kPrefCustomizationAnimation = "browser.uiCustomization.disableAnimation";
const kPaletteId = "customization-palette";
const kDragDataTypePrefix = "text/toolbarwrapper-id/";
const kSkipSourceNodePref = "browser.uiCustomization.skipSourceNodeCheck";
const kToolbarVisibilityBtn = "customization-toolbar-visibility-button";
const kDrawInTitlebarPref = "browser.tabs.drawInTitlebar";
+const kExtraDragSpacePref = "browser.tabs.extraDragSpace";
const kMaxTransitionDurationMs = 2000;
const kKeepBroadcastAttributes = "keepbroadcastattributeswhencustomizing";
const kPanelItemContextMenu = "customizationPanelItemContextMenu";
const kPaletteItemContextMenu = "customizationPaletteItemContextMenu";
const kDownloadAutohideCheckboxId = "downloads-button-autohide-checkbox";
const kDownloadAutohidePanelId = "downloads-button-autohide-panel";
@@ -112,17 +113,19 @@ function CustomizeMode(aWindow) {
this.paletteEmptyNotice = this.document.getElementById("customization-empty");
this.tipPanel = this.document.getElementById("customization-tipPanel");
if (Services.prefs.getCharPref("general.skins.selectedSkin") != "classic/1.0") {
let lwthemeButton = this.document.getElementById("customization-lwtheme-button");
lwthemeButton.setAttribute("hidden", "true");
}
if (AppConstants.CAN_DRAW_IN_TITLEBAR) {
this._updateTitlebarCheckbox();
+ this._updateDragSpaceCheckbox();
Services.prefs.addObserver(kDrawInTitlebarPref, this);
+ Services.prefs.addObserver(kExtraDragSpacePref, this);
}
this.window.addEventListener("unload", this);
}
CustomizeMode.prototype = {
_changed: false,
_transitioning: false,
window: null,
@@ -144,16 +147,17 @@ CustomizeMode.prototype = {
get _handler() {
return this.window.CustomizationHandler;
},
uninit() {
if (AppConstants.CAN_DRAW_IN_TITLEBAR) {
Services.prefs.removeObserver(kDrawInTitlebarPref, this);
+ Services.prefs.removeObserver(kExtraDragSpacePref, this);
}
},
toggle() {
if (this._handler.isEnteringCustomizeMode || this._handler.isExitingCustomizeMode) {
this._wantToBeInCustomizeMode = !this._wantToBeInCustomizeMode;
return;
}
@@ -1532,16 +1536,17 @@ CustomizeMode.prototype = {
observe(aSubject, aTopic, aData) {
switch (aTopic) {
case "nsPref:changed":
this._updateResetButton();
this._updateUndoResetButton();
if (AppConstants.CAN_DRAW_IN_TITLEBAR) {
this._updateTitlebarCheckbox();
+ this._updateDragSpaceCheckbox();
}
break;
case "lightweight-theme-window-updated":
if (aSubject == this.window) {
aData = JSON.parse(aData);
this.updateLWTStyling(aData);
}
break;
@@ -1559,22 +1564,57 @@ CustomizeMode.prototype = {
// customize mode the button is hidden and properties don't work.
if (drawInTitlebar) {
checkbox.removeAttribute("checked");
} else {
checkbox.setAttribute("checked", "true");
}
},
+ _updateDragSpaceCheckbox() {
+ if (!AppConstants.CAN_DRAW_IN_TITLEBAR) {
+ return;
+ }
+
+ let extraDragSpace = Services.prefs.getBoolPref(kExtraDragSpacePref);
+ let drawInTitlebar = Services.prefs.getBoolPref(kDrawInTitlebarPref, true);
+ let menuBar = this.document.getElementById("toolbar-menubar");
+ let menuBarEnabled = menuBar
+ && AppConstants.platform != "macosx"
+ && menuBar.getAttribute("autohide") != "true";
+
+ let checkbox = this.document.getElementById("customization-extra-drag-space-checkbox");
+ if (extraDragSpace) {
+ checkbox.setAttribute("checked", "true");
+ } else {
+ checkbox.removeAttribute("checked");
+ }
+
+ if (!drawInTitlebar || menuBarEnabled) {
+ checkbox.setAttribute("disabled", "true");
+ } else {
+ checkbox.removeAttribute("disabled");
+ }
+ },
+
toggleTitlebar(aShouldShowTitlebar) {
if (!AppConstants.CAN_DRAW_IN_TITLEBAR) {
return;
}
// Drawing in the titlebar means not showing the titlebar, hence the negation:
Services.prefs.setBoolPref(kDrawInTitlebarPref, !aShouldShowTitlebar);
+ this._updateDragSpaceCheckbox();
+ },
+
+ toggleDragSpace(aShouldShowDragSpace) {
+ if (!AppConstants.CAN_DRAW_IN_TITLEBAR) {
+ return;
+ }
+
+ Services.prefs.setBoolPref(kExtraDragSpacePref, aShouldShowDragSpace);
},
get _dwu() {
if (!this.__dwu) {
this.__dwu = this.window.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
}
return this.__dwu;
},
--- a/browser/components/customizableui/content/customizeMode.inc.xul
+++ b/browser/components/customizableui/content/customizeMode.inc.xul
@@ -34,16 +34,19 @@
</box>
<hbox id="customization-footer">
#ifdef CAN_DRAW_IN_TITLEBAR
<checkbox id="customization-titlebar-visibility-checkbox" class="customizationmode-checkbox"
label="&customizeMode.titlebar;"
#NB: because oncommand fires after click, by the time we've fired, the checkbox binding
# will already have switched the button's state, so this is correct:
oncommand="gCustomizeMode.toggleTitlebar(this.checked)"/>
+ <checkbox id="customization-extra-drag-space-checkbox" class="customizationmode-checkbox"
+ label="&customizeMode.extraDragSpace;"
+ oncommand="gCustomizeMode.toggleDragSpace(this.checked)"/>
#endif
<button id="customization-toolbar-visibility-button" label="&customizeMode.toolbars2;" class="customizationmode-button" type="menu">
<menupopup id="customization-toolbar-menu" onpopupshowing="onViewToolbarsPopupShowing(event)"/>
</button>
<button id="customization-lwtheme-button" label="&customizeMode.lwthemes;" class="customizationmode-button" type="menu">
<panel type="arrow" id="customization-lwtheme-menu"
onpopupshowing="gCustomizeMode.onLWThemesMenuShowing(event);"
position="topcenter bottomleft"
--- a/browser/locales/en-US/chrome/browser/browser.dtd
+++ b/browser/locales/en-US/chrome/browser/browser.dtd
@@ -831,16 +831,17 @@ you can use these alternative items. Oth
<!ENTITY syncToolbarButton.label "Sync">
<!ENTITY customizeMode.menuAndToolbars.header3 "Drag your favorite items into the toolbar or overflow menu.">
<!ENTITY customizeMode.menuAndToolbars.empty "Want more tools?">
<!ENTITY customizeMode.menuAndToolbars.emptyLink "Choose from thousands of add-ons">
<!ENTITY customizeMode.restoreDefaults "Restore Defaults">
<!ENTITY customizeMode.done "Done">
<!ENTITY customizeMode.titlebar "Title Bar">
+<!ENTITY customizeMode.extraDragSpace "Drag Space">
<!ENTITY customizeMode.toolbars2 "Toolbars">
<!ENTITY customizeMode.lwthemes "Themes">
<!ENTITY customizeMode.lwthemes.myThemes "My Themes">
<!ENTITY customizeMode.lwthemes.recommended "Recommended">
<!ENTITY customizeMode.lwthemes.menuManage "Manage">
<!ENTITY customizeMode.lwthemes.menuManage.accessKey "M">
<!ENTITY customizeMode.lwthemes.menuGetMore "Get More Themes">
<!ENTITY customizeMode.lwthemes.menuGetMore.accessKey "G">