author | Blair McBride <bmcbride@mozilla.com> |
Fri, 07 Mar 2014 05:19:00 -0500 | |
changeset 173124 | 512f9b89f5ccf7f69ac5a7a64bc5a13c93895b53 |
parent 173123 | f66e3ccb0c419a538cab1200ce16670e31ed007b |
child 173125 | ac800841c8532e6e1016965c759b4fc4404d4cb3 |
push id | 26391 |
push user | cbook@mozilla.com |
push date | Wed, 12 Mar 2014 11:20:34 +0000 |
treeherder | mozilla-central@a56837cfc67c [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | Gijs, jaws |
bugs | 980155 |
milestone | 30.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/browser/base/content/browser.xul +++ b/browser/base/content/browser.xul @@ -626,16 +626,17 @@ aria-label="&navbarCmd.label;" fullscreentoolbar="true" mode="icons" customizable="true" iconsize="small" defaultset="urlbar-container,search-container,webrtc-status-button,bookmarks-menu-button,downloads-button,home-button,social-share-button,social-toolbar-item" customizationtarget="nav-bar-customization-target" overflowable="true" overflowbutton="nav-bar-overflow-button" overflowtarget="widget-overflow-list" + overflowpanel="widget-overflow" context="toolbar-context-menu"> <hbox id="nav-bar-customization-target" flex="1"> <toolbaritem id="urlbar-container" flex="400" persist="width" forwarddisabled="true" title="&locationItem.title;" removable="false" cui-areatype="toolbar" class="chromeclass-location" overflows="false"> <toolbarbutton id="back-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
--- a/browser/components/customizableui/src/CustomizableUI.jsm +++ b/browser/components/customizableui/src/CustomizableUI.jsm @@ -3450,17 +3450,22 @@ function OverflowableToolbar(aToolbarNod this._toolbar.setAttribute("overflowable", "true"); let doc = this._toolbar.ownerDocument; this._target = this._toolbar.customizationTarget; this._list = doc.getElementById(this._toolbar.getAttribute("overflowtarget")); this._list.toolbox = this._toolbar.toolbox; this._list.customizationTarget = this._list; - Services.obs.addObserver(this, "browser-delayed-startup-finished", false); + let window = this._toolbar.ownerDocument.defaultView; + if (window.gBrowserInit.delayedStartupFinished) { + this.init(); + } else { + Services.obs.addObserver(this, "browser-delayed-startup-finished", false); + } } OverflowableToolbar.prototype = { initialized: false, _forceOnOverflow: false, observe: function(aSubject, aTopic, aData) { if (aTopic == "browser-delayed-startup-finished" && @@ -3476,17 +3481,18 @@ OverflowableToolbar.prototype = { window.addEventListener("resize", this); window.gNavToolbox.addEventListener("customizationstarting", this); window.gNavToolbox.addEventListener("aftercustomization", this); let chevronId = this._toolbar.getAttribute("overflowbutton"); this._chevron = doc.getElementById(chevronId); this._chevron.addEventListener("command", this); - this._panel = doc.getElementById("widget-overflow"); + let panelId = this._toolbar.getAttribute("overflowpanel"); + this._panel = doc.getElementById(panelId); this._panel.addEventListener("popuphiding", this); CustomizableUIInternal.addPanelCloseListeners(this._panel); CustomizableUI.addListener(this); // The 'overflow' event may have been fired before init was called. if (this._toolbar.overflowedDuringConstruction) { this.onOverflow(this._toolbar.overflowedDuringConstruction);
--- a/browser/components/customizableui/test/browser.ini +++ b/browser/components/customizableui/test/browser.ini @@ -69,10 +69,11 @@ skip-if = os == "linux" [browser_968565_insert_before_hidden_items.js] [browser_969427_recreate_destroyed_widget_after_reset.js] [browser_969661_character_encoding_navbar_disabled.js] [browser_970511_undo_restore_default.js] [browser_972267_customizationchange_events.js] [browser_973932_addonbar_currentset.js] [browser_975719_customtoolbars_behaviour.js] [browser_978084_dragEnd_after_move.js] +[browser_980155_add_overflow_toolbar.js] [browser_981418-widget-onbeforecreated-handler.js] [browser_panel_toggle.js]
new file mode 100644 --- /dev/null +++ b/browser/components/customizableui/test/browser_980155_add_overflow_toolbar.js @@ -0,0 +1,51 @@ +/* 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 kToolbarName = "test-new-overflowable-toolbar"; +const kTestWidgetPrefix = "test-widget-for-overflowable-toolbar-"; + +add_task(function addOverflowingToolbar() { + let originalWindowWidth = window.outerWidth; + + let widgetIds = []; + for (let i = 0; i < 10; i++) { + let id = kTestWidgetPrefix + i; + widgetIds.push(id); + let spec = {id: id, type: "button", removable: true, label: "test", tooltiptext: "" + i}; + CustomizableUI.createWidget(spec); + } + + let toolbarNode = createOverflowableToolbarWithPlacements(kToolbarName, widgetIds); + assertAreaPlacements(kToolbarName, widgetIds); + + for (let id of widgetIds) { + document.getElementById(id).style.minWidth = "200px"; + } + + isnot(toolbarNode.overflowable, null, "Toolbar should have overflowable controller"); + isnot(toolbarNode.customizationTarget, null, "Toolbar should have customization target"); + isnot(toolbarNode.customizationTarget, toolbarNode, "Customization target should not be toolbar node"); + + let oldChildCount = toolbarNode.customizationTarget.childElementCount; + let overflowableList = document.getElementById(kToolbarName + "-overflow-list"); + let oldOverflowCount = overflowableList.childElementCount; + + isnot(oldChildCount, 0, "Toolbar should have non-overflowing widgets"); + + window.resizeTo(400, window.outerHeight); + yield waitForCondition(() => toolbarNode.hasAttribute("overflowing")); + ok(toolbarNode.hasAttribute("overflowing"), "Should have an overflowing toolbar."); + ok(toolbarNode.customizationTarget.childElementCount < oldChildCount, "Should have fewer children."); + ok(overflowableList.childElementCount > oldOverflowCount, "Should have more overflowed widgets."); + + window.resizeTo(originalWindowWidth, window.outerHeight); +}); + + +add_task(function asyncCleanup() { + removeCustomToolbars(); + yield resetCustomization(); +});
--- a/browser/components/customizableui/test/head.js +++ b/browser/components/customizableui/test/head.js @@ -40,21 +40,67 @@ function createToolbarWithPlacements(id, CustomizableUI.registerArea(id, { type: CustomizableUI.TYPE_TOOLBAR, defaultPlacements: placements }); gNavToolbox.appendChild(tb); return tb; } +function createOverflowableToolbarWithPlacements(id, placements) { + gAddedToolbars.add(id); + + let tb = document.createElementNS(kNSXUL, "toolbar"); + tb.id = id; + tb.setAttribute("customizationtarget", id + "-target"); + + let customizationtarget = document.createElementNS(kNSXUL, "hbox"); + customizationtarget.id = id + "-target"; + customizationtarget.setAttribute("flex", "1"); + tb.appendChild(customizationtarget); + + let overflowPanel = document.createElementNS(kNSXUL, "panel"); + overflowPanel.id = id + "-overflow"; + document.getElementById("mainPopupSet").appendChild(overflowPanel); + + let overflowList = document.createElementNS(kNSXUL, "vbox"); + overflowList.id = id + "-overflow-list"; + overflowPanel.appendChild(overflowList); + + let chevron = document.createElementNS(kNSXUL, "toolbarbutton"); + chevron.id = id + "-chevron"; + tb.appendChild(chevron); + + CustomizableUI.registerArea(id, { + type: CustomizableUI.TYPE_TOOLBAR, + defaultPlacements: placements, + overflowable: true, + }); + + tb.setAttribute("customizable", "true"); + tb.setAttribute("overflowable", "true"); + tb.setAttribute("overflowpanel", overflowPanel.id); + tb.setAttribute("overflowtarget", overflowList.id); + tb.setAttribute("overflowbutton", chevron.id); + + gNavToolbox.appendChild(tb); + return tb; +} + function removeCustomToolbars() { CustomizableUI.reset(); for (let toolbarId of gAddedToolbars) { CustomizableUI.unregisterArea(toolbarId, true); - document.getElementById(toolbarId).remove(); + let tb = document.getElementById(toolbarId); + if (tb.hasAttribute("overflowpanel")) { + let panel = document.getElementById(tb.getAttribute("overflowpanel")); + if (panel) + panel.remove(); + } + tb.remove(); } gAddedToolbars.clear(); } function getToolboxCustomToolbarId(toolbarName) { return "__customToolbar_" + toolbarName.replace(" ", "_"); }