Merge from 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/jsarray.c => js/src/jsarray.cpp
rename : js/src/jsatom.c => js/src/jsatom.cpp
rename : js/src/jsbool.c => js/src/jsbool.cpp
rename : js/src/jsdbgapi.c => js/src/jsdbgapi.cpp
rename : js/src/jsemit.c => js/src/jsemit.cpp
rename : js/src/jsfun.c => js/src/jsfun.cpp
rename : js/src/jsgc.c => js/src/jsgc.cpp
rename : js/src/jsinterp.c => js/src/jsinterp.cpp
rename : js/src/jsiter.c => js/src/jsiter.cpp
rename : js/src/jslock.c => js/src/jslock.cpp
rename : js/src/jsobj.c => js/src/jsobj.cpp
rename : js/src/jsopcode.c => js/src/jsopcode.cpp
rename : js/src/jsparse.c => js/src/jsparse.cpp
rename : js/src/jsstr.c => js/src/jsstr.cpp
rename : js/src/jsxml.c => js/src/jsxml.cpp
This commit is contained in:
jorendorff@mozilla.com 2008-01-28 17:32:29 -08:00
commit bbea725a53
1469 changed files with 100988 additions and 59781 deletions

View File

@ -1,306 +1,20 @@
==============================================================
For information on how to build Mozilla from the source code, see:
= = = = = = = = = = Mozilla Read Me = = = = = = = = = = =
http://developer.mozilla.org/en/docs/Build_Documentation
==============================================================
To have your bug fix / feature added to Mozilla, you should create a patch and
submit it to Bugzilla (http://bugzilla.mozilla.org). Instructions are at:
Mozilla is subject to the terms detailed in the license
agreement accompanying it.
http://developer.mozilla.org/en/docs/Creating_a_patch
http://developer.mozilla.org/en/docs/Getting_your_patch_in_the_tree
This Read Me file contains information about system
requirements and installation instructions for the Windows,
Mac OS, and Linux builds of Mozilla.
If you have a question about developing Mozilla, and can't find the solution
on http://developer.mozilla.org, you can try asking your question in a
mozilla.* Usenet group, or on IRC at irc.mozilla.org. [The Mozilla news groups
are accessible on Google Groups, or news.mozilla.org with a NNTP reader.]
For more info on Mozilla, see www.mozilla.org. To submit bugs
or other feedback, see the Navigator QA menu and check out
Bugzilla at http://bugzilla.mozilla.org for links to known
bugs, bug-writing guidelines, and more. You can also get help
with Bugzilla by pointing your IRC client to #mozillazine
at irc.mozilla.org.
You can download nightly development builds from the the Mozilla FTP server.
Keep in mind that nightly builds, which are used by Mozilla developers for
testing, may be buggy. Firefox nightlies, for example, can be found at:
==============================================================
Getting Mozilla
==============================================================
You can download nightly builds of Mozilla from the
Mozilla.org FTP site at
ftp://ftp.mozilla.org/pub/mozilla.org/mozilla/nightly/
For the very latest builds, see
ftp://ftp.mozilla.org/pub/mozilla.org/mozilla/nightly/latest-trunk
Keep in mind that nightly builds, which are used by
Mozilla.org developers for testing, may be buggy. If you are
looking for a more polished version of Mozilla, Mozilla.org
releases Milestone builds of Mozilla every six weeks or so
that you can download from
http://www.mozilla.org/releases
Be sure to read the Mozilla release notes for information
on known problems and installation issues with Mozilla.
The release notes can be found at the preceding URL along
with the milestone releases themselves.
Note: Please use Talkback builds whenever possible. These
builds allow transmission of crash data back to Mozilla
developers, improved crash analysis, and posting of crash
information to our crash-data newsgroup.
==============================================================
System Requirements
==============================================================
*All Platforms
To view and use the new streamlined "Modern" theme,
your display monitor should be set to display
thousands of colors. For users who cannot set their
displays to use more than 256 colors, Mozilla.org
recommends using the "Classic" theme for Mozilla.
To select the Modern theme after you have installed
Mozilla, from the Navigator browser, open the View
menu, and then open then open the Apply Theme submenu
and choose Modern.
*Mac OS
-Mac OS X or later
-PowerPC processor (266 MHz or faster recommended)
-64 MB RAM
-36 MB of free hard disk space
*Windows
-Windows 95, 98, Me, NT4, 2000 or XP
-Intel Pentium class processor (233 MHz or faster
recommended)
-64 MB RAM
-26 MB free hard disk space
*Linux
-The following library versions (or compatible) are
required: glibc 2.1, XFree86 3.3.x, GTK 1.2.x, Glib
1.2.x, Libstdc++ 2.9.0. Red Hat Linux 6.0,
Debian 2.1, and SuSE 6.2 (or later) installations
should work.
-Red Hat 6.x users who want to install the Mozilla
RPM must have at least version 4.0.2 of rpm
installed.
-Intel Pentium class processor (233 MHz or faster
recommended)
-64MB RAM
-26MB free hard disk space
==============================================================
Installation Instructions
==============================================================
For Mac OS and Windows users, it is strongly recommended that
you exit all programs before running the setup program. Also,
you should temporarily disable virus-detection software.
For Linux users, note that the installation instructions use
the bash shell. If you're not using bash, adjust the commands
accordingly.
For all platforms, install into a clean (new) directory.
Installing on top of previously released builds may cause
problems.
Note: These instructions do not tell you how to build Mozilla.
For info on building the Mozilla source, see
http://www.mozilla.org/source.html
Windows Installation Instructions
---------------------------------
Note: For Windows NT/2000/XP systems, you need Administrator
privileges to install Mozilla. If you see an "Error 5" message
during installation, make sure you're running the installation
with Administrator privileges.
To install Mozilla by downloading the Mozilla installer,
follow these steps:
1. Click the the mozilla-win32-installer.exe link on
the site you're downloading Mozilla from to download
the installer file to your machine.
2. Navigate to where you downloaded the file and
double-click the Mozilla program icon on your machine
to begin the Setup program.
3. Follow the on-screen instructions in the setup
program. The program starts automatically the first
time.
To install Mozilla by downloading the .zip file and
installing manually, follow these steps:
1. Click the mozilla-win32-talkback.zip link or the
mozilla-win32.zip link on the site you're down-
loading Mozilla from to download the .zip file to
your machine.
2. Navigate to where you downloaded the file and
double-click the compressed file.
Note: This step assumes you already have a recent
version of WinZip installed, and that you know how to
use it. If not, you can get WinZip and information
about the program at www.winzip.com.
3. Extract the .zip file to a directory such as
C:\Program Files\mozilla.org\Mozilla.
4. To start Mozilla, navigate to the directory you
extracted Mozilla to and double-click the Mozilla.exe
icon.
Mac OS X Installation Instructions
----------------------------------
To install Mozilla by downloading the Mozilla disk image,
follow these steps:
1. Click the mozilla-mac-MachO.dmg.gz link to download
it to your machine. By default, the download file is
downloaded to your desktop.
2. Once you have downloaded the .dmg.gz file, drag it
onto Stuffit Expander to decompress it. If the disk
image doesn't mount automatically, double-click on the
.dmg file to mount it. If that fails, and the file
does not look like a disk image file, do a "Show Info"
on the file, and, in the "Open with application"
category, choose Disk Copy. In Mac OS 10.2, you can
use "Open with" from the context menu.
3. Once the disk image mounts, open it, and drag the
Mozilla icon onto your hard disk.
4. We recommend that you copy it to the Applications
folder.
5. Now Eject the disk image.
6. If you like, you can drag Mozilla to your dock to
have it easily accessible at all times. You might also
wish to select Mozilla as your default browser in the
Internet system preferences pane (under the Web tab).
Linux Installation Instructions
-------------------------------
Note: If you install in the default directory (which is
usually /usr/local/mozilla), or any other directory where
only the root user normally has write-access, you must
start Mozilla first as root before other users can start
the program. Doing so generates a set of files required
for later use by other users.
To install Mozilla by downloading the Mozilla installer,
follow these steps:
1. Create a directory named mozilla (mkdir mozilla)
and change to that directory (cd mozilla).
2. Click the link on the site you're downloading
Mozilla from to download the installer file
(called mozilla-1686-pc-linux-gnu-installer.tar.gz)
to your machine.
3. Change to the mozilla directory (cd mozilla) and
decompress the archive with the following command:
tar zxvf moz*.tar.gz
The installer is now located in a subdirectory of
Mozilla named mozilla-installer.
4. Change to the mozilla-installer directory
(cd mozilla-installer) and run the installer with the
./mozilla-installer command.
5. Follow the instructions in the install wizard for
installing Mozilla.
Note: If you have a slower machine, be aware that the
installation may take some time. In this case, the
installation progress may appear to hang indefinitely,
even though the installation is still in process.
6. To start Mozilla, change to the directory where you
installed it and run the ./mozilla command.
To install Mozilla by downloading the tar.gz file:
1. Create a directory named "mozilla" (mkdir mozilla)
and change to that directory (cd mozilla).
2. Click the link on the site you're downloading
Mozilla from to download the non-installer
(mozilla*.tar.gz) file into the mozilla directory.
3. Change to the mozilla directory (cd mozilla) and
decompress the file with the following command:
tar zxvf moz*.tar.gz
This creates a "mozilla" directory under your mozilla
directory.
4. Change to the mozilla directory (cd mozilla).
5. Run Mozilla with the following run script:
./mozilla
To hook up Mozilla complete with icon to the GNOME Panel,
follow these steps:
1. Click the GNOME Main Menu button, open the Panel menu,
and then open the Add to Panel submenu and choose Launcher.
2. Right-click the icon for Mozilla on the Panel and
enter the following command:
directory_name./mozilla
where directory_name is the name of the directory
you downloaded mozilla to. For example, the default
directory that Mozilla suggests is /usr/local/mozilla.
3. Type in a name for the icon, and type in a comment
if you wish.
4. Click the icon button and type in the following as
the icon's location:
directory_name/icons/mozicon50.xpm
where directory name is the directory where you
installed Mozilla. For example, the default directory
is /usr/local/mozilla/icons/mozicon50.xpm.
ftp://ftp.mozilla.org/pub/firefox/nightly/latest-trunk/

View File

@ -569,3 +569,17 @@ interface nsIAccessibleCaretMoveEvent: nsIAccessibleEvent
readonly attribute long caretOffset;
};
[scriptable, uuid(a9485c7b-5861-4695-8441-fab0235b205d)]
interface nsIAccessibleTableChangeEvent: nsIAccessibleEvent
{
/**
* Return the row or column index.
*/
readonly attribute long rowOrColIndex;
/**
* Return the number of rows or cols
*/
readonly attribute long numRowsOrCols;
};

View File

@ -52,6 +52,12 @@ interface nsIAccessibleProvider : nsISupports
* Constants set of common use.
*/
/** Do not create an accessible for this object
* This is useful if an ancestor binding already implements nsIAccessibleProvider,
* but no accessible is desired for the inheriting binding
*/
const long NoAccessible = 0;
/** For elements that spawn a new document. For example now it is used by
<xul:iframe>, <xul:browser> and <xul:editor>. */
const long OuterDoc = 0x00000001;
@ -78,32 +84,33 @@ interface nsIAccessibleProvider : nsISupports
const long XULMenuitem = 0x0000100E;
const long XULMenupopup = 0x0000100F;
const long XULMenuSeparator = 0x00001010;
const long XULProgressMeter = 0x00001011;
const long XULScale = 0x00001012;
const long XULStatusBar = 0x00001013;
const long XULRadioButton = 0x00001014;
const long XULRadioGroup = 0x00001015;
const long XULPane = 0x00001011;
const long XULProgressMeter = 0x00001012;
const long XULScale = 0x00001013;
const long XULStatusBar = 0x00001014;
const long XULRadioButton = 0x00001015;
const long XULRadioGroup = 0x00001016;
/** The single tab in a dialog or tabbrowser/editor interface */
const long XULTab = 0x00001016;
const long XULTab = 0x00001017;
/** A combination of a tabs object and a tabpanels object */
const long XULTabBox = 0x00001017;
const long XULTabBox = 0x00001018;
/** The collection of tab objects, useable in the TabBox and independant of
as well */
const long XULTabs = 0x00001018;
const long XULTabs = 0x00001019;
const long XULText = 0x00001019;
const long XULTextBox = 0x0000101A;
const long XULThumb = 0x0000101B;
const long XULTree = 0x0000101C;
const long XULTreeColumns = 0x0000101D;
const long XULTreeColumnItem = 0x0000101E;
const long XULToolbar = 0x0000101F;
const long XULToolbarSeparator = 0x00001020;
const long XULTooltip = 0x00001021;
const long XULToolbarButton = 0x00001022;
const long XULText = 0x0000101A;
const long XULTextBox = 0x0000101B;
const long XULThumb = 0x0000101C;
const long XULTree = 0x0000101D;
const long XULTreeColumns = 0x0000101E;
const long XULTreeColumnItem = 0x0000101F;
const long XULToolbar = 0x00001020;
const long XULToolbarSeparator = 0x00001021;
const long XULTooltip = 0x00001022;
const long XULToolbarButton = 0x00001023;
/**

View File

@ -110,9 +110,9 @@ interface nsIAccessibleRole : nsISupports
const unsigned long ROLE_WINDOW = 9;
/**
* XXX: document this.
* A sub-document (<frame> or <iframe>)
*/
const unsigned long ROLE_CLIENT = 10;
const unsigned long ROLE_INTERNAL_FRAME = 10;
/**
* Represents a menu, which presents a list of options from which the user can

View File

@ -45,7 +45,7 @@ interface nsIAccessibleEvent;
%}
[ptr] native nsRoleMapEntryPtr(nsRoleMapEntry);
[uuid(2d552ed0-3f38-4c7f-94c1-419de4d693ed)]
[uuid(893ee16d-c157-4d5f-b236-60b3b2bef6a5)]
interface nsPIAccessible : nsISupports
{
/**
@ -83,12 +83,10 @@ interface nsPIAccessible : nsISupports
*
* @param aEvent - DOM event
* @param aTarget - target of DOM event
* @param aData - additional information for accessible event.
*
* XXX: eventually this method will be removed (see bug 377022)
*/
void fireToolkitEvent(in unsigned long aEvent, in nsIAccessible aTarget,
in voidPtr aData);
void fireToolkitEvent(in unsigned long aEvent, in nsIAccessible aTarget);
/**
* Fire accessible event.

View File

@ -302,6 +302,7 @@ nsAccessibleWrap::nsAccessibleWrap(nsIDOMNode* aNode,
nsAccessibleWrap::~nsAccessibleWrap()
{
NS_ASSERTION(!mAtkObject, "ShutdownAtkObject() is not called");
#ifdef MAI_LOGGING
++mAccWrapDeleted;
@ -1114,9 +1115,6 @@ nsAccessibleWrap::FireAccessibleEvent(nsIAccessibleEvent *aEvent)
rv = aEvent->GetEventType(&type);
NS_ENSURE_SUCCESS(rv, rv);
nsAccEvent *event = reinterpret_cast<nsAccEvent*>(aEvent);
void *eventData = event->mEventData;
AtkObject *atkObj = nsAccessibleWrap::GetAtkObject(accessible);
// We don't create ATK objects for nsIAccessible plain text leaves,
@ -1135,8 +1133,6 @@ nsAccessibleWrap::FireAccessibleEvent(nsIAccessibleEvent *aEvent)
return NS_OK; // Node is shut down
}
AtkTableChange * pAtkTableChange = nsnull;
switch (type) {
case nsIAccessibleEvent::EVENT_STATE_CHANGE:
return FireAtkStateChangeEvent(aEvent, atkObj);
@ -1145,9 +1141,6 @@ nsAccessibleWrap::FireAccessibleEvent(nsIAccessibleEvent *aEvent)
case nsIAccessibleEvent::EVENT_TEXT_INSERTED:
return FireAtkTextChangedEvent(aEvent, atkObj);
case nsIAccessibleEvent::EVENT_PROPERTY_CHANGED:
return FireAtkPropChangedEvent(aEvent, atkObj);
case nsIAccessibleEvent::EVENT_FOCUS:
{
MAI_LOG_DEBUG(("\n\nReceived: EVENT_FOCUS\n"));
@ -1209,73 +1202,83 @@ nsAccessibleWrap::FireAccessibleEvent(nsIAccessibleEvent *aEvent)
break;
case nsIAccessibleEvent::EVENT_TABLE_ROW_INSERT:
{
MAI_LOG_DEBUG(("\n\nReceived: EVENT_TABLE_ROW_INSERT\n"));
NS_ASSERTION(eventData, "Event needs event data");
if (!eventData)
break;
nsCOMPtr<nsIAccessibleTableChangeEvent> tableEvent = do_QueryInterface(aEvent);
NS_ENSURE_TRUE(tableEvent, NS_ERROR_FAILURE);
pAtkTableChange = reinterpret_cast<AtkTableChange *>(eventData);
PRInt32 rowIndex, numRows;
tableEvent->GetRowOrColIndex(&rowIndex);
tableEvent->GetNumRowsOrCols(&numRows);
g_signal_emit_by_name(atkObj,
"row_inserted",
// After which the rows are inserted
pAtkTableChange->index,
rowIndex,
// The number of the inserted
pAtkTableChange->count);
break;
numRows);
} break;
case nsIAccessibleEvent::EVENT_TABLE_ROW_DELETE:
{
MAI_LOG_DEBUG(("\n\nReceived: EVENT_TABLE_ROW_DELETE\n"));
NS_ASSERTION(eventData, "Event needs event data");
if (!eventData)
break;
nsCOMPtr<nsIAccessibleTableChangeEvent> tableEvent = do_QueryInterface(aEvent);
NS_ENSURE_TRUE(tableEvent, NS_ERROR_FAILURE);
pAtkTableChange = reinterpret_cast<AtkTableChange *>(eventData);
PRInt32 rowIndex, numRows;
tableEvent->GetRowOrColIndex(&rowIndex);
tableEvent->GetNumRowsOrCols(&numRows);
g_signal_emit_by_name(atkObj,
"row_deleted",
// After which the rows are deleted
pAtkTableChange->index,
rowIndex,
// The number of the deleted
pAtkTableChange->count);
break;
numRows);
} break;
case nsIAccessibleEvent::EVENT_TABLE_ROW_REORDER:
{
MAI_LOG_DEBUG(("\n\nReceived: EVENT_TABLE_ROW_REORDER\n"));
g_signal_emit_by_name(atkObj, "row_reordered");
break;
}
case nsIAccessibleEvent::EVENT_TABLE_COLUMN_INSERT:
{
MAI_LOG_DEBUG(("\n\nReceived: EVENT_TABLE_COLUMN_INSERT\n"));
NS_ASSERTION(eventData, "Event needs event data");
if (!eventData)
break;
nsCOMPtr<nsIAccessibleTableChangeEvent> tableEvent = do_QueryInterface(aEvent);
NS_ENSURE_TRUE(tableEvent, NS_ERROR_FAILURE);
pAtkTableChange = reinterpret_cast<AtkTableChange *>(eventData);
PRInt32 colIndex, numCols;
tableEvent->GetRowOrColIndex(&colIndex);
tableEvent->GetNumRowsOrCols(&numCols);
g_signal_emit_by_name(atkObj,
"column_inserted",
// After which the columns are inserted
pAtkTableChange->index,
colIndex,
// The number of the inserted
pAtkTableChange->count);
break;
numCols);
} break;
case nsIAccessibleEvent::EVENT_TABLE_COLUMN_DELETE:
{
MAI_LOG_DEBUG(("\n\nReceived: EVENT_TABLE_COLUMN_DELETE\n"));
NS_ASSERTION(eventData, "Event needs event data");
if (!eventData)
break;
nsCOMPtr<nsIAccessibleTableChangeEvent> tableEvent = do_QueryInterface(aEvent);
NS_ENSURE_TRUE(tableEvent, NS_ERROR_FAILURE);
pAtkTableChange = reinterpret_cast<AtkTableChange *>(eventData);
PRInt32 colIndex, numCols;
tableEvent->GetRowOrColIndex(&colIndex);
tableEvent->GetNumRowsOrCols(&numCols);
g_signal_emit_by_name(atkObj,
"column_deleted",
// After which the columns are deleted
pAtkTableChange->index,
colIndex,
// The number of the deleted
pAtkTableChange->count);
break;
numCols);
} break;
case nsIAccessibleEvent::EVENT_TABLE_COLUMN_REORDER:
MAI_LOG_DEBUG(("\n\nReceived: EVENT_TABLE_COLUMN_REORDER\n"));
@ -1436,76 +1439,6 @@ nsAccessibleWrap::FireAtkTextChangedEvent(nsIAccessibleEvent *aEvent,
return NS_OK;
}
nsresult
nsAccessibleWrap::FireAtkPropChangedEvent(nsIAccessibleEvent *aEvent,
AtkObject *aObject)
{
MAI_LOG_DEBUG(("\n\nReceived: EVENT_PROPERTY_CHANGED\n"));
AtkPropertyChange *pAtkPropChange;
AtkPropertyValues values = { NULL };
nsAccessibleWrap *oldAccWrap = nsnull, *newAccWrap = nsnull;
nsAccEvent *event = reinterpret_cast<nsAccEvent*>(aEvent);
pAtkPropChange = reinterpret_cast<AtkPropertyChange *>(event->mEventData);
values.property_name = sAtkPropertyNameArray[pAtkPropChange->type];
NS_ASSERTION(pAtkPropChange, "Event needs event data");
if (!pAtkPropChange)
return NS_OK;
MAI_LOG_DEBUG(("\n\nthe type of EVENT_PROPERTY_CHANGED: %d\n\n",
pAtkPropChange->type));
switch (pAtkPropChange->type) {
case PROP_TABLE_CAPTION:
case PROP_TABLE_SUMMARY:
if (pAtkPropChange->oldvalue)
oldAccWrap = reinterpret_cast<nsAccessibleWrap *>
(pAtkPropChange->oldvalue);
if (pAtkPropChange->newvalue)
newAccWrap = reinterpret_cast<nsAccessibleWrap *>
(pAtkPropChange->newvalue);
if (oldAccWrap && newAccWrap) {
g_value_init(&values.old_value, G_TYPE_POINTER);
g_value_set_pointer(&values.old_value,
oldAccWrap->GetAtkObject());
g_value_init(&values.new_value, G_TYPE_POINTER);
g_value_set_pointer(&values.new_value,
newAccWrap->GetAtkObject());
}
break;
case PROP_TABLE_COLUMN_DESCRIPTION:
case PROP_TABLE_COLUMN_HEADER:
case PROP_TABLE_ROW_HEADER:
case PROP_TABLE_ROW_DESCRIPTION:
g_value_init(&values.new_value, G_TYPE_INT);
g_value_set_int(&values.new_value,
*reinterpret_cast<gint *>
(pAtkPropChange->newvalue));
break;
//Perhaps need more cases in the future
default:
g_value_init (&values.old_value, G_TYPE_POINTER);
g_value_set_pointer (&values.old_value, pAtkPropChange->oldvalue);
g_value_init (&values.new_value, G_TYPE_POINTER);
g_value_set_pointer (&values.new_value, pAtkPropChange->newvalue);
}
char *signal_name = g_strconcat("property_change::",
values.property_name, NULL);
g_signal_emit_by_name(aObject, signal_name, &values, NULL);
g_free (signal_name);
return NS_OK;
}
nsresult
nsAccessibleWrap::FireAtkShowHideEvent(nsIAccessibleEvent *aEvent,
AtkObject *aObject, PRBool aIsAdded)

View File

@ -56,7 +56,7 @@ static const PRUint32 atkRoleMap[] = {
ATK_ROLE_UNKNOWN, // nsIAccessibleRole::ROLE_CARET 7
ATK_ROLE_ALERT, // nsIAccessibleRole::ROLE_ALERT 8
ATK_ROLE_WINDOW, // nsIAccessibleRole::ROLE_WINDOW 9
ATK_ROLE_PANEL, // nsIAccessibleRole::ROLE_CLIENT 10
ATK_ROLE_INTERNAL_FRAME, // nsIAccessibleRole::ROLE_INTERNAL_FRAME 10
ATK_ROLE_MENU, // nsIAccessibleRole::ROLE_MENUPOPUP 11
ATK_ROLE_MENU_ITEM, // nsIAccessibleRole::ROLE_MENUITEM 12
ATK_ROLE_TOOL_TIP, // nsIAccessibleRole::ROLE_TOOLTIP 13

View File

@ -46,5 +46,11 @@ nsNativeRootAccessibleWrap::nsNativeRootAccessibleWrap(AtkObject *aAccessible):
nsRootAccessible(nsnull, nsnull)
{
g_object_ref(aAccessible);
nsAccessibleWrap::mAtkObject = aAccessible;
mAtkObject = aAccessible;
}
nsNativeRootAccessibleWrap::~nsNativeRootAccessibleWrap()
{
g_object_unref(mAtkObject);
mAtkObject = nsnull;
}

View File

@ -55,6 +55,7 @@ class nsNativeRootAccessibleWrap: public nsRootAccessible
{
public:
nsNativeRootAccessibleWrap(AtkObject *aAccessible);
~nsNativeRootAccessibleWrap();
};
#endif /* __NS_ROOT_ACCESSIBLE_WRAP_H__ */

View File

@ -82,6 +82,8 @@ ACCESSIBILITY_ATOM(textFrame, "TextFrame")
ACCESSIBILITY_ATOM(tableCaptionFrame, "TableCaptionFrame")
ACCESSIBILITY_ATOM(tableCellFrame, "TableCellFrame")
ACCESSIBILITY_ATOM(tableOuterFrame, "TableOuterFrame")
ACCESSIBILITY_ATOM(tableRowGroupFrame, "TableRowGroupFrame")
ACCESSIBILITY_ATOM(tableRowFrame, "TableRowFrame")
// Alphabetical list of tag names
ACCESSIBILITY_ATOM(a, "a")

View File

@ -1196,6 +1196,34 @@ nsresult nsAccessibilityService::InitAccessible(nsIAccessible *aAccessibleIn,
return rv;
}
static PRBool HasRelatedContent(nsIContent *aContent)
{
nsAutoString id;
if (!aContent || !nsAccUtils::GetID(aContent, id) || id.IsEmpty()) {
return PR_FALSE;
}
nsIAtom *relationAttrs[] = {nsAccessibilityAtoms::aria_labelledby,
nsAccessibilityAtoms::aria_describedby,
nsAccessibilityAtoms::aria_owns,
nsAccessibilityAtoms::aria_controls,
nsAccessibilityAtoms::aria_flowto};
if (nsAccUtils::FindNeighbourPointingToNode(aContent, relationAttrs, NS_ARRAY_LENGTH(relationAttrs))) {
return PR_TRUE;
}
nsIContent *ancestorContent = aContent;
nsAutoString activeID;
while ((ancestorContent = ancestorContent->GetParent()) != nsnull) {
if (ancestorContent->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::aria_activedescendant, activeID)) {
// ancestor has activedescendant property, this content could be active
return PR_TRUE;
}
}
return PR_FALSE;
}
NS_IMETHODIMP nsAccessibilityService::GetAccessible(nsIDOMNode *aNode,
nsIPresShell *aPresShell,
nsIWeakReference *aWeakShell,
@ -1395,41 +1423,36 @@ NS_IMETHODIMP nsAccessibilityService::GetAccessible(nsIDOMNode *aNode,
if (!content->IsFocusable()) {
// If we're in unfocusable table-related subcontent, check for the
// Presentation role on the containing table
nsIAtom *tag = content->Tag();
if (tag == nsAccessibilityAtoms::td ||
tag == nsAccessibilityAtoms::th ||
tag == nsAccessibilityAtoms::tr ||
tag == nsAccessibilityAtoms::tbody ||
tag == nsAccessibilityAtoms::tfoot ||
tag == nsAccessibilityAtoms::thead) {
if (frame->GetType() == nsAccessibilityAtoms::tableCaptionFrame ||
frame->GetType() == nsAccessibilityAtoms::tableCellFrame ||
frame->GetType() == nsAccessibilityAtoms::tableRowGroupFrame ||
frame->GetType() == nsAccessibilityAtoms::tableRowFrame) {
nsIContent *tableContent = content;
nsAutoString tableRole;
while ((tableContent = tableContent->GetParent()) != nsnull) {
if (tableContent->Tag() == nsAccessibilityAtoms::table) {
// Table that we're a descendant of is not styled as a table,
// and has no table accessible for an ancestor, or
// table that we're a descendant of is presentational
nsIFrame *tableFrame = aPresShell->GetPrimaryFrameFor(tableContent);
if (tableFrame &&
tableFrame->GetType() == nsAccessibilityAtoms::tableOuterFrame) {
nsCOMPtr<nsIDOMNode> tableNode(do_QueryInterface(tableContent));
if (tableNode) {
nsRoleMapEntry *tableRoleMapEntry =
nsAccUtils::GetRoleMapEntry(tableNode);
if (tableRoleMapEntry &&
tableRoleMapEntry != &nsARIAMap::gLandmarkRoleMap) {
tableRoleMapEntry != &nsARIAMap::gLandmarkRoleMap)
tryTagNameOrFrame = PR_FALSE;
break;
}
}
nsIFrame *tableFrame =
aPresShell->GetPrimaryFrameFor(tableContent);
if (!tableFrame ||
tableFrame->GetType() != nsAccessibilityAtoms::tableOuterFrame) {
tryTagNameOrFrame = PR_FALSE;
}
break;
}
if (tableContent->Tag() == nsAccessibilityAtoms::table) {
tryTagNameOrFrame = PR_FALSE;
break;
}
}
if (!tableContent)
tryTagNameOrFrame = PR_FALSE;
}
}
@ -1473,7 +1496,8 @@ NS_IMETHODIMP nsAccessibilityService::GetAccessible(nsIDOMNode *aNode,
if (!newAcc && content->Tag() != nsAccessibilityAtoms::body && content->GetParent() &&
(content->IsFocusable() ||
(isHTML && nsAccUtils::HasListener(content, NS_LITERAL_STRING("click"))) ||
HasUniversalAriaProperty(content, aWeakShell) || roleMapEntry)) {
HasUniversalAriaProperty(content, aWeakShell) || roleMapEntry) ||
HasRelatedContent(content)) {
// This content is focusable or has an interesting dynamic content accessibility property.
// If it's interesting we need it in the accessibility hierarchy so that events or
// other accessibles can point to it, or so that it can hold a state, etc.
@ -1606,6 +1630,8 @@ nsresult nsAccessibilityService::GetAccessibleByType(nsIDOMNode *aNode,
switch (type)
{
#ifdef MOZ_XUL
case nsIAccessibleProvider::NoAccessible:
return NS_OK;
// XUL controls
case nsIAccessibleProvider::XULAlert:
*aAccessible = new nsXULAlertAccessible(aNode, weakShell);
@ -1690,6 +1716,9 @@ nsresult nsAccessibilityService::GetAccessibleByType(nsIDOMNode *aNode,
case nsIAccessibleProvider::XULMenuSeparator:
*aAccessible = new nsXULMenuSeparatorAccessible(aNode, weakShell);
break;
case nsIAccessibleProvider::XULPane:
*aAccessible = new nsEnumRoleAccessible(aNode, weakShell, nsIAccessibleRole::ROLE_PANE);
break;
case nsIAccessibleProvider::XULProgressMeter:
*aAccessible = new nsXULProgressMeterAccessible(aNode, weakShell);
break;

View File

@ -152,7 +152,7 @@ static const char kRoleNames[][20] = {
"caret", //ROLE_CARET
"alert", //ROLE_ALERT
"window", //ROLE_WINDOW
"client", //ROLE_CLIENT
"internal frame", //ROLE_INTERNAL_FRAME
"menupopup", //ROLE_MENUPOPUP
"menuitem", //ROLE_MENUITEM
"tooltip", //ROLE_TOOLTIP

View File

@ -257,7 +257,7 @@ nsAccUtils::FireAccEvent(PRUint32 aEventType, nsIAccessible *aAccessible,
NS_ASSERTION(pAccessible, "Accessible doesn't implement nsPIAccessible");
nsCOMPtr<nsIAccessibleEvent> event =
new nsAccEvent(aEventType, aAccessible, nsnull, aIsAsynch);
new nsAccEvent(aEventType, aAccessible, aIsAsynch);
NS_ENSURE_TRUE(event, NS_ERROR_OUT_OF_MEMORY);
return pAccessible->FireAccessibleEvent(event);
@ -586,6 +586,16 @@ nsAccUtils::FindNeighbourPointingToNode(nsIContent *aForNode,
nsIAtom *aRelationAttr,
nsIAtom *aTagName,
PRUint32 aAncestorLevelsToSearch)
{
return FindNeighbourPointingToNode(aForNode, &aRelationAttr, 1, aTagName, aAncestorLevelsToSearch);
}
nsIContent*
nsAccUtils::FindNeighbourPointingToNode(nsIContent *aForNode,
nsIAtom **aRelationAttrs,
PRUint32 aAttrNum,
nsIAtom *aTagName,
PRUint32 aAncestorLevelsToSearch)
{
nsCOMPtr<nsIContent> binding;
nsAutoString controlID;
@ -638,14 +648,16 @@ nsAccUtils::FindNeighbourPointingToNode(nsIContent *aForNode,
if (content != prevSearched) {
labelContent = FindDescendantPointingToID(&controlID, content,
aRelationAttr, nsnull, aTagName);
aRelationAttrs, aAttrNum,
nsnull, aTagName);
}
}
break;
}
labelContent = FindDescendantPointingToID(&controlID, aForNode,
aRelationAttr, prevSearched, aTagName);
aRelationAttrs, aAttrNum,
prevSearched, aTagName);
prevSearched = aForNode;
}
@ -656,7 +668,8 @@ nsAccUtils::FindNeighbourPointingToNode(nsIContent *aForNode,
nsIContent*
nsAccUtils::FindDescendantPointingToID(const nsString *aId,
nsIContent *aLookContent,
nsIAtom *aRelationAttr,
nsIAtom **aRelationAttrs,
PRUint32 aAttrNum,
nsIContent *aExcludeContent,
nsIAtom *aTagType)
{
@ -665,31 +678,45 @@ nsAccUtils::FindDescendantPointingToID(const nsString *aId,
LossyAppendUTF16toASCII(*aId, idWithSpaces);
idWithSpaces += ' ';
return FindDescendantPointingToIDImpl(idWithSpaces, aLookContent,
aRelationAttr, aExcludeContent, aTagType);
aRelationAttrs, aAttrNum,
aExcludeContent, aTagType);
}
nsIContent*
nsAccUtils::FindDescendantPointingToID(const nsString *aId,
nsIContent *aLookContent,
nsIAtom *aRelationAttr,
nsIContent *aExcludeContent,
nsIAtom *aTagType)
{
return FindDescendantPointingToID(aId, aLookContent, &aRelationAttr, 1, aExcludeContent, aTagType);
}
nsIContent*
nsAccUtils::FindDescendantPointingToIDImpl(nsCString& aIdWithSpaces,
nsIContent *aLookContent,
nsIAtom *aRelationAttr,
nsIAtom **aRelationAttrs,
PRUint32 aAttrNum,
nsIContent *aExcludeContent,
nsIAtom *aTagType)
{
NS_ENSURE_TRUE(aLookContent, nsnull);
NS_ENSURE_TRUE(aRelationAttr, nsnull);
NS_ENSURE_TRUE(aRelationAttrs && *aRelationAttrs, nsnull);
if (!aTagType || aLookContent->Tag() == aTagType) {
// Tag matches
// Check for ID in the attribute aRelationAttr, which can be a list
nsAutoString idList;
if (aLookContent->GetAttr(kNameSpaceID_None, aRelationAttr, idList)) {
idList.Insert(' ', 0); // Surround idlist with spaces for search
idList.Append(' ');
// idList is now a set of id's with spaces around each,
// and id also has spaces around it.
// If id is a substring of idList then we have a match
if (idList.Find(aIdWithSpaces) != -1) {
return aLookContent;
// Check for ID in the attributes aRelationAttrs, which can be a list
for (PRUint32 i = 0; i < aAttrNum; i++) {
nsAutoString idList;
if (aLookContent->GetAttr(kNameSpaceID_None, aRelationAttrs[i], idList)) {
idList.Insert(' ', 0); // Surround idlist with spaces for search
idList.Append(' ');
// idList is now a set of id's with spaces around each,
// and id also has spaces around it.
// If id is a substring of idList then we have a match
if (idList.Find(aIdWithSpaces) != -1) {
return aLookContent;
}
}
}
if (aTagType) {
@ -707,7 +734,8 @@ nsAccUtils::FindDescendantPointingToIDImpl(nsCString& aIdWithSpaces,
while ((child = aLookContent->GetChildAt(count++)) != nsnull) {
if (child != aExcludeContent) {
labelContent = FindDescendantPointingToIDImpl(aIdWithSpaces, child,
aRelationAttr, aExcludeContent, aTagType);
aRelationAttrs, aAttrNum,
aExcludeContent, aTagType);
if (labelContent) {
return labelContent;
}

View File

@ -277,13 +277,25 @@ public:
* attribute value that equals to ID attribute of the given element.
* ID attribute can be either 'id' attribute or 'anonid' if the element is
* anonymous.
* The first matched content will be returned.
*
* @param aForNode - the given element the search is performed for
* @param aRelationAttr - attribute name of searched element, ignored if aAriaProperty passed in
* @param aRelationAttrs - an array of attributes, element is attribute name of searched element, ignored if aAriaProperty passed in
* @param aAttrNum - how many attributes in aRelationAttrs
* @param aTagName - tag name of searched element, or nsnull for any -- ignored if aAriaProperty passed in
* @param aAncestorLevelsToSearch - points how is the neighborhood of the
* given element big.
*/
static nsIContent *FindNeighbourPointingToNode(nsIContent *aForNode,
nsIAtom **aRelationAttrs,
PRUint32 aAttrNum,
nsIAtom *aTagName = nsnull,
PRUint32 aAncestorLevelsToSearch = 5);
/**
* Overloaded version of FindNeighbourPointingToNode to accept only one
* relation attribute.
*/
static nsIContent *FindNeighbourPointingToNode(nsIContent *aForNode,
nsIAtom *aRelationAttr,
nsIAtom *aTagName = nsnull,
@ -293,15 +305,28 @@ public:
* Search for element that satisfies the requirements in subtree of the given
* element. The requirements are tag name, attribute name and value of
* attribute.
* The first matched content will be returned.
*
* @param aId - value of searched attribute
* @param aLookContent - element that search is performed inside
* @param aRelationAttr - searched attribute
* @param if both aAriaProperty and aRelationAttr are null, then any element with aTagType will do
* @param aRelationAttrs - an array of searched attributes
* @param aAttrNum - how many attributes in aRelationAttrs
* @param if both aAriaProperty and aRelationAttrs are null, then any element with aTagType will do
* @param aExcludeContent - element that is skiped for search
* @param aTagType - tag name of searched element, by default it is 'label' --
* ignored if aAriaProperty passed in
*/
static nsIContent *FindDescendantPointingToID(const nsString *aId,
nsIContent *aLookContent,
nsIAtom **aRelationAttrs,
PRUint32 aAttrNum = 1,
nsIContent *aExcludeContent = nsnull,
nsIAtom *aTagType = nsAccessibilityAtoms::label);
/**
* Overloaded version of FindDescendantPointingToID to accept only one
* relation attribute.
*/
static nsIContent *FindDescendantPointingToID(const nsString *aId,
nsIContent *aLookContent,
nsIAtom *aRelationAttr,
@ -311,7 +336,8 @@ public:
// Helper for FindDescendantPointingToID(), same args
static nsIContent *FindDescendantPointingToIDImpl(nsCString& aIdWithSpaces,
nsIContent *aLookContent,
nsIAtom *aRelationAttrs,
nsIAtom **aRelationAttrs,
PRUint32 aAttrNum = 1,
nsIContent *aExcludeContent = nsnull,
nsIAtom *aTagType = nsAccessibilityAtoms::label);
};

View File

@ -829,7 +829,7 @@ NS_IMETHODIMP nsAccessible::TestChildCache(nsIAccessible *aCachedChild)
// It will assert if not all the children were created
// when they were first cached, and no invalidation
// ever corrected parent accessible's child cache.
if (mAccChildCount == eChildCountUninitialized) {
if (mAccChildCount <= 0) {
return NS_OK;
}
nsCOMPtr<nsIAccessible> sibling = mFirstChild;
@ -1909,15 +1909,14 @@ PRBool nsAccessible::IsNodeRelevant(nsIDOMNode *aNode)
}
NS_IMETHODIMP
nsAccessible::FireToolkitEvent(PRUint32 aEvent, nsIAccessible *aTarget,
void * aData)
nsAccessible::FireToolkitEvent(PRUint32 aEvent, nsIAccessible *aTarget)
{
// Don't fire event for accessible that has been shut down.
if (!mWeakShell)
return NS_ERROR_FAILURE;
nsCOMPtr<nsIAccessibleEvent> accEvent =
new nsAccEvent(aEvent, aTarget, aData);
new nsAccEvent(aEvent, aTarget);
NS_ENSURE_TRUE(accEvent, NS_ERROR_OUT_OF_MEMORY);
return FireAccessibleEvent(accEvent);
@ -1964,7 +1963,7 @@ NS_IMETHODIMP nsAccessible::GetFinalRole(PRUint32 *aRole)
// For simplicity, any pressed attribute indicates it's a toggle button
*aRole = nsIAccessibleRole::ROLE_TOGGLE_BUTTON;
}
else if (content->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::aria_secret,
else if (content->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::aria_haspopup,
nsAccessibilityAtoms::_true, eCaseMatters)) {
// For button with aria-haspopup="true"
*aRole = nsIAccessibleRole::ROLE_BUTTONMENU;

View File

@ -60,15 +60,15 @@ nsIDOMNode* nsAccEvent::gLastEventNodeWeak = 0;
NS_IMPL_ISUPPORTS1(nsAccEvent, nsIAccessibleEvent)
nsAccEvent::nsAccEvent(PRUint32 aEventType, nsIAccessible *aAccessible,
void *aEventData, PRBool aIsAsynch):
mEventType(aEventType), mAccessible(aAccessible), mEventData(aEventData)
PRBool aIsAsynch):
mEventType(aEventType), mAccessible(aAccessible)
{
CaptureIsFromUserInput(aIsAsynch);
}
nsAccEvent::nsAccEvent(PRUint32 aEventType, nsIDOMNode *aDOMNode,
void *aEventData, PRBool aIsAsynch):
mEventType(aEventType), mDOMNode(aDOMNode), mEventData(aEventData)
PRBool aIsAsynch):
mEventType(aEventType), mDOMNode(aDOMNode)
{
CaptureIsFromUserInput(aIsAsynch);
}
@ -274,7 +274,7 @@ nsAccStateChangeEvent::
nsAccStateChangeEvent(nsIAccessible *aAccessible,
PRUint32 aState, PRBool aIsExtraState,
PRBool aIsEnabled):
nsAccEvent(::nsIAccessibleEvent::EVENT_STATE_CHANGE, aAccessible, nsnull),
nsAccEvent(::nsIAccessibleEvent::EVENT_STATE_CHANGE, aAccessible),
mState(aState), mIsExtraState(aIsExtraState), mIsEnabled(aIsEnabled)
{
}
@ -283,7 +283,7 @@ nsAccStateChangeEvent::
nsAccStateChangeEvent(nsIDOMNode *aNode,
PRUint32 aState, PRBool aIsExtraState,
PRBool aIsEnabled):
nsAccEvent(::nsIAccessibleEvent::EVENT_STATE_CHANGE, aNode, nsnull),
nsAccEvent(::nsIAccessibleEvent::EVENT_STATE_CHANGE, aNode),
mState(aState), mIsExtraState(aIsExtraState), mIsEnabled(aIsEnabled)
{
}
@ -291,7 +291,7 @@ nsAccStateChangeEvent::
nsAccStateChangeEvent::
nsAccStateChangeEvent(nsIDOMNode *aNode,
PRUint32 aState, PRBool aIsExtraState):
nsAccEvent(::nsIAccessibleEvent::EVENT_STATE_CHANGE, aNode, nsnull),
nsAccEvent(::nsIAccessibleEvent::EVENT_STATE_CHANGE, aNode),
mState(aState), mIsExtraState(aIsExtraState)
{
// Use GetAccessibleByNode() because we do not want to store an accessible
@ -337,7 +337,7 @@ nsAccTextChangeEvent::
nsAccTextChangeEvent(nsIAccessible *aAccessible,
PRInt32 aStart, PRUint32 aLength, PRBool aIsInserted, PRBool aIsAsynch):
nsAccEvent(aIsInserted ? nsIAccessibleEvent::EVENT_TEXT_INSERTED : nsIAccessibleEvent::EVENT_TEXT_REMOVED,
aAccessible, nsnull, aIsAsynch),
aAccessible, aIsAsynch),
mStart(aStart), mLength(aLength), mIsInserted(aIsInserted)
{
nsCOMPtr<nsIAccessibleText> textAccessible = do_QueryInterface(aAccessible);
@ -381,14 +381,14 @@ NS_IMPL_ISUPPORTS_INHERITED1(nsAccCaretMoveEvent, nsAccEvent,
nsAccCaretMoveEvent::
nsAccCaretMoveEvent(nsIAccessible *aAccessible, PRInt32 aCaretOffset) :
nsAccEvent(::nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED, aAccessible, nsnull, PR_TRUE), // Currently always asynch
nsAccEvent(::nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED, aAccessible, PR_TRUE), // Currently always asynch
mCaretOffset(aCaretOffset)
{
}
nsAccCaretMoveEvent::
nsAccCaretMoveEvent(nsIDOMNode *aNode) :
nsAccEvent(::nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED, aNode, nsnull, PR_TRUE), // Currently always asynch
nsAccEvent(::nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED, aNode, PR_TRUE), // Currently always asynch
mCaretOffset(-1)
{
}
@ -402,3 +402,33 @@ nsAccCaretMoveEvent::GetCaretOffset(PRInt32* aCaretOffset)
return NS_OK;
}
// nsAccTableChangeEvent
NS_IMPL_ISUPPORTS_INHERITED1(nsAccTableChangeEvent, nsAccEvent,
nsIAccessibleTableChangeEvent)
nsAccTableChangeEvent::
nsAccTableChangeEvent(nsIAccessible *aAccessible, PRUint32 aEventType,
PRInt32 aRowOrColIndex, PRInt32 aNumRowsOrCols, PRBool aIsAsynch):
nsAccEvent(aEventType, aAccessible, aIsAsynch),
mRowOrColIndex(aRowOrColIndex), mNumRowsOrCols(aNumRowsOrCols)
{
}
NS_IMETHODIMP
nsAccTableChangeEvent::GetRowOrColIndex(PRInt32* aRowOrColIndex)
{
NS_ENSURE_ARG_POINTER(aRowOrColIndex);
*aRowOrColIndex = mRowOrColIndex;
return NS_OK;
}
NS_IMETHODIMP
nsAccTableChangeEvent::GetNumRowsOrCols(PRInt32* aNumRowsOrCols)
{
NS_ENSURE_ARG_POINTER(aNumRowsOrCols);
*aNumRowsOrCols = mNumRowsOrCols;
return NS_OK;
}

View File

@ -54,16 +54,16 @@ class nsAccEvent: public nsIAccessibleEvent
{
public:
// Initialize with an nsIAccessible
nsAccEvent(PRUint32 aEventType, nsIAccessible *aAccessible, void *aEventData, PRBool aIsAsynch = PR_FALSE);
nsAccEvent(PRUint32 aEventType, nsIAccessible *aAccessible, PRBool aIsAsynch = PR_FALSE);
// Initialize with an nsIDOMNode
nsAccEvent(PRUint32 aEventType, nsIDOMNode *aDOMNode, void *aEventData, PRBool aIsAsynch = PR_FALSE);
nsAccEvent(PRUint32 aEventType, nsIDOMNode *aDOMNode, PRBool aIsAsynch = PR_FALSE);
virtual ~nsAccEvent() {}
NS_DECL_ISUPPORTS
NS_DECL_NSIACCESSIBLEEVENT
static void GetLastEventAttributes(nsIDOMNode *aNode,
nsIPersistentProperties *aAttributes);
nsIPersistentProperties *aAttributes);
protected:
already_AddRefed<nsIAccessible> GetAccessibleByNode();
@ -96,8 +96,6 @@ public:
* was waiting in an event queue
*/
static void PrepareForEvent(nsIAccessibleEvent *aEvent);
void *mEventData;
};
class nsAccStateChangeEvent: public nsAccEvent,
@ -158,12 +156,20 @@ private:
PRInt32 mCaretOffset;
};
// XXX todo: We might want to use XPCOM interfaces instead of struct
// e.g., nsAccessibleTableChangeEvent: public nsIAccessibleTableChangeEvent
class nsAccTableChangeEvent : public nsAccEvent,
public nsIAccessibleTableChangeEvent {
public:
nsAccTableChangeEvent(nsIAccessible *aAccessible, PRUint32 aEventType,
PRInt32 aRowOrColIndex, PRInt32 aNumRowsOrCols,
PRBool aIsAsynch);
struct AtkTableChange {
PRUint32 index; // the start row/column after which the rows are inserted/deleted.
PRUint32 count; // the number of inserted/deleted rows/columns
NS_DECL_ISUPPORTS
NS_FORWARD_NSIACCESSIBLEEVENT(nsAccEvent::)
NS_DECL_NSIACCESSIBLETABLECHANGEEVENT
private:
PRUint32 mRowOrColIndex; // the start row/column after which the rows are inserted/deleted.
PRUint32 mNumRowsOrCols; // the number of inserted/deleted rows/columns
};
#endif

View File

@ -146,13 +146,18 @@ nsLinkableAccessible::GetState(PRUint32 *aState, PRUint32 *aExtraState)
return NS_OK;
}
NS_IMETHODIMP nsLinkableAccessible::GetValue(nsAString& _retval)
NS_IMETHODIMP nsLinkableAccessible::GetValue(nsAString& aValue)
{
aValue.Truncate();
nsHyperTextAccessible::GetValue(aValue);
if (!aValue.IsEmpty())
return NS_OK;
if (mIsLink) {
nsCOMPtr<nsIDOMNode> linkNode(do_QueryInterface(mActionContent));
nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(mWeakShell));
if (linkNode && presShell)
return presShell->GetLinkLocation(linkNode, _retval);
return presShell->GetLinkLocation(linkNode, aValue);
}
return NS_ERROR_NOT_IMPLEMENTED;
}

View File

@ -88,6 +88,10 @@ nsresult nsCaretAccessible::ClearControlSelectionListener()
nsresult nsCaretAccessible::SetControlSelectionListener(nsIDOMNode *aCurrentNode)
{
NS_ENSURE_TRUE(mRootAccessible, NS_ERROR_FAILURE);
ClearControlSelectionListener();
mCurrentControl = aCurrentNode;
mLastTextAccessible = nsnull;
@ -121,7 +125,6 @@ nsresult nsCaretAccessible::SetControlSelectionListener(nsIDOMNode *aCurrentNode
nsCOMPtr<nsISelection> domSel;
selCon->GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(domSel));
ClearControlSelectionListener();
nsCOMPtr<nsISelectionPrivate> selPrivate(do_QueryInterface(domSel));
NS_ENSURE_TRUE(selPrivate, NS_ERROR_FAILURE);
@ -131,6 +134,8 @@ nsresult nsCaretAccessible::SetControlSelectionListener(nsIDOMNode *aCurrentNode
nsresult nsCaretAccessible::AddDocSelectionListener(nsIDOMDocument *aDoc)
{
NS_ENSURE_TRUE(mRootAccessible, NS_ERROR_FAILURE);
nsCOMPtr<nsIDocument> doc = do_QueryInterface(aDoc);
NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE);
nsCOMPtr<nsISelectionController> selCon = do_QueryInterface(doc->GetPrimaryShell());
@ -171,7 +176,7 @@ NS_IMETHODIMP nsCaretAccessible::NotifySelectionChanged(nsIDOMDocument *aDoc, ns
nsIPresShell *presShell = doc->GetPrimaryShell();
NS_ENSURE_TRUE(presShell, NS_OK);
// Get first nnsIAccessibleText in parent chain and fire caret-move, selection-change event for it
// Get first nsIAccessibleText in parent chain and fire caret-move, selection-change event for it
nsCOMPtr<nsIAccessible> accessible;
nsIAccessibilityService *accService = mRootAccessible->GetAccService();
NS_ENSURE_TRUE(accService, NS_ERROR_FAILURE);
@ -248,6 +253,7 @@ nsCaretAccessible::GetCaretRect(nsIWidget **aOutWidget)
nsRect caretRect;
NS_ENSURE_TRUE(aOutWidget, caretRect);
*aOutWidget = nsnull;
NS_ENSURE_TRUE(mRootAccessible, caretRect);
if (!mLastTextAccessible) {
return caretRect; // Return empty rect

View File

@ -691,6 +691,7 @@ nsresult nsDocAccessible::RemoveEventListeners()
if (mScrollWatchTimer) {
mScrollWatchTimer->Cancel();
mScrollWatchTimer = nsnull;
NS_RELEASE_THIS(); // Kung fu death grip
}
nsRefPtr<nsRootAccessible> rootAccessible(GetRootAccessible());
@ -827,6 +828,7 @@ void nsDocAccessible::ScrollTimerCallback(nsITimer *aTimer, void *aClosure)
if (docAcc->mScrollWatchTimer) {
docAcc->mScrollWatchTimer->Cancel();
docAcc->mScrollWatchTimer = nsnull;
NS_RELEASE(docAcc); // Release kung fu death grip
}
}
}
@ -879,6 +881,7 @@ NS_IMETHODIMP nsDocAccessible::ScrollPositionDidChange(nsIScrollableView *aScrol
else {
mScrollWatchTimer = do_CreateInstance("@mozilla.org/timer;1");
if (mScrollWatchTimer) {
NS_ADDREF_THIS(); // Kung fu death grip
mScrollWatchTimer->InitWithFuncCallback(ScrollTimerCallback, this,
kScrollPosCheckWait,
nsITimer::TYPE_REPEATING_SLACK);
@ -1030,19 +1033,19 @@ nsDocAccessible::AttributeChangedImpl(nsIContent* aContent, PRInt32 aNameSpaceID
multiSelectAccessNode->GetDOMNode(getter_AddRefs(multiSelectDOMNode));
NS_ASSERTION(multiSelectDOMNode, "A new accessible without a DOM node!");
FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_SELECTION_WITHIN,
multiSelectDOMNode, nsnull, eAllowDupes);
multiSelectDOMNode, eAllowDupes);
static nsIContent::AttrValuesArray strings[] =
{&nsAccessibilityAtoms::_empty, &nsAccessibilityAtoms::_false, nsnull};
if (aContent->FindAttrValueIn(kNameSpaceID_None, aAttribute,
strings, eCaseMatters) >= 0) {
FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_SELECTION_REMOVE,
targetNode, nsnull);
targetNode);
return;
}
FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_SELECTION_ADD,
targetNode, nsnull);
targetNode);
}
}
@ -1152,7 +1155,7 @@ nsDocAccessible::ARIAAttributeChanged(nsIContent* aContent, nsIAtom* aAttribute)
if (aAttribute == nsAccessibilityAtoms::aria_valuenow) {
FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_VALUE_CHANGE,
targetNode, nsnull);
targetNode);
return;
}
@ -1381,12 +1384,11 @@ nsDocAccessible::CreateTextChangeEventForNode(nsIAccessible *aContainerAccessibl
nsresult nsDocAccessible::FireDelayedToolkitEvent(PRUint32 aEvent,
nsIDOMNode *aDOMNode,
void *aData,
EDupeEventRule aAllowDupes,
PRBool aIsAsynch)
{
nsCOMPtr<nsIAccessibleEvent> event =
new nsAccEvent(aEvent, aDOMNode, aData, PR_TRUE);
new nsAccEvent(aEvent, aDOMNode, PR_TRUE);
NS_ENSURE_TRUE(event, NS_ERROR_OUT_OF_MEMORY);
return FireDelayedAccessibleEvent(event, aAllowDupes, aIsAsynch);
@ -1622,14 +1624,30 @@ void nsDocAccessible::FlushEventsCallback(nsITimer *aTimer, void *aClosure)
void nsDocAccessible::RefreshNodes(nsIDOMNode *aStartNode)
{
if (mAccessNodeCache.Count() <= 1) {
return; // All we have is a doc accessible. There is nothing to invalidate, quit early
}
nsCOMPtr<nsIAccessNode> accessNode;
GetCachedAccessNode(aStartNode, getter_AddRefs(accessNode));
nsCOMPtr<nsIDOMNode> nextNode, iterNode;
// Shut down accessible subtree, which may have been created for
// anonymous content subtree
nsCOMPtr<nsIAccessible> accessible(do_QueryInterface(accessNode));
if (accessible) {
// Fire menupopup end if a menu goes away
PRUint32 role = Role(accessible);
if (role == nsIAccessibleRole::ROLE_MENUPOPUP) {
nsCOMPtr<nsIDOMNode> domNode;
accessNode->GetDOMNode(getter_AddRefs(domNode));
nsCOMPtr<nsIDOMXULPopupElement> popup(do_QueryInterface(domNode));
if (!popup) {
// Popup elements already fire these via DOMMenuInactive
// handling in nsRootAccessible::HandleEvent
nsAccUtils::FireAccEvent(nsIAccessibleEvent::EVENT_MENUPOPUP_END,
accessible);
}
}
nsCOMPtr<nsPIAccessible> privateAccessible = do_QueryInterface(accessible);
NS_ASSERTION(privateAccessible, "No nsPIAccessible for nsIAccessible");
@ -1645,55 +1663,54 @@ void nsDocAccessible::RefreshNodes(nsIDOMNode *aStartNode)
PRUint32 childCount;
children->GetLength(&childCount);
nsCOMPtr<nsIDOMNode> possibleAnonNode;
for (PRUint32 index = 0; index < childCount; index++) {
nsCOMPtr<nsIAccessNode> childAccessNode;
children->QueryElementAt(index, NS_GET_IID(nsIAccessNode),
getter_AddRefs(childAccessNode));
childAccessNode->GetDOMNode(getter_AddRefs(iterNode));
nsCOMPtr<nsIContent> iterContent = do_QueryInterface(iterNode);
childAccessNode->GetDOMNode(getter_AddRefs(possibleAnonNode));
nsCOMPtr<nsIContent> iterContent = do_QueryInterface(possibleAnonNode);
if (iterContent && (iterContent->IsNativeAnonymous() ||
iterContent->GetBindingParent())) {
// GetBindingParent() check is a perf win -- make sure we don't
// shut down the same subtree twice since we'll reach non-anon content via
// DOM traversal later in this method
RefreshNodes(iterNode);
RefreshNodes(possibleAnonNode);
}
}
}
// Shutdown ordinary content subtree as well -- there may be
// access node children which are not full accessible objects
aStartNode->GetFirstChild(getter_AddRefs(nextNode));
while (nextNode) {
nextNode.swap(iterNode);
RefreshNodes(iterNode);
iterNode->GetNextSibling(getter_AddRefs(nextNode));
}
// Don't shutdown our doc object!
if (accessNode && accessNode != static_cast<nsIAccessNode*>(this)) {
// Fire menupopup end if a menu goes away
PRUint32 role = Role(accessible);
if (role == nsIAccessibleRole::ROLE_MENUPOPUP) {
nsCOMPtr<nsIDOMNode> domNode;
accessNode->GetDOMNode(getter_AddRefs(domNode));
nsCOMPtr<nsIDOMXULPopupElement> popup(do_QueryInterface(domNode));
if (!popup) {
// Popup elements already fire these via DOMMenuInactive
// handling in nsRootAccessible::HandleEvent
nsAccUtils::FireAccEvent(nsIAccessibleEvent::EVENT_MENUPOPUP_END,
accessible);
}
}
// Shut down the actual accessible or access node
void *uniqueID;
accessNode->GetUniqueID(&uniqueID);
nsCOMPtr<nsPIAccessNode> privateAccessNode(do_QueryInterface(accessNode));
privateAccessNode->Shutdown();
// Remove from hash table as well
mAccessNodeCache.Remove(uniqueID);
}
}
// Shutdown ordinary content subtree as well -- there may be
// access node children which are not full accessible objects
nsCOMPtr<nsIDOMNode> nextNode, iterNode;
aStartNode->GetFirstChild(getter_AddRefs(nextNode));
while (nextNode) {
nextNode.swap(iterNode);
RefreshNodes(iterNode);
iterNode->GetNextSibling(getter_AddRefs(nextNode));
}
if (!accessNode)
return;
if (accessNode == this) {
// Don't shutdown our doc object -- this may just be from the finished loading.
// We will completely shut it down when the pagehide event is received
// However, we must invalidate the doc accessible's children in order to be sure
// all pointers to them are correct
InvalidateChildren();
return;
}
// Shut down the actual accessible or access node
void *uniqueID;
accessNode->GetUniqueID(&uniqueID);
nsCOMPtr<nsPIAccessNode> privateAccessNode(do_QueryInterface(accessNode));
privateAccessNode->Shutdown();
// Remove from hash table as well
mAccessNodeCache.Remove(uniqueID);
}
NS_IMETHODIMP nsDocAccessible::InvalidateCacheSubtree(nsIContent *aChild,
@ -1742,37 +1759,29 @@ NS_IMETHODIMP nsDocAccessible::InvalidateCacheSubtree(nsIContent *aChild,
// which it is if anyone asks for its children right now.
return InvalidateChildren();
}
if (aChangeEventType == nsIAccessibleEvent::EVENT_DOM_CREATE) {
nsIEventStateManager *esm = presShell->GetPresContext()->EventStateManager();
NS_ENSURE_TRUE(esm, NS_ERROR_FAILURE);
if (!esm->IsHandlingUserInputExternal()) {
// Adding content during page load, but not caused by user input
// Just invalidate accessible hierarchy and return,
// otherwise the page load time slows down way too much
nsCOMPtr<nsIAccessible> containerAccessible;
GetAccessibleInParentChain(childNode, PR_FALSE, getter_AddRefs(containerAccessible));
if (!containerAccessible) {
containerAccessible = this;
}
nsCOMPtr<nsPIAccessible> privateContainer = do_QueryInterface(containerAccessible);
return privateContainer->InvalidateChildren();
nsIEventStateManager *esm = presShell->GetPresContext()->EventStateManager();
NS_ENSURE_TRUE(esm, NS_ERROR_FAILURE);
if (!esm->IsHandlingUserInputExternal()) {
// Changes during page load, but not caused by user input
// Just invalidate accessible hierarchy and return,
// otherwise the page load time slows down way too much
nsCOMPtr<nsIAccessible> containerAccessible;
GetAccessibleInParentChain(childNode, PR_FALSE, getter_AddRefs(containerAccessible));
if (!containerAccessible) {
containerAccessible = this;
}
// else: user input, so we must fall through and for full handling,
// e.g. fire the mutation events. Note: user input could cause DOM_CREATE
// during page load if user typed into an input field or contentEditable area
nsCOMPtr<nsPIAccessible> privateContainer = do_QueryInterface(containerAccessible);
return privateContainer->InvalidateChildren();
}
// else: user input, so we must fall through and for full handling,
// e.g. fire the mutation events. Note: user input could cause DOM_CREATE
// during page load if user typed into an input field or contentEditable area
}
// Update last change state information
nsCOMPtr<nsIAccessNode> childAccessNode;
GetCachedAccessNode(childNode, getter_AddRefs(childAccessNode));
nsCOMPtr<nsIAccessible> childAccessible = do_QueryInterface(childAccessNode);
if (!childAccessible && !isHiding) {
// If not about to hide it, make sure there's an accessible so we can fire an
// event for it
GetAccService()->GetAttachedAccessibleFor(childNode,
getter_AddRefs(childAccessible));
}
#ifdef DEBUG_A11Y
nsAutoString localName;
@ -1870,14 +1879,14 @@ NS_IMETHODIMP nsDocAccessible::InvalidateCacheSubtree(nsIContent *aChild,
// nsIAccessibleStates::STATE_INVISIBLE for the event's accessible object.
PRUint32 additionEvent = isAsynch ? nsIAccessibleEvent::EVENT_ASYNCH_SHOW :
nsIAccessibleEvent::EVENT_DOM_CREATE;
FireDelayedToolkitEvent(additionEvent, childNode, nsnull,
FireDelayedToolkitEvent(additionEvent, childNode,
eCoalesceFromSameSubtree, isAsynch);
// Check to see change occured in an ARIA menu, and fire an EVENT_MENUPOPUP_START if it did
nsRoleMapEntry *roleMapEntry = nsAccUtils::GetRoleMapEntry(childNode);
if (roleMapEntry && roleMapEntry->role == nsIAccessibleRole::ROLE_MENUPOPUP) {
FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_MENUPOPUP_START,
childNode, nsnull, eAllowDupes, isAsynch);
childNode, eAllowDupes, isAsynch);
}
// Check to see if change occured inside an alert, and fire an EVENT_ALERT if it did
@ -1885,7 +1894,7 @@ NS_IMETHODIMP nsDocAccessible::InvalidateCacheSubtree(nsIContent *aChild,
while (PR_TRUE) {
if (roleMapEntry && roleMapEntry->role == nsIAccessibleRole::ROLE_ALERT) {
nsCOMPtr<nsIDOMNode> alertNode(do_QueryInterface(ancestor));
FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_ALERT, alertNode, nsnull,
FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_ALERT, alertNode,
eRemoveDupes, isAsynch);
break;
}
@ -1904,7 +1913,7 @@ NS_IMETHODIMP nsDocAccessible::InvalidateCacheSubtree(nsIContent *aChild,
// from SHOW and HIDE so that they don't fetch extra objects
if (childAccessible) {
nsCOMPtr<nsIAccessibleEvent> reorderEvent =
new nsAccEvent(nsIAccessibleEvent::EVENT_REORDER, containerAccessible, nsnull, PR_TRUE);
new nsAccEvent(nsIAccessibleEvent::EVENT_REORDER, containerAccessible, PR_TRUE);
NS_ENSURE_TRUE(reorderEvent, NS_ERROR_OUT_OF_MEMORY);
FireDelayedAccessibleEvent(reorderEvent, eCoalesceFromSameSubtree, isAsynch);
}
@ -1980,7 +1989,7 @@ nsDocAccessible::FireShowHideEvents(nsIDOMNode *aDOMNode, PRUint32 aEventType,
aEventType == nsIAccessibleEvent::EVENT_ASYNCH_SHOW;
nsCOMPtr<nsIAccessibleEvent> event =
new nsAccEvent(aEventType, accessible, nsnull, isAsynch);
new nsAccEvent(aEventType, accessible, isAsynch);
NS_ENSURE_TRUE(event, NS_ERROR_OUT_OF_MEMORY);
if (aForceIsFromUserInput) {
nsAccEvent::PrepareForEvent(aDOMNode, aForceIsFromUserInput);

View File

@ -108,7 +108,6 @@ class nsDocAccessible : public nsHyperTextAccessibleWrap,
*
* @param aEvent - the nsIAccessibleEvent event type
* @param aDOMNode - DOM node the accesible event should be fired for
* @param aData - any additional data for the event
* @param aAllowDupes - eAllowDupes: more than one event of the same type is allowed.
* eCoalesceFromSameSubtree: if two events are in the same subtree,
* only the event on ancestor is used
@ -119,7 +118,7 @@ class nsDocAccessible : public nsHyperTextAccessibleWrap,
* synchronous with a DOM event
*/
nsresult FireDelayedToolkitEvent(PRUint32 aEvent, nsIDOMNode *aDOMNode,
void *aData, EDupeEventRule aAllowDupes = eRemoveDupes,
EDupeEventRule aAllowDupes = eRemoveDupes,
PRBool aIsAsynch = PR_FALSE);
/**

View File

@ -74,7 +74,7 @@ NS_IMETHODIMP nsOuterDocAccessible::GetName(nsAString& aName)
/* unsigned long getRole (); */
NS_IMETHODIMP nsOuterDocAccessible::GetRole(PRUint32 *aRole)
{
*aRole = nsIAccessibleRole::ROLE_CLIENT;
*aRole = nsIAccessibleRole::ROLE_INTERNAL_FRAME;
return NS_OK;
}
@ -116,7 +116,7 @@ void nsOuterDocAccessible::CacheChildren()
return;
}
SetFirstChild(nsnull);
InvalidateChildren();
mAccChildCount = 0;
// In these variable names, "outer" relates to the nsOuterDocAccessible

View File

@ -430,7 +430,7 @@ void nsRootAccessible::TryFireEarlyLoadEvent(nsIDOMNode *aDocNode)
// No frames or iframes, so we can fire the doc load finished event early
FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_INTERNAL_LOAD, aDocNode,
nsnull, eRemoveDupes);
eRemoveDupes);
}
PRBool nsRootAccessible::FireAccessibleFocusEvent(nsIAccessible *aAccessible,
@ -519,7 +519,7 @@ PRBool nsRootAccessible::FireAccessibleFocusEvent(nsIAccessible *aAccessible,
}
else if (mCurrentARIAMenubar) {
nsCOMPtr<nsIAccessibleEvent> menuEndEvent =
new nsAccEvent(nsIAccessibleEvent::EVENT_MENU_END, mCurrentARIAMenubar, nsnull, PR_FALSE);
new nsAccEvent(nsIAccessibleEvent::EVENT_MENU_END, mCurrentARIAMenubar, PR_FALSE);
if (menuEndEvent) {
FireDelayedAccessibleEvent(menuEndEvent, eAllowDupes, PR_FALSE);
}
@ -543,7 +543,7 @@ PRBool nsRootAccessible::FireAccessibleFocusEvent(nsIAccessible *aAccessible,
}
FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_FOCUS,
finalFocusNode, nsnull, eRemoveDupes, aIsAsynch);
finalFocusNode, eRemoveDupes, aIsAsynch);
return PR_TRUE;
}
@ -597,6 +597,9 @@ nsresult nsRootAccessible::HandleEventWithTarget(nsIDOMEvent* aEvent,
aEvent->GetType(eventType);
nsAutoString localName;
aTargetNode->GetLocalName(localName);
#ifdef MOZ_XUL
PRBool isTree = localName.EqualsLiteral("tree");
#endif
#ifdef DEBUG_A11Y
// Very useful for debugging, please leave this here.
if (eventType.EqualsLiteral("AlertActive")) {
@ -642,8 +645,9 @@ nsresult nsRootAccessible::HandleEventWithTarget(nsIDOMEvent* aEvent,
return NS_OK;
}
#ifdef MOZ_XUL
if (eventType.EqualsLiteral("TreeViewChanged")) { // Always asynch, always from user input
if (!localName.EqualsLiteral("tree"))
if (!isTree)
return NS_OK;
nsCOMPtr<nsIContent> treeContent = do_QueryInterface(aTargetNode);
@ -651,6 +655,44 @@ nsresult nsRootAccessible::HandleEventWithTarget(nsIDOMEvent* aEvent,
return accService->InvalidateSubtreeFor(eventShell, treeContent,
nsIAccessibleEvent::EVENT_ASYNCH_SIGNIFICANT_CHANGE);
}
#endif
if (eventType.EqualsLiteral("popuphiding")) {
// If accessible focus was on or inside popup that closes,
// then restore it to true current focus.
// This is the case when we've been getting DOMMenuItemActive events
// inside of a combo box that closes. The real focus is on the combo box.
// It's also the case when a popup gets focus in ATK -- when it closes
// we need to fire an event to restore focus to where it was
if (!gLastFocusedNode) {
return NS_OK;
}
if (gLastFocusedNode != aTargetNode) {
// Was not focused on popup
nsCOMPtr<nsIDOMNode> parentOfFocus;
gLastFocusedNode->GetParentNode(getter_AddRefs(parentOfFocus));
if (parentOfFocus != aTargetNode) {
return NS_OK; // And was not focused on an item inside the popup
}
}
// Focus was on or inside of a popup that's being hidden
FireCurrentFocusEvent();
return NS_OK;
}
if (aTargetNode == mDOMNode && mDOMNode != gLastFocusedNode && eventType.EqualsLiteral("focus")) {
// Got focus event for the window, we will make sure that an accessible
// focus event for initial focus is fired. We do this on a short timer
// because the initial focus may not have been set yet.
if (!mFireFocusTimer) {
mFireFocusTimer = do_CreateInstance("@mozilla.org/timer;1");
}
if (mFireFocusTimer) {
mFireFocusTimer->InitWithFuncCallback(FireFocusCallback, this,
0, nsITimer::TYPE_ONE_SHOT);
}
return NS_OK;
}
nsCOMPtr<nsIAccessible> accessible;
accService->GetAccessibleInShell(aTargetNode, eventShell,
@ -659,8 +701,9 @@ nsresult nsRootAccessible::HandleEventWithTarget(nsIDOMEvent* aEvent,
if (!privAcc)
return NS_OK;
#ifdef MOZ_XUL
if (eventType.EqualsLiteral("TreeRowCountChanged")) {
if (!localName.EqualsLiteral("tree"))
if (!isTree)
return NS_OK;
nsCOMPtr<nsIDOMDataContainerEvent> dataEvent(do_QueryInterface(aEvent));
@ -685,6 +728,7 @@ nsresult nsRootAccessible::HandleEventWithTarget(nsIDOMEvent* aEvent,
return treeAccCache->InvalidateCache(index, count);
}
#endif
if (eventType.EqualsLiteral("RadioStateChange")) {
PRUint32 state = State(accessible);
@ -723,7 +767,7 @@ nsresult nsRootAccessible::HandleEventWithTarget(nsIDOMEvent* aEvent,
nsCOMPtr<nsIAccessible> treeItemAccessible;
#ifdef MOZ_XUL
// If it's a tree element, need the currently selected item
if (localName.EqualsLiteral("tree")) {
if (isTree) {
nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelect =
do_QueryInterface(aTargetNode);
if (multiSelect) {
@ -779,19 +823,6 @@ nsresult nsRootAccessible::HandleEventWithTarget(nsIDOMEvent* aEvent,
else
#endif
if (eventType.EqualsLiteral("focus")) {
if (aTargetNode == mDOMNode && mDOMNode != gLastFocusedNode) {
// Got focus event for the window, we will make sure that an accessible
// focus event for initial focus is fired. We do this on a short timer
// because the initial focus may not have been set yet.
if (!mFireFocusTimer) {
mFireFocusTimer = do_CreateInstance("@mozilla.org/timer;1");
}
if (mFireFocusTimer) {
mFireFocusTimer->InitWithFuncCallback(FireFocusCallback, this,
0, nsITimer::TYPE_ONE_SHOT);
}
}
// Keep a reference to the target node. We might want to change
// it to the individual radio button or selected item, and send
// the focus event to that.
@ -847,28 +878,6 @@ nsresult nsRootAccessible::HandleEventWithTarget(nsIDOMEvent* aEvent,
nsAccUtils::FireAccEvent(event, accessible);
}
}
else if (eventType.EqualsLiteral("popuphiding")) {
// If accessible focus was on or inside popup that closes,
// then restore it to true current focus.
// This is the case when we've been getting DOMMenuItemActive events
// inside of a combo box that closes. The real focus is on the combo box.
// It's also the case when a popup gets focus in ATK -- when it closes
// we need to fire an event to restore focus to where it was
if (!gLastFocusedNode) {
return NS_OK;
}
if (gLastFocusedNode != aTargetNode) {
// Was not focused on popup
nsCOMPtr<nsIDOMNode> parentOfFocus;
gLastFocusedNode->GetParentNode(getter_AddRefs(parentOfFocus));
if (parentOfFocus != aTargetNode) {
return NS_OK; // And was not focused on an item inside the popup
}
}
// Focus was on or inside of a popup that's being hidden
FireCurrentFocusEvent();
}
else if (eventType.EqualsLiteral("DOMMenuInactive")) {
if (Role(accessible) == nsIAccessibleRole::ROLE_MENUPOPUP) {
nsAccUtils::FireAccEvent(nsIAccessibleEvent::EVENT_MENUPOPUP_END,
@ -877,6 +886,11 @@ nsresult nsRootAccessible::HandleEventWithTarget(nsIDOMEvent* aEvent,
}
else if (eventType.EqualsLiteral("DOMMenuItemActive")) {
if (!treeItemAccessible) {
#ifdef MOZ_XUL
if (isTree) {
return NS_OK; // Tree with nothing selected
}
#endif
nsCOMPtr<nsPIAccessNode> menuAccessNode = do_QueryInterface(accessible);
NS_ENSURE_TRUE(menuAccessNode, NS_ERROR_FAILURE);
nsIFrame* menuFrame = menuAccessNode->GetFrame();

View File

@ -857,29 +857,22 @@ nsHTMLTableAccessible::GetTableNode(nsIDOMNode **_retval)
}
nsresult
nsHTMLTableAccessible::GetTableLayout(nsITableLayout **aLayoutObject)
nsHTMLTableAccessible::GetTableLayout(nsITableLayout **aTableLayout)
{
*aLayoutObject = nsnull;
nsresult rv = NS_OK;
*aTableLayout = nsnull;
nsCOMPtr<nsIDOMNode> tableNode;
rv = GetTableNode(getter_AddRefs(tableNode));
NS_ENSURE_SUCCESS(rv, rv);
GetTableNode(getter_AddRefs(tableNode));
nsCOMPtr<nsIContent> tableContent(do_QueryInterface(tableNode));
if (!tableContent) {
return NS_ERROR_FAILURE; // Table shut down
}
nsCOMPtr<nsIContent> content(do_QueryInterface(tableNode));
NS_ENSURE_TRUE(content, NS_ERROR_FAILURE);
nsCOMPtr<nsIPresShell> shell = GetPresShell();
NS_ENSURE_TRUE(shell, NS_ERROR_FAILURE);
nsIDocument *doc = content->GetDocument();
NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE);
nsIPresShell *presShell = doc->GetPrimaryShell();
nsCOMPtr<nsISupports> layoutObject;
rv = presShell->GetLayoutObjectFor(content, getter_AddRefs(layoutObject));
NS_ENSURE_SUCCESS(rv, rv);
return CallQueryInterface(layoutObject, aLayoutObject);
nsIFrame *frame = shell->GetPrimaryFrameFor(tableContent);
return frame ? CallQueryInterface(frame, aTableLayout) : NS_ERROR_FAILURE;
}
nsresult

View File

@ -96,7 +96,10 @@ nsresult nsHyperTextAccessible::QueryInterface(REFNSIID aIID, void** aInstancePt
if (mRoleMapEntry &&
(mRoleMapEntry->role == nsIAccessibleRole::ROLE_GRAPHIC ||
mRoleMapEntry->role == nsIAccessibleRole::ROLE_IMAGE_MAP)) {
mRoleMapEntry->role == nsIAccessibleRole::ROLE_IMAGE_MAP ||
mRoleMapEntry->role == nsIAccessibleRole::ROLE_SLIDER ||
mRoleMapEntry->role == nsIAccessibleRole::ROLE_PROGRESSBAR ||
mRoleMapEntry->role == nsIAccessibleRole::ROLE_SEPARATOR)) {
// ARIA roles that these interfaces are not appropriate for
return nsAccessible::QueryInterface(aIID, aInstancePtr);
}
@ -565,7 +568,10 @@ nsresult nsHyperTextAccessible::DOMPointToHypertextOffset(nsIDOMNode* aNode, PRI
// On failure, return null. On success, return the DOM node which contains the offset.
NS_ENSURE_ARG_POINTER(aHyperTextOffset);
*aHyperTextOffset = 0;
NS_ENSURE_ARG_POINTER(aNode);
if (!aNode) {
return NS_ERROR_FAILURE;
}
if (aFinalAccessible) {
*aFinalAccessible = nsnull;
}
@ -619,6 +625,17 @@ nsresult nsHyperTextAccessible::DOMPointToHypertextOffset(nsIDOMNode* aNode, PRI
// accessible for the next DOM node which has one (based on forward depth first search)
nsCOMPtr<nsIAccessible> descendantAccessible;
if (findNode) {
nsCOMPtr<nsIContent> findContent = do_QueryInterface(findNode);
if (findContent->IsNodeOfType(nsINode::eHTML) &&
findContent->NodeInfo()->Equals(nsAccessibilityAtoms::br)) {
nsIContent *parent = findContent->GetParent();
if (parent && parent->IsNativeAnonymous() && parent->GetChildCount() == 1) {
// This <br> is the only node in a text control, therefore it is the hacky
// "bogus node" used when there is no text in a control
*aHyperTextOffset = 0;
return NS_OK;
}
}
descendantAccessible = GetFirstAvailableAccessible(findNode);
}
// From the descendant, go up and get the immediate child of this hypertext
@ -987,6 +1004,13 @@ nsresult nsHyperTextAccessible::GetTextHelper(EGetTextType aType, nsAccessibleTe
if (!endFrame) {
return NS_ERROR_FAILURE;
}
if (endAcc && Role(endAcc) == nsIAccessibleRole::ROLE_STATICTEXT) {
// Static text like list bullets will ruin our forward calculation,
// since the caret cannot be in the static text. Start just after the static text.
startOffset = endOffset = finalStartOffset + (aBoundaryType == BOUNDARY_LINE_END) + TextLength(endAcc);
endFrame = GetPosAndText(startOffset, endOffset, nsnull, nsnull,
nsnull, getter_AddRefs(endAcc));
}
finalEndOffset = GetRelativeOffset(presShell, endFrame, endOffset, endAcc,
amount, eDirNext, needsStart);
NS_ENSURE_TRUE(endOffset >= 0, NS_ERROR_FAILURE);

View File

@ -52,7 +52,7 @@ static const NSString* AXRoles [] = {
NSAccessibilityUnknownRole, // ROLE_CARET. unused on OS X
NSAccessibilityWindowRole, // ROLE_ALERT
NSAccessibilityWindowRole, // ROLE_WINDOW. irrelevant on OS X; all window a11y is handled by the system.
@"AXWebArea", // ROLE_CLIENT
@"AXWebArea", // ROLE_INTERNAL_FRAME
NSAccessibilityMenuRole, // ROLE_MENUPOPUP. the parent of menuitems
NSAccessibilityMenuItemRole, // ROLE_MENUITEM.
@"AXHelpTag", // ROLE_TOOLTIP. 10.4+ only, so we re-define the constant.

View File

@ -95,8 +95,8 @@ static const WindowsRoleMapItem gWindowsRoleMap[] = {
// nsIAccessibleRole::ROLE_WINDOW
{ ROLE_SYSTEM_WINDOW, ROLE_SYSTEM_WINDOW },
// nsIAccessibleRole::ROLE_CLIENT
{ USE_ROLE_STRING, IA2_ROLE_UNKNOWN},
// nsIAccessibleRole::ROLE_INTERNAL_FRAME
{ USE_ROLE_STRING, IA2_ROLE_INTERNAL_FRAME},
// nsIAccessibleRole::ROLE_MENUPOPUP
{ ROLE_SYSTEM_MENUPOPUP, ROLE_SYSTEM_MENUPOPUP },
@ -429,7 +429,7 @@ static const WindowsRoleMapItem gWindowsRoleMap[] = {
{ ROLE_SYSTEM_LISTITEM, ROLE_SYSTEM_LISTITEM },
// nsIAccessibleRole::ROLE_RICH_OPTION
{ ROLE_SYSTEM_LIST, ROLE_SYSTEM_LIST },
{ ROLE_SYSTEM_LISTITEM, ROLE_SYSTEM_LISTITEM },
// nsIAccessibleRole::ROLE_LISTBOX
{ ROLE_SYSTEM_LIST, ROLE_SYSTEM_LIST },

View File

@ -51,7 +51,7 @@ nsXFormsLabelAccessible::GetRole(PRUint32 *aRole)
{
NS_ENSURE_ARG_POINTER(aRole);
*aRole = nsIAccessibleRole::ROLE_STATICTEXT;
*aRole = nsIAccessibleRole::ROLE_LABEL;
return NS_OK;
}

View File

@ -64,3 +64,11 @@ nsXULAlertAccessible::GetState(PRUint32 *aState, PRUint32 *aExtraState)
return NS_OK;
}
NS_IMETHODIMP
nsXULAlertAccessible::GetName(nsAString& aName)
{
// Screen readers need to read contents of alert, not the accessible name.
// If we have both some screen readers will read the alert twice.
aName.Truncate();
return NS_OK;
}

View File

@ -50,6 +50,7 @@ public:
NS_DECL_ISUPPORTS_INHERITED
NS_IMETHOD GetRole(PRUint32 *aRole);
NS_IMETHOD GetState(PRUint32 *aState, PRUint32 *aExtraState);
NS_IMETHOD GetName(nsAString& aName);
};
#endif

View File

@ -486,7 +486,9 @@ NS_IMETHODIMP nsXULMenuitemAccessible::GetRole(PRUint32 *aRole)
return NS_OK;
}
if (mParent && Role(mParent) == nsIAccessibleRole::ROLE_COMBOBOX_LIST) {
nsCOMPtr<nsIAccessible> parent;
GetParent(getter_AddRefs(parent));
if (parent && Role(parent) == nsIAccessibleRole::ROLE_COMBOBOX_LIST) {
*aRole = nsIAccessibleRole::ROLE_COMBOBOX_OPTION;
return NS_OK;
}
@ -716,14 +718,18 @@ NS_IMETHODIMP nsXULMenupopupAccessible::GetRole(PRUint32 *aRole)
if (!content) {
return NS_ERROR_FAILURE;
}
if ((mParent && Role(mParent) == nsIAccessibleRole::ROLE_COMBOBOX) ||
content->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::type,
nsAccessibilityAtoms::autocomplete, eIgnoreCase)) {
*aRole = nsIAccessibleRole::ROLE_COMBOBOX_LIST;
}
else {
*aRole = nsIAccessibleRole::ROLE_MENUPOPUP;
nsCOMPtr<nsIAccessible> parent;
GetParent(getter_AddRefs(parent));
if (parent) {
// 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) {
*aRole = nsIAccessibleRole::ROLE_COMBOBOX_LIST;
return NS_OK;
}
}
*aRole = nsIAccessibleRole::ROLE_MENUPOPUP;
return NS_OK;
}

View File

@ -41,6 +41,7 @@
#include "nsAccessibilityService.h"
#include "nsIContent.h"
#include "nsIDOMXULMenuListElement.h"
#include "nsIDOMXULPopupElement.h"
#include "nsIDOMXULSelectCntrlItemEl.h"
#include "nsIDOMXULSelectCntrlEl.h"
#include "nsIDOMXULTextboxElement.h"
@ -194,9 +195,20 @@ NS_IMETHODIMP nsXULListboxAccessible::GetValue(nsAString& _retval)
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP nsXULListboxAccessible::GetRole(PRUint32 *_retval)
NS_IMETHODIMP nsXULListboxAccessible::GetRole(PRUint32 *aRole)
{
*_retval = nsIAccessibleRole::ROLE_LIST;
nsCOMPtr<nsIContent> content = do_QueryInterface(mDOMNode);
if (content) {
// A richlistbox is used with the new autocomplete URL bar,
// and has a parent popup <panel>
nsCOMPtr<nsIDOMXULPopupElement> xulPopup =
do_QueryInterface(content->GetParent());
if (xulPopup) {
*aRole = nsIAccessibleRole::ROLE_COMBOBOX_LIST;
return NS_OK;
}
}
*aRole = nsIAccessibleRole::ROLE_LIST;
return NS_OK;
}
@ -250,6 +262,8 @@ NS_IMETHODIMP nsXULListitemAccessible::GetRole(PRUint32 *aRole)
{
if (mIsCheckbox)
*aRole = nsIAccessibleRole::ROLE_CHECKBUTTON;
else if (mParent && Role(mParent) == nsIAccessibleRole::ROLE_COMBOBOX_LIST)
*aRole = nsIAccessibleRole::ROLE_COMBOBOX_OPTION;
else
*aRole = nsIAccessibleRole::ROLE_RICH_OPTION;
return NS_OK;

View File

@ -61,13 +61,9 @@ NS_IMETHODIMP nsXULTextAccessible::GetName(nsAString& aName)
if (!content) {
return NS_ERROR_FAILURE; // Node shut down
}
if (!content->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::value,
aName)) {
// if the value doesn't exist, flatten the inner content as the name (for descriptions)
return AppendFlatStringFromSubtree(content, &aName);
}
// otherwise, use the value attribute as the name (for labels)
return NS_OK;
// if the value attr doesn't exist, the screen reader must get the accessible text
// from the accessible text interface or from the children
return content->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::value, aName);
}
NS_IMETHODIMP
@ -176,13 +172,9 @@ NS_IMETHODIMP nsXULLinkAccessible::GetName(nsAString& aName)
NS_IMETHODIMP nsXULLinkAccessible::GetRole(PRUint32 *aRole)
{
if (mIsLink) {
*aRole = nsIAccessibleRole::ROLE_LINK;
} else {
// default to calling the link a button; might have javascript
*aRole = nsIAccessibleRole::ROLE_PUSHBUTTON;
}
// should there be a third case where it becomes just text?
// We used to say ROLE_BUTTON if there was no href, but then screen readers
// would tell users to hit the space bar for activation, which is wrong for a link
*aRole = nsIAccessibleRole::ROLE_LINK;
return NS_OK;
}

View File

@ -563,9 +563,11 @@ nsXULTreeAccessible::InvalidateCache(PRInt32 aRow, PRInt32 aCount)
if (aCount > 0)
return NS_OK;
NS_ENSURE_TRUE(mTree && mTreeView, NS_ERROR_FAILURE);
nsCOMPtr<nsITreeColumns> cols;
nsresult rv = mTree->GetColumns(getter_AddRefs(cols));
NS_ENSURE_SUCCESS(rv, rv);
NS_ENSURE_STATE(cols);
#ifdef MOZ_ACCESSIBILITY_ATK
PRInt32 colsCount = 0;
@ -597,7 +599,7 @@ nsXULTreeAccessible::InvalidateCache(PRInt32 aRow, PRInt32 aCount)
nsCOMPtr<nsIAccessible> accessible(do_QueryInterface(accessNode));
nsCOMPtr<nsIAccessibleEvent> event =
new nsAccEvent(nsIAccessibleEvent::EVENT_DOM_DESTROY,
accessible, nsnull, PR_FALSE);
accessible, PR_FALSE);
FireAccessibleEvent(event);
mAccessNodeCache->Remove(key);

View File

@ -318,10 +318,7 @@ endif
ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2)
libs::
$(INSTALL) $(DIST)/branding/default.xpm $(DIST)/bin/chrome/icons/default
install::
$(SYSINSTALL) $(IFLAGS1) $(DIST)/branding/default.xpm $(DESTDIR)$(mozappdir)/chrome/icons/default
$(INSTALL) $(DIST)/branding/default16.png $(DIST)/bin/chrome/icons/default
endif
export::
@ -347,7 +344,7 @@ ifneq (,$(filter gtk2,$(MOZ_WIDGET_TOOLKIT)))
cp $(srcdir)/document.png $(DIST)/branding/document.png
endif
ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2)
cp $(srcdir)/default.xpm $(DIST)/branding/default.xpm
cp $(srcdir)/default16.png $(DIST)/branding/default16.png
endif
ifeq ($(OS_ARCH),OS2)
cp $(srcdir)/firefox-os2.ico $(DIST)/branding/firefox.ico
@ -380,6 +377,9 @@ else
APPFILES = MacOS
endif
libs:: $(srcdir)/profile/prefs.js
$(INSTALL) $^ $(DIST)/bin/defaults/profile
libs repackage:: $(PROGRAM) application.ini
mkdir -p $(DIST)/$(APP_NAME).app/Contents/MacOS
rsync -a --exclude CVS --exclude "*.in" $(srcdir)/macbuild/Contents $(DIST)/$(APP_NAME).app --exclude English.lproj
@ -419,12 +419,6 @@ else
$(INSTALL) $(topsrcdir)/LICENSE $(DIST)/bin
endif
libs:: $(srcdir)/profile/prefs.js
$(INSTALL) $^ $(DIST)/bin/defaults/profile
install:: $(srcdir)/profile/prefs.js
$(SYSINSTALL) $(IFLAGS1) $^ $(DESTDIR)$(mozappdir)/defaults/profile
ifdef LIBXUL_SDK
ifndef SKIP_COPY_XULRUNNER
libs::

File diff suppressed because it is too large Load Diff

BIN
browser/app/default16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 722 B

View File

@ -68,6 +68,15 @@ pref("extensions.logging.enabled", false);
// Hides the install button in the add-ons mgr
pref("extensions.hideInstallButton", true);
// Preferences for the Get Add-ons pane
pref("extensions.getAddons.showPane", true);
pref("extensions.getAddons.browseAddons", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/%APP%");
pref("extensions.getAddons.maxResults", 5);
pref("extensions.getAddons.recommended.browseURL", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/%APP%/recommended");
pref("extensions.getAddons.recommended.url", "https://services.addons.mozilla.org/%LOCALE%/%APP%/api/list/featured/all/10");
pref("extensions.getAddons.search.browseURL", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/%APP%/search?q=%TERMS%");
pref("extensions.getAddons.search.url", "https://services.addons.mozilla.org/%LOCALE%/%APP%/api/search/%TERMS%");
// Blocklist preferences
pref("extensions.blocklist.enabled", true);
pref("extensions.blocklist.interval", 86400);
@ -217,6 +226,7 @@ pref("browser.download.manager.openDelay", 0);
pref("browser.download.manager.focusWhenStarting", false);
pref("browser.download.manager.flashCount", 2);
pref("browser.download.manager.addToRecentDocs", true);
pref("browser.download.manager.quitBehavior", 0);
// search engines URL
pref("browser.search.searchEnginesURL", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/firefox/%VERSION%/search-engines/");
@ -335,14 +345,15 @@ pref("privacy.popups.usecustom", true);
pref("privacy.popups.firstTime", true);
pref("privacy.popups.showBrowserMessage", true);
pref("privacy.item.history", true);
pref("privacy.item.formdata", true);
pref("privacy.item.passwords", false);
pref("privacy.item.downloads", true);
pref("privacy.item.cookies", false);
pref("privacy.item.cache", true);
pref("privacy.item.siteprefs", false);
pref("privacy.item.sessions", true);
pref("privacy.item.history", true);
pref("privacy.item.formdata", true);
pref("privacy.item.passwords", false);
pref("privacy.item.downloads", true);
pref("privacy.item.cookies", false);
pref("privacy.item.cache", true);
pref("privacy.item.siteprefs", false);
pref("privacy.item.sessions", true);
pref("privacy.item.offlineApps", false);
pref("privacy.sanitize.sanitizeOnShutdown", false);
pref("privacy.sanitize.promptOnSanitize", true);
@ -599,6 +610,42 @@ pref("browser.places.createdSmartBookmarks", false);
// XXX to be removed after beta 2 (bug 391419)
pref("browser.places.migratePostDataAnnotations", true);
// the (maximum) number of the recent visits to sample
// when calculating frecency
pref("places.frecency.numVisits", 10);
// Perform frecency recalculation after this amount of idle, repeating.
// A value of zero disables updating of frecency on idle.
// Default is 1 minute (60000ms).
pref("places.frecency.updateIdleTime", 60000);
// buckets (in days) for frecency calculation
pref("places.frecency.firstBucketCutoff", 4);
pref("places.frecency.secondBucketCutoff", 14);
pref("places.frecency.thirdBucketCutoff", 31);
pref("places.frecency.fourthBucketCutoff", 90);
// weights for buckets for frecency calculations
pref("places.frecency.firstBucketWeight", 100);
pref("places.frecency.secondBucketWeight", 70);
pref("places.frecency.thirdBucketWeight", 50);
pref("places.frecency.fourthBucketWeight", 30);
pref("places.frecency.defaultBucketWeight", 10);
// bonus (in percent) for visit transition types for frecency calculations
pref("places.frecency.embedVisitBonus", 0);
pref("places.frecency.linkVisitBonus", 120);
pref("places.frecency.typedVisitBonus", 200);
pref("places.frecency.bookmarkVisitBonus", 140);
pref("places.frecency.downloadVisitBonus", 0);
pref("places.frecency.permRedirectVisitBonus", 0);
pref("places.frecency.tempRedirectVisitBonus", 0);
pref("places.frecency.defaultVisitBonus", 0);
// bonus (in percent) for place types for frecency calculations
pref("places.frecency.unvisitedBookmarkBonus", 140);
pref("places.frecency.unvisitedTypedBonus", 200);
// Controls behavior of the "Add Exception" dialog launched from SSL error pages
// 0 - don't pre-populate anything
// 1 - pre-populate site URL, but don't fetch certificate
@ -608,3 +655,5 @@ pref("browser.ssl_override_behavior", 1);
// replace newlines with spaces when pasting into <input type="text"> fields
pref("editor.singleLine.pasteNewlines", 2);
// The breakpad report server to link to in about:crashes
pref("breakpad.reportURL", "http://crash-stats.mozilla.com/report/index/");

View File

@ -68,6 +68,7 @@ END
#define IDC_COLRESIZE 4108
#define IDC_ROWRESIZE 4109
#define IDC_VERTICALTEXT 4110
#define IDC_NONE 4112
IDC_GRAB CURSOR DISCARDABLE "../../widget/src/build/res/grab.cur"
IDC_GRABBING CURSOR DISCARDABLE "../../widget/src/build/res/grabbing.cur"
@ -79,5 +80,6 @@ IDC_ZOOMOUT CURSOR DISCARDABLE "../../widget/src/build/res/zoom
IDC_COLRESIZE CURSOR DISCARDABLE "../../widget/src/build/res/col_resize.cur"
IDC_ROWRESIZE CURSOR DISCARDABLE "../../widget/src/build/res/row_resize.cur"
IDC_VERTICALTEXT CURSOR DISCARDABLE "../../widget/src/build/res/vertical_text.cur"
IDC_NONE CURSOR DISCARDABLE "../../widget/src/build/res/none.cur"
#endif

View File

@ -71,6 +71,7 @@ POINTER IDC_ZOOMOUT "..\\..\\widget\\src\\os2\\res\\zoom_out.ptr"
POINTER IDC_ARROWWAIT "..\\..\\widget\\src\\os2\\res\\arrow_wait.ptr"
POINTER IDC_CROSS "..\\..\\widget\\src\\os2\\res\\crosshair.ptr"
POINTER IDC_HELP "..\\..\\widget\\src\\os2\\res\\help.ptr"
POINTER IDC_NONE "..\\..\\widget\\src\\os2\\res\\none.ptr"
ICON IDC_DNDURL "..\\..\\widget\\src\\os2\\res\\dndurl.ico"
ICON IDC_DNDTEXT "..\\..\\widget\\src\\os2\\res\\dndtext.ico"

View File

@ -79,7 +79,7 @@
#copyright {
margin-top: 0;
-moz-margin-end: 0;
-moz-margin-end: 16px;
margin-bottom: 3px;
-moz-margin-start: 16px;
}

View File

@ -75,7 +75,7 @@
#expand <label id="version" value="&aboutVersion; __MOZ_APP_VERSION__"/>
<label id="distribution"/>
<label id="distributionId"/>
<description id="copyright">&copyrightText;</description>
<description id="copyright">&copyrightInfo;</description>
<textbox id="userAgent" multiline="true" readonly="true"/>
</vbox>
<vbox flex="1" id="creditsBox">

View File

@ -0,0 +1,80 @@
<?xml version="1.0"?>
# -*- Mode: HTML -*-
# ***** 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 mozilla.org browser.
#
# The Initial Developer of the Original Code is
# Simon Bünzli <zeniko@gmail.com>
# Portions created by the Initial Developer are Copyright (C) 2007 - 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 *****
<!DOCTYPE bindings SYSTEM "chrome://global/locale/global.dtd">
<bindings xmlns="http://www.mozilla.org/xbl"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:xbl="http://www.mozilla.org/xbl"
>
<binding id="unified-back-forward-button-wrapper" display="xul:menu"
extends="chrome://global/content/bindings/toolbarbutton.xml#menu">
<content>
<children includes="toolbarbutton|observes|template|menupopup|tooltip"/>
<xul:dropmarker type="menu-button"
class="toolbarbutton-menubutton-dropmarker"
chromedir="&locale.dir;"
xbl:inherits="align,dir,pack,orient,disabled,toolbarmode,buttonstyle"
/>
</content>
<implementation>
<constructor><![CDATA[
this._updateUnifiedState();
]]></constructor>
<method name="_updateUnifiedState">
<body><![CDATA[
var canGoBack = !document.getElementById("Browser:Back").hasAttribute("disabled");
var canGoForward = !document.getElementById("Browser:Forward").hasAttribute("disabled");
if (canGoBack || canGoForward)
this.removeAttribute("disabled");
else
this.setAttribute("disabled", "true");
]]></body>
</method>
</implementation>
<handlers>
<!-- observing state changes of the child buttons -->
<handler event="broadcast" action="this._updateUnifiedState();"/>
</handlers>
</binding>
</bindings>

View File

@ -54,8 +54,8 @@
oncommand="gContextMenu.openLinkInTab();"/>
<menuseparator id="context-sep-open"/>
<menuitem id="context-bookmarklink"
label="&bookmarkLinkCmd.label;"
accesskey="&bookmarkLinkCmd.accesskey;"
label="&bookmarkThisLinkCmd.label;"
accesskey="&bookmarkThisLinkCmd.accesskey;"
oncommand="gContextMenu.bookmarkLink();"/>
<menuitem id="context-savelink"
label="&saveLinkCmd.label;"
@ -126,8 +126,8 @@
command="Browser:Stop"/>
<menuseparator id="context-sep-stop"/>
<menuitem id="context-bookmarkpage"
label="&bookmarkPageCmd.label;"
accesskey="&bookmarkPageCmd.accesskey;"
label="&bookmarkPageCmd2.label;"
accesskey="&bookmarkPageCmd2.accesskey;"
oncommand="gContextMenu.bookmarkThisPage();"/>
<menuitem id="context-savepage"
label="&savePageCmd.label;"
@ -194,8 +194,8 @@
accesskey="&reloadFrameCmd.accesskey;"
oncommand="gContextMenu.reloadFrame();"/>
<menuseparator/>
<menuitem label="&bookmarkFrameCmd.label;"
accesskey="&bookmarkFrameCmd.accesskey;"
<menuitem label="&bookmarkThisFrameCmd.label;"
accesskey="&bookmarkThisFrameCmd.accesskey;"
oncommand="gContextMenu.addBookmarkForFrame();"/>
<menuitem label="&saveFrameCmd.label;"
accesskey="&saveFrameCmd.accesskey;"
@ -240,9 +240,9 @@
oncommand="gContextMenu.showMetadata();"/>
<menuseparator id="spell-separator"/>
<menuitem id="spell-check-enabled"
label="&spellEnable.label;"
label="&spellCheckEnable.label;"
type="checkbox"
accesskey="&spellEnable.accesskey;"
accesskey="&spellCheckEnable.accesskey;"
oncommand="InlineSpellCheckerUI.toggleEnabled();"/>
#ifndef MOZ_WIDGET_COCOA
<menuitem id="spell-add-dictionaries-main"

View File

@ -88,7 +88,9 @@
<menu id="edit-menu" label="&editMenu.label;"
accesskey="&editMenu.accesskey;">
<menupopup id="menu_EditPopup">
<menupopup id="menu_EditPopup"
onpopupshowing="updateEditUIVisibility()"
onpopuphidden="updateEditUIVisibility()">
<menuitem label="&undoCmd.label;"
key="key_undo"
accesskey="&undoCmd.accesskey;"

View File

@ -97,11 +97,8 @@ var PlacesCommandHook = {
break;
case "keypress":
if (aEvent.keyCode == KeyEvent.DOM_VK_ESCAPE ||
aEvent.keyCode == KeyEvent.DOM_VK_RETURN) {
// focus the content area and hide the panel
window.content.focus();
this.panel.hidePopup();
}
aEvent.keyCode == KeyEvent.DOM_VK_RETURN)
this.panel.hidePopup(); // hide the panel
break;
}
},
@ -208,7 +205,7 @@ var PlacesCommandHook = {
if (aBrowser.contentWindow == window.content) {
var starIcon = aBrowser.ownerDocument.getElementById("star-button");
if (starIcon && isElementVisible(starIcon)) {
this.showEditBookmarkPopup(itemId, starIcon, "after_start");
this.showEditBookmarkPopup(itemId, starIcon, "after_end");
return;
}
}

View File

@ -107,9 +107,7 @@
<command id="Browser:OpenLocation" oncommand="openLocation();"/>
<command id="Tools:Search" oncommand="BrowserSearch.webSearch();"/>
<command id="Tools:Downloads" oncommand="toOpenWindowByType('Download:Manager',
'chrome://mozapps/content/downloads/downloads.xul',
'chrome,dialog=no,resizable');"/>
<command id="Tools:Downloads" oncommand="BrowserDownloadsUI();"/>
<command id="Tools:Addons" oncommand="BrowserOpenAddonsMgr();"/>
<command id="Tools:Sanitize"
oncommand="Cc[GLUE_CID].getService(Ci.nsIBrowserGlue).sanitize(window || null);"/>

View File

@ -23,6 +23,17 @@ toolbar[printpreview="true"] {
-moz-binding: url("chrome://browser/content/urlbarBindings.xml#urlbar-rich-result-popup");
}
/* ::::: Unified Back-/Forward Button ::::: */
#unified-back-forward-button {
-moz-binding: url("chrome://browser/content/bindings.xml#unified-back-forward-button-wrapper");
}
#unified-back-forward-button > toolbarbutton > dropmarker {
display: none; /* we provide our own */
}
.unified-nav-current {
font-weight: bold;
}
menuitem.spell-suggestion {
font-weight: bold;
}

View File

@ -58,6 +58,12 @@
#
# ***** END LICENSE BLOCK *****
let Ci = Components.interfaces;
let Cu = Components.utils;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/DownloadUtils.jsm");
Cu.import("resource://gre/modules/PluralForm.jsm");
const kXULNS =
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
@ -99,6 +105,7 @@ var gBrowser = null;
var gNavToolbox = null;
var gSidebarCommand = "";
var gInPrintPreviewMode = false;
let gDownloadMgr = null;
// Global variable that holds the nsContextMenu instance.
var gContextMenu = null;
@ -114,6 +121,10 @@ var gBookmarkAllTabsHandler = null;
var gClickAndHoldTimer = null;
#endif
#ifndef XP_MACOSX
var gEditUIVisible = true;
#endif
/**
* We can avoid adding multiple load event listeners and save some time by adding
* one listener that calls all real handlers.
@ -170,6 +181,45 @@ function UpdateBackForwardCommands(aWebNavigation)
}
}
var UnifiedBackForwardButton = {
unify: function() {
var backButton = document.getElementById("back-button");
if (!backButton || !backButton.nextSibling || backButton.nextSibling.id != "forward-button")
return; // back and forward buttons aren't adjacent
var wrapper = document.createElement("toolbaritem");
wrapper.id = "unified-back-forward-button";
wrapper.className = "chromeclass-toolbar-additional";
wrapper.setAttribute("context", "backMenu");
var toolbar = backButton.parentNode;
toolbar.insertBefore(wrapper, backButton);
var forwardButton = backButton.nextSibling;
wrapper.appendChild(backButton);
wrapper.appendChild(forwardButton);
var popup = backButton.getElementsByTagName("menupopup")[0].cloneNode(true);
wrapper.appendChild(popup);
this._unified = true;
},
separate: function() {
if (!this._unified)
return;
var wrapper = document.getElementById("unified-back-forward-button");
var toolbar = wrapper.parentNode;
toolbar.insertBefore(wrapper.firstChild, wrapper); // Back button
toolbar.insertBefore(wrapper.firstChild, wrapper); // Forward button
toolbar.removeChild(wrapper);
this._unified = false;
}
};
#ifdef XP_MACOSX
/**
* Click-and-Hold implementation for the Back and Forward buttons
@ -889,6 +939,7 @@ function delayedStartup()
gPrefService = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch2);
BrowserOffline.init();
OfflineApps.init();
if (gURLBar && document.documentElement.getAttribute("chromehidden").indexOf("toolbar") != -1) {
gURLBar.setAttribute("readonly", "true");
@ -908,6 +959,7 @@ function delayedStartup()
sidebar.setAttribute("src", sidebarBox.getAttribute("src"));
}
UnifiedBackForwardButton.unify();
UpdateUrlbarSearchSplitterState();
try {
@ -1049,13 +1101,33 @@ function delayedStartup()
// themselves.
gBrowser.addEventListener("command", BrowserOnCommand, false);
// Delayed initialization of the livemarks update timer.
// Livemark updates don't need to start until after bookmark UI
// such as the toolbar has initialized. Starting 5 seconds after
// delayedStartup in order to stagger this before the download
// manager starts (see below).
setTimeout(function() PlacesUtils.livemarks.start(), 5000);
// Initialize the download manager some time after the app starts so that
// auto-resume downloads begin (such as after crashing or quitting with
// active downloads) and speeds up the first-load of the download manager UI.
// If the user manually opens the download manager before the timeout, the
// downloads will start right away, and getting the service again won't hurt.
setTimeout(function() Cc["@mozilla.org/download-manager;1"].
getService(Ci.nsIDownloadManager), 10000);
setTimeout(function() {
gDownloadMgr = Cc["@mozilla.org/download-manager;1"].
getService(Ci.nsIDownloadManager);
// Initialize the downloads monitor panel listener
gDownloadMgr.addListener(DownloadMonitorPanel);
DownloadMonitorPanel.init();
}, 10000);
#ifndef XP_MACOSX
updateEditUIVisibility();
let placesContext = document.getElementById("placesContext");
placesContext.addEventListener("popupshowing", updateEditUIVisibility, false);
placesContext.addEventListener("popuphiding", updateEditUIVisibility, false);
#endif
}
function BrowserShutdown()
@ -1091,6 +1163,7 @@ function BrowserShutdown()
gSanitizeListener.shutdown();
BrowserOffline.uninit();
OfflineApps.uninit();
var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
@ -1269,13 +1342,15 @@ function ctrlNumberTabSelection(event)
}
#ifdef XP_MACOSX
if (!event.metaKey)
// Mac: Cmd+number
if (!event.metaKey || event.ctrlKey || event.altKey || event.shiftKey)
#else
#ifdef XP_UNIX
// don't let tab selection clash with numeric accesskeys (bug 366084)
if (!event.altKey || event.shiftKey)
// Linux: Alt+number
if (!event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)
#else
if (!event.ctrlKey)
// Windows: Ctrl+number
if (!event.ctrlKey || event.metaKey || event.altKey || event.shiftKey)
#endif
#endif
return;
@ -1409,12 +1484,14 @@ function BrowserHandleShiftBackspace()
function BrowserBackMenu(event)
{
return FillHistoryMenu(event.target, "back");
var menuType = UnifiedBackForwardButton._unified ? "unified" : "back";
return FillHistoryMenu(event.target, menuType);
}
function BrowserForwardMenu(event)
{
return FillHistoryMenu(event.target, "forward");
var menuType = UnifiedBackForwardButton._unified ? "unified" : "forward";
return FillHistoryMenu(event.target, menuType);
}
function BrowserStop()
@ -1496,13 +1573,20 @@ function loadOneOrMoreURIs(aURIString)
}
}
function openLocation()
function focusAndSelectUrlBar()
{
if (gURLBar && isElementVisible(gURLBar) && !gURLBar.readOnly) {
gURLBar.focus();
gURLBar.select();
return;
return true;
}
return false;
}
function openLocation()
{
if (focusAndSelectUrlBar())
return;
#ifdef XP_MACOSX
if (window.location.href != getBrowserURL()) {
var win = getTopWin();
@ -1904,10 +1988,25 @@ function URLBarSetURI(aURI) {
if (!content.opener)
value = "";
} else {
// try to decode as UTF-8
try {
value = decodeURI(value).replace(/%/g, "%25");
} catch(e) {}
// Try to decode as UTF-8 if there's no encoding sequence that we would break.
if (!/%25(?:3B|2F|3F|3A|40|26|3D|2B|24|2C|23)/i.test(value))
try {
value = decodeURI(value)
// 1. decodeURI decodes %25 to %, which creates unintended
// encoding sequences. Re-encode it, unless it's part of
// a sequence that survived decodeURI, i.e. one for:
// ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '#'
// (RFC 3987 section 3.2)
// 2. Re-encode whitespace so that it doesn't get eaten away
// by the location bar (bug 410726).
.replace(/%(?!3B|2F|3F|3A|40|26|3D|2B|24|2C|23)|[\r\n\t]/ig,
encodeURIComponent);
} catch (e) {}
// Encode bidirectional formatting characters.
// (RFC 3987 sections 3.2 and 4.1 paragraph 6)
value = value.replace(/[\u200e\u200f\u202a\u202b\u202c\u202d\u202e]/g,
encodeURIComponent);
state = "valid";
}
@ -2877,6 +2976,7 @@ function FillHistoryMenu(aParent, aMenu)
var webNav = getWebNavigation();
var sessionHistory = webNav.sessionHistory;
var bundle_browser = document.getElementById("bundle_browser");
var count = sessionHistory.count;
var index = sessionHistory.index;
@ -2893,7 +2993,8 @@ function FillHistoryMenu(aParent, aMenu)
{
entry = sessionHistory.getEntryAtIndex(j, false);
if (entry)
createMenuItem(aParent, j, entry.title);
createMenuItem(aParent, j, entry.title || entry.URI.spec,
bundle_browser.getString("tabHistory.goBack"));
}
break;
case "forward":
@ -2903,9 +3004,39 @@ function FillHistoryMenu(aParent, aMenu)
{
entry = sessionHistory.getEntryAtIndex(j, false);
if (entry)
createMenuItem(aParent, j, entry.title);
createMenuItem(aParent, j, entry.title || entry.URI.spec,
bundle_browser.getString("tabHistory.goForward"));
}
break;
case "unified":
if (count <= 1) // don't display the popup for a single item
return false;
var half_length = Math.floor(MAX_HISTORY_MENU_ITEMS / 2);
var start = Math.max(index - half_length, 0);
end = Math.min(start == 0 ? MAX_HISTORY_MENU_ITEMS : index + half_length + 1, count);
if (end == count)
start = Math.max(count - MAX_HISTORY_MENU_ITEMS, 0);
var tooltips = [
bundle_browser.getString("tabHistory.goBack"),
bundle_browser.getString("tabHistory.current"),
bundle_browser.getString("tabHistory.goForward")
];
var classNames = ["unified-nav-back", "unified-nav-current", "unified-nav-forward"];
for (var j = end - 1; j >= start; j--) {
entry = sessionHistory.getEntryAtIndex(j, false);
var tooltip = tooltips[j < index ? 0 : j == index ? 1 : 2];
var className = classNames[j < index ? 0 : j == index ? 1 : 2];
var item = createMenuItem(aParent, j, entry.title || entry.URI.spec, tooltip, className);
if (j == index) { // mark the current history item
item.setAttribute("type", "radio");
item.setAttribute("checked", "true");
}
}
break;
}
return true;
@ -2927,12 +3058,16 @@ function addToUrlbarHistory(aUrlToAdd)
}
}
function createMenuItem( aParent, aIndex, aLabel)
function createMenuItem(aParent, aIndex, aLabel, aTooltipText, aClassName)
{
var menuitem = document.createElement( "menuitem" );
menuitem.setAttribute( "label", aLabel );
menuitem.setAttribute( "index", aIndex );
aParent.appendChild( menuitem );
if (aTooltipText)
menuitem.setAttribute("tooltiptext", aTooltipText);
if (aClassName)
menuitem.className = aClassName;
return aParent.appendChild(menuitem);
}
function deleteHistoryItems(aParent)
@ -2951,6 +3086,12 @@ function toJavaScriptConsole()
toOpenWindowByType("global:console", "chrome://global/content/console.xul");
}
function BrowserDownloadsUI()
{
Cc["@mozilla.org/download-manager-ui;1"].
getService(Ci.nsIDownloadManagerUI).show();
}
function toOpenWindowByType(inType, uri, features)
{
var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
@ -3025,6 +3166,8 @@ function BrowserCustomizeToolbar()
var cmd = document.getElementById("cmd_CustomizeToolbars");
cmd.setAttribute("disabled", "true");
UnifiedBackForwardButton.separate();
var splitter = document.getElementById("urlbar-search-splitter");
if (splitter)
splitter.parentNode.removeChild(splitter);
@ -3061,8 +3204,13 @@ function BrowserToolboxCustomizeDone(aToolboxChanged)
gHomeButton.updateTooltip();
gIdentityHandler._cacheElements();
window.XULBrowserWindow.init();
#ifndef XP_MACOSX
updateEditUIVisibility();
#endif
}
UnifiedBackForwardButton.unify();
UpdateUrlbarSearchSplitterState();
// Update the urlbar
@ -3101,6 +3249,67 @@ function BrowserToolboxCustomizeDone(aToolboxChanged)
#endif
}
/**
* Update the global flag that tracks whether or not any edit UI (the Edit menu,
* edit-related items in the context menu, and edit-related toolbar buttons
* is visible, then update the edit commands' enabled state accordingly. We use
* this flag to skip updating the edit commands on focus or selection changes
* when no UI is visible to improve performance (including pageload performance,
* since focus changes when you load a new page).
*
* If UI is visible, we use goUpdateGlobalEditMenuItems to set the commands'
* enabled state so the UI will reflect it appropriately.
*
* If the UI isn't visible, we enable all edit commands so keyboard shortcuts
* still work and just lazily disable them as needed when the user presses a
* shortcut.
*
* This doesn't work on Mac, since Mac menus flash when users press their
* keyboard shortcuts, so edit UI is essentially always visible on the Mac,
* and we need to always update the edit commands. Thus on Mac this function
* is a no op.
*/
function updateEditUIVisibility()
{
#ifndef XP_MACOSX
let editMenuPopupState = document.getElementById("menu_EditPopup").state;
let contextMenuPopupState = document.getElementById("contentAreaContextMenu").state;
let placesContextMenuPopupState = document.getElementById("placesContext").state;
// The UI is visible if the Edit menu is opening or open, if the context menu
// is open, or if the toolbar has been customized to include the Cut, Copy,
// or Paste toolbar buttons.
gEditUIVisible = editMenuPopupState == "showing" ||
editMenuPopupState == "open" ||
contextMenuPopupState == "showing" ||
contextMenuPopupState == "open" ||
placesContextMenuPopupState == "showing" ||
placesContextMenuPopupState == "open" ||
document.getElementById("cut-button") ||
document.getElementById("copy-button") ||
document.getElementById("paste-button") ? true : false;
// If UI is visible, update the edit commands' enabled state to reflect
// whether or not they are actually enabled for the current focus/selection.
if (gEditUIVisible)
goUpdateGlobalEditMenuItems();
// Otherwise, enable all commands, so that keyboard shortcuts still work,
// then lazily determine their actual enabled state when the user presses
// a keyboard shortcut.
else {
goSetCommandEnabled("cmd_undo", true);
goSetCommandEnabled("cmd_redo", true);
goSetCommandEnabled("cmd_cut", true);
goSetCommandEnabled("cmd_copy", true);
goSetCommandEnabled("cmd_paste", true);
goSetCommandEnabled("cmd_selectAll", true);
goSetCommandEnabled("cmd_delete", true);
goSetCommandEnabled("cmd_switchTextDirection", true);
}
#endif
}
var FullScreen =
{
toggle: function()
@ -3279,7 +3488,10 @@ nsBrowserStatusHandler.prototype =
setOverLink : function(link, b)
{
this.overLink = link;
// Encode bidirectional formatting characters.
// (RFC 3987 sections 3.2 and 4.1 paragraph 6)
this.overLink = link.replace(/[\u200e\u200f\u202a\u202b\u202c\u202d\u202e]/g,
encodeURIComponent);
this.updateStatusField();
},
@ -3363,6 +3575,11 @@ nsBrowserStatusHandler.prototype =
var browser = gBrowser.mCurrentBrowser;
if (!gBrowser.mTabbedMode && !browser.mIconURL)
gBrowser.useDefaultIcon(gBrowser.mCurrentTab);
if (Components.isSuccessCode(aStatus) &&
content.document.documentElement.getAttribute("manifest")) {
OfflineApps.offlineAppRequested(content);
}
}
}
@ -4821,6 +5038,117 @@ var BrowserOffline = {
}
};
var OfflineApps = {
/////////////////////////////////////////////////////////////////////////////
// OfflineApps Public Methods
init: function ()
{
// XXX: empty init left as a placeholder for patch in bug 397417
},
uninit: function ()
{
// XXX: empty uninit left as a placeholder for patch in bug 397417
},
/////////////////////////////////////////////////////////////////////////////
// OfflineApps Implementation Methods
// XXX: _getBrowserWindowForContentWindow and _getBrowserForContentWindow
// were taken from browser/components/feeds/src/WebContentConverter.
_getBrowserWindowForContentWindow: function(aContentWindow) {
return aContentWindow.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShellTreeItem)
.rootTreeItem
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindow)
.wrappedJSObject;
},
_getBrowserForContentWindow: function(aBrowserWindow, aContentWindow) {
// This depends on pseudo APIs of browser.js and tabbrowser.xml
aContentWindow = aContentWindow.top;
var browsers = aBrowserWindow.getBrowser().browsers;
for (var i = 0; i < browsers.length; ++i) {
if (browsers[i].contentWindow == aContentWindow)
return browsers[i];
}
},
offlineAppRequested: function(aContentWindow) {
var browserWindow = this._getBrowserWindowForContentWindow(aContentWindow);
var browser = this._getBrowserForContentWindow(browserWindow,
aContentWindow);
var currentURI = browser.webNavigation.currentURI;
var pm = Cc["@mozilla.org/permissionmanager;1"].
getService(Ci.nsIPermissionManager);
// don't bother showing UI if the user has already made a decision
if (pm.testExactPermission(currentURI, "offline-app") !=
Ci.nsIPermissionManager.UNKNOWN_ACTION)
return;
try {
if (gPrefService.getBoolPref("offline-apps.allow_by_default")) {
// all pages can use offline capabilities, no need to ask the user
return;
}
} catch(e) {
// this pref isn't set by default, ignore failures
}
var notificationBox = gBrowser.getNotificationBox(browser);
var notification = notificationBox.getNotificationWithValue("offline-app-requested");
if (!notification) {
var bundle_browser = document.getElementById("bundle_browser");
var buttons = [{
label: bundle_browser.getString("offlineApps.allow"),
accessKey: bundle_browser.getString("offlineApps.allowAccessKey"),
callback: function() { OfflineApps.allowSite(); }
}];
const priority = notificationBox.PRIORITY_INFO_LOW;
var message = bundle_browser.getFormattedString("offlineApps.available",
[ currentURI.host ]);
notificationBox.appendNotification(message, "offline-app-requested",
"chrome://browser/skin/Info.png",
priority, buttons);
}
},
allowSite: function() {
var currentURI = gBrowser.selectedBrowser.webNavigation.currentURI;
var pm = Cc["@mozilla.org/permissionmanager;1"].
getService(Ci.nsIPermissionManager);
pm.add(currentURI, "offline-app", Ci.nsIPermissionManager.ALLOW_ACTION);
// When a site is enabled while loading, <link rel="offline-resource">
// resources will start fetching immediately. This one time we need to
// do it ourselves.
this._startFetching();
},
_startFetching: function() {
var manifest = content.document.documentElement.getAttribute("manifest");
if (!manifest)
return;
var ios = Cc["@mozilla.org/network/io-service;1"].
getService(Ci.nsIIOService);
var contentURI = ios.newURI(content.location.href, null, null);
var manifestURI = ios.newURI(manifest, content.document.characterSet,
contentURI);
var updateService = Cc["@mozilla.org/offlinecacheupdate-service;1"].
getService(Ci.nsIOfflineCacheUpdateService);
updateService.scheduleUpdate(manifestURI, contentURI);
}
};
function WindowIsClosing()
{
var browser = getBrowser();
@ -5744,14 +6072,21 @@ IdentityHandler.prototype = {
this._identityPopupContentVerif.textContent = verifier;
},
hideIdentityPopup : function() {
this._identityPopup.hidePopup();
},
/**
* Click handler for the identity-box element in primary chrome.
*/
handleIdentityClick : function(event) {
handleIdentityButtonEvent : function(event) {
event.stopPropagation();
if (event.button != 0)
return; // We only want left-clicks
if ((event.type == "click" && event.button != 0) ||
(event.type == "keypress" && event.charCode != KeyEvent.DOM_VK_SPACE &&
event.keyCode != KeyEvent.DOM_VK_RETURN))
return; // Left click, space or enter only
// Make sure that the display:none style we set in xul is removed now that
// the popup is actually needed
@ -5780,3 +6115,110 @@ function getIdentityHandler() {
gIdentityHandler = new IdentityHandler();
return gIdentityHandler;
}
let DownloadMonitorPanel = {
//////////////////////////////////////////////////////////////////////////////
//// DownloadMonitorPanel Member Variables
_panel: null,
_activeStr: null,
_pausedStr: null,
_lastTime: Infinity,
//////////////////////////////////////////////////////////////////////////////
//// DownloadMonitorPanel Public Methods
/**
* Initialize the status panel and member variables
*/
init: function DMP_init() {
// Initialize "private" member variables
this._panel = document.getElementById("download-monitor");
// Cache the status strings
let (bundle = document.getElementById("bundle_browser")) {
this._activeStr = bundle.getString("activeDownloads");
this._pausedStr = bundle.getString("pausedDownloads");
}
this.updateStatus();
},
/**
* Update status based on the number of active and paused downloads
*/
updateStatus: function DMP_updateStatus() {
let numActive = gDownloadMgr.activeDownloadCount;
// Hide the panel and reset the "last time" if there's no downloads
if (numActive == 0) {
this._panel.hidden = true;
this._lastTime = Infinity;
return;
}
// Find the download with the longest remaining time
let numPaused = 0;
let maxTime = -Infinity;
let dls = gDownloadMgr.activeDownloads;
while (dls.hasMoreElements()) {
let dl = dls.getNext().QueryInterface(Ci.nsIDownload);
if (dl.state == gDownloadMgr.DOWNLOAD_DOWNLOADING) {
// Figure out if this download takes longer
if (dl.speed > 0 && dl.size > 0)
maxTime = Math.max(maxTime, (dl.size - dl.amountTransferred) / dl.speed);
else
maxTime = -1;
}
else if (dl.state == gDownloadMgr.DOWNLOAD_PAUSED)
numPaused++;
}
// Get the remaining time string and last sec for time estimation
let timeLeft;
[timeLeft, this._lastSec] = DownloadUtils.getTimeLeft(maxTime, this._lastSec);
// Figure out how many downloads are currently downloading
let numDls = numActive - numPaused;
let status = this._activeStr;
// If all downloads are paused, show the paused message instead
if (numDls == 0) {
numDls = numPaused;
status = this._pausedStr;
}
// Get the correct plural form and insert the number of downloads and time
// left message if necessary
status = PluralForm.get(numDls, status);
status = status.replace("#1", numDls);
status = status.replace("#2", timeLeft);
// Update the panel and show it
this._panel.label = status;
this._panel.hidden = false;
},
//////////////////////////////////////////////////////////////////////////////
//// nsIDownloadProgressListener
/**
* Update status for download progress changes
*/
onProgressChange: function() {
this.updateStatus();
},
/**
* Update status for download state changes
*/
onDownloadStateChange: function() {
this.updateStatus();
},
//////////////////////////////////////////////////////////////////////////////
//// nsISupports
QueryInterface: XPCOMUtils.generateQI([Ci.nsIDownloadProgressListener]),
};

View File

@ -106,7 +106,8 @@
<panel type="autocomplete-richlistbox" chromedir="&locale.dir;" id="PopupAutoCompleteRichResult" noautofocus="true" hidden="true"/>
<panel id="editBookmarkPanel" orient="vertical" hidden="true"
onpopupshown="PlacesCommandHook.editBookmarkPanelShown();">
onpopupshown="PlacesCommandHook.editBookmarkPanelShown();"
label="&bookmarkPageCmd2.label;">
<vbox id="editBookmarkPanelContent" flex="1"/>
<hbox flex="1">
<spacer flex="1"/>
@ -137,20 +138,22 @@
</popup>
<popup id="contentAreaContextMenu"
onpopupshowing="if (event.target != this) return true; gContextMenu = new nsContextMenu(this, window.getBrowser()); return gContextMenu.shouldDisplay;"
onpopuphiding="if (event.target == this) { gContextMenu = null; }">
onpopupshowing="if (event.target != this) return true; updateEditUIVisibility(); gContextMenu = new nsContextMenu(this, window.getBrowser()); return gContextMenu.shouldDisplay;"
onpopuphiding="if (event.target == this) { gContextMenu = null; updateEditUIVisibility(); }">
#include browser-context.inc
</popup>
<popup id="placesContext"/>
<!-- Popup for site identity information -->
<panel id="identity-popup" position="after_start" hidden="true" noautofocus="true">
<panel id="identity-popup" position="after_start" hidden="true" noautofocus="true"
onpopupshown="document.getElementById('identity-popup-more-info-link').focus();"
onpopuphidden="focusAndSelectUrlBar();" norestorefocus="true">
<hbox id="identity-popup-container" align="top">
<image id="identity-popup-icon"/>
<vbox id="identity-popup-content-box">
<!-- Title Bar -->
<label id="identity-popup-title"/>
<label id="identity-popup-title" control="identity-popup"/>
<!-- Content area -->
<description id="identity-popup-content"/>
<description id="identity-popup-content-supplemental"/>
@ -167,6 +170,7 @@
<label id="identity-popup-more-info-link"
class="text-link plain"
value="&identity.moreInfoLinkText;"
onblur="getIdentityHandler().hideIdentityPopup();"
onclick="getIdentityHandler().handleMoreInfoClick(event);"/>
</vbox>
</hbox>
@ -269,8 +273,9 @@
pageproxystate="invalid">
<!-- Use onclick instead of normal popup= syntax since the popup
code fires onmousedown, and hence eats our favicon drag events -->
<box id="identity-box"
onclick="getIdentityHandler().handleIdentityClick(event);">
<box id="identity-box" role="button"
onclick="getIdentityHandler().handleIdentityButtonEvent(event);"
onkeypress="getIdentityHandler().handleIdentityButtonEvent(event);">
<hbox align="center">
<deck id="page-proxy-deck" onclick="PageProxyClickHandler(event);">
<image id="page-proxy-button"
@ -465,6 +470,9 @@
<statusbar class="chromeclass-status" id="status-bar"
ondragdrop="nsDragAndDrop.drop(event, contentAreaDNDObserver);">
<statusbarpanel id="statusbar-display" label="" flex="1"/>
<statusbarpanel id="download-monitor" class="statusbarpanel-iconic-text"
tooltiptext="&downloadMonitor.tooltip;" hidden="true"
ondblclick="doCommand();" command="Tools:Downloads"/>
<statusbarpanel class="statusbarpanel-progress" collapsed="true" id="statusbar-progresspanel">
<progressmeter class="progressmeter-statusbar" id="statusbar-icon" mode="normal" value="0"/>
</statusbarpanel>

View File

@ -464,7 +464,7 @@
</ul>
</div>
<p id="gecko" class="center">&credit.poweredByGecko;&reg;</p>
<p id="gecko" class="center">&credit.poweredByGeckoReg;</p>
<p class="footnote">
&brandFullName;&trade; &license.part0; &copy;1998-2008 &license.part1;

View File

@ -83,6 +83,11 @@ function nsContextMenu(aXulMenu, aBrowser) {
this.shouldDisplay = true;
this.isDesignMode = false;
this.possibleSpellChecking = false;
this.ellipsis = "\u2026";
try {
this.ellipsis = gPrefService.getComplexValue("intl.ellipsis",
Ci.nsIPrefLocalizedString).data;
} catch (e) { }
// Initialize new menu.
this.initMenu(aXulMenu, aBrowser);
@ -249,7 +254,7 @@ nsContextMenu.prototype = {
if (hostLabel) {
var shortenedUriHost = hostLabel.replace(/^www\./i,"");
if (shortenedUriHost.length > 15)
shortenedUriHost = shortenedUriHost.substr(0,15) + "...";
shortenedUriHost = shortenedUriHost.substr(0,15) + this.ellipsis;
blockImage.label = gNavigatorBundle.getFormattedString("blockImages", [shortenedUriHost]);
if (this.isImageBlocked())
@ -839,9 +844,10 @@ nsContextMenu.prototype = {
var uri = this.target.QueryInterface(Ci.nsIImageLoadingContent).currentURI;
permissionmanager.add(uri, "image",
aBlock ? Ci.nsIPermissionManager.DENY_ACTION :
Ci.nsIPermissionManager.ALLOW_ACTION);
if (aBlock)
permissionmanager.add(uri, "image", Ci.nsIPermissionManager.DENY_ACTION);
else
permissionmanager.remove(uri.host, "image");
var brandBundle = document.getElementById("bundle_brand");
var app = brandBundle.getString("brandShortName");
@ -1035,7 +1041,7 @@ nsContextMenu.prototype = {
return false;
if (selectedText.length > 15)
selectedText = selectedText.substr(0,15) + "...";
selectedText = selectedText.substr(0,15) + this.ellipsis;
// Use the current engine if the search bar is visible, the default
// engine otherwise.

View File

@ -823,97 +823,87 @@ function makePreview(row)
{
var imageTree = document.getElementById("imagetree");
var item = getSelectedImage(imageTree);
var col = imageTree.columns["image-address"];
var url = gImageView.getCellText(row, col);
// image-bg
var url = gImageView.data[row][COL_IMAGE_ADDRESS];
var isBG = gImageView.data[row][COL_IMAGE_BG];
setItemValue("imageurltext", url);
if (item.hasAttribute("title"))
setItemValue("imagetitletext", item.title);
else
setItemValue("imagetitletext", null);
if (item.hasAttribute("longDesc"))
setItemValue("imagelongdesctext", item.longDesc);
else
setItemValue("imagelongdesctext", null);
if (item.hasAttribute("alt"))
setItemValue("imagealttext", item.alt);
else if (item instanceof HTMLImageElement || isBG)
setItemValue("imagealttext", null);
else
setItemValue("imagealttext", getValueText(item));
var imageText;
if (!isBG &&
#ifdef MOZ_SVG
if (item instanceof SVGImageElement) {
setItemValue("imagetitletext", null);
setItemValue("imagelongdesctext", null);
setItemValue("imagealttext", null);
}
!(item instanceof SVGImageElement) &&
#endif
!(gDocument instanceof ImageDocument)) {
imageText = item.title || item.alt;
if (!imageText && !(item instanceof HTMLImageElement))
imageText = getValueText(item);
}
setItemValue("imagetext", imageText);
setItemValue("imagelongdesctext", item.longDesc);
// get cache info
var sourceText = gBundle.getString("generalNotCached");
var cacheKey = url.replace(/#.*$/, "");
try {
// open for READ, in non-blocking mode
var cacheEntryDescriptor = httpCacheSession.openCacheEntry(cacheKey, ACCESS_READ, false);
if (cacheEntryDescriptor)
switch (cacheEntryDescriptor.deviceID) {
case "disk":
sourceText = gBundle.getString("generalDiskCache");
break;
case "memory":
sourceText = gBundle.getString("generalMemoryCache");
break;
default:
sourceText = cacheEntryDescriptor.deviceID;
break;
}
}
catch(ex) {
try {
// open for READ, in non-blocking mode
cacheEntryDescriptor = ftpCacheSession.openCacheEntry(cacheKey, ACCESS_READ, false);
if (cacheEntryDescriptor)
switch (cacheEntryDescriptor.deviceID) {
case "disk":
sourceText = gBundle.getString("generalDiskCache");
break;
case "memory":
sourceText = gBundle.getString("generalMemoryCache");
break;
default:
sourceText = cacheEntryDescriptor.deviceID;
break;
}
}
catch(ex2) { }
}
setItemValue("imagesourcetext", sourceText);
// find out the file size
var sizeText;
if (cacheEntryDescriptor) {
var pageSize = cacheEntryDescriptor.dataSize;
var kbSize = Math.round(pageSize / 1024 * 100) / 100;
var imageSize = cacheEntryDescriptor.dataSize;
var kbSize = Math.round(imageSize / 1024 * 100) / 100;
sizeText = gBundle.getFormattedString("generalSize",
[formatNumber(kbSize), formatNumber(pageSize)]);
[formatNumber(kbSize), formatNumber(imageSize)]);
}
else
sizeText = gBundle.getString("mediaUnknownNotCached");
setItemValue("imagesizetext", sizeText);
var mimeType;
var numFrames = 1;
if (item instanceof HTMLObjectElement ||
item instanceof HTMLEmbedElement ||
item instanceof HTMLLinkElement)
mimeType = item.type;
if (!mimeType)
mimeType = getContentTypeFromImgRequest(item) ||
getContentTypeFromHeaders(cacheEntryDescriptor);
if (!mimeType && item instanceof nsIImageLoadingContent) {
var imageRequest = item.getRequest(nsIImageLoadingContent.CURRENT_REQUEST);
if (imageRequest) {
mimeType = imageRequest.mimeType;
var image = imageRequest.image;
if (image)
numFrames = image.numFrames;
}
}
if (!mimeType)
mimeType = getContentTypeFromHeaders(cacheEntryDescriptor);
if (mimeType) {
// We found the type, try to display it nicely
var imageMimeType = /^image\/(.*)/.exec(mimeType);
if (imageMimeType) {
mimeType = imageMimeType[1].toUpperCase();
if (numFrames > 1)
mimeType = gBundle.getFormattedString("mediaAnimatedImageType",
[mimeType, numFrames]);
else
mimeType = gBundle.getFormattedString("mediaImageType", [mimeType]);
}
}
else {
// We couldn't find the type, fall back to the value in the treeview
mimeType = gImageView.data[row][COL_IMAGE_TYPE];
}
setItemValue("imagetypetext", mimeType);
var imageContainer = document.getElementById("theimagecontainer");
@ -974,18 +964,21 @@ function makePreview(row)
}
var imageSize = "";
if (url)
imageSize = gBundle.getFormattedString("mediaSize",
[formatNumber(width),
formatNumber(height)]);
setItemValue("imageSize", imageSize);
var physSize = "";
if (width != physWidth || height != physHeight)
physSize = gBundle.getFormattedString("mediaSize",
[formatNumber(physWidth),
formatNumber(physHeight)]);
setItemValue("physSize", physSize);
if (url) {
if (width != physWidth || height != physHeight) {
imageSize = gBundle.getFormattedString("mediaDimensionsScaled",
[formatNumber(physWidth),
formatNumber(physHeight),
formatNumber(width),
formatNumber(height)]);
}
else {
imageSize = gBundle.getFormattedString("mediaDimensions",
[formatNumber(width),
formatNumber(height)]);
}
}
setItemValue("imagedimensiontext", imageSize);
makeBlockImage(url);
@ -1047,21 +1040,6 @@ function getContentTypeFromHeaders(cacheEntryDescriptor)
.exec(cacheEntryDescriptor.getMetaDataElement("response-head")))[1];
}
function getContentTypeFromImgRequest(item)
{
var httpRequest;
try {
var imageItem = item.QueryInterface(nsIImageLoadingContent);
var imageRequest = imageItem.getRequest(nsIImageLoadingContent.CURRENT_REQUEST);
if (imageRequest)
httpRequest = imageRequest.mimeType;
}
catch (ex) { } // This never happened. ;)
return httpRequest;
}
//******** Other Misc Stuff
// Modified from the Links Panel v2.3, http://segment7.net/mozilla/links/links.html
// parse a node to extract the contents of the node

View File

@ -232,57 +232,42 @@
</tree>
<splitter orient="vertical" id="mediaSplitter"/>
<vbox flex="1" id="mediaPreviewBox" collapsed="true">
<grid>
<grid id="mediaGrid">
<columns>
<column/>
<column id="mediaLabelColumn"/>
<column class="gridSeparator"/>
<column flex="1"/>
</columns>
<rows>
<row>
<label control="imageurltext" value="&mediaURL;"/>
<label control="imageurltext" value="&mediaLocation;"/>
<separator/>
<textbox readonly="true" id="imageurltext"/>
</row>
<row>
<label control="imagetitletext" value="&mediaTitle;"/>
<separator/>
<textbox readonly="true" id="imagetitletext"/>
</row>
<row>
<label control="imagealttext" value="&mediaAlt;"/>
<separator/>
<textbox readonly="true" id="imagealttext"/>
</row>
<row>
<label control="imagelongdesctext" value="&mediaLongdesc;"/>
<separator/>
<textbox readonly="true" id="imagelongdesctext"/>
</row>
<row>
<label control="imagetypetext" value="&generalType;"/>
<separator/>
<textbox readonly="true" id="imagetypetext"/>
</row>
<row>
<label control="imagesourcetext" value="&generalSource;"/>
<separator/>
<textbox readonly="true" id="imagesourcetext"/>
</row>
<row>
<label control="imagesizetext" value="&generalSize;"/>
<separator/>
<textbox readonly="true" id="imagesizetext"/>
</row>
<row>
<label control="imageSize" value="&mediaDimensions;"/>
<label control="imagedimensiontext" value="&mediaDimension;"/>
<separator/>
<textbox readonly="true" id="imageSize"/>
<textbox readonly="true" id="imagedimensiontext"/>
</row>
<row>
<label control="physSize" value="&mediaPhysDimensions;"/>
<label control="imagetext" value="&mediaText;"/>
<separator/>
<textbox readonly="true" id="physSize"/>
<textbox readonly="true" id="imagetext"/>
</row>
<row>
<label control="imagelongdesctext" value="&mediaLongdesc;"/>
<separator/>
<textbox readonly="true" id="imagelongdesctext"/>
</row>
</rows>
</grid>

View File

@ -123,6 +123,28 @@ Sanitizer.prototype = {
}
},
offlineApps: {
clear: function ()
{
const Cc = Components.classes;
const Ci = Components.interfaces;
var cacheService = Cc["@mozilla.org/network/cache-service;1"].
getService(Ci.nsICacheService);
try {
cacheService.evictEntries(Ci.nsICache.STORE_OFFLINE);
} catch(er) {}
var storageManagerService = Cc["@mozilla.org/dom/storagemanager;1"].
getService(Ci.nsIDOMStorageManager);
storageManagerService.clearOfflineApps();
},
get canClear()
{
return true;
}
},
history: {
clear: function ()
{

View File

@ -124,6 +124,7 @@
<preference id="privacy.item.downloads" name="privacy.item.downloads" type="bool" readonly="true"/>
<preference id="privacy.item.cookies" name="privacy.item.cookies" type="bool" readonly="true"/>
<preference id="privacy.item.cache" name="privacy.item.cache" type="bool" readonly="true"/>
<preference id="privacy.item.offlineApps" name="privacy.item.offlineApps" type="bool"/>
<preference id="privacy.item.sessions" name="privacy.item.sessions" type="bool" readonly="true"/>
</preferences>
@ -149,6 +150,10 @@
accesskey="&itemCookies.accesskey;"
preference="privacy.item.cookies"
onsyncfrompreference="return gSanitizePromptDialog.onReadGeneric();"/>
<checkbox label="&itemOfflineApps.label;"
accesskey="&itemOfflineApps.accesskey;"
preference="privacy.item.offlineApps"
onsyncfrompreference="return gSanitizePromptDialog.onReadGeneric();"/>
<checkbox label="&itemPasswords.label;"
accesskey="&itemPasswords.accesskey;"
preference="privacy.item.passwords"

View File

@ -92,8 +92,8 @@
oncommand="var tabbrowser = this.parentNode.parentNode.parentNode.parentNode;
tabbrowser.removeAllTabsBut(tabbrowser.mContextTab);"/>
<xul:menuseparator/>
<xul:menuitem label="&bookmarkCurTab.label;"
accesskey="&bookmarkCurTab.accesskey;"
<xul:menuitem label="&bookmarkThisTab.label;"
accesskey="&bookmarkThisTab.accesskey;"
oncommand="BookmarkThisTab();"/>
<xul:menuitem label="&bookmarkAllTabs.label;"
accesskey="&bookmarkAllTabs.accesskey;"
@ -2128,9 +2128,10 @@
<parameter name="aFlags"/>
<parameter name="aReferrerURI"/>
<parameter name="aCharset"/>
<parameter name="aPostData"/>
<body>
<![CDATA[
return this.mCurrentBrowser.loadURIWithFlags(aURI, aFlags, aReferrerURI, aCharset);
return this.mCurrentBrowser.loadURIWithFlags(aURI, aFlags, aReferrerURI, aCharset, aPostData);
]]>
</body>
</method>

View File

@ -13,6 +13,7 @@ browser.jar:
* content/browser/aboutDialog.xul (content/aboutDialog.xul)
* content/browser/aboutDialog.js (content/aboutDialog.js)
content/browser/aboutDialog.css (content/aboutDialog.css)
* content/browser/bindings.xml (content/bindings.xml)
* content/browser/browser.css (content/browser.css)
* content/browser/browser.js (content/browser.js)
* content/browser/browser.xul (content/browser.xul)

View File

@ -20,7 +20,7 @@ PREF_JS_EXPORTS = $(srcdir)/pref/firefox-branding.js
include $(topsrcdir)/config/rules.mk
BROWSER_APP_FILES = \
default.xpm \
default16.png \
mozicon128.png \
mozicon16.xpm \
mozicon50.xpm \

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 744 B

View File

@ -509,7 +509,7 @@ BrowserGlue.prototype = {
}
finally {
prefBranch.setBoolPref("browser.places.createdSmartBookmarks", true);
prefBranch.savePrefFile(null);
prefBranch.QueryInterface(Ci.nsIPrefService).savePrefFile(null);
}
},

View File

@ -425,6 +425,7 @@ PlacesController.prototype = {
nodeData["dynamiccontainer"] = true;
break;
case Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER:
case Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT:
nodeData["folder"] = true;
break;
case Ci.nsINavHistoryResultNode.RESULT_TYPE_HOST:

View File

@ -438,14 +438,14 @@ var gEditItemOverlay = {
if (tags.length > 0 || currentTags.length > 0) {
var tagsToRemove = [];
var tagsToAdd = [];
var t;
for each (t in currentTags) {
if (tags.indexOf(t) == -1)
tagsToRemove.push(t);
var i;
for (i = 0; i < currentTags.length; i++) {
if (tags.indexOf(currentTags[i]) == -1)
tagsToRemove.push(currentTags[i]);
}
for each (t in tags) {
if (currentTags.indexOf(t) == -1)
tagsToAdd.push(t);
for (i = 0; i < tags.length; i++) {
if (currentTags.indexOf(tags[i]) == -1)
tagsToAdd.push(tags[i]);
}
if (tagsToAdd.length > 0)
@ -643,7 +643,8 @@ var gEditItemOverlay = {
// Update folder-tree selection
if (!this._folderTree.collapsed) {
var selectedNode = this._folderTree.selectedNode;
if (!selectedNode || selectedNode.itemId != container)
if (!selectedNode ||
PlacesUtils.getConcreteItemId(selectedNode) != container)
this._folderTree.selectItems([container]);
}
},
@ -653,7 +654,7 @@ var gEditItemOverlay = {
if (!selectedNode)
return;
var folderId = selectedNode.itemId;
var folderId = PlacesUtils.getConcreteItemId(selectedNode);
if (this._getFolderIdFromMenuList() == folderId)
return;
@ -682,7 +683,8 @@ var gEditItemOverlay = {
var tagsInField = this._getTagsArrayFromTagField();
var allTags = PlacesUtils.tagging.allTags;
for each (var tag in allTags) {
for (var i = 0; i < allTags.length; i++) {
var tag = allTags[i];
var elt = document.createElement("listitem");
elt.setAttribute("type", "checkbox");
elt.setAttribute("label", tag);

View File

@ -511,17 +511,17 @@
var index = -1;
var folderId = 0;
if (PlacesUtils.nodeIsFolder(this._resultNode))
folderId = this._resultNode.itemId;
folderId = PlacesUtils.getConcreteItemId(this._resultNode);
if (this.hasSelection) {
if (PlacesUtils.nodeIsFolder(this.selectedNode)) {
// If there is a folder selected, the insertion point is the
// end of the folder.
folderId = this.selectedNode.itemId;
folderId = PlacesUtils.getConcreteItemId(this.selectedNode);
} else {
// If there is another type of node selected, the insertion point
// is after that node.
folderId = this.selectedNode.parent.itemId;
folderId = PlacesUtils.getConcreteItemId(this.selectedNode.parent);
index = PlacesUtils.getIndexOfNode(this.selectedNode)
}
}

View File

@ -395,17 +395,17 @@
// By default, the insertion point is at the top level, at the end.
var index = -1;
var folderId = this._result.root.itemId;
var folderId = PlacesUtils.getConcreteItemId(this._result.root);
if (this.hasSelection) {
if (PlacesUtils.nodeIsFolder(this.selectedNode)) {
// If there is a folder selected, the insertion point is the
// end of the folder.
folderId = this.selectedNode.itemId;
folderId = PlacesUtils.getConcreteItemId(this.selectedNode);
} else {
// If there is another type of node selected, the insertion point
// is after that node.
index = PlacesUtils.getIndexOfNode(this.selectedNode)
index = PlacesUtils.getIndexOfNode(this.selectedNode);
}
}
this._cachedInsertionPoint = new InsertionPoint(folderId, index, 1);
@ -756,13 +756,17 @@
// 50%, drop into the folder. If it's past that, drop to the right.
if (event.clientX < xulNode.boxObject.x + (xulNode.boxObject.width * 0.25)) {
// Drop to the left of this folder.
dropPoint.ip = new InsertionPoint(result.root.itemId, i, -1);
dropPoint.ip =
new InsertionPoint(PlacesUtils.getConcreteItemId(result.root),
i, -1);
dropPoint.beforeIndex = i;
return dropPoint;
}
else if (event.clientX < xulNode.boxObject.x + (xulNode.boxObject.width * 0.75)) {
// Drop inside this folder.
dropPoint.ip = new InsertionPoint(xulNode.node.itemId, -1, 1);
dropPoint.ip =
new InsertionPoint(PlacesUtils.getConcreteItemId(xulNode.node),
-1, 1);
dropPoint.beforeIndex = i;
dropPoint.folderNode = xulNode;
return dropPoint;
@ -772,14 +776,18 @@
// drop to the left of the folder. If it's right, drop to the right.
if (event.clientX < xulNode.boxObject.x + (xulNode.boxObject.width / 2)) {
// Drop to the left of this bookmark.
dropPoint.ip = new InsertionPoint(result.root.itemId, i, -1);
dropPoint.ip =
new InsertionPoint(PlacesUtils.getConcreteItemId(result.root),
i, -1);
dropPoint.beforeIndex = i;
return dropPoint;
}
}
}
// Should drop to the right of the last node.
dropPoint.ip = new InsertionPoint(result.root.itemId, -1, 1);
dropPoint.ip =
new InsertionPoint(PlacesUtils.getConcreteItemId(result.root),
-1, 1);
dropPoint.beforeIndex = -1;
return dropPoint;
},

View File

@ -512,10 +512,11 @@
//
// If the sole selection is the bookmarks toolbar folder, we insert
// into it even if it is not opened
var itemId =
PlacesUtils.getConcreteItemId(resultView.nodeForTreeIndex(max.value));
if (this.hasSingleSelection && resultView.isContainer(max.value) &&
(resultView.isContainerOpen(max.value) ||
resultView.nodeForTreeIndex(max.value)
.itemId == PlacesUtils.bookmarksMenuFolderId))
itemId == PlacesUtils.bookmarksMenuFolderId))
orientation = NHRVO.DROP_ON;
this._cachedInsertionPoint =
@ -528,10 +529,8 @@
<parameter name="aContainer"/>
<body><![CDATA[
// Disallow insertion of items under readonly folders
// Disallow insertion of items under the places root
return (!PlacesUtils.nodeIsFolder(aContainer) ||
PlacesUtils.nodeIsReadOnly(aContainer) ||
aContainer.itemId == PlacesUtils.placesRootId);
PlacesUtils.nodeIsReadOnly(aContainer));
]]></body>
</method>
@ -581,7 +580,8 @@
if (this._disallowInsertion(container))
return null;
return new InsertionPoint(container.itemId, index, orientation);
return new InsertionPoint(PlacesUtils.getConcreteItemId(container),
index, orientation);
]]></body>
</method>
@ -627,7 +627,13 @@
function findNodes(node) {
var foundOne = false;
// See if node matches an ID we wanted; add to results.
// For simple folder queries, check both itemId and the concrete
// item id.
var index = ids.indexOf(node.itemId);
if (index == -1 &&
node.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT)
index = ids.indexOf(asQuery(node).folderItemId);
if (index != -1) {
nodes.push(node);
foundOne = true;

View File

@ -375,16 +375,17 @@ PlacesTreeView.prototype = {
// restore selection
if (previouslySelectedNodes.length > 0) {
for each (var nodeInfo in previouslySelectedNodes) {
for (var i = 0; i < previouslySelectedNodes.length; i++) {
var nodeInfo = previouslySelectedNodes[i];
var index = nodeInfo.node.viewIndex;
// if the same node was used (happens on sorting-changes),
// just use viewIndex
if (index == -1) { // otherwise, try to find an equal node
var itemId = nodeInfo.node.itemId;
var itemId = PlacesUtils.getConcreteItemId(nodeInfo.node);
if (itemId != 1) { // bookmark-nodes in queries case
for (i=0; i < newElements.length && index == -1; i++) {
if (newElements[i].itemId == itemId)
if (PlacesUtils.getConcreteItemId(newElements[i]) == itemId)
index = newElements[i].viewIndex;
}
}
@ -592,10 +593,13 @@ PlacesTreeView.prototype = {
// At the end of the child list without finding a visible sibling: This
// is a little harder because we don't know how many rows the last item
// in our list takes up (it could be a container with many children).
var lastRowCount =
this._countVisibleRowsForItem(aParent.getChild(aNewIndex - 1));
newViewIndex =
aParent.getChild(aNewIndex - 1).viewIndex + lastRowCount;
var prevChild = aParent.getChild(aNewIndex - 1);
newViewIndex = prevChild.viewIndex + this._countVisibleRowsForItem(prevChild);
// If we were in the same parent and we are swapping the order, we need to adjust
if (prevChild.parent == aItem.parent &&
aItem.viewIndex != -1 && // view index may not be set
prevChild.viewIndex > aItem.viewIndex)
newViewIndex--;
}
}
@ -685,7 +689,8 @@ PlacesTreeView.prototype = {
if (selection.getRangeCount() == 1) {
var min = { }, max = { };
selection.getRangeAt(0, min, max);
if (min.value == max.value)
if (min.value == max.value &&
this.nodeForTreeIndex(min.value) == aItem)
selectNext = true;
}
@ -779,7 +784,8 @@ PlacesTreeView.prototype = {
// restore selection
if (nodesToSelect.length > 0) {
for each (var node in nodesToSelect) {
for (var i = 0; i < nodesToSelect.length; i++) {
var node = nodesToSelect[i];
var index = node.viewIndex;
selection.rangedSelect(index, index, true);
}
@ -1009,25 +1015,27 @@ PlacesTreeView.prototype = {
var node = this._visibleElements[aRow];
// To disable the tree gestures for containers (e.g. double-click to open)
// we don't mark container nodes as such in flat list mode. The container
// appearance is desired though, so we add the container atom manually.
if (this._flatList && PlacesUtils.nodeIsContainer(node))
aProperties.AppendElement(this._getAtomFor("container"));
if (PlacesUtils.nodeIsSeparator(node))
aProperties.AppendElement(this._getAtomFor("separator"));
else if (node.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_QUERY)
aProperties.AppendElement(this._getAtomFor("query"));
else if (node.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER) {
if (PlacesUtils.annotations.itemHasAnnotation(node.itemId,
LMANNO_FEEDURI))
aProperties.AppendElement(this._getAtomFor("livemark"));
else if (PlacesUtils.bookmarks.getFolderIdForItem(node.itemId) ==
PlacesUtils.tagsFolderId) {
aProperties.AppendElement(this._getAtomFor("tagContainer"));
var nodeType = node.type;
if (PlacesUtils.containerTypes.indexOf(nodeType) != -1) {
// To disable the tree gestures for containers (e.g. double-click to open)
// we don't mark container nodes as such in flat list mode. The container
// appearance is desired though, so we add the container atom manually.
if (this._flatList)
aProperties.AppendElement(this._getAtomFor("container"));
if (nodeType == Ci.nsINavHistoryResultNode.RESULT_TYPE_QUERY)
aProperties.AppendElement(this._getAtomFor("query"));
else if (nodeType == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER ||
nodeType == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT) {
if (PlacesUtils.annotations.itemHasAnnotation(node.itemId,
LMANNO_FEEDURI))
aProperties.AppendElement(this._getAtomFor("livemark"));
else if (PlacesUtils.bookmarks.getFolderIdForItem(node.itemId) ==
PlacesUtils.tagsFolderId)
aProperties.AppendElement(this._getAtomFor("tagContainer"));
}
}
else if (nodeType == Ci.nsINavHistoryResultNode.RESULT_TYPE_SEPARATOR)
aProperties.AppendElement(this._getAtomFor("separator"));
},
getColumnProperties: function(aColumn, aProperties) { },

View File

@ -253,7 +253,8 @@ var PlacesUtils = {
*/
nodeIsFolder: function PU_nodeIsFolder(aNode) {
NS_ASSERT(aNode, "null node");
return (aNode.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER);
return (aNode.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER ||
aNode.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT);
},
/**
@ -331,7 +332,7 @@ var PlacesUtils = {
NS_ASSERT(aNode, "null node");
if (this.nodeIsFolder(aNode))
return this.bookmarks.getFolderReadonly(aNode.itemId);
return this.bookmarks.getFolderReadonly(asQuery(aNode).folderItemId);
if (this.nodeIsQuery(aNode))
return asQuery(aNode).childrenReadOnly;
return false;
@ -355,6 +356,7 @@ var PlacesUtils = {
* @returns true if the node is a container item, false otherwise
*/
containerTypes: [Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER,
Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT,
Ci.nsINavHistoryResultNode.RESULT_TYPE_QUERY,
Ci.nsINavHistoryResultNode.RESULT_TYPE_HOST,
Ci.nsINavHistoryResultNode.RESULT_TYPE_DAY,
@ -414,7 +416,17 @@ var PlacesUtils = {
NS_ASSERT(aNode, "null node");
return this.nodeIsFolder(aNode) &&
this.bookmarks.getFolderReadonly(aNode.itemId);
this.bookmarks.getFolderReadonly(asQuery(aNode).folderItemId);
},
/**
* Gets the concrete item-id for the given node. Generally, this is just
* node.itemId, but for folder-shortcuts that's node.folderItemId.
*/
getConcreteItemId: function PU_getConcreteItemId(aNode) {
if (aNode.type == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER_SHORTCUT)
return asQuery(aNode).folderItemId;
return aNode.itemId;
},
/**
@ -1566,8 +1578,9 @@ var PlacesUtils = {
getMostRecentBookmarkForURI:
function PU_getMostRecentBookmarkForURI(aURI) {
var bmkIds = this.bookmarks.getBookmarkIdsForURI(aURI, {});
for each (var bk in bmkIds) {
for (var i = 0; i < bmkIds.length; i++) {
// Find the first folder which isn't a tag container
var bk = bmkIds[i];
var parent = this.bookmarks.getFolderIdForItem(bk);
if (parent == this.unfiledBookmarksFolderId)
return bk;
@ -1688,7 +1701,8 @@ var PlacesUtils = {
*/
_openTabset: function PU__openTabset(aItemsToOpen, aEvent) {
var urls = [];
for each (var item in aItemsToOpen) {
for (var i = 0; i < aItemsToOpen.length; i++) {
var item = aItemsToOpen[i];
if (item.isBookmark)
this.markPageAsFollowedBookmark(item.uri);
else

View File

@ -55,6 +55,7 @@ var gAdvancedPane = {
this.updateAppUpdateItems();
this.updateAutoItems();
this.updateModeItems();
this.updateOfflineApps();
},
/**
@ -179,6 +180,94 @@ var gAdvancedPane = {
} catch(ex) {}
},
/**
* Updates the list of offline applications
*/
updateOfflineApps: function ()
{
var pm = Components.classes["@mozilla.org/permissionmanager;1"]
.getService(Components.interfaces.nsIPermissionManager);
var list = document.getElementById("offlineAppsList");
while (list.firstChild) {
list.removeChild(list.firstChild);
}
var enumerator = pm.enumerator;
while (enumerator.hasMoreElements()) {
var perm = enumerator.getNext().QueryInterface(Components.interfaces.nsIPermission);
if (perm.type == "offline-app" &&
perm.capability != Components.interfaces.nsIPermissionManager.DEFAULT_ACTION &&
perm.capability != Components.interfaces.nsIPermissionManager.DENY_ACTION) {
var row = document.createElementNS(kXULNS, "listitem");
row.id = "";
row.className = "listitem";
row.setAttribute("label", perm.host);
list.appendChild(row);
}
}
},
offlineAppSelected: function()
{
var removeButton = document.getElementById("offlineAppsListRemove");
var list = document.getElementById("offlineAppsList");
if (list.selectedItem) {
removeButton.setAttribute("disabled", "false");
} else {
removeButton.setAttribute("disabled", "true");
}
},
removeOfflineApp: function()
{
var list = document.getElementById("offlineAppsList");
var item = list.selectedItem;
var host = item.getAttribute("label");
var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);
var flags = prompts.BUTTON_TITLE_IS_STRING * prompts.BUTTON_POS_0 +
prompts.BUTTON_TITLE_CANCEL * prompts.BUTTON_POS_1;
var bundle = document.getElementById("bundlePreferences");
var title = bundle.getString("offlineAppRemoveTitle");
var prompt = bundle.getFormattedString("offlineAppRemovePrompt", [host]);
var confirm = bundle.getString("offlineAppRemoveConfirm");
var result = prompts.confirmEx(window, title, prompt, flags, confirm,
null, null, null, {});
if (result != 0)
return;
// clear offline cache entries
var cacheService = Components.classes["@mozilla.org/network/cache-service;1"]
.getService(Components.interfaces.nsICacheService);
var cacheSession = cacheService.createSession("HTTP-offline",
Components.interfaces.nsICache.STORE_OFFLINE,
true)
.QueryInterface(Components.interfaces.nsIOfflineCacheSession);
cacheSession.clearKeysOwnedByDomain(host);
cacheSession.evictUnownedEntries();
// send out an offline-app-removed signal. The nsDOMStorage
// service will clear DOM storage for this host.
var obs = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
obs.notifyObservers(null, "offline-app-removed", host);
// remove the permission
var pm = Components.classes["@mozilla.org/permissionmanager;1"]
.getService(Components.interfaces.nsIPermissionManager);
pm.remove(host, "offline-app",
Components.interfaces.nsIPermissionManager.ALLOW_ACTION);
pm.remove(host, "offline-app",
Components.interfaces.nsIOfflineCacheUpdateService.ALLOW_NO_WARN);
list.removeChild(item);
gAdvancedPane.offlineAppSelected();
},
// UPDATE TAB
/*

View File

@ -24,6 +24,7 @@
# Contributor(s):
# Ben Goodger <ben@mozilla.org>
# Jeff Walden <jwalden+code@mit.edu>
# Ehsan Akhgari <ehsan.akhgari@gmail.com>
#
# 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
@ -214,9 +215,9 @@
</hbox>
</groupbox>
<!-- Cache -->
<groupbox id="cacheGroup">
<caption label="&cache.label;"/>
<!-- Cache/Offline apps -->
<groupbox id="offlineGroup">
<caption label="&offlineStorage.label;"/>
<hbox align="center">
<label id="useCacheBefore"
@ -231,7 +232,26 @@
label="&clearCacheNow.label;" accesskey="&clearCacheNow.accesskey;"
oncommand="gAdvancedPane.clearCache();"/>
</hbox>
</groupbox>
<hbox>
<vbox flex="1">
<label id="offlineAppsListLabel">&offlineAppsList.label;</label>
<listbox id="offlineAppsList"
style="height: &offlineAppsList.height;;"
flex="1"
aria-labelledby="offlineAppsListLabel"
onselect="gAdvancedPane.offlineAppSelected(event);">
</listbox>
</vbox>
<vbox pack="end">
<button id="offlineAppsListRemove"
disabled="true"
label="&offlineAppsListRemove.label;"
accesskey="&offlineAppsListRemove.accesskey;"
oncommand="gAdvancedPane.removeOfflineApp();"/>
</vbox>
</hbox>
</groupbox>
</tabpanel>
<!-- Update -->
@ -315,7 +335,7 @@
<groupbox id="certificatesGroup">
<caption id="CertGroupCaption" label="&certificates.label;"/>
<description id="CertSelectionDesc" control="certSelection">&certselect.description;</description>
<description id="CertSelectionDesc" control="certSelection">&certSelection.description;</description>
<!--
The values on these radio buttons may look like l12y issues, but

View File

@ -850,10 +850,16 @@ var gApplicationsPane = {
// Figure out how we should be sorting the list. We persist sort settings
// across sessions, so we can't assume the default sort column/direction.
// XXX should we be using the XUL sort service instead?
if (document.getElementById("typeColumn").hasAttribute("sortDirection"))
this._sortColumn = document.getElementById("typeColumn");
else if (document.getElementById("actionColumn").hasAttribute("sortDirection"))
if (document.getElementById("actionColumn").hasAttribute("sortDirection")) {
this._sortColumn = document.getElementById("actionColumn");
// The typeColumn element always has a sortDirection attribute,
// either because it was persisted or because the default value
// from the xul file was used. If we are sorting on the other
// column, we should remove it.
document.getElementById("typeColumn").removeAttribute("sortDirection");
}
else
this._sortColumn = document.getElementById("typeColumn");
// Load the data and build the list of handlers.
// By doing this in a timeout, we let the preferences dialog resize itself
@ -1016,19 +1022,20 @@ var gApplicationsPane = {
// Get the preferences that help determine what types to show.
var showPlugins = this._prefSvc.getBoolPref(PREF_SHOW_PLUGINS_IN_LIST);
var hideTypesWithoutExtensions =
var hidePluginsWithoutExtensions =
this._prefSvc.getBoolPref(PREF_HIDE_PLUGINS_WITHOUT_EXTENSIONS);
for (let type in this._handledTypes) {
let handlerInfo = this._handledTypes[type];
// Hide types without extensions if so prefed so we don't show a whole
// bunch of obscure types handled by plugins on Mac.
// Hide plugins without associated extensions if so prefed so we don't
// show a whole bunch of obscure types handled by plugins on Mac.
// Note: though protocol types don't have extensions, we still show them;
// the pref is only meant to be applied to MIME types.
// FIXME: if the type has a plugin, should we also check the "suffixes"
// property of the plugin? Filed as bug 395135.
if (hideTypesWithoutExtensions &&
// the pref is only meant to be applied to MIME types, since plugins are
// only associated with MIME types.
// FIXME: should we also check the "suffixes" property of the plugin?
// Filed as bug 395135.
if (hidePluginsWithoutExtensions && handlerInfo.handledOnlyByPlugin &&
handlerInfo.wrappedHandlerInfo instanceof Ci.nsIMIMEInfo &&
!handlerInfo.primaryExtension)
continue;

View File

@ -270,6 +270,18 @@ var gCookiesWindow = {
{
var removeCount = aCount === undefined ? 1 : aCount;
if (this._filtered) {
// remove the cookies from the unfiltered set so that they
// don't reappear when the filter is changed. See bug 410863.
for (var i = aIndex; i < aIndex + removeCount; ++i) {
var item = this._filterSet[i];
var parent = gCookiesWindow._hosts[item.rawHost];
for (var j = 0; j < parent.cookies.length; ++j) {
if (item == parent.cookies[j]) {
parent.cookies.splice(j, 1);
break;
}
}
}
this._filterSet.splice(aIndex, removeCount);
return;
}

View File

@ -62,6 +62,7 @@
<preference id="privacy.item.downloads" name="privacy.item.downloads" type="bool"/>
<preference id="privacy.item.cookies" name="privacy.item.cookies" type="bool"/>
<preference id="privacy.item.cache" name="privacy.item.cache" type="bool"/>
<preference id="privacy.item.offlineApps" name="privacy.item.offlineApps" type="bool"/>
<preference id="privacy.item.sessions" name="privacy.item.sessions" type="bool"/>
</preferences>
@ -82,6 +83,9 @@
<checkbox label="&itemCookies.label;"
accesskey="&itemCookies.accesskey;"
preference="privacy.item.cookies"/>
<checkbox label="&itemOfflineApps.label;"
accesskey="&itemOfflineApps.accesskey;"
preference="privacy.item.offlineApps"/>
<checkbox label="&itemPasswords.label;"
accesskey="&itemPasswords.accesskey;"
preference="privacy.item.passwords"/>

View File

@ -90,12 +90,16 @@ function PROT_MalwareWarden() {
updateSuccess: function(requestedTimeout) { }
};
dbService_.beginUpdate(listener);
dbService_.beginStream();
dbService_.updateStream(testUpdate);
dbService_.finishStream();
dbService_.finishUpdate();
try {
dbService_.beginUpdate(listener);
dbService_.beginStream();
dbService_.updateStream(testUpdate);
dbService_.finishStream();
dbService_.finishUpdate();
} catch(ex) {
// beginUpdate will throw harmlessly if there's an existing update
// in progress, ignore failures.
}
G_Debug(this, "malwareWarden initialized");
}

View File

@ -26,6 +26,7 @@
# Ben Goodger <beng@google.com>
# Pamela Greene <pamg.bugs@gmail.com>
# Michael Ventnor <m.ventnor@gmail.com>
# Ehsan Akhgari <ehsan.akhgari@gmail.com>
#
# 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
@ -91,8 +92,7 @@
<xul:menuitem class="open-engine-manager"
anonid="open-engine-manager"
label="&cmd_engineManager.label;"
oncommand="openManager(event);"
accesskey="&cmd_engineManager.accesskey;"/>
oncommand="openManager(event);"/>
</xul:menupopup>
</xul:button>
<xul:hbox class="search-go-container">
@ -552,7 +552,11 @@
<handler event="DOMMouseScroll"
phase="capturing"
action="this.selectEngine(event, (event.detail > 0));"/>
#ifdef XP_MACOSX
action="if (event.metaKey) this.selectEngine(event, (event.detail > 0));"/>
#else
action="if (event.ctrlKey) this.selectEngine(event, (event.detail > 0));"/>
#endif
</handlers>
</binding>

View File

@ -427,7 +427,7 @@ SuggestAutoComplete.prototype = {
},
/**
* Makes a note of the fact that we've recieved a backoff-triggering
* Makes a note of the fact that we've received a backoff-triggering
* response, so that we can adjust the backoff behavior appropriately.
*/
_noteServerError: function SAC__noteServeError() {

View File

@ -865,8 +865,6 @@ SessionStoreService.prototype = {
tabData.index = 1;
}
tabData.zoom = browser.markupDocumentViewer.textZoom;
var disallow = [];
for (var i = 0; i < CAPABILITIES.length; i++)
if (!browser.docShell["allow" + CAPABILITIES[i]])
@ -1502,8 +1500,6 @@ SessionStoreService.prototype = {
tab.__SS_extdata = tabData.extData;
}
browser.markupDocumentViewer.textZoom = parseFloat(tabData.zoom || 1);
for (var i = 0; i < tabData.entries.length; i++) {
history.addEntry(this._deserializeHistoryEntry(tabData.entries[i], aIdMap), true);
}

View File

@ -1157,8 +1157,6 @@ function Application() {
os.addObserver(this, "final-ui-startup", false);
os.addObserver(this, "quit-application-requested", false);
os.addObserver(this, "quit-application-granted", false);
os.addObserver(this, "quit-application", false);
os.addObserver(this, "xpcom-shutdown", false);
}
@ -1221,11 +1219,7 @@ Application.prototype = {
.getService(Ci.nsIObserverService);
os.removeObserver(this, "final-ui-startup");
os.removeObserver(this, "quit-application-requested");
os.removeObserver(this, "quit-application-granted");
os.removeObserver(this, "quit-application");
os.removeObserver(this, "xpcom-shutdown");
this._info = null;

View File

@ -39,6 +39,7 @@ searchplugins/yahoo.gif
searchplugins/
#ifdef MOZ_ENABLE_LIBXUL
@DLL_PREFIX@xpcom_core@DLL_SUFFIX@
@DLL_PREFIX@xpistub@DLL_SUFFIX@
components/@DLL_PREFIX@jar50@DLL_SUFFIX@
#ifdef XP_WIN
components/jsd3250.dll
@ -59,7 +60,6 @@ component.reg
components/compreg.dat
components/@DLL_PREFIX@myspell@DLL_SUFFIX@
components/@DLL_PREFIX@spellchecker@DLL_SUFFIX@
components/spellchecker.xpt
components/@DLL_PREFIX@spellchk@DLL_SUFFIX@
components/xpti.dat
components/xptitemp.dat
@ -90,6 +90,7 @@ extensions/reporter@mozilla.org/chrome/reporter.jar
extensions/reporter@mozilla.org/defaults/preferences/reporter.js
extensions/inspector@mozilla.org/components/inspector.xpt
extensions/inspector@mozilla.org/components/@DLL_PREFIX@inspector@DLL_SUFFIX@
extensions/inspector@mozilla.org/chrome/icons/default/winInspectorMain.ico
uninstall/UninstallFirefox.exe
uninstall/UninstallDeerPark.exe
uninstall/uninst.exe
@ -522,8 +523,8 @@ extensions/talkback@mozilla.org/components/talkback/Talkback.app/Contents/Resour
#else
extensions/talkback@mozilla.org/components/talkback/talkback
extensions/talkback@mozilla.org/components/talkback/XTalkback.ad
extensions/talkback@mozilla.org/components/master.ini
extensions/talkback@mozilla.org/components/talkback.so
extensions/talkback@mozilla.org/components/talkback/master.ini
extensions/talkback@mozilla.org/components/talkback/talkback.so
#endif
#endif
components/airbag.xpt
@ -546,4 +547,35 @@ res/fonts/mathfontMath4.properties
res/fonts/mathfontMTExtra.properties
res/fonts/mathfontPUA.properties
res/fonts/mathfontSymbol.properties
res/fonts/fontEncoding.properties
res/fonts/pangoFontEncoding.properties
res/fonts/fontNameMap.properties
@DLL_PREFIX@xpcom_compat@DLL_SUFFIX@
components/nsDictionary.js
components/nsXmlRpcClient.js
components/nsInterfaceInfoToIDL.js
chrome/chromelist.txt
#ifdef XP_MACOSX
LICENSE
extensions/inspector@mozilla.org/chrome/chromelist.txt
components/accessibility.xpt
components/gksvgrenderer.xpt
components/jsconsole.xpt
components/necko_data.xpt
components/nsKillAll.js
components/passwordmgr.xpt
components/progressDlg.xpt
components/search.xpt
components/websrvcs.xpt
components/widget_mac.xpt
components/xml-rpc.xpt
components/xpcom_obsolete.xpt
init.d/README
redo-prebinding.sh
res/viewer.properties
#endif
#ifdef XP_UNIX
readme.txt
#endif
dictionaries/PL.dic
dictionaries/PL.aff

View File

@ -760,6 +760,13 @@ Destination=[SETUP PATH]
Fail If Exists=FALSE
Do Not Uninstall=FALSE
[Copy File9]
Timing=post smartupdate
Source=[$GRE_INSTALL_DIR]\nssutil3.dll
Destination=[SETUP PATH]
Fail If Exists=FALSE
Do Not Uninstall=FALSE
[Path Lookup $GRE_INSTALL_DIR]
Path Reg Key Root=HKEY_LOCAL_MACHINE
Path Reg Key=Software\mozilla.org\GRE\$GreUniqueID$\Main

View File

@ -54,6 +54,7 @@ bin/res/cmessage.txt
bin/res/effective_tld_names.dat
bin/xpicleanup
bin/libsqlite3.so
bin/README.txt
; [Components]
bin/components/alerts.xpt
@ -161,6 +162,7 @@ bin/components/satchel.xpt
bin/components/saxparser.xpt
bin/components/search.xpt
bin/components/shistory.xpt
bin/components/spellchecker.xpt
bin/components/storage.xpt
bin/components/profile.xpt
bin/components/toolkitprofile.xpt
@ -271,7 +273,7 @@ bin/chrome/comm.jar
bin/chrome/comm.manifest
bin/chrome/toolkit.jar
bin/chrome/toolkit.manifest
bin/chrome/icons/default/default.xpm
bin/chrome/icons/default/default16.png
bin/chrome/reporter.manifest
bin/chrome/reporter.jar
bin/@PREF_DIR@/reporter.js
@ -348,6 +350,7 @@ bin/components/pipboot.xpt
bin/components/pipnss.xpt
bin/components/pippki.xpt
bin/libnss3.so
bin/libnssutil3.so
bin/libsmime3.so
bin/libsoftokn3.chk
bin/libsoftokn3.so
@ -375,6 +378,8 @@ bin/updater
;
bin/crashreporter
bin/crashreporter.ini
bin/crashreporter-override.ini
bin/Throbber-small.gif
; [Extensions]
;

View File

@ -182,6 +182,7 @@ bin\components\widget.xpt
bin\components\windowds.xpt
bin\components\windowwatcher.xpt
bin\components\shellservice.xpt
bin\components\spellchecker.xpt
bin\components\xpcom_base.xpt
bin\components\xpcom_system.xpt
bin\components\xpcom_components.xpt
@ -331,6 +332,7 @@ bin\nssckbi.dll
bin\components\pipboot.xpt
bin\components\pipnss.xpt
bin\components\pippki.xpt
bin\nssutil3.dll
bin\nss3.dll
bin\smime3.dll
bin\softokn3.chk
@ -349,6 +351,7 @@ bin\updater.exe
; [Crash Reporter]
bin\crashreporter.exe
bin\crashreporter.ini
bin\crashreporter-override.ini
; [Additional Developer Tools]
[adt]

View File

@ -315,3 +315,8 @@ else
endif
endif
endif
ifdef MOZ_CRASHREPORTER
libs:: $(addprefix $(LOCALE_SRCDIR)/,crashreporter/crashreporter-override.ini)
$(SYSINSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)
endif

View File

@ -4,7 +4,6 @@
<!ENTITY aboutLink "&lt; About &brandFullName;">
<!ENTITY aboutLink.accesskey "A">
<!ENTITY aboutVersion "version">
<!ENTITY copyrightText "&#169;1998-2008 Contributors. All Rights Reserved. Firefox and the
<!ENTITY copyrightInfo "&#169;1998-2008 Contributors. All Rights Reserved. Firefox and the
Firefox logos are trademarks of the Mozilla Foundation. All rights
reserved. Some trademark rights used under license from The
Charlton Company.">
reserved.">

View File

@ -49,6 +49,10 @@
<!ENTITY fullScreenMinimize.tooltip "Minimize">
<!ENTITY fullScreenRestore.tooltip "Restore">
<!ENTITY fullScreenClose.tooltip "Close">
<!ENTITY fullScreenAutohide.label "Hide Toolbars">
<!ENTITY fullScreenAutohide.accesskey "H">
<!ENTITY fullScreenExit.label "Exit Full Screen Mode">
<!ENTITY fullScreenExit.accesskey "F">
<!ENTITY closeWindow.label "Close Window">
<!ENTITY closeWindow.accesskey "d">
@ -227,18 +231,20 @@
<!ENTITY viewPageInfoCmd.accesskey "I">
<!ENTITY viewFrameInfoCmd.label "View Frame Info">
<!ENTITY viewFrameInfoCmd.accesskey "I">
<!ENTITY showImageCmd.label "Show Image">
<!ENTITY showImageCmd.accesskey "S">
<!ENTITY viewImageCmd.label "View Image">
<!ENTITY viewImageCmd.accesskey "I">
<!ENTITY viewBGImageCmd.label "View Background Image">
<!ENTITY viewBGImageCmd.accesskey "w">
<!ENTITY setDesktopBackgroundCmd.label "Set As Desktop Background…">
<!ENTITY setDesktopBackgroundCmd.accesskey "S">
<!ENTITY bookmarkPageCmd.label "Bookmark This Page">
<!ENTITY bookmarkPageCmd.accesskey "m">
<!ENTITY bookmarkLinkCmd.label "Bookmark This Link">
<!ENTITY bookmarkLinkCmd.accesskey "L">
<!ENTITY bookmarkFrameCmd.label "Bookmark This Frame">
<!ENTITY bookmarkFrameCmd.accesskey "m">
<!ENTITY bookmarkPageCmd2.label "Bookmark This Page">
<!ENTITY bookmarkPageCmd2.accesskey "m">
<!ENTITY bookmarkThisLinkCmd.label "Bookmark This Link">
<!ENTITY bookmarkThisLinkCmd.accesskey "L">
<!ENTITY bookmarkThisFrameCmd.label "Bookmark This Frame">
<!ENTITY bookmarkThisFrameCmd.accesskey "m">
<!ENTITY sendPageCmd.label "Send Link…">
<!ENTITY sendPageCmd.accesskey "e">
<!ENTITY savePageCmd.label "Save Page As…">
@ -260,6 +266,8 @@
<!ENTITY sendImageCmd.accesskey "n">
<!ENTITY copyLinkCmd.label "Copy Link Location">
<!ENTITY copyLinkCmd.accesskey "a">
<!ENTITY copyLinkTextCmd.label "Copy Link Text">
<!ENTITY copyLinkTextCmd.accesskey "x">
<!ENTITY copyImageCmd.label "Copy Image Location">
<!ENTITY copyImageCmd.accesskey "o">
<!ENTITY copyImageContentsCmd.label "Copy Image">
@ -283,6 +291,8 @@
<!ENTITY fullZoomResetCmd.commandkey "0">
<!ENTITY fullZoomResetCmd.label "Reset">
<!ENTITY fullZoomResetCmd.accesskey "R">
<!ENTITY fullZoomToggleCmd.label "Zoom Text Only">
<!ENTITY fullZoomToggleCmd.accesskey "T">
<!ENTITY fullZoom.label "Zoom">
<!ENTITY fullZoom.accesskey "Z">
@ -339,10 +349,12 @@
<!ENTITY findAgainCmd.commandkey "g">
<!ENTITY findAgainCmd.commandkey2 "VK_F3">
<!ENTITY spellAddDictionaries.label "Add dictionaries…">
<!ENTITY spellAddDictionaries.label "Add Dictionaries…">
<!ENTITY spellAddDictionaries.accesskey "A">
<!ENTITY editBookmark.done.label "Done">
<!ENTITY editBookmark.delete.label "Delete">
<!ENTITY identity.moreInfoLinkText "Tell me more about this web site…">
<!ENTITY downloadMonitor.tooltip "Double-click to open downloads window">

View File

@ -81,6 +81,11 @@ feedHasFeedsNew=Subscribe to this page…
menuOpenAllInTabs.label=Open All in Tabs
menuOpenAllInTabs.accesskey=o
# Unified Back-/Forward Popup
tabHistory.current=Stay on this page
tabHistory.goBack=Go back to this page
tabHistory.goForward=Go forward to this page
# Block autorefresh
refreshBlocked.goButton=Allow
refreshBlocked.goButton.accesskey=A
@ -91,6 +96,11 @@ refreshBlocked.redirectLabel=%S prevented this page from automatically redirecti
starButtonOn.tooltip=Edit this bookmark
starButtonOff.tooltip=Bookmark this page
# Offline web applications
offlineApps.available=This website (%S) is offering to store data on your computer for offline use.
offlineApps.allow=Allow
offlineApps.allowAccessKey=A
# Identity information
identity.domainverified.title=Location Verified
identity.domainverified.body=You are currently visiting:
@ -107,3 +117,11 @@ identity.unknown.body=This web site does not supply identity information.
identity.encrypted=Your connection to this web site is encrypted to prevent eavesdropping.
identity.unencrypted=Your connection to this web site is not encrypted.
# Downloads Monitor Panel
# LOCALIZATION NOTE (activeDownloads, pausedDownloads): Semi-colon list of plural
# forms. See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
# #1 number of downloads; #2 time left
# examples: One active download (2 minutes remaining); 11 paused downloads
activeDownloads=One active download (#2);#1 active downloads (#2)
pausedDownloads=One paused download;#1 paused downloads

View File

@ -16,4 +16,4 @@
<!ENTITY credit.translation "">
<!ENTITY credit.memory "In Fond Memory Of">
<!ENTITY credit.poweredByGecko "Powered by Gecko&trade;">
<!ENTITY credit.poweredByGeckoReg "Powered by Gecko&reg;">

View File

@ -8,6 +8,37 @@ subscribeNow=Subscribe Now
chooseApplicationMenuItem=Choose Application…
chooseApplicationDialogTitle=Choose Application
alwaysUse=Always use %S to subscribe to feeds
mediaLabel=Media files
# LOCALIZATION NOTE: The next string is for the size of the enclosed media.
# e.g. enclosureSizeText : "50.23 MB"
# %1$S = size (in bytes or megabytes, ...)
# %2$S = unit of measure (bytes, KB, MB, ...)
enclosureSizeText=%1$S %2$S
bytes=bytes
kilobyte=KB
megabyte=MB
gigabyte=GB
# LOCALIZATION NOTE: The next three strings explains to the user what they're
# doing.
# e.g. alwaysUseForVideoPodcasts : "Always use Miro to subscribe to video podcasts."
# %S = application to use (Miro, iTunes, ...)
alwaysUseForFeeds=Always use %S to subscribe to feeds.
alwaysUseForPodcasts=Always use %S to subscribe to podcasts.
alwaysUseForVideoPodcasts=Always use %S to subscribe to video podcasts.
subscribeFeedUsing=Subscribe to this feed using
subscribePodcastUsing=Subscribe to this podcast using
subscribeVideoPodcastUsing=Subscribe to this video podcast using
# "This is a "xyz" of frequently changing content on this site."
feedsubscription1=This is a "%S" of frequently changing content on this site.
feedsubscription2=You can subscribe to this %S to receive updates when this content changes.
webFeed=feed
videoPodcastFeed=video podcast
audioPodcastFeed=podcast
# Protocol Handling
# "Add %appName (%appDomain) as an application for %protocolType links?"

View File

@ -65,16 +65,14 @@
<!ENTITY mediaTab "Media">
<!ENTITY mediaTab.accesskey "M">
<!ENTITY mediaURL "Address:">
<!ENTITY mediaAlt "Alternate Text:">
<!ENTITY mediaLocation "Location:">
<!ENTITY mediaText "Associated Text:">
<!ENTITY mediaAltHeader "Alternate Text">
<!ENTITY mediaAddress "Address">
<!ENTITY mediaType "Type">
<!ENTITY mediaSize "Size">
<!ENTITY mediaCount "Count">
<!ENTITY mediaDimensions "Specified Dimensions:">
<!ENTITY mediaPhysDimensions "Actual Dimensions:">
<!ENTITY mediaTitle "Title:">
<!ENTITY mediaDimension "Dimensions:">
<!ENTITY mediaLongdesc "Long Description:">
<!ENTITY mediaBlockImage.accesskey "B">
<!ENTITY mediaSaveAs "Save As…">

View File

@ -57,6 +57,11 @@ mediaFileSize=%S KB
mediaSize=%Spx \u00D7 %Spx
mediaSelectFolder=Select a Folder to Save the Images
mediaBlockImage=Block Images from %S
mediaUnknownNotCached=Unknown (not cached)
mediaImageType=%S Image
mediaAnimatedImageType=%S Image (animated, %S frames)
mediaDimensions=%Spx \u00D7 %Spx
mediaDimensionsScaled=%Spx \u00D7 %Spx (scaled to %Spx \u00D7 %Spx)
generalQuirksMode=Quirks mode
generalStrictMode=Standards compliance mode

View File

@ -70,7 +70,7 @@ view.sortBy.keyword.accesskey=K
view.sortBy.description.label=Sort by Description
view.sortBy.description.accesskey=D
view.sortBy.dateAdded.label=Sort by Added
view.sortBy.dateAdded.accesskey=A
view.sortBy.dateAdded.accesskey=e
view.sortBy.lastModified.label=Sort by Last Modified
view.sortBy.lastModified.accesskey=M
view.sortBy.tags.label=Sort by Tags

View File

@ -34,7 +34,7 @@
<!ENTITY connectionSettings.label "Settings…">
<!ENTITY connectionSettings.accesskey "e">
<!ENTITY cache.label "Cache">
<!ENTITY offlineStorage.label "Offline Storage">
<!-- LOCALIZATION NOTE:
The entities useCacheBefore.label and useCacheAfter.label appear on a single
@ -67,6 +67,11 @@
<!ENTITY updateHistory.label "Show Update History">
<!ENTITY updateHistory.accesskey "p">
<!ENTITY offlineAppsList.label "The following websites have data installed for offline use:">
<!ENTITY offlineAppsList.height "7em">
<!ENTITY offlineAppsListRemove.label "Remove…">
<!ENTITY offlineAppsListRemove.accesskey "R">
<!ENTITY offlineAppRemove.confirm "Remove offline data">
<!ENTITY encryptionTab.label "Encryption">
@ -76,7 +81,7 @@
<!ENTITY useTLS1.label "Use TLS 1.0">
<!ENTITY useTLS1.accesskey "1">
<!ENTITY certificates.label "Certificates">
<!ENTITY certselect.description "When a web site requires a certificate:">
<!ENTITY certSelection.description "When a server requests my personal certificate:">
<!ENTITY certs.auto "Select one automatically">
<!ENTITY certs.auto.accesskey "l">
<!ENTITY certs.ask "Ask me every time">

View File

@ -6,6 +6,8 @@
<!ENTITY proxyTitle.label "Configure Proxies to Access the Internet">
<!ENTITY directTypeRadio.label "Direct connection to the Internet">
<!ENTITY directTypeRadio.accesskey "d">
<!ENTITY systemTypeRadio.label "Use system proxy settings">
<!ENTITY systemTypeRadio.accesskey "y">
<!ENTITY WPADTypeRadio.label "Auto-detect proxy settings for this network">
<!ENTITY WPADTypeRadio.accesskey "w">
<!ENTITY manualTypeRadio.label "Manual proxy configuration:">

View File

@ -50,6 +50,8 @@ saveFile=Save File
chooseApp=Choose application…
fpTitleChooseApp=Select Helper Application
webFeed=Web Feed
videoPodcastFeed=Video Podcast
audioPodcastFeed=Podcast
alwaysAsk=Always ask
# LOCALIZATION NOTE (pluginName):
@ -82,3 +84,8 @@ cookiesAll=The following cookies are stored on your computer:
cookiesFiltered=The following cookies match your search:
removeCookies=Remove Cookies
removeCookie=Remove Cookie
#### Offline apps
offlineAppRemoveTitle=Remove offline website data
offlineAppRemovePrompt=After removing this data, %S will not be available offline. Are you sure you want to remove this offline website?
offlineAppRemoveConfirm=Remove offline data

View File

@ -15,6 +15,8 @@
<!ENTITY itemCookies.accesskey "C">
<!ENTITY itemCache.label "Cache">
<!ENTITY itemCache.accesskey "a">
<!ENTITY itemOfflineApps.label "Offline Website Data">
<!ENTITY itemOfflineApps.accesskey "O">
<!ENTITY itemDownloads.label "Download History">
<!ENTITY itemDownloads.accesskey "D">
<!ENTITY itemSessions.label "Authenticated Sessions">

View File

@ -1,3 +1,2 @@
<!ENTITY cmd_engineManager.label "Manage Search Engines…">
<!ENTITY cmd_engineManager.accesskey "M">
<!ENTITY searchEndCap.label "Search">

View File

@ -12,7 +12,7 @@
<!ENTITY listAllTabs.label "List all tabs">
<!ENTITY bookmarkAllTabs.label "Bookmark All Tabs…">
<!ENTITY bookmarkAllTabs.accesskey "T">
<!ENTITY bookmarkCurTab.label "Bookmark This Tab…">
<!ENTITY bookmarkCurTab.accesskey "B">
<!ENTITY bookmarkThisTab.label "Bookmark This Tab">
<!ENTITY bookmarkThisTab.accesskey "B">
<!ENTITY undoCloseTab.label "Undo Close Tab">
<!ENTITY undoCloseTab.accesskey "U">

View File

@ -0,0 +1,5 @@
# This file is in the UTF-8 encoding
[Strings]
# LOCALIZATION NOTE (CrashReporterProductErrorText2): The %s is replaced with a string containing detailed information.
CrashReporterProductErrorText2=Firefox had a problem and crashed. We'll try to restore your tabs and windows when it restarts.\n\nUnfortunately the crash reporter is unable to submit a crash report.\n\nDetails: %s
CrashReporterDescriptionText2=Firefox had a problem and crashed. We'll try to restore your tabs and windows when it restarts.\n\nTo help us diagnose and fix the problem, you can send us a crash report.

View File

@ -3,4 +3,5 @@ answers
creativecommons
eBay
google
wikipedia
yahoo

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