Merge from cvs-trunk-mirror. This fixes bug 393364, a C++ compatibility bug. js/src now builds ok.

--HG--
rename : js/src/jsatom.c => js/src/jsatom.cpp
rename : js/src/jsfun.c => js/src/jsfun.cpp
rename : js/src/jsgc.c => js/src/jsgc.cpp
rename : js/src/jsinterp.c => js/src/jsinterp.cpp
rename : js/src/jsobj.c => js/src/jsobj.cpp
rename : js/src/jsxdrapi.c => js/src/jsxdrapi.cpp
This commit is contained in:
jorendorff@mozilla.com 2007-08-23 21:03:00 -04:00
commit 5311d53de1
362 changed files with 13348 additions and 4224 deletions

View File

@ -134,6 +134,10 @@ endif # WINNT
ifeq ($(OS_ARCH),WINNT)
# we want to copy PDB files on Windows
MAKE_SYM_STORE_ARGS := -c
ifeq (,$(CYGWIN_WRAPPER))
# this doesn't work with Cygwin Python
MAKE_SYM_STORE_ARGS += --vcs-info
endif
DUMP_SYMS_BIN ?= $(topsrcdir)/toolkit/crashreporter/tools/win32/dump_syms.exe
# PDB files don't get moved to dist, so we need to scan the whole objdir
MAKE_SYM_STORE_PATH := .

View File

@ -56,7 +56,7 @@ interface nsIDOMDOMStringList;
*
* @status UNDER_REVIEW
*/
[scriptable, uuid(2d8c1b1b-7a3f-4962-8a88-81ca019c11e9)]
[scriptable, uuid(56c34b1a-d390-44f4-89c3-6935c0e4e3fa)]
interface nsIAccessibleRetrieval : nsISupports
{
/**
@ -141,21 +141,30 @@ interface nsIAccessibleRetrieval : nsISupports
* an accessible does not already exist for this DOM node.
*/
nsIAccessible getCachedAccessible(in nsIDOMNode aNode, in nsIWeakReference aShell);
/**
* Returns accessible role as a string.
*
* @param aRole - the accessible role constants.
*/
AString getStringRole(in unsigned long aRole);
/**
* Returns list which contains accessible states as a strings.
*
* @param aStates - accessible states.
* @param aExtraStates - accessible extra states.
*/
nsIDOMDOMStringList getStringStates(in unsigned long aStates, in unsigned long aExtraStates);
nsIDOMDOMStringList getStringStates(in unsigned long aStates,
in unsigned long aExtraStates);
/**
* Get the type of accessible event as a string.
*
* @param aEventType - the accessible event type constant
* @return - accessible event type presented as human readable string
*/
AString getStringEventType(in unsigned long aEventType);
};

View File

@ -50,6 +50,7 @@ REQUIRES = content \
dom \
editor \
gfx \
thebes \
intl \
layout \
locale \

View File

@ -54,6 +54,7 @@ REQUIRES = appshell \
dom \
editor \
gfx \
thebes \
intl \
layout \
locale \

View File

@ -1040,6 +1040,20 @@ nsAccessibilityService::GetStringStates(PRUint32 aStates, PRUint32 aExtraStates,
return NS_OK;
}
// nsIAccessibleRetrieval::getStringEventType()
NS_IMETHODIMP
nsAccessibilityService::GetStringEventType(PRUint32 aEventType,
nsAString& aString)
{
if ( aEventType >= NS_ARRAY_LENGTH(kEventTypeNames)) {
aString.AssignLiteral("unknown");
return NS_OK;
}
CopyUTF8toUTF16(kEventTypeNames[aEventType], aString);
return NS_OK;
}
/**
* GetAccessibleFor - get an nsIAccessible from a DOM node
*/

View File

@ -52,6 +52,79 @@ class nsIDocShell;
class nsIPresShell;
class nsIContent;
class nsAccessibilityService : public nsIAccessibilityService,
public nsIObserver,
public nsIWebProgressListener,
public nsSupportsWeakReference
{
public:
nsAccessibilityService();
virtual ~nsAccessibilityService();
NS_DECL_ISUPPORTS
NS_DECL_NSIACCESSIBLERETRIEVAL
NS_DECL_NSIACCESSIBILITYSERVICE
NS_DECL_NSIOBSERVER
NS_DECL_NSIWEBPROGRESSLISTENER
/**
* Return presentation shell for the given node.
*
* @param aNode - the given DOM node.
*/
static nsresult GetShellFromNode(nsIDOMNode *aNode,
nsIWeakReference **weakShell);
/**
* Return accessibility service (static instance of this class).
*/
static nsresult GetAccessibilityService(nsIAccessibilityService** aResult);
private:
/**
* Return presentation shell, DOM node for the given frame.
*
* @param aFrame - the given frame
* @param aRealFrame [out] - the given frame casted to nsIFrame
* @param aShell [out] - presentation shell for DOM node associated with the
* given frame
* @param aContent [out] - DOM node associated with the given frame
*/
nsresult GetInfo(nsISupports *aFrame, nsIFrame **aRealFrame,
nsIWeakReference **aShell,
nsIDOMNode **aContent);
/**
* Initialize an accessible and cache it. The method should be called for
* every created accessible.
*
* @param aAccessibleIn - accessible to initialize.
*/
nsresult InitAccessible(nsIAccessible *aAccessibleIn, nsIAccessible **aAccessibleOut);
/**
* Return accessible object for elements implementing nsIAccessibleProvider
* interface.
*
* @param aNode - DOM node that accessible is returned for.
*/
nsresult GetAccessibleByType(nsIDOMNode *aNode, nsIAccessible **aAccessible);
/**
* Return accessible object if parent is a deck frame.
*
* @param aNode - DOMNode that accessible is returned for.
*/
nsresult GetAccessibleForDeckChildren(nsIDOMNode *aNode,
nsIAccessible **aAccessible);
static nsAccessibilityService *gAccessibilityService;
};
/**
* Map nsIAccessibleRole constants to strings. Used by
* nsIAccessibleRetrieval::getStringRole() method.
*/
static const char kRoleNames[][20] = {
"nothing", //ROLE_NOTHING
"titlebar", //ROLE_TITLEBAR
@ -172,42 +245,102 @@ static const char kRoleNames[][20] = {
"image map" //ROLE_IMAGE_MAP
};
class nsAccessibilityService : public nsIAccessibilityService,
public nsIObserver,
public nsIWebProgressListener,
public nsSupportsWeakReference
{
public:
nsAccessibilityService();
virtual ~nsAccessibilityService();
NS_DECL_ISUPPORTS
NS_DECL_NSIACCESSIBLERETRIEVAL
NS_DECL_NSIACCESSIBILITYSERVICE
NS_DECL_NSIOBSERVER
NS_DECL_NSIWEBPROGRESSLISTENER
static nsresult GetShellFromNode(nsIDOMNode *aNode, nsIWeakReference **weakShell);
static nsresult GetAccessibilityService(nsIAccessibilityService** aResult);
private:
nsresult GetInfo(nsISupports* aFrame, nsIFrame** aRealFrame, nsIWeakReference** aShell, nsIDOMNode** aContent);
void GetOwnerFor(nsIPresShell *aPresShell, nsIPresShell **aOwnerShell, nsIContent **aOwnerContent);
nsIContent* FindContentForDocShell(nsIPresShell* aPresShell, nsIContent* aContent, nsIDocShell* aDocShell);
static nsAccessibilityService *gAccessibilityService;
nsresult InitAccessible(nsIAccessible *aAccessibleIn, nsIAccessible **aAccessibleOut);
/**
* Return accessible object for elements implementing nsIAccessibleProvider
* interface.
*/
nsresult GetAccessibleByType(nsIDOMNode *aNode, nsIAccessible **aAccessible);
PRBool HasListener(nsIContent *aContent, nsAString& aEventType);
/**
* Return accessible object if parent is a deck frame
*/
nsresult GetAccessibleForDeckChildren(nsIDOMNode *aNode, nsIAccessible **aAccessible);
/**
* Map nsIAccessibleEvents constants to strings. Used by
* nsIAccessibleRetrieval::getStringEventType() method.
*/
static const char kEventTypeNames[][40] = {
"unknown", //
"DOM node create", // EVENT_DOM_CREATE
"DOM node destroy", // EVENT_DOM_DESTROY
"DOM node significant change", // EVENT_DOM_SIGNIFICANT_CHANGE
"async show", // EVENT_ASYNCH_SHOW
"async hide", // EVENT_ASYNCH_HIDE
"async significant change", // EVENT_ASYNCH_SIGNIFICANT_CHANGE
"active decendent change", // EVENT_ACTIVE_DECENDENT_CHANGED
"focus", // EVENT_FOCUS
"state change", // EVENT_STATE_CHANGE
"location change", // EVENT_LOCATION_CHANGE
"name changed", // EVENT_NAME_CHANGE
"description change", // EVENT_DESCRIPTION_CHANGE
"value change", // EVENT_VALUE_CHANGE
"help change", // EVENT_HELP_CHANGE
"default action change", // EVENT_DEFACTION_CHANGE
"action change", // EVENT_ACTION_CHANGE
"accelerator change", // EVENT_ACCELERATOR_CHANGE
"selection", // EVENT_SELECTION
"selection add", // EVENT_SELECTION_ADD
"selection remove", // EVENT_SELECTION_REMOVE
"selection within", // EVENT_SELECTION_WITHIN
"alert", // EVENT_ALERT
"foreground", // EVENT_FOREGROUND
"menu start", // EVENT_MENU_START
"menu end", // EVENT_MENU_END
"menupopup start", // EVENT_MENUPOPUP_START
"menupopup end", // EVENT_MENUPOPUP_END
"capture start", // EVENT_CAPTURE_START
"capture end", // EVENT_CAPTURE_END
"movesize start", // EVENT_MOVESIZE_START
"movesize end", // EVENT_MOVESIZE_END
"contexthelp start", // EVENT_CONTEXTHELP_START
"contexthelp end", // EVENT_CONTEXTHELP_END
"dragdrop start", // EVENT_DRAGDROP_START
"dragdrop end", // EVENT_DRAGDROP_END
"dialog start", // EVENT_DIALOG_START
"dialog end", // EVENT_DIALOG_END
"scrolling start", // EVENT_SCROLLING_START
"scrolling end", // EVENT_SCROLLING_END
"minimize start", // EVENT_MINIMIZE_START
"minimize end", // EVENT_MINIMIZE_END
"document load start", // EVENT_DOCUMENT_LOAD_START
"document load complete", // EVENT_DOCUMENT_LOAD_COMPLETE
"document reload", // EVENT_DOCUMENT_RELOAD
"document load stopped", // EVENT_DOCUMENT_LOAD_STOPPED
"document attributes changed", // EVENT_DOCUMENT_ATTRIBUTES_CHANGED
"document content changed", // EVENT_DOCUMENT_CONTENT_CHANGED
"property changed", // EVENT_PROPERTY_CHANGED
"selection changed", // EVENT_SELECTION_CHANGED
"text attribute changed", // EVENT_TEXT_ATTRIBUTE_CHANGED
"text caret moved", // EVENT_TEXT_CARET_MOVED
"text changed", // EVENT_TEXT_CHANGED
"text inserted", // EVENT_TEXT_INSERTED
"text removed", // EVENT_TEXT_REMOVED
"text updated", // EVENT_TEXT_UPDATED
"text selection changed", // EVENT_TEXT_SELECTION_CHANGED
"visible data changed", // EVENT_VISIBLE_DATA_CHANGED
"text column changed", // EVENT_TEXT_COLUMN_CHANGED
"section changed", // EVENT_SECTION_CHANGED
"table caption changed", // EVENT_TABLE_CAPTION_CHANGED
"table model changed", // EVENT_TABLE_MODEL_CHANGED
"table summary changed", // EVENT_TABLE_SUMMARY_CHANGED
"table row description changed", // EVENT_TABLE_ROW_DESCRIPTION_CHANGED
"table row header changed", // EVENT_TABLE_ROW_HEADER_CHANGED
"table row insert", // EVENT_TABLE_ROW_INSERT
"table row delete", // EVENT_TABLE_ROW_DELETE
"table row reorder", // EVENT_TABLE_ROW_REORDER
"table column description changed", // EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED
"table column header changed", // EVENT_TABLE_COLUMN_HEADER_CHANGED
"table column insert", // EVENT_TABLE_COLUMN_INSERT
"table column delete", // EVENT_TABLE_COLUMN_DELETE
"table column reorder", // EVENT_TABLE_COLUMN_REORDER
"window activate", // EVENT_WINDOW_ACTIVATE
"window create", // EVENT_WINDOW_CREATE
"window deactivate", // EVENT_WINDOW_DEACTIVATE
"window destroy", // EVENT_WINDOW_DESTROY
"window maximize", // EVENT_WINDOW_MAXIMIZE
"window minimize", // EVENT_WINDOW_MINIMIZE
"window resize", // EVENT_WINDOW_RESIZE
"window restore", // EVENT_WINDOW_RESTORE
"hyperlink end index changed", // EVENT_HYPERLINK_END_INDEX_CHANGED
"hyperlink number of anchors changed", // EVENT_HYPERLINK_NUMBER_OF_ANCHORS_CHANGED
"hyperlink selected link changed", // EVENT_HYPERLINK_SELECTED_LINK_CHANGED
"hypertext link activated", // EVENT_HYPERTEXT_LINK_ACTIVATED
"hypertext link selected", // EVENT_HYPERTEXT_LINK_SELECTED
"hyperlink start index changed", // EVENT_HYPERLINK_START_INDEX_CHANGED
"hypertext changed", // EVENT_HYPERTEXT_CHANGED
"hypertext links count changed", // EVENT_HYPERTEXT_NLINKS_CHANGED
"object attribute changed", // EVENT_OBJECT_ATTRIBUTE_CHANGED
"internal load" // EVENT_INTERNAL_LOAD
};
#endif /* __nsIAccessibilityService_h__ */

View File

@ -51,6 +51,7 @@ REQUIRES = content \
dom \
editor \
gfx \
thebes \
intl \
locale \
string \

View File

@ -50,6 +50,7 @@ REQUIRES = content \
dom \
editor \
gfx \
thebes \
htmlparser \
intl \
layout \

View File

@ -50,6 +50,7 @@ REQUIRES = content \
dom \
editor \
gfx \
thebes \
htmlparser \
intl \
layout \

View File

@ -52,6 +52,7 @@ REQUIRES = content \
dom \
editor \
gfx \
thebes \
intl \
layout \
locale \

View File

@ -52,6 +52,7 @@ REQUIRES = content \
dom \
editor \
gfx \
thebes \
intl \
layout \
locale \

View File

@ -657,23 +657,21 @@ void nsXULMenupopupAccessible::GenerateMenu(nsIDOMNode *aNode)
}
}
NS_IMETHODIMP nsXULMenupopupAccessible::GetName(nsAString& _retval)
NS_IMETHODIMP
nsXULMenupopupAccessible::GetName(nsAString& aName)
{
nsCOMPtr<nsIDOMElement> element(do_QueryInterface(mDOMNode));
NS_ASSERTION(element, "No element for popup node!");
aName.Truncate();
while (element) {
element->GetAttribute(NS_LITERAL_STRING("label"), _retval);
if (!_retval.IsEmpty())
return NS_OK;
nsCOMPtr<nsIDOMNode> parentNode, node(do_QueryInterface(element));
if (!node)
return NS_ERROR_FAILURE;
node->GetParentNode(getter_AddRefs(parentNode));
element = do_QueryInterface(parentNode);
if (!mDOMNode)
return NS_ERROR_FAILURE;
nsCOMPtr<nsIContent> content(do_QueryInterface(mDOMNode));
while (content && aName.IsEmpty()) {
content->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::label, aName);
content = content->GetParent();
}
return NS_ERROR_FAILURE;
return NS_OK;
}
NS_IMETHODIMP nsXULMenupopupAccessible::GetRole(PRUint32 *aRole)

View File

@ -721,20 +721,36 @@ nsXULTreeitemAccessible::GetAttributesInternal(nsIPersistentProperties *aAttribu
rv = view->GetLevel(mRow, &level);
NS_ENSURE_SUCCESS(rv, rv);
PRInt32 lvl = -1;
PRInt32 startIndex = mRow;
for (;startIndex - 1 > 0 &&
NS_SUCCEEDED(view->GetLevel(startIndex - 1, &lvl)) && lvl != level;
startIndex--);
PRInt32 topCount = 1;
for (PRInt32 index = mRow - 1; index >= 0; index--) {
PRInt32 lvl = -1;
if (NS_SUCCEEDED(view->GetLevel(index, &lvl))) {
if (lvl < level)
break;
lvl = -1;
PRInt32 endIndex = mRow;
for (;endIndex - 1 > 0 &&
NS_SUCCEEDED(view->GetLevel(endIndex - 1, &lvl)) && lvl != level;
endIndex--);
if (lvl == level)
topCount++;
}
}
PRInt32 setSize = endIndex - startIndex + 1;
PRInt32 posInSet = mRow - startIndex + 1;
PRInt32 rowCount = 0;
rv = view->GetRowCount(&rowCount);
NS_ENSURE_SUCCESS(rv, rv);
PRInt32 bottomCount = 0;
for (PRInt32 index = mRow + 1; index < rowCount; index++) {
PRInt32 lvl = -1;
if (NS_SUCCEEDED(view->GetLevel(index, &lvl))) {
if (lvl < level)
break;
if (lvl == level)
bottomCount++;
}
}
PRInt32 setSize = topCount + bottomCount;
PRInt32 posInSet = topCount;
// set the group attributes
nsAccUtils::SetAccGroupAttrs(aAttributes, level + 1, posInSet, setSize);

View File

@ -305,9 +305,10 @@ pref("javascript.options.showInConsole", false);
pref("dom.disable_window_open_feature.status", true);
// This is the pref to control the location bar, change this to true to
// force this instead of or in addition to the status bar - this makes
// the origin of popup windows more obvious to avoid spoofing but we
// cannot do it by default because it affects UE for web applications.
pref("dom.disable_window_open_feature.location", false);
// the origin of popup windows more obvious to avoid spoofing. We would
// rather not do it by default because it affects UE for web applications, but
// without it there isn't a really good way to prevent chrome spoofing, see bug 337344
pref("dom.disable_window_open_feature.location", true);
pref("dom.disable_window_status_change", true);
// allow JS to move and resize existing windows
pref("dom.disable_window_move_resize", false);

View File

@ -58,10 +58,7 @@ var PlacesCommandHook = {
if (aEvent.originalTarget != this.panel)
return;
// This only happens for auto-hide. When the panel is closed from within
// itself, doneCallback removes the listener and only then hides the popup
gAddBookmarksPanel.saveItem();
gAddBookmarksPanel.uninitPanel();
gEditItemOverlay.uninitPanel(true);
},
_overlayLoaded: false,
@ -96,23 +93,15 @@ var PlacesCommandHook = {
this._overlayLoading = true;
document.loadOverlay("chrome://browser/content/places/editBookmarkOverlay.xul",
loadObserver);
this.panel.addEventListener("popuphiding", this, false);
},
_doShowEditBookmarkPanel:
function PCH__doShowEditBookmarkPanel(aItemId, aAnchorElement, aPosition) {
var panel = this.panel;
panel.openPopup(aAnchorElement, aPosition, -1, -1);
this.panel.openPopup(aAnchorElement, aPosition, -1, -1);
gAddBookmarksPanel.initPanel(aItemId, PlacesUtils.tm, this.doneCallback,
{ hiddenRows: "description" });
panel.addEventListener("popuphiding", this, false);
},
doneCallback: function PCH_doneCallback(aSavedChanges) {
var panel = PlacesCommandHook.panel;
panel.removeEventListener("popuphiding", PlacesCommandHook, false);
gAddBookmarksPanel.uninitPanel();
panel.hidePopup();
gEditItemOverlay.initPanel(aItemId,
{ hiddenRows: ["description", "location"] });
},
/**
@ -289,6 +278,19 @@ var PlacesCommandHook = {
organizer.focus();
}
},
doneButtonOnCommand: function PCH_doneButtonOnCommand() {
this.panel.hidePopup();
},
deleteButtonOnCommand: function PCH_deleteButtonCommand() {
PlacesUtils.bookmarks.removeItem(gEditItemOverlay.itemId);
// remove all tags for the associated url
PlacesUtils.tagging.untagURI(gEditItemOverlay._uri, null);
this.panel.hidePopup();
}
};

View File

@ -28,3 +28,42 @@ menuitem.spell-suggestion {
window[sizemode="maximized"] #content .notification-inner {
border-right: 0px !important;
}
tabbrowser {
-moz-binding: url("chrome://browser/content/tabbrowser.xml#tabbrowser");
}
.tabbrowser-tabs {
-moz-binding: url("chrome://browser/content/tabbrowser.xml#tabbrowser-tabs");
}
.tabbrowser-arrowscrollbox {
-moz-binding: url("chrome://browser/content/tabbrowser.xml#tabbrowser-arrowscrollbox");
}
.tabs-alltabs-popup {
-moz-binding: url("chrome://browser/content/tabbrowser.xml#tabbrowser-alltabs-popup");
}
.tabbrowser-tabs > .tabbrowser-tab {
-moz-binding: url("chrome://browser/content/tabbrowser.xml#tabbrowser-tab");
}
.tabbrowser-tabs > .tabbrowser-tab > .tab-close-button,
.tabbrowser-tabs .tabs-closebutton-box > .tabs-closebutton {
-moz-binding: url("chrome://browser/content/tabbrowser.xml#tabbrowser-close-tab-button");
}
.tab-close-button {
display: none;
}
.tabbrowser-tabs:not([closebuttons="noclose"]):not([closebuttons="closeatend"]) > .tabbrowser-tab[selected="true"] > .tab-close-button {
display: -moz-box;
}
.tabbrowser-tabs[closebuttons="alltabs"] > .tabbrowser-tab > .tab-close-button {
display: -moz-box;
}

View File

@ -99,6 +99,7 @@ var gProgressCollapseTimer = null;
var gPrefService = null;
var appCore = null;
var gBrowser = null;
var gNavToolbox = null;
var gSidebarCommand = "";
// Global variable that holds the nsContextMenu instance.
@ -1029,8 +1030,7 @@ function delayedStartup()
SetPageProxyState("invalid");
var toolbox = document.getElementById("navigator-toolbox");
toolbox.customizeDone = BrowserToolboxCustomizeDone;
getNavToolbox().customizeDone = BrowserToolboxCustomizeDone;
// Set up Sanitize Item
gSanitizeListener = new SanitizeListener();
@ -1114,6 +1114,25 @@ function delayedStartup()
Components.utils.reportError("Failed to init content pref service:\n" + ex);
}
#ifdef XP_WIN
// For Vista, flip the default download folder pref once from Desktop to Downloads
// on new profiles.
try {
var sysInfo = Cc["@mozilla.org/system-info;1"].
getService(Ci.nsIPropertyBag2);
if (parseFloat(sysInfo.getProperty("version")) >= 6 &&
!gPrefService.getPrefType("browser.download.dir") &&
gPrefService.getIntPref("browser.download.folderList") == 0) {
var dnldMgr = Cc["@mozilla.org/download-manager;1"]
.getService(Ci.nsIDownloadManager);
gPrefService.setCharPref("browser.download.dir",
dnldMgr.defaultDownloadsDirectory.path);
gPrefService.setIntPref("browser.download.folderList", 1);
}
} catch (ex) {
}
#endif
// initialize the session-restore service (in case it's not already running)
if (document.documentElement.getAttribute("windowtype") == "navigator:browser") {
try {
@ -2260,13 +2279,13 @@ function toggleAffectedChrome(aHide)
// (*) menubar
// (*) navigation bar
// (*) bookmarks toolbar
// (*) tabstrip
// (*) browser messages
// (*) sidebar
// (*) find bar
// (*) statusbar
var navToolbox = document.getElementById("navigator-toolbox");
navToolbox.hidden = aHide;
getNavToolbox().hidden = aHide;
if (aHide)
{
gChromeState = {};
@ -2274,6 +2293,9 @@ function toggleAffectedChrome(aHide)
gChromeState.sidebarOpen = !sidebar.hidden;
gSidebarCommand = sidebar.getAttribute("sidebarcommand");
gChromeState.hadTabStrip = gBrowser.getStripVisibility();
gBrowser.setStripVisibilityTo(false);
var notificationBox = gBrowser.getNotificationBox();
gChromeState.notificationsOpen = !notificationBox.notificationsHidden;
notificationBox.notificationsHidden = aHide;
@ -2286,6 +2308,10 @@ function toggleAffectedChrome(aHide)
gFindBar.close();
}
else {
if (gChromeState.hadTabStrip) {
gBrowser.setStripVisibilityTo(true);
}
if (gChromeState.notificationsOpen) {
gBrowser.getNotificationBox().notificationsHidden = aHide;
}
@ -2314,6 +2340,11 @@ function onExitPrintPreview()
toggleAffectedChrome(false);
}
function getPPBrowser()
{
return getBrowser();
}
function getMarkupDocumentViewer()
{
return gBrowser.markupDocumentViewer;
@ -3030,7 +3061,7 @@ function BrowserCustomizeToolbar()
window.openDialog("chrome://global/content/customizeToolbar.xul",
"CustomizeToolbar",
"chrome,all,dependent",
document.getElementById("navigator-toolbox"));
getNavToolbox());
#endif
}
@ -3154,7 +3185,7 @@ var FullScreen =
}
}
var toolbox = document.getElementById("navigator-toolbox");
var toolbox = getNavToolbox();
if (aShow)
toolbox.removeAttribute("inFullscreen");
else
@ -3853,7 +3884,7 @@ function onViewToolbarsPopupShowing(aEvent)
var firstMenuItem = popup.firstChild;
var toolbox = document.getElementById("navigator-toolbox");
var toolbox = getNavToolbox();
for (i = 0; i < toolbox.childNodes.length; ++i) {
var toolbar = toolbox.childNodes[i];
var toolbarName = toolbar.getAttribute("toolbarname");
@ -3875,7 +3906,7 @@ function onViewToolbarsPopupShowing(aEvent)
function onViewToolbarCommand(aEvent)
{
var toolbox = document.getElementById("navigator-toolbox");
var toolbox = getNavToolbox();
var index = aEvent.originalTarget.getAttribute("toolbarindex");
var toolbar = toolbox.childNodes[index];
@ -4367,7 +4398,6 @@ var contentAreaDNDObserver = {
};
// For extensions
function getBrowser()
{
if (!gBrowser)
@ -4375,6 +4405,13 @@ function getBrowser()
return gBrowser;
}
function getNavToolbox()
{
if (!gNavToolbox)
gNavToolbox = document.getElementById("navigator-toolbox");
return gNavToolbox;
}
function MultiplexHandler(event)
{ try {
var node = event.target;

View File

@ -75,7 +75,7 @@
# so that they can be shared by macBrowserOverlay.xul.
#include global-scripts.inc
<script type="application/x-javascript" src="chrome://browser/content/nsContextMenu.js"/>
#ifdef MOZ_SAFE_BROWSING
<script type="application/x-javascript" src="chrome://browser/content/safebrowsing/sb-loader.js"/>
#endif
@ -100,8 +100,16 @@
<panel type="autocomplete" chromedir="&locale.dir;" id="PopupAutoComplete" noautofocus="true"/>
<panel id="editBookmarkPanel">
<panel id="editBookmarkPanel" orient="vertical">
<vbox id="editBookmarkPanelContent" flex="1"/>
<hbox flex="1">
<spacer flex="1"/>
<button label="&editBookmark.delete.label;"
oncommand="PlacesCommandHook.deleteButtonOnCommand();"/>
<button label="&editBookmark.done.label;"
default="true"
oncommand="PlacesCommandHook.doneButtonOnCommand();"/>
</hbox>
</panel>
<popup id="toolbar-context-menu"

View File

@ -319,10 +319,7 @@ function realmHasPasswords(location) {
var realm = makeURI(location).prePath;
var passwordManager = Components.classes["@mozilla.org/login-manager;1"]
.getService(Components.interfaces.nsILoginManager);
var passwords = passwordManager.getAllLogins({});
// XXX untested
return passwords.some(function (login) { return (login.hostname == realm); });
return passwordManager.countLogins(realm, "", "");
}
/**

File diff suppressed because it is too large Load Diff

View File

@ -37,6 +37,7 @@ browser.jar:
* content/browser/safeMode.js (content/safeMode.js)
* content/browser/safeMode.xul (content/safeMode.xul)
* content/browser/sanitize.js (content/sanitize.js)
* content/browser/tabbrowser.xml (content/tabbrowser.xml)
* content/browser/sanitize.xul (content/sanitize.xul)
* content/browser/urlbarBindings.xml (content/urlbarBindings.xml)
* content/browser/utilityOverlay.js (content/utilityOverlay.js)

View File

@ -314,7 +314,7 @@ nsOperaProfileMigrator::GetSourceHomePageURL(nsACString& aResult)
static
nsOperaProfileMigrator::PrefTransform gTransforms[] = {
{ "User Prefs", "Download Directory", _OPM(STRING), "browser.download.defaultFolder", _OPM(SetFile), PR_FALSE, -1 },
{ "User Prefs", "Download Directory", _OPM(STRING), "browser.download.dir", _OPM(SetFile), PR_FALSE, -1 },
{ nsnull, "Enable Cookies", _OPM(INT), "network.cookie.cookieBehavior", _OPM(SetCookieBehavior), PR_FALSE, -1 },
{ nsnull, "Accept Cookies Session Only", _OPM(BOOL), "network.cookie.enableForCurrentSessionOnly", _OPM(SetBool), PR_FALSE, -1 },
{ nsnull, "Allow script to resize window", _OPM(BOOL), "dom.disable_window_move_resize", _OPM(SetBool), PR_FALSE, -1 },

View File

@ -516,7 +516,7 @@ nsSafariProfileMigrator::SetDownloadFolder(void* aTransform, nsIPrefBranch* aBra
PRBool equals;
downloadFolder->Equals(desktopFolder, &equals);
aBranch->SetIntPref("browser.download.folderList", equals ? 0 : 2);
aBranch->SetComplexValue("browser.download.defaultFolder",
aBranch->SetComplexValue("browser.download.dir",
NS_GET_IID(nsILocalFile), downloadFolder);
return NS_OK;

View File

@ -221,12 +221,12 @@ function getMostRecentBrowserWindow() {
var win = wm.getMostRecentWindow("navigator:browser", true);
// if we're lucky, this isn't a popup, and we can just return this
if (win && !win.toolbar.visible) {
if (win && win.document.documentElement.getAttribute("chromehidden")) {
var windowList = wm.getEnumerator("navigator:browser", true);
// this is oldest to newest, so this gets a bit ugly
while (windowList.hasMoreElements()) {
var nextWin = windowList.getNext();
if (nextWin.toolbar.visible)
if (!nextWin.document.documentElement.getAttribute("chromehidden"))
win = nextWin;
}
}
@ -236,7 +236,7 @@ function getMostRecentBrowserWindow() {
return null;
var win = windowList.getNext();
while (!win.toolbar.visible) {
while (win.document.documentElement.getAttribute("chromehidden")) {
if (!windowList.hasMoreElements())
return null;

View File

@ -36,9 +36,10 @@
* ***** END LICENSE BLOCK ***** */
const LAST_USED_ANNO = "bookmarkPropertiesDialog/lastUsed";
const STATIC_TITLE_ANNO = "bookmarks/staticTitle";
const MAX_FOLDER_ITEM_IN_MENU_LIST = 5;
var gAddBookmarksPanel = {
var gEditItemOverlay = {
/**
* The Microsummary Service for displaying microsummaries.
*/
@ -55,20 +56,17 @@ var gAddBookmarksPanel = {
_itemType: -1,
_microsummaries: null,
_doneCallback: null,
_currentTags: [],
_hiddenRows: [],
_observersAdded: false,
get itemId() {
return this._itemId;
},
/**
* Determines the initial data for the item edited or added by this dialog
*/
_determineInfo: function ABP__determineInfo(aInfo) {
const bms = PlacesUtils.bookmarks;
this._itemType = bms.getItemType(this._itemId);
if (this._itemType == Ci.nsINavBookmarksService.TYPE_BOOKMARK)
this._currentTags = PlacesUtils.tagging.getTagsForURI(this._uri);
else
this._currentTags.splice(0);
_determineInfo: function EIO__determineInfo(aInfo) {
// hidden rows
if (aInfo && aInfo.hiddenRows)
this._hiddenRows = aInfo.hiddenRows;
@ -76,42 +74,56 @@ var gAddBookmarksPanel = {
this._hiddenRows.splice(0);
},
_showHideRows: function EBP__showHideRows() {
_showHideRows: function EIO__showHideRows() {
var isBookmark = this._itemType == Ci.nsINavBookmarksService.TYPE_BOOKMARK;
this._element("nameRow").hidden = this._hiddenRows.indexOf("name") != -1;
this._element("folderRow").hidden =
this._hiddenRows.indexOf("folderPicker") != -1;
this._element("tagsRow").hidden = this._hiddenRows.indexOf("tags") != -1 ||
this._itemType != Ci.nsINavBookmarksService.TYPE_BOOKMARK;
this._element("tagsRow").hidden =
this._hiddenRows.indexOf("tags") != -1 || !isBookmark;
this._element("descriptionRow").hidden =
this._hiddenRows.indexOf("description") != -1;
this._element("locationRow").hidden =
this._hiddenRows.indexOf("location") != -1 || !isBookmark;
},
/**
* Initialize the panel
*/
initPanel: function ABP_initPanel(aItemId, aTm, aDoneCallback, aInfo) {
initPanel: function EIO_initPanel(aItemId, aInfo) {
this._folderMenuList = this._element("folderMenuList");
this._folderTree = this._element("folderTree");
this._tm = aTm;
this._itemId = aItemId;
this._uri = PlacesUtils.bookmarks.getBookmarkURI(this._itemId);
this._doneCallback = aDoneCallback;
this._itemType = PlacesUtils.bookmarks.getItemType(this._itemId);
this._determineInfo(aInfo);
if (this._itemType == Ci.nsINavBookmarksService.TYPE_BOOKMARK) {
this._uri = PlacesUtils.bookmarks.getBookmarkURI(this._itemId);
// tags field
this._element("tagsField").value =
PlacesUtils.tagging.getTagsForURI(this._uri).join(", ");
this._element("locationField").value = this._uri.spec;
}
// folder picker
this._initFolderMenuList();
// name picker
this._initNamePicker();
// tags field
this._element("tagsField").value = this._currentTags.join(", ");
// description field
this._element("descriptionField").value =
PlacesUtils.getItemDescription(this._itemId);
this._showHideRows();
// observe changes
if (!this._observersAdded) {
PlacesUtils.bookmarks.addObserver(this, false);
window.addEventListener("unload", this, false);
this._observersAdded = true;
}
},
/**
@ -123,7 +135,7 @@ var gAddBookmarksPanel = {
* @return the new menu item.
*/
_appendFolderItemToMenupopup:
function BPP__appendFolderItemToMenuList(aMenupopup, aFolderId) {
function EIO__appendFolderItemToMenuList(aMenupopup, aFolderId) {
// First make sure the folders-separator is visible
this._element("foldersSeparator").hidden = false;
@ -136,7 +148,7 @@ var gAddBookmarksPanel = {
return folderMenuItem;
},
_initFolderMenuList: function BPP__initFolderMenuList() {
_initFolderMenuList: function EIO__initFolderMenuList() {
// clean up first
var menupopup = this._folderMenuList.menupopup;
while (menupopup.childNodes.length > 4)
@ -184,21 +196,22 @@ var gAddBookmarksPanel = {
this._element("foldersSeparator").hidden = (menupopup.childNodes.length <= 4);
},
QueryInterface: function BPP_QueryInterface(aIID) {
QueryInterface: function EIO_QueryInterface(aIID) {
if (aIID.equals(Ci.nsIMicrosummaryObserver) ||
aIID.equals(Ci.nsIDOMEventListener) ||
aIID.equals(Ci.nsINavBookmarkObserver) ||
aIID.eqauls(Ci.nsISupports))
return this;
throw Cr.NS_ERROR_NO_INTERFACE;
},
_element: function BPP__element(aID) {
_element: function EIO__element(aID) {
return document.getElementById("editBMPanel_" + aID);
},
_createMicrosummaryMenuItem:
function BPP__createMicrosummaryMenuItem(aMicrosummary) {
function EIO__createMicrosummaryMenuItem(aMicrosummary) {
var menuItem = document.createElement("menuitem");
// Store a reference to the microsummary in the menu item, so we know
@ -226,22 +239,34 @@ var gAddBookmarksPanel = {
return menuItem;
},
_initNamePicker: function ABP_initNamePicker() {
_getItemStaticTitle: function EIO__getItemStaticTitle() {
const annos = PlacesUtils.annotations;
if (annos.itemHasAnnotation(this._itemId, STATIC_TITLE_ANNO))
return annos.getItemAnnotation(this._itemId, STATIC_TITLE_ANNO);
return PlacesUtils.bookmarks.getItemTitle(this._itemId);
},
_initNamePicker: function EIO_initNamePicker() {
var userEnteredNameField = this._element("userEnteredName");
var namePicker = this._element("namePicker");
var droppable = false;
userEnteredNameField.label =
PlacesUtils.bookmarks.getItemTitle(this._itemId);
userEnteredNameField.label = this._getItemStaticTitle();
// clean up old entries
var menupopup = namePicker.menupopup;
while (menupopup.childNodes.length > 2)
menupopup.removeChild(menupopup.lastChild);
if (this._microsummaries) {
this._microsummaries.removeObserver(this);
this._microsummaries = null;
}
var itemToSelect = userEnteredNameField;
try {
this._microsummaries = this._mss.getMicrosummaries(this._uri, -1);
if (this._itemType == Ci.nsINavBookmarksService.TYPE_BOOKMARK)
this._microsummaries = this._mss.getMicrosummaries(this._uri, -1);
}
catch(ex) {
// getMicrosummaries will throw an exception in at least two cases:
@ -262,6 +287,9 @@ var gAddBookmarksPanel = {
var microsummary = enumerator.getNext()
.QueryInterface(Ci.nsIMicrosummary);
var menuItem = this._createMicrosummaryMenuItem(microsummary);
if (this._mss.isMicrosummary(this._itemId, microsummary))
itemToSelect = menuItem;
menupopup.appendChild(menuItem);
}
}
@ -278,7 +306,7 @@ var gAddBookmarksPanel = {
},
// nsIMicrosummaryObserver
onContentLoaded: function ABP_onContentLoaded(aMicrosummary) {
onContentLoaded: function EIO_onContentLoaded(aMicrosummary) {
var namePicker = this._element("namePicker");
var childNodes = namePicker.menupopup.childNodes;
@ -302,7 +330,7 @@ var gAddBookmarksPanel = {
}
},
onElementAppended: function BPP_onElementAppended(aMicrosummary) {
onElementAppended: function EIO_onElementAppended(aMicrosummary) {
var namePicker = this._element("namePicker");
namePicker.menupopup
.appendChild(this._createMicrosummaryMenuItem(aMicrosummary));
@ -311,52 +339,46 @@ var gAddBookmarksPanel = {
namePicker.setAttribute("droppable", "true");
},
uninitPanel: function ABP_uninitPanel() {
if (this._microsummaries)
uninitPanel: function EIO_uninitPanel(aHideCollapsibleElements) {
if (aHideCollapsibleElements) {
// hide the folder tree if it was previously visible
if (!this._folderTree.collapsed)
this.toggleFolderTreeVisibility();
// hide the tag selector if it was previously visible
var tagsSelector = this._element("tagsSelector");
if (!tagsSelector.collapsed)
tagsSelector.collapsed = true;
}
if (this._observersAdded) {
PlacesUtils.bookmarks.removeObserver(this);
this._observersAdded = false;
}
if (this._microsummaries) {
this._microsummaries.removeObserver(this);
// hide the folder tree if it was previously visible
if (!this._folderTree.collapsed)
this.toggleFolderTreeVisibility();
// hide the tag selector if it was previously visible
var tagsSelector = this._element("tagsSelector");
if (!tagsSelector.collapsed)
tagsSelector.collapsed = true;
this._microsummaries = null;
}
this._itemId = -1;
},
saveItem: function ABP_saveItem() {
var container = this._getFolderIdFromMenuList();
const bms = PlacesUtils.bookmarks;
const ptm = PlacesUtils.ptm;
var txns = [];
onTagsFieldBlur: function EIO_onTagsFieldBlur() {
this._updateTags();
},
// container
if (bms.getFolderIdForItem(this._itemId) != container)
txns.push(ptm.moveItem(this._itemId, container, -1));
// title
var newTitle = this._element("userEnteredName").label;
if (bms.getItemTitle(this._itemId) != newTitle)
txns.push(ptm.editItemTitle(this._itemId, newTitle));
// description
var newDescription = this._element("descriptionField").value;
if (newDescription != PlacesUtils.getItemDescription(this._itemId))
txns.push(ptm.editItemDescription(this._itemId, newDescription));
// Tags, NOT YET UNDOABLE
_updateTags: function EIO__updateTags() {
var currentTags = PlacesUtils.tagging.getTagsForURI(this._uri);
var tags = this._getTagsArrayFromTagField();
if (tags.length > 0 || this._currentTags.length > 0) {
if (tags.length > 0 || currentTags.length > 0) {
var tagsToRemove = [];
var tagsToAdd = [];
var t;
for each (t in this._currentTags) {
for each (t in currentTags) {
if (tags.indexOf(t) == -1)
tagsToRemove.push(t);
}
for each (t in tags) {
if (this._currentTags.indexOf(t) == -1)
if (currentTags.indexOf(t) == -1)
tagsToAdd.push(t);
}
@ -365,23 +387,75 @@ var gAddBookmarksPanel = {
if (tagsToRemove.length > 0)
PlacesUtils.tagging.untagURI(this._uri, tagsToRemove);
}
},
if (txns.length > 0) {
// Mark the containing folder as recently-used if it isn't the
// "All Bookmarks" root
if (container != PlacesUtils.placesRootId)
this._markFolderAsRecentlyUsed(container);
onNamePickerInput: function EIO_onNamePickerInput() {
var title = this._element("namePicker").value;
this._element("userEnteredName").label = title;
},
onNamePickerChange: function EIO_onNamePickerChange() {
var namePicker = this._element("namePicker")
var txns = [];
const ptm = PlacesUtils.ptm;
// Here we update either the item title or its cached static title
var newTitle = this._element("userEnteredName").label;
if (this._getItemStaticTitle() != newTitle) {
if (PlacesUtils.microsummaries.hasMicrosummary(this._itemId)) {
// Note: this implicitly also takes care of the microsummary->static
// title case, the removeMicorosummary method in the service will set
// the item-title to the value of this annotation.
//
// XXXmano: use a transaction
PlacesUtils.setAnnotationsForItem(this._itemId,
[{name: STATIC_TITLE_ANNO,
value: newTitle}]);
}
else
txns.push(ptm.editItemTitle(this._itemId, newTitle));
}
if (txns.length > 0)
ptm.commitTransaction(ptm.aggregateTransactions("Edit Item", txns));
var newMicrosummary = namePicker.selectedItem.microsummary;
// Only add a microsummary update to the transaction if the microsummary
// has actually changed, i.e. the user selected no microsummary, but the
// bookmark previously had one, or the user selected a microsummary which
// is not the one the bookmark previously had
if ((newMicrosummary == null && this._mss.hasMicrosummary(this._itemId)) ||
(newMicrosummary != null &&
!this._mss.isMicrosummary(this._itemId, newMicrosummary))) {
txns.push(ptm.editBookmarkMicrosummary(this._itemId, newMicrosummary));
}
var aggregate = ptm.aggregateTransactions("Edit Item Title", txns);
ptm.commitTransaction(aggregate);
},
onNamePickerInput: function ABP_onNamePickerInput() {
this._element("userEnteredName").label = this._element("namePicker").value;
onDescriptionFieldBlur: function EIO_onDescriptionFieldInput() {
var description = this._element("descriptionField").value;
if (description != PlacesUtils.getItemDescription(this._itemId)) {
var txn = PlacesUtils.ptm
.editItemDescription(this._itemId, description);
PlacesUtils.ptm.commitTransaction(txn);
}
},
toggleFolderTreeVisibility: function ABP_toggleFolderTreeVisibility() {
onLocationFieldBlur: function EIO_onLocationFieldBlur() {
// XXXmano: uri fixup
var uri;
try {
uri = IO.newURI(this._element("locationField").value);
}
catch(ex) { return; }
if (!this._uri.equals(uri)) {
var txn = PlacesUtils.ptm.editBookmarkURI(this._itemId, uri);
PlacesUtils.ptm.commitTransaction(txn);
}
},
toggleFolderTreeVisibility: function EIO_toggleFolderTreeVisibility() {
var expander = this._element("foldersExpander");
if (!this._folderTree.collapsed) {
expander.className = "expander-down";
@ -402,7 +476,7 @@ var gAddBookmarksPanel = {
},
_getFolderIdFromMenuList:
function BPP__getFolderIdFromMenuList() {
function EIO__getFolderIdFromMenuList() {
var selectedItem = this._folderMenuList.selectedItem
switch (selectedItem.id) {
case "editBMPanel_placesRootItem":
@ -431,7 +505,7 @@ var gAddBookmarksPanel = {
* true.
*/
_getFolderMenuItem:
function BPP__getFolderMenuItem(aFolderId, aCheckStaticFolderItems) {
function EIO__getFolderMenuItem(aFolderId, aCheckStaticFolderItems) {
var menupopup = this._folderMenuList.menupopup;
// 0: All Bookmarks, 1: Bookmarks root, 2: toolbar folder, 3: separator
@ -444,9 +518,9 @@ var gAddBookmarksPanel = {
if (aFolderId == PlacesUtils.placesRootId)
return this._element("placesRootItem");
if (aFolderId == PlacesUtils.bookmarksRootId)
return this._element("bmRootItem")
return this._element("bmRootItem");
if (aFolderId == PlacesUtils.toolbarFolderId)
return this._element("toolbarFolderItem")
return this._element("toolbarFolderItem");
}
// 3 special folders + separator + folder-items-count limit
@ -456,14 +530,29 @@ var gAddBookmarksPanel = {
return this._appendFolderItemToMenupopup(menupopup, aFolderId);
},
onMenuListFolderSelect: function BPP_onMenuListFolderSelect(aEvent) {
if (this._folderTree.hidden)
return;
onFolderMenuListCommand: function EIO_onFolderMenuListCommand(aEvent) {
var container = this._getFolderIdFromMenuList();
this._folderTree.selectFolders([this._getFolderIdFromMenuList()]);
// Move the item
if (PlacesUtils.bookmarks.getFolderIdForItem(this._itemId) != container) {
var txn = PlacesUtils.ptm.moveItem(this._itemId, container, -1);
PlacesUtils.ptm.commitTransaction(txn);
// Mark the containing folder as recently-used if it isn't the
// "All Bookmarks" root
if (container != PlacesUtils.placesRootId)
this._markFolderAsRecentlyUsed(container);
}
// Update folder-tree selection
if (isElementVisible(this._folderTree)) {
var selectedNode = this._folderTree.selectedNode;
if (selectedNode.itemId != container)
this._folderTree.selectFolders([container]);
}
},
onFolderTreeSelect: function BPP_onFolderTreeSelect() {
onFolderTreeSelect: function EIO_onFolderTreeSelect() {
var selectedNode = this._folderTree.selectedNode;
if (!selectedNode)
return;
@ -473,17 +562,18 @@ var gAddBookmarksPanel = {
// already selected
var oldSelectedItem = this._folderMenuList.selectedItem;
if ((oldSelectedItem.id == "editBMPanel_toolbarFolderItem" &&
folderId == PlacesUtils.bookmarks.toolbarFolder) ||
folderId == PlacesUtils.toolbarFolderId) ||
(oldSelectedItem.id == "editBMPanel_bmRootItem" &&
folderId == PlacesUtils.bookmarks.bookmarksRoot))
folderId == PlacesUtils.bookmarksRootId))
return;
var folderItem = this._getFolderMenuItem(folderId, false);
this._folderMenuList.selectedItem = folderItem;
folderItem.doCommand();
},
_markFolderAsRecentlyUsed:
function ABP__markFolderAsRecentlyUsed(aFolderId) {
function EIO__markFolderAsRecentlyUsed(aFolderId) {
// We'll figure out when/if to expire the annotation if it turns out
// we keep this recently-used-folders implementation
PlacesUtils.annotations
@ -492,47 +582,34 @@ var gAddBookmarksPanel = {
Ci.nsIAnnotationService.EXPIRE_NEVER);
},
accept: function ABP_accept() {
this.saveItem();
if (typeof(this._doneCallback) == "function")
this._doneCallback();
_rebuildTagsSelectorList: function EIO__rebuildTagsSelectorList() {
var tagsSelector = this._element("tagsSelector");
while (tagsSelector.hasChildNodes())
tagsSelector.removeChild(tagsSelector.lastChild);
var tagsInField = this._getTagsArrayFromTagField();
var allTags = PlacesUtils.tagging.allTags;
for each (var tag in allTags) {
var elt = document.createElement("listitem");
elt.setAttribute("type", "checkbox");
elt.setAttribute("label", tag);
if (tagsInField.indexOf(tag) != -1)
elt.setAttribute("checked", "true");
tagsSelector.appendChild(elt);
}
},
deleteAndClose: function ABP_deleteAndClose() {
// remove the item
if (this._itemId != -1)
PlacesUtils.bookmarks.removeItem(this._itemId);
// remove all tags for the associated url
PlacesUtils.tagging.untagURI(this._uri, null);
if (typeof(this._doneCallback) == "function")
this._doneCallback();
},
toggleTagsSelector: function ABP_toggleTagsSelector() {
toggleTagsSelector: function EIO_toggleTagsSelector() {
var tagsSelector = this._element("tagsSelector");
var expander = this._element("tagsSelectorExpander");
if (tagsSelector.collapsed) {
if (!isElementVisible(tagsSelector)) {
expander.className = "expander-down";
expander.setAttribute("tooltiptext",
expander.getAttribute("tooltiptextdown"));
// rebuild the tag list
while (tagsSelector.hasChildNodes())
tagsSelector.removeChild(tagsSelector.lastChild);
var tagsInField = this._getTagsArrayFromTagField();
var allTags = PlacesUtils.tagging.allTags;
for each (var tag in allTags) {
var elt = document.createElement("listitem");
elt.setAttribute("type", "checkbox");
elt.setAttribute("label", tag);
if (tagsInField.indexOf(tag) != -1)
elt.setAttribute("checked", "true");
tagsSelector.appendChild(elt);
}
this._rebuildTagsSelectorList();
// This is a no-op if we've added the listener.
tagsSelector.addEventListener("CheckboxStateChange", this, false);
@ -546,7 +623,7 @@ var gAddBookmarksPanel = {
tagsSelector.collapsed = !tagsSelector.collapsed;
},
_getTagsArrayFromTagField: function() {
_getTagsArrayFromTagField: function EIO__getTagsArrayFromTagField() {
// we don't require the leading space (after each comma)
var tags = this._element("tagsField").value.split(",");
for (var i=0; i < tags.length; i++) {
@ -563,8 +640,9 @@ var gAddBookmarksPanel = {
},
// nsIDOMEventListener
handleEvent: function ABP_nsIDOMEventListener(aEvent) {
if (aEvent.type == "CheckboxStateChange") {
handleEvent: function EIO_nsIDOMEventListener(aEvent) {
switch (aEvent.type) {
case "CheckboxStateChange":
// Update the tags field when items are checked/unchecked in the listbox
var tags = this._getTagsArrayFromTagField();
@ -576,6 +654,68 @@ var gAddBookmarksPanel = {
tags.splice(indexOfItem, 1);
}
this._element("tagsField").value = tags.join(", ");
this._updateTags();
break;
case "unload":
this.uninitPanel(false);
break;
}
}
},
// nsINavBookmarkObserver
onItemChanged: function EIO_onItemChanged(aItemId, aProperty,
aIsAnnotationProperty, aValue) {
if (this._itemId != aItemId)
return;
switch (aProperty) {
case "title":
if (PlacesUtils.annotations.itemHasAnnotation(this._itemId,
STATIC_TITLE_ANNO))
return; // onContentLoaded updates microsummary-items
var userEnteredNameField = this._element("userEnteredName");
if (userEnteredNameField.value != aValue) {
userEnteredNameField.value = aValue;
var namePicker = this._element("namePicker");
if (namePicker.selectedItem == userEnteredNameField)
namePicker.label = aValue;
}
break;
case "uri":
var locationField = this._element("locationField");
if (locationField.value != aValue) {
locationField.value = aValue;
this._uri = IO.newURI(aValue);
this._initNamePicker(); // for microsummaries
this._element("tagsField").value =
PlacesUtils.tagging.getTagsForURI(this._uri).join(", ");
this._rebuildTagsSelectorList();
}
break;
case DESCRIPTION_ANNO:
this._element("descriptionField").value =
PlacesUtils.annotations.getItemDescription(this._itemId);
break;
}
},
onItemMoved: function EIO_onItemMoved(aItemId, aOldParent, aOldIndex,
aNewParent, aNewIndex) {
if (aItemId != this._itemId ||
aNewParent == this._getFolderIdFromMenuList())
return;
var folderItem = this._getFolderMenuItem(aNewParent, false);
// just setting selectItem _does not_ trigger oncommand, so we don't
// recurse
this._folderMenuList.selectedItem = folderItem;
},
onBeginUpdateBatch: function() { },
onEndUpdateBatch: function() { },
onItemAdded: function() { },
onItemRemoved: function() { },
onItemVisited: function() { },
};

View File

@ -62,7 +62,9 @@
flex="1"
editable="true"
droppable="false"
oninput="gAddBookmarksPanel.onNamePickerInput();">
oninput="gEditItemOverlay.onNamePickerInput();"
onblur="gEditItemOverlay.onNamePickerChange();"
oncommand="gEditItemOverlay.onNamePickerChange();">
<menupopup>
<menuitem id="editBMPanel_userEnteredName"/>
<menuitem disabled="true">
@ -72,12 +74,18 @@
</menupopup>
</menulist>
</row>
<row align="center" id="editBMPanel_locationRow">
<label value="&editBookmarkOverlay.location.label;"
contorl="editBMPanel_locationField"/>
<textbox id="editBMPanel_locationField"
onblur="gEditItemOverlay.onLocationFieldBlur();"/>
</row>
<row align="center" id="editBMPanel_folderRow">
<label value="&editBookmarkOverlay.folder.label;"
control="editBMPanel_folderMenuList"/>
<menulist id="editBMPanel_folderMenuList"
class="folder-icon"
oncommand="gAddBookmarksPanel.onMenuListFolderSelect();">
oncommand="gEditItemOverlay.onFolderMenuListCommand();">
<menupopup>
<!-- Static item for special folders -->
<menuitem id="editBMPanel_placesRootItem"
@ -97,14 +105,14 @@
tooltiptext="&editBookmarkOverlay.foldersExpanderDown.tooltip;"
tooltiptextdown="&editBookmarkOverlay.foldersExpanderDown.tooltip;"
tooltiptextup="&editBookmarkOverlay.expanderUp.tooltip;"
oncommand="gAddBookmarksPanel.toggleFolderTreeVisibility();"/>
oncommand="gEditItemOverlay.toggleFolderTreeVisibility();"/>
</row>
<tree id="editBMPanel_folderTree"
class="placesTree"
type="places"
height="150"
collapsed="true"
onselect="gAddBookmarksPanel.onFolderTreeSelect();"
onselect="gEditItemOverlay.onFolderTreeSelect();"
showRoot="true"
place="place:folder=2&amp;group=3&amp;excludeItems=1&amp;excludeQueries=1&amp;excludeReadOnlyFolders=1"
hidecolumnpicker="true">
@ -116,13 +124,14 @@
<row align="center" id="editBMPanel_tagsRow">
<label value="&editBookmarkOverlay.tags.label;"
control="tagsField"/>
<textbox id="editBMPanel_tagsField"/>
<textbox id="editBMPanel_tagsField"
onblur="gEditItemOverlay.onTagsFieldBlur();"/>
<button id="editBMPanel_tagsSelectorExpander"
class="expander-down"
tooltiptext="&editBookmarkOverlay.tagsExpanderDown.tooltip;"
tooltiptextdown="&editBookmarkOverlay.tagsExpanderDown.tooltip;"
tooltiptextup="&editBookmarkOverlay.expanderUp.tooltip;"
oncommand="gAddBookmarksPanel.toggleTagsSelector();"/>
oncommand="gEditItemOverlay.toggleTagsSelector();"/>
</row>
<!-- XXX: Temporary workaround -->
@ -133,18 +142,10 @@
<row id="editBMPanel_descriptionRow" align="center">
<label value="&editBookmarkOverlay.description.label;"
control="editBMPanel_descriptionField"/>
<textbox id="editBMPanel_descriptionField"/>
<textbox id="editBMPanel_descriptionField"
onblur="gEditItemOverlay.onDescriptionFieldBlur();"/>
</row>
</rows>
</grid>
<hbox>
<spacer flex="1"/>
<button label="&editBookmarkOverlay.delete.label;"
oncommand="gAddBookmarksPanel.deleteAndClose();"/>
<button label="&editBookmarkOverlay.ok.label;"
default="true"
oncommand="gAddBookmarksPanel.accept();"/>
</hbox>
</vbox>
</overlay>

View File

@ -126,10 +126,6 @@ function searchHistory(aInput)
}
else {
switch (gHistoryGrouping) {
case "site":
resultType = NHQO.RESULTS_AS_URI;
sortingMode = NHQO.SORT_BY_TITLE_ASCENDING;
break;
case "visited":
resultType = NHQO.RESULTS_AS_URI;
sortingMode = NHQO.SORT_BY_VISITCOUNT_DESCENDING;
@ -138,10 +134,11 @@ function searchHistory(aInput)
resultType = NHQO.RESULTS_AS_URI;
sortingMode = NHQO.SORT_BY_DATE_DESCENDING;
break;
case "dayandsite":
resultType = NHQO.RESULTS_AS_VISIT;
case "dayandsite": // fall through
groups.push(NHQO.GROUP_BY_DAY);
case "site":
groups.push(NHQO.GROUP_BY_HOST);
resultType = NHQO.RESULTS_AS_VISIT;
sortingMode = NHQO.SORT_BY_TITLE_ASCENDING;
break;
default:

View File

@ -325,6 +325,24 @@ var PlacesOrganizer = {
statusText = selectedNode.uri;
}
document.getElementById("status").label = statusText;
},
onContentTreeSelect: function PO_onContentTreeSelect() {
var contentTree = document.getElementById("placeContent");
var deck = document.getElementById("infoDeck");
this.updateStatusBarForView(contentTree);
if (contentTree.hasSingleSelection) {
var selectedNode = contentTree.selectedNode;
if (selectedNode.itemId != -1 &&
!PlacesUtils.nodeIsSeparator(selectedNode)) {
gEditItemOverlay.initPanel(selectedNode.itemId,
{ hiddenRows: ["folderPicker"] });
deck.selectedIndex = 1;
return;
}
}
gEditItemOverlay.uninitPanel();
deck.selectedIndex = 0;
}
};

View File

@ -381,6 +381,9 @@
<treecol label="&col.title.label;" id="title" flex="5" primary="true"
persist="width hidden ordinal sortActive sortDirection"/>
<splitter class="tree-splitter"/>
<treecol label="&col.tags.label;" id="tags" flex="2"
persist="width hidden ordinal sortActive sortDirection"/>
<splitter class="tree-splitter"/>
<treecol label="&col.url.label;" id="url" flex="5"
persist="width hidden ordinal sortActive sortDirection"/>
<splitter class="tree-splitter"/>

View File

@ -425,6 +425,7 @@ PlacesTreeView.prototype = {
COLUMN_TYPE_DESCRIPTION: 6,
COLUMN_TYPE_DATEADDED: 7,
COLUMN_TYPE_LASTMODIFIED: 8,
COLUMN_TYPE_TAGS: 9,
_getColumnType: function PTV__getColumnType(aColumn) {
var columnType = aColumn.id || aColumn.element.getAttribute("anonid");
@ -445,6 +446,8 @@ PlacesTreeView.prototype = {
return this.COLUMN_TYPE_DATEADDED;
case "lastModified":
return this.COLUMN_TYPE_LASTMODIFIED;
case "tags":
return this.COLUMN_TYPE_TAGS;
}
return this.COLUMN_TYPE_UNKNOWN;
},
@ -1020,6 +1023,14 @@ PlacesTreeView.prototype = {
if (PlacesUtils.nodeIsSeparator(node))
return "";
return node.title || PlacesUtils.getString("noTitle");
case this.COLUMN_TYPE_TAGS:
if (PlacesUtils.nodeIsURI(node)) {
var tagsvc = PlacesUtils.tagging;
var uri = PlacesUtils._uri(node.uri);
var tags = tagsvc.getTagsForURI(uri, {});
return tags.join(", ");
}
return "";
case this.COLUMN_TYPE_URI:
if (PlacesUtils.nodeIsURI(node))
return node.uri;
@ -1105,6 +1116,10 @@ PlacesTreeView.prototype = {
if (!this._result)
throw Cr.NS_ERROR_UNEXPECTED;
// Currently cannot sort by tags
if (aColumn.id == "tags")
return;
this._enumerateObservers("onCycleHeader", [aColumn]);
// Sometimes you want a tri-state sorting, and sometimes you don't. This

View File

@ -46,6 +46,8 @@ var Ci = Components.interfaces;
var Cc = Components.classes;
var Cr = Components.results;
Components.utils.import("resource://gre/modules/JSON.jsm");
const LOAD_IN_SIDEBAR_ANNO = "bookmarkProperties/loadInSidebar";
const DESCRIPTION_ANNO = "bookmarkProperties/description";
const POST_DATA_ANNO = "URIProperties/POSTData";
@ -543,7 +545,7 @@ var PlacesUtils = {
}
return node;
}
return this.toJSONString(gatherDataPlace(convertNode(aNode)));
return JSON.toString(gatherDataPlace(convertNode(aNode)));
case this.TYPE_X_MOZ_URL:
function gatherDataUrl(bNode) {
@ -756,7 +758,7 @@ var PlacesUtils = {
case this.TYPE_X_MOZ_PLACE:
case this.TYPE_X_MOZ_PLACE_SEPARATOR:
case this.TYPE_X_MOZ_PLACE_CONTAINER:
nodes = this.parseJSON("[" + blob + "]");
nodes = JSON.fromString("[" + blob + "]");
break;
case this.TYPE_X_MOZ_URL:
var parts = blob.split("\n");
@ -1447,10 +1449,7 @@ var PlacesUtils = {
},
get toolbarFolderId() {
if (!("_toolbarFolderId" in this))
this._toolbarFolderId = this.bookmarks.toolbarFolder;
return this._toolbarFolderId;
return this.bookmarks.toolbarFolder;
},
get tagRootId() {
@ -1516,113 +1515,6 @@ var PlacesUtils = {
}
}
return -1;
},
/**
* Converts a JavaScript object into a JSON string
* (see http://www.json.org/ for the full grammar).
*
* The inverse operation consists of eval("(" + JSON_string + ")");
* and should be provably safe.
*
* @param aJSObject is the object to be converted
* @return the object's JSON representation
*/
toJSONString: function PU_toJSONString(aJSObject) {
// these characters have a special escape notation
const charMap = { "\b": "\\b", "\t": "\\t", "\n": "\\n", "\f": "\\f",
"\r": "\\r", '"': '\\"', "\\": "\\\\" };
// we use a single string builder for efficiency reasons
var parts = [];
// this recursive function walks through all objects and appends their
// JSON representation to the string builder
function jsonIfy(aObj) {
if (typeof aObj == "boolean") {
parts.push(aObj ? "true" : "false");
}
else if (typeof aObj == "number" && isFinite(aObj)) {
// there is no representation for infinite numbers or for NaN!
parts.push(aObj.toString());
}
else if (typeof aObj == "string") {
aObj = aObj.replace(/[\\"\x00-\x1F\u0080-\uFFFF]/g, function($0) {
// use the special escape notation if one exists, otherwise
// produce a general unicode escape sequence
return charMap[$0] ||
"\\u" + ("0000" + $0.charCodeAt(0).toString(16)).slice(-4);
});
parts.push('"' + aObj + '"');
}
else if (aObj == null) {
parts.push("null");
}
else if (aObj instanceof Array) {
parts.push("[");
for (var i = 0; i < aObj.length; i++) {
jsonIfy(aObj[i]);
parts.push(",");
}
if (parts[parts.length - 1] == ",")
parts.pop(); // drop the trailing colon
parts.push("]");
}
else if (typeof aObj == "object") {
parts.push("{");
for (var key in aObj) {
jsonIfy(key.toString());
parts.push(":");
jsonIfy(aObj[key]);
parts.push(",");
}
if (parts[parts.length - 1] == ",")
parts.pop(); // drop the trailing colon
parts.push("}");
}
else {
throw new Error("No JSON representation for this object!");
}
} // end of jsonIfy definition
jsonIfy(aJSObject);
var newJSONString = parts.join(" ");
// sanity check - so that API consumers can just eval this string
if (/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
newJSONString.replace(/"(\\.|[^"\\])*"/g, "")
))
throw new Error("JSON conversion failed unexpectedly!");
return newJSONString;
},
/**
* Converts a JSON string into a JavaScript object
* (see http://www.json.org/ for the full grammar).
*
* @param jsonText is the object to be converted
* @return a JS Object
*/
parseJSON: function parseJSON(jsonText) {
var m = {
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
'"' : '\\"',
'\\': '\\\\'
};
var EVAL_SANDBOX = new Components.utils.Sandbox("about:blank");
if (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/.test(jsonText.
replace(/\\./g, '@').
replace(/"[^"\\\n\r]*"/g, ''))) {
var j = Components.utils.evalInSandbox(jsonText, EVAL_SANDBOX);
return j;
}
else
throw new SyntaxError('parseJSON');
}
};

View File

@ -171,26 +171,35 @@ var gMainPane = {
/*
* Preferences:
*
* browser.download.showWhenStarting
* true if the Download Manager should be opened when a download is started,
* false if it shouldn't be opened
* browser.download.closeWhenDone
* true if the Download Manager should be closed when all downloads
* complete, false if it shouldn't be closed
* browser.download.useDownloadDir
* true if downloads are saved to a default location with no UI shown, false
* if the user should always be asked where to save files
* browser.download.dir
* the last directory to which a download was saved
* browser.download.showWhenStarting - bool
* True if the Download Manager should be opened when a download is
* started, false if it shouldn't be opened.
* browser.download.closeWhenDone - bool
* True if the Download Manager should be closed when all downloads
* complete, false if it should be left open.
* browser.download.useDownloadDir - bool
* True if downloads are saved with no save-as UI shown, false if
* the user should always be asked where to save a file.
* browser.download.dir - str path
* A local path the user may have selected for downloaded files to be
* saved. Migration of other browser settings may also set this path.
* This path is enabled when folderList is equals 2.
* browser.download.lastDir - str path
* May contain the last folder path accessed when the user browsed
* via the file save-as dialog. (see contentAreaUtils.js)
* browser.download.folderList - int
* Indicates the location users wish to save downloaded files too.
* It is also used to display special file labels when the default
* download location is either the Desktop or the Downloads folder.
* Values:
* 0 - The desktop is the default download location.
* 1 - The system's downloads folder is the default download location.
* 2 - The default download location is elsewhere as specified in
* browser.download.dir.
* browser.download.downloadDir
* the current default download location
* browser.download.folderList
* 0 if the desktop is the default download location,
* 1 if the downloads folder is the default download location,
* 2 if the default download location is elsewhere;
* used to display special UI when the default location is the Desktop or
* the Downloads folder in Download Manager UI and in the file field in
* preferences
* depreciated.
* browser.download.defaultFolder
* depreciated.
*/
/**
@ -232,7 +241,7 @@ var gMainPane = {
// don't override the preference's value in UI
return undefined;
},
/**
* Displays a file picker in which the user can choose the location where
* downloads are automatically saved, updating preferences and UI in
@ -241,58 +250,139 @@ var gMainPane = {
chooseFolder: function ()
{
const nsIFilePicker = Components.interfaces.nsIFilePicker;
const nsILocalFile = Components.interfaces.nsILocalFile;
var fp = Components.classes["@mozilla.org/filepicker;1"]
.createInstance(nsIFilePicker);
var bundlePreferences = document.getElementById("bundlePreferences");
var title = bundlePreferences.getString("chooseDownloadFolderTitle");
fp.init(window, title, nsIFilePicker.modeGetFolder);
const nsILocalFile = Components.interfaces.nsILocalFile;
var customDirPref = document.getElementById("browser.download.dir");
if (customDirPref.value)
fp.displayDirectory = customDirPref.value;
fp.appendFilters(nsIFilePicker.filterAll);
var folderListPref = document.getElementById("browser.download.folderList");
var currentDirPref = this._indexToFolder(folderListPref.value); // file
var defDownloads = this._indexToFolder(1); // file
// First try to open what's currently configured
if (currentDirPref && currentDirPref.exists()) {
fp.displayDirectory = currentDirPref;
} // Try the system's download dir
else if (defDownloads && defDownloads.exists()) {
fp.displayDirectory = defDownloads;
} // Fall back to Desktop
else {
fp.displayDirectory = this._indexToFolder(0);
}
if (fp.show() == nsIFilePicker.returnOK) {
var file = fp.file.QueryInterface(nsILocalFile);
var currentDirPref = document.getElementById("browser.download.downloadDir");
customDirPref.value = currentDirPref.value = file;
var currentDirPref = document.getElementById("browser.download.dir");
currentDirPref.value = file;
var folderListPref = document.getElementById("browser.download.folderList");
folderListPref.value = this._folderToIndex(file);
// Note, the real prefs will not be updated yet, so dnld manager's
// userDownloadsDirectory may not return the right folder after
// this code executes. displayDownloadDirPref will be called on
// the assignment above to update the UI.
}
},
/**
* Initializes the download folder widget based on the folder as stored in
* Initializes the download folder display settings based on the user's
* preferences.
*/
readDownloadDirPref: function ()
displayDownloadDirPref: function ()
{
var folderListPref = document.getElementById("browser.download.folderList");
var bundlePreferences = document.getElementById("bundlePreferences");
var downloadFolder = document.getElementById("downloadFolder");
var currentDirPref = document.getElementById("browser.download.dir");
var customDirPref = document.getElementById("browser.download.dir");
var customIndex = customDirPref.value ? this._folderToIndex(customDirPref.value) : 0;
if (folderListPref.value == 0 || customIndex == 0)
downloadFolder.label = bundlePreferences.getString("desktopFolderName");
else if (folderListPref.value == 1 || customIndex == 1)
downloadFolder.label = bundlePreferences.getString("myDownloadsFolderName");
else
downloadFolder.label = this._getDisplayNameOfFile(customDirPref.value);
// The user's download folder is based on the preferences listed above.
// However, if the system does not support a download folder, the
// actual path returned will be the system's desktop or home folder.
// If this is the case, skip off displaying the Download label and
// display Desktop, even though folderList might be 1.
var fileLocator = Components.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties);
var desk = fileLocator.get("Desk", Components.interfaces.nsILocalFile);
var dnldMgr = Components.classes["@mozilla.org/download-manager;1"]
.getService(Components.interfaces.nsIDownloadManager);
var supportDownloadLabel = !dnldMgr.defaultDownloadsDirectory.equals(desk);
// Used in defining the correct path to the folder icon.
var ios = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
var fph = ios.getProtocolHandler("file")
.QueryInterface(Components.interfaces.nsIFileProtocolHandler);
var currentDirPref = document.getElementById("browser.download.downloadDir");
var downloadDir = currentDirPref.value || this._indexToFolder(folderListPref.value);
var urlspec = fph.getURLSpecFromFile(downloadDir);
downloadFolder.image = "moz-icon://" + urlspec + "?size=16";
var iconUrlSpec;
// Display a 'pretty' label or the path in the UI.
if (folderListPref.value == 2) {
// Custom path selected and is configured
downloadFolder.label = this._getDisplayNameOfFile(currentDirPref.value);
iconUrlSpec = fph.getURLSpecFromFile(currentDirPref.value);
} else if (folderListPref.value == 1 && supportDownloadLabel) {
// 'Downloads'
// In 1.5, this pointed to a folder we created called 'My Downloads'
// and was available as an option in the 1.5 drop down. On XP this
// was in My Documents, on OSX it was in User Docs. In 2.0, we did
// away with the drop down option, although the special label was
// still supported for the folder if it existed. Because it was
// not exposed it was rarely used.
// With 3.0, a new desktop folder - 'Downloads' was introduced for
// platforms and versions that don't support a default system downloads
// folder. See nsDownloadManager for details.
downloadFolder.label = bundlePreferences.getString("downloadsFolderName");
iconUrlSpec = fph.getURLSpecFromFile(this._indexToFolder(1));
} else {
// 'Desktop'
downloadFolder.label = bundlePreferences.getString("desktopFolderName");
iconUrlSpec = fph.getURLSpecFromFile(desk);
}
downloadFolder.image = "moz-icon://" + iconUrlSpec + "?size=16";
// don't override the preference's value in UI
return undefined;
},
/**
* Returns the textual path of a folder in readable form.
*/
_getDisplayNameOfFile: function (aFolder)
{
// TODO: would like to add support for 'Downloads on Macintosh HD'
// for OS X users.
return aFolder ? aFolder.path : "";
},
/**
* Returns the Downloads folder. If aFolder is "Desktop", then the Downloads
* folder returned is the desktop folder; otherwise, it is a folder whose name
* indicates that it is a download folder and whose path is as determined by
* the XPCOM directory service via the download manager's attribute
* defaultDownloadsDirectory.
*
* @throws if aFolder is not "Desktop" or "Downloads"
*/
_getDownloadsFolder: function (aFolder)
{
switch(aFolder)
{
case "Desktop":
var fileLoc = Components.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties);
return fileLoc.get("Desk", Components.interfaces.nsILocalFile);
break;
case "Downloads":
var dnldMgr = Components.classes["@mozilla.org/download-manager;1"]
.getService(Components.interfaces.nsIDownloadManager);
return dnldMgr.defaultDownloadsDirectory;
break;
}
throw "ASSERTION FAILED: folder type should be 'Desktop' or 'Downloads'";
},
/**
* Determines the type of the given folder.
*
@ -312,64 +402,6 @@ var gMainPane = {
return 2;
},
/**
* Returns the Downloads folder. If aFolder is "Desktop", then the Downloads
* folder returned is the desktop folder; otherwise, it is a folder whose name
* indicates that it is a download folder and whose path is as determined by
* the XPCOM directory service from aFolder.
*
* @throws if aFolder is not "Desktop" or "Downloads"
*/
_getDownloadsFolder: function (aFolder)
{
var fileLocator = Components.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties);
var dir = fileLocator.get(this._getSpecialFolderKey(aFolder),
Components.interfaces.nsILocalFile);
if (aFolder != "Desktop")
dir.append("My Downloads"); // XXX l12y!
return dir;
},
/**
* Gets the platform-specific key to be fed to the directory service for the
* given special folder.
*
* @param aFolder
* either of the strings "Desktop" or "Downloads"
* @returns the platform-specific key for the location, which may be used with
* the XPCOM directory service
*/
_getSpecialFolderKey: function (aFolderType)
{
if (aFolderType == "Desktop")
return "Desk";
if (aFolderType == "Downloads")
#ifdef XP_WIN
return "Pers";
#else
#ifdef XP_MACOSX
return "UsrDocs";
#else
return "Home";
#endif
#endif
throw "ASSERTION FAILED: folder type should be 'Desktop' or 'Downloads'";
},
/**
* Returns the textual path of a folder in readable form.
*/
_getDisplayNameOfFile: function (aFolder)
{
// TODO: would like to add support for 'Downloads on Macintosh HD'
// for OS X users.
return aFolder ? aFolder.path : "";
},
/**
* Converts an integer into the corresponding folder.
*
@ -377,7 +409,7 @@ var gMainPane = {
* an integer
* @returns the Desktop folder if aIndex == 0,
* the Downloads folder if aIndex == 1,
* the folder stored in browser.download.dir otherwise
* the folder stored in browser.download.dir
*/
_indexToFolder: function (aIndex)
{
@ -387,19 +419,31 @@ var gMainPane = {
case 1:
return this._getDownloadsFolder("Downloads");
}
var customDirPref = document.getElementById("browser.download.dir");
return customDirPref.value;
var currentDirPref = document.getElementById("browser.download.dir");
return currentDirPref.value;
},
/**
* Returns the value for the browser.download.folderList preference determined
* from the current value of browser.download.downloadDir.
* Returns the value for the browser.download.folderList preference.
*/
writeFolderList: function ()
getFolderListPref: function ()
{
var currentDirPref = document.getElementById("browser.download.downloadDir");
return this._folderToIndex(currentDirPref.value);
var folderListPref = document.getElementById("browser.download.folderList");
switch(folderListPref.value) {
case 0: // Desktop
case 1: // Downloads
return folderListPref.value;
break;
case 2: // Custom
var currentDirPref = document.getElementById("browser.download.dir");
if (currentDirPref.value) {
// Resolve to a known location if possible. We are writing out
// to prefs on this call, so now would be a good time to do it.
return this._folderToIndex(currentDirPref.value);
}
return 0;
break;
}
}
#ifdef HAVE_SHELL_SERVICE

View File

@ -91,7 +91,6 @@
name="browser.download.dir"
type="file"
onchange="gMainPane.readDownloadDirPref();"/>
<preference id="browser.download.downloadDir" name="browser.download.downloadDir" type="file"/>
<preference id="browser.download.folderList" name="browser.download.folderList" type="int"/>
<!-- SYSTEM DEFAULTS -->
@ -177,8 +176,8 @@
<filefield id="downloadFolder" flex="1"
preference="browser.download.folderList"
preference-editable="true"
onsyncfrompreference="return gMainPane.readDownloadDirPref();"
onsynctopreference="return gMainPane.writeFolderList()"/>
onsyncfrompreference="return gMainPane.displayDownloadDirPref();"
onsynctopreference="return gMainPane.getFolderListPref()"/>
<button id="chooseFolder" oncommand="gMainPane.chooseFolder();"
#ifdef XP_MACOSX
accesskey="&chooseFolderMac.accesskey;"
@ -188,7 +187,7 @@
label="&chooseFolderWin.label;"
#endif
preference="browser.download.folderList"
onsynctopreference="return gMainPane.writeFolderList();"/>
onsynctopreference="return gMainPane.getFolderListPref();"/>
</hbox>
<radio id="alwaysAsk" value="false"
label="&alwaysAsk.label;"

View File

@ -361,8 +361,8 @@ var gSecurityPane = {
{
var noMP = !this._masterPasswordSet();
//var button = document.getElementById("changeMasterPassword");
//button.disabled = noMP;
var button = document.getElementById("changeMasterPassword");
button.disabled = noMP;
var checkbox = document.getElementById("useMasterPassword");
checkbox.checked = !noMP;

View File

@ -143,11 +143,11 @@
preference="pref.privacy.disable_button.view_passwords_exceptions"/>
</hbox>
<hbox id="masterPasswordBox">
<checkbox id="useMasterPassword" flex="1" disabled="true"
<checkbox id="useMasterPassword" flex="1"
oncommand="gSecurityPane.updateMasterPasswordButton();"
label="&useMasterPassword.label;"
accesskey="&useMasterPassword.accesskey;"/>
<button id="changeMasterPassword" disabled="true"
<button id="changeMasterPassword"
label="&changeMasterPassword.label;"
accesskey="&changeMasterPassword.accesskey;"
oncommand="gSecurityPane.changeMasterPassword();"/>

View File

@ -55,6 +55,7 @@ const HTTP_BAD_GATEWAY = 502;
const HTTP_SERVICE_UNAVAILABLE = 503;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/JSON.jsm");
/**
* SuggestAutoCompleteResult contains the results returned by the Suggest
@ -522,21 +523,7 @@ SuggestAutoComplete.prototype = {
this._clearServerErrors();
// This is a modified version of Crockford's JSON sanitizer, obtained
// from http://www.json.org/js.html.
// This should use built-in functions once bug 340987 is fixed.
const JSON_STRING = /^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/;
var sandbox = new Cu.Sandbox(this._suggestURI.prePath);
function parseJSON(aString) {
try {
if (JSON_STRING.test(aString))
return Cu.evalInSandbox("(" + aString + ")", sandbox);
} catch (e) {}
return [];
};
var serverResults = parseJSON(responseText);
var serverResults = JSON.fromString(responseText);
var searchString = serverResults[0] || "";
var results = serverResults[1] || [];

View File

@ -52,6 +52,7 @@
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
const Cu = Components.utils;
const CID = Components.ID("{5280606b-2510-4fe0-97ef-9b5a22eafe6b}");
const CONTRACT_ID = "@mozilla.org/browser/sessionstore;1";
@ -100,7 +101,10 @@ const CAPABILITIES = [
];
// sandbox to evaluate JavaScript code from non-trustable sources
var EVAL_SANDBOX = new Components.utils.Sandbox("about:blank");
var EVAL_SANDBOX = new Cu.Sandbox("about:blank");
// module for JSON conversion (needed for the nsISessionStore API)
Cu.import("resource://gre/modules/JSON.jsm");
function debug(aMsg) {
aMsg = ("SessionStore: " + aMsg).replace(/\S{80}/g, "$&\n");
@ -1618,7 +1622,7 @@ SessionStoreService.prototype = {
try {
cookieManager.add(cookie.host, cookie.path || "", cookie.name || "", cookie.value, !!cookie.secure, !!cookie.httponly, true, "expiry" in cookie ? cookie.expiry : MAX_EXPIRY);
}
catch (ex) { Components.utils.reportError(ex); } // don't let a single cookie stop recovering
catch (ex) { Cu.reportError(ex); } // don't let a single cookie stop recovering
}
},
@ -1909,12 +1913,12 @@ SessionStoreService.prototype = {
* safe eval'ing
*/
_safeEval: function sss_safeEval(aStr) {
return Components.utils.evalInSandbox(aStr, EVAL_SANDBOX);
return Cu.evalInSandbox(aStr, EVAL_SANDBOX);
},
/**
* Converts a JavaScript object into a JSON string
* (see http://www.json.org/ for the full grammar).
* (see http://www.json.org/ for more information).
*
* The inverse operation consists of eval("(" + JSON_string + ")");
* and should be provably safe.
@ -1923,73 +1927,13 @@ SessionStoreService.prototype = {
* @return the object's JSON representation
*/
_toJSONString: function sss_toJSONString(aJSObject) {
// these characters have a special escape notation
const charMap = { "\b": "\\b", "\t": "\\t", "\n": "\\n", "\f": "\\f",
"\r": "\\r", '"': '\\"', "\\": "\\\\" };
// we use a single string builder for efficiency reasons
var parts = [];
var str = JSON.toString(aJSObject, ["_tab", "_hosts"] /* keys to drop */);
// this recursive function walks through all objects and appends their
// JSON representation to the string builder
function jsonIfy(aObj) {
if (typeof aObj == "boolean") {
parts.push(aObj ? "true" : "false");
}
else if (typeof aObj == "number" && isFinite(aObj)) {
// there is no representation for infinite numbers or for NaN!
parts.push(aObj.toString());
}
else if (typeof aObj == "string") {
aObj = aObj.replace(/[\\"\x00-\x1F\u0080-\uFFFF]/g, function($0) {
// use the special escape notation if one exists, otherwise
// produce a general unicode escape sequence
return charMap[$0] ||
"\\u" + ("0000" + $0.charCodeAt(0).toString(16)).slice(-4);
});
parts.push('"' + aObj + '"')
}
else if (aObj == null) {
parts.push("null");
}
else if (aObj instanceof Array || aObj instanceof EVAL_SANDBOX.Array) {
parts.push("[");
for (var i = 0; i < aObj.length; i++) {
jsonIfy(aObj[i]);
parts.push(",");
}
if (parts[parts.length - 1] == ",")
parts.pop(); // drop the trailing colon
parts.push("]");
}
else if (typeof aObj == "object") {
parts.push("{");
for (var key in aObj) {
if (key == "_tab")
continue; // XXXzeniko we might even want to drop all private members
jsonIfy(key.toString());
parts.push(":");
jsonIfy(aObj[key]);
parts.push(",");
}
if (parts[parts.length - 1] == ",")
parts.pop(); // drop the trailing colon
parts.push("}");
}
else {
throw new Error("No JSON representation for this object!");
}
}
jsonIfy(aJSObject);
var newJSONString = parts.join(" ");
// sanity check - so that API consumers can just eval this string
if (/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
newJSONString.replace(/"(\\.|[^"\\])*"/g, "")
))
if (!JSON.isMostlyHarmless(str))
throw new Error("JSON conversion failed unexpectedly!");
return newJSONString;
return str;
},
/* ........ Storage API .............. */

View File

@ -67,7 +67,7 @@ Console.prototype = {
var wWatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
.getService(Ci.nsIWindowWatcher);
wWatch.openWindow(null, "chrome://global/content/console.xul", "_blank",
"chrome,dialog=no,all", cmdLine);
"chrome,dialog=no,all", null);
} else {
// console was already open
console.focus();

View File

@ -1,3 +1,6 @@
const Ci = Components.interfaces;
const Cc = Components.classes;
function test() {
ok(Application, "Check global access to Application");
@ -5,4 +8,19 @@ function test() {
ok(Application.id, "Check to see if an ID exists for the Application");
ok(Application.name, "Check to see if a name exists for the Application");
ok(Application.version, "Check to see if a version exists for the Application");
var wMediator = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
var console = wMediator.getMostRecentWindow("global:console");
if (!console) {
Application.console.open();
setTimeout(checkConsole, 500);
}
}
function checkConsole() {
var wMediator = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
var console = wMediator.getMostRecentWindow("global:console");
ok(console, "Check to see if the console window opened");
if (console)
console.close();
}

View File

@ -80,10 +80,7 @@ Var fhUninstallLog
!insertmacro WordReplace
!insertmacro GetSize
!insertmacro GetParameters
!insertmacro GetParent
!insertmacro GetOptions
!insertmacro GetRoot
!insertmacro DriveSpace
; NSIS provided macros that we have overridden
!include overrides.nsh
@ -99,18 +96,18 @@ Var fhUninstallLog
VIAddVersionKey "FileDescription" "${BrandShortName} Installer"
!insertmacro GetLongPath
!insertmacro RegCleanMain
!insertmacro RegCleanUninstall
!insertmacro CloseApp
!insertmacro WriteRegStr2
!insertmacro WriteRegDWORD2
!insertmacro CreateRegKey
!insertmacro AddHandlerValues
!insertmacro CanWriteToInstallDir
!insertmacro CheckDiskSpace
!insertmacro CleanVirtualStore
!insertmacro AddHandlerValues
!insertmacro CloseApp
!insertmacro CreateRegKey
!insertmacro GetLongPath
!insertmacro GetSingleInstallPath
!insertmacro RegCleanMain
!insertmacro RegCleanUninstall
!insertmacro WriteRegStr2
!insertmacro WriteRegDWORD2
!include shared.nsh

View File

@ -62,13 +62,9 @@ Var TmpVal
!include WordFunc.nsh
!include MUI.nsh
!insertmacro FileJoin
!insertmacro GetOptions
!insertmacro GetParameters
!insertmacro LineFind
!insertmacro StrFilter
!insertmacro TextCompare
!insertmacro TrimNewLines
!insertmacro WordFind
!insertmacro WordReplace

View File

@ -268,6 +268,7 @@ langpack-%: AB_CD=$*
langpack-%: XPI_NAME=locale-$*
langpack-%:
@echo "Making langpack $(LANGPACK_FILE)"
$(NSINSTALL) -D $(DIST)/install
@$(RM) -rf $(DIST)/xpi-stage/locale-$(AB_CD)
@$(MAKE) libs-$(AB_CD) USE_EXTENSION_MANIFEST=1
$(PERL) $(topsrcdir)/config/preprocessor.pl $(DEFINES) $(ACDEFINES) -I$(call EXPAND_LOCALE_SRCDIR,toolkit/locales)/defines.inc -I$(LOCALE_SRCDIR)/defines.inc $(srcdir)/generic/install.rdf > $(FINAL_TARGET)/install.rdf

View File

@ -348,3 +348,5 @@
<!ENTITY spellAddDictionaries.label "Add dictionaries...">
<!ENTITY spellAddDictionaries.accesskey "A">
<!ENTITY editBookmark.done.label "Done">
<!ENTITY editBookmark.delete.label "Delete">

View File

@ -1,4 +1,5 @@
<!ENTITY editBookmarkOverlay.name.label "Name:">
<!ENTITY editBookmarkOverlay.location.label "Location:">
<!ENTITY editBookmarkOverlay.liveTitlesSeparator.label "Live Titles">
<!ENTITY editBookmarkOverlay.folder.label "Folder:">
<!ENTITY editBookmarkOverlay.allBookmarksFolderItem.label "All Bookmarks">
@ -9,5 +10,3 @@
<!ENTITY editBookmarkOverlay.tags.label "Tags">
<!ENTITY editBookmarkOverlay.description.label "Description:">
<!ENTITY editBookmarkOverlay.tagsExpanderDown.tooltip "Show all tags">
<!ENTITY editBookmarkOverlay.ok.label "OK">
<!ENTITY editBookmarkOverlay.delete.label "Delete">

View File

@ -197,6 +197,8 @@
<!ENTITY col.title.label
"Name">
<!ENTITY col.tags.label
"Tags">
<!ENTITY col.url.label
"Location">
<!ENTITY col.lastvisit.label

View File

@ -40,7 +40,7 @@ languageCodeFormat=%1$S [%2$S]
#### Downloads
desktopFolderName=Desktop
myDownloadsFolderName=My Downloads
downloadsFolderName=Downloads
chooseDownloadFolderTitle=Choose Download Folder:
#### Download Actions

View File

@ -0,0 +1,12 @@
<!ENTITY untitledTab "(Untitled)">
<!ENTITY newTab.label "New Tab">
<!ENTITY newTab.accesskey "N">
<!ENTITY closeTab.label "Close Tab">
<!ENTITY closeTab.accesskey "c">
<!ENTITY closeOtherTabs.accesskey "o">
<!ENTITY closeOtherTabs.label "Close Other Tabs">
<!ENTITY reloadAllTabs.label "Reload All Tabs">
<!ENTITY reloadAllTabs.accesskey "A">
<!ENTITY reloadTab.label "Reload Tab">
<!ENTITY reloadTab.accesskey "r">
<!ENTITY listAllTabs.label "List all tabs">

View File

@ -0,0 +1,10 @@
tabs.loading=Loading...
tabs.untitled=(Untitled)
tabs.closeTab=Close Tab
tabs.close=Close
tabs.closeWarningTitle=Confirm close
tabs.closeWarningOneTab=You are about to close %S tab. Are you sure you want to continue?
tabs.closeWarningMultipleTabs=You are about to close %S tabs. Are you sure you want to continue?
tabs.closeButtonOne=Close tab
tabs.closeButtonMultiple=Close tabs
tabs.closeWarningPromptMe=Warn me when I attempt to close multiple tabs

View File

@ -25,6 +25,8 @@
locale/browser/setDesktopBackground.dtd (%chrome/browser/setDesktopBackground.dtd)
locale/browser/shellservice.properties (%chrome/browser/shellservice.properties)
locale/browser/sessionstore.properties (%chrome/browser/sessionstore.properties)
locale/browser/tabbrowser.dtd (%chrome/browser/tabbrowser.dtd)
locale/browser/tabbrowser.properties (%chrome/browser/tabbrowser.properties)
locale/browser/places/places.dtd (%chrome/browser/places/places.dtd)
locale/browser/places/places.properties (%chrome/browser/places/places.properties)
locale/browser/places/editBookmarkOverlay.dtd (%chrome/browser/places/editBookmarkOverlay.dtd)

View File

@ -972,6 +972,11 @@ statusbarpanel#statusbar-display {
height: 16px;
}
.autocomplete-treebody::-moz-tree-image(bookmark, treecolAutoCompleteValue) {
width: 16px;
height: 16px;
}
.autocomplete-treebody::-moz-tree-cell-text(treecolAutoCompleteComment) {
color: #555566;
}
@ -1189,11 +1194,398 @@ toolbarbutton.chevron > .toolbarbutton-menu-dropmarker {
list-style-image: none;
}
/* ::::: tabbrowser ::::: */
.tabs-left {
display: none !important;
}
/* ::::: close button ::::: */
.tabbrowser-tab:not([selected="true"]):hover {
background: url("chrome://browser/skin/tabbrowser/tabbrowser-tabs-bkgnd.png") repeat-x;
}
.tabbrowser-tab:hover > .tab-image-middle > .tab-icon > .tab-extra-status {
background: none;
}
.tab-icon-image {
width: 16px;
height: 16px;
list-style-image: url("chrome://global/skin/icons/small-globe-sunken.png");
}
.tab-icon {
padding-top: 1px;
margin: 2px 0px 1px 0px;
}
.tab-text {
font: icon;
padding-top: 1px;
margin-top: 2px !important;
}
.tabbrowser-tab[busy] > .tab-icon-image,
.tabbrowser-tab[busy] > .tab-image-middle > .tab-icon > .tab-icon-image {
list-style-image: url("chrome://global/skin/icons/loading_16_grey.gif") !important;
}
.tabbrowser-tab {
-moz-binding: url("chrome://browser/skin/tabbrowser/tabbrowserBindings.xml#tabbrowser-tab") !important;
-moz-appearance: none;
color: #383838;
-moz-box-pack: center;
margin: 2px 0px 3px 0px;
padding: 0px;
border: none !important;
height: 22px !important;
min-width: 1px !important;
text-align: center;
}
.tabbrowser-tab[selected="true"] {
-moz-user-focus: normal;
}
.tabbrowser-tab > .tab-image-middle > .tab-text {
border: 1.4pt solid transparent;
}
.tabbrowser-tab:focus > .tab-image-middle > .tab-text {
border: 1.4pt solid -moz-mac-focusring;
}
.tabbrowser-tab[selected="true"], .tabbrowser-tab:hover {
color: #000000;
}
.tabbrowser-tab[first-tab="true"] > .tab-image-left {
margin-left: 3px !important;
}
.tab-image-left, .tab-image-right {
width: 8px;
margin: 0px;
padding: 0px;
}
.tabbrowser-tab > .tab-image-right {
background: url("chrome://browser/skin/tabbrowser/tab-right.png") no-repeat;
}
.tabbrowser-tab:not([selected="true"]) > .tab-image-right {
background: url("chrome://browser/skin/tabbrowser/tab-right-bkgnd.png") no-repeat;
margin-bottom: 1px;
}
.tabbrowser-tab:hover:not([selected="true"]) > .tab-image-right {
background: url("chrome://browser/skin/tabbrowser/tab-right-hover.png") no-repeat;
}
.tabbrowser-tab > .tab-image-left {
background: url("chrome://browser/skin/tabbrowser/tab-left.png") no-repeat;
}
.tabbrowser-tab:not([selected="true"]) > .tab-image-left {
background: url("chrome://browser/skin/tabbrowser/tab-left-bkgnd.png") no-repeat;
margin-bottom: 1px;
}
.tabbrowser-tab:hover:not([selected="true"]) > .tab-image-left {
background: url("chrome://browser/skin/tabbrowser/tab-left-hover.png") no-repeat;
}
.tabbrowser-tab > .tab-image-middle {
background: url("chrome://browser/skin/tabbrowser/tab-middle.png") repeat-x;
-moz-box-flex: 0 !important;
}
.tabbrowser-tab:not([selected="true"]) > .tab-image-middle {
background: url("chrome://browser/skin/tabbrowser/tab-middle-bkgnd.png");
margin-bottom: 1px;
}
.tabbrowser-tab:hover:not([selected="true"]) > .tab-image-middle {
background: url("chrome://browser/skin/tabbrowser/tab-middle-hover.png");
}
.tabbrowser-tab:not([selected="true"]) > .tab-image-middle > .tab-icon > .tab-icon-image {
list-style-image: url("chrome://global/skin/icons/small-globe-sunken-grey.png");
}
.tabs-closebutton {
padding: 0px 4px 2px 0px;
margin: 0px;
list-style-image: url("chrome://global/skin/icons/closetab.png") !important;
border: none !important;
}
.tabs-closebutton:hover {
list-style-image: url("chrome://global/skin/icons/closetab-hover.png") !important;
border: none !important;
}
.tabs-closebutton:hover:active {
list-style-image: url("chrome://global/skin/icons/closetab-active.png") !important;
border: none !important;
}
.tabbrowser-strip {
-moz-box-orient: vertical !important;
-moz-appearance: dialog;
}
.tabbrowser-tabs {
-moz-binding: url("chrome://browser/skin/tabbrowser/tabbrowserBindings.xml#tabbrowser-tabs");
border: none;
padding: 0;
margin: 0;
-moz-box-pack: center;
-moz-box-align: center;
background: url("chrome://browser/skin/tabbrowser/tabbrowser-tabs-bkgnd.png") repeat-x;
}
.tab-image-right, .tab-image-left {
height: 18px !important;
}
.tabs-bottom {
border: none;
height: 4px !important;
background: url("chrome://browser/skin/tabbrowser/tabs-bottom-bg.png") repeat !important;
margin: 0px !important;
}
tabbrowser > tabbox > tabpanels {
-moz-appearance: none !important;
}
.tab-drop-indicator-bar {
visibility: hidden;
height: 9px;
margin-top: -9px;
position: relative;
}
.tab-drop-indicator {
height: 9px;
width: 9px;
margin-bottom: -5px;
position: relative;
background: url('chrome://browser/skin/tabbrowser/tabDragIndicator.png') 50% 50% no-repeat;
}
.tab-drop-indicator-bar[dragging="true"] {
visibility: visible;
}
/**
* In-tab close button
*/
.tab-close-button > .toolbarbutton-icon {
-moz-margin-end: 0px !important;
margin-top: 2px;
}
.tab-close-button {
list-style-image: url("chrome://global/skin/icons/closetab.png");
-moz-appearance: none;
border: none !important;
padding: 0px;
background: inherit;
cursor: default;
}
.tab-close-button:hover,
.tabbrowser-tab[selected="true"] > .tab-close-button:hover {
list-style-image: url("chrome://global/skin/icons/closetab-hover.png");
}
.tab-close-button:hover:active,
.tabbrowser-tab[selected="true"] > .tab-close-button:hover:active {
list-style-image: url("chrome://global/skin/icons/closetab-active.png");
}
.tabbrowser-tab > .tab-close-button {
background-image: url("chrome://browser/skin/tabbrowser/tab-middle.png");
background-repeat: repeat-x;
-moz-margin-start: -5px;
-moz-margin-end: -1px;
-moz-padding-end: 0px;
}
.tabbrowser-tab[selected="true"] > .tab-close-button {
/* Make this button focusable so clicking on it will not focus the tab while
it's getting closed */
-moz-user-focus: normal;
}
.tabbrowser-tab:not([selected="true"]) > .tab-close-button {
background-image: url("chrome://browser/skin/tabbrowser/tab-middle-bkgnd.png");
margin-bottom: 1px;
}
.tabbrowser-tab:not([selected="true"]):hover > .tab-close-button {
background-image: url("chrome://browser/skin/tabbrowser/tab-middle-hover.png");
}
/**
* Tab Scrollbox Arrow Buttons
*/
.tabbrowser-arrowscrollbox > .scrollbutton-up {
width: 18px;
height: 18px;
margin: 2px 0px 3px 0px;
padding-left: 0;
padding-right: 0;
border: none;
list-style-image: url("chrome://browser/skin/tabbrowser/tab-arrow-start.png");
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-start-bkgnd.png");
background-repeat: no-repeat;
-moz-image-region: rect(0, 11px, 14px, 0);
opacity: 0.65;
}
.tabbrowser-arrowscrollbox > .scrollbutton-up[disabled="true"] {
-moz-image-region: rect(0, 33px, 14px, 22px);
}
.tabbrowser-arrowscrollbox > .scrollbutton-up:not([disabled="true"]):hover {
-moz-image-region: rect(0, 22px, 14px, 11px);
opacity: 1.0;
}
.tabbrowser-arrowscrollbox > .scrollbutton-up:not([disabled="true"]):hover:active {
-moz-image-region: rect(0, 44px, 14px, 33px);
}
.tabbrowser-arrowscrollbox > .scrollbutton-up > .toolbarbutton-icon {
margin-top: 4px;
}
.tabbrowser-arrowscrollbox > stack > .scrollbutton-down-box {
margin: 2px 0px 3px 0px;
width: 18px;
height: 18px;
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-end-bkgnd.png") !important;
background-repeat: no-repeat;
opacity: 0.65;
}
.tabbrowser-arrowscrollbox > stack > .scrollbutton-down-box-animate {
margin: 2px 0px 3px 0px;
width: 18px;
height: 18px;
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-end-bkgnd-animate.png") !important;
background-repeat: no-repeat;
opacity: 0.0;
}
.tabbrowser-arrowscrollbox > stack > .scrollbutton-down {
margin: 2px 0px 3px 0px;
width: 18px;
height: 18px;
padding-left: 0;
padding-right: 0;
border: none;
list-style-image: url("chrome://browser/skin/tabbrowser/tab-arrow-end.png") !important;
-moz-image-region: rect(0, 11px, 14px, 0);
}
.tabbrowser-arrowscrollbox > stack > .scrollbutton-down[disabled="true"] {
-moz-image-region: rect(0, 33px, 14px, 22px);
}
.tabbrowser-arrowscrollbox > stack > .scrollbutton-down:not([disabled="true"]):hover {
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-end-bkgnd.png") !important;
background-repeat: no-repeat;
-moz-image-region: rect(0, 22px, 14px, 11px);
}
.tabbrowser-arrowscrollbox > stack > .scrollbutton-down:not([disabled="true"]):hover:active {
-moz-image-region: rect(0, 44px, 14px, 33px);
}
.tabbrowser-arrowscrollbox > stack > .scrollbutton-down > .toolbarbutton-icon {
margin-top: 4px;
-moz-margin-start: 1px;
}
/**
* All Tabs Button
*/
.tabs-alltabs-box {
margin: 2px 0px 3px 0px;
width: 16px;
height: 18px;
background-image: url("chrome://browser/skin/tabbrowser/alltabs-box-bkgnd.png");
background-repeat: no-repeat;
opacity: 0.65;
}
.tabbrowser-tabs[overflow="true"] .tabs-alltabs-box {
background-image: url("chrome://browser/skin/tabbrowser/alltabs-box-overflow-bkgnd.png");
}
.tabs-alltabs-button {
margin: 2px 0px 3px 0px;
width: 16px;
height: 18px;
padding-left: 0;
padding-right: 0;
border: none;
}
.tabs-alltabs-button > .toolbarbutton-menu-dropmarker {
margin-right: 2px;
margin-top: 4px;
}
.tabs-alltabs-button > .toolbarbutton-text {
display: none;
}
.tabs-alltabs-button > .toolbarbutton-icon {
-moz-margin-end: 2px;
}
.tabs-alltabs-button:hover {
margin: 2px 0px 3px 0px;
background-image: url("chrome://browser/skin/tabbrowser/alltabs-box-bkgnd.png");
background-repeat: no-repeat;
opacity: 1.0;
}
.tabbrowser-tabs[overflow="true"] .tabs-alltabs-button:hover {
background-image: url("chrome://browser/skin/tabbrowser/alltabs-box-overflow-bkgnd.png");
}
.tabs-alltabs-box-animate {
margin: 2px 0px 3px 0px;
width: 16px;
height: 18px;
background-image: url("chrome://browser/skin/tabbrowser/alltabs-box-overflow-bkgnd-animate.png");
background-repeat: no-repeat;
opacity: 0.0;
}
/**
* All Tabs Menupopup
*/
.alltabs-item > .menu-iconic-left > .menu-iconic-icon {
list-style-image: url("chrome://global/skin/icons/small-globe-sunken.png");
}
.alltabs-item[selected="true"] {
font-weight: bold;
}
.alltabs-item[busy] > .menu-iconic-left > .menu-iconic-icon {
list-style-image: url("chrome://global/skin/icons/loading_16_grey.gif") !important;
}
.tabs-closebutton {
padding-right: 4px;

View File

@ -62,5 +62,27 @@ classic.jar:
#endif
skin/classic/browser/preferences/Options.png (preferences/Options.png)
skin/classic/browser/preferences/preferences.css (preferences/preferences.css)
skin/classic/browser/tabbrowser/alltabs-box-bkgnd.png (tabbrowser/alltabs-box-bkgnd.png)
skin/classic/browser/tabbrowser/alltabs-box-overflow-bkgnd.png (tabbrowser/alltabs-box-overflow-bkgnd.png)
skin/classic/browser/tabbrowser/alltabs-box-overflow-bkgnd-animate.png (tabbrowser/alltabs-box-overflow-bkgnd-animate.png)
skin/classic/browser/tabbrowser/tab-arrow-start.png (tabbrowser/tab-arrow-start.png)
skin/classic/browser/tabbrowser/tab-arrow-start-bkgnd.png (tabbrowser/tab-arrow-start-bkgnd.png)
skin/classic/browser/tabbrowser/tab-arrow-start-bkgnd-animate.png (tabbrowser/tab-arrow-start-bkgnd-animate.png)
skin/classic/browser/tabbrowser/tab-arrow-end.png (tabbrowser/tab-arrow-end.png)
skin/classic/browser/tabbrowser/tab-arrow-end-bkgnd.png (tabbrowser/tab-arrow-end-bkgnd.png)
skin/classic/browser/tabbrowser/tab-arrow-end-bkgnd-animate.png (tabbrowser/tab-arrow-end-bkgnd-animate.png)
skin/classic/browser/tabbrowser/tabbrowserBindings.xml (tabbrowser/tabbrowserBindings.xml)
skin/classic/browser/tabbrowser/tabbrowser-tabs-bkgnd.png (tabbrowser/tabbrowser-tabs-bkgnd.png)
skin/classic/browser/tabbrowser/tabDragIndicator.png (tabbrowser/tabDragIndicator.png)
skin/classic/browser/tabbrowser/tab-left.png (tabbrowser/tab-left.png)
skin/classic/browser/tabbrowser/tab-left-bkgnd.png (tabbrowser/tab-left-bkgnd.png)
skin/classic/browser/tabbrowser/tab-left-hover.png (tabbrowser/tab-left-hover.png)
skin/classic/browser/tabbrowser/tab-middle.png (tabbrowser/tab-middle.png)
skin/classic/browser/tabbrowser/tab-middle-bkgnd.png (tabbrowser/tab-middle-bkgnd.png)
skin/classic/browser/tabbrowser/tab-middle-hover.png (tabbrowser/tab-middle-hover.png)
skin/classic/browser/tabbrowser/tab-right.png (tabbrowser/tab-right.png)
skin/classic/browser/tabbrowser/tab-right-bkgnd.png (tabbrowser/tab-right-bkgnd.png)
skin/classic/browser/tabbrowser/tab-right-hover.png (tabbrowser/tab-right-hover.png)
skin/classic/browser/tabbrowser/tabs-bottom-bg.png (tabbrowser/tabs-bottom-bg.png)
icon.png
preview.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 447 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 600 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 654 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 693 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 417 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 B

View File

@ -0,0 +1,69 @@
<?xml version="1.0"?>
<!DOCTYPE bindings [
<!ENTITY % tabBrowserDTD SYSTEM "chrome://browser/locale/tabbrowser.dtd" >
%tabBrowserDTD;
<!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd">
%globalDTD;
]>
<bindings id="globalBindings"
xmlns="http://www.mozilla.org/xbl"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:xbl="http://www.mozilla.org/xbl">
<binding id="tabbrowser-tab" extends="chrome://browser/content/tabbrowser.xml#tabbrowser-tab">
<content chromedir="&locale.dir;"
closetabtext="&closeTab.label;">
<xul:hbox class="tab-image-left" xbl:inherits="selected"/>
<xul:hbox flex="1" class="tab-image-middle" align="center" xbl:inherits="selected">
<xul:stack class="tab-icon">
<xul:image xbl:inherits="validate,src=image" class="tab-icon-image"/>
<xul:image class="tab-extra-status"/>
</xul:stack>
<xul:label flex="1" xbl:inherits="value=label,crop,accesskey" crop="right" class="tab-text"/>
</xul:hbox>
<xul:toolbarbutton anonid="close-button" class="tab-close-button" tabindex="-1"/>
<xul:hbox class="tab-image-right" xbl:inherits="selected"/>
</content>
</binding>
<binding id="tabbrowser-tabs"
extends="chrome://browser/content/tabbrowser.xml#tabbrowser-tabs">
<content>
<xul:stack flex="1" class="tabs-stack">
<xul:vbox>
<xul:spacer flex="1"/>
<xul:hbox class="tabs-bottom" align="center"/>
</xul:vbox>
<xul:vbox>
<xul:hbox>
<xul:stack>
<xul:spacer class="tabs-left"/>
</xul:stack>
<xul:arrowscrollbox anonid="arrowscrollbox" orient="horizontal" flex="1" style="min-width: 1px;" class="tabbrowser-arrowscrollbox">
<children/>
</xul:arrowscrollbox>
<xul:stack align="center" pack="end">
<xul:hbox flex="1" class="tabs-alltabs-box"
anonid="alltabs-box"/>
<xul:hbox flex="1" class="tabs-alltabs-box-animate"
anonid="alltabs-box-animate"/>
<xul:toolbarbutton class="tabs-alltabs-button"
type="menu"
anonid="alltabs-button"
tooltipstring="&listAllTabs.label;">
<xul:menupopup class="tabs-alltabs-popup"
anonid="alltabs-popup" position="after_end"/>
</xul:toolbarbutton>
</xul:stack>
<xul:hbox class="tabs-closebutton-box" align="center" pack="end" anonid="tabstrip-closebutton">
<xul:toolbarbutton class="close-button tabs-closebutton"/>
</xul:hbox>
</xul:hbox>
<xul:spacer class="tabs-bottom-spacer"/>
</xul:vbox>
</xul:stack>
</content>
</binding>
</bindings>

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 B

View File

@ -965,6 +965,11 @@ statusbarpanel#statusbar-display {
height: 16px;
}
.autocomplete-treebody::-moz-tree-image(bookmark, treecolAutoCompleteValue) {
width: 16px;
height: 16px;
}
.autocomplete-treebody::-moz-tree-cell-text(treecolAutoCompleteComment) {
color: #555566;
}
@ -1223,6 +1228,481 @@ toolbar[mode="text"] #navigator-throbber[busy="true"] {
opacity: 0.5;
}
/**
* Tabbrowser Tabs
*/
.tabbrowser-tabs {
-moz-binding: url("chrome://browser/skin/tabbrowser/tabbrowserBindings.xml#tabbrowser-tabs") !important;
padding-top: 0px;
background: -moz-dialog url("chrome://browser/skin/tabbrowser/tabbrowser-tabs-bkgnd.png") !important;
-moz-padding-start: 0px;
}
.tabbrowser-tabs[overflow="true"] {
-moz-padding-start: 0px;
}
/**
* Tab
*/
.tabbrowser-tab {
-moz-appearance: none !important;
-moz-binding: url("chrome://browser/skin/tabbrowser/tabbrowserBindings.xml#tabbrowser-tab") !important;
background: transparent !important;
margin: 0px 0px 1px !important;
padding: 0px !important;
border: none !important;
height: 22px !important;
}
.tabbrowser-tab > .tab-image-middle {
padding-top: 1px;
-moz-padding-start: 1px;
}
.tabbrowser-tab[busy] > .tab-image-middle > .tab-icon > .tab-icon-image {
list-style-image: url("chrome://global/skin/throbber/Throbber-small.gif") !important;
opacity: 0.6;
}
.tabbrowser-tab[selected="true"] {
font-weight: bold;
}
.tabbrowser-tab[selected="true"] > .tab-image-middle > .tab-text {
opacity: 1.0 !important;
}
.tabbrowser-tab > .tab-image-left {
width: 8px;
height: 24px;
background: url("chrome://browser/skin/tabbrowser/tab-left.png") no-repeat;
background-color: -moz-dialog;
-moz-border-radius-topleft: 4px;
}
.tabbrowser-tab[chromedir="rtl"] > .tab-image-left {
background: url("chrome://browser/skin/tabbrowser/tab-right.png") no-repeat;
background-color: -moz-dialog;
-moz-border-radius-topleft: 0px;
-moz-border-radius-topright: 4px;
}
.tabbrowser-tab:not([selected="true"]):not(:hover) > .tab-image-left {
background: url("chrome://browser/skin/tabbrowser/tab-left-bkgnd.png") no-repeat;
background-color: -moz-dialog;
}
.tabbrowser-tab[chromedir="rtl"]:not([selected="true"]):not(:hover) > .tab-image-left {
background: url("chrome://browser/skin/tabbrowser/tab-right-bkgnd.png") no-repeat;
background-color: -moz-dialog;
}
.tabbrowser-tab > .tab-image-middle {
height: 24px;
background: url("chrome://browser/skin/tabbrowser/tab-middle.png") repeat-x;
background-color: -moz-dialog;
}
.tabbrowser-tab:not([selected="true"]):not(:hover) > .tab-image-middle {
background: url("chrome://browser/skin/tabbrowser/tab-middle-bkgnd.png") repeat-x;
background-color: -moz-dialog;
}
.tabbrowser-tab > .tab-image-right {
width: 8px;
height: 24px;
background: url("chrome://browser/skin/tabbrowser/tab-right.png") no-repeat;
background-color: -moz-dialog;
-moz-border-radius-topright: 4px;
}
.tabbrowser-tab[chromedir="rtl"] > .tab-image-right {
background: url("chrome://browser/skin/tabbrowser/tab-left.png") no-repeat;
background-color: -moz-dialog;
-moz-border-radius-topleft: 4px;
-moz-border-radius-topright: 0px;
}
.tabbrowser-tab:not([selected="true"]):not(:hover) > .tab-image-right {
background: url("chrome://browser/skin/tabbrowser/tab-right-bkgnd.png") no-repeat;
background-color: -moz-dialog;
}
.tabbrowser-tab[chromedir="rtl"]:not([selected="true"]):not(:hover) > .tab-image-right {
background: url("chrome://browser/skin/tabbrowser/tab-left-bkgnd.png") no-repeat;
background-color: -moz-dialog;
}
.tabbrowser-tab:not([selected="true"]) > .tab-image-left,
.tabbrowser-tab:not([selected="true"]) > .tab-image-middle,
.tabbrowser-tab:not([selected="true"]) > .tab-image-right {
height: 23px;
margin-bottom: 1px;
}
.tab-icon-image {
margin-top: 1px;
-moz-margin-end: 3px;
width: 16px;
height: 16px;
list-style-image: url("chrome://global/skin/icons/folder-item.png");
-moz-image-region: rect(0px, 16px, 16px, 0px);
}
.tabs-bottom {
height: 4px !important;
margin: 0px !important;
background: -moz-dialog url("chrome://browser/skin/tabbrowser/tabstrip-bottom.png") repeat !important;
border-top: 1px solid threedshadow;
border-bottom: 1px solid threedshadow;
}
tabpanels {
-moz-appearance: none;
}
.tabs-left,
.tabs-right {
width: 3px;
border-bottom-width: 0px;
}
/* tabbrowser-tab focus ring */
.tabbrowser-tab > .tab-image-middle > .tab-text {
border: 1px dotted transparent;
}
.tabbrowser-tab:focus > .tab-image-middle > .tab-text {
border: 1px dotted -moz-DialogText;
}
/**
* Tab Drag and Drop
*/
.tab-drop-indicator-bar {
visibility: hidden;
height: 9px;
margin-top: -9px;
position: relative;
}
.tab-drop-indicator {
height: 9px;
width: 9px;
margin-bottom: -5px;
position: relative;
background: url('chrome://browser/skin/tabbrowser/tabDragIndicator.png') 50% 50% no-repeat;
}
.tab-drop-indicator-bar[dragging="true"] {
visibility: visible;
}
/**
* In-tab close button
*/
.tab-close-button > .toolbarbutton-icon {
-moz-margin-end: 0px !important;
margin-top: 1px;
}
.tab-close-button {
-moz-appearance: none;
-moz-image-region: rect(0px, 64px, 16px, 48px);
height: 24px;
border: none !important;
padding: 0px;
cursor: default;
list-style-image: url("chrome://global/skin/icons/close.png");
}
.tabbrowser-tab:not([selected="true"]) > .tab-close-button {
height: 23px;
margin-bottom: 1px;
}
.tabbrowser-tab:not([selected="true"]) > .tab-close-button > .toolbarbutton-icon {
margin-top: 2px;
}
.tab-close-button:hover,
.tabbrowser-tab[selected="true"] > .tab-close-button:hover {
-moz-image-region: rect(0px, 32px, 16px, 16px);
opacity: 1.0;
}
.tab-close-button:hover:active,
.tabbrowser-tab[selected="true"] > .tab-close-button:hover:active {
-moz-image-region: rect(0px, 48px, 16px, 32px);
opacity: 1.0;
}
.tabbrowser-tab > .tab-close-button {
background-image: url("chrome://browser/skin/tabbrowser/tab-middle-bkgnd.png");
background-color: -moz-dialog;
}
.tabbrowser-tab:hover > .tab-close-button {
background-image: url("chrome://browser/skin/tabbrowser/tab-middle.png");
}
.tabbrowser-tab[selected="true"] > .tab-close-button {
background-image: url("chrome://browser/skin/tabbrowser/tab-middle.png");
-moz-image-region: rect(0px, 16px, 16px, 0px);
/* Make this button focusable so clicking on it will not focus the tab while
it's getting closed */
-moz-user-focus: normal;
}
.tab-close-button:focus {
outline: none !important;
}
/**
* Tab Scrollbox Arrow Buttons
*/
.tabbrowser-tabs[overflow="true"] .tabs-left {
display: none;
}
.tabbrowser-arrowscrollbox > .scrollbutton-up {
-moz-appearance: none !important;
border: none !important;
margin-top: 2px;
margin-bottom: 4px !important;
padding: 0px;
width: 18px;
height: 23px;
-moz-margin-start: 0px;
-moz-margin-end: 0px;
list-style-image: url("chrome://browser/skin/tabbrowser/tab-arrow-start.png");
-moz-image-region: rect(0, 11px, 14px, 0);
background-repeat: no-repeat;
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-start-bkgnd-enabled.png");
background-color: -moz-dialog;
-moz-border-radius-topright: 4px;
}
.tabbrowser-arrowscrollbox[chromedir="rtl"] > .scrollbutton-up {
list-style-image: url("chrome://browser/skin/tabbrowser/tab-arrow-end.png");
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-end-bkgnd-enabled.png");
-moz-border-radius-topleft: 4px;
-moz-border-radius-topright: 0px;
}
.tabbrowser-arrowscrollbox > .scrollbutton-up[disabled="true"] {
-moz-image-region: rect(0, 33px, 14px, 22px);
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-start-bkgnd-disabled.png");
}
.tabbrowser-arrowscrollbox[chromedir="rtl"] > .scrollbutton-up[disabled="true"] {
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-end-bkgnd-disabled.png");
}
.tabbrowser-arrowscrollbox > .scrollbutton-up:not([disabled="true"]):hover {
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-start-bkgnd-hover.png");
-moz-image-region: rect(0, 22px, 14px, 11px);
}
.tabbrowser-arrowscrollbox[chromedir="rtl"] > .scrollbutton-up:not([disabled="true"]):hover {
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-end-bkgnd-hover.png");
}
.tabbrowser-arrowscrollbox > .scrollbutton-up:not([disabled="true"]):hover:active {
-moz-image-region: rect(0, 44px, 14px, 33px);
}
.tabbrowser-arrowscrollbox > .scrollbutton-up > .toolbarbutton-icon {
margin: 6px 0px 0px 0px;
}
.tabbrowser-arrowscrollbox > .scrollbutton-down-stack {
margin-top: 2px;
margin-bottom: 4px;
height: 23px;
}
.tabbrowser-arrowscrollbox > stack > .scrollbutton-down-box {
-moz-appearance: none !important;
border: none !important;
width: 18px;
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-end-bkgnd-enabled.png");
background-repeat: no-repeat;
background-color: -moz-dialog;
-moz-border-radius-topleft: 4px;
}
.tabbrowser-arrowscrollbox[chromedir="rtl"] > stack > .scrollbutton-down-box {
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-start-bkgnd-enabled.png");
-moz-border-radius-topleft: 0px;
-moz-border-radius-topright: 4px;
}
.tabbrowser-arrowscrollbox > stack > .scrollbutton-down-box[disabled="true"] {
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-end-bkgnd-disabled.png");
}
.tabbrowser-arrowscrollbox[chromedir="rtl"] > stack > .scrollbutton-down-box[disabled="true"] {
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-start-bkgnd-disabled.png");
}
.tabbrowser-arrowscrollbox > stack > .scrollbutton-down-box-animate {
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-end-bkgnd-animate.png");
background-repeat: no-repeat;
opacity: 0.0;
}
.tabbrowser-arrowscrollbox[chromedir="rtl"] > stack > .scrollbutton-down-box-animate {
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-start-bkgnd-animate.png");
}
.tabbrowser-arrowscrollbox > stack > .scrollbutton-down {
-moz-appearance: none !important;
border: none !important;
width: 18px;
list-style-image: url("chrome://browser/skin/tabbrowser/tab-arrow-end.png");
-moz-image-region: rect(0, 11px, 14px, 0);
margin: 0px;
padding: 0px;
}
.tabbrowser-arrowscrollbox[chromedir="rtl"] > stack > .scrollbutton-down {
list-style-image: url("chrome://browser/skin/tabbrowser/tab-arrow-start.png");
}
.tabbrowser-arrowscrollbox > stack > .scrollbutton-down[disabled="true"] {
-moz-image-region: rect(0, 33px, 14px, 22px);
}
.tabbrowser-arrowscrollbox > stack > .scrollbutton-down:not([disabled="true"]):hover {
-moz-image-region: rect(0, 22px, 14px, 11px);
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-end-bkgnd-hover.png");
background-repeat: no-repeat;
background-position: top left;
}
.tabbrowser-arrowscrollbox[chromedir="rtl"] > stack > .scrollbutton-down:not([disabled="true"]):hover {
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-start-bkgnd-hover.png");
}
.tabbrowser-arrowscrollbox > stack > .scrollbutton-down:not([disabled="true"]):hover:active {
-moz-image-region: rect(0, 44px, 14px, 33px);
}
.tabbrowser-arrowscrollbox > stack > .scrollbutton-down > .toolbarbutton-icon {
margin: 6px 0px 0px 1px;
}
/**
* All Tabs Button
*/
.tabs-alltabs-box {
margin-top: 2px;
margin-bottom: 4px;
width: 18px !important;
height: 23px !important;
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-end-bkgnd-enabled.png");
background-repeat: no-repeat;
background-color: -moz-dialog;
-moz-border-radius-topleft: 4px;
}
stack[chromedir="rtl"] > hbox > .tabs-alltabs-box {
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-start-bkgnd-enabled.png");
-moz-border-radius-topleft: 0px;
-moz-border-radius-topright: 4px;
}
.tabbrowser-tabs[overflow="true"] .tabs-alltabs-box {
background-image: url("chrome://browser/skin/tabbrowser/alltabs-box-overflow-end-bkgnd.png");
-moz-border-radius-topleft: 0px;
-moz-border-radius-topright: 0px;
}
.tabbrowser-tabs[overflow="true"] stack[chromedir="rtl"] > hbox > .tabs-alltabs-box {
background-image: url("chrome://browser/skin/tabbrowser/alltabs-box-overflow-start-bkgnd.png");
}
.tabs-alltabs-button {
-moz-appearance: none !important;
border: 0px !important;
margin-top: 2px;
margin-bottom: 4px;
width: 18px !important;
height: 23px !important;
border: 0px !important;
-moz-padding-start: 4px !important;
-moz-padding-end: 4px !important;
padding: 0px;
}
.tabs-alltabs-button > .toolbarbutton-text {
display: none;
}
.tabs-alltabs-button > .toolbarbutton-icon {
-moz-margin-end: 2px;
}
.tabs-alltabs-button > .toolbarbutton-menu-dropmarker {
margin-top: 3px !important;
}
.tabs-alltabs-button:hover {
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-end-bkgnd-hover.png");
background-repeat: no-repeat;
}
stack[chromedir="rtl"] > hbox > .tabs-alltabs-button:hover {
background-image: url("chrome://browser/skin/tabbrowser/tab-arrow-start-bkgnd-hover.png");
}
.tabbrowser-tabs[overflow="true"] .tabs-alltabs-button:hover {
background-image: url("chrome://browser/skin/tabbrowser/alltabs-box-overflow-end-bkgnd-hover.png");
}
.tabbrowser-tabs[overflow="true"] stack[chromedir="rtl"] > hbox > .tabs-alltabs-button:hover {
background-image: url("chrome://browser/skin/tabbrowser/alltabs-box-overflow-start-bkgnd-hover.png");
}
.tabs-alltabs-box-animate {
margin-top: 2px;
margin-bottom: 4px;
width: 18px !important;
height: 23px !important;
background-image: url("chrome://browser/skin/tabbrowser/alltabs-box-overflow-end-bkgnd-animate.png");
background-repeat: no-repeat;
opacity: 0.0;
}
stack[chromedir="rtl"] > hbox > .tabs-alltabs-box-animate {
background-image: url("chrome://browser/skin/tabbrowser/alltabs-box-overflow-start-bkgnd-animate.png");
}
/**
* All Tabs Menupopup
*/
.alltabs-item > .menu-iconic-left > .menu-iconic-icon {
list-style-image: url("chrome://global/skin/icons/folder-item.png");
-moz-image-region: rect(0px, 16px, 16px, 0px);
}
.alltabs-item[selected="true"] {
font-weight: bold;
}
.alltabs-item[busy] > .menu-iconic-left > .menu-iconic-icon {
list-style-image: url("chrome://global/skin/throbber/Throbber-small.gif");
opacity: 0.6;
}
.tabs-closebutton > .toolbarbutton-icon {
-moz-margin-end: 0px !important;
-moz-padding-end: 2px !important;

View File

@ -65,5 +65,31 @@ classic.jar:
#endif
skin/classic/browser/preferences/Options.png (preferences/Options.png)
skin/classic/browser/preferences/preferences.css (preferences/preferences.css)
skin/classic/browser/tabbrowser/alltabs-box-overflow-end-bkgnd.png (tabbrowser/alltabs-box-overflow-end-bkgnd.png)
skin/classic/browser/tabbrowser/alltabs-box-overflow-end-bkgnd-animate.png (tabbrowser/alltabs-box-overflow-end-bkgnd-animate.png)
skin/classic/browser/tabbrowser/alltabs-box-overflow-end-bkgnd-hover.png (tabbrowser/alltabs-box-overflow-end-bkgnd-hover.png)
skin/classic/browser/tabbrowser/alltabs-box-overflow-start-bkgnd.png (tabbrowser/alltabs-box-overflow-start-bkgnd.png)
skin/classic/browser/tabbrowser/alltabs-box-overflow-start-bkgnd-animate.png (tabbrowser/alltabs-box-overflow-start-bkgnd-animate.png)
skin/classic/browser/tabbrowser/alltabs-box-overflow-start-bkgnd-hover.png (tabbrowser/alltabs-box-overflow-start-bkgnd-hover.png)
skin/classic/browser/tabbrowser/tab-arrow-end.png (tabbrowser/tab-arrow-end.png)
skin/classic/browser/tabbrowser/tab-arrow-end-bkgnd-animate.png (tabbrowser/tab-arrow-end-bkgnd-animate.png)
skin/classic/browser/tabbrowser/tab-arrow-end-bkgnd-disabled.png (tabbrowser/tab-arrow-end-bkgnd-disabled.png)
skin/classic/browser/tabbrowser/tab-arrow-end-bkgnd-enabled.png (tabbrowser/tab-arrow-end-bkgnd-enabled.png)
skin/classic/browser/tabbrowser/tab-arrow-end-bkgnd-hover.png (tabbrowser/tab-arrow-end-bkgnd-hover.png)
skin/classic/browser/tabbrowser/tab-arrow-start.png (tabbrowser/tab-arrow-start.png)
skin/classic/browser/tabbrowser/tab-arrow-start-bkgnd-animate.png (tabbrowser/tab-arrow-start-bkgnd-animate.png)
skin/classic/browser/tabbrowser/tab-arrow-start-bkgnd-disabled.png (tabbrowser/tab-arrow-start-bkgnd-disabled.png)
skin/classic/browser/tabbrowser/tab-arrow-start-bkgnd-enabled.png (tabbrowser/tab-arrow-start-bkgnd-enabled.png)
skin/classic/browser/tabbrowser/tab-arrow-start-bkgnd-hover.png (tabbrowser/tab-arrow-start-bkgnd-hover.png)
skin/classic/browser/tabbrowser/tabbrowserBindings.xml (tabbrowser/tabbrowserBindings.xml)
skin/classic/browser/tabbrowser/tabbrowser-tabs-bkgnd.png (tabbrowser/tabbrowser-tabs-bkgnd.png)
skin/classic/browser/tabbrowser/tabDragIndicator.png (tabbrowser/tabDragIndicator.png)
skin/classic/browser/tabbrowser/tab-left.png (tabbrowser/tab-left.png)
skin/classic/browser/tabbrowser/tab-left-bkgnd.png (tabbrowser/tab-left-bkgnd.png)
skin/classic/browser/tabbrowser/tab-middle.png (tabbrowser/tab-middle.png)
skin/classic/browser/tabbrowser/tab-middle-bkgnd.png (tabbrowser/tab-middle-bkgnd.png)
skin/classic/browser/tabbrowser/tab-right.png (tabbrowser/tab-right.png)
skin/classic/browser/tabbrowser/tab-right-bkgnd.png (tabbrowser/tab-right-bkgnd.png)
skin/classic/browser/tabbrowser/tabstrip-bottom.png (tabbrowser/tabstrip-bottom.png)
icon.png
preview.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 469 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 475 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 408 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 614 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 B

Some files were not shown because too many files have changed in this diff Show More