Bug 962069 - Dragging an item on to the toolbar overflow chevron should open the overflow popup. r=mikedeboer

This commit is contained in:
Jared Wein 2014-05-23 10:51:30 -07:00
Родитель 2c816c1d1b
Коммит b15e8be65c
3 изменённых файлов: 78 добавлений и 8 удалений

Просмотреть файл

@ -3704,6 +3704,7 @@ function XULWidgetSingleWrapper(aWidgetId, aNode, aDocument) {
} }
const LAZY_RESIZE_INTERVAL_MS = 200; const LAZY_RESIZE_INTERVAL_MS = 200;
const OVERFLOW_PANEL_HIDE_DELAY_MS = 500
function OverflowableToolbar(aToolbarNode) { function OverflowableToolbar(aToolbarNode) {
this._toolbar = aToolbarNode; this._toolbar = aToolbarNode;
@ -3747,6 +3748,8 @@ OverflowableToolbar.prototype = {
let chevronId = this._toolbar.getAttribute("overflowbutton"); let chevronId = this._toolbar.getAttribute("overflowbutton");
this._chevron = doc.getElementById(chevronId); this._chevron = doc.getElementById(chevronId);
this._chevron.addEventListener("command", this); this._chevron.addEventListener("command", this);
this._chevron.addEventListener("dragover", this);
this._chevron.addEventListener("dragend", this);
let panelId = this._toolbar.getAttribute("overflowpanel"); let panelId = this._toolbar.getAttribute("overflowpanel");
this._panel = doc.getElementById(panelId); this._panel = doc.getElementById(panelId);
@ -3781,6 +3784,8 @@ OverflowableToolbar.prototype = {
window.gNavToolbox.removeEventListener("customizationstarting", this); window.gNavToolbox.removeEventListener("customizationstarting", this);
window.gNavToolbox.removeEventListener("aftercustomization", this); window.gNavToolbox.removeEventListener("aftercustomization", this);
this._chevron.removeEventListener("command", this); this._chevron.removeEventListener("command", this);
this._chevron.removeEventListener("dragover", this);
this._chevron.removeEventListener("dragend", this);
this._panel.removeEventListener("popuphiding", this); this._panel.removeEventListener("popuphiding", this);
CustomizableUI.removeListener(this); CustomizableUI.removeListener(this);
CustomizableUIInternal.removePanelCloseListeners(this._panel); CustomizableUIInternal.removePanelCloseListeners(this._panel);
@ -3788,8 +3793,8 @@ OverflowableToolbar.prototype = {
handleEvent: function(aEvent) { handleEvent: function(aEvent) {
switch(aEvent.type) { switch(aEvent.type) {
case "resize": case "aftercustomization":
this._onResize(aEvent); this._enable();
break; break;
case "command": case "command":
if (aEvent.target == this._chevron) { if (aEvent.target == this._chevron) {
@ -3798,15 +3803,20 @@ OverflowableToolbar.prototype = {
this._panel.hidePopup(); this._panel.hidePopup();
} }
break; break;
case "popuphiding":
this._onPanelHiding(aEvent);
break;
case "customizationstarting": case "customizationstarting":
this._disable(); this._disable();
break; break;
case "aftercustomization": case "dragover":
this._enable(); this._showWithTimeout();
break; break;
case "dragend":
this._panel.hidePopup();
break;
case "popuphiding":
this._onPanelHiding(aEvent);
break;
case "resize":
this._onResize(aEvent);
} }
}, },
@ -3824,8 +3834,11 @@ OverflowableToolbar.prototype = {
this._panel.openPopup(anchor || this._chevron); this._panel.openPopup(anchor || this._chevron);
this._chevron.open = true; this._chevron.open = true;
this._panel.addEventListener("popupshown", function onPopupShown() { let overflowableToolbarInstance = this;
this._panel.addEventListener("popupshown", function onPopupShown(aEvent) {
this.removeEventListener("popupshown", onPopupShown); this.removeEventListener("popupshown", onPopupShown);
this.addEventListener("dragover", overflowableToolbarInstance);
this.addEventListener("dragend", overflowableToolbarInstance);
deferred.resolve(); deferred.resolve();
}); });
@ -3843,6 +3856,8 @@ OverflowableToolbar.prototype = {
_onPanelHiding: function(aEvent) { _onPanelHiding: function(aEvent) {
this._chevron.open = false; this._chevron.open = false;
this._panel.removeEventListener("dragover", this);
this._panel.removeEventListener("dragend", this);
let doc = aEvent.target.ownerDocument; let doc = aEvent.target.ownerDocument;
let contextMenu = doc.getElementById(this._panel.getAttribute("context")); let contextMenu = doc.getElementById(this._panel.getAttribute("context"));
gELS.removeSystemEventListener(contextMenu, 'command', this, true); gELS.removeSystemEventListener(contextMenu, 'command', this, true);
@ -4077,6 +4092,21 @@ OverflowableToolbar.prototype = {
} }
return this._target; return this._target;
}, },
_hideTimeoutId: null,
_showWithTimeout: function() {
this.show();
let window = this._toolbar.ownerDocument.defaultView;
if (this._hideTimeoutId) {
window.clearTimeout(this._hideTimeoutId);
this._hideTimeoutId = null;
}
this._hideTimeoutId = window.setTimeout(() => {
if (!this._panel.firstChild.mozMatchesSelector(":hover")) {
this._panel.hidePopup();
}
}, OVERFLOW_PANEL_HIDE_DELAY_MS);
},
}; };
CustomizableUIInternal.initialize(); CustomizableUIInternal.initialize();

Просмотреть файл

@ -69,6 +69,7 @@ skip-if = e10s # Bug ?????? - test uses promiseTabLoadEvent() which isn't e10s f
[browser_948985_non_removable_defaultArea.js] [browser_948985_non_removable_defaultArea.js]
[browser_952963_areaType_getter_no_area.js] [browser_952963_areaType_getter_no_area.js]
[browser_956602_remove_special_widget.js] [browser_956602_remove_special_widget.js]
[browser_962069_drag_to_overflow_chevron.js]
[browser_962884_opt_in_disable_hyphens.js] [browser_962884_opt_in_disable_hyphens.js]
[browser_963639_customizing_attribute_non_customizable_toolbar.js] [browser_963639_customizing_attribute_non_customizable_toolbar.js]
[browser_967000_button_charEncoding.js] [browser_967000_button_charEncoding.js]

Просмотреть файл

@ -0,0 +1,39 @@
/* 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";
let originalWindowWidth;
// Drag to overflow chevron should open the overflow panel.
add_task(function*() {
originalWindowWidth = window.outerWidth;
let navbar = document.getElementById(CustomizableUI.AREA_NAVBAR);
ok(!navbar.hasAttribute("overflowing"), "Should start with a non-overflowing toolbar.");
ok(CustomizableUI.inDefaultState, "Should start in default state.");
let oldChildCount = navbar.customizationTarget.childElementCount;
window.resizeTo(400, window.outerHeight);
yield waitForCondition(() => navbar.hasAttribute("overflowing"));
ok(navbar.hasAttribute("overflowing"), "Should have an overflowing toolbar.");
let widgetOverflowPanel = document.getElementById("widget-overflow");
let panelShownPromise = promisePanelElementShown(window, widgetOverflowPanel);
let identityBox = document.getElementById("identity-box");
let overflowChevron = document.getElementById("nav-bar-overflow-button");
ChromeUtils.synthesizeDrop(identityBox, overflowChevron, [], null);
yield panelShownPromise;
ok(true, "Overflow panel is shown.");
let panelHiddenPromise = promisePanelElementHidden(window, widgetOverflowPanel);
EventUtils.synthesizeKey("VK_ESCAPE", {});
yield panelHiddenPromise;
});
add_task(function*() {
window.resizeTo(originalWindowWidth, window.outerHeight);
let navbar = document.getElementById(CustomizableUI.AREA_NAVBAR);
yield waitForCondition(() => !navbar.hasAttribute("overflowing"));
ok(!navbar.hasAttribute("overflowing"), "Should not have an overflowing toolbar.");
});