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
This commit is contained in:
Benjamin Smedberg 2008-04-15 13:59:01 -04:00
commit b3c6962a6c
866 changed files with 21688 additions and 12311 deletions

View File

@ -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.

View File

@ -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);
};

View File

@ -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;
};

View File

@ -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;

View File

@ -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);
}

View File

@ -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;

View File

@ -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
};

View File

@ -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;
}

View File

@ -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,

View File

@ -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")

View File

@ -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))) {

View File

@ -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
};
/**

View File

@ -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 ||

View File

@ -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;

View File

@ -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)
{

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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):

View File

@ -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;

View File

@ -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;

View File

@ -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)!
};

View File

@ -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);

View File

@ -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 }
};

View File

@ -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;
}

View File

@ -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)

View File

@ -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);

View 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>

View File

@ -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 + "!");

View 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>

View 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>

View File

@ -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>

View File

@ -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

View File

@ -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">

View File

@ -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) {

View File

@ -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 ,

View File

@ -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) {

View File

@ -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.

View 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>.

View File

@ -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

View File

@ -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)

View File

@ -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"

View 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;
}

View File

@ -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:

View File

@ -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);
}
},

View File

@ -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();
};

View File

@ -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,

View File

@ -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);

View File

@ -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>

View File

@ -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;
}

View File

@ -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");
},
/**

View File

@ -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>

View File

@ -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>

View File

@ -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;
}

View File

@ -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) { },

View File

@ -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;

View File

@ -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());

View File

@ -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);

View File

@ -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));

View 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);
}

View File

@ -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));

View File

@ -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);

View File

@ -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 {

View File

@ -83,7 +83,7 @@ function PROT_MalwareWarden() {
},
updateUrlRequested: function(url) { },
streamCompleted: function() { },
streamFinished: function(status) { },
updateError: function(errorCode) { },
updateSuccess: function(requestedTimeout) { }
};

View File

@ -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';

View File

@ -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);

View File

@ -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);

View File

@ -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);

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View File

@ -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

View File

@ -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);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -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)

View File

@ -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;

View File

@ -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) {

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -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;

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 B

View File

@ -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 {

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 B

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