Index: suite/browser/browser-prefs.js
===================================================================
RCS file: /cvsroot/mozilla/suite/browser/browser-prefs.js,v
retrieving revision 1.82
diff -u -8 -p -r1.82 browser-prefs.js
--- suite/browser/browser-prefs.js 27 Jan 2008 23:53:07 -0000 1.82
+++ suite/browser/browser-prefs.js 2 Feb 2008 14:07:00 -0000
@@ -77,20 +77,17 @@ pref("browser.urlbar.matchOnlyTyped", fa
pref("browser.chrome.site_icons", true);
pref("browser.chrome.favicons", false);
pref("browser.chrome.image_icons.max_size", 1024);
// 0 = never, 1 = when in cache, 2 = always
pref("browser.chrome.load_toolbar_icons", 0);
-pref("browser.toolbars.showbutton.bookmarks", true);
pref("browser.toolbars.showbutton.go", false);
-pref("browser.toolbars.showbutton.home", true);
-pref("browser.toolbars.showbutton.print", true);
pref("browser.toolbars.showbutton.search", true);
pref("browser.download.progressDnldDialog.keepAlive", true); // keep the dnload progress dialog up after dnload is complete
pref("browser.download.progressDnldDialog.enable_launch_reveal_buttons", true);
pref("browser.download.progressDnlgDialog.dontAskForLaunch", false);
pref("browser.download.finished_download_sound", false);
pref("browser.download.finished_download_alert", false);
pref("browser.download.finished_sound_url", "");
Index: suite/browser/browser.js
===================================================================
RCS file: /cvsroot/mozilla/suite/browser/browser.js,v
retrieving revision 1.43
diff -u -8 -p -r1.43 browser.js
--- suite/browser/browser.js 13 Oct 2007 16:57:53 -0000 1.43
+++ suite/browser/browser.js 1 Nov 2007 06:40:22 -0000
@@ -38,16 +38,17 @@
*
* ***** END LICENSE BLOCK ***** */
const nsIWebNavigation = Components.interfaces.nsIWebNavigation;
var gPrintSettingsAreGlobal = true;
var gSavePrintSettings = true;
var gChromeState = null; // chrome state before we went into print preview
var gInPrintPreviewMode = false;
+var gNavToolbox = null;
function getWebNavigation()
{
try {
return getBrowser().webNavigation;
} catch (e) {
return null;
}
@@ -84,18 +85,17 @@ function toggleAffectedChrome(aHide)
// (*) tab browser ``strip''
// (*) sidebar
// (*) statusbar
if (!gChromeState)
gChromeState = new Object;
var statusbar = document.getElementById("status-bar");
- var navToolbox = document.getElementById("navigator-toolbox");
- navToolbox.hidden = aHide;
+ getNavToolbox().hidden = aHide;
var theTabbrowser = document.getElementById("content");
var notificationBox = gBrowser.getNotificationBox();
// sidebar states map as follows:
// was-hidden => hide/show nothing
// was-collapsed => hide/show only the splitter
// was-shown => hide/show the splitter and the box
if (aHide)
@@ -158,19 +158,23 @@ function onEnterPrintPreview()
function onExitPrintPreview()
{
gInPrintPreviewMode = false;
// restore chrome to original state
toggleAffectedChrome(false);
}
+// XXXRatty: If viewSource gets a print preview (with toolbar)
+// getNavToolbox() will need to be fixed.
function getNavToolbox()
{
- return document.getElementById("navigator-toolbox");
+ if (!gNavToolbox)
+ gNavToolbox = document.getElementById("navigator-toolbox");
+ return gNavToolbox;
}
function getPPBrowser()
{
return document.getElementById("browser");
}
function BrowserPrintPreview()
Index: suite/browser/fullScreen.js
===================================================================
RCS file: /cvsroot/mozilla/suite/browser/fullScreen.js,v
retrieving revision 1.4
diff -u -8 -p -r1.4 fullScreen.js
--- suite/browser/fullScreen.js 14 Jan 2007 05:31:43 -0000 1.4
+++ suite/browser/fullScreen.js 8 Nov 2007 13:28:08 -0000
@@ -36,57 +36,80 @@
*
* ***** END LICENSE BLOCK ***** */
var FullScreen =
{
toggle: function()
{
// show/hide all menubars, toolbars, and statusbars (except the full screen toolbar)
- this.showXULChrome("menubar", window.fullScreen);
this.showXULChrome("toolbar", window.fullScreen);
this.showXULChrome("statusbar", window.fullScreen);
},
showXULChrome: function(aTag, aShow)
{
var XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
var els = document.getElementsByTagNameNS(XULNS, aTag);
-
+
var i;
for (i = 0; i < els.length; ++i) {
// XXX don't interfere with previously collapsed toolbars
if (els[i].getAttribute("fullscreentoolbar") == "true") {
- this.setToolbarButtonMode(els[i], aShow ? "" : "small");
+ if (!aShow) {
+ var toolbarMode = els[i].getAttribute("mode");
+ if (toolbarMode != "text") {
+ els[i].setAttribute("saved-mode", toolbarMode);
+ els[i].setAttribute("saved-iconsize",
+ els[i].getAttribute("iconsize"));
+ els[i].setAttribute("mode", "icons");
+ els[i].setAttribute("iconsize", "small");
+ }
+
+ // XXX See bug 202978: we disable the context menu
+ // to prevent customization while in fullscreen, which
+ // causes menu breakage.
+ els[i].setAttribute("saved-context",
+ els[i].getAttribute("context"));
+ els[i].removeAttribute("context");
+
+ // Set the inFullscreen attribute to allow specific styling
+ // in fullscreen mode
+ els[i].setAttribute("inFullscreen", true);
+ }
+ else {
+ function restoreAttr(attrName) {
+ var savedAttr = "saved-" + attrName;
+ if (els[i].hasAttribute(savedAttr)) {
+ var savedValue = els[i].getAttribute(savedAttr);
+ els[i].setAttribute(attrName, savedValue);
+ els[i].removeAttribute(savedAttr);
+ }
+ }
+
+ restoreAttr("mode");
+ restoreAttr("iconsize");
+ restoreAttr("context"); // XXX see above
+
+ els[i].removeAttribute("inFullscreen");
+ }
} else {
// use moz-collapsed so it doesn't persist hidden/collapsed,
// so that new windows don't have missing toolbars
if (aShow)
els[i].removeAttribute("moz-collapsed");
else
els[i].setAttribute("moz-collapsed", "true");
}
}
-
+
+ var toolbox = getNavToolbox();
+ if (aShow)
+ toolbox.removeAttribute("inFullscreen");
+ else
+ toolbox.setAttribute("inFullscreen", true);
+
var controls = document.getElementsByAttribute("fullscreencontrol", "true");
for (i = 0; i < controls.length; ++i)
controls[i].hidden = aShow;
- },
-
- setToolbarButtonMode: function(aToolbar, aMode)
- {
- aToolbar.setAttribute("toolbarmode", aMode);
- this.setToolbarButtonModeFor(aToolbar, "toolbarbutton", aMode);
- this.setToolbarButtonModeFor(aToolbar, "button", aMode);
- this.setToolbarButtonModeFor(aToolbar, "textbox", aMode);
- },
-
- setToolbarButtonModeFor: function(aToolbar, aTag, aMode)
- {
- var XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
- var els = aToolbar.getElementsByTagNameNS(XULNS, aTag);
-
- for (var i = 0; i < els.length; ++i) {
- els[i].setAttribute("toolbarmode", aMode);
- }
}
-
+
};
Index: suite/browser/navigator.js
===================================================================
RCS file: /cvsroot/mozilla/suite/browser/navigator.js,v
retrieving revision 1.618
diff -u -8 -p -r1.618 navigator.js
--- suite/browser/navigator.js 4 Jan 2008 22:59:00 -0000 1.618
+++ suite/browser/navigator.js 17 Feb 2008 16:46:56 -0000
@@ -72,40 +72,32 @@ var gFocusedDocument = null;
const gButtonPrefListener =
{
domain: "browser.toolbars.showbutton",
init: function()
{
var array = pref.getChildList(this.domain, {});
for (var i in array)
this.updateButton(array[i]);
- this.updateSeparator();
},
observe: function(subject, topic, prefName)
{
// verify that we're changing a button pref
if (topic != "nsPref:changed")
return;
this.updateButton(prefName);
- this.updateSeparator();
},
updateButton: function(prefName)
{
var buttonName = prefName.substr(this.domain.length+1);
var buttonId = buttonName + "-button";
var button = document.getElementById(buttonId);
if (button)
button.hidden = !pref.getBoolPref(prefName);
- },
- updateSeparator: function()
- {
- // If all buttons before the separator are hidden, also hide the separator
- var separator = document.getElementById("home-bm-separator");
- separator.hidden = allLeftButtonsAreHidden();
}
};
const gTabStripPrefListener =
{
domain: "browser.tabs.autoHide",
observe: function(subject, topic, prefName)
{
@@ -361,31 +353,16 @@ function UpdateBackForwardButtons()
if (upDisabled != !browser.currentURI.spec.replace(/[#?].*$/, "").match(/\/[^\/]+\/./)) {
if (upDisabled)
upBroadcaster.removeAttribute("disabled");
else
upBroadcaster.setAttribute("disabled", true);
}
}
-// Function allLeftButtonsAreHidden
-// Returns true if all the buttons left of the separator in the personal
-// toolbar are hidden, false otherwise.
-// Used by nsButtonPrefListener to hide the separator if needed
-function allLeftButtonsAreHidden()
-{
- var buttonNode = document.getElementById("home-bm-separator").previousSibling;
- while (buttonNode) {
- if (buttonNode.localName != "tooltip" && !buttonNode.hidden)
- return false;
- buttonNode = buttonNode.previousSibling;
- }
- return true;
-}
-
const gTabOpenObserver = {
observe: function(subject, topic, data)
{
if (topic != "open-new-tab-request" || subject != window)
return;
delayedOpenTab(data);
}
@@ -487,17 +464,17 @@ function Startup()
// init globals
gNavigatorBundle = document.getElementById("bundle_navigator");
gBrandBundle = document.getElementById("bundle_brand");
gNavigatorRegionBundle = document.getElementById("bundle_navigator_region");
gBrowser = document.getElementById("content");
gURLBar = document.getElementById("urlbar");
- SetPageProxyState("invalid", null);
+ SetPageProxyState("invalid");
var webNavigation;
try {
// Create the browser instance component.
appCore = Components.classes["@mozilla.org/appshell/component/browser/instance;1"]
.createInstance(Components.interfaces.nsIBrowserInstance);
if (!appCore)
throw "couldn't create a browser instance";
@@ -615,17 +592,18 @@ function Startup()
}
if (/^\s*$/.test(uriToLoad))
uriToLoad = "about:blank";
var browser = getBrowser();
if (uriToLoad != "about:blank") {
- gURLBar.value = uriToLoad;
+ if (gURLBar)
+ gURLBar.value = uriToLoad;
browser.userTypedValue = uriToLoad;
if ("arguments" in window && window.arguments.length >= 4) {
loadURI(uriToLoad, window.arguments[2], window.arguments[3]);
} else if ("arguments" in window && window.arguments.length == 3) {
loadURI(uriToLoad, window.arguments[2]);
} else {
loadURI(uriToLoad);
}
@@ -634,17 +612,18 @@ function Startup()
// Focus the content area unless we're loading a blank page, or if
// we weren't passed any arguments. This "breaks" the
// javascript:window.open(); case where we don't get any arguments
// either, but we're loading about:blank, but focusing the content
// are is arguably correct in that case as well since the opener
// is very likely to put some content in the new window, and then
// the focus should be in the content area.
var navBar = document.getElementById("nav-bar");
- if ("arguments" in window && uriToLoad == "about:blank" && !navBar.hidden && window.locationbar.visible)
+ if ("arguments" in window && uriToLoad == "about:blank"
+ && gURLBar && isElementVisible(gURLBar))
setTimeout(WindowFocusTimerCallback, 0, gURLBar);
else
setTimeout(WindowFocusTimerCallback, 0, content);
// Perform default browser checking (after window opens).
setTimeout( checkForDefaultBrowser, 0 );
// hook up browser access support
@@ -678,16 +657,21 @@ function Startup()
// BiDi UI
gShowBiDi = isBidiEnabled();
if (gShowBiDi) {
document.getElementById("documentDirection-swap").hidden = false;
document.getElementById("textfieldDirection-separator").hidden = false;
document.getElementById("textfieldDirection-swap").hidden = false;
}
+ // Before and after callbacks for the customizeToolbar code
+ getNavToolbox().customizeInit = BrowserToolboxCustomizeInit;
+ getNavToolbox().customizeDone = BrowserToolboxCustomizeDone;
+ getNavToolbox().customizeChange = getNavToolbox().updateCustomToolbarModes;
+
// now load bookmarks after a delay
setTimeout(LoadBookmarksCallback, 0);
}
function LoadBookmarksCallback()
{
// loads the services
initServices();
@@ -1051,17 +1035,17 @@ function getSearchUrl(attr)
}
function QualifySearchTerm()
{
// If the text in the URL bar is the same as the currently loaded
// page's URL then treat this as an empty search term. This way
// the user is taken to the search page where s/he can enter a term.
if (gBrowser.userTypedValue !== null)
- return document.getElementById("urlbar").value;
+ return gURLBar.value;
return "";
}
function OpenSearch(tabName, searchStr, newWindowOrTabFlag, reverseBackgroundPref)
{
//This function needs to be split up someday.
var autoOpenSearchPanel = false;
@@ -1276,17 +1260,17 @@ function BrowserOpenTab()
break;
}
} catch(e) {
uriToLoad = "about:blank";
}
gBrowser.selectedTab = gBrowser.addTab(uriToLoad);
var navBar = document.getElementById("nav-bar");
- if (uriToLoad == "about:blank" && !navBar.hidden && window.locationbar.visible)
+ if (uriToLoad == "about:blank" && gURLBar && isElementVisible(gURLBar))
setTimeout("gURLBar.focus();", 0);
else
setTimeout("content.focus();", 0);
}
}
/* Show file picker dialog configured for opening a file, and return
* the selected nsIFileURL instance. */
@@ -1506,17 +1490,17 @@ function BrowserLoadURL(aTriggeringEvent
} else {
// Open a new window with the URL
var newWin = openDialog(getBrowserURL(), "_blank", "all,dialog=no", url,
null, null, nsIWebNavigation.LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP);
// Reset url in the urlbar, copied from handleURLBarRevert()
var oldURL = browser.currentURI.spec;
if (oldURL != "about:blank" || content.opener) {
gURLBar.value = oldURL;
- SetPageProxyState("valid", null);
+ SetPageProxyState("valid");
} else
gURLBar.value = "";
browser.userTypedValue = null;
// Focus old window if shift was pressed, as there's no
// way to open a new window in the background
// XXX this doesn't seem to work
@@ -2047,44 +2031,58 @@ function checkForDefaultBrowser()
// integration dialog may have come up.
SidebarRebuild();
}
}
}
function ShowAndSelectContentsOfURLBar()
{
- var navBar = document.getElementById("nav-bar");
-
- // If it's hidden, show it.
- if (navBar.getAttribute("hidden") == "true")
- goToggleToolbar('nav-bar','cmd_viewnavbar');
+ if (!gURLBar) {
+ BrowserOpenWindow();
+ return;
+ }
- if (gURLBar.value)
- gURLBar.select();
- else
- gURLBar.focus();
+ var toolbar = gURLBar.parentNode;
+ while (toolbar && toolbar.localName != "toolbar") {
+ toolbar = toolbar.parentNode;
+ }
+
+ // If the containing toolbar is hidden, show it.
+ if (toolbar.getAttribute("hidden") == "true") {
+ var navBar = document.getElementById("nav-bar");
+ var command = toolbar == navBar ? "cmd_viewnavbar" : null;
+ goToggleToolbar(toolbar.id, command );
+ }
+
+ if (!gURLBar.readOnly) { // XXXRatty: why does Firefox check .readOnly?
+ if (gURLBar.value)
+ gURLBar.select();
+ else
+ gURLBar.focus();
+ return;
+ }
}
// If "ESC" is pressed in the url bar, we replace the urlbar's value with the url of the page
// and highlight it, unless it is about:blank, where we reset it to "".
function handleURLBarRevert()
{
var url = getWebNavigation().currentURI.spec;
- var throbberElement = document.getElementById("navigator-throbber");
+ var throbberElement = document.getElementById("throbber-broadcaster");
var isScrolling = gURLBar.userAction == "scrolling";
// don't revert to last valid url unless page is NOT loading
// and user is NOT key-scrolling through autocomplete list
if (!throbberElement.hasAttribute("busy") && !isScrolling) {
if (url != "about:blank" || content.opener) {
gURLBar.value = url;
gURLBar.select();
- SetPageProxyState("valid", null); // XXX Build a URI and pass it in here.
+ SetPageProxyState("valid");
} else { //if about:blank, urlbar becomes ""
gURLBar.value = "";
}
gBrowser.userTypedValue = null;
}
// tell widget to revert to last typed text only if the user
@@ -2102,51 +2100,67 @@ function handleURLBarCommand(aUserAction
}
BrowserLoadURL(aTriggeringEvent);
}
function UpdatePageProxyState()
{
if (gURLBar.value != gLastValidURLStr)
- SetPageProxyState("invalid", null);
+ SetPageProxyState("invalid");
}
-function SetPageProxyState(aState, aURI)
+function SetPageProxyState(aState)
{
+ if (!gURLBar)
+ return;
+
if (!gProxyButton)
gProxyButton = document.getElementById("page-proxy-button");
if (!gProxyFavIcon)
gProxyFavIcon = document.getElementById("page-proxy-favicon");
if (!gProxyDeck)
gProxyDeck = document.getElementById("page-proxy-deck");
gProxyButton.setAttribute("pageproxystate", aState);
if (aState == "valid") {
gLastValidURLStr = gURLBar.value;
gURLBar.addEventListener("input", UpdatePageProxyState, false);
- if (gBrowser.shouldLoadFavIcon(aURI)) {
- var favStr = gBrowser.buildFavIconString(aURI);
- if (favStr != gProxyFavIcon.src) {
- gBrowser.loadFavIcon(aURI, "src", gProxyFavIcon);
- gProxyDeck.selectedIndex = 0;
- }
- else gProxyDeck.selectedIndex = 1;
- }
- else {
- gProxyDeck.selectedIndex = 0;
- gProxyFavIcon.removeAttribute("src");
- }
+
+ var aURL = gBrowser.mTabListeners[gBrowser.mTabContainer.selectedIndex].mIcon;
+ PageProxySetIcon(aURL);
} else if (aState == "invalid") {
gURLBar.removeEventListener("input", UpdatePageProxyState, false);
- gProxyDeck.selectedIndex = 0;
+ PageProxyClearIcon();
}
}
+function PageProxySetIcon(aURL)
+{
+ if (!gProxyFavIcon)
+ return;
+ if (!aURL) {
+ PageProxyClearIcon();
+ return;
+ }
+ if (gProxyFavIcon.getAttribute("src") != aURL)
+ gProxyFavIcon.setAttribute("src", aURL);
+ if (gProxyDeck.selectedIndex != 1)
+ gProxyDeck.selectedIndex = 1;
+}
+
+function PageProxyClearIcon()
+{
+ if (gProxyDeck.selectedIndex != 0)
+ gProxyDeck.selectedIndex = 0;
+ if (gProxyFavIcon.hasAttribute("src"))
+ gProxyFavIcon.removeAttribute("src");
+}
+
function PageProxyDragGesture(aEvent)
{
if (gProxyButton.getAttribute("pageproxystate") == "valid") {
nsDragAndDrop.startDrag(aEvent, proxyIconDNDObserver);
return true;
}
return false;
}
@@ -2451,8 +2465,70 @@ function convertFromUnicode(charset, str
.createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
unicodeConverter.charset = charset;
str = unicodeConverter.ConvertFromUnicode(str);
return str + unicodeConverter.Finish();
} catch(ex) {
return null;
}
}
+
+function BrowserToolboxCustomizeInit()
+{
+ // Disable the toolbar context menu items
+ var menubar = document.getElementById("main-menubar");
+ for (var i = 0; i < menubar.childNodes.length; ++i)
+ menubar.childNodes[i].setAttribute("disabled", true);
+
+ var cmd = document.getElementById("cmd_CustomizeToolbars");
+ cmd.setAttribute("disabled", "true");
+}
+
+function BrowserToolboxCustomizeDone(aToolboxChanged)
+{
+ // Update global UI elements that may have been added or removed
+ if (aToolboxChanged) {
+ gURLBar = document.getElementById("urlbar");
+ gProxyButton = document.getElementById("page-proxy-button");
+ gProxyFavIcon = document.getElementById("page-proxy-favicon");
+ gProxyDeck = document.getElementById("page-proxy-deck");
+
+ // From window.XULBrowserWindow.init();
+ window.XULBrowserWindow.urlBar = document.getElementById("urlbar");
+ }
+ //XXXRatty: find a better place to put this.
+ getNavToolbox().updateCustomToolbarModes();
+
+ // Update the urlbar
+ var url = getWebNavigation().currentURI.spec;
+ if (gURLBar) {
+ gURLBar.value = url == "about:blank" ? "" : url;
+ SetPageProxyState("valid");
+ gButtonPrefListener.updateButton("browser.toolbars.showbutton.go");
+ gButtonPrefListener.updateButton("browser.toolbars.showbutton.search");
+ }
+
+ // Re-enable parts of the UI we disabled during the dialog
+ var menubar = document.getElementById("main-menubar");
+ for (var i = 0; i < menubar.childNodes.length; ++i)
+ menubar.childNodes[i].setAttribute("disabled", false);
+ var cmd = document.getElementById("cmd_CustomizeToolbars");
+ cmd.removeAttribute("disabled");
+
+ // fix up the personal toolbar folder
+ var bt = document.getElementById("bookmarks-ptf");
+ if (bt) {
+ var btchevron = document.getElementById("bookmarks-chevron");
+ // no uniqueness is guaranteed, so we have to remove first
+ try {
+ bt.database.RemoveObserver(BookmarksToolbarRDFObserver);
+ } catch (ex) {
+ // ignore
+ }
+ bt.database.AddObserver(BookmarksToolbarRDFObserver);
+ bt.builder.rebuild();
+ btchevron.builder.rebuild();
+
+ // fake a resize; this function takes care of flowing bookmarks
+ // from the bar to the overflow item
+ BookmarksToolbar.resizeFunc(null);
+ }
+}
Index: suite/browser/navigator.xul
===================================================================
RCS file: /cvsroot/mozilla/suite/browser/navigator.xul,v
retrieving revision 1.457
diff -u -8 -p -r1.457 navigator.xul
--- suite/browser/navigator.xul 2 Feb 2008 01:09:30 -0000 1.457
+++ suite/browser/navigator.xul 2 Feb 2008 14:20:50 -0000
@@ -107,241 +107,303 @@
-
+
-
+
+
+
-
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ fullscreentoolbar="true" customizable="true"
+ toolbarname="&navbarCmd.label;" accesskey="&navbarCmd.accesskey;"
+ defaultset="back-button,forward-button,reload-button,stop-button,urlbar-container,print-button,throbber-box,window-controls"
+ mode="icons"
+ context="toolbar-context-menu">
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ onmouseover="BookmarksToolbar.autoOpenMenu(event.target);"
+ onpopupshowing="BookmarksToolbar.onMenuOpen(event.target);"
+ onpopuphidden="BookmarksToolbar.onMenuClose(event.target);"
+ ondraggesture="if (event.target.id!='bookmarks-button') nsDragAndDrop.startDrag(event, BookmarksMenuDNDObserver); event.stopPropagation()"
+ ondragdrop="nsDragAndDrop.drop(event, BookmarksMenuDNDObserver); event.stopPropagation()"
+ ondragenter="nsDragAndDrop.dragEnter(event, BookmarksMenuDNDObserver); event.stopPropagation()"
+ ondragexit="nsDragAndDrop.dragExit(event, BookmarksMenuDNDObserver); event.stopPropagation()"
+ ondragover="nsDragAndDrop.dragOver(event, BookmarksMenuDNDObserver); event.stopPropagation()">
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -210,16 +211,17 @@
+
@@ -408,17 +410,17 @@
-
+