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
|
@ -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 := .
|
||||
|
|
|
@ -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
|
||||
{
|
||||
/**
|
||||
|
@ -155,7 +155,16 @@ interface nsIAccessibleRetrieval : nsISupports
|
|||
* @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);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -50,6 +50,7 @@ REQUIRES = content \
|
|||
dom \
|
||||
editor \
|
||||
gfx \
|
||||
thebes \
|
||||
intl \
|
||||
layout \
|
||||
locale \
|
||||
|
|
|
@ -54,6 +54,7 @@ REQUIRES = appshell \
|
|||
dom \
|
||||
editor \
|
||||
gfx \
|
||||
thebes \
|
||||
intl \
|
||||
layout \
|
||||
locale \
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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.
|
||||
* Map nsIAccessibleEvents constants to strings. Used by
|
||||
* nsIAccessibleRetrieval::getStringEventType() method.
|
||||
*/
|
||||
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);
|
||||
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__ */
|
||||
|
|
|
@ -51,6 +51,7 @@ REQUIRES = content \
|
|||
dom \
|
||||
editor \
|
||||
gfx \
|
||||
thebes \
|
||||
intl \
|
||||
locale \
|
||||
string \
|
||||
|
|
|
@ -50,6 +50,7 @@ REQUIRES = content \
|
|||
dom \
|
||||
editor \
|
||||
gfx \
|
||||
thebes \
|
||||
htmlparser \
|
||||
intl \
|
||||
layout \
|
||||
|
|
|
@ -50,6 +50,7 @@ REQUIRES = content \
|
|||
dom \
|
||||
editor \
|
||||
gfx \
|
||||
thebes \
|
||||
htmlparser \
|
||||
intl \
|
||||
layout \
|
||||
|
|
|
@ -52,6 +52,7 @@ REQUIRES = content \
|
|||
dom \
|
||||
editor \
|
||||
gfx \
|
||||
thebes \
|
||||
intl \
|
||||
layout \
|
||||
locale \
|
||||
|
|
|
@ -52,6 +52,7 @@ REQUIRES = content \
|
|||
dom \
|
||||
editor \
|
||||
gfx \
|
||||
thebes \
|
||||
intl \
|
||||
layout \
|
||||
locale \
|
||||
|
|
|
@ -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)
|
||||
if (!mDOMNode)
|
||||
return NS_ERROR_FAILURE;
|
||||
node->GetParentNode(getter_AddRefs(parentNode));
|
||||
element = do_QueryInterface(parentNode);
|
||||
|
||||
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)
|
||||
|
|
|
@ -721,20 +721,36 @@ nsXULTreeitemAccessible::GetAttributesInternal(nsIPersistentProperties *aAttribu
|
|||
rv = view->GetLevel(mRow, &level);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
PRInt32 topCount = 1;
|
||||
for (PRInt32 index = mRow - 1; index >= 0; index--) {
|
||||
PRInt32 lvl = -1;
|
||||
PRInt32 startIndex = mRow;
|
||||
for (;startIndex - 1 > 0 &&
|
||||
NS_SUCCEEDED(view->GetLevel(startIndex - 1, &lvl)) && lvl != level;
|
||||
startIndex--);
|
||||
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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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, "", "");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 },
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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,21 +239,33 @@ 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 {
|
||||
if (this._itemType == Ci.nsINavBookmarksService.TYPE_BOOKMARK)
|
||||
this._microsummaries = this._mss.getMicrosummaries(this._uri, -1);
|
||||
}
|
||||
catch(ex) {
|
||||
|
@ -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,10 +339,8 @@ var gAddBookmarksPanel = {
|
|||
namePicker.setAttribute("droppable", "true");
|
||||
},
|
||||
|
||||
uninitPanel: function ABP_uninitPanel() {
|
||||
if (this._microsummaries)
|
||||
this._microsummaries.removeObserver(this);
|
||||
|
||||
uninitPanel: function EIO_uninitPanel(aHideCollapsibleElements) {
|
||||
if (aHideCollapsibleElements) {
|
||||
// hide the folder tree if it was previously visible
|
||||
if (!this._folderTree.collapsed)
|
||||
this.toggleFolderTreeVisibility();
|
||||
|
@ -323,40 +349,36 @@ var gAddBookmarksPanel = {
|
|||
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);
|
||||
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,33 +582,9 @@ var gAddBookmarksPanel = {
|
|||
Ci.nsIAnnotationService.EXPIRE_NEVER);
|
||||
},
|
||||
|
||||
accept: function ABP_accept() {
|
||||
this.saveItem();
|
||||
if (typeof(this._doneCallback) == "function")
|
||||
this._doneCallback();
|
||||
},
|
||||
|
||||
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() {
|
||||
_rebuildTagsSelectorList: function EIO__rebuildTagsSelectorList() {
|
||||
var tagsSelector = this._element("tagsSelector");
|
||||
var expander = this._element("tagsSelectorExpander");
|
||||
if (tagsSelector.collapsed) {
|
||||
expander.className = "expander-down";
|
||||
expander.setAttribute("tooltiptext",
|
||||
expander.getAttribute("tooltiptextdown"));
|
||||
|
||||
// rebuild the tag list
|
||||
while (tagsSelector.hasChildNodes())
|
||||
tagsSelector.removeChild(tagsSelector.lastChild);
|
||||
|
||||
|
@ -533,6 +599,17 @@ var gAddBookmarksPanel = {
|
|||
|
||||
tagsSelector.appendChild(elt);
|
||||
}
|
||||
},
|
||||
|
||||
toggleTagsSelector: function EIO_toggleTagsSelector() {
|
||||
var tagsSelector = this._element("tagsSelector");
|
||||
var expander = this._element("tagsSelectorExpander");
|
||||
if (!isElementVisible(tagsSelector)) {
|
||||
expander.className = "expander-down";
|
||||
expander.setAttribute("tooltiptext",
|
||||
expander.getAttribute("tooltiptextdown"));
|
||||
|
||||
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() { },
|
||||
};
|
||||
|
|
|
@ -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&group=3&excludeItems=1&excludeQueries=1&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>
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -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,20 +419,32 @@ 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");
|
||||
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
|
||||
,
|
||||
|
|
|
@ -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;"
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();"/>
|
||||
|
|
|
@ -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] || [];
|
||||
|
||||
|
|
|
@ -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 .............. */
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -348,3 +348,5 @@
|
|||
<!ENTITY spellAddDictionaries.label "Add dictionaries...">
|
||||
<!ENTITY spellAddDictionaries.accesskey "A">
|
||||
|
||||
<!ENTITY editBookmark.done.label "Done">
|
||||
<!ENTITY editBookmark.delete.label "Delete">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -197,6 +197,8 @@
|
|||
|
||||
<!ENTITY col.title.label
|
||||
"Name">
|
||||
<!ENTITY col.tags.label
|
||||
"Tags">
|
||||
<!ENTITY col.url.label
|
||||
"Location">
|
||||
<!ENTITY col.lastvisit.label
|
||||
|
|
|
@ -40,7 +40,7 @@ languageCodeFormat=%1$S [%2$S]
|
|||
#### Downloads
|
||||
|
||||
desktopFolderName=Desktop
|
||||
myDownloadsFolderName=My Downloads
|
||||
downloadsFolderName=Downloads
|
||||
chooseDownloadFolderTitle=Choose Download Folder:
|
||||
|
||||
#### Download Actions
|
||||
|
|
|
@ -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">
|
|
@ -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
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Двоичные данные
browser/themes/pinstripe/browser/places/starPage.png
До Ширина: | Высота: | Размер: 3.0 KiB После Ширина: | Высота: | Размер: 3.1 KiB |
После Ширина: | Высота: | Размер: 447 B |
Двоичные данные
browser/themes/pinstripe/browser/tabbrowser/alltabs-box-overflow-bkgnd-animate.png
Executable file
После Ширина: | Высота: | Размер: 600 B |
Двоичные данные
browser/themes/pinstripe/browser/tabbrowser/alltabs-box-overflow-bkgnd.png
Normal file
После Ширина: | Высота: | Размер: 302 B |
Двоичные данные
browser/themes/pinstripe/browser/tabbrowser/tab-arrow-end-bkgnd-animate.png
Executable file
После Ширина: | Высота: | Размер: 654 B |
После Ширина: | Высота: | Размер: 429 B |
После Ширина: | Высота: | Размер: 404 B |
Двоичные данные
browser/themes/pinstripe/browser/tabbrowser/tab-arrow-start-bkgnd-animate.png
Executable file
После Ширина: | Высота: | Размер: 693 B |
Двоичные данные
browser/themes/pinstripe/browser/tabbrowser/tab-arrow-start-bkgnd.png
Executable file
После Ширина: | Высота: | Размер: 421 B |
После Ширина: | Высота: | Размер: 472 B |
После Ширина: | Высота: | Размер: 327 B |
После Ширина: | Высота: | Размер: 342 B |
После Ширина: | Высота: | Размер: 417 B |
После Ширина: | Высота: | Размер: 192 B |
После Ширина: | Высота: | Размер: 185 B |
После Ширина: | Высота: | Размер: 175 B |
После Ширина: | Высота: | Размер: 333 B |
После Ширина: | Высота: | Размер: 343 B |
После Ширина: | Высота: | Размер: 420 B |
После Ширина: | Высота: | Размер: 347 B |
После Ширина: | Высота: | Размер: 193 B |
|
@ -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>
|
После Ширина: | Высота: | Размер: 129 B |
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Двоичные данные
browser/themes/winstripe/browser/places/starPage.png
До Ширина: | Высота: | Размер: 3.0 KiB После Ширина: | Высота: | Размер: 3.1 KiB |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/alltabs-box-overflow-end-bkgnd-animate.png
Executable file
После Ширина: | Высота: | Размер: 429 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/alltabs-box-overflow-end-bkgnd-hover.png
Executable file
После Ширина: | Высота: | Размер: 469 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/alltabs-box-overflow-end-bkgnd.png
Executable file
После Ширина: | Высота: | Размер: 319 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/alltabs-box-overflow-start-bkgnd-animate.png
Executable file
После Ширина: | Высота: | Размер: 478 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/alltabs-box-overflow-start-bkgnd-hover.png
Executable file
После Ширина: | Высота: | Размер: 475 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/alltabs-box-overflow-start-bkgnd.png
Executable file
После Ширина: | Высота: | Размер: 319 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/tab-arrow-end-bkgnd-animate.png
Executable file
После Ширина: | Высота: | Размер: 445 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/tab-arrow-end-bkgnd-disabled.png
Executable file
После Ширина: | Высота: | Размер: 411 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/tab-arrow-end-bkgnd-enabled.png
Executable file
После Ширина: | Высота: | Размер: 355 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/tab-arrow-end-bkgnd-hover.png
Executable file
После Ширина: | Высота: | Размер: 503 B |
После Ширина: | Высота: | Размер: 255 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/tab-arrow-start-bkgnd-animate.png
Executable file
После Ширина: | Высота: | Размер: 518 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/tab-arrow-start-bkgnd-disabled.png
Executable file
После Ширина: | Высота: | Размер: 408 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/tab-arrow-start-bkgnd-enabled.png
Executable file
После Ширина: | Высота: | Размер: 361 B |
Двоичные данные
browser/themes/winstripe/browser/tabbrowser/tab-arrow-start-bkgnd-hover.png
Executable file
После Ширина: | Высота: | Размер: 512 B |
После Ширина: | Высота: | Размер: 277 B |
После Ширина: | Высота: | Размер: 378 B |
После Ширина: | Высота: | Размер: 614 B |
После Ширина: | Высота: | Размер: 217 B |
После Ширина: | Высота: | Размер: 212 B |
После Ширина: | Высота: | Размер: 390 B |
После Ширина: | Высота: | Размер: 606 B |
После Ширина: | Высота: | Размер: 515 B |