Merge cvs-trunk-mirror to mozilla-central.
--HG-- rename : js/src/js.c => js/src/js.cpp rename : js/src/jsapi.c => js/src/jsapi.cpp rename : js/src/jsemit.c => js/src/jsemit.cpp rename : js/src/jsfun.c => js/src/jsfun.cpp rename : js/src/jsinterp.c => js/src/jsinterp.cpp rename : js/src/jsobj.c => js/src/jsobj.cpp rename : js/src/jsparse.c => js/src/jsparse.cpp rename : js/src/jsregexp.c => js/src/jsregexp.cpp rename : js/src/jsxml.c => js/src/jsxml.cpp
@ -47,7 +47,7 @@ interface nsIAccessible;
|
||||
* A cross-platform interface that supports hyperlink-specific properties and
|
||||
* methods. Anchors, image maps, xul:labels with class="text-link" implement this interface.
|
||||
*/
|
||||
[scriptable, uuid(fe1dd8c0-d50a-4634-b51d-2b20bfb1e231)]
|
||||
[scriptable, uuid(38c60bfa-6040-4bfe-93f2-acd6a909bb60)]
|
||||
interface nsIAccessibleHyperLink : nsISupports
|
||||
{
|
||||
/**
|
||||
@ -87,7 +87,7 @@ interface nsIAccessibleHyperLink : nsISupports
|
||||
* This anchor is, for example, the visible output of the html:a tag.
|
||||
* With an Image Map, reflects the actual areas within the map.
|
||||
*/
|
||||
readonly attribute long anchorsCount;
|
||||
readonly attribute long anchorCount;
|
||||
|
||||
/**
|
||||
* Returns the URI at the given index.
|
||||
|
@ -42,16 +42,38 @@
|
||||
#include "nsISupports.idl"
|
||||
#include "nsIAccessibleHyperLink.idl"
|
||||
|
||||
[scriptable, uuid(dec56474-2887-4d44-9826-1594cfe4a2f4)]
|
||||
/**
|
||||
* A cross-platform interface that deals with text which contains hyperlinks.
|
||||
*/
|
||||
|
||||
[scriptable, uuid(d56bd454-8ff3-4edc-b266-baeada00267b)]
|
||||
interface nsIAccessibleHyperText : nsISupports
|
||||
{
|
||||
readonly attribute long links;
|
||||
|
||||
nsIAccessibleHyperLink getLink (in long index);
|
||||
/**
|
||||
* Returns the number of links contained within this hypertext object.
|
||||
*/
|
||||
readonly attribute long linkCount;
|
||||
|
||||
/*
|
||||
* Return the link index at this character index.
|
||||
* Return value of -1 indicates no link at that index.
|
||||
* Returns the link index at the given character index.
|
||||
* Each link is an embedded object representing exactly 1 character within
|
||||
* the hypertext.
|
||||
*
|
||||
* @param charIndex the 0-based character index.
|
||||
*
|
||||
* @returns long 0-based link's index.
|
||||
* A return value of -1 indicates no link is present at that index.
|
||||
*/
|
||||
long getLinkIndex (in long charIndex);
|
||||
long getLinkIndex(in long charIndex);
|
||||
|
||||
/**
|
||||
* Retrieves the nsIAccessibleHyperLink object at the given link index.
|
||||
*
|
||||
* @param linkIndex 0-based index of the link that is to be retrieved.
|
||||
* This can be retrieved via getLinkIndex (see above).
|
||||
*
|
||||
* @returns nsIAccessibleHyperLink Object representing the link properties
|
||||
* or NS_ERROR_INVALID_ARG if there is no link at that index.
|
||||
*/
|
||||
nsIAccessibleHyperLink getLink(in long linkIndex);
|
||||
};
|
||||
|
@ -44,7 +44,7 @@
|
||||
* @note - When adding a new role, be sure to also add it to nsRoleMap.h for
|
||||
* each platform.
|
||||
*/
|
||||
[scriptable, uuid(31685b85-36a3-448c-99ed-b034a198e303)]
|
||||
[scriptable, uuid(8c0f68f8-164a-4078-a9ee-36a7d180f0e4)]
|
||||
interface nsIAccessibleRole : nsISupports
|
||||
{
|
||||
/**
|
||||
@ -392,7 +392,8 @@ interface nsIAccessibleRole : nsISupports
|
||||
const unsigned long ROLE_ANIMATION = 54;
|
||||
|
||||
/**
|
||||
* Represents a mathematical equation. It is used by MATHML.
|
||||
* Represents a mathematical equation. It is used by MATHML, where there is a
|
||||
* rich DOM subtree for an equation. Use ROLE_FLAT_EQUATION for <img role="math" alt="[TeX]"/>
|
||||
*/
|
||||
const unsigned long ROLE_EQUATION = 55;
|
||||
|
||||
@ -763,10 +764,15 @@ interface nsIAccessibleRole : nsISupports
|
||||
*/
|
||||
const unsigned long ROLE_LISTBOX = 119;
|
||||
|
||||
/**
|
||||
* Represents a mathematical equation in the accessible name
|
||||
*/
|
||||
const unsigned long ROLE_FLAT_EQUATION = 120;
|
||||
|
||||
/**
|
||||
* It's not role actually. This contanst is important to help ensure
|
||||
* nsRoleMap's are synchronized.
|
||||
*/
|
||||
const unsigned long ROLE_LAST_ENTRY = 120;
|
||||
const unsigned long ROLE_LAST_ENTRY = 121;
|
||||
};
|
||||
|
||||
|
@ -873,7 +873,7 @@ getChildCountCB(AtkObject *aAtkObj)
|
||||
accWrap->QueryInterface(NS_GET_IID(nsIAccessibleHyperText), getter_AddRefs(hyperText));
|
||||
if (hyperText) {
|
||||
// If HyperText, then number of links matches number of children
|
||||
hyperText->GetLinks(&count);
|
||||
hyperText->GetLinkCount(&count);
|
||||
}
|
||||
else {
|
||||
nsCOMPtr<nsIAccessibleText> accText;
|
||||
|
@ -286,7 +286,7 @@ getAnchorCountCB(AtkHyperlink *aLink)
|
||||
NS_ENSURE_TRUE(accHyperlink, -1);
|
||||
|
||||
PRInt32 count = -1;
|
||||
nsresult rv = accHyperlink->GetAnchorsCount(&count);
|
||||
nsresult rv = accHyperlink->GetAnchorCount(&count);
|
||||
return (NS_FAILED(rv)) ? -1 : static_cast<gint>(count);
|
||||
}
|
||||
|
||||
|
@ -92,7 +92,7 @@ getLinkCountCB(AtkHypertext *aText)
|
||||
NS_ENSURE_TRUE(hyperText, -1);
|
||||
|
||||
PRInt32 count = -1;
|
||||
nsresult rv = hyperText->GetLinks(&count);
|
||||
nsresult rv = hyperText->GetLinkCount(&count);
|
||||
NS_ENSURE_SUCCESS(rv, -1);
|
||||
|
||||
return count;
|
||||
|
@ -166,6 +166,7 @@ static const PRUint32 atkRoleMap[] = {
|
||||
ATK_ROLE_LIST_ITEM, // nsIAccessibleRole::ROLE_OPTION 117
|
||||
ATK_ROLE_LIST_ITEM, // nsIAccessibleRole::ROLE_RICH_OPTION 118
|
||||
ATK_ROLE_LIST, // nsIAccessibleRole::ROLE_LISTBOX 119
|
||||
ATK_ROLE_UNKNOWN, // nsIAccessibleRole::ROLE_FLAT_EQUATION 120
|
||||
kROLE_ATK_LAST_ENTRY // nsIAccessibleRole::ROLE_LAST_ENTRY
|
||||
};
|
||||
|
||||
|
@ -68,7 +68,7 @@ NS_IMETHODIMP nsXULTreeAccessibleWrap::GetChildCount(PRInt32 *aAccChildCount)
|
||||
// created and appended by XUL tree accessible implementation
|
||||
PRInt32 rowCount, colCount = 1;
|
||||
mTreeView->GetRowCount(&rowCount);
|
||||
mFirstChild->GetChildCount(&colCount);
|
||||
GetColumns(&colCount);
|
||||
|
||||
*aAccChildCount += rowCount * colCount;
|
||||
}
|
||||
@ -87,33 +87,21 @@ NS_IMETHODIMP nsXULTreeAccessibleWrap::GetSummary(nsAString &aSummary)
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsXULTreeAccessibleWrap::GetColumns(PRInt32 *aColumns)
|
||||
NS_IMETHODIMP nsXULTreeAccessibleWrap::GetColumns(PRInt32 *aColumnCount)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
NS_ENSURE_ARG_POINTER(aColumnCount);
|
||||
*aColumnCount = 0;
|
||||
|
||||
nsCOMPtr<nsIAccessible> acc;
|
||||
rv = nsAccessible::GetFirstChild(getter_AddRefs(acc));
|
||||
NS_ENSURE_TRUE(acc, NS_ERROR_FAILURE);
|
||||
nsCOMPtr<nsITreeColumn> column;
|
||||
column = GetFirstVisibleColumn(mTree);
|
||||
if (!column)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
rv = acc->GetChildCount(aColumns);
|
||||
do {
|
||||
(*aColumnCount)++;
|
||||
} while ((column = GetNextVisibleColumn(column)));
|
||||
|
||||
// The last child could be column picker. In that case, we need to minus the
|
||||
// number of columns by 1
|
||||
nsCOMPtr<nsIAccessible> lastChildAccessible;
|
||||
acc->GetLastChild(getter_AddRefs(lastChildAccessible));
|
||||
nsCOMPtr<nsIAccessNode> accessNode = do_QueryInterface(lastChildAccessible);
|
||||
NS_ENSURE_TRUE(accessNode, NS_ERROR_FAILURE);
|
||||
nsCOMPtr<nsIDOMNode> domNode;
|
||||
accessNode->GetDOMNode(getter_AddRefs(domNode));
|
||||
nsCOMPtr<nsIContent> content = do_QueryInterface(domNode);
|
||||
NS_ENSURE_TRUE(content, NS_ERROR_FAILURE);
|
||||
// it's menupopup inside column picker
|
||||
if (content->NodeInfo()->Equals(nsAccessibilityAtoms::menupopup,
|
||||
kNameSpaceID_XUL)) {
|
||||
(*aColumns)--;
|
||||
}
|
||||
|
||||
return *aColumns > 0 ? rv : NS_ERROR_FAILURE;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsXULTreeAccessibleWrap::GetColumnHeader(nsIAccessibleTable **aColumnHeader)
|
||||
@ -278,10 +266,11 @@ NS_IMETHODIMP nsXULTreeAccessibleWrap::GetIndexAt(PRInt32 aRow, PRInt32 aColumn,
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsXULTreeAccessibleWrap::GetColumnAtIndex(PRInt32 aIndex, PRInt32 *_retval)
|
||||
NS_IMETHODIMP nsXULTreeAccessibleWrap::GetColumnAtIndex(PRInt32 aIndex, PRInt32 *aColumn)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(_retval);
|
||||
NS_ENSURE_ARG_POINTER(aColumn);
|
||||
|
||||
*aColumn = -1;
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
PRInt32 columns;
|
||||
@ -291,15 +280,18 @@ NS_IMETHODIMP nsXULTreeAccessibleWrap::GetColumnAtIndex(PRInt32 aIndex, PRInt32
|
||||
PRInt32 treeCols;
|
||||
nsAccessible::GetChildCount(&treeCols);
|
||||
|
||||
*_retval = (aIndex - treeCols) % columns;
|
||||
if (aIndex >= treeCols) {
|
||||
*aColumn = (aIndex - treeCols) % columns;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsXULTreeAccessibleWrap::GetRowAtIndex(PRInt32 aIndex, PRInt32 *_retval)
|
||||
NS_IMETHODIMP nsXULTreeAccessibleWrap::GetRowAtIndex(PRInt32 aIndex, PRInt32 *aRow)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(_retval);
|
||||
NS_ENSURE_ARG_POINTER(aRow);
|
||||
|
||||
*aRow = -1;
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
PRInt32 columns;
|
||||
@ -309,7 +301,9 @@ NS_IMETHODIMP nsXULTreeAccessibleWrap::GetRowAtIndex(PRInt32 aIndex, PRInt32 *_r
|
||||
PRInt32 treeCols;
|
||||
nsAccessible::GetChildCount(&treeCols);
|
||||
|
||||
*_retval = (aIndex - treeCols) / columns;
|
||||
if (aIndex >= treeCols) {
|
||||
*aRow = (aIndex - treeCols) / columns;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -107,6 +107,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
|
||||
{&nsAccessibilityAtoms::aria_checked, kBoolState, nsIAccessibleStates::STATE_CHECKED | nsIAccessibleStates::STATE_CHECKABLE},
|
||||
{&nsAccessibilityAtoms::aria_checked, "mixed", nsIAccessibleStates::STATE_MIXED | nsIAccessibleStates::STATE_CHECKABLE},
|
||||
{&nsAccessibilityAtoms::aria_checked, "false", nsIAccessibleStates::STATE_CHECKABLE}, kEndEntry},
|
||||
{"math", nsIAccessibleRole::ROLE_FLAT_EQUATION, eNameLabelOrTitle, eNoValue, kNoReqStates, kEndEntry},
|
||||
{"menu", nsIAccessibleRole::ROLE_MENUPOPUP, eNameLabelOrTitle, eNoValue, kNoReqStates, kEndEntry},
|
||||
{"menubar", nsIAccessibleRole::ROLE_MENUBAR, eNameLabelOrTitle, eNoValue, kNoReqStates, kEndEntry},
|
||||
{"menuitem", nsIAccessibleRole::ROLE_MENUITEM, eNameOkFromChildren, eNoValue, kNoReqStates,
|
||||
|
@ -231,12 +231,13 @@ ACCESSIBILITY_ATOM(aria_valuetext, "aria-valuetext")
|
||||
ACCESSIBILITY_ATOM(defaultLabel, "defaultLabel")
|
||||
|
||||
// Object attributes
|
||||
ACCESSIBILITY_ATOM(level, "level")
|
||||
ACCESSIBILITY_ATOM(posinset, "posinset")
|
||||
ACCESSIBILITY_ATOM(setsize, "setsize")
|
||||
ACCESSIBILITY_ATOM(lineNumber, "line-number")
|
||||
ACCESSIBILITY_ATOM(containerRelevant, "container-relevant")
|
||||
ACCESSIBILITY_ATOM(containerLive, "container-live")
|
||||
ACCESSIBILITY_ATOM(containerChannel, "container-channel")
|
||||
ACCESSIBILITY_ATOM(cellIndex, "cell-index")
|
||||
ACCESSIBILITY_ATOM(containerAtomic, "container-atomic")
|
||||
ACCESSIBILITY_ATOM(containerBusy, "container-busy")
|
||||
ACCESSIBILITY_ATOM(containerChannel, "container-channel")
|
||||
ACCESSIBILITY_ATOM(containerLive, "container-live")
|
||||
ACCESSIBILITY_ATOM(containerRelevant, "container-relevant")
|
||||
ACCESSIBILITY_ATOM(level, "level")
|
||||
ACCESSIBILITY_ATOM(lineNumber, "line-number")
|
||||
ACCESSIBILITY_ATOM(posinset, "posinset")
|
||||
ACCESSIBILITY_ATOM(setsize, "setsize")
|
||||
|
@ -1576,7 +1576,7 @@ NS_IMETHODIMP nsAccessibilityService::GetAccessible(nsIDOMNode *aNode,
|
||||
// We don't do this for <body>, <html>, <window>, <dialog> etc. which
|
||||
// correspond to the doc accessible and will be created in any case
|
||||
if (!newAcc && content->Tag() != nsAccessibilityAtoms::body && content->GetParent() &&
|
||||
(content->IsFocusable() ||
|
||||
(frame->IsFocusable() ||
|
||||
(isHTML && nsAccUtils::HasListener(content, NS_LITERAL_STRING("click"))) ||
|
||||
HasUniversalAriaProperty(content, aWeakShell) || roleMapEntry ||
|
||||
HasRelatedContent(content) || nsAccUtils::IsXLink(content))) {
|
||||
|
@ -269,8 +269,8 @@ static const char kRoleNames[][20] = {
|
||||
"image map", //ROLE_IMAGE_MAP
|
||||
"listbox option", //ROLE_OPTION
|
||||
"listbox rich option", //ROLE_RICH_OPTION
|
||||
"listbox" //ROLE_LISTBOX
|
||||
|
||||
"listbox", //ROLE_LISTBOX
|
||||
"flat equation" //ROLE_FLAT_EQUATION
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -2056,6 +2056,9 @@ nsAccessible::GetAttributes(nsIPersistentProperties **aAttributes)
|
||||
role == nsIAccessibleRole::ROLE_PUSHBUTTON ||
|
||||
role == nsIAccessibleRole::ROLE_MENUITEM ||
|
||||
role == nsIAccessibleRole::ROLE_LISTITEM ||
|
||||
role == nsIAccessibleRole::ROLE_OPTION ||
|
||||
role == nsIAccessibleRole::ROLE_RADIOBUTTON ||
|
||||
role == nsIAccessibleRole::ROLE_RICH_OPTION ||
|
||||
role == nsIAccessibleRole::ROLE_OUTLINEITEM ||
|
||||
content->HasAttr(kNameSpaceID_None, nsAccessibilityAtoms::aria_checked)) {
|
||||
// Might be checkable -- checking role & ARIA attribute first is faster than getting state
|
||||
@ -2080,6 +2083,8 @@ nsAccessible::GetAttributes(nsIPersistentProperties **aAttributes)
|
||||
role == nsIAccessibleRole::ROLE_MENUITEM ||
|
||||
role == nsIAccessibleRole::ROLE_RADIOBUTTON ||
|
||||
role == nsIAccessibleRole::ROLE_PAGETAB ||
|
||||
role == nsIAccessibleRole::ROLE_OPTION ||
|
||||
role == nsIAccessibleRole::ROLE_RADIOBUTTON ||
|
||||
role == nsIAccessibleRole::ROLE_OUTLINEITEM) &&
|
||||
0 == (State(this) & nsIAccessibleStates::STATE_INVISIBLE)) {
|
||||
nsCOMPtr<nsIAccessible> parent = GetParent();
|
||||
@ -3259,12 +3264,12 @@ NS_IMETHODIMP nsAccessible::SelectAllSelection(PRBool *_retval)
|
||||
// nsIAccessibleHyperLink, which helps determine where it is located
|
||||
// within containing text
|
||||
|
||||
// readonly attribute long nsIAccessibleHyperLink::anchorsCount
|
||||
// readonly attribute long nsIAccessibleHyperLink::anchorCount
|
||||
NS_IMETHODIMP
|
||||
nsAccessible::GetAnchorsCount(PRInt32 *aAnchorsCount)
|
||||
nsAccessible::GetAnchorCount(PRInt32 *aAnchorCount)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aAnchorsCount);
|
||||
*aAnchorsCount = 1;
|
||||
NS_ENSURE_ARG_POINTER(aAnchorCount);
|
||||
*aAnchorCount = 1;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@ -3523,6 +3528,7 @@ PRBool nsAccessible::MustPrune(nsIAccessible *aAccessible)
|
||||
role == nsIAccessibleRole::ROLE_COMBOBOX_OPTION ||
|
||||
role == nsIAccessibleRole::ROLE_OPTION ||
|
||||
role == nsIAccessibleRole::ROLE_ENTRY ||
|
||||
role == nsIAccessibleRole::ROLE_FLAT_EQUATION ||
|
||||
role == nsIAccessibleRole::ROLE_PASSWORD_TEXT ||
|
||||
role == nsIAccessibleRole::ROLE_PUSHBUTTON ||
|
||||
role == nsIAccessibleRole::ROLE_TOGGLE_BUTTON ||
|
||||
|
@ -159,7 +159,10 @@ NS_IMETHODIMP nsDocAccessible::GetName(nsAString& aName)
|
||||
rv = nsAccessible::GetName(aName); // Allow name via aria-labelledby or title attribute
|
||||
}
|
||||
if (aName.IsEmpty()) {
|
||||
rv = GetTitle(aName); // Finally try title element
|
||||
rv = GetTitle(aName); // Try title element
|
||||
}
|
||||
if (aName.IsEmpty()) { // Last resort: use URL
|
||||
rv = GetURL(aName);
|
||||
}
|
||||
|
||||
return rv;
|
||||
|
@ -52,25 +52,6 @@ nsOuterDocAccessible::nsOuterDocAccessible(nsIDOMNode* aNode,
|
||||
{
|
||||
}
|
||||
|
||||
/* attribute wstring accName; */
|
||||
NS_IMETHODIMP nsOuterDocAccessible::GetName(nsAString& aName)
|
||||
{
|
||||
nsCOMPtr<nsIAccessible> accessible;
|
||||
GetFirstChild(getter_AddRefs(accessible));
|
||||
nsCOMPtr<nsIAccessibleDocument> accDoc(do_QueryInterface(accessible));
|
||||
if (!accDoc) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
nsresult rv = accDoc->GetTitle(aName);
|
||||
if (NS_FAILED(rv) || aName.IsEmpty()) {
|
||||
rv = nsAccessible::GetName(aName);
|
||||
if (aName.IsEmpty()) {
|
||||
rv = accDoc->GetURL(aName);
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
/* unsigned long getRole (); */
|
||||
NS_IMETHODIMP nsOuterDocAccessible::GetRole(PRUint32 *aRole)
|
||||
{
|
||||
|
@ -52,7 +52,6 @@ class nsOuterDocAccessible : public nsAccessibleWrap
|
||||
nsOuterDocAccessible(nsIDOMNode* aNode,
|
||||
nsIWeakReference* aShell);
|
||||
|
||||
NS_IMETHOD GetName(nsAString& aName);
|
||||
NS_IMETHOD GetRole(PRUint32 *aRole);
|
||||
NS_IMETHOD GetState(PRUint32 *aState, PRUint32 *aExtraState);
|
||||
NS_IMETHOD GetChildAtPoint(PRInt32 aX, PRInt32 aY,
|
||||
|
@ -649,7 +649,7 @@ nsresult nsRootAccessible::HandleEventWithTarget(nsIDOMEvent* aEvent,
|
||||
nsCOMPtr<nsIContent> treeContent = do_QueryInterface(aTargetNode);
|
||||
nsAccEvent::PrepareForEvent(aTargetNode, PR_TRUE);
|
||||
return accService->InvalidateSubtreeFor(eventShell, treeContent,
|
||||
nsIAccessibleEvent::EVENT_ASYNCH_SIGNIFICANT_CHANGE);
|
||||
nsIAccessibleEvent::EVENT_DOM_SIGNIFICANT_CHANGE);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -226,14 +226,14 @@ NS_IMETHODIMP nsHTMLImageAccessible::DoAction(PRUint8 index)
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// nsIAccessibleHyperLink
|
||||
NS_IMETHODIMP
|
||||
nsHTMLImageAccessible::GetAnchorsCount(PRInt32 *aAnchors)
|
||||
nsHTMLImageAccessible::GetAnchorCount(PRInt32 *aAnchorCount)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aAnchors);
|
||||
NS_ENSURE_ARG_POINTER(aAnchorCount);
|
||||
|
||||
if (!mMapElement)
|
||||
return nsLinkableAccessible::GetAnchorsCount(aAnchors);
|
||||
return nsLinkableAccessible::GetAnchorCount(aAnchorCount);
|
||||
|
||||
return GetChildCount(aAnchors);
|
||||
return GetChildCount(aAnchorCount);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -67,7 +67,7 @@ public:
|
||||
NS_IMETHOD DoAction(PRUint8 index);
|
||||
|
||||
// nsIAccessibleHyperLink
|
||||
NS_IMETHOD GetAnchorsCount(PRInt32 *aAnchors);
|
||||
NS_IMETHOD GetAnchorCount(PRInt32 *aAnchorCount);
|
||||
NS_IMETHOD GetURI(PRInt32 aIndex, nsIURI **aURI);
|
||||
NS_IMETHOD GetAnchor(PRInt32 aIndex, nsIAccessible **aAccessible);
|
||||
|
||||
|
@ -60,6 +60,8 @@
|
||||
#include "nsITableCellLayout.h"
|
||||
#include "nsLayoutErrors.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// nsHTMLTableCellAccessible
|
||||
|
||||
NS_IMPL_ISUPPORTS_INHERITED0(nsHTMLTableCellAccessible, nsHyperTextAccessible)
|
||||
|
||||
@ -75,6 +77,66 @@ NS_IMETHODIMP nsHTMLTableCellAccessible::GetRole(PRUint32 *aResult)
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsHTMLTableCellAccessible::GetAttributesInternal(nsIPersistentProperties *aAttributes)
|
||||
{
|
||||
if (IsDefunct())
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
nsresult rv = nsHyperTextAccessibleWrap::GetAttributesInternal(aAttributes);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsIContent> content(do_QueryInterface(mDOMNode));
|
||||
|
||||
nsCOMPtr<nsIPresShell> shell = GetPresShell();
|
||||
NS_ENSURE_STATE(shell);
|
||||
|
||||
nsIFrame *frame = shell->GetPrimaryFrameFor(content);
|
||||
nsITableCellLayout *cellLayout = nsnull;
|
||||
CallQueryInterface(frame, &cellLayout);
|
||||
NS_ENSURE_STATE(cellLayout);
|
||||
|
||||
PRInt32 rowIdx = -1, cellIdx = -1;
|
||||
rv = cellLayout->GetCellIndexes(rowIdx, cellIdx);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsIAccessible> childAcc(this);
|
||||
|
||||
nsCOMPtr<nsIAccessible> parentAcc;
|
||||
rv = childAcc->GetParent(getter_AddRefs(parentAcc));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
while (parentAcc) {
|
||||
if (Role(parentAcc) == nsIAccessibleRole::ROLE_TABLE) {
|
||||
// Table accessible must implement nsIAccessibleTable interface but if
|
||||
// it isn't happen (for example because of ARIA usage) we shouldn't fail
|
||||
// on getting other attributes.
|
||||
nsCOMPtr<nsIAccessibleTable> tableAcc(do_QueryInterface(parentAcc));
|
||||
if (!tableAcc)
|
||||
return NS_OK;
|
||||
|
||||
PRInt32 idx = -1;
|
||||
rv = tableAcc->GetIndexAt(rowIdx, cellIdx, &idx);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsAutoString stringIdx;
|
||||
stringIdx.AppendInt(idx);
|
||||
nsAccUtils::SetAccAttr(aAttributes, nsAccessibilityAtoms::cellIndex,
|
||||
stringIdx);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
parentAcc.swap(childAcc);
|
||||
rv = childAcc->GetParent(getter_AddRefs(parentAcc));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// nsHTMLTableAccessible
|
||||
|
||||
NS_IMPL_ISUPPORTS_INHERITED1(nsHTMLTableAccessible, nsAccessible, nsIAccessibleTable)
|
||||
|
||||
nsHTMLTableAccessible::nsHTMLTableAccessible(nsIDOMNode* aDomNode, nsIWeakReference* aShell):
|
||||
|
@ -45,10 +45,15 @@
|
||||
class nsHTMLTableCellAccessible : public nsHyperTextAccessibleWrap
|
||||
{
|
||||
public:
|
||||
nsHTMLTableCellAccessible(nsIDOMNode* aDomNode, nsIWeakReference* aShell);
|
||||
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
|
||||
nsHTMLTableCellAccessible(nsIDOMNode* aDomNode, nsIWeakReference* aShell);
|
||||
NS_IMETHOD GetRole(PRUint32 *aResult);
|
||||
// nsIAccessible
|
||||
NS_IMETHOD GetRole(PRUint32 *aRole);
|
||||
|
||||
// nsAccessible
|
||||
virtual nsresult GetAttributesInternal(nsIPersistentProperties *aAttributes);
|
||||
};
|
||||
|
||||
class nsITableLayout;
|
||||
|
@ -1271,9 +1271,11 @@ nsHyperTextAccessible::GetOffsetAtPoint(PRInt32 aX, PRInt32 aY,
|
||||
}
|
||||
|
||||
// ------- nsIAccessibleHyperText ---------------
|
||||
NS_IMETHODIMP nsHyperTextAccessible::GetLinks(PRInt32 *aLinks)
|
||||
NS_IMETHODIMP
|
||||
nsHyperTextAccessible::GetLinkCount(PRInt32 *aLinkCount)
|
||||
{
|
||||
*aLinks = 0;
|
||||
NS_ENSURE_ARG_POINTER(aLinkCount);
|
||||
*aLinkCount = 0;
|
||||
if (!mDOMNode) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
@ -1282,7 +1284,7 @@ NS_IMETHODIMP nsHyperTextAccessible::GetLinks(PRInt32 *aLinks)
|
||||
|
||||
while (NextChild(accessible)) {
|
||||
if (IsEmbeddedObject(accessible)) {
|
||||
++*aLinks;
|
||||
++*aLinkCount;
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
@ -1290,7 +1292,7 @@ NS_IMETHODIMP nsHyperTextAccessible::GetLinks(PRInt32 *aLinks)
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsHyperTextAccessible::GetLink(PRInt32 aIndex, nsIAccessibleHyperLink **aLink)
|
||||
nsHyperTextAccessible::GetLink(PRInt32 aLinkIndex, nsIAccessibleHyperLink **aLink)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aLink);
|
||||
*aLink = nsnull;
|
||||
@ -1298,17 +1300,20 @@ nsHyperTextAccessible::GetLink(PRInt32 aIndex, nsIAccessibleHyperLink **aLink)
|
||||
if (IsDefunct())
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
PRInt32 linkIndex = aLinkIndex;
|
||||
nsCOMPtr<nsIAccessible> accessible;
|
||||
while (NextChild(accessible)) {
|
||||
if (IsEmbeddedObject(accessible) && aIndex-- == 0)
|
||||
if (IsEmbeddedObject(accessible) && linkIndex-- == 0)
|
||||
return CallQueryInterface(accessible, aLink);
|
||||
}
|
||||
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsHyperTextAccessible::GetLinkIndex(PRInt32 aCharIndex, PRInt32 *aLinkIndex)
|
||||
NS_IMETHODIMP
|
||||
nsHyperTextAccessible::GetLinkIndex(PRInt32 aCharIndex, PRInt32 *aLinkIndex)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aLinkIndex);
|
||||
*aLinkIndex = -1; // API says this magic value means 'not found'
|
||||
|
||||
PRInt32 characterCount = 0;
|
||||
|
@ -162,5 +162,6 @@ static const NSString* AXRoles [] = {
|
||||
NSAccessibilityRowRole, // ROLE_OPTION
|
||||
NSAccessibilityRowRole, // ROLE_RICH_OPTION
|
||||
NSAccessibilityListRole, // ROLE_LISTBOX
|
||||
NSAccessibilityUnknownRole, // ROLE_FLAT_EQUATION
|
||||
@"ROLE_LAST_ENTRY" // ROLE_LAST_ENTRY. bogus role that will never be shown (just marks the end of this array)!
|
||||
};
|
||||
|
@ -80,7 +80,7 @@ __try {
|
||||
return E_FAIL;
|
||||
|
||||
PRInt32 count = 0;
|
||||
nsresult rv = hyperAcc->GetLinks(&count);
|
||||
nsresult rv = hyperAcc->GetLinkCount(&count);
|
||||
if (NS_FAILED(rv))
|
||||
return GetHRESULT(rv);
|
||||
|
||||
@ -92,7 +92,7 @@ __try {
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
CAccessibleHypertext::get_hyperlink(long aIndex,
|
||||
CAccessibleHypertext::get_hyperlink(long aLinkIndex,
|
||||
IAccessibleHyperlink **aHyperlink)
|
||||
{
|
||||
__try {
|
||||
@ -103,7 +103,7 @@ __try {
|
||||
return E_FAIL;
|
||||
|
||||
nsCOMPtr<nsIAccessibleHyperLink> hyperLink;
|
||||
nsresult rv = hyperAcc->GetLink(aIndex, getter_AddRefs(hyperLink));
|
||||
nsresult rv = hyperAcc->GetLink(aLinkIndex, getter_AddRefs(hyperLink));
|
||||
if (NS_FAILED(rv))
|
||||
return GetHRESULT(rv);
|
||||
|
||||
|
@ -434,6 +434,9 @@ static const WindowsRoleMapItem gWindowsRoleMap[] = {
|
||||
// nsIAccessibleRole::ROLE_LISTBOX
|
||||
{ ROLE_SYSTEM_LIST, ROLE_SYSTEM_LIST },
|
||||
|
||||
// nsIAccessibleRole::ROLE_FLAT_EQUATION
|
||||
{ ROLE_SYSTEM_EQUATION, ROLE_SYSTEM_EQUATION },
|
||||
|
||||
// nsIAccessibleRole::ROLE_LAST_ENTRY
|
||||
{ ROLE_WINDOWS_LAST_ENTRY, ROLE_WINDOWS_LAST_ENTRY }
|
||||
};
|
||||
|
@ -720,7 +720,8 @@ NS_IMETHODIMP nsXULMenupopupAccessible::GetRole(PRUint32 *aRole)
|
||||
// Some widgets like the search bar have several popups, owned by buttons
|
||||
PRUint32 role = Role(parent);
|
||||
if (role == nsIAccessibleRole::ROLE_COMBOBOX ||
|
||||
role == nsIAccessibleRole::ROLE_PUSHBUTTON) {
|
||||
role == nsIAccessibleRole::ROLE_PUSHBUTTON ||
|
||||
role == nsIAccessibleRole::ROLE_AUTOCOMPLETE) {
|
||||
*aRole = nsIAccessibleRole::ROLE_COMBOBOX_LIST;
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -56,6 +56,9 @@ _TEST_FILES =\
|
||||
test_nsIAccessibleTable_4.html \
|
||||
test_nsIAccessibleTable_listboxes.xul \
|
||||
test_nsIAccessibleHyperLink.html \
|
||||
test_nsIAccessibleHyperLink.xul \
|
||||
test_nsIAccessibleHyperText.html \
|
||||
test_bug428479.html \
|
||||
$(NULL)
|
||||
|
||||
libs:: $(_TEST_FILES)
|
||||
|
@ -62,13 +62,21 @@
|
||||
performActionOnCell: function(aAction, aRow, aCol) {}
|
||||
};
|
||||
|
||||
var gTreeViewChangedCount = 0;
|
||||
var gTreeViewChanged = false;
|
||||
function TreeViewChangedHandler(aEvent)
|
||||
{
|
||||
gTreeViewChanged = true;
|
||||
gTreeViewChangedCount++;
|
||||
|
||||
// Tree view has been setted. We can continue tests for the tree.
|
||||
window.setTimeout(doTest2, 0);
|
||||
// We get two systems 'treeViewChanged' event when tree is initialized
|
||||
// The third one is our when we change the tree view by
|
||||
// nsITreeBoxObject::setTree.
|
||||
if (gTreeViewChangedCount == 3) {
|
||||
gTreeViewChanged = true;
|
||||
|
||||
// Tree view has been setted. We can continue tests for the tree.
|
||||
window.setTimeout(doTest2, 500);
|
||||
}
|
||||
}
|
||||
|
||||
var gTreeRowCountChanged = false;
|
||||
@ -83,59 +91,50 @@
|
||||
is(count, 1, "Wrong 'count' data of 'treeRowCountChanged' event.");
|
||||
}
|
||||
|
||||
var gTreeColumnInvalidated = false;
|
||||
var gTreeRowInvalidated = false;
|
||||
|
||||
var gTreeInvalidatedCount = 0;
|
||||
function TreeInvalidatedHandler(aEvent)
|
||||
{
|
||||
gTreeInvalidatedCount++;
|
||||
|
||||
if (gTreeInvalidatedCount == 2)
|
||||
TreeColumnInvalidatedHandler(aEvent);
|
||||
else if (gTreeInvalidatedCount == 5)
|
||||
TreeRowInvalidatedHandler(aEvent);
|
||||
switch (gTreeInvalidatedCount) {
|
||||
case 1:
|
||||
TreeInvalidatedHandlerHelper(aEvent, 0, 5, null, null,
|
||||
"nsITreeBoxObject::rowCountChanged");
|
||||
break;
|
||||
case 2:
|
||||
TreeInvalidatedHandlerHelper(aEvent, null, null, 0, 0,
|
||||
"nsITreeBoxObject::invalidateColumn");
|
||||
gTreeColumnInvalidated = true;
|
||||
break;
|
||||
case 3:
|
||||
TreeInvalidatedHandlerHelper(aEvent, 1, 1, null, null,
|
||||
"nsITreeBoxObject::invalidateRow");
|
||||
gTreeRowInvalidated = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var gTreeColumnInvalidated = false;
|
||||
function TreeColumnInvalidatedHandler(aEvent)
|
||||
function TreeInvalidatedHandlerHelper(aEvent, aStartRow, aEndRow,
|
||||
aStartCol, aEndCol, aCauseMsg)
|
||||
{
|
||||
var startRow = aEvent.getData("startrow");
|
||||
is(startRow, null,
|
||||
"Wrong 'startrow' of 'treeInvalidated' event on InvalidateRow().");
|
||||
is(startRow, aStartRow,
|
||||
"Wrong 'startrow' of 'treeInvalidated' event on " + aCauseMsg);
|
||||
|
||||
var endRow = aEvent.getData("endrow");
|
||||
is(endRow, null,
|
||||
"Wrong 'endrow' of 'treeInvalidated' event on InvalidateRow().");
|
||||
is(endRow, aEndRow,
|
||||
"Wrong 'endrow' of 'treeInvalidated' event on " + aCauseMsg);
|
||||
|
||||
var startCol = aEvent.getData("startcolumn");
|
||||
is(startCol, 0,
|
||||
"Wrong 'startcolumn' of 'treeInvalidated' event on InvalidateRow().");
|
||||
is(startCol, aStartCol,
|
||||
"Wrong 'startcolumn' of 'treeInvalidated' event on " + aCauseMsg);
|
||||
|
||||
var endCol = aEvent.getData("endcolumn");
|
||||
is(endCol, 0,
|
||||
"Wrong 'endcolumn' of 'treeInvalidated' event on InvalidateRow().");
|
||||
|
||||
gTreeColumnInvalidated = true;
|
||||
}
|
||||
|
||||
var gTreeRowInvalidated = false;
|
||||
function TreeRowInvalidatedHandler(aEvent)
|
||||
{
|
||||
var startRow = aEvent.getData("startrow");
|
||||
is(startRow, 1,
|
||||
"Wrong 'startrow' of 'treeInvalidated' event on InvalidateColumn().");
|
||||
|
||||
var endRow = aEvent.getData("endrow");
|
||||
is(endRow, 1,
|
||||
"Wrong 'endrow' of 'treeInvalidated' event on InvalidateColumn().");
|
||||
|
||||
var startCol = aEvent.getData("startcolumn");
|
||||
is(startCol, null,
|
||||
"Wrong 'startcolumn' of 'treeInvalidated' event on InvalidateColumn().");
|
||||
|
||||
var endCol = aEvent.getData("endcolumn");
|
||||
is(endCol, null,
|
||||
"Wrong 'endcolumn' of 'treeInvalidated' event on InvalidateColumn().");
|
||||
|
||||
gTreeRowInvalidated = true;
|
||||
is(endCol, aEndCol,
|
||||
"Wrong 'endcolumn' of 'treeInvalidated' event on " + aCauseMsg);
|
||||
}
|
||||
|
||||
var gNameChangedOnTreeRowInvalidated = false;
|
||||
@ -155,6 +154,9 @@
|
||||
|
||||
++this.mCount;
|
||||
|
||||
// We should get first six 'name changed' events on
|
||||
// nsITreeBoxObject::invalidateColumn when we update 0th column
|
||||
// containing six rows.
|
||||
if (this.mCount == 6) {
|
||||
gNameChangedOnTreeColumnInvalidated = true;
|
||||
|
||||
@ -166,8 +168,7 @@
|
||||
gNameChangedOnTreeRowInvalidated = true;
|
||||
},
|
||||
|
||||
mCount: 0,
|
||||
mType: ""
|
||||
mCount: 0
|
||||
};
|
||||
|
||||
function CheckEvents()
|
||||
@ -175,22 +176,26 @@
|
||||
// If these fail then it doesn't mean actually events are not fired,
|
||||
// possibly setTimeout was executed earlier than events have been fired.
|
||||
|
||||
// DOM events
|
||||
// nsITreeBoxObject::view
|
||||
ok(gTreeViewChanged,
|
||||
"TreeViewChanged event should have been fired.");
|
||||
|
||||
// nsITreeBoxObject::rowCountChanged
|
||||
ok(gTreeRowCountChanged,
|
||||
"TreeRowCountChanged event should have been fired.");
|
||||
|
||||
// nsITreeBoxObject::invalidateColumn
|
||||
ok(gTreeColumnInvalidated,
|
||||
"TreeInvalidated event should have been fired for InvalidateColumn().");
|
||||
ok(gTreeRowInvalidated,
|
||||
"TreeInvalidated event should have been fired for InvalidateRow().");
|
||||
|
||||
// A11y events
|
||||
ok(gNameChangedOnTreeRowInvalidated,
|
||||
"Wrong NameChanged events number on tree row invalidation.");
|
||||
ok(gNameChangedOnTreeColumnInvalidated,
|
||||
"Wrong NameChanged events number on tree column invalidation.");
|
||||
|
||||
// nsITreeBoxObject::invalidateRow
|
||||
ok(gTreeRowInvalidated,
|
||||
"TreeInvalidated event should have been fired for InvalidateRow().");
|
||||
ok(gNameChangedOnTreeRowInvalidated,
|
||||
"Wrong NameChanged events number on tree row invalidation.");
|
||||
|
||||
// Remove DOM event listeners
|
||||
document.removeEventListener("TreeViewChanged",
|
||||
TreeViewChangedHandler, true);
|
||||
@ -225,7 +230,6 @@
|
||||
getService(Components.interfaces.nsIObserverService);
|
||||
gObserverService.addObserver(gA11yEventObserver, "accessible-event",
|
||||
false);
|
||||
|
||||
// Add DOM event listeners
|
||||
document.addEventListener("TreeViewChanged",
|
||||
TreeViewChangedHandler, true);
|
||||
|
71
accessible/tests/mochitest/test_bug428479.html
Normal file
@ -0,0 +1,71 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=428479
|
||||
-->
|
||||
<head>
|
||||
<title>ARIA role math chrome tests</title>
|
||||
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />
|
||||
|
||||
<script type="application/javascript" src="chrome://mochikit/content/MochiKit/packed.js"></script>
|
||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||
|
||||
<script type="application/javascript">
|
||||
function testThis(aID, aAcc)
|
||||
{
|
||||
is(aAcc.finalRole,
|
||||
Components.interfaces.nsIAccessibleRole.ROLE_FLAT_EQUATION,
|
||||
"Wrong role for " + aID +"!");
|
||||
is(aAcc.name, "x^2 + y^2 + z^2", "Wrong name for " + aID + "!");
|
||||
}
|
||||
|
||||
function doTest()
|
||||
{
|
||||
var accRetrieval = Components.classes["@mozilla.org/accessibleRetrieval;1"].
|
||||
getService(Components.interfaces.nsIAccessibleRetrieval);
|
||||
|
||||
// Test equation image
|
||||
var imgEqElement = document.getElementById("img_eq");
|
||||
var imgEqAcc;
|
||||
try {
|
||||
imgEqAcc = accRetrieval.getAccessibleFor(imgEqElement);
|
||||
} catch(e) {
|
||||
}
|
||||
ok(imgEqAcc, "no accessible for image equation!");
|
||||
if (imgEqAcc)
|
||||
testThis("img_eq", imgEqAcc);
|
||||
|
||||
// Test textual equation
|
||||
var txtEqElement = document.getElementById("txt_eq");
|
||||
var txtEqAcc;
|
||||
try {
|
||||
txtEqAcc = accRetrieval.getAccessibleFor(txtEqElement);
|
||||
} catch(e) {
|
||||
}
|
||||
ok(txtEqAcc, "no accessible for textual equation!");
|
||||
if (txtEqAcc)
|
||||
testThis("txt_eq", txtEqAcc);
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
addLoadEvent(doTest);
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=428479">Mozilla Bug 428479</a>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none"></div>
|
||||
<pre id="test">
|
||||
</pre>
|
||||
<p>Image:
|
||||
<img id="img_eq" role="math" src="foo" alt="x^2 + y^2 + z^2">
|
||||
</p>
|
||||
<p>Text:
|
||||
<span id="txt_eq" role="math" title="x^2 + y^2 + z^2">x<sup>2</sup> +
|
||||
y<sup>2</sup> + z<sup>2</sup></span>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
@ -15,7 +15,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=418368
|
||||
aEndIndex)
|
||||
{
|
||||
is(aAcc.finalRole, aRole, "Wrong role for ID " + aID + "!");
|
||||
is(aAcc.anchorsCount, aAnchors, "Wrong number of anchors for ID "
|
||||
is(aAcc.anchorCount, aAnchors, "Wrong number of anchors for ID "
|
||||
+ aID + "!");
|
||||
is(aAcc.getAnchor(0).name, aName, "Wrong name for ID "
|
||||
+ aID + "!");
|
||||
|
153
accessible/tests/mochitest/test_nsIAccessibleHyperLink.xul
Normal file
@ -0,0 +1,153 @@
|
||||
<?xml version="1.0"?>
|
||||
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
|
||||
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
|
||||
type="text/css"?>
|
||||
|
||||
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
title="test for nsIAccessibleHyperLink interface on XUL:label elements">
|
||||
|
||||
<script type="application/javascript"
|
||||
src="chrome://mochikit/content/MochiKit/packed.js"></script>
|
||||
<script type="application/javascript"
|
||||
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
|
||||
<script type="application/javascript">
|
||||
<![CDATA[
|
||||
function testThis(aID, aAcc, aRole, aAnchorCount, aAnchorName, aURI,
|
||||
aStartIndex, aEndIndex, aValid, aSelectedBefore,
|
||||
aSelectedAfter)
|
||||
{
|
||||
is(aAcc.finalRole, aRole, "Wrong role for ID " + aID + "!");
|
||||
is(aAcc.anchorCount, aAnchorCount, "Wrong number of anchors for ID "
|
||||
+ aID + "!");
|
||||
is(aAcc.getAnchor(0).name, aAnchorName, "Wrong name for ID " + aID + "!");
|
||||
is(aAcc.getURI(0).spec, aURI, "URI wrong for ID " + aID + "!");
|
||||
is(aAcc.startIndex, aStartIndex, "Wrong startIndex value for ID " + aID
|
||||
+ "!");
|
||||
is(aAcc.endIndex, aEndIndex, "Wrong endIndex value for ID " + aID + "!");
|
||||
is(aAcc.valid, aValid, "Wrong valid state for ID " + aID + "!");
|
||||
|
||||
is(aAcc.selected, aSelectedBefore, "Wrong focused state before focus for "
|
||||
+ aID + "!");
|
||||
document.getElementById(aID).focus();
|
||||
is(aAcc.selected, aSelectedAfter, "Wrong selected state after focus for "
|
||||
+ aID + "!");
|
||||
}
|
||||
|
||||
function testStates(aID, aAcc, aState, aExtraState, aUndesiredState)
|
||||
{
|
||||
var state = {}, extraState = {};
|
||||
aAcc.getFinalState(state, extraState);
|
||||
is(state.value & aState, aState, "Wrong state bits for " + aID + "!");
|
||||
is(extraState.value & aExtraState, aExtraState,
|
||||
"Wrong extra state bits for " + aID + "!");
|
||||
if (aUndesiredState != 0)
|
||||
is(state.value & aUndesiredState, 0, "Bits should not be set for "
|
||||
+ aID +"!");
|
||||
}
|
||||
|
||||
function doTest()
|
||||
{
|
||||
// Mapping needed state flags for easier handling.
|
||||
const state_focusable =
|
||||
Components.interfaces.nsIAccessibleStates.STATE_FOCUSABLE;
|
||||
const state_focused =
|
||||
Components.interfaces.nsIAccessibleStates.STATE_FOCUSED;
|
||||
const state_selectable =
|
||||
Components.interfaces.nsIAccessibleStates.STATE_SELECTABLE;
|
||||
const state_linked =
|
||||
Components.interfaces.nsIAccessibleStates.STATE_LINKED;
|
||||
const state_traversed =
|
||||
Components.interfaces.nsIAccessibleStates.STATE_TRAVERSED;
|
||||
|
||||
const ext_state_multi_line =
|
||||
Components.interfaces.nsIAccessibleStates.EXT_STATE_MULTI_LINE;
|
||||
const ext_state_horizontal =
|
||||
Components.interfaces.nsIAccessibleStates.EXT_STATE_HORIZONTAL;
|
||||
const ext_state_required =
|
||||
Components.interfaces.nsIAccessibleStates.STATE_REQUIRED;
|
||||
const ext_state_invalid =
|
||||
Components.interfaces.nsIAccessibleStates.STATE_INVALID;
|
||||
|
||||
// Activate accessibility.
|
||||
var accRetrieval = Components.classes["@mozilla.org/accessibleRetrieval;1"].
|
||||
getService(Components.interfaces.nsIAccessibleRetrieval);
|
||||
|
||||
var linkLabelElement = document.getElementById("linkedLabel");
|
||||
var linkedLabelAcc;
|
||||
try {
|
||||
linkedLabelAcc = accRetrieval.getAccessibleFor(linkLabelElement).
|
||||
QueryInterface(Components.interfaces.nsIAccessibleHyperLink);
|
||||
} catch(e) {
|
||||
ok(linkedLabelAcc, "no interface for linked label!");
|
||||
}
|
||||
testThis("linkedLabel", linkedLabelAcc,
|
||||
Components.interfaces.nsIAccessibleRole.ROLE_LINK, 1,
|
||||
"Mozilla Foundation home", "http://www.mozilla.org/", 1, 2, true,
|
||||
false, true);
|
||||
testStates("linkedLabel", linkedLabelAcc,
|
||||
(state_focusable | state_linked),
|
||||
(ext_state_horizontal), 0);
|
||||
|
||||
var labelElementWithValue = document.getElementById("linkLabelWithValue");
|
||||
var labelWithValueAcc;
|
||||
try {
|
||||
labelWithValueAcc = accRetrieval.getAccessibleFor(labelElementWithValue).
|
||||
QueryInterface(Components.interfaces.nsIAccessibleHyperLink);
|
||||
} catch(e) {
|
||||
ok(labelWithValueAcc, "no interface for linked label with value!");
|
||||
}
|
||||
testThis("linkLabelWithValue", labelWithValueAcc,
|
||||
Components.interfaces.nsIAccessibleRole.ROLE_LINK, 1,
|
||||
"Mozilla Foundation", "http://www.mozilla.org/", 2, 3, true,
|
||||
false, true);
|
||||
testStates("linkLabelWithValue", labelWithValueAcc,
|
||||
(state_focusable | state_linked),
|
||||
(ext_state_horizontal), 0);
|
||||
|
||||
var NormalLabelElement = document.getElementById("normalLabel");
|
||||
var normalLabelAcc;
|
||||
try {
|
||||
normalLabelAcc = accRetrieval.getAccessibleFor(NormalLabelElement);
|
||||
} catch(e) {
|
||||
}
|
||||
ok(normalLabelAcc, "no accessible for normalLabel!");
|
||||
if (normalLabelAcc) {
|
||||
is(normalLabelAcc.finalRole,
|
||||
Components.interfaces.nsIAccessibleRole.ROLE_LABEL,
|
||||
"Wrong role!");
|
||||
is(normalLabelAcc.name, "This label should not be a link",
|
||||
"Wrong name for normal label!");
|
||||
|
||||
var stateNormal = {}, extraStateNormal = {};
|
||||
normalLabelAcc.getFinalState(stateNormal, extraStateNormal);
|
||||
undesiredState = (state_focusable | state_linked);
|
||||
is(stateNormal.value & undesiredState, 0, "Wrong state bits for normal label!");
|
||||
}
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
addLoadEvent(doTest);
|
||||
]]>
|
||||
</script>
|
||||
|
||||
<body xmlns="http://www.w3.org/1999/xhtml">
|
||||
<a target="_blank"
|
||||
href="https://bugzilla.mozilla.org/show_bug.cgi?id=421066"
|
||||
title="Implement Mochitests for the nsIAccessibleHyperLink interface on XUL:label elements">
|
||||
Mozilla Bug 421066
|
||||
</a>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none">
|
||||
</div>
|
||||
<pre id="test">
|
||||
</pre>
|
||||
</body>
|
||||
|
||||
<label id="linkedLabel" class="text-link" href="http://www.mozilla.org/">
|
||||
Mozilla Foundation home</label>
|
||||
<label id="linkLabelWithValue" value="Mozilla Foundation" class="text-link"
|
||||
href="http://www.mozilla.org/" />
|
||||
<label id="normalLabel" value="This label should not be a link" />
|
||||
</window>
|
114
accessible/tests/mochitest/test_nsIAccessibleHyperText.html
Normal file
@ -0,0 +1,114 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=428248
|
||||
-->
|
||||
<head>
|
||||
<title>nsIHyper>TextAccessible chrome tests</title>
|
||||
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />
|
||||
|
||||
<script type="application/javascript" src="chrome://mochikit/content/MochiKit/packed.js"></script>
|
||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||
|
||||
<script type="application/javascript">
|
||||
var gParagraphAcc;
|
||||
|
||||
function testThis(aID, aCharIndex, aExpectedLinkIndex, aName)
|
||||
{
|
||||
is(gParagraphAcc.getLinkIndex(aCharIndex), aExpectedLinkIndex,
|
||||
"Wrong link index for ID " + aID + "!");
|
||||
var linkAcc;
|
||||
try {
|
||||
linkAcc = gParagraphAcc.getLink(aExpectedLinkIndex);
|
||||
} catch(e) {
|
||||
ok(linkAcc, "No accessible for link " + aID + "!");
|
||||
}
|
||||
// Just test the link's name to make sure we get the right one.
|
||||
is(linkAcc.getAnchor(0).name, aName, "Wrong name for " + aID + "!");
|
||||
}
|
||||
|
||||
function doTest()
|
||||
{
|
||||
var accService = Components.classes["@mozilla.org/accessibleRetrieval;1"].
|
||||
getService(Components.interfaces.nsIAccessibleRetrieval);
|
||||
|
||||
var paragraphElement = document.getElementById("testParagraph");
|
||||
try {
|
||||
gParagraphAcc = accService.getAccessibleFor(paragraphElement).
|
||||
QueryInterface(Components.interfaces.nsIAccessibleHyperText);
|
||||
} catch(e) {
|
||||
ok(gParagraphAcc, "No interface for the paragraph!");
|
||||
}
|
||||
|
||||
// Test link count
|
||||
is(gParagraphAcc.linkCount, 7, "Wrong link count for paragraph!");
|
||||
|
||||
// normal hyperlink
|
||||
testThis("NormalHyperlink", 14, 0, "Mozilla Foundation");
|
||||
|
||||
// ARIA hyperlink
|
||||
testThis("AriaHyperlink", 28, 1, "Mozilla Foundation Home");
|
||||
|
||||
// ARIA hyperlink with status invalid
|
||||
testThis("InvalidAriaHyperlink", 64, 2, "Invalid link");
|
||||
|
||||
// image map, but not its link children. They are not part of hypertext.
|
||||
testThis("imgmap", 78, 3, "b");
|
||||
|
||||
// empty hyperlink
|
||||
testThis("emptyLink", 93, 4, "");
|
||||
|
||||
// normal hyperlink with embedded span
|
||||
testThis("LinkWithSpan", 119, 5, "Heise Online");
|
||||
|
||||
// Named anchor
|
||||
testThis("namedAnchor", 197, 6, "This should never be of state_linked");
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
addLoadEvent(doTest);
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=418368">Mozilla Bug 418368</a>
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none"></div>
|
||||
<pre id="test">
|
||||
</pre>
|
||||
<p id="testParagraph">
|
||||
<br>Simple link:<br>
|
||||
<a id="NormalHyperlink" href="http://www.mozilla.org">Mozilla Foundation</a>
|
||||
<br>ARIA link:<br>
|
||||
<span id="AriaHyperlink" role="link"
|
||||
onclick="window.open('http://www.mozilla.org/');"
|
||||
tabindex="0">Mozilla Foundation Home</span>
|
||||
<br>Invalid, non-focusable hyperlink:<br>
|
||||
<span id="InvalidAriaHyperlink" role="link" aria-invalid="true"
|
||||
onclick="window.open('http:/www.mozilla.org/');">Invalid link</span>
|
||||
<br>Image map:<br>
|
||||
<map name="atoz_map">
|
||||
<area href="http://www.bbc.co.uk/radio4/atoz/index.shtml#b"
|
||||
coords="17,0,30,14"
|
||||
alt="b"
|
||||
shape="rect"></area>
|
||||
<area href="http://www.bbc.co.uk/radio4/atoz/index.shtml#a"
|
||||
coords="0,0,13,14"
|
||||
alt="a"
|
||||
shape="rect"></area>
|
||||
</map>
|
||||
<img width="447" id="imgmap"
|
||||
height="15"
|
||||
usemap="#atoz_map"
|
||||
src="http://www.bbc.co.uk/radio4/images/letters.gif"></img>
|
||||
<br>Empty link:<br>
|
||||
<a id="emptyLink" href=""><img src=""></img></a>
|
||||
<br>Link with embedded span<br>
|
||||
<a id="LinkWithSpan" href="http://www.heise.de/"><span lang="de">Heise Online</span></a>
|
||||
<br>Named anchor, must not have "linked" state for it to be exposed correctly:<br>
|
||||
<a id="namedAnchor" name="named_anchor">This should never be of state_linked</a>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
@ -11,122 +11,90 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=410052
|
||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||
|
||||
<script type="application/javascript">
|
||||
const nsIAccessibleRetrieval = Components.interfaces.nsIAccessibleRetrieval;
|
||||
const nsIAccessibleTable = Components.interfaces.nsIAccessibleTable;
|
||||
|
||||
var gAccService = null;
|
||||
|
||||
function doTest()
|
||||
{
|
||||
const nsIAccessibleRetrieval =
|
||||
Components.interfaces.nsIAccessibleRetrieval;
|
||||
const nsIAccessibleTable = Components.interfaces.nsIAccessibleTable;
|
||||
|
||||
var accService = Components.classes["@mozilla.org/accessibleRetrieval;1"].
|
||||
getService(nsIAccessibleRetrieval);
|
||||
gAccService = Components.classes["@mozilla.org/accessibleRetrieval;1"].
|
||||
getService(nsIAccessibleRetrieval);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// table
|
||||
var table = document.getElementById("table");
|
||||
var tableAcc = accService.getAccessibleFor(table).
|
||||
QueryInterface(nsIAccessibleTable);
|
||||
|
||||
var row, column, index;
|
||||
var tRow = new Array(0,0,0,1,1,1,2,2,3,3);
|
||||
var tCol = new Array(0,1,2,0,1,2,0,1,1,2);
|
||||
|
||||
for (var i = 0; i < 10; i++) {
|
||||
row = tableAcc.getRowAtIndex(i);
|
||||
column = tableAcc.getColumnAtIndex(i);
|
||||
index = tableAcc.getIndexAt(tRow[i], tCol[i]);
|
||||
is(row, tRow[i], "table: row for index " + i +" is nor correct");
|
||||
is(column, tCol[i], "table: column for index " + i +"is nor correct");
|
||||
is(index, i,
|
||||
"table: row " + row + " /column " + column + " and index " + index + " aren't inconsistent.");
|
||||
}
|
||||
testTable("table", 10, tRow, tCol);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// tableinsane1
|
||||
table = document.getElementById("tableinsane1");
|
||||
tableAcc = accService.getAccessibleFor(table).
|
||||
QueryInterface(nsIAccessibleTable);
|
||||
|
||||
tRow = [0,0,0,1,1,1,2,2,3,3];
|
||||
tCol = [0,1,2,0,1,2,0,1,1,2];
|
||||
|
||||
for (var i = 0; i < 10; i++) {
|
||||
row = tableAcc.getRowAtIndex(i);
|
||||
column = tableAcc.getColumnAtIndex(i);
|
||||
index = tableAcc.getIndexAt(tRow[i], tCol[i]);
|
||||
is(row, tRow[i],
|
||||
"tableinsane1: row for index " + i +" is nor correct");
|
||||
is(column, tCol[i],
|
||||
"tableinsane1: column for index " + i +"is nor correct");
|
||||
is(index, i,
|
||||
"tableinsane1: row " + row + " /column " + column + " and index " + index + " aren't inconsistent.");
|
||||
}
|
||||
testTable("tableinsane1", 10, tRow, tCol);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// tableinsane2
|
||||
table = document.getElementById("tableinsane2");
|
||||
tableAcc = accService.getAccessibleFor(table).
|
||||
QueryInterface(nsIAccessibleTable);
|
||||
|
||||
tRow = [0,0,0,1,1,1,2,2,3,3,4,4,4];
|
||||
tCol = [0,1,2,0,1,2,0,1,1,2,1,3,4];
|
||||
|
||||
for (var i = 0; i < 13; i++) {
|
||||
row = tableAcc.getRowAtIndex(i);
|
||||
column = tableAcc.getColumnAtIndex(i);
|
||||
index = tableAcc.getIndexAt(tRow[i], tCol[i]);
|
||||
is(row, tRow[i],
|
||||
"tableinsane2: row for index " + i +" is nor correct");
|
||||
is(column, tCol[i],
|
||||
"tableinsane2: column for index " + i +"is nor correct");
|
||||
is(index, i,
|
||||
"tableinsane2: row " + row + " /column " + column + " and index " + index + " aren't inconsistent.");
|
||||
}
|
||||
testTable("tableinsane2", 13, tRow, tCol);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// tableinsane4
|
||||
table = document.getElementById("tableinsane4");
|
||||
tableAcc = accService.getAccessibleFor(table).
|
||||
QueryInterface(Components.interfaces.nsIAccessibleTable);
|
||||
|
||||
tRow = [0,0,0,1,1,1,2,2,3,4];
|
||||
tCol = [0,1,2,0,1,2,0,2,0,0];
|
||||
|
||||
for (var i = 0; i < 10; i++) {
|
||||
row = tableAcc.getRowAtIndex(i);
|
||||
column = tableAcc.getColumnAtIndex(i);
|
||||
index = tableAcc.getIndexAt(tRow[i], tCol[i]);
|
||||
is(row, tRow[i],
|
||||
"tableinsane4: row for index " + i +" is nor correct");
|
||||
is(column, tCol[i],
|
||||
"tableinsane4: column for index " + i +"is nor correct");
|
||||
is(index, i,
|
||||
"tableinsane4: row " + row + " /column " + column + " and index " + index + " aren't inconsistent.");
|
||||
}
|
||||
testTable("tableinsane4", 10, tRow, tCol);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// tableborder
|
||||
var table = document.getElementById("tableborder");
|
||||
var tableAcc = accService.getAccessibleFor(table).
|
||||
QueryInterface(nsIAccessibleTable);
|
||||
|
||||
tRow = [0,0,0,1,1,1,2,2,3,3];
|
||||
tCol = [0,1,2,0,1,2,0,1,1,2];
|
||||
|
||||
for (var i = 0; i < 10; i++) {
|
||||
row = tableAcc.getRowAtIndex(i);
|
||||
column = tableAcc.getColumnAtIndex(i);
|
||||
index = tableAcc.getIndexAt(tRow[i], tCol[i]);
|
||||
is(row, tRow[i],
|
||||
"tableborder: row for index " + i +" is nor correct");
|
||||
is(column, tCol[i],
|
||||
"tableborder: column for index " + i +"is nor correct");
|
||||
is(index, i,
|
||||
"tableborder: row " + row + " /column " + column + " and index " + index + " aren't inconsistent.");
|
||||
}
|
||||
testTable("tableborder", 10, tRow, tCol);
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
function testTable(aId, aLen, aRowIdxes, aColIdxes)
|
||||
{
|
||||
var table = document.getElementById(aId);
|
||||
var tableAcc = gAccService.getAccessibleFor(table).
|
||||
QueryInterface(nsIAccessibleTable);
|
||||
|
||||
var row, column, index;
|
||||
var cellAcc;
|
||||
|
||||
for (var i = 0; i < aLen; i++) {
|
||||
row = tableAcc.getRowAtIndex(i);
|
||||
column = tableAcc.getColumnAtIndex(i);
|
||||
index = tableAcc.getIndexAt(aRowIdxes[i], aColIdxes[i]);
|
||||
|
||||
is(row, aRowIdxes[i], aId + ": row for index " + i +" is nor correct");
|
||||
is(column, aColIdxes[i],
|
||||
aId + ": column for index " + i +"is nor correct");
|
||||
is(index, i,
|
||||
aId + ": row " + row + " /column " + column + " and index " + index + " aren't inconsistent.");
|
||||
|
||||
try {
|
||||
cellAcc = null;
|
||||
cellAcc = tableAcc.cellRefAt(row, column);
|
||||
} catch (e) { }
|
||||
|
||||
ok(cellAcc,
|
||||
aId + ": Can't get cell accessible at row = " + row + ", column = " + column);
|
||||
|
||||
if (cellAcc) {
|
||||
var attrs = cellAcc.attributes;
|
||||
is (parseInt(attrs.getStringProperty("cell-index")), index,
|
||||
aId + ": cell index from object attributes of cell accessible isn't corrent.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
addLoadEvent(doTest);
|
||||
</script>
|
||||
|
@ -44,13 +44,20 @@ include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
include $(topsrcdir)/config/config.mk
|
||||
|
||||
abs_srcdir = $(shell cd $(srcdir) && pwd)
|
||||
|
||||
CHROME_DEPS += $(abs_srcdir)/content/overrides/app-license.html
|
||||
|
||||
ifdef MOZ_MOCHITEST
|
||||
DIRS += content/test
|
||||
endif
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
DEFINES += -DMOZ_APP_VERSION=$(MOZ_APP_VERSION)
|
||||
DEFINES += \
|
||||
-DMOZ_APP_VERSION=$(MOZ_APP_VERSION) \
|
||||
-DAPP_EULA_BLOCK=$(abs_srcdir)/content/overrides/app-license.html \
|
||||
$(NULL)
|
||||
|
||||
ifndef MOZ_BRANDING_DIRECTORY
|
||||
DEFINES += -DMOZ_USE_GENERIC_BRANDING
|
||||
|
@ -407,7 +407,7 @@
|
||||
oncommand="BookmarksEventHandler.onCommand(event);"
|
||||
onclick="BookmarksEventHandler.onClick(event);"
|
||||
onpopupshowing="BookmarksEventHandler.onPopupShowing(event);">
|
||||
<menuitem label="&bookmarkThisPageCmd.label;"
|
||||
<menuitem label="&bookmarkThisPageCmd.label;"
|
||||
command="Browser:AddBookmarkAs" key="addBookmarkAsKb"/>
|
||||
<menuitem id="subscribeToPageMenuitem"
|
||||
label="&subscribeToPageMenuitem.label;"
|
||||
@ -418,17 +418,17 @@
|
||||
label="&subscribeToPageMenupopup.label;"
|
||||
hidden="true">
|
||||
<menupopup id="subscribeToPageSubmenuMenupopup"
|
||||
onpopupshowing="return FeedHandler.buildFeedList(event.target);"
|
||||
onpopupshowing="return FeedHandler.buildFeedList(event.target);"
|
||||
oncommand="return FeedHandler.subscribeToFeed(null, event);"
|
||||
onclick="checkForMiddleClick(this, event);"/>
|
||||
</menu>
|
||||
<menuitem label="&addCurPagesCmd.label;"
|
||||
<menuitem label="&addCurPagesCmd.label;"
|
||||
command="Browser:BookmarkAllTabs" key="bookmarkAllTabsKb"/>
|
||||
<menuseparator id="organizeBookmarksSeparator"/>
|
||||
<menuitem id="bookmarksShowAll"
|
||||
label="&organizeBookmarks.label;"
|
||||
command="Browser:ShowAllBookmarks"
|
||||
key="manBookmarkKb"/>
|
||||
<menuseparator id="organizeBookmarksSeparator"/>
|
||||
<menu id="bookmarksToolbarFolderMenu"
|
||||
class="menu-iconic bookmark-item"
|
||||
container="true">
|
||||
|
@ -388,9 +388,11 @@ var PlacesCommandHook = {
|
||||
var url = webNav.currentURI;
|
||||
var title;
|
||||
var description;
|
||||
var charset;
|
||||
try {
|
||||
title = webNav.document.title || url.spec;
|
||||
description = PlacesUIUtils.getDescriptionFromDocument(webNav.document);
|
||||
charset = webNav.document.characterSet;
|
||||
}
|
||||
catch (e) { }
|
||||
|
||||
@ -407,9 +409,15 @@ var PlacesCommandHook = {
|
||||
var txn = PlacesUIUtils.ptm.createItem(uri, parent, -1,
|
||||
title, null, [descAnno]);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
// Set the character-set
|
||||
if (charset)
|
||||
PlacesUtils.history.setCharsetForURI(uri, charset);
|
||||
itemId = PlacesUtils.getMostRecentBookmarkForURI(uri);
|
||||
}
|
||||
|
||||
// Revert the contents of the location bar
|
||||
handleURLBarRevert();
|
||||
|
||||
// dock the panel to the star icon when possible, otherwise dock
|
||||
// it to the content area
|
||||
if (aBrowser.contentWindow == window.content) {
|
||||
|
@ -62,10 +62,6 @@ window[chromehidden~="toolbar"] toolbar:not(.toolbar-primary):not(.chromeclass-m
|
||||
min-width: 1px;
|
||||
}
|
||||
|
||||
#FindToolbar {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
/* Identity UI */
|
||||
#identity-popup-content-box.unknownIdentity > #identity-popup-connectedToLabel ,
|
||||
#identity-popup-content-box.unknownIdentity > #identity-popup-runByLabel ,
|
||||
|
@ -1166,7 +1166,7 @@ function BrowserShutdown()
|
||||
function nonBrowserWindowStartup()
|
||||
{
|
||||
// Disable inappropriate commands / submenus
|
||||
var disabledItems = ['cmd_newNavigatorTab', 'Browser:SavePage', 'Browser:SendLink',
|
||||
var disabledItems = ['Browser:SavePage', 'Browser:SendLink',
|
||||
'cmd_pageSetup', 'cmd_print', 'cmd_find', 'cmd_findAgain', 'viewToolbarsMenu',
|
||||
'cmd_toggleTaskbar', 'viewSidebarMenuMenu', 'Browser:Reload', 'Browser:ReloadSkipCache',
|
||||
'viewFullZoomMenu', 'pageStyleMenu', 'charsetMenu', 'View:PageSource', 'View:FullScreen',
|
||||
@ -1271,7 +1271,7 @@ function SanitizeListener()
|
||||
gPrefService.clearUserPref(this.didSanitizeDomain);
|
||||
// We need to persist this preference change, since we want to
|
||||
// check it at next app start even if the browser exits abruptly
|
||||
gPrefService.savePrefFile(null);
|
||||
gPrefService.QueryInterface(Ci.nsIPrefService).savePrefFile(null);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1578,6 +1578,12 @@ function openLocationCallback()
|
||||
|
||||
function BrowserOpenTab()
|
||||
{
|
||||
if (!gBrowser) {
|
||||
// If there are no open browser windows, open a new one
|
||||
window.openDialog("chrome://browser/content/", "_blank",
|
||||
"chrome,all,dialog=no", "about:blank");
|
||||
return;
|
||||
}
|
||||
gBrowser.loadOneTab("about:blank", null, null, null, false, false);
|
||||
if (gURLBar)
|
||||
gURLBar.focus();
|
||||
@ -1753,7 +1759,12 @@ function getShortcutOrURI(aURL, aPostDataRef) {
|
||||
if (matches)
|
||||
[, shortcutURL, charset] = matches;
|
||||
else {
|
||||
//XXX Bug 317472 will add lastCharset support to places.
|
||||
// Try to get the saved character-set.
|
||||
try {
|
||||
// makeURI throws if URI is invalid.
|
||||
// Will return an empty string if character-set is not found.
|
||||
charset = PlacesUtils.history.getCharsetForURI(makeURI(shortcutURL));
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
var encodedParam = "";
|
||||
@ -2944,8 +2955,13 @@ const BrowserSearch = {
|
||||
*/
|
||||
updateSearchButton: function() {
|
||||
var searchBar = this.searchBar;
|
||||
if (!searchBar)
|
||||
|
||||
// The search bar binding might not be applied even though the element is
|
||||
// in the document (e.g. when the navigation toolbar is hidden), so check
|
||||
// for .searchButton specifically.
|
||||
if (!searchBar || !searchBar.searchButton)
|
||||
return;
|
||||
|
||||
var engines = gBrowser.mCurrentBrowser.engines;
|
||||
if (engines && engines.length > 0)
|
||||
searchBar.searchButton.setAttribute("addengines", "true");
|
||||
@ -5083,6 +5099,8 @@ function BrowserSetForcedCharacterSet(aCharset)
|
||||
var docCharset = getBrowser().docShell.QueryInterface(
|
||||
Components.interfaces.nsIDocCharset);
|
||||
docCharset.charset = aCharset;
|
||||
// Save the forced character-set
|
||||
PlacesUtils.history.setCharsetForURI(getWebNavigation().currentURI, aCharset);
|
||||
BrowserReloadWithFlags(nsIWebNavigation.LOAD_FLAGS_CHARSET_CHANGE);
|
||||
}
|
||||
|
||||
@ -5751,11 +5769,13 @@ function AddKeywordForSearchField()
|
||||
{
|
||||
var node = document.popupNode;
|
||||
|
||||
var charset = node.ownerDocument.characterSet;
|
||||
|
||||
var docURI = makeURI(node.ownerDocument.URL,
|
||||
node.ownerDocument.characterSet);
|
||||
charset);
|
||||
|
||||
var formURI = makeURI(node.form.getAttribute("action"),
|
||||
node.ownerDocument.characterSet,
|
||||
charset,
|
||||
docURI);
|
||||
|
||||
var spec = formURI.spec;
|
||||
@ -5804,7 +5824,7 @@ function AddKeywordForSearchField()
|
||||
|
||||
var description = PlacesUIUtils.getDescriptionFromDocument(node.ownerDocument);
|
||||
PlacesUIUtils.showMinimalAddBookmarkUI(makeURI(spec), "", description, null,
|
||||
null, null, "", postData);
|
||||
null, null, "", postData, charset);
|
||||
}
|
||||
|
||||
function SwitchDocumentDirection(aWindow) {
|
||||
|
@ -510,8 +510,9 @@ nsContextMenu.prototype = {
|
||||
// we're going to walk up the DOM looking for a parent link node,
|
||||
// this shouldn't be necessary, but we're matching the existing behaviour for left click
|
||||
var realLink = elem;
|
||||
var parent = elem.parentNode;
|
||||
while (parent) {
|
||||
var parent = elem;
|
||||
while ((parent = parent.parentNode) &&
|
||||
(parent.nodeType == Node.ELEMENT_NODE)) {
|
||||
try {
|
||||
if ((parent instanceof HTMLAnchorElement && parent.href) ||
|
||||
(parent instanceof HTMLAreaElement && parent.href) ||
|
||||
@ -519,7 +520,6 @@ nsContextMenu.prototype = {
|
||||
parent.getAttributeNS("http://www.w3.org/1999/xlink", "type") == "simple")
|
||||
realLink = parent;
|
||||
} catch (e) { }
|
||||
parent = parent.parentNode;
|
||||
}
|
||||
|
||||
// Remember corresponding element.
|
||||
|
5
browser/base/content/overrides/app-license.html
Normal file
@ -0,0 +1,5 @@
|
||||
<p>Official <b>binaries</b> of this product released by the
|
||||
<a href="http://www.mozilla.com/">Mozilla Corporation</a>
|
||||
are made available under
|
||||
<a href="http://www.mozilla.org/foundation/EULA/">the corresponding
|
||||
EULA</a>.
|
@ -846,8 +846,12 @@
|
||||
|
||||
var whatToFocus = window.content;
|
||||
|
||||
// Focus the previously focused element or window
|
||||
if (newBrowser.focusedElement) {
|
||||
// Focus the previously focused element or window, but make sure
|
||||
// the focused element is still part of the document
|
||||
let focusedElem = newBrowser.focusedElement;
|
||||
if (focusedElem && focusedElem.ownerDocument &&
|
||||
!(focusedElem.ownerDocument.compareDocumentPosition(focusedElem) &
|
||||
Node.DOCUMENT_POSITION_DISCONNECTED)) {
|
||||
if (newBrowser.focusedElement.parentNode !=
|
||||
this.mCurrentTab.parentNode) {
|
||||
// Focus the remembered element unless it's in the current tab panel
|
||||
|
@ -49,17 +49,24 @@ _TEST_FILES = test_feed_discovery.html \
|
||||
bug395533-data.txt \
|
||||
$(NULL)
|
||||
|
||||
# browser_bug423833.js disabled temporarily since it's unreliable
|
||||
_BROWSER_FILES = browser_bug321000.js \
|
||||
browser_bug405137.js \
|
||||
browser_bug409481.js \
|
||||
browser_autodiscovery.js \
|
||||
browser_bug420160.js \
|
||||
browser_bug423833.js \
|
||||
autodiscovery.html \
|
||||
moz.png \
|
||||
browser_getshortcutoruri.js \
|
||||
$(NULL)
|
||||
|
||||
# disable tests on linux for now..
|
||||
ifneq ($(OS_ARCH),Linux)
|
||||
_BROWSER_FILES += \
|
||||
browser_bug427559.js \
|
||||
$(NULL)
|
||||
endif
|
||||
|
||||
libs:: $(_TEST_FILES)
|
||||
$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)
|
||||
|
||||
|
@ -27,13 +27,13 @@ function test() {
|
||||
newBrowser.contentWindow.location = testPage;
|
||||
}
|
||||
|
||||
var loadCount = 0;
|
||||
function test1Setup() {
|
||||
if(!loadCount++)
|
||||
// Wait for both frames to load
|
||||
|
||||
if(newBrowser.contentWindow.frames.length < 2 ||
|
||||
newBrowser.contentWindow.frames[1].document.location != invalidPage)
|
||||
// The error frame hasn't loaded yet
|
||||
return;
|
||||
|
||||
loadCount = 0;
|
||||
newBrowser.removeEventListener("load", test1Setup, true);
|
||||
|
||||
var badFrame = newBrowser.contentWindow.frames[1];
|
||||
@ -65,11 +65,11 @@ function testShowOnlyThisFrame() {
|
||||
}
|
||||
|
||||
function test2Setup() {
|
||||
if(!loadCount++)
|
||||
// Wait for both frames to load
|
||||
if(newBrowser.contentWindow.frames.length < 2 ||
|
||||
newBrowser.contentWindow.frames[1].document.location != invalidPage)
|
||||
// The error frame hasn't loaded yet
|
||||
return;
|
||||
|
||||
loadCount = 0;
|
||||
gBrowser.removeEventListener("load", test2Setup, true);
|
||||
|
||||
// Now let's do the whole thing again, but this time for "Open frame in new tab"
|
||||
|
73
browser/base/content/test/browser_bug427559.js
Normal file
@ -0,0 +1,73 @@
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Firefox Browser Test Code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Edward Lee <edward.lee@engineering.uiuc.edu>.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2008
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/*
|
||||
* Test bug 427559 to make sure focused elements that are no longer on the page
|
||||
* will have focus transferred to the window when changing tabs back to that
|
||||
* tab with the now-gone element.
|
||||
*/
|
||||
|
||||
// Default focus on a button and have it kill itself on blur
|
||||
let testPage = 'data:text/html,<body><button onblur="this.parentNode.removeChild(this);"><script>document.body.firstChild.focus();</script></body>';
|
||||
|
||||
function test() {
|
||||
waitForExplicitFinish();
|
||||
|
||||
// Prepare the test tab
|
||||
let testTab = gBrowser.addTab();
|
||||
gBrowser.selectedTab = testTab;
|
||||
let testBrowser = gBrowser.getBrowserForTab(testTab);
|
||||
|
||||
// Do stuff just after the page loads, so the page script can do its stuff
|
||||
testBrowser.addEventListener("load", function() setTimeout(function() {
|
||||
// The test page loaded, so open an empty tab, select it, then restore
|
||||
// the test tab. This causes the test page's focused element to be removed
|
||||
// from its document.
|
||||
let emptyTab = gBrowser.addTab();
|
||||
gBrowser.selectedTab = emptyTab;
|
||||
gBrowser.removeCurrentTab();
|
||||
gBrowser.selectedTab = testTab;
|
||||
|
||||
// Make sure focus is given to the window because the element is now gone
|
||||
is(document.commandDispatcher.focusedWindow, window.content,
|
||||
"content window is focused");
|
||||
gBrowser.removeCurrentTab();
|
||||
finish();
|
||||
}, 0), true);
|
||||
|
||||
// Start the test by loading the test page
|
||||
testBrowser.contentWindow.location = testPage;
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
browser.jar:
|
||||
% content browser %content/browser/ xpcnativewrappers=yes
|
||||
% content browser %content/browser/ xpcnativewrappers=yes contentaccessible=yes
|
||||
#ifdef XP_MACOSX
|
||||
% overlay chrome://mozapps/content/downloads/downloads.xul chrome://browser/content/downloadManagerOverlay.xul
|
||||
% overlay chrome://mozapps/content/extensions/extensions.xul chrome://browser/content/extensionsManagerOverlay.xul
|
||||
@ -71,6 +71,9 @@ browser.jar:
|
||||
content/branding/icon48.png (branding/icon48.png)
|
||||
content/branding/icon64.png (branding/icon64.png)
|
||||
#endif
|
||||
# the following files are browser-specific overrides
|
||||
* content/browser/license.html (/toolkit/content/license.html)
|
||||
% override chrome://global/content/license.html chrome://browser/content/license.html
|
||||
|
||||
#ifdef TOOLBAR_CUSTOMIZATION_SHEET
|
||||
toolkit.jar:
|
||||
|
@ -115,8 +115,6 @@ BrowserGlue.prototype = {
|
||||
if (this._saveSession) {
|
||||
this._setPrefToSaveSession();
|
||||
}
|
||||
this._shutdownPlaces();
|
||||
this.idleService.removeIdleObserver(this, BOOKMARKS_ARCHIVE_IDLE_TIME);
|
||||
break;
|
||||
case "session-save":
|
||||
this._setPrefToSaveSession();
|
||||
@ -221,6 +219,7 @@ BrowserGlue.prototype = {
|
||||
_onProfileShutdown: function()
|
||||
{
|
||||
this._shutdownPlaces();
|
||||
this.idleService.removeIdleObserver(this, BOOKMARKS_ARCHIVE_IDLE_TIME);
|
||||
this.Sanitizer.onShutdown();
|
||||
},
|
||||
|
||||
@ -281,13 +280,15 @@ BrowserGlue.prototype = {
|
||||
getService(Ci.nsIPrefBranch);
|
||||
var showPrompt = true;
|
||||
try {
|
||||
if (prefBranch.getIntPref("browser.startup.page") == 3 ||
|
||||
prefBranch.getBoolPref("browser.sessionstore.resume_session_once"))
|
||||
// browser.warnOnQuit is a hidden global boolean to override all quit prompts
|
||||
// browser.warnOnRestart specifically covers app-initiated restarts where we restart the app
|
||||
// browser.tabs.warnOnClose is the global "warn when closing multiple tabs" pref
|
||||
if (prefBranch.getBoolPref("browser.warnOnQuit") == false)
|
||||
showPrompt = false;
|
||||
else if (aQuitType == "restart")
|
||||
showPrompt = prefBranch.getBoolPref("browser.warnOnRestart");
|
||||
else
|
||||
showPrompt = aQuitType == "restart" ?
|
||||
prefBranch.getBoolPref("browser.warnOnRestart") :
|
||||
prefBranch.getBoolPref("browser.warnOnQuit");
|
||||
showPrompt = prefBranch.getBoolPref("browser.tabs.warnOnClose");
|
||||
} catch (ex) {}
|
||||
|
||||
var buttonChoice = 0;
|
||||
@ -339,7 +340,7 @@ BrowserGlue.prototype = {
|
||||
switch (buttonChoice) {
|
||||
case 2:
|
||||
if (neverAsk.value)
|
||||
prefBranch.setBoolPref("browser.warnOnQuit", false);
|
||||
prefBranch.setBoolPref("browser.tabs.warnOnClose", false);
|
||||
break;
|
||||
case 1:
|
||||
aCancelQuit.QueryInterface(Ci.nsISupportsPRBool);
|
||||
@ -351,8 +352,9 @@ BrowserGlue.prototype = {
|
||||
if (aQuitType == "restart")
|
||||
prefBranch.setBoolPref("browser.warnOnRestart", false);
|
||||
else {
|
||||
// could also set browser.warnOnQuit to false here,
|
||||
// but not setting it is a little safer.
|
||||
// don't prompt in the future
|
||||
prefBranch.setBoolPref("browser.tabs.warnOnClose", false);
|
||||
// always save state when shutting down
|
||||
prefBranch.setIntPref("browser.startup.page", 3);
|
||||
}
|
||||
}
|
||||
@ -388,8 +390,10 @@ BrowserGlue.prototype = {
|
||||
* of the Places db:
|
||||
* - browser.places.importBookmarksHTML
|
||||
* Set to false by the history service to indicate we need to re-import.
|
||||
* - browser.places.createdSmartBookmarks
|
||||
* Set during HTML import to indicate that the queries were created.
|
||||
* - browser.places.smartBookmarksVersion
|
||||
* Set during HTML import to indicate that Smart Bookmarks were created.
|
||||
* Set to -1 to disable Smart Bookmarks creation.
|
||||
* Set to 0 to restore current Smart Bookmarks.
|
||||
*
|
||||
* These prefs are set up by the frontend:
|
||||
* - browser.bookmarks.restore_default_bookmarks
|
||||
@ -444,7 +448,7 @@ BrowserGlue.prototype = {
|
||||
// if there's no JSON backup or we are restoring default bookmarks
|
||||
|
||||
// ensurePlacesDefaultQueriesInitialized() is called by import.
|
||||
prefBranch.setBoolPref("browser.places.createdSmartBookmarks", false);
|
||||
prefBranch.setIntPref("browser.places.smartBookmarksVersion", 0);
|
||||
|
||||
var dirService = Cc["@mozilla.org/file/directory_service;1"].
|
||||
getService(Ci.nsIProperties);
|
||||
@ -491,10 +495,14 @@ BrowserGlue.prototype = {
|
||||
|
||||
// Backup bookmarks to bookmarks.html to support apps that depend
|
||||
// on the legacy format.
|
||||
var prefs = Cc["@mozilla.org/preferences-service;1"].
|
||||
getService(Ci.nsIPrefBranch);
|
||||
var autoExportHTML = false;
|
||||
try {
|
||||
autoExportHTML = prefs.getIntPref("browser.bookmarks.autoExportHTML");
|
||||
} catch(ex) {}
|
||||
autoExportHTML = prefs.getBoolPref("browser.bookmarks.autoExportHTML");
|
||||
} catch(ex) {
|
||||
Components.utils.reportError(ex);
|
||||
}
|
||||
|
||||
if (autoExportHTML) {
|
||||
Cc["@mozilla.org/browser/places/import-export-service;1"].
|
||||
@ -597,19 +605,32 @@ BrowserGlue.prototype = {
|
||||
},
|
||||
|
||||
ensurePlacesDefaultQueriesInitialized: function() {
|
||||
// bail out if the folder is already created
|
||||
const SMART_BOOKMARKS_VERSION = 1;
|
||||
const SMART_BOOKMARKS_ANNO = "Places/SmartBookmark";
|
||||
const SMART_BOOKMARKS_PREF = "browser.places.smartBookmarksVersion";
|
||||
|
||||
// XXX should this be a pref? see bug #399268
|
||||
const MAX_RESULTS = 10;
|
||||
|
||||
var prefBranch = Cc["@mozilla.org/preferences-service;1"].
|
||||
getService(Ci.nsIPrefBranch);
|
||||
var createdSmartBookmarks = false;
|
||||
try {
|
||||
createdSmartBookmarks = prefBranch.getBoolPref("browser.places.createdSmartBookmarks");
|
||||
} catch(ex) { }
|
||||
|
||||
if (createdSmartBookmarks)
|
||||
// get current smart bookmarks version
|
||||
// By default, if the pref is not set up, we must create Smart Bookmarks
|
||||
var smartBookmarksCurrentVersion = 0;
|
||||
try {
|
||||
smartBookmarksCurrentVersion = prefBranch.getIntPref(SMART_BOOKMARKS_PREF);
|
||||
} catch(ex) {}
|
||||
|
||||
// bail out if we don't have to create or update Smart Bookmarks
|
||||
if (smartBookmarksCurrentVersion == -1 ||
|
||||
smartBookmarksCurrentVersion >= SMART_BOOKMARKS_VERSION)
|
||||
return;
|
||||
|
||||
var bmsvc = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].
|
||||
getService(Ci.nsINavBookmarksService);
|
||||
var annosvc = Cc["@mozilla.org/browser/annotation-service;1"].
|
||||
getService(Ci.nsIAnnotationService);
|
||||
|
||||
var callback = {
|
||||
_placesBundle: Cc["@mozilla.org/intl/stringbundle;1"].
|
||||
@ -623,54 +644,91 @@ BrowserGlue.prototype = {
|
||||
},
|
||||
|
||||
runBatched: function() {
|
||||
var smartBookmarksFolderTitle =
|
||||
this._placesBundle.GetStringFromName("smartBookmarksFolderTitle");
|
||||
var mostVisitedTitle =
|
||||
this._placesBundle.GetStringFromName("mostVisitedTitle");
|
||||
var recentlyBookmarkedTitle =
|
||||
this._placesBundle.GetStringFromName("recentlyBookmarkedTitle");
|
||||
var recentTagsTitle =
|
||||
this._placesBundle.GetStringFromName("recentTagsTitle");
|
||||
var smartBookmarks = [];
|
||||
var bookmarksMenuIndex = 0;
|
||||
var bookmarksToolbarIndex = 0;
|
||||
|
||||
var defaultIndex = bmsvc.DEFAULT_INDEX;
|
||||
// MOST VISITED
|
||||
var smart = {queryId: "MostVisited", // don't change this
|
||||
itemId: null,
|
||||
title: this._placesBundle.GetStringFromName("mostVisitedTitle"),
|
||||
uri: this._uri("place:queryType=" +
|
||||
Ci.nsINavHistoryQueryOptions.QUERY_TYPE_HISTORY +
|
||||
"&sort=" +
|
||||
Ci.nsINavHistoryQueryOptions.SORT_BY_VISITCOUNT_DESCENDING +
|
||||
"&maxResults=" + MAX_RESULTS),
|
||||
parent: bmsvc.toolbarFolder,
|
||||
position: bookmarksToolbarIndex++};
|
||||
smartBookmarks.push(smart);
|
||||
|
||||
// index = 0, make it the first folder
|
||||
var placesFolder = bmsvc.createFolder(bmsvc.toolbarFolder, smartBookmarksFolderTitle,
|
||||
0);
|
||||
// RECENTLY BOOKMARKED
|
||||
smart = {queryId: "RecentlyBookmarked", // don't change this
|
||||
itemId: null,
|
||||
title: this._placesBundle.GetStringFromName("recentlyBookmarkedTitle"),
|
||||
uri: this._uri("place:folder=BOOKMARKS_MENU" +
|
||||
"&folder=UNFILED_BOOKMARKS" +
|
||||
"&folder=TOOLBAR" +
|
||||
"&queryType=" +
|
||||
Ci.nsINavHistoryQueryOptions.QUERY_TYPE_BOOKMARKS +
|
||||
"&sort=" +
|
||||
Ci.nsINavHistoryQueryOptions.SORT_BY_DATEADDED_DESCENDING +
|
||||
"&excludeItemIfParentHasAnnotation=livemark%2FfeedURI" +
|
||||
"&maxResults=" + MAX_RESULTS +
|
||||
"&excludeQueries=1"),
|
||||
parent: bmsvc.bookmarksMenuFolder,
|
||||
position: bookmarksMenuIndex++};
|
||||
smartBookmarks.push(smart);
|
||||
|
||||
// XXX should this be a pref? see bug #399268
|
||||
var maxResults = 10;
|
||||
// RECENT TAGS
|
||||
smart = {queryId: "RecentTags", // don't change this
|
||||
itemId: null,
|
||||
title: this._placesBundle.GetStringFromName("recentTagsTitle"),
|
||||
uri: this._uri("place:"+
|
||||
"type=" +
|
||||
Ci.nsINavHistoryQueryOptions.RESULTS_AS_TAG_QUERY +
|
||||
"&sort=" +
|
||||
Ci.nsINavHistoryQueryOptions.SORT_BY_LASTMODIFIED_DESCENDING +
|
||||
"&maxResults=" + MAX_RESULTS),
|
||||
parent: bmsvc.bookmarksMenuFolder,
|
||||
position: bookmarksMenuIndex++};
|
||||
smartBookmarks.push(smart);
|
||||
|
||||
var mostVisitedItem = bmsvc.insertBookmark(placesFolder,
|
||||
this._uri("place:queryType=" +
|
||||
Ci.nsINavHistoryQueryOptions.QUERY_TYPE_HISTORY +
|
||||
"&sort=" +
|
||||
Ci.nsINavHistoryQueryOptions.SORT_BY_VISITCOUNT_DESCENDING +
|
||||
"&maxResults=" + maxResults),
|
||||
defaultIndex, mostVisitedTitle);
|
||||
var smartBookmarkItemIds = annosvc.getItemsWithAnnotation(SMART_BOOKMARKS_ANNO, {});
|
||||
// set current itemId, parent and position if Smart Bookmark exists
|
||||
for each(var itemId in smartBookmarkItemIds) {
|
||||
var queryId = annosvc.getItemAnnotation(itemId, SMART_BOOKMARKS_ANNO);
|
||||
for (var i = 0; i < smartBookmarks.length; i++){
|
||||
if (smartBookmarks[i].queryId == queryId) {
|
||||
smartBookmarks[i].itemId = itemId;
|
||||
smartBookmarks[i].parent = bmsvc.getFolderIdForItem(itemId);
|
||||
smartBookmarks[i].position = bmsvc.getItemIndex(itemId);
|
||||
// remove current item, since it will be replaced
|
||||
bmsvc.removeItem(itemId);
|
||||
break;
|
||||
}
|
||||
// We don't remove old Smart Bookmarks because user could still
|
||||
// find them useful, or could have personalized them.
|
||||
// Instead we remove the Smart Bookmark annotation.
|
||||
if (i == smartBookmarks.length - 1)
|
||||
annosvc.removeItemAnnotation(itemId, SMART_BOOKMARKS_ANNO);
|
||||
}
|
||||
}
|
||||
|
||||
// excludeQueries=1 so that user created "saved searches"
|
||||
// and these queries (added automatically) are excluded
|
||||
var recentlyBookmarkedItem = bmsvc.insertBookmark(placesFolder,
|
||||
this._uri("place:folder=BOOKMARKS_MENU" +
|
||||
"&folder=UNFILED_BOOKMARKS" +
|
||||
"&folder=TOOLBAR" +
|
||||
"&queryType=" + Ci.nsINavHistoryQueryOptions.QUERY_TYPE_BOOKMARKS +
|
||||
"&sort=" +
|
||||
Ci.nsINavHistoryQueryOptions.SORT_BY_DATEADDED_DESCENDING +
|
||||
"&excludeItemIfParentHasAnnotation=livemark%2FfeedURI" +
|
||||
"&maxResults=" + maxResults +
|
||||
"&excludeQueries=1"),
|
||||
defaultIndex, recentlyBookmarkedTitle);
|
||||
|
||||
var sep = bmsvc.insertSeparator(placesFolder, defaultIndex);
|
||||
|
||||
var recentTagsItem = bmsvc.insertBookmark(placesFolder,
|
||||
this._uri("place:"+
|
||||
"type=" + Ci.nsINavHistoryQueryOptions.RESULTS_AS_TAG_QUERY +
|
||||
"&sort=" + Ci.nsINavHistoryQueryOptions.SORT_BY_LASTMODIFIED_DESCENDING +
|
||||
"&maxResults=" + maxResults),
|
||||
defaultIndex, recentTagsTitle);
|
||||
// create smart bookmarks
|
||||
for each(var smartBookmark in smartBookmarks) {
|
||||
smartBookmark.itemId = bmsvc.insertBookmark(smartBookmark.parent,
|
||||
smartBookmark.uri,
|
||||
smartBookmark.position,
|
||||
smartBookmark.title);
|
||||
annosvc.setItemAnnotation(smartBookmark.itemId,
|
||||
SMART_BOOKMARKS_ANNO, smartBookmark.queryId,
|
||||
0, annosvc.EXPIRE_NEVER);
|
||||
}
|
||||
|
||||
// If we are creating all Smart Bookmarks from ground up, add a
|
||||
// separator below them in the bookmarks menu.
|
||||
if (smartBookmarkItemIds.length == 0)
|
||||
bmsvc.insertSeparator(bmsvc.bookmarksMenuFolder, bookmarksMenuIndex);
|
||||
}
|
||||
};
|
||||
|
||||
@ -681,7 +739,7 @@ BrowserGlue.prototype = {
|
||||
Components.utils.reportError(ex);
|
||||
}
|
||||
finally {
|
||||
prefBranch.setBoolPref("browser.places.createdSmartBookmarks", true);
|
||||
prefBranch.setIntPref(SMART_BOOKMARKS_PREF, SMART_BOOKMARKS_VERSION);
|
||||
prefBranch.QueryInterface(Ci.nsIPrefService).savePrefFile(null);
|
||||
}
|
||||
},
|
||||
|
@ -70,7 +70,7 @@ interface nsIBrowserGlue : nsISupports
|
||||
void sanitize(in nsIDOMWindow aParentWindow);
|
||||
|
||||
/**
|
||||
* Add the special "Places" folder (with some special queries) to the personal toolbar folder.
|
||||
* Add Smart Bookmarks special queries to bookmarks menu and toolbar folder.
|
||||
*/
|
||||
void ensurePlacesDefaultQueriesInitialized();
|
||||
};
|
||||
|
@ -124,6 +124,7 @@ var BookmarkPropertiesPanel = {
|
||||
_microsummaries: null,
|
||||
_URIList: null,
|
||||
_postData: null,
|
||||
_charSet: "",
|
||||
|
||||
// sizeToContent is not usable due to bug 90276, so we'll use resizeTo
|
||||
// instead and cache the bookmarks tree view size. See WSucks in the legacy
|
||||
@ -220,6 +221,8 @@ var BookmarkPropertiesPanel = {
|
||||
this._bookmarkKeyword = dialogInfo.keyword;
|
||||
if ("postData" in dialogInfo)
|
||||
this._postData = dialogInfo.postData;
|
||||
if ("charSet" in dialogInfo)
|
||||
this._charSet = dialogInfo.charSet;
|
||||
}
|
||||
|
||||
break;
|
||||
@ -936,6 +939,9 @@ var BookmarkPropertiesPanel = {
|
||||
PlacesUIUtils.ptm.editBookmarkPostData(-1, this._postData));
|
||||
}
|
||||
|
||||
if (this._charSet)
|
||||
PlacesUtils.history.setCharsetForURI(this._bookmarkURI, this._charSet);
|
||||
|
||||
var transactions = [PlacesUIUtils.ptm.createItem(uri, aContainer, aIndex,
|
||||
title, keyword,
|
||||
annotations,
|
||||
|
@ -75,15 +75,18 @@ const REMOVE_PAGES_MAX_SINGLEREMOVES = 10;
|
||||
* insertion point to accommodate the orientation should be done by
|
||||
* the person who constructs the IP, not the user. The orientation
|
||||
* is provided for informational purposes only!
|
||||
* @param [optional] aIsTag
|
||||
* Indicates if parent container is a tag
|
||||
* @constructor
|
||||
*/
|
||||
function InsertionPoint(aItemId, aIndex, aOrientation) {
|
||||
function InsertionPoint(aItemId, aIndex, aOrientation, aIsTag) {
|
||||
this.itemId = aItemId;
|
||||
this.index = aIndex;
|
||||
this.orientation = aOrientation;
|
||||
this.isTag = aIsTag;
|
||||
}
|
||||
InsertionPoint.prototype.toString = function IP_toString() {
|
||||
return "[object InsertionPoint(folder:" + this.itemId + ",index:" + this.index + ",orientation:" + this.orientation + ")]";
|
||||
return "[object InsertionPoint(folder:" + this.itemId + ",index:" + this.index + ",orientation:" + this.orientation + ",isTag:" + this.isTag + ")]";
|
||||
};
|
||||
|
||||
/**
|
||||
@ -308,7 +311,8 @@ PlacesController.prototype = {
|
||||
* Determines whether or not nodes can be inserted relative to the selection.
|
||||
*/
|
||||
_canInsert: function PC__canInsert() {
|
||||
return this._view.insertionPoint != null;
|
||||
var ip = this._view.insertionPoint;
|
||||
return ip != null && ip.isTag != true;
|
||||
},
|
||||
|
||||
/**
|
||||
@ -854,6 +858,18 @@ PlacesController.prototype = {
|
||||
|
||||
if (PlacesUtils.nodeIsFolder(node))
|
||||
removedFolders.push(node);
|
||||
else if (PlacesUtils.nodeIsTagQuery(node.parent)) {
|
||||
var queries = asQuery(node.parent).getQueries({});
|
||||
if (queries.length == 1) {
|
||||
var folders = queries[0].getFolders({});
|
||||
if (folders.length == 1) {
|
||||
var uri = PlacesUtils._uri(node.uri);
|
||||
var tagItemId = folders[0];
|
||||
transactions.push(PlacesUIUtils.ptm.untagURI(uri, [tagItemId]));
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
transactions.push(PlacesUIUtils.ptm.removeItem(node.itemId));
|
||||
}
|
||||
@ -1337,9 +1353,17 @@ var PlacesControllerDragHelper = {
|
||||
movedCount++;
|
||||
}
|
||||
|
||||
transactions.push(PlacesUIUtils.makeTransaction(unwrapped,
|
||||
flavor.value, insertionPoint.itemId,
|
||||
index, copy));
|
||||
// if dragging over a tag container we should tag the item
|
||||
if (insertionPoint.isTag) {
|
||||
var uri = PlacesUtils._uri(unwrapped.uri);
|
||||
var tagItemId = insertionPoint.itemId;
|
||||
transactions.push(PlacesUIUtils.ptm.tagURI(uri,[tagItemId]));
|
||||
}
|
||||
else {
|
||||
transactions.push(PlacesUIUtils.makeTransaction(unwrapped,
|
||||
flavor.value, insertionPoint.itemId,
|
||||
index, copy));
|
||||
}
|
||||
}
|
||||
|
||||
var txn = PlacesUIUtils.ptm.aggregateTransactions("DropItems", transactions);
|
||||
|
@ -189,12 +189,15 @@
|
||||
<parameter name="aXferData"/>
|
||||
<parameter name="aDragAction"/>
|
||||
<body><![CDATA[
|
||||
if (aEvent.ctrlKey)
|
||||
// Force a copy action if parent node is a query
|
||||
if (aEvent.ctrlKey ||
|
||||
PlacesUtils.nodeIsQuery(aEvent.target.node.parent))
|
||||
aDragAction.action = Ci.nsIDragService.DRAGDROP_ACTION_COPY;
|
||||
|
||||
// activate the view and cache the dragged node
|
||||
this._rootView._draggedNode = aEvent.target.node;
|
||||
this._rootView.focus();
|
||||
|
||||
aXferData.data = this._rootView.controller
|
||||
.getTransferData(aDragAction.action);
|
||||
]]></body>
|
||||
@ -274,7 +277,8 @@
|
||||
var nodeY = xulNode.boxObject.y - popupY;
|
||||
var nodeHeight = xulNode.boxObject.height;
|
||||
if (xulNode.node &&
|
||||
PlacesUtils.nodeIsFolder(xulNode.node) &&
|
||||
(PlacesUtils.nodeIsFolder(xulNode.node) ||
|
||||
PlacesUtils.nodeIsTagQuery(xulNode.node)) &&
|
||||
!PlacesUtils.nodeIsReadOnly(xulNode.node)) {
|
||||
// This is a folder. If the mouse is in the top 25% of the
|
||||
// node, drop above the folder. If it's in the middle
|
||||
@ -893,8 +897,12 @@
|
||||
// By default, the insertion point is at the top level, at the end.
|
||||
var index = -1;
|
||||
var folderId = 0;
|
||||
if (PlacesUtils.nodeIsFolder(this._resultNode))
|
||||
var isTag = false;
|
||||
|
||||
if (PlacesUtils.nodeIsFolder(this._resultNode)) {
|
||||
folderId = PlacesUtils.getConcreteItemId(this._resultNode);
|
||||
isTag = PlacesUtils.nodeIsTagQuery(this._resultNode);
|
||||
}
|
||||
|
||||
var selectedNode = this.selectedNode;
|
||||
if (selectedNode) {
|
||||
@ -907,10 +915,11 @@
|
||||
// If there is another type of node selected, the insertion point
|
||||
// is after that node.
|
||||
folderId = PlacesUtils.getConcreteItemId(selectedNode.parent);
|
||||
index = PlacesUtils.getIndexOfNode(selectedNode)
|
||||
index = PlacesUtils.getIndexOfNode(selectedNode);
|
||||
isTag = PlacesUtils.nodeIsTagQuery(selectedNode.parent);
|
||||
}
|
||||
}
|
||||
return new InsertionPoint(folderId, index);
|
||||
return new InsertionPoint(folderId, index, 1, isTag);
|
||||
]]></getter>
|
||||
</property>
|
||||
|
||||
|
@ -29,8 +29,8 @@ button.commandButton {
|
||||
|
||||
/* Edit Item Panel */
|
||||
|
||||
#infoScrollbox[minimal="true"] #editBMPanel_descriptionRow,
|
||||
#infoScrollbox[minimal="true"] #editBMPanel_loadInSidebarCheckbox,
|
||||
#infoScrollbox[minimal="true"] #editBMPanel_keywordRow {
|
||||
#infoBox[minimal="true"] #editBMPanel_descriptionRow,
|
||||
#infoBox[minimal="true"] #editBMPanel_loadInSidebarCheckbox,
|
||||
#infoBox[minimal="true"] #editBMPanel_keywordRow {
|
||||
visibility: collapse;
|
||||
}
|
||||
|
@ -223,14 +223,61 @@ var PlacesOrganizer = {
|
||||
searchFilter.reset();
|
||||
}
|
||||
|
||||
// Update the "Find in <current collection>" command and the gray text in
|
||||
// the search box in the toolbar if the active collection is the current
|
||||
// collection.
|
||||
this._setSearchScopeForNode(node);
|
||||
},
|
||||
|
||||
/**
|
||||
* Sets the search scope based on node's properties
|
||||
* @param aNode
|
||||
* the node to set up scope from
|
||||
*/
|
||||
_setSearchScopeForNode: function PO__setScopeForNode(aNode) {
|
||||
var scopeBarFolder = document.getElementById("scopeBarFolder");
|
||||
var itemId = aNode.itemId;
|
||||
if (PlacesUtils.nodeIsHistoryContainer(aNode) ||
|
||||
itemId == PlacesUIUtils.leftPaneQueries["History"]) {
|
||||
scopeBarFolder.disabled = true;
|
||||
var folders = [];
|
||||
var filterCollection = "history";
|
||||
var scopeButton = "scopeBarHistory";
|
||||
}
|
||||
else if (PlacesUtils.nodeIsFolder(aNode) &&
|
||||
itemId != PlacesUIUtils.leftPaneQueries["AllBookmarks"] &&
|
||||
itemId != PlacesUIUtils.leftPaneQueries["Tags"] &&
|
||||
aNode.parent.itemId != PlacesUIUtils.leftPaneQueries["Tags"]) {
|
||||
// enable folder scope
|
||||
scopeBarFolder.disabled = false;
|
||||
var folders = [PlacesUtils.getConcreteItemId(aNode)];
|
||||
var filterCollection = "collection";
|
||||
var scopeButton = "scopeBarFolder";
|
||||
}
|
||||
else {
|
||||
// default to All Bookmarks
|
||||
scopeBarFolder.disabled = true;
|
||||
var folders = [];
|
||||
var filterCollection = "bookmarks";
|
||||
var scopeButton = "scopeBarAll";
|
||||
}
|
||||
|
||||
// set search scope
|
||||
PlacesSearchBox.folders = folders;
|
||||
PlacesSearchBox.filterCollection = filterCollection;
|
||||
|
||||
// update scope bar active child
|
||||
var scopeBar = document.getElementById("organizerScopeBar");
|
||||
var child = scopeBar.firstChild;
|
||||
while (child) {
|
||||
if (child.getAttribute("id") != scopeButton)
|
||||
child.removeAttribute("checked");
|
||||
else
|
||||
child.setAttribute("checked", "true");
|
||||
child = child.nextSibling;
|
||||
}
|
||||
|
||||
// Update the "Find in <current collection>" command
|
||||
var findCommand = document.getElementById("OrganizerCommand_find:current");
|
||||
var findLabel = PlacesUIUtils.getFormattedString("findInPrefix", [node.title]);
|
||||
var findLabel = PlacesUIUtils.getFormattedString("findInPrefix", [aNode.title]);
|
||||
findCommand.setAttribute("label", findLabel);
|
||||
if (PlacesSearchBox.filterCollection == "collection")
|
||||
PlacesSearchBox.updateCollectionTitle(node.title);
|
||||
},
|
||||
|
||||
/**
|
||||
@ -517,27 +564,27 @@ var PlacesOrganizer = {
|
||||
function PO__detectAndSetDetailsPaneMinimalState(aNode) {
|
||||
/**
|
||||
* The details of simple folder-items (as opposed to livemarks) or the
|
||||
* of livemark-children are not likely to fill the scrollbox anyway,
|
||||
* of livemark-children are not likely to fill the infoBox anyway,
|
||||
* thus we remove the "More/Less" button and show all details.
|
||||
*
|
||||
* the wasminimal attribute here is used to persist the "more/less"
|
||||
* state in a bookmark->folder->bookmark scenario.
|
||||
*/
|
||||
var infoScrollbox = document.getElementById("infoScrollbox");
|
||||
var scrollboxExpander = document.getElementById("infoScrollboxExpander");
|
||||
var infoBox = document.getElementById("infoBox");
|
||||
var infoBoxExpander = document.getElementById("infoBoxExpander");
|
||||
if ((PlacesUtils.nodeIsFolder(aNode) &&
|
||||
!PlacesUtils.nodeIsLivemarkContainer(aNode)) ||
|
||||
PlacesUtils.nodeIsLivemarkItem(aNode)) {
|
||||
if (infoScrollbox.getAttribute("minimal") == "true")
|
||||
infoScrollbox.setAttribute("wasminimal", "true");
|
||||
infoScrollbox.removeAttribute("minimal");
|
||||
scrollboxExpander.hidden = true;
|
||||
if (infoBox.getAttribute("minimal") == "true")
|
||||
infoBox.setAttribute("wasminimal", "true");
|
||||
infoBox.removeAttribute("minimal");
|
||||
infoBoxExpander.hidden = true;
|
||||
}
|
||||
else {
|
||||
if (infoScrollbox.getAttribute("wasminimal") == "true")
|
||||
infoScrollbox.setAttribute("minimal", "true");
|
||||
infoScrollbox.removeAttribute("wasminimal");
|
||||
scrollboxExpander.hidden = false;
|
||||
if (infoBox.getAttribute("wasminimal") == "true")
|
||||
infoBox.setAttribute("minimal", "true");
|
||||
infoBox.removeAttribute("wasminimal");
|
||||
infoBoxExpander.hidden = false;
|
||||
}
|
||||
},
|
||||
|
||||
@ -562,11 +609,12 @@ var PlacesOrganizer = {
|
||||
focusedElement.blur();
|
||||
}
|
||||
|
||||
var contentTree = document.getElementById("placeContent");
|
||||
var infoBox = document.getElementById("infoBox");
|
||||
var detailsDeck = document.getElementById("detailsDeck");
|
||||
detailsDeck.selectedIndex = 1;
|
||||
var selectedNode = contentTree.selectedNode;
|
||||
var selectedNode = this._content.selectedNode;
|
||||
if (selectedNode) {
|
||||
infoBox.hidden = false;
|
||||
if (selectedNode.itemId != -1 &&
|
||||
!PlacesUtils.nodeIsSeparator(selectedNode)) {
|
||||
if (this._paneDisabled) {
|
||||
@ -595,6 +643,9 @@ var PlacesOrganizer = {
|
||||
}
|
||||
else {
|
||||
detailsDeck.selectedIndex = 0;
|
||||
// The details deck has the height of its biggest child, so we hide the
|
||||
// infoBox to allow it shrinking when there is no selection.
|
||||
infoBox.hidden = true;
|
||||
var selectItemDesc = document.getElementById("selectItemDescription");
|
||||
var itemsCountLabel = document.getElementById("itemsCountText");
|
||||
var rowCount = this._content.treeBoxObject.view.rowCount;
|
||||
@ -645,17 +696,17 @@ var PlacesOrganizer = {
|
||||
},
|
||||
|
||||
toggleAdditionalInfoFields: function PO_toggleAdditionalInfoFields() {
|
||||
var infoScrollbox = document.getElementById("infoScrollbox");
|
||||
var scrollboxExpander = document.getElementById("infoScrollboxExpander");
|
||||
if (infoScrollbox.getAttribute("minimal") == "true") {
|
||||
infoScrollbox.removeAttribute("minimal");
|
||||
scrollboxExpander.label = scrollboxExpander.getAttribute("lesslabel");
|
||||
scrollboxExpander.accessKey = scrollboxExpander.getAttribute("lessaccesskey");
|
||||
var infoBox = document.getElementById("infoBox");
|
||||
var infoBoxExpander = document.getElementById("infoBoxExpander");
|
||||
if (infoBox.getAttribute("minimal") == "true") {
|
||||
infoBox.removeAttribute("minimal");
|
||||
infoBoxExpander.label = infoBoxExpander.getAttribute("lesslabel");
|
||||
infoBoxExpander.accessKey = infoBoxExpander.getAttribute("lessaccesskey");
|
||||
}
|
||||
else {
|
||||
infoScrollbox.setAttribute("minimal", "true");
|
||||
scrollboxExpander.label = scrollboxExpander.getAttribute("morelabel");
|
||||
scrollboxExpander.accessKey = scrollboxExpander.getAttribute("moreaccesskey");
|
||||
infoBox.setAttribute("minimal", "true");
|
||||
infoBoxExpander.label = infoBoxExpander.getAttribute("morelabel");
|
||||
infoBoxExpander.accessKey = infoBoxExpander.getAttribute("moreaccesskey");
|
||||
}
|
||||
},
|
||||
|
||||
@ -817,10 +868,13 @@ var PlacesSearchBox = {
|
||||
* The title of the current collection.
|
||||
*/
|
||||
updateCollectionTitle: function PSB_updateCollectionTitle(title) {
|
||||
this.searchFilter.emptyText =
|
||||
title ?
|
||||
PlacesUIUtils.getFormattedString("searchCurrentDefault", [title]) :
|
||||
PlacesUIUtils.getString("searchBookmarks");
|
||||
if (title)
|
||||
this.searchFilter.emptyText =
|
||||
PlacesUIUtils.getFormattedString("searchCurrentDefault", [title]);
|
||||
else
|
||||
this.searchFilter.emptyText = this.filterCollection == "history" ?
|
||||
PlacesUIUtils.getString("searchHistory") :
|
||||
PlacesUIUtils.getString("searchBookmarks");
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -400,15 +400,15 @@
|
||||
onclick="PlacesOrganizer.onTreeClick(event);"
|
||||
seltype="single"
|
||||
persist="width"
|
||||
width="200">
|
||||
width="200"
|
||||
minwidth="100"
|
||||
maxwidth="400">
|
||||
<treecols>
|
||||
<treecol anonid="title" flex="1" primary="true" hideheader="true"/>
|
||||
</treecols>
|
||||
<treechildren flex="1"/>
|
||||
</tree>
|
||||
<splitter id="splitter" collapse="before" persist="state">
|
||||
<grippy/>
|
||||
</splitter>
|
||||
<splitter collapse="none" persist="state"></splitter>
|
||||
<vbox id="contentView" flex="4">
|
||||
<deck id="contentDeck" flex="1">
|
||||
<vbox id="defaultView" flex="1">
|
||||
@ -422,12 +422,6 @@
|
||||
oncommand="PlacesQueryBuilder.onScopeSelected(this);"
|
||||
label="&search.scopeAll.label;"
|
||||
checked="true"/>
|
||||
<toolbarbutton id="scopeBarMenu" type="radio" group="scopeBar"
|
||||
oncommand="PlacesQueryBuilder.onScopeSelected(this);"
|
||||
label="&search.scopeMenu.label;"/>
|
||||
<toolbarbutton id="scopeBarToolbar" type="radio" group="scopeBar"
|
||||
oncommand="PlacesQueryBuilder.onScopeSelected(this);"
|
||||
label="&search.scopeToolbar.label;"/>
|
||||
<!--
|
||||
<toolbarbutton id="scopeBarDownloads" type="radio" group="scopeBar"
|
||||
oncommand="PlacesQueryBuilder.onScopeSelected(this);"
|
||||
@ -493,12 +487,9 @@
|
||||
</treecols>
|
||||
<treechildren flex="1"/>
|
||||
</tree>
|
||||
<splitter id="contentSplitter" collapse="after" persist="state">
|
||||
<grippy/>
|
||||
</splitter>
|
||||
<hbox persist="height" id="infoPane">
|
||||
<hbox id="infoPaneBox">
|
||||
<deck flex="1" id="detailsDeck">
|
||||
<vbox align="center">
|
||||
<vbox id="itemsCountBox" align="center">
|
||||
<spacer flex="3"/>
|
||||
<label id="itemsCountText"/>
|
||||
<spacer flex="1"/>
|
||||
@ -507,10 +498,10 @@
|
||||
</description>
|
||||
<spacer flex="3"/>
|
||||
</vbox>
|
||||
<scrollbox id="infoScrollbox" minimal="true" orient="vertical" flex="1" style='overflow: auto;'>
|
||||
<vbox id="infoBox" minimal="true">
|
||||
<vbox id="editBookmarkPanelContent"/>
|
||||
<hbox>
|
||||
<button type="image" id="infoScrollboxExpander"
|
||||
<button type="image" id="infoBoxExpander"
|
||||
lesslabel="&detailsPane.less.label;"
|
||||
lessaccesskey="&detailsPane.less.accesskey;"
|
||||
morelabel="&detailsPane.more.label;"
|
||||
@ -521,7 +512,7 @@
|
||||
observes="paneElementsBroadcaster"/>
|
||||
<spacer flex="1"/>
|
||||
</hbox>
|
||||
</scrollbox>
|
||||
</vbox>
|
||||
</deck>
|
||||
</hbox>
|
||||
</vbox>
|
||||
|
@ -192,6 +192,8 @@
|
||||
|
||||
if (PlacesUtils.containerTypes.indexOf(type) != -1) {
|
||||
button.setAttribute("type", "menu");
|
||||
if (PlacesUtils.nodeIsQuery(aChild))
|
||||
button.setAttribute("query", "true");
|
||||
button.setAttribute("container", "true");
|
||||
if (PlacesUtils.nodeIsLivemarkContainer(aChild))
|
||||
button.setAttribute("livemark", "true");
|
||||
@ -380,6 +382,7 @@
|
||||
// By default, the insertion point is at the top level, at the end.
|
||||
var index = -1;
|
||||
var folderId = PlacesUtils.getConcreteItemId(this._result.root);
|
||||
var isTag = false;
|
||||
|
||||
var selectedNode = this.selectedNode;
|
||||
if (selectedNode) {
|
||||
@ -393,9 +396,10 @@
|
||||
// is after that node.
|
||||
folderId = PlacesUtils.getConcreteItemId(selectedNode.parent);
|
||||
index = PlacesUtils.getIndexOfNode(selectedNode);
|
||||
isTag = PlacesUtils.nodeIsTagQuery(selectedNode.parent);
|
||||
}
|
||||
}
|
||||
return new InsertionPoint(folderId, index, 1);
|
||||
return new InsertionPoint(folderId, index, 1, isTag);
|
||||
]]></getter>
|
||||
</property>
|
||||
|
||||
|
@ -491,6 +491,9 @@
|
||||
<method name="_disallowInsertion">
|
||||
<parameter name="aContainer"/>
|
||||
<body><![CDATA[
|
||||
// allow dropping into Tag containers
|
||||
if (PlacesUtils.nodeIsTagQuery(aContainer))
|
||||
return false;
|
||||
// Disallow insertion of items under readonly folders
|
||||
return (!PlacesUtils.nodeIsFolder(aContainer) ||
|
||||
PlacesUtils.nodeIsReadOnly(aContainer));
|
||||
@ -554,7 +557,8 @@
|
||||
return null;
|
||||
|
||||
return new InsertionPoint(PlacesUtils.getConcreteItemId(container),
|
||||
index, orientation);
|
||||
index, orientation,
|
||||
PlacesUtils.nodeIsTagQuery(container));
|
||||
]]></body>
|
||||
</method>
|
||||
|
||||
@ -669,7 +673,8 @@
|
||||
// If this node is part of a readonly container (e.g. a livemark) it
|
||||
// cannot be moved, only copied, so we must change the action used
|
||||
// by the drag session.
|
||||
if (PlacesUtils.nodeIsReadOnly(parent)) {
|
||||
if (PlacesUtils.nodeIsReadOnly(parent) ||
|
||||
PlacesUtils.nodeIsTagQuery(parent)) {
|
||||
dragAction.action = Ci.nsIDragService.DRAGDROP_ACTION_COPY;
|
||||
break;
|
||||
}
|
||||
|
@ -890,6 +890,7 @@ PlacesTreeView.prototype = {
|
||||
properties = new Array();
|
||||
var nodeType = node.type;
|
||||
if (PlacesUtils.containerTypes.indexOf(nodeType) != -1) {
|
||||
var itemId = node.itemId;
|
||||
if (nodeType == Ci.nsINavHistoryResultNode.RESULT_TYPE_QUERY) {
|
||||
properties.push(this._getAtomFor("query"));
|
||||
if (this._showQueryAsFolder)
|
||||
@ -897,16 +898,30 @@ PlacesTreeView.prototype = {
|
||||
}
|
||||
else if (nodeType == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER ||
|
||||
nodeType == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT) {
|
||||
if (PlacesUtils.annotations.itemHasAnnotation(node.itemId,
|
||||
|
||||
if (PlacesUtils.annotations.itemHasAnnotation(itemId,
|
||||
LMANNO_FEEDURI))
|
||||
properties.push(this._getAtomFor("livemark"));
|
||||
else if (PlacesUtils.bookmarks.getFolderIdForItem(node.itemId) ==
|
||||
else if (PlacesUtils.bookmarks.getFolderIdForItem(itemId) ==
|
||||
PlacesUtils.tagsFolderId)
|
||||
properties.push(this._getAtomFor("tagContainer"));
|
||||
}
|
||||
|
||||
if (itemId != -1) {
|
||||
var oqAnno;
|
||||
try {
|
||||
oqAnno = PlacesUtils.annotations.getItemAnnotation(itemId, ORGANIZER_QUERY_ANNO);
|
||||
properties.push(this._getAtomFor("OrganizerQuery_" + oqAnno));
|
||||
}
|
||||
catch (ex) { /* not a special query */ }
|
||||
}
|
||||
}
|
||||
else if (nodeType == Ci.nsINavHistoryResultNode.RESULT_TYPE_SEPARATOR)
|
||||
properties.push(this._getAtomFor("separator"));
|
||||
else if (itemId != -1) { // bookmark nodes
|
||||
if (PlacesUtils.nodeIsLivemarkContainer(node.parent))
|
||||
properties.push(this._getAtomFor("livemarkItem"));
|
||||
}
|
||||
|
||||
this._visibleElements[aRow].properties = properties;
|
||||
}
|
||||
@ -983,7 +998,8 @@ PlacesTreeView.prototype = {
|
||||
if (elt.localName == "tree" && elt.view == this &&
|
||||
this.selection.isSelected(aRow))
|
||||
return false;
|
||||
if (node.parent && PlacesUtils.nodeIsReadOnly(node.parent))
|
||||
if (node.parent && PlacesUtils.nodeIsReadOnly(node.parent) &&
|
||||
!PlacesUtils.nodeIsTagQuery(node))
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -995,6 +1011,9 @@ PlacesTreeView.prototype = {
|
||||
// either add a helper to PlacesUtils or keep it here and add insertionPoint
|
||||
// to the view interface.
|
||||
_disallowInsertion: function PTV__disallowInsertion(aContainer) {
|
||||
// allow dropping into Tag containers
|
||||
if (PlacesUtils.nodeIsTagQuery(aContainer))
|
||||
return false;
|
||||
// Disallow insertion of items under readonly folders
|
||||
return (!PlacesUtils.nodeIsFolder(aContainer) ||
|
||||
PlacesUtils.nodeIsReadOnly(aContainer));
|
||||
@ -1041,7 +1060,8 @@ PlacesTreeView.prototype = {
|
||||
return null;
|
||||
|
||||
return new InsertionPoint(PlacesUtils.getConcreteItemId(container),
|
||||
index, orientation);
|
||||
index, orientation,
|
||||
PlacesUtils.nodeIsTagQuery(container));
|
||||
},
|
||||
|
||||
drop: function PTV_drop(aRow, aOrientation) {
|
||||
@ -1103,18 +1123,10 @@ PlacesTreeView.prototype = {
|
||||
return "";
|
||||
|
||||
var node = this._visibleElements[aRow].node;
|
||||
|
||||
// Containers may or may not have favicons. If not, we will return
|
||||
// nothing as the image, and the style rule should pick up the
|
||||
// default. Separator rows never have icons.
|
||||
if (PlacesUtils.nodeIsSeparator(node) ||
|
||||
(PlacesUtils.nodeIsContainer(node) && !node.icon))
|
||||
return "";
|
||||
|
||||
// For consistency, we always return a favicon for non-containers,
|
||||
// even if it is just the default one.
|
||||
var icon = node.icon || PlacesUtils.favicons.defaultFavicon;
|
||||
return icon ? icon.spec : "";
|
||||
var icon = node.icon;
|
||||
if (icon)
|
||||
return icon.spec;
|
||||
return "";
|
||||
},
|
||||
|
||||
getProgressMode: function(aRow, aColumn) { },
|
||||
|
@ -418,6 +418,8 @@ var PlacesUIUtils = {
|
||||
* will be shown in the dialog if this is used.
|
||||
* @param [optional] aPostData
|
||||
* POST data for POST-style keywords.
|
||||
* @param [optional] aCharSet
|
||||
* The character set for the bookmarked page.
|
||||
* @return true if any transaction has been performed.
|
||||
*
|
||||
* Notes:
|
||||
@ -433,7 +435,8 @@ var PlacesUIUtils = {
|
||||
aShowPicker,
|
||||
aLoadInSidebar,
|
||||
aKeyword,
|
||||
aPostData) {
|
||||
aPostData,
|
||||
aCharSet) {
|
||||
var info = {
|
||||
action: "add",
|
||||
type: "bookmark"
|
||||
@ -462,6 +465,8 @@ var PlacesUIUtils = {
|
||||
info.keyword = aKeyword;
|
||||
if (typeof(aPostData) == "string")
|
||||
info.postData = aPostData;
|
||||
if (typeof(aCharSet) == "string")
|
||||
info.charSet = aCharSet;
|
||||
}
|
||||
|
||||
return this._showBookmarkDialog(info);
|
||||
@ -481,7 +486,8 @@ var PlacesUIUtils = {
|
||||
showMinimalAddBookmarkUI:
|
||||
function PU_showMinimalAddBookmarkUI(aURI, aTitle, aDescription,
|
||||
aDefaultInsertionPoint, aShowPicker,
|
||||
aLoadInSidebar, aKeyword, aPostData) {
|
||||
aLoadInSidebar, aKeyword, aPostData,
|
||||
aCharSet) {
|
||||
var info = {
|
||||
action: "add",
|
||||
type: "bookmark",
|
||||
@ -510,6 +516,8 @@ var PlacesUIUtils = {
|
||||
info.keyword = aKeyword;
|
||||
if (typeof(aPostData) == "string")
|
||||
info.postData = aPostData;
|
||||
if (typeof(aCharSet) == "string")
|
||||
info.charSet = aCharSet;
|
||||
}
|
||||
else
|
||||
info.hiddenRows.push("keyword");
|
||||
@ -1155,8 +1163,12 @@ var PlacesUIUtils = {
|
||||
// XXX: Downloads
|
||||
|
||||
// Tags Query
|
||||
uri = PlacesUtils._uri("place:folder=TAGS");
|
||||
itemId = PlacesUtils.bookmarks.insertBookmark(leftPaneRoot, uri, -1, null);
|
||||
uri = PlacesUtils._uri("place:type=" +
|
||||
Ci.nsINavHistoryQueryOptions.RESULTS_AS_TAG_QUERY +
|
||||
"&sort=" +
|
||||
Ci.nsINavHistoryQueryOptions.SORT_BY_TITLE_ASCENDING);
|
||||
title = PlacesUtils.bookmarks.getItemTitle(PlacesUtils.tagsFolderId);
|
||||
itemId = PlacesUtils.bookmarks.insertBookmark(leftPaneRoot, uri, -1, title);
|
||||
PlacesUtils.annotations.setItemAnnotation(itemId, ORGANIZER_QUERY_ANNO,
|
||||
"Tags", 0, EXPIRE_NEVER);
|
||||
self.leftPaneQueries["Tags"] = itemId;
|
||||
|
@ -129,7 +129,6 @@ static NS_DEFINE_CID(kParserCID, NS_PARSER_CID);
|
||||
#define LOAD_IN_SIDEBAR_ANNO NS_LITERAL_CSTRING("bookmarkProperties/loadInSidebar")
|
||||
#define DESCRIPTION_ANNO NS_LITERAL_CSTRING("bookmarkProperties/description")
|
||||
#define POST_DATA_ANNO NS_LITERAL_CSTRING("bookmarkProperties/POSTData")
|
||||
#define LAST_CHARSET_ANNO NS_LITERAL_CSTRING("URIProperties/characterSet")
|
||||
#define STATIC_TITLE_ANNO NS_LITERAL_CSTRING("bookmarks/staticTitle")
|
||||
|
||||
#define BOOKMARKS_MENU_ICON_URI "chrome://browser/skin/places/bookmarksMenu.png"
|
||||
@ -987,13 +986,8 @@ BookmarkContentSink::HandleLinkBegin(const nsIParserNode& node)
|
||||
|
||||
// import last charset
|
||||
if (!lastCharset.IsEmpty()) {
|
||||
PRBool hasCharset = PR_FALSE;
|
||||
mAnnotationService->ItemHasAnnotation(frame.mPreviousId,
|
||||
LAST_CHARSET_ANNO, &hasCharset);
|
||||
if (!hasCharset)
|
||||
mAnnotationService->SetItemAnnotationString(frame.mPreviousId, LAST_CHARSET_ANNO,
|
||||
lastCharset, 0,
|
||||
nsIAnnotationService::EXPIRE_NEVER);
|
||||
rv = mHistoryService->SetCharsetForURI(frame.mPreviousLink,lastCharset);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "setCharsetForURI failed");
|
||||
}
|
||||
}
|
||||
|
||||
@ -1935,15 +1929,9 @@ nsPlacesImportExportService::WriteItem(nsINavHistoryResultNode* aItem,
|
||||
}
|
||||
|
||||
// last charset
|
||||
PRBool hasLastCharset = PR_FALSE;
|
||||
rv = mAnnotationService->ItemHasAnnotation(itemId, LAST_CHARSET_ANNO,
|
||||
&hasLastCharset);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
if (hasLastCharset) {
|
||||
nsAutoString lastCharset;
|
||||
rv = mAnnotationService->GetItemAnnotationString(itemId, LAST_CHARSET_ANNO,
|
||||
lastCharset);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
nsAutoString lastCharset;
|
||||
if (NS_SUCCEEDED(mHistoryService->GetCharsetForURI(pageURI, lastCharset)) &&
|
||||
!lastCharset.IsEmpty()) {
|
||||
rv = aOutput->Write(kLastCharsetAttribute, sizeof(kLastCharsetAttribute)-1, &dummy);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
char* escapedLastCharset = nsEscapeHTML(NS_ConvertUTF16toUTF8(lastCharset).get());
|
||||
|
@ -171,7 +171,7 @@ placesTransactionsService.prototype = {
|
||||
return new placesTagURITransaction(aURI, aTags);
|
||||
},
|
||||
|
||||
untagURI: function placesTagURI(aURI, aTags) {
|
||||
untagURI: function placesUntagURI(aURI, aTags) {
|
||||
return new placesUntagURITransaction(aURI, aTags);
|
||||
},
|
||||
|
||||
@ -461,10 +461,19 @@ placesMoveItemTransactions.prototype = {
|
||||
|
||||
doTransaction: function PMIT_doTransaction() {
|
||||
PlacesUtils.bookmarks.moveItem(this._id, this._newContainer, this._newIndex);
|
||||
// if newIndex == DEFAULT_INDEX we append, so get correct index for undo
|
||||
if (this._newIndex == PlacesUtils.bookmarks.DEFAULT_INDEX)
|
||||
this._newIndex = PlacesUtils.bookmarks.getItemIndex(this._id);
|
||||
},
|
||||
|
||||
undoTransaction: function PMIT_undoTransaction() {
|
||||
PlacesUtils.bookmarks.moveItem(this._id, this._oldContainer, this._oldIndex);
|
||||
// moving down in the same container takes in count removal of the item
|
||||
// so to revert positions we must move to oldIndex + 1
|
||||
if (this._newContainer == this._oldContainer &&
|
||||
this._oldIndex > this._newIndex)
|
||||
PlacesUtils.bookmarks.moveItem(this._id, this._oldContainer, this._oldIndex + 1);
|
||||
else
|
||||
PlacesUtils.bookmarks.moveItem(this._id, this._oldContainer, this._oldIndex);
|
||||
}
|
||||
};
|
||||
|
||||
@ -910,12 +919,13 @@ placesTagURITransaction.prototype = {
|
||||
__proto__: placesBaseTransaction.prototype,
|
||||
|
||||
doTransaction: function PTU_doTransaction() {
|
||||
if (PlacesUtils.getBookmarksForURI(this._uri).length == 0) {
|
||||
if (PlacesUtils.getMostRecentBookmarkForURI(this._uri) == -1) {
|
||||
// Force an unfiled bookmark first
|
||||
this._unfiledItemId =
|
||||
PlacesUtils.bookmarks
|
||||
.insertBookmark(PlacesUtils.unfiledBookmarksFolderId,
|
||||
this._uri, -1,
|
||||
this._uri,
|
||||
PlacesUtils.bookmarks.DEFAULT_INDEX,
|
||||
PlacesUtils.history.getPageTitle(this._uri));
|
||||
}
|
||||
PlacesUtils.tagging.tagURI(this._uri, this._tags);
|
||||
|
@ -39,7 +39,6 @@
|
||||
const LOAD_IN_SIDEBAR_ANNO = "bookmarkProperties/loadInSidebar";
|
||||
const DESCRIPTION_ANNO = "bookmarkProperties/description";
|
||||
const POST_DATA_ANNO = "bookmarkProperties/POSTData";
|
||||
const LAST_CHARSET_ANNO = "URIProperties/characterSet";
|
||||
|
||||
Components.utils.import("resource://gre/modules/utils.js");
|
||||
do_check_eq(typeof PlacesUtils, "object");
|
||||
@ -63,7 +62,7 @@ function run_test() {
|
||||
|
||||
// avoid creating the places smart folder during tests
|
||||
Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch).
|
||||
setBoolPref("browser.places.createdSmartBookmarks", true);
|
||||
setIntPref("browser.places.smartBookmarksVersion", -1);
|
||||
|
||||
// file pointer to legacy bookmarks file
|
||||
//var bookmarksFileOld = do_get_file("browser/components/places/tests/unit/bookmarks.large.html");
|
||||
@ -209,10 +208,10 @@ function testCanonicalBookmarks() {
|
||||
do_check_eq("hidden1%3Dbar&text1%3D%25s",
|
||||
PlacesUtils.annotations.getItemAnnotation(testBookmark1.itemId, POST_DATA_ANNO));
|
||||
|
||||
// last charset
|
||||
do_check_true(PlacesUtils.annotations.itemHasAnnotation(testBookmark1.itemId, LAST_CHARSET_ANNO));
|
||||
do_check_eq("ISO-8859-1", PlacesUtils.annotations.getItemAnnotation(testBookmark1.itemId,
|
||||
LAST_CHARSET_ANNO));
|
||||
// last charset
|
||||
var testURI = PlacesUtils._uri(testBookmark1.uri);
|
||||
do_check_eq("ISO-8859-1", PlacesUtils.history.getCharsetForURI(testURI));
|
||||
|
||||
// description
|
||||
do_check_true(PlacesUtils.annotations.itemHasAnnotation(testBookmark1.itemId,
|
||||
DESCRIPTION_ANNO));
|
||||
|
122
browser/components/places/tests/unit/test_421483.js
Normal file
@ -0,0 +1,122 @@
|
||||
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et: */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Places Unit Test code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Mozilla Corp.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2008
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Marco Bonardo <mak77@supereva.it>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
// Get bookmarks service
|
||||
try {
|
||||
var bmsvc = Cc["@mozilla.org/browser/nav-bookmarks-service;1"].
|
||||
getService(Ci.nsINavBookmarksService);
|
||||
} catch(ex) {
|
||||
do_throw("Could not get Bookmarks service\n");
|
||||
}
|
||||
|
||||
// Get annotation service
|
||||
try {
|
||||
var annosvc = Cc["@mozilla.org/browser/annotation-service;1"].
|
||||
getService(Ci.nsIAnnotationService);
|
||||
} catch(ex) {
|
||||
do_throw("Could not get Annotation service\n");
|
||||
}
|
||||
|
||||
// Get browser glue
|
||||
try {
|
||||
var gluesvc = Cc["@mozilla.org/browser/browserglue;1"].
|
||||
getService(Ci.nsIBrowserGlue);
|
||||
} catch(ex) {
|
||||
do_throw("Could not get BrowserGlue service\n");
|
||||
}
|
||||
|
||||
// Get pref service
|
||||
try {
|
||||
var pref = Cc["@mozilla.org/preferences-service;1"].
|
||||
getService(Ci.nsIPrefBranch);
|
||||
} catch(ex) {
|
||||
do_throw("Could not get Preferences service\n");
|
||||
}
|
||||
|
||||
const SMART_BOOKMARKS_ANNO = "Places/SmartBookmark";
|
||||
const SMART_BOOKMARKS_PREF = "browser.places.smartBookmarksVersion";
|
||||
|
||||
// main
|
||||
function run_test() {
|
||||
// TEST 1: smart bookmarks disabled
|
||||
pref.setIntPref("browser.places.smartBookmarksVersion", -1);
|
||||
gluesvc.ensurePlacesDefaultQueriesInitialized();
|
||||
var smartBookmarkItemIds = annosvc.getItemsWithAnnotation(SMART_BOOKMARKS_ANNO, {});
|
||||
do_check_eq(smartBookmarkItemIds.length, 0);
|
||||
// check that pref has not been bumped up
|
||||
do_check_eq(pref.getIntPref("browser.places.smartBookmarksVersion"), -1);
|
||||
|
||||
// TEST 2: create smart bookmarks
|
||||
pref.setIntPref("browser.places.smartBookmarksVersion", 0);
|
||||
gluesvc.ensurePlacesDefaultQueriesInitialized();
|
||||
smartBookmarkItemIds = annosvc.getItemsWithAnnotation(SMART_BOOKMARKS_ANNO, {});
|
||||
do_check_neq(smartBookmarkItemIds.length, 0);
|
||||
// check that pref has been bumped up
|
||||
do_check_true(pref.getIntPref("browser.places.smartBookmarksVersion") > 0);
|
||||
|
||||
var smartBookmarksCount = smartBookmarkItemIds.length;
|
||||
|
||||
// TEST 3: smart bookmarks restore
|
||||
// remove one smart bookmark and restore
|
||||
bmsvc.removeItem(smartBookmarkItemIds[0]);
|
||||
pref.setIntPref("browser.places.smartBookmarksVersion", 0);
|
||||
gluesvc.ensurePlacesDefaultQueriesInitialized();
|
||||
smartBookmarkItemIds = annosvc.getItemsWithAnnotation(SMART_BOOKMARKS_ANNO, {});
|
||||
do_check_eq(smartBookmarkItemIds.length, smartBookmarksCount);
|
||||
// check that pref has been bumped up
|
||||
do_check_true(pref.getIntPref("browser.places.smartBookmarksVersion") > 0);
|
||||
|
||||
// TEST 4: move a smart bookmark, change its title, then restore
|
||||
// smart bookmark should be restored in place
|
||||
var parent = bmsvc.getFolderIdForItem(smartBookmarkItemIds[0]);
|
||||
var oldTitle = bmsvc.getItemTitle(smartBookmarkItemIds[0]);
|
||||
// create a subfolder and move inside it
|
||||
var newParent = bmsvc.createFolder(parent, "test", bmsvc.DEFAULT_INDEX);
|
||||
bmsvc.moveItem(smartBookmarkItemIds[0], newParent, bmsvc.DEFAULT_INDEX);
|
||||
// change title
|
||||
bmsvc.setItemTitle(smartBookmarkItemIds[0], "new title");
|
||||
// restore
|
||||
pref.setIntPref("browser.places.smartBookmarksVersion", 0);
|
||||
gluesvc.ensurePlacesDefaultQueriesInitialized();
|
||||
smartBookmarkItemIds = annosvc.getItemsWithAnnotation(SMART_BOOKMARKS_ANNO, {});
|
||||
do_check_eq(smartBookmarkItemIds.length, smartBookmarksCount);
|
||||
do_check_eq(bmsvc.getFolderIdForItem(smartBookmarkItemIds[0]), newParent);
|
||||
do_check_eq(bmsvc.getItemTitle(smartBookmarkItemIds[0]), oldTitle);
|
||||
// check that pref has been bumped up
|
||||
do_check_true(pref.getIntPref("browser.places.smartBookmarksVersion") > 0);
|
||||
}
|
@ -81,7 +81,6 @@ try {
|
||||
const DESCRIPTION_ANNO = "bookmarkProperties/description";
|
||||
const LOAD_IN_SIDEBAR_ANNO = "bookmarkProperties/loadInSidebar";
|
||||
const POST_DATA_ANNO = "bookmarkProperties/POSTData";
|
||||
const LAST_CHARSET_ANNO = "URIProperties/characterSet";
|
||||
|
||||
// main
|
||||
function run_test() {
|
||||
@ -90,7 +89,7 @@ function run_test() {
|
||||
|
||||
// avoid creating the places smart folder during tests
|
||||
Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch).
|
||||
setBoolPref("browser.places.createdSmartBookmarks", true);
|
||||
setIntPref("browser.places.smartBookmarksVersion", -1);
|
||||
|
||||
// file pointer to legacy bookmarks file
|
||||
var bookmarksFileOld = do_get_file("browser/components/places/tests/unit/bookmarks.preplaces.html");
|
||||
@ -247,10 +246,9 @@ function testCanonicalBookmarks(aFolder) {
|
||||
annosvc.getItemAnnotation(testBookmark1.itemId, POST_DATA_ANNO));
|
||||
|
||||
// last charset
|
||||
do_check_true(annosvc.itemHasAnnotation(testBookmark1.itemId,
|
||||
LAST_CHARSET_ANNO));
|
||||
do_check_eq("ISO-8859-1", annosvc.getItemAnnotation(testBookmark1.itemId,
|
||||
LAST_CHARSET_ANNO));
|
||||
var testURI = uri(testBookmark1.uri);
|
||||
do_check_eq("ISO-8859-1", histsvc.getCharsetForURI(testURI));
|
||||
|
||||
// description
|
||||
do_check_true(annosvc.itemHasAnnotation(testBookmark1.itemId,
|
||||
DESCRIPTION_ANNO));
|
||||
|
@ -187,10 +187,10 @@ function run_test() {
|
||||
var bkmk1Id = bkmkIds[0];
|
||||
var bkmk2Id = bkmkIds[1];
|
||||
var bkmk3Id = bkmkIds[2];
|
||||
var txn3 = ptSvc.moveItem(bkmk1Id, root, -1);
|
||||
txn3.doTransaction();
|
||||
|
||||
// Moving items between the same folder
|
||||
var txn3 = ptSvc.moveItem(bkmk1Id, root, -1);
|
||||
txn3.doTransaction();
|
||||
do_check_eq(observer._itemMovedId, bkmk1Id);
|
||||
do_check_eq(observer._itemMovedOldParent, root);
|
||||
do_check_eq(observer._itemMovedOldIndex, 1);
|
||||
@ -236,11 +236,10 @@ function run_test() {
|
||||
txn5.doTransaction();
|
||||
do_check_eq(observer._itemRemovedId, bkmk2Id);
|
||||
do_check_eq(observer._itemRemovedFolder, root);
|
||||
do_check_eq(observer._itemRemovedIndex, 1);
|
||||
do_check_eq(observer._itemRemovedIndex, 2);
|
||||
txn5.undoTransaction();
|
||||
|
||||
do_check_eq(observer._itemAddedParent, root);
|
||||
do_check_eq(observer._itemAddedIndex, 1);
|
||||
do_check_eq(observer._itemAddedIndex, 2);
|
||||
|
||||
// Test creating a separator
|
||||
var txn6 = ptSvc.createSeparator(root, 1);
|
||||
|
@ -147,10 +147,6 @@
|
||||
el = document.getElementById("errorLongDescText_malware");
|
||||
el.parentNode.removeChild(el);
|
||||
|
||||
// Unhide clickthrough button
|
||||
el = document.getElementById("ignoreWarningButton");
|
||||
el.style.display = "-moz-box";
|
||||
|
||||
// Set sitename
|
||||
document.getElementById("phishing_sitename").textContent = getHostString();
|
||||
document.title = document.getElementById("errorTitleText_phishing")
|
||||
@ -174,7 +170,6 @@
|
||||
top: 23px;
|
||||
left: 20px;
|
||||
font-size: smaller;
|
||||
display: none; /* Hide the button by default */
|
||||
}
|
||||
|
||||
#ignoreWarning {
|
||||
|
@ -83,7 +83,7 @@ function PROT_MalwareWarden() {
|
||||
},
|
||||
|
||||
updateUrlRequested: function(url) { },
|
||||
streamCompleted: function() { },
|
||||
streamFinished: function(status) { },
|
||||
updateError: function(errorCode) { },
|
||||
updateSuccess: function(requestedTimeout) { }
|
||||
};
|
||||
|
@ -15,12 +15,12 @@ function test() {
|
||||
}
|
||||
|
||||
function testMalware() {
|
||||
// Confirm that "Ignore this warning" is hidden
|
||||
// Confirm that "Ignore this warning" is visible - bug 422410
|
||||
var el = newBrowser.contentDocument.getElementById("ignoreWarningButton");
|
||||
ok(el, "Ignore warning button should be present (but hidden) for malware");
|
||||
ok(el, "Ignore warning button should be present for malware");
|
||||
|
||||
var style = newBrowser.contentWindow.getComputedStyle(el, null);
|
||||
is(style.display, "none", "Ignore Warning button should be display:none for malware");
|
||||
is(style.display, "-moz-box", "Ignore Warning button should be display:-moz-box for malware");
|
||||
|
||||
// Now launch the phishing test
|
||||
newBrowser.contentWindow.location = 'http://www.mozilla.com/firefox/its-a-trap.html';
|
||||
|
@ -1,72 +0,0 @@
|
||||
#filter substitution
|
||||
|
||||
var srDest = $SpaceRequired$;
|
||||
var err;
|
||||
var fProgram;
|
||||
var platformNode;
|
||||
var searchPlugins = "searchplugins";
|
||||
|
||||
platformNode = getPlatform();
|
||||
if (platformNode == 'mac') {
|
||||
searchPlugins = "Search Plugins";
|
||||
}
|
||||
logComment("initInstall: platformNode=" + platformNode);
|
||||
// end
|
||||
// end - OS type detection
|
||||
|
||||
var prettyName = "@AB_CD@ Language Pack";
|
||||
var chromeNode = "@AB_CD@";
|
||||
|
||||
var regName = "locales/mozilla/" + chromeNode;
|
||||
var chromeName = chromeNode + ".jar";
|
||||
var localeName = "locale/" + chromeNode + "/";
|
||||
|
||||
err = initInstall(prettyName, regName, "$Version$");
|
||||
logComment("initInstall: " + err);
|
||||
|
||||
fProgram = getFolder("Program");
|
||||
logComment("fProgram: " + fProgram);
|
||||
|
||||
if (verifyDiskSpace(fProgram, srDest))
|
||||
{
|
||||
var chromeType = LOCALE;
|
||||
var fTarget;
|
||||
|
||||
err = addDirectory("",
|
||||
"bin",
|
||||
fProgram,
|
||||
"");
|
||||
logComment("addDirectory() returned: " + err);
|
||||
|
||||
setPackageFolder(fProgram);
|
||||
|
||||
// check return value
|
||||
if (err == SUCCESS)
|
||||
{
|
||||
fTarget = getFolder("Program", "defaults");
|
||||
logComment("fTarget: " + fTarget);
|
||||
err = addDirectory("",
|
||||
"bin/defaults", // dir name in JAR to extract
|
||||
fTarget, // Where to put this file
|
||||
""); // subdir name relative to fProgram
|
||||
logComment("addDirectory() returned: " + err);
|
||||
|
||||
fTarget = getFolder("Program", searchPlugins);
|
||||
logComment("fTarget: " + fTarget);
|
||||
err = addDirectory("",
|
||||
"bin/searchplugins",
|
||||
fTarget,
|
||||
"");
|
||||
logComment("addDirectory() returned: " + err);
|
||||
|
||||
err = performInstall();
|
||||
logComment("performInstall() returned: " + err);
|
||||
}
|
||||
else
|
||||
{
|
||||
cancelInstall(err);
|
||||
logComment("cancelInstall due to error: " + err);
|
||||
}
|
||||
}
|
||||
else
|
||||
cancelInstall(INSUFFICIENT_DISK_SPACE);
|
@ -1,14 +0,0 @@
|
||||
var err = initInstall("Developer Tools", "Developer Tools", "$Version$");
|
||||
logComment("initInstall: " + err);
|
||||
|
||||
// DOM Inspector
|
||||
var fProgram = getFolder("Program");
|
||||
logComment("fProgram: " + fProgram);
|
||||
|
||||
err = addDirectory("", "$Version$", "bin", fProgram, "", true);
|
||||
logComment("addDirectory: " + err);
|
||||
|
||||
if (err==SUCCESS)
|
||||
performInstall();
|
||||
else
|
||||
cancelInstall(err);
|
@ -1,118 +0,0 @@
|
||||
function upgradeCleanup()
|
||||
{
|
||||
// Get rid of Chrome directory cruft.
|
||||
deleteThisFolder("Chrome", "classic");
|
||||
deleteThisFolder("Chrome", "comm");
|
||||
deleteThisFolder("Chrome", "en-mac");
|
||||
deleteThisFile("Chrome", "en-mac.jar");
|
||||
deleteThisFolder("Chrome", "en-unix");
|
||||
deleteThisFile("Chrome", "en-unix.jar");
|
||||
deleteThisFolder("Chrome", "en-US");
|
||||
deleteThisFolder("Chrome", "en-win");
|
||||
deleteThisFile("Chrome", "en-win.jar");
|
||||
deleteThisFolder("Chrome", "US");
|
||||
deleteThisFile("Chrome", "help.jar");
|
||||
|
||||
deleteThisFile("Chrome", "chrome.rdf");
|
||||
deleteThisFile("Chrome", "installed-chrome.txt");
|
||||
deleteThisFile("Chrome", "app-chrome.manifest");
|
||||
deleteThisFolder("Chrome", "overlayinfo");
|
||||
|
||||
// Remove defunct components and type libraries
|
||||
deleteThisFile("Components", "typeaheadfind.xpt");
|
||||
deleteThisFile("Components", "chrome.xpt");
|
||||
deleteThisFile("Components", "ipcd.xpt");
|
||||
deleteThisFile("Components", "nsUpdateNotifier.js");
|
||||
deleteThisFile("Components", "nsBackgroundUpdateService.js");
|
||||
deleteThisFile("Components", "p3p.xpt");
|
||||
deleteThisFile("Components", "prefmigr.xpt");
|
||||
deleteThisFile("Components", "profilesharingsetup.xpt");
|
||||
deleteThisFile("Components", "related.xpt");
|
||||
deleteThisFile("Components", "ucnative.xpt");
|
||||
deleteThisFile("Components", "util.xpt");
|
||||
deleteThisFile("Components", "compreg.dat");
|
||||
deleteThisFile("Components", "xpti.dat");
|
||||
|
||||
// Remove non-linked xpt files for rev'd interfaces; this prevents a
|
||||
// conflict if you had previously installed a zip build in the app directory.
|
||||
deleteThisFile("Components", "autocomplete.xpt");
|
||||
|
||||
// Remove defunct defaults files.
|
||||
deleteThisFile("Program", "defaults/pref/all.js");
|
||||
deleteThisFile("Program", "defaults/pref/editor.js");
|
||||
deleteThisFile("Program", "defaults/pref/mailnews.js");
|
||||
deleteThisFile("Program", "defaults/pref/non-shared.txt");
|
||||
deleteThisFile("Program", "defaults/pref/security-prefs.js");
|
||||
deleteThisFile("Program", "defaults/pref/unix.js");
|
||||
deleteThisFile("Program", "defaults/pref/xpinstall.js");
|
||||
deleteThisFile("Program", "defaults/pref/bug307259.js");
|
||||
deleteThisFile("Program", "defaults/profile/panels.rdf");
|
||||
deleteThisFolder("Program", "defaults/profile/US");
|
||||
|
||||
// Delete dictionary.com search plugin
|
||||
deleteThisFile("Program", "searchplugins/dictionary.src");
|
||||
deleteThisFile("Program", "searchplugins/dictionary.png");
|
||||
|
||||
// These files are related to app patches and will interfere with the
|
||||
// UA/app version strings if we do not remove them.
|
||||
deleteThisFile("Program", "defaults/pref/bug259708.js");
|
||||
|
||||
// Remove defunct miscellany
|
||||
deleteThisFolder("Program", "ipc");
|
||||
deleteThisFile("Program", "mangle");
|
||||
deleteThisFile("Program", "mozipcd");
|
||||
deleteThisFile("Program", "regchrome");
|
||||
deleteThisFile("Program", "regxpcom");
|
||||
deleteThisFile("Program", "shlibsign");
|
||||
}
|
||||
|
||||
var srDest = $SpaceRequired$;
|
||||
|
||||
var err = initInstall("$ProductName$", "Browser", "$Version$");
|
||||
logComment("initInstall: " + err);
|
||||
|
||||
var communicatorFolder = getFolder("Program");
|
||||
logComment("communicatorFolder: " + communicatorFolder);
|
||||
|
||||
if (verifyDiskSpace(communicatorFolder, srDest))
|
||||
{
|
||||
// Call upgradeCleanup() before addDirectory() in case we accidentaly
|
||||
// delete files that we happen to be also installing. This way, if we do,
|
||||
// it will just get reinstalled. This is for safety measure.
|
||||
upgradeCleanup();
|
||||
err = addDirectory("Program",
|
||||
"$Version$",
|
||||
"bin", // jar source folder
|
||||
communicatorFolder, // target folder
|
||||
"", // target subdir
|
||||
true ); // force flag
|
||||
|
||||
logComment("addDirectory() returned: " + err);
|
||||
|
||||
// create the plugins folder next to mozilla
|
||||
var pluginsFolder = getFolder("Plugins");
|
||||
var ignoreErr = dirCreate(pluginsFolder);
|
||||
logComment("dirCreate() returned: " + ignoreErr);
|
||||
|
||||
if (err==SUCCESS)
|
||||
{
|
||||
err = performInstall();
|
||||
logComment("performInstall() returned: " + err);
|
||||
if (! ('buildID' in Install))
|
||||
{
|
||||
logComment("Running Pre-Mozilla 0.9.1");
|
||||
initInstall("Post-install Cleanup Utility", "Browser/xpicleanup", "$Version$");
|
||||
cleanupUtility = getFolder(communicatorFolder, "xpicleanup");
|
||||
err = File.execute(cleanupUtility);
|
||||
logComment("execute() returned: " + err);
|
||||
err = performInstall();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cancelInstall(err);
|
||||
logComment("cancelInstall() due to error: " + err);
|
||||
}
|
||||
}
|
||||
else
|
||||
cancelInstall(INSUFFICIENT_DISK_SPACE);
|
Before Width: | Height: | Size: 14 KiB |
@ -1,14 +0,0 @@
|
||||
#filter substitution
|
||||
VersionLanguage = @AB_CD@
|
||||
NameCompany = Mozilla
|
||||
NameProduct = Minefield
|
||||
NameProductInternal = Minefield
|
||||
ShortNameProduct = Minefield
|
||||
VersionProduct = @MOZ_APP_VERSION@
|
||||
FileInstallerEXE = @PKG_BASENAME@.installer
|
||||
FileMainEXE = @MOZ_APP_NAME@
|
||||
FileUninstall = UninstallFirefox
|
||||
FileUninstallZIP = UninstallFirefox.zip
|
||||
FileInstallerNETRoot = @PKG_BASENAME@.net-installer
|
||||
ComponentList = xpcom,browser,talkback,@AB_CD@,adt
|
||||
LicenseFile = browser/EULA
|
@ -1,127 +0,0 @@
|
||||
// this function verifies disk space in kilobytes
|
||||
function verifyDiskSpace(dirPath, spaceRequired)
|
||||
{
|
||||
var spaceAvailable;
|
||||
|
||||
// Get the available disk space on the given path
|
||||
spaceAvailable = fileGetDiskSpaceAvailable(dirPath);
|
||||
|
||||
// Convert the available disk space into kilobytes
|
||||
spaceAvailable = parseInt(spaceAvailable / 1024);
|
||||
|
||||
// do the verification
|
||||
if(spaceAvailable < spaceRequired)
|
||||
{
|
||||
logComment("Insufficient disk space: " + dirPath);
|
||||
logComment(" required : " + spaceRequired + " K");
|
||||
logComment(" available: " + spaceAvailable + " K");
|
||||
return(false);
|
||||
}
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
// this function deletes a file if it exists
|
||||
function deleteThisFile(dirKey, file)
|
||||
{
|
||||
var fFileToDelete;
|
||||
|
||||
fFileToDelete = getFolder(dirKey, file);
|
||||
logComment("File to delete: " + fFileToDelete);
|
||||
if(File.isFile(fFileToDelete))
|
||||
{
|
||||
File.remove(fFileToDelete);
|
||||
return(true);
|
||||
}
|
||||
else
|
||||
return(false);
|
||||
}
|
||||
|
||||
// this function deletes a folder if it exists
|
||||
function deleteThisFolder(dirKey, folder, recursiveDelete)
|
||||
{
|
||||
var fToDelete;
|
||||
|
||||
if(typeof recursiveDelete == "undefined")
|
||||
recursiveDelete = true;
|
||||
|
||||
fToDelete = getFolder(dirKey, folder);
|
||||
logComment("Folder to delete: " + fToDelete);
|
||||
if(File.isDirectory(fToDelete))
|
||||
{
|
||||
File.dirRemove(fToDelete, recursiveDelete);
|
||||
return(true);
|
||||
}
|
||||
else
|
||||
return(false);
|
||||
}
|
||||
|
||||
// OS type detection
|
||||
// which platform?
|
||||
function getPlatform()
|
||||
{
|
||||
var platformStr;
|
||||
var platformNode;
|
||||
|
||||
if('platform' in Install)
|
||||
{
|
||||
platformStr = new String(Install.platform);
|
||||
|
||||
if (!platformStr.search(/^Macintosh/))
|
||||
platformNode = 'mac';
|
||||
else if (!platformStr.search(/^Win/))
|
||||
platformNode = 'win';
|
||||
else
|
||||
platformNode = 'unix';
|
||||
}
|
||||
else
|
||||
{
|
||||
var fOSMac = getFolder("Mac System");
|
||||
var fOSWin = getFolder("Win System");
|
||||
|
||||
logComment("fOSMac: " + fOSMac);
|
||||
logComment("fOSWin: " + fOSWin);
|
||||
|
||||
if(fOSMac != null)
|
||||
platformNode = 'mac';
|
||||
else if(fOSWin != null)
|
||||
platformNode = 'win';
|
||||
else
|
||||
platformNode = 'unix';
|
||||
}
|
||||
|
||||
return platformNode;
|
||||
}
|
||||
|
||||
var srDest = $SpaceRequired$;
|
||||
|
||||
var err = initInstall("Quality Feedback Agent", "Quality Feedback Agent", "$Version$");
|
||||
logComment("initInstall: " + err);
|
||||
|
||||
var communicatorFolder = getFolder("Program");
|
||||
logComment("communicatorFolder: " + communicatorFolder);
|
||||
|
||||
if (verifyDiskSpace(communicatorFolder, srDest))
|
||||
{
|
||||
err = addDirectory("Program",
|
||||
"$Version$",
|
||||
"bin", // jar source folder
|
||||
communicatorFolder, // target folder
|
||||
"", // target subdir
|
||||
true ); // force flag
|
||||
|
||||
logComment("addDirectory() returned: " + err);
|
||||
|
||||
if (err==SUCCESS)
|
||||
{
|
||||
err = performInstall();
|
||||
logComment("performInstall() returned: " + err);
|
||||
}
|
||||
else
|
||||
{
|
||||
cancelInstall(err);
|
||||
logComment("cancelInstall() returned: " + err);
|
||||
}
|
||||
}
|
||||
else
|
||||
cancelInstall(INSUFFICIENT_DISK_SPACE);
|
Before Width: | Height: | Size: 18 KiB |
@ -1,48 +0,0 @@
|
||||
function upgradeCleanup()
|
||||
{
|
||||
// Obsolete files from Netscape 6.0 and Netscape 6.01 that
|
||||
// need to be cleaned up.
|
||||
deleteThisFile("Program", "component.reg");
|
||||
deleteThisFile("Program", "libjsdom.so");
|
||||
deleteThisFile("Program", "libz.so");
|
||||
deleteThisFile("Components", "compreg.dat");
|
||||
deleteThisFile("Components", "xpti.dat");
|
||||
deleteThisFile("Components", "xptitemp.dat");
|
||||
}
|
||||
|
||||
var srDest = $SpaceRequired$;
|
||||
|
||||
var err = initInstall("Mozilla XPCOM", "XPCOM", "$Version$");
|
||||
logComment("initInstall: " + err);
|
||||
|
||||
var communicatorFolder = getFolder("Program");
|
||||
logComment("communicatorFolder: " + communicatorFolder);
|
||||
|
||||
if (verifyDiskSpace(communicatorFolder, srDest))
|
||||
{
|
||||
// Call upgradeCleanup() before addDirectory() in case we accidentaly
|
||||
// delete files that we happen to be also installing. This way, if we do,
|
||||
// it will just get reinstalled. This is for safety measure.
|
||||
upgradeCleanup();
|
||||
err = addDirectory("Program",
|
||||
"$Version$",
|
||||
"bin", // jar source folder
|
||||
communicatorFolder, // target folder
|
||||
"", // target subdir
|
||||
true ); // force flag
|
||||
|
||||
logComment("addDirectory() returned: " + err);
|
||||
|
||||
if (err==SUCCESS)
|
||||
{
|
||||
err = performInstall();
|
||||
logComment("performInstall() returned: " + err);
|
||||
}
|
||||
else
|
||||
{
|
||||
cancelInstall(err);
|
||||
logComment("cancelInstall() returned: " + err);
|
||||
}
|
||||
}
|
||||
else
|
||||
cancelInstall(INSUFFICIENT_DISK_SPACE);
|
@ -488,6 +488,13 @@ Section "-InstallEndCleanup"
|
||||
SetDetailsPrint both
|
||||
DetailPrint "$(STATUS_CLEANUP)"
|
||||
SetDetailsPrint none
|
||||
|
||||
${MUI_INSTALLOPTIONS_READ} $0 "options.ini" "Field 6" "State"
|
||||
${If} "$0" == "1"
|
||||
${LogHeader} "Setting as the default browser"
|
||||
${SetAsDefaultAppUser}
|
||||
${EndIf}
|
||||
|
||||
${LogHeader} "Updating Uninstall Log With Previous Uninstall Log"
|
||||
|
||||
; Refresh desktop icons
|
||||
@ -645,6 +652,20 @@ Function leaveOptions
|
||||
StrCpy $InstallType ${INSTALLTYPE_CUSTOM}
|
||||
|
||||
${If} $InstallType != ${INSTALLTYPE_CUSTOM}
|
||||
!ifndef NO_INSTDIR_FROM_REG
|
||||
SetShellVarContext all ; Set SHCTX to HKLM
|
||||
${GetSingleInstallPath} "Software\Mozilla\${BrandFullNameInternal}" $R9
|
||||
|
||||
StrCmp "$R9" "false" +1 fix_install_dir
|
||||
|
||||
SetShellVarContext current ; Set SHCTX to HKCU
|
||||
${GetSingleInstallPath} "Software\Mozilla\${BrandFullNameInternal}" $R9
|
||||
|
||||
fix_install_dir:
|
||||
StrCmp "$R9" "false" +2 +1
|
||||
StrCpy $INSTDIR "$R9"
|
||||
!endif
|
||||
|
||||
Call CheckExistingInstall
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
@ -755,7 +776,7 @@ Function .onInit
|
||||
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "components.ini"
|
||||
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "shortcuts.ini"
|
||||
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "summary.ini"
|
||||
!insertmacro createBasicCustomOptionsINI
|
||||
!insertmacro createBasicCustomSetAsDefaultOptionsINI
|
||||
!insertmacro createComponentsINI
|
||||
!insertmacro createShortcutsINI
|
||||
|
||||
|
@ -218,6 +218,9 @@ Section "Uninstall"
|
||||
${MUI_INSTALLOPTIONS_READ} $0 "unconfirm.ini" "Field 3" "State"
|
||||
${If} "$0" == "1"
|
||||
${un.DeleteRelativeProfiles} "Mozilla\Firefox"
|
||||
RmDir "$APPDATA\Mozilla\Extensions\{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
|
||||
RmDir "$APPDATA\Mozilla\Extensions"
|
||||
RmDir "$APPDATA\Mozilla"
|
||||
${EndIf}
|
||||
|
||||
SetShellVarContext current ; Set SHCTX to HKCU
|
||||
|
@ -1,193 +0,0 @@
|
||||
#filter emptyLines
|
||||
|
||||
# This file is in the UTF-8 encoding
|
||||
|
||||
# Installer keys (don't translate strings in $$)
|
||||
#define SETUP_TITLE $ProductShortName$ Setup
|
||||
#define SETUP_WELCOME Welcome to %s
|
||||
#define SETUP_MESSAGE0 You are about to install %s.
|
||||
#define SETUP_MESSAGE1 It is strongly recommended that you exit all Windows programs before running this Setup program.
|
||||
#define SETUP_MESSAGE1_UNIX It is strongly recommended that you exit all instances of %s before running this Setup program.
|
||||
#define SETUP_MESSAGE2 Click Cancel to quit Setup and then close any programs you have running. Click Next to continue the Setup program.
|
||||
#define SETUP_MESSAGE3 Click Next to continue installing %s.
|
||||
|
||||
#define LICENSE_TITLE Software License Agreement
|
||||
#define LICENSE_SUBTITLE Terms and conditions for using this software.
|
||||
#define LICENSE_MESSAGE0 Please read the following license agreement. Use the scroll bar to view the rest of this agreement.
|
||||
#define LICENSE_ACCEPT I &Accept the terms of the License Agreement
|
||||
#define LICENSE_DECLINE I do NO&T Accept the terms of the License Agreement
|
||||
|
||||
#define SETUP_TYPE_TITLE Setup Type
|
||||
#define SETUP_TYPE_SUBTITLE Choose setup options.
|
||||
#define SETUP_TYPE_MESSAGE0 Choose the type of Setup you prefer, then click Next.
|
||||
#define SETUP_TYPE_EXISTING The selected directory already contains a Firefox installation. To delete %s completely, please press the 'Delete Directory' button. Your Firefox settings should not be affected. Or, please press the 'Cancel' button and choose a different destination directory.
|
||||
|
||||
# &Ampersand is used to select a shortcut key
|
||||
#define TYPE_STANDARD &Standard
|
||||
#define TYPE_STANDARD_DESC Browser will be installed with the most common options.
|
||||
|
||||
#define TYPE_CUSTOM &Custom
|
||||
#define TYPE_CUSTOM_DESC You may choose individual options to be installed. Recommended for experienced users.
|
||||
|
||||
#define SELECT_TITLE Select Components
|
||||
#define SELECT_SUBTITLE Additional components that enhance $ProductShortName$.
|
||||
#define SELECT_MESSAGE0 Choose additional components you want to install, then click Next.
|
||||
|
||||
#define LOCATION_TITLE Install Folder
|
||||
#define LOCATION_SUBTITLE Where $ProductShortName$ will be installed.
|
||||
#define LOCATION_MESSAGE0 $ProductShortName$ will be installed into the following folder:
|
||||
|
||||
#define UPGRADE_TITLE Upgrade
|
||||
#define UPGRADE_SUBTITLE Upgrades an existing $ProductShortName$ installation.
|
||||
#define UPGRADE_CLEANUP A previous $ProductNameInternal$ installation has been found in the chosen folder.
|
||||
|
||||
#define UPGRADE_CLEAN Perform a Clean Install
|
||||
#define UPGRADE_CLEAN_MSG A Clean Install will COMPLETELY REMOVE the contents of the install folder! Any third party components you have installed will be lost. This is recommended as it may prevent incompatibilities. (XXXben)
|
||||
#define UPGRADE_OVER If you choose not to perform a Clean Install, third party components will not be removed, which may cause unpredictable behavior.
|
||||
#define UPGRADE_OVER_WINDIR A Safe Upgrade of $ProductNameInternal$ cannot be performed because the program is installed within the Windows folder. It is recommended that you choose another folder to install $ProductNameInternal$ into.
|
||||
|
||||
#define ADD_TITLE $ProductShortName$ Setup - Select Additional Components
|
||||
#define ADD_MESSAGE0 Select or clear the additional components you want to install.
|
||||
|
||||
#define WININT_TITLE Set Up Shortcuts
|
||||
#define WININT_SUBTITLE Creates Program Icons
|
||||
#define WININT_MESSAGE0 Create icons for $ProductShortName$:
|
||||
|
||||
#define WININT_DESKTOP On my Desktop
|
||||
#define WININT_START In my Start Menu Programs folder
|
||||
#define WININT_QUICKL In my Quick Launch bar
|
||||
|
||||
#define USE_AS_DEFAULT Use %s as my Default Browser.
|
||||
|
||||
#define WININT_PFOLDER_TITLE $ProductShortName$ Setup - Select Program Folder
|
||||
#define WININT_PFOLDER_MESSAGE0 Setup will add program icons to the Program Folder listed below. You may type a new folder name, or select one from the Existing Folders list. Click Next to continue.
|
||||
|
||||
#define ADDL_OPTIONS_TITLE $ProductShortName$ Setup - Additional Options
|
||||
#define ADDL_OPTIONS_MSG1 Select the following option if you wish to save downloaded Setup files on your own computer. This allows you to re-run Setup without downloading the files again. The Setup files will be saved to the path below.
|
||||
|
||||
#define ADV_SETTINGS_TITLE $ProductShortName$ Setup - Advanced Settings
|
||||
#define ADV_SETTINGS_MSG If your Internet connection requires a proxy server, enter your server name and port information. If your Internet connection doesn't require a proxy server, leave the fields blank.
|
||||
|
||||
#define START_TITLE Summary
|
||||
#define START_SUBTITLE Ready to start installing $ProductShortName$.
|
||||
#define START_INSTALL Setup will now install the following components:
|
||||
#define START_DOWNLOAD Setup will now download and install the following components:
|
||||
#define START_MESSAGE0 Click Next to continue.
|
||||
|
||||
#define DL_TITLE Downloading
|
||||
#define DL_SUBTITLE Downloading required components…
|
||||
#define DL_BLURB Setup is downloading the files required to install $ProductShortName$.
|
||||
#define DL_FILENAME Currently Downloading:
|
||||
#define DL_TIMELEFT Time Remaining:
|
||||
|
||||
#define INSTALL_TITLE Installing
|
||||
#define INSTALL_SUBTITLE Installing $ProductShortName$…
|
||||
#define INSTALL_BLURB Setup is installing application files.
|
||||
#define INSTALL_STATUSFILE Preparing File:
|
||||
#define INSTALL_STATUSCOMP Currently Installing:
|
||||
|
||||
#define COMPLETE_TITLE Install Complete
|
||||
#define COMPLETE_MESSAGE0 %s was successfully installed.
|
||||
#define COMPLETE_MESSAGE1 Click Finish to complete Setup.
|
||||
#define COMPLETE_LAUNCH Launch %s now.
|
||||
|
||||
#define DL2_TITLE $ProductShortName$ Setup - Download
|
||||
#define DL2_MESSAGE0 Setup is downloading the required files now. This may take some time depending on your network connection speed.
|
||||
#define DL2_RETRY Some files have failed the CRC check and are being downloaded again. Only those files that have failed will be downloaded.
|
||||
|
||||
#define CLOSE_CHECK Download of $ProductShortName$ was successful. $ProductNameInternal$ must be closed to proceed with installation. Click OK to exit $ProductNameInternal$ automatically and to begin installation.
|
||||
#define CLOSE_CHECK2 $ProductNameInternal$ must be closed to proceed with installation. Click OK to exit $ProductNameInternal$ automatically and to begin installation.
|
||||
#define CLOSE_WAIT Shutting down $ProductNameInternal$. Please wait…
|
||||
|
||||
#define XPCOM_SHORT Cross-Platform COM
|
||||
#define BROWSER_SHORT $ProductShortName$ Browser
|
||||
#define HELP_SHORT $ProductShortName$ Help
|
||||
#define UNINSTALL_SHORT $CompanyName$ Uninstaller
|
||||
#define LANGPACK_TITLE Language Pack
|
||||
|
||||
#define ADT_SHORT Developer Tools
|
||||
#define ADT_LONG The Document Inspector - a tool for web developers.
|
||||
|
||||
#define QFA_SHORT Quality Feedback Agent
|
||||
#define QFA_LONG for reporting $ProductShortName$ crash information
|
||||
|
||||
#define RPT_SHORT Website Reporter
|
||||
#define RPT_LONG for reporting $ProductShortName$ website compatibility problems
|
||||
|
||||
#define CORE_PREPARING Preparing Install, please wait…
|
||||
#define INST_UNINST Installing the uninstaller, please wait…
|
||||
|
||||
#define MSG_UNFINISHED_DL A previous session of Setup did not finish downloading all the necessary files. Would you like to use the files previously downloaded, to avoid downloading them again?
|
||||
#define MSG_UNFINISHED_INSTALL A previous session of Setup did not finish with installation of all the necessary files. Would you like to use the files previously downloaded, to avoid downloading them again?
|
||||
#define MSG_CORRUPTED Setup has detected that the following archives within this Setup are corrupted:%sYou will need to obtain another copy of the $ProductShortName$ Setup in order for installation to proceed.
|
||||
#define MSG_CORRUPTED_AUTO Setup has detected that at least one archive within this Setup is corrupt. You will need to obtain another copy of the $ProductShortName$ Setup in order for installation to proceed.
|
||||
#define MSG_TOO_MANY_CRC Too many download failures. Setup will cancel. Any files already downloaded will not be deleted. The next time Setup is run, these files will be taken into account during the download.
|
||||
#define MSG_TOO_MANY_NETWORK Too many network errors trying to download %s. Setup will now Pause. Please click Resume to retry downloading the files.
|
||||
#define MSG_VERIFYING Verifying integrity of archives, please wait…
|
||||
#define MSG_UNDEFINED Error undefined
|
||||
#define MSG_OOM Out of memory!
|
||||
#define MSG_STATUS_DL %s at %.2f KB/sec (%u KB of %u KB downloaded)
|
||||
#define MSG_COMPLETED %d%% completed
|
||||
#define MSG_REQUIRED (Required)
|
||||
#define MSG_CANCELING Canceling Setup, please wait…
|
||||
#define MSG_ERROR_UNCOMPRESS Error uncompressing file %s: %d
|
||||
#define MSG_USAGE Usage: %s [options]\n [options] can be any of the following combination:\n -h: This help.\n -a [path]: Alternate archive search path.\n -app [app id]: ID of application which is launching the installer (shared installs)\n -app_path [app]: Points to (full path) representative file of application (Shared installs)\n * -dd [path]: Suggested install destination directory. (Shared installs)\n * -greLocal: Forces GRE to be installed into the application dir.\n * -greShared: Forces GRE to be installed into a global, shared dir (normally)\n c:\program files\common files\mozilla.org\GRE\n -reg_path [path]: Where to make entries in the Windows registry. (Shared installs)\n -f: Force install of GRE installer (Shared installs), though it'll work\n for non GRE installers too.\n -greForce: Force 'Component GRE' to be downloaded, run, and installed. This\n bypasses GRE's logic of determining when to install by running its\n installer with a '-f' flag.\n -n [filename]: Setup's parent process filename.\n * -ma: Run setup in Auto mode.\n * -ms: Run setup in Silent mode.\n -ira: Ignore the [RunAppX] sections\n -ispf: Ignore the [Program FolderX] sections that show\n the Start Menu shortcut folder at the end of installation.\n * -showBanner: Show the banner image in the download and install progress dialogs\n * -hideBanner: Hide the banner image in the download and install progress dialogs\n * -cleanupOnUpgrade: Tells Setup to check to see if user is upgrading (installing on top\n of previous version of product). If user is upgrading:\n * NORMAL mode: prompt user on how to proceed\n * All other modes: assume user wants to cleanup.\n * -noCleanupOnUpgrade: Tells Setup to not check if user is upgrading (installing on top\n of previous version of product). This will disable the cleanup feature.\n\n * means it will override config.ini
|
||||
#define MSG_USE_FTP Use &FTP for downloading files
|
||||
#define MSG_USE_HTTP Use &HTTP for downloading files
|
||||
#define MSG_SAVE_LOCALLY &Save installer files locally
|
||||
#define MSG_DL_PAUSED Setup has encountered a network problem and has paused the download. If you have just lost your network connection, please click Resume once your network has been reestablished.
|
||||
#define MSG_NOT_ADMIN Setup has detected that you do not have the appropriate Administrator privileges to this system. It is highly recommended that you do not continue with the installation of $ProductShortName$, or it may not function properly. Would you still like to continue?
|
||||
#define MSG_NOT_ADMIN_AUTO Setup has detected that you do not have the appropriate Administrator privileges to this system. Setup cannot continue with the installation of $ProductShortName$.
|
||||
|
||||
#define UNINST_RUNNING $ProductNameInternal$ is detected to be currently running. Please quit $ProductNameInternal$ before continuing. Click OK to exit $ProductNameInternal$ automatically and proceed with uninstallation.
|
||||
#define UNINST_SHUTDOWN Shutting down $ProductNameInternal$. Please wait…
|
||||
|
||||
#define UNINST_FONT MS Sans Serif
|
||||
#define UNINST_FONTSIZE 8
|
||||
#define UNINST_CHARSET 0
|
||||
# Here is a partial list CHAR_SETS
|
||||
# ANSI_CHARSET = 0
|
||||
# DEFAULT_CHARSET = 1
|
||||
# SYMBOL_CHARSET = 2
|
||||
# SHIFTJIS_CHARSET = 128
|
||||
# GB2312_CHARSET = 134
|
||||
# HANGEUL_CHARSET = 129
|
||||
# CHINESEBIG5_CHARSET = 136
|
||||
# OEM_CHARSET 255
|
||||
|
||||
#define UNINST_TITLE $ProductName$ Uninstaller
|
||||
#define UNINST_MESSAGE0 Are you sure you want to completely remove %s and all of its components?
|
||||
#define BTN_UNINST &Uninstall
|
||||
#define BTN_CANCEL &Cancel
|
||||
#define BTN_MESSAGE1 Uninstall has detected that the following shared file is no longer used by any programs. If any programs still require the shared file and it is removed, those programs may no longer function. Are you sure you want to remove this shared file?
|
||||
#define BTN_MESSAGE2 Leaving this file will not harm your system. If you are not sure, it is recommended that the shared file be not removed from the system.
|
||||
#define BTN_FILENAME File name:
|
||||
#define BTN_NO &No
|
||||
#define BTN_NOTOALL N&o to all
|
||||
#define BTN_YES &Yes
|
||||
#define BTN_YESTOALL Y&es to all
|
||||
|
||||
#define ERROR_DLL_LOAD Could not load %s
|
||||
#define ERROR_STRING_LOAD Could not load string resource ID %d
|
||||
#define ERROR_STRING_NULL Null pointer encountered.
|
||||
#define ERROR_GLOBALALLOC Memory allocation error.
|
||||
#define ERROR_FAILED %s failed.
|
||||
#define ERROR_DIALOG_CREATE Could not create %s dialog.
|
||||
#define DLGQUITTITLE Question
|
||||
#define DLGQUITMSG Are you sure you want to cancel?
|
||||
#define ERROR_GET_SYSTEM_DIRECTORY_FAILED GetSystemDirectory() failed.
|
||||
#define ERROR_GET_WINDOWS_DIRECTORY_FAILED GetWindowsDirectory() failed.
|
||||
#define ERROR_CREATE_TEMP_DIR Uninstall was not able to create the TEMP directory: %s
|
||||
#define ERROR_SETUP_REQUIREMENT Windows95 or greater Operating System is required! Exiting Uninstall…
|
||||
#define MB_WARNING_STR Warning
|
||||
#define ERROR_UNINSTALL_LOG_FOLDER Uninstall log folder not found:%s
|
||||
#define MB_MESSAGE_STR Message
|
||||
#define DLG_REMOVE_FILE_TITLE Remove File?
|
||||
#define ERROR_GETVERSION GetVersionEx() failed!
|
||||
#define MB_ATTENTION_STR Attention
|
||||
#define MSG_FORCE_QUIT_PROCESS Uninstall has detected that %s (%s) is still running. Click OK to quit %s and proceed with uninstallation. Alternatively, use the Windows Task Manager to quit %s, and then click OK to continue with uninstallation.
|
||||
#define MSG_FORCE_QUIT_PROCESS_FAILED Uninstall will now exit. Uninstall could not continue because %s (%s) is still running. Try manually quitting %s using Windows Task Manager, and then run Uninstall again.
|
||||
#define MSG_DELETE_INSTALLATION_PATH Not all files were uninstalled from the installation directory:\n\n %s\n\nDo you want to completely delete this directory?
|
||||
#define MSG_INSTALLATION_PATH_WITHIN_WINDIR Uninstall has detected that the installation path of $ProductNameInternal$ is installed to a folder within your Windows folder. Uninstall will not attempt to delete this installation due to the potential removal of critical system files.
|
||||
|
||||
#unfilter emptyLines
|
@ -14,13 +14,14 @@ eu
|
||||
fi
|
||||
fr
|
||||
fy-NL
|
||||
gu-IN
|
||||
ga-IE
|
||||
gu-IN linux win32
|
||||
he linux win32
|
||||
hu
|
||||
id
|
||||
it
|
||||
ja linux win32
|
||||
ja-JP-mac osx
|
||||
ja win32 linux
|
||||
ka
|
||||
ko
|
||||
ku
|
||||
|
@ -55,7 +55,6 @@ browser/components/shell/Makefile
|
||||
browser/components/shell/public/Makefile
|
||||
browser/components/shell/src/Makefile
|
||||
browser/installer/Makefile
|
||||
browser/installer/unix/Makefile
|
||||
browser/installer/windows/Makefile
|
||||
browser/locales/Makefile
|
||||
browser/themes/Makefile
|
||||
|
@ -423,6 +423,10 @@ menuitem[command="Browser:ShowAllBookmarks"] {
|
||||
-moz-image-region: rect(0px 48px 16px 32px);
|
||||
}
|
||||
|
||||
#bookmarksToolbarFolderMenu {
|
||||
list-style-image: url("chrome://browser/skin/places/bookmarksToolbar.png");
|
||||
}
|
||||
|
||||
#menu_openDownloads {
|
||||
list-style-image: url("chrome://browser/skin/Toolbar-small.png");
|
||||
-moz-image-region: rect(0px 16px 16px 0px);
|
||||
@ -844,7 +848,7 @@ toolbar[iconsize="small"] #paste-button[disabled="true"] {
|
||||
}
|
||||
|
||||
#urlbar-throbber {
|
||||
list-style-image: url("chrome://global/skin/throbber/Throbber-small.gif");
|
||||
list-style-image: url("chrome://browser/skin/places/searching_16.png");
|
||||
}
|
||||
|
||||
/* Identity indicator */
|
||||
@ -1025,8 +1029,12 @@ toolbar[iconsize="small"] #paste-button[disabled="true"] {
|
||||
font-size: 1.15em;
|
||||
}
|
||||
|
||||
.ac-extra > .ac-comment {
|
||||
font-size: inherit;
|
||||
}
|
||||
|
||||
.ac-url-text {
|
||||
color: #336633;
|
||||
color: GrayText;
|
||||
}
|
||||
|
||||
.autocomplete-treebody::-moz-tree-cell-text(treecolAutoCompleteComment) {
|
||||
@ -1142,11 +1150,11 @@ statusbarpanel#statusbar-display {
|
||||
padding: 0px !important;
|
||||
min-width: 0;
|
||||
background-color: transparent;
|
||||
list-style-image: url("chrome://browser/skin/Throbber-small.png");
|
||||
list-style-image: url("chrome://global/skin/icons/notloading_16.png");
|
||||
}
|
||||
|
||||
#navigator-throbber[busy="true"] {
|
||||
list-style-image: url("chrome://global/skin/throbber/Throbber-small.gif");
|
||||
list-style-image: url("chrome://global/skin/icons/loading_16.png");
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
@ -1158,11 +1166,11 @@ statusbarpanel#statusbar-display {
|
||||
|
||||
toolbar[mode="text"] #navigator-throbber,
|
||||
toolbar[iconsize="small"] #navigator-throbber {
|
||||
list-style-image: url("chrome://browser/skin/Throbber-small.png");
|
||||
list-style-image: url("chrome://global/skin/icons/notloading_16.png");
|
||||
}
|
||||
toolbar[mode="text"] #navigator-throbber[busy="true"],
|
||||
toolbar[iconsize="small"] #navigator-throbber[busy="true"] {
|
||||
list-style-image: url("chrome://global/skin/throbber/Throbber-small.gif");
|
||||
list-style-image: url("chrome://global/skin/icons/loading_16.png");
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
@ -1192,7 +1200,7 @@ tabpanels {
|
||||
}
|
||||
|
||||
.tabbrowser-tab[busy] > .tab-icon-image {
|
||||
list-style-image: url("chrome://global/skin/throbber/Throbber-small.gif") !important;
|
||||
list-style-image: url("chrome://global/skin/icons/loading_16.png") !important;
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
@ -1311,7 +1319,7 @@ tabpanels {
|
||||
}
|
||||
|
||||
.alltabs-item[busy] > .menu-iconic-left > .menu-iconic-icon {
|
||||
list-style-image: url("chrome://global/skin/throbber/Throbber-small.gif");
|
||||
list-style-image: url("chrome://global/skin/icons/loading_16.png");
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
@ -1326,7 +1334,7 @@ tabpanels {
|
||||
}
|
||||
|
||||
#sidebar-throbber[loading="true"] {
|
||||
list-style-image: url("chrome://global/skin/throbber/Throbber-small.gif");
|
||||
list-style-image: url("chrome://global/skin/icons/loading_16.png");
|
||||
opacity: 0.5;
|
||||
-moz-margin-end: 4px;
|
||||
}
|
||||
@ -1365,7 +1373,7 @@ toolbar[mode="text"] > #window-controls > toolbarbutton > .toolbarbutton-text {
|
||||
}
|
||||
|
||||
#checkForUpdates[loading="true"] {
|
||||
list-style-image: url("chrome://global/skin/throbber/Throbber-small.gif");
|
||||
list-style-image: url("chrome://global/skin/icons/loading_16.png");
|
||||
}
|
||||
|
||||
#download-monitor {
|
||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.2 KiB |
@ -43,6 +43,7 @@ classic.jar:
|
||||
* skin/classic/browser/places/organizer.css (places/organizer.css)
|
||||
* skin/classic/browser/places/organizer.xml (places/organizer.xml)
|
||||
skin/classic/browser/places/query.png (places/query.png)
|
||||
skin/classic/browser/places/searching_16.png (places/searching_16.png)
|
||||
skin/classic/browser/places/starPage.png (places/starPage.png)
|
||||
skin/classic/browser/places/tag.png (places/tag.png)
|
||||
skin/classic/browser/places/toolbarDropMarker.png (places/toolbarDropMarker.png)
|
||||
|
@ -55,21 +55,6 @@
|
||||
height: 12px;
|
||||
}
|
||||
|
||||
/* organize button */
|
||||
#organizeButton {
|
||||
list-style-image: url("moz-icon://stock/gtk-properties?size=button");
|
||||
}
|
||||
|
||||
/* view button */
|
||||
#viewMenu {
|
||||
list-style-image: url("moz-icon://stock/gtk-sort-ascending?size=button");
|
||||
}
|
||||
|
||||
/* maintenance button */
|
||||
#maintenanceButton {
|
||||
list-style-image: url("moz-icon://stock/gtk-revert-to-saved?size=button");
|
||||
}
|
||||
|
||||
/* Root View */
|
||||
#placesView {
|
||||
background-color: Window;
|
||||
@ -94,6 +79,11 @@
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
#infoPaneBox {
|
||||
border-top: 1px solid ThreeDShadow;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
/* Search Bar */
|
||||
#searchbar {
|
||||
margin: 6px -4px 0px 2px;
|
||||
|
@ -23,9 +23,15 @@ treechildren::-moz-tree-image(title) {
|
||||
margin: 0px 2px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
list-style-image: url("chrome://mozapps/skin/places/defaultFavicon.png");
|
||||
}
|
||||
|
||||
treechildren::-moz-tree-image(title, livemarkItem) {
|
||||
list-style-image: url("chrome://browser/skin/places/livemark-item.png");
|
||||
}
|
||||
|
||||
treechildren::-moz-tree-image(title, separator) {
|
||||
list-style-image: none;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
@ -44,12 +50,32 @@ treechildren::-moz-tree-image(title, container, tagContainer) {
|
||||
-moz-image-region: auto;
|
||||
}
|
||||
|
||||
treechildren::-moz-tree-image(container, OrganizerQuery_AllBookmarks) {
|
||||
list-style-image: url("chrome://browser/skin/Toolbar-small.png");
|
||||
-moz-image-region: rect(0px 48px 16px 32px);
|
||||
}
|
||||
|
||||
treechildren::-moz-tree-image(container, OrganizerQuery_BookmarksToolbar) {
|
||||
list-style-image: url("chrome://browser/skin/places/bookmarksToolbar.png");
|
||||
-moz-image-region: auto;
|
||||
}
|
||||
|
||||
treechildren::-moz-tree-image(container, OrganizerQuery_BookmarksMenu) {
|
||||
list-style-image: url("chrome://browser/skin/places/bookmarksMenu.png");
|
||||
-moz-image-region: auto;
|
||||
}
|
||||
|
||||
/* query-nodes should be styled even if they're not expandable */
|
||||
treechildren::-moz-tree-image(title, query) {
|
||||
list-style-image: url("chrome://browser/skin/places/query.png");
|
||||
-moz-image-region: auto;
|
||||
}
|
||||
|
||||
treechildren::-moz-tree-image(title, query, OrganizerQuery_History) {
|
||||
list-style-image: url("chrome://browser/skin/Toolbar-small.png");
|
||||
-moz-image-region: rect(0px 32px 16px 16px);
|
||||
}
|
||||
|
||||
/* We want some queries to look like ordinary folders. This must come
|
||||
after the (title, query) selector, or it would get overridden. */
|
||||
treechildren::-moz-tree-image(title, query, folder) {
|
||||
|
BIN
browser/themes/gnomestripe/browser/places/searching_16.png
Normal file
After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 11 KiB |
@ -27,7 +27,6 @@
|
||||
min-width: 0;
|
||||
margin: 0;
|
||||
-moz-margin-end: 2px;
|
||||
padding: 2px 0;
|
||||
border: 0;
|
||||
-moz-box-align: center;
|
||||
background-color: -moz-dialog;
|
||||
@ -38,7 +37,7 @@
|
||||
|
||||
.searchbar-engine-button > .button-box {
|
||||
-moz-appearance: none;
|
||||
padding: 0;
|
||||
padding: 2px 0;
|
||||
-moz-padding-end: 2px;
|
||||
border: 0;
|
||||
}
|
||||
@ -47,6 +46,10 @@
|
||||
background-color: Highlight;
|
||||
}
|
||||
|
||||
.searchbar-engine-button[addengines="true"] > .button-box {
|
||||
background-color: rgba(230, 230, 230, 0.3);
|
||||
}
|
||||
|
||||
.searchbar-dropmarker-image {
|
||||
-moz-appearance: toolbarbutton-dropdown !important;
|
||||
width: 12px;
|
||||
|
BIN
browser/themes/pinstripe/browser/Search-bar.png
Normal file
After Width: | Height: | Size: 385 B |
BIN
browser/themes/pinstripe/browser/Secure-Glyph-White.png
Normal file
After Width: | Height: | Size: 512 B |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 156 B |
@ -25,6 +25,7 @@
|
||||
* Kevin Gerich (kevin@kmgerich.com)
|
||||
* Pamela Greene (pamg.bugs@gmail.com)
|
||||
* Dao Gottwald (dao@design-noir.de)
|
||||
* Stephen Horlander (stephen@noved.org)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
@ -51,7 +52,7 @@
|
||||
}
|
||||
|
||||
#main-window[chromehidden~="toolbar"][chromehidden~="location"][chromehidden~="directories"] {
|
||||
border-top: 1px solid #606060;
|
||||
border-top: 1px solid rgba(0,0,0,0.65);
|
||||
}
|
||||
|
||||
/* ----- SEARCH FIELD ----- */
|
||||
@ -64,9 +65,9 @@
|
||||
|
||||
#PersonalToolbar {
|
||||
background: url("chrome://browser/skin/bookmark_toolbar_background.gif") repeat-x center center;
|
||||
border-top: 1px solid #DDDDDD;
|
||||
border-top: 1px solid rgba(255,255,255,0.25);
|
||||
border-bottom: 2px solid;
|
||||
-moz-border-bottom-colors: #404040 #9D9D9D;
|
||||
-moz-border-bottom-colors: rgba(0,0,0,0.35) transparent;
|
||||
padding: 2px 0;
|
||||
}
|
||||
|
||||
@ -78,7 +79,7 @@
|
||||
}
|
||||
|
||||
.query-item[container] {
|
||||
list-style-image: url("chrome://browser/skin/places/query.png");
|
||||
list-style-image: url("chrome://browser/skin/places/history.png");
|
||||
}
|
||||
|
||||
toolbarbutton.bookmark-item:hover
|
||||
@ -246,6 +247,10 @@ toolbarpaletteitem[place="toolbar"] .places-toolbar-items {
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
#bookmarksToolbarFolderMenu {
|
||||
list-style-image: url("chrome://browser/skin/places/bookmarksToolbar.png");
|
||||
}
|
||||
|
||||
/* ----- PRIMARY TOOLBAR BUTTONS ----- */
|
||||
|
||||
.toolbarbutton-1,
|
||||
@ -255,6 +260,11 @@ toolbarpaletteitem[place="toolbar"] .places-toolbar-items {
|
||||
-moz-box-orient: vertical;
|
||||
}
|
||||
|
||||
toolbar[mode="text"] .toolbarbutton-1,
|
||||
toolbar[mode="text"] .toolbarbutton-menubutton-button {
|
||||
-moz-box-orient: horizontal;
|
||||
}
|
||||
|
||||
toolbar[mode="text"] .toolbarbutton-1 > .toolbarbutton-text {
|
||||
margin: 4px;
|
||||
}
|
||||
@ -336,7 +346,7 @@ toolbar[mode="icons"] #forward-button .toolbarbutton-text-box,
|
||||
/* ----- DEFAULT BACK/FORWARD BUTTONS ----- */
|
||||
|
||||
toolbar[mode="icons"] #back-button {
|
||||
-moz-image-region: rect(0px, 548px, 39px, 504px) !important;
|
||||
-moz-image-region: rect(0px, 539px, 33px, 504px) !important;
|
||||
-moz-margin-end: 0 !important;
|
||||
-moz-padding-end: 0 !important;
|
||||
border-left: none !important;
|
||||
@ -344,16 +354,16 @@ toolbar[mode="icons"] #back-button {
|
||||
}
|
||||
|
||||
toolbar[mode="icons"] #back-button[disabled="true"] {
|
||||
-moz-image-region: rect(39px, 548px, 78px, 504px) !important;
|
||||
-moz-image-region: rect(33px, 539px, 66px, 504px) !important;
|
||||
}
|
||||
|
||||
toolbar[mode="icons"] #back-button:hover:active:not([disabled]),
|
||||
toolbar[mode="icons"] #back-button[open="true"] {
|
||||
-moz-image-region: rect(78px, 548px, 117px, 504px) !important;
|
||||
-moz-image-region: rect(66px, 539px, 99px, 504px) !important;
|
||||
}
|
||||
|
||||
toolbar[mode="icons"] #forward-button {
|
||||
-moz-image-region: rect(0px, 576px, 39px, 548px) !important;
|
||||
-moz-image-region: rect(0px, 566px, 33px, 539px) !important;
|
||||
-moz-margin-start: 0 !important;
|
||||
-moz-margin-end: 0 !important;
|
||||
-moz-padding-start: 0 !important;
|
||||
@ -363,16 +373,16 @@ toolbar[mode="icons"] #forward-button {
|
||||
}
|
||||
|
||||
toolbar[mode="icons"] #forward-button[disabled="true"] {
|
||||
-moz-image-region: rect(39px, 576px, 78px, 548px) !important;
|
||||
-moz-image-region: rect(33px, 566px, 66px, 539px) !important;
|
||||
}
|
||||
|
||||
toolbar[mode="icons"] #forward-button:hover:active:not([disabled]),
|
||||
toolbar[mode="icons"] #forward-button[open="true"] {
|
||||
-moz-image-region: rect(78px, 576px, 117px, 548px) !important;
|
||||
-moz-image-region: rect(66px, 566px, 99px, 539px) !important;
|
||||
}
|
||||
|
||||
toolbar[mode="icons"] #back-forward-dropmarker {
|
||||
-moz-image-region: rect(0px, 590px, 39px, 576px) !important;
|
||||
-moz-image-region: rect(0px, 582px, 33px, 566px) !important;
|
||||
-moz-margin-start: 0 !important;
|
||||
-moz-margin-end: 3px !important;
|
||||
-moz-padding-start: 0 !important;
|
||||
@ -392,18 +402,18 @@ toolbar[mode="icons"] #back-forward-dropmarker > dropmarker {
|
||||
}
|
||||
|
||||
toolbar[mode="icons"] #back-forward-dropmarker[disabled="true"] {
|
||||
-moz-image-region: rect(39px, 590px, 78px, 576px) !important;
|
||||
-moz-image-region: rect(33px, 582px, 66px, 566px) !important;
|
||||
}
|
||||
|
||||
toolbar[mode="icons"] #back-forward-dropmarker:hover:active:not([disabled]),
|
||||
toolbar[mode="icons"] #back-forward-dropmarker[open="true"] {
|
||||
-moz-image-region: rect(78px, 590px, 117px, 576px) !important;
|
||||
-moz-image-region: rect(0px, 582px, 33px, 566px) !important;
|
||||
}
|
||||
|
||||
/* ----- SMALL BACK BUTTON, PAIRED----- */
|
||||
|
||||
toolbar[iconsize="small"][mode="icons"] #back-button {
|
||||
-moz-image-region: rect(0px, 623px, 23px, 590px) !important;
|
||||
-moz-image-region: rect(0px, 616px, 23px, 582px) !important;
|
||||
-moz-margin-end: 0 !important;
|
||||
-moz-padding-end: 0 !important;
|
||||
border-left: none !important;
|
||||
@ -411,44 +421,44 @@ toolbar[iconsize="small"][mode="icons"] #back-button {
|
||||
}
|
||||
|
||||
toolbar[iconsize="small"][mode="icons"] #back-button[disabled="true"] {
|
||||
-moz-image-region: rect(23px, 623px, 46px, 590px) !important;
|
||||
-moz-image-region: rect(23px, 616px, 46px, 582px) !important;
|
||||
}
|
||||
|
||||
toolbar[iconsize="small"][mode="icons"] #back-button:hover:active:not([disabled]),
|
||||
toolbar[iconsize="small"][mode="icons"] #back-button[open="true"] {
|
||||
-moz-image-region: rect(46px, 623px, 69px, 590px) !important;
|
||||
-moz-image-region: rect(46px, 616px, 69px, 582px) !important;
|
||||
}
|
||||
|
||||
/* ----- SMALL FORWARD BUTTON, PAIRED ----- */
|
||||
|
||||
toolbar[iconsize="small"][mode="icons"] #forward-button {
|
||||
-moz-image-region: rect(0px, 657px, 23px, 623px) !important;
|
||||
-moz-image-region: rect(0px, 649px, 23px, 616px) !important;
|
||||
-moz-margin-start: 0 !important;
|
||||
-moz-padding-start: 0 !important;
|
||||
border-left: none !important;
|
||||
border-right: none !important;
|
||||
}
|
||||
toolbar[iconsize="small"][mode="icons"] #forward-button[disabled="true"] {
|
||||
-moz-image-region: rect(23px, 657px, 46px, 623px) !important;
|
||||
-moz-image-region: rect(23px, 649px, 46px, 616px) !important;
|
||||
}
|
||||
toolbar[iconsize="small"][mode="icons"] #forward-button:hover:active:not([disabled]),
|
||||
toolbar[iconsize="small"][mode="icons"] #forward-button[open="true"] {
|
||||
-moz-image-region: rect(46px, 657px, 69px, 623px) !important;
|
||||
-moz-image-region: rect(46px, 649px, 69px, 616px) !important;
|
||||
}
|
||||
|
||||
/* ----- SMALL BACK/FORWARD DROPMARKER ----- */
|
||||
|
||||
toolbar[iconsize="small"][mode="icons"] #back-forward-dropmarker {
|
||||
-moz-image-region: rect(0px, 672px, 23px, 657px) !important;
|
||||
-moz-image-region: rect(0px, 664px, 23px, 649px) !important;
|
||||
}
|
||||
|
||||
toolbar[iconsize="small"][mode="icons"] #back-forward-dropmarker[disabled="true"] {
|
||||
-moz-image-region: rect(23px, 672px, 46px, 657px) !important;
|
||||
-moz-image-region: rect(23px, 664px, 46px, 649px) !important;
|
||||
}
|
||||
|
||||
toolbar[iconsize="small"][mode="icons"] #back-forward-dropmarker:hover:active:not([disabled]),
|
||||
toolbar[iconsize="small"][mode="icons"] #back-forward-dropmarker[open="true"] {
|
||||
-moz-image-region: rect(46px, 672px, 69px, 657px) !important;
|
||||
-moz-image-region: rect(46px, 664px, 69px, 649px) !important;
|
||||
}
|
||||
|
||||
/* ----- DEFAULT RELOAD BUTTON ----- */
|
||||
@ -655,12 +665,12 @@ toolbar[iconsize="small"][mode="icons"] #back-forward-dropmarker[open="true"] {
|
||||
-moz-appearance: none;
|
||||
border: none;
|
||||
background: url("chrome://browser/skin/urlbar/endcap.png") transparent right center no-repeat;
|
||||
margin: 1px 4px;
|
||||
margin: 0px 4px 1px 4px;
|
||||
-moz-padding-end: 8px;
|
||||
font: icon !important;
|
||||
width: 7em;
|
||||
min-width: 7em;
|
||||
min-height: 26px;
|
||||
height: 26px;
|
||||
}
|
||||
|
||||
#urlbar[focused="true"] {
|
||||
@ -678,13 +688,16 @@ toolbar[iconsize="small"][mode="icons"] #back-forward-dropmarker[open="true"] {
|
||||
background-image: url("chrome://browser/skin/urlbar/textfield-mid-focused.png");
|
||||
}
|
||||
|
||||
#urlbar .textbox-input-box {
|
||||
padding-top: 1px;
|
||||
}
|
||||
|
||||
.autocomplete-textbox {
|
||||
background-image: inherit !important;
|
||||
}
|
||||
|
||||
#urlbar-icons {
|
||||
-moz-box-align: center;
|
||||
margin: 2px 0;
|
||||
min-height: 26px;
|
||||
}
|
||||
|
||||
@ -713,6 +726,7 @@ toolbar[iconsize="small"][mode="icons"] #back-forward-dropmarker[open="true"] {
|
||||
|
||||
#PopupAutoCompleteRichResult {
|
||||
direction: ltr !important;
|
||||
margin-top: -2px;
|
||||
}
|
||||
|
||||
/* ----- PAGE PROXY ICON ----- */
|
||||
@ -740,7 +754,7 @@ toolbar[iconsize="small"][mode="icons"] #back-forward-dropmarker[open="true"] {
|
||||
}
|
||||
|
||||
#urlbar-throbber {
|
||||
list-style-image: url("chrome://global/skin/icons/loading_16.png");
|
||||
list-style-image: url("chrome://browser/skin/places/searching_16.png");
|
||||
}
|
||||
|
||||
|
||||
@ -782,6 +796,10 @@ statusbarpanel#statusbar-display {
|
||||
font-size: 1.15em;
|
||||
}
|
||||
|
||||
.ac-extra > .ac-comment {
|
||||
font-size: inherit;
|
||||
}
|
||||
|
||||
.ac-url-text {
|
||||
color: #336633;
|
||||
}
|
||||
@ -812,21 +830,42 @@ statusbarpanel#statusbar-display {
|
||||
-moz-image-region: rect(0px, 16px, 16px, 0px);
|
||||
}
|
||||
|
||||
#go-button:hover {
|
||||
-moz-image-region: rect(0px, 32px, 16px, 16px);
|
||||
}
|
||||
|
||||
#go-button:hover:active {
|
||||
-moz-image-region: rect(0px, 48px, 16px, 32px);
|
||||
}
|
||||
|
||||
/* STAR BUTTON */
|
||||
#star-button {
|
||||
padding: 1px;
|
||||
list-style-image: url("chrome://browser/skin/places/starPage.png");
|
||||
list-style-image: url("chrome://browser/skin/places/star-icons.png");
|
||||
-moz-image-region: rect(0px, 16px, 16px, 0px);
|
||||
}
|
||||
|
||||
#star-button:hover {
|
||||
-moz-image-region: rect(0px, 32px, 16px, 16px);
|
||||
}
|
||||
|
||||
#star-button:hover:active {
|
||||
-moz-image-region: rect(0px, 48px, 16px, 32px);
|
||||
}
|
||||
|
||||
#star-button[starred="true"] {
|
||||
list-style-image: url("chrome://browser/skin/places/pageStarred.png");
|
||||
-moz-image-region: rect(16px, 16px, 32px, 0px);
|
||||
}
|
||||
|
||||
#star-button:hover[starred="true"] {
|
||||
-moz-image-region: rect(16px, 32px, 32px, 16px);
|
||||
}
|
||||
|
||||
#star-button:hover:active[starred="true"] {
|
||||
-moz-image-region: rect(16px, 48px, 32px, 32px);
|
||||
}
|
||||
|
||||
/* BOOKMARKING PANEL */
|
||||
#editBookmarkPanel {
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
#editBookmarkPanelStarIcon {
|
||||
list-style-image: url("chrome://browser/skin/places/starred48.png");
|
||||
width: 48px;
|
||||
@ -837,10 +876,352 @@ statusbarpanel#statusbar-display {
|
||||
list-style-image: url("chrome://browser/skin/places/unstarred48.png");
|
||||
}
|
||||
|
||||
#editBookmarkPanelTitle {
|
||||
font-size: 130%;
|
||||
#editBookmarkPanel {
|
||||
-moz-appearance: none;
|
||||
background-color: rgba(68,68,68,0.9);
|
||||
border: 1px solid rgba(255,255,255,0.15);
|
||||
-moz-border-radius: 8px;
|
||||
-moz-border-radius-topright: 0px ;
|
||||
padding: 10px 8px 6px 8px;
|
||||
margin-top: 4px;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
#editBookmarkPanelTitle {
|
||||
font-size: 130%;
|
||||
font-weight: bold;
|
||||
margin: 8px 12px 0px 9px;
|
||||
}
|
||||
|
||||
#editBookmarkPanel > hbox {
|
||||
padding-right: 1px;
|
||||
}
|
||||
|
||||
/**** HUD style buttons ****/
|
||||
|
||||
#editBookmarkPanel > hbox > vbox > hbox > button,
|
||||
#editBookmarkPanel > #editBookmarkPanelBottomButtons > button {
|
||||
-moz-appearance: none;
|
||||
background: url("chrome://browser/skin/hud-style-button-middle-background.png") repeat-x #464646 center center;
|
||||
border-width: 3px;
|
||||
border-style: solid;
|
||||
-moz-border-radius: 20px;
|
||||
-moz-border-top-colors: rgba(0,0,0,0.35) rgba(26,26,26,0.5) rgba(255,255,255,0.4);
|
||||
-moz-border-right-colors: rgba(0,0,0,0.35) rgba(26,26,26,0.5) rgba(255,255,255,0.4);
|
||||
-moz-border-bottom-colors: rgba(128,128,128,0.35) rgba(0,0,0,0.5) rgba(255,255,255,0.15);
|
||||
-moz-border-left-colors: rgba(0,0,0,0.35) rgba(26,26,26,0.5) rgba(255,255,255,0.4);
|
||||
padding: 0 9px;
|
||||
margin: 6px;
|
||||
min-width: 79px;
|
||||
min-height: 22px;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
#editBookmarkPanel > hbox > vbox > hbox > button:hover:active,
|
||||
#editBookmarkPanel > #editBookmarkPanelBottomButtons > button:hover:active {
|
||||
background-color: #86888B;
|
||||
}
|
||||
|
||||
#editBookmarkPanel > hbox > vbox > hbox > button:focus,
|
||||
#editBookmarkPanel > #editBookmarkPanelBottomButtons > button:focus {
|
||||
outline: 2px solid -moz-mac-focusring;
|
||||
outline-offset: -2px;
|
||||
-moz-outline-radius: 100%;
|
||||
}
|
||||
|
||||
#editBookmarkPanel > #editBookmarkPanelBottomButtons > button[default="true"] {
|
||||
background-color: #666;
|
||||
}
|
||||
|
||||
#editBookmarkPanel > #editBookmarkPanelContent {
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_newFolderBox {
|
||||
background-image: url("chrome://browser/skin/hud-style-new-folder-bar-background.png");
|
||||
background-repeat: repeat-x;
|
||||
border: 0;
|
||||
border-width: 1px 0 1px 0;
|
||||
border-style: solid;
|
||||
border-top-color: #212121;
|
||||
border-bottom-color: #212121;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
-moz-margin-start: -8px;
|
||||
-moz-margin-end: -8px;
|
||||
margin-bottom: 8px !important;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_newFolderButton {
|
||||
-moz-appearance: none;
|
||||
background-color: transparent !important;
|
||||
border-width: 0 3px 0 0;
|
||||
border-style: solid;
|
||||
-moz-border-right-colors: rgba(255,255,255,0.15) rgba(0,0,0,0.5) rgba(255,255,255,0.15);
|
||||
padding: 0 9px;
|
||||
margin: 0;
|
||||
min-width: 21px;
|
||||
min-height: 20px;
|
||||
height: 20px;
|
||||
color: #ffffff;
|
||||
list-style-image: url("chrome://browser/skin/hud-style-new-folder-plus-sign.png") !important;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_newFolderButton:hover:active {
|
||||
background-color: #86888B;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_newFolderButton:focus {
|
||||
outline: 2px solid -moz-mac-focusring;
|
||||
outline-offset: -2px;
|
||||
-moz-outline-radius: 1px;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_newFolderButton .button-text {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_folderMenuList {
|
||||
-moz-appearance: none;
|
||||
background: url("chrome://browser/skin/hud-style-button-middle-background.png") repeat-x #464646 center center;
|
||||
border: 3px solid;
|
||||
-moz-border-radius: 5px;
|
||||
-moz-border-top-colors: rgba(0,0,0,0.35) rgba(26,26,26,0.5) rgba(255,255,255,0.4);
|
||||
-moz-border-right-colors: rgba(53,53,53,1) rgba(53,53,53,1) rgba(162,162,162,1);
|
||||
-moz-border-bottom-colors: rgba(128,128,128,0.35) rgba(0,0,0,0.5) rgba(255,255,255,0.15);
|
||||
-moz-border-left-colors: rgba(0,0,0,0.35) rgba(26,26,26,0.5) rgba(255,255,255,0.4);
|
||||
margin: 0 3px !important;
|
||||
min-height: 22px;
|
||||
-moz-padding-start: 2px;
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_folderMenuList:focus {
|
||||
outline: 2px solid -moz-mac-focusring;
|
||||
outline-offset: -2px;
|
||||
-moz-outline-radius: 5px;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_folderMenuList[open="true"],
|
||||
#editBookmarkPanel #editBMPanel_folderMenuList:hover:active {
|
||||
background-image: url("chrome://browser/skin/hud-style-button-middle-background-active.png");
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_folderMenuList > .menulist-dropmarker {
|
||||
-moz-appearance: none;
|
||||
display: -moz-box;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_folderMenuList > .menulist-dropmarker > .dropmarker-icon {
|
||||
list-style-image: url("chrome://browser/skin/hud-style-dropmarker-double-arrows.png");
|
||||
}
|
||||
|
||||
/**** folder tree ****/
|
||||
|
||||
#editBookmarkPanel #editBMPanel_folderTree {
|
||||
background-color: #333333;
|
||||
border-top: 2px solid !important;
|
||||
border-right: 0 !important;
|
||||
border-bottom: 0 !important;
|
||||
border-left: 0 !important;
|
||||
-moz-border-top-colors: rgba(0,0,0,0.35) rgba(255,255,255,0.15);
|
||||
margin: 0px;
|
||||
-moz-margin-start: -8px;
|
||||
-moz-margin-end: -8px;
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_folderTree:focus {
|
||||
outline: 2px solid -moz-mac-focusring;
|
||||
outline-offset: -2px;
|
||||
-moz-outline-radius: 1px;
|
||||
}
|
||||
|
||||
#editBMPanel_folderTree treechildren::-moz-tree-twisty {
|
||||
-moz-appearance: none !important;
|
||||
list-style-image: url("chrome://browser/skin/hud-style-twisties.png");
|
||||
-moz-image-region: rect(0px, 10px, 10px, 0px);
|
||||
margin-top: 1px;
|
||||
-moz-margin-end: 1px;
|
||||
}
|
||||
|
||||
#editBMPanel_folderTree treechildren::-moz-tree-twisty(open) {
|
||||
-moz-appearance: none;
|
||||
-moz-image-region: rect(0px, 20px, 10px, 10px);
|
||||
}
|
||||
|
||||
#editBMPanel_folderTree treechildren::-moz-tree-twisty(selected) {
|
||||
-moz-appearance: none;
|
||||
-moz-image-region: rect(0px, 30px, 10px, 20px);
|
||||
}
|
||||
|
||||
#editBMPanel_folderTree treechildren::-moz-tree-twisty(selected, open) {
|
||||
-moz-appearance: none;
|
||||
-moz-image-region: rect(0px, 40px, 10px, 30px);
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_tagsSelector {
|
||||
-moz-appearance: none;
|
||||
background-color: #333333;
|
||||
border-top: 2px solid !important;
|
||||
border-right: 0 !important;
|
||||
border-bottom: 2px solid !important;
|
||||
border-left: 0 !important;
|
||||
-moz-border-top-colors: rgba(0,0,0,0.35) rgba(255,255,255,0.15);
|
||||
-moz-border-bottom-colors: rgba(255,255,255,0.30) rgba(0,0,0,0.35) ;
|
||||
margin: 6px -8px !important;
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_tagsSelector:focus {
|
||||
outline: 2px solid -moz-mac-focusring;
|
||||
outline-offset: -2px;
|
||||
-moz-outline-radius: 1px;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_tagsSelector .listcell-check {
|
||||
-moz-appearance: none !important;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
list-style-image: url("chrome://browser/skin/hud-style-check-box-empty.png");
|
||||
min-height: 14px;
|
||||
min-width: 14px;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_tagsSelector .listcell-check[checked="true"] {
|
||||
list-style-image: url("chrome://browser/skin/hud-style-check-box-checked.png");
|
||||
}
|
||||
|
||||
#editBMPanel_folderTree treechildren::-moz-tree-row {
|
||||
color: #ffffff !important;
|
||||
background-color: transparent !important;
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
#editBMPanel_folderTree treechildren::-moz-tree-row(selected) {
|
||||
background-color: #b3b3b3 !important;
|
||||
}
|
||||
|
||||
#editBMPanel_folderTree treechildren::-moz-tree-cell-text(selected),
|
||||
#editBMPanel_folderTree treechildren::-moz-tree-cell-text(selected, focus) {
|
||||
color: #222222 !important;
|
||||
}
|
||||
|
||||
#editBMPanel_folderTree treechildren::-moz-tree-row(selected, focus) {
|
||||
background-color: #b3b3b3 !important;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_tagsSelector > listitem[selected="true"] {
|
||||
color: #222222;
|
||||
background-color: #b3b3b3;
|
||||
}
|
||||
|
||||
/**** expanders ****/
|
||||
|
||||
#editBookmarkPanel .expander-up,
|
||||
#editBookmarkPanel .expander-down {
|
||||
-moz-appearance: none;
|
||||
background: url("chrome://browser/skin/hud-style-button-middle-background.png") repeat-x #464646 center center;
|
||||
border: 3px solid;
|
||||
-moz-border-radius: 5px;
|
||||
-moz-border-top-colors: rgba(0,0,0,0.35) rgba(26,26,26,0.5) rgba(255,255,255,0.4);
|
||||
-moz-border-right-colors: rgba(53,53,53,1) rgba(53,53,53,1) rgba(162,162,162,1);
|
||||
-moz-border-bottom-colors: rgba(128,128,128,0.35) rgba(0,0,0,0.5) rgba(255,255,255,0.15);
|
||||
-moz-border-left-colors: rgba(0,0,0,0.35) rgba(26,26,26,0.5) rgba(255,255,255,0.4);
|
||||
-moz-margin-start: 4px;
|
||||
-moz-margin-end: 2px;
|
||||
padding: 0 0 0 4px;
|
||||
min-width: 10px;
|
||||
min-height: 22px;
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
#editBookmarkPanel .expander-up:focus,
|
||||
#editBookmarkPanel .expander-down:focus {
|
||||
outline: 2px solid -moz-mac-focusring;
|
||||
outline-offset: -2px;
|
||||
-moz-outline-radius: 5px;
|
||||
}
|
||||
|
||||
#editBookmarkPanel .expander-up {
|
||||
list-style-image: url("chrome://browser/skin/hud-style-expander-open.png") !important;
|
||||
}
|
||||
|
||||
#editBookmarkPanel .expander-down {
|
||||
list-style-image: url("chrome://browser/skin/hud-style-expander-closed.png") !important;
|
||||
}
|
||||
|
||||
#editBookmarkPanel .expander-down:hover:active {
|
||||
list-style-image: url("chrome://browser/skin/hud-style-expander-open.png") !important;
|
||||
background-image: url("chrome://browser/skin/hud-style-button-middle-background-active.png") !important;
|
||||
background-repeat: repeat-x !important;
|
||||
}
|
||||
|
||||
#editBookmarkPanel .expander-up:hover:active {
|
||||
list-style-image: url("chrome://browser/skin/hud-style-expander-closed.png") !important;
|
||||
background-image: url("chrome://browser/skin/hud-style-button-middle-background-active.png") !important;
|
||||
background-repeat: repeat-x !important;
|
||||
}
|
||||
|
||||
|
||||
/**** name picker ****/
|
||||
|
||||
#editBookmarkPanel #editBMPanel_namePicker[droppable="false"] {
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_namePicker[droppable="false"] > .menulist-dropmarker {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_tagsField,
|
||||
#editBookmarkPanel #editBMPanel_namePicker[droppable="false"] > .menulist-editable-box {
|
||||
-moz-appearance: none !important;
|
||||
cursor: text;
|
||||
margin: 2px 4px;
|
||||
border: 2px solid;
|
||||
-moz-border-top-colors: #1c1c1c #545454 ;
|
||||
-moz-border-right-colors: #1c1c1c #636363;
|
||||
-moz-border-bottom-colors: #1c1c1c #797979;
|
||||
-moz-border-left-colors: #1c1c1c #636363;
|
||||
-moz-border-radius: 1px;
|
||||
padding: 0;
|
||||
background-color: #666666;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_tagsField[empty="true"] {
|
||||
color: #bbbbbb;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_tagsField[focused="true"],
|
||||
#editBookmarkPanel #editBMPanel_namePicker[droppable="false"][focused="true"] > .menulist-editable-box {
|
||||
outline: 2px solid -moz-mac-focusring;
|
||||
outline-offset: -1px;
|
||||
-moz-outline-radius: 1px;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_namePicker[droppable="false"][disabled="true"] > .menulist-editable-box {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
#editBookmarkPanel #editBMPanel_namePicker[droppable="false"] > .menulist-editable-box > html|*.menulist-editable-input {
|
||||
margin: 0px !important;
|
||||
border: none !important;
|
||||
padding: 0px !important;
|
||||
background-color: inherit;
|
||||
color: #ffffff !important;
|
||||
font: inherit;
|
||||
}
|
||||
|
||||
#editBookmarkPanel > #editBookmarkPanelContent > #editBookmarkPanelGrid > rows > row > label {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
/* ----- SIDEBAR ELEMENTS ----- */
|
||||
|
||||
@ -936,14 +1317,14 @@ sidebarheader > .tabs-closebutton > .toolbarbutton-text {
|
||||
}
|
||||
|
||||
#feed-button[feeds] {
|
||||
list-style-image: url("chrome://browser/skin/livemark-item.png");
|
||||
-moz-image-region: rect(0px, 36px, 18px, 18px);
|
||||
list-style-image: url("chrome://browser/skin/feed-icons.png");
|
||||
-moz-image-region: rect(0px, 16px, 16px, 0px);
|
||||
}
|
||||
#feed-button[feeds]:hover {
|
||||
-moz-image-region: rect(18px, 36px, 36px, 18px);
|
||||
-moz-image-region: rect(0px, 32px, 16px, 16px);
|
||||
}
|
||||
#feed-button[feeds]:active {
|
||||
-moz-image-region: rect(54px, 36px, 72px, 18px);
|
||||
-moz-image-region: rect(0px, 48px, 16px, 32px);
|
||||
}
|
||||
|
||||
/* ----- THROBBER ----- */
|
||||
@ -989,7 +1370,7 @@ toolbarbutton.chevron > .toolbarbutton-menu-dropmarker {
|
||||
#nav-bar {
|
||||
background-color: #9B9B9B;
|
||||
border-top: none;
|
||||
border-bottom: 1px solid #404040;
|
||||
border-bottom: 1px solid rgba(0,0,0,0.35);
|
||||
background-image: url("chrome://global/skin/toolbar/toolbar-background.gif");
|
||||
background-repeat: repeat-x;
|
||||
background-position: top right;
|
||||
@ -998,8 +1379,8 @@ toolbarbutton.chevron > .toolbarbutton-menu-dropmarker {
|
||||
|
||||
#nav-bar[collapsed="true"] + toolbar[customindex] {
|
||||
border-top: 2px solid;
|
||||
-moz-border-top-colors: #606060 #C7C7C7;
|
||||
}
|
||||
-moz-border-top-colors: rgba(0,0,0,0.35) rgba(255,255,255,0.45);
|
||||
}
|
||||
|
||||
.bookmark-item {
|
||||
list-style-image: url("chrome://mozapps/skin/places/defaultFavicon.png");
|
||||
@ -1120,6 +1501,7 @@ toolbarbutton.chevron > .toolbarbutton-menu-dropmarker {
|
||||
.tabbrowser-strip {
|
||||
margin-top: -1px;
|
||||
border-bottom: 1px solid #404040;
|
||||
background-color: #9B9B9B;
|
||||
}
|
||||
|
||||
.tabbrowser-tabs {
|
||||
@ -1156,11 +1538,11 @@ tabbrowser > tabbox > tabpanels {
|
||||
}
|
||||
|
||||
.tab-drop-indicator {
|
||||
height: 10px;
|
||||
width: 8px;
|
||||
margin-bottom: -5px;
|
||||
height: 33px;
|
||||
width: 10px;
|
||||
margin-bottom: -24px;
|
||||
position: relative;
|
||||
background: url('chrome://browser/skin/tabbrowser/tabDragIndicator.png') 50% 50% no-repeat;
|
||||
background: url('chrome://browser/skin/tabbrowser/tabDragIndicator.png') 50% 40% no-repeat;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1237,17 +1619,23 @@ tabbrowser > tabbox > tabpanels {
|
||||
|
||||
.tabs-alltabs-box {
|
||||
margin: 0;
|
||||
width: 27px;
|
||||
background-image: url("chrome://browser/skin/tabbrowser/alltabs-box-bkgnd.png");
|
||||
background-repeat: no-repeat;
|
||||
list-style-image: none;
|
||||
width: 25px;
|
||||
}
|
||||
|
||||
.tabs-alltabs-button {
|
||||
margin: 2px 0px 3px 0px;
|
||||
list-style-image: url("chrome://browser/skin/tabbrowser/alltabs-box-bkgnd-icon.png");
|
||||
border-left: 2px solid;
|
||||
-moz-border-left-colors: rgba(0,0,0,0.25) rgba(255,255,255,0.15);
|
||||
margin: 0;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
border: none;
|
||||
}
|
||||
.tabs-alltabs-button:hover {
|
||||
background-color: rgba(0,0,0,0.10);
|
||||
}
|
||||
.tabs-alltabs-button:hover:active,
|
||||
.tabs-alltabs-button[open="true"] {
|
||||
background-color: rgba(0,0,0,0.20);
|
||||
}
|
||||
|
||||
.tabs-alltabs-button > .toolbarbutton-menu-dropmarker {
|
||||
@ -1478,7 +1866,7 @@ toolbarbutton.bookmark-item[dragover="true"][open="true"] {
|
||||
#identity-popup-content-box > description,
|
||||
#identity-popup-encryption-label {
|
||||
white-space: pre-wrap;
|
||||
color: black;
|
||||
color: #ffffff;
|
||||
padding-left: 15px;
|
||||
margin: 2px 0 4px;
|
||||
}
|
||||
@ -1512,21 +1900,57 @@ toolbarbutton.bookmark-item[dragover="true"][open="true"] {
|
||||
#identity-popup-content-box.verifiedIdentity > #identity-popup-encryption ,
|
||||
#identity-popup-content-box.verifiedDomain > #identity-popup-encryption {
|
||||
margin-top: 10px;
|
||||
margin-left: -18px;
|
||||
margin-left: -24px;
|
||||
}
|
||||
|
||||
#identity-popup-content-box.verifiedIdentity > #identity-popup-encryption > vbox > #identity-popup-encryption-icon ,
|
||||
#identity-popup-content-box.verifiedDomain > #identity-popup-encryption > vbox > #identity-popup-encryption-icon {
|
||||
list-style-image: url("chrome://browser/skin/Secure.png");
|
||||
-moz-image-region: rect(0px, 18px, 18px, 0px);
|
||||
margin-top: 5px;
|
||||
list-style-image: url("chrome://browser/skin/Secure-Glyph-White.png");
|
||||
}
|
||||
|
||||
/* Popup Bounding Box */
|
||||
#identity-popup-container {
|
||||
background-image: none;
|
||||
background-color: white;
|
||||
#identity-popup {
|
||||
-moz-appearance: none;
|
||||
background-color: rgba(68,68,68,0.9);
|
||||
border: 1px solid rgba(255,255,255,0.15);
|
||||
-moz-border-radius: 8px;
|
||||
-moz-border-radius-topleft: 0px;
|
||||
padding: 10px 8px 6px 8px;
|
||||
margin-top: -3px;
|
||||
-moz-margin-start: 11px;
|
||||
color: #ffffff;
|
||||
min-width: 280px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
#identity-popup-container {
|
||||
-moz-appearance: none;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
/* Popup Buttons */
|
||||
#identity-popup-more-info-button {
|
||||
-moz-appearance: none;
|
||||
background: url("chrome://browser/skin/hud-style-button-middle-background.png") repeat-x #464646 center center;
|
||||
border: 3px solid;
|
||||
-moz-border-radius: 5px;
|
||||
-moz-border-top-colors: rgba(0,0,0,0.35) rgba(26,26,26,0.5) rgba(255,255,255,0.4);
|
||||
-moz-border-right-colors: rgba(53,53,53,1) rgba(53,53,53,1) rgba(162,162,162,1);
|
||||
-moz-border-bottom-colors: rgba(128,128,128,0.35) rgba(0,0,0,0.5) rgba(255,255,255,0.15);
|
||||
-moz-border-left-colors: rgba(0,0,0,0.35) rgba(26,26,26,0.5) rgba(255,255,255,0.4);
|
||||
-moz-border-radius: 20px;
|
||||
padding: 1px 9px;
|
||||
margin: 6px;
|
||||
min-height: 0px;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
#identity-popup-more-info-button > .button-box > .button-text {
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
#identity-popup-more-info-button:hover:active {
|
||||
background-color: #86888B;
|
||||
}
|
||||
|
||||
#download-monitor {
|
||||
|
BIN
browser/themes/pinstripe/browser/feed-icons.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 2.8 KiB |
BIN
browser/themes/pinstripe/browser/hud-style-check-box-checked.png
Normal file
After Width: | Height: | Size: 502 B |
BIN
browser/themes/pinstripe/browser/hud-style-check-box-empty.png
Normal file
After Width: | Height: | Size: 364 B |
After Width: | Height: | Size: 166 B |