Merge from cvs-trunk-mirror to mozilla-central.
Merge from cvs-trunk-mirror to mozilla-central.
--- a/README.txt
+++ b/README.txt
@@ -1,306 +1,20 @@
-==============================================================
-
-= = = = = = = = = = Mozilla Read Me = = = = = = = = = = =
-
-==============================================================
-
-Mozilla is subject to the terms detailed in the license
-agreement accompanying it.
-
-This Read Me file contains information about system
-requirements and installation instructions for the Windows,
-Mac OS, and Linux builds of Mozilla.
-
-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.
-
-
-==============================================================
-
- 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
+For information on how to build Mozilla from the source code, see:
-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
+ http://developer.mozilla.org/en/docs/Build_Documentation
- -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
-
-==============================================================
+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:
-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.
+ http://developer.mozilla.org/en/docs/Creating_a_patch
+ http://developer.mozilla.org/en/docs/Getting_your_patch_in_the_tree
-
- 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).
+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.]
- 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.
+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:
- 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/
--- a/accessible/public/nsIAccessibleEvent.idl
+++ b/accessible/public/nsIAccessibleEvent.idl
@@ -564,8 +564,22 @@ interface nsIAccessibleTextChangeEvent :
interface nsIAccessibleCaretMoveEvent: nsIAccessibleEvent
{
/**
* Return caret offset.
*/
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;
+};
+
--- a/accessible/public/nsIAccessibleProvider.idl
+++ b/accessible/public/nsIAccessibleProvider.idl
@@ -47,16 +47,22 @@
[scriptable, uuid(3f7f9194-c625-4a85-8148-6d92d34897fa)]
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;
/**
* Constants set is used by XUL controls.
*/
@@ -73,42 +79,43 @@ interface nsIAccessibleProvider : nsISup
const long XULListbox = 0x0000100B;
const long XULListitem = 0x0000100C;
const long XULListHead = 0x00001024;
const long XULListHeader = 0x00001025;
const long XULMenubar = 0x0000100D;
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;
/**
* Constants set is used by XForms elements.
*/
/** Used for xforms elements that provide accessible object for itself as
* well for anonymous content. This property are used for upload,
--- a/accessible/public/nsIAccessibleRole.idl
+++ b/accessible/public/nsIAccessibleRole.idl
@@ -105,19 +105,19 @@ interface nsIAccessibleRole : nsISupport
/**
* Represents the window frame, which contains child objects such as
* a title bar, client, and other objects contained in a window. The role
* is supported automatically by MS Windows.
*/
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
* make a selection to perform an action. It is used for role="menu".
*/
const unsigned long ROLE_MENUPOPUP = 11;
/**
--- a/accessible/public/nsPIAccessible.idl
+++ b/accessible/public/nsPIAccessible.idl
@@ -40,17 +40,17 @@
interface nsIAccessible;
interface nsIAccessibleEvent;
%{C++
struct nsRoleMapEntry;
%}
[ptr] native nsRoleMapEntryPtr(nsRoleMapEntry);
-[uuid(2d552ed0-3f38-4c7f-94c1-419de4d693ed)]
+[uuid(893ee16d-c157-4d5f-b236-60b3b2bef6a5)]
interface nsPIAccessible : nsISupports
{
/**
* Set accessible parent.
*/
void setParent(in nsIAccessible aAccParent);
/**
@@ -78,22 +78,20 @@ interface nsPIAccessible : nsISupports
*/
void invalidateChildren();
/**
* Fire accessible event.
*
* @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.
*/
void fireAccessibleEvent(in nsIAccessibleEvent aAccEvent);
/**
* Return true if there are accessible children in anonymous content
--- a/accessible/src/atk/nsAccessibleWrap.cpp
+++ b/accessible/src/atk/nsAccessibleWrap.cpp
@@ -297,16 +297,17 @@ nsAccessibleWrap::nsAccessibleWrap(nsIDO
#endif
MAI_LOG_DEBUG(("==nsAccessibleWrap creating: this=%p,total=%d left=%d\n",
(void*)this, mAccWrapCreated,
(mAccWrapCreated-mAccWrapDeleted)));
}
nsAccessibleWrap::~nsAccessibleWrap()
{
+ NS_ASSERTION(!mAtkObject, "ShutdownAtkObject() is not called");
#ifdef MAI_LOGGING
++mAccWrapDeleted;
#endif
MAI_LOG_DEBUG(("==nsAccessibleWrap deleting: this=%p,total=%d left=%d\n",
(void*)this, mAccWrapDeleted,
(mAccWrapCreated-mAccWrapDeleted)));
}
@@ -1109,19 +1110,16 @@ nsAccessibleWrap::FireAccessibleEvent(ns
nsCOMPtr<nsIAccessible> accessible;
aEvent->GetAccessible(getter_AddRefs(accessible));
NS_ENSURE_TRUE(accessible, NS_ERROR_FAILURE);
PRUint32 type = 0;
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,
// just return NS_OK in such case
if (!atkObj) {
NS_ASSERTION(type == nsIAccessibleEvent::EVENT_ASYNCH_SHOW ||
type == nsIAccessibleEvent::EVENT_ASYNCH_HIDE ||
type == nsIAccessibleEvent::EVENT_DOM_CREATE ||
@@ -1130,29 +1128,24 @@ nsAccessibleWrap::FireAccessibleEvent(ns
return NS_OK;
}
nsAccessibleWrap *accWrap = GetAccessibleWrap(atkObj);
if (!accWrap) {
return NS_OK; // Node is shut down
}
- AtkTableChange * pAtkTableChange = nsnull;
-
switch (type) {
case nsIAccessibleEvent::EVENT_STATE_CHANGE:
return FireAtkStateChangeEvent(aEvent, atkObj);
case nsIAccessibleEvent::EVENT_TEXT_REMOVED:
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"));
nsRefPtr<nsRootAccessible> rootAccWrap = accWrap->GetRootAccessible();
if (rootAccWrap && rootAccWrap->mActivated) {
atk_focus_tracker_notify(atkObj);
// Fire state change event for focus
nsCOMPtr<nsIAccessibleStateChangeEvent> stateChangeEvent =
@@ -1204,83 +1197,93 @@ nsAccessibleWrap::FireAccessibleEvent(ns
} break;
case nsIAccessibleEvent::EVENT_TABLE_MODEL_CHANGED:
MAI_LOG_DEBUG(("\n\nReceived: EVENT_TABLE_MODEL_CHANGED\n"));
g_signal_emit_by_name(atkObj, "model_changed");
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"));
g_signal_emit_by_name(atkObj, "column_reordered");
break;
case nsIAccessibleEvent::EVENT_SECTION_CHANGED:
MAI_LOG_DEBUG(("\n\nReceived: EVENT_SECTION_CHANGED\n"));
@@ -1432,86 +1435,16 @@ nsAccessibleWrap::FireAtkTextChangedEven
isFromUserInput ? "" : kNonUserInputEvent, NULL);
g_signal_emit_by_name(aObject, signal_name, start, length);
g_free (signal_name);
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)
{
if (aIsAdded)
MAI_LOG_DEBUG(("\n\nReceived: Show event\n"));
else
MAI_LOG_DEBUG(("\n\nReceived: Hide event\n"));
--- a/accessible/src/atk/nsRoleMap.h
+++ b/accessible/src/atk/nsRoleMap.h
@@ -51,17 +51,17 @@ static const PRUint32 atkRoleMap[] = {
ATK_ROLE_MENU_BAR, // nsIAccessibleRole::ROLE_MENUBAR 2
ATK_ROLE_SCROLL_BAR, // nsIAccessibleRole::ROLE_SCROLLBAR 3
ATK_ROLE_UNKNOWN, // nsIAccessibleRole::ROLE_GRIP 4
ATK_ROLE_UNKNOWN, // nsIAccessibleRole::ROLE_SOUND 5
ATK_ROLE_UNKNOWN, // nsIAccessibleRole::ROLE_CURSOR 6
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
ATK_ROLE_EMBEDDED, // nsIAccessibleRole::ROLE_APPLICATION 14
ATK_ROLE_DOCUMENT_FRAME, // nsIAccessibleRole::ROLE_DOCUMENT 15
ATK_ROLE_PANEL, // nsIAccessibleRole::ROLE_PANE 16
ATK_ROLE_CHART, // nsIAccessibleRole::ROLE_CHART 17
ATK_ROLE_DIALOG, // nsIAccessibleRole::ROLE_DIALOG 18
--- a/accessible/src/atk/nsRootAccessibleWrap.cpp
+++ b/accessible/src/atk/nsRootAccessibleWrap.cpp
@@ -41,10 +41,16 @@
#include "nsMai.h"
#include "nsRootAccessibleWrap.h"
nsNativeRootAccessibleWrap::nsNativeRootAccessibleWrap(AtkObject *aAccessible):
nsRootAccessible(nsnull, nsnull)
{
g_object_ref(aAccessible);
- nsAccessibleWrap::mAtkObject = aAccessible;
+ mAtkObject = aAccessible;
}
+
+nsNativeRootAccessibleWrap::~nsNativeRootAccessibleWrap()
+{
+ g_object_unref(mAtkObject);
+ mAtkObject = nsnull;
+}
--- a/accessible/src/atk/nsRootAccessibleWrap.h
+++ b/accessible/src/atk/nsRootAccessibleWrap.h
@@ -50,11 +50,12 @@ typedef nsRootAccessible nsRootAccessibl
* The instance of nsNativeRootAccessibleWrap is a child of MaiAppRoot instance.
* It is added into root when the toplevel window is created, and removed
* from root when the toplevel window is destroyed.
*/
class nsNativeRootAccessibleWrap: public nsRootAccessible
{
public:
nsNativeRootAccessibleWrap(AtkObject *aAccessible);
+ ~nsNativeRootAccessibleWrap();
};
#endif /* __NS_ROOT_ACCESSIBLE_WRAP_H__ */
--- a/accessible/src/base/nsAccessibilityAtomList.h
+++ b/accessible/src/base/nsAccessibilityAtomList.h
@@ -77,16 +77,18 @@ ACCESSIBILITY_ATOM(deckFrame, "DeckFrame
ACCESSIBILITY_ATOM(inlineBlockFrame, "InlineBlockFrame")
ACCESSIBILITY_ATOM(inlineFrame, "InlineFrame")
ACCESSIBILITY_ATOM(objectFrame, "ObjectFrame")
ACCESSIBILITY_ATOM(scrollFrame, "ScrollFrame")
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")
ACCESSIBILITY_ATOM(abbr, "abbr")
ACCESSIBILITY_ATOM(acronym, "acronym")
ACCESSIBILITY_ATOM(area, "area")
ACCESSIBILITY_ATOM(autocomplete, "autocomplete")
ACCESSIBILITY_ATOM(blockquote, "blockquote")
--- a/accessible/src/base/nsAccessibilityService.cpp
+++ b/accessible/src/base/nsAccessibilityService.cpp
@@ -1191,16 +1191,44 @@ nsresult nsAccessibilityService::InitAcc
nsCOMPtr<nsPIAccessible> privateAccessible =
do_QueryInterface(privateAccessNode);
privateAccessible->SetRoleMapEntry(aRoleMapEntry);
NS_ADDREF(*aAccessibleOut = 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,
nsIFrame **aFrameHint,
PRBool *aIsHidden,
nsIAccessible **aAccessible)
{
NS_ENSURE_ARG_POINTER(aAccessible);
@@ -1390,51 +1418,46 @@ NS_IMETHODIMP nsAccessibilityService::Ge
nsIAccessibleRole::ROLE_EQUATION);
}
} else if (!newAcc) { // HTML accessibles
PRBool tryTagNameOrFrame = PR_TRUE;
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;
}
}
if (tryTagNameOrFrame) {
// Prefer to use markup (mostly tag name, perhaps attributes) to
// decide if and what kind of accessible to create.
// The method creates accessibles for table related content too therefore
// we do not call it if accessibles for table related content are
@@ -1468,17 +1491,18 @@ NS_IMETHODIMP nsAccessibilityService::Ge
// If no accessible, see if we need to create a generic accessible because
// of some property that makes this object interesting
// We don't do this for <body>, <html>, <window>, <dialog> etc. which
// correspond to the doc accessible and will be created in any case
if (!newAcc && content->Tag() != nsAccessibilityAtoms::body && content->GetParent() &&
(content->IsFocusable() ||
(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.
if (isHTML) {
// Interesting HTML container which may have selectable text and/or embedded objects
CreateHyperTextAccessible(frame, getter_AddRefs(newAcc));
}
else { // XUL, SVG, MathML etc.
@@ -1601,16 +1625,18 @@ nsresult nsAccessibilityService::GetAcce
return CreateOuterDocAccessible(aNode, aAccessible);
nsCOMPtr<nsIWeakReference> weakShell;
GetShellFromNode(aNode, getter_AddRefs(weakShell));
switch (type)
{
#ifdef MOZ_XUL
+ case nsIAccessibleProvider::NoAccessible:
+ return NS_OK;
// XUL controls
case nsIAccessibleProvider::XULAlert:
*aAccessible = new nsXULAlertAccessible(aNode, weakShell);
break;
case nsIAccessibleProvider::XULButton:
*aAccessible = new nsXULButtonAccessible(aNode, weakShell);
break;
case nsIAccessibleProvider::XULCheckbox:
@@ -1685,16 +1711,19 @@ nsresult nsAccessibilityService::GetAcce
}
#endif
*aAccessible = new nsXULMenupopupAccessible(aNode, weakShell);
break;
}
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;
case nsIAccessibleProvider::XULStatusBar:
*aAccessible = new nsXULStatusBarAccessible(aNode, weakShell);
break;
case nsIAccessibleProvider::XULScale:
*aAccessible = new nsXULSliderAccessible(aNode, weakShell);
--- a/accessible/src/base/nsAccessibilityService.h
+++ b/accessible/src/base/nsAccessibilityService.h
@@ -147,17 +147,17 @@ static const char kRoleNames[][20] = {
"menubar", //ROLE_MENUBAR
"scrollbar", //ROLE_SCROLLBAR
"grip", //ROLE_GRIP
"sound", //ROLE_SOUND
"cursor", //ROLE_CURSOR
"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
"application", //ROLE_APPLICATION
"document", //ROLE_DOCUMENT
"pane", //ROLE_PANE
"chart", //ROLE_CHART
"dialog", //ROLE_DIALOG
--- a/accessible/src/base/nsAccessibilityUtils.cpp
+++ b/accessible/src/base/nsAccessibilityUtils.cpp
@@ -252,17 +252,17 @@ nsAccUtils::FireAccEvent(PRUint32 aEvent
PRBool aIsAsynch)
{
NS_ENSURE_ARG(aAccessible);
nsCOMPtr<nsPIAccessible> pAccessible(do_QueryInterface(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);
}
PRBool
nsAccUtils::IsAncestorOf(nsIDOMNode *aPossibleAncestorNode,
nsIDOMNode *aPossibleDescendantNode)
@@ -582,16 +582,26 @@ nsAccUtils::GetID(nsIContent *aContent,
}
nsIContent*
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;
if (!nsAccUtils::GetID(aForNode, controlID)) {
binding = aForNode->GetBindingParent();
if (binding == aForNode)
return nsnull;
aForNode->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::anonid, controlID);
@@ -633,68 +643,85 @@ nsAccUtils::FindNeighbourPointingToNode(
return nsnull;
nsCOMPtr<nsIContent> content = do_QueryInterface(node);
if (!content)
return nsnull;
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;
}
return labelContent;
}
// Pass in aAriaProperty = null and aRelationAttr == nsnull if any <label> will do
nsIContent*
nsAccUtils::FindDescendantPointingToID(const nsString *aId,
nsIContent *aLookContent,
- nsIAtom *aRelationAttr,
+ nsIAtom **aRelationAttrs,
+ PRUint32 aAttrNum,
nsIContent *aExcludeContent,
nsIAtom *aTagType)
{
// Surround id with spaces for search
nsCAutoString idWithSpaces(' ');
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) {
// Don't bother to search descendants of an element with matching tag.
// That would be like looking for a nested <label> or <description>
return nsnull;
}
}
@@ -702,17 +729,18 @@ nsAccUtils::FindDescendantPointingToIDIm
// Recursively search descendants for match
PRUint32 count = 0;
nsIContent *child;
nsIContent *labelContent = nsnull;
while ((child = aLookContent->GetChildAt(count++)) != nsnull) {
if (child != aExcludeContent) {
labelContent = FindDescendantPointingToIDImpl(aIdWithSpaces, child,
- aRelationAttr, aExcludeContent, aTagType);
+ aRelationAttrs, aAttrNum,
+ aExcludeContent, aTagType);
if (labelContent) {
return labelContent;
}
}
}
return nsnull;
}
--- a/accessible/src/base/nsAccessibilityUtils.h
+++ b/accessible/src/base/nsAccessibilityUtils.h
@@ -272,49 +272,75 @@ public:
*/
static nsRoleMapEntry* GetRoleMapEntry(nsIDOMNode *aNode);
/**
* Search element in neighborhood of the given element by tag name and
* 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 *aRelationAttr,
+ 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,
PRUint32 aAncestorLevelsToSearch = 5);
/**
* 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,
nsIContent *aExcludeContent = nsnull,
nsIAtom *aTagType = nsAccessibilityAtoms::label);
// 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);
};
#endif
--- a/accessible/src/base/nsAccessible.cpp
+++ b/accessible/src/base/nsAccessible.cpp
@@ -824,17 +824,17 @@ NS_IMETHODIMP nsAccessible::TestChildCac
{
#ifndef DEBUG_A11Y
return NS_OK;
#else
// All cached accessible nodes should be in the parent
// 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;
while (sibling != aCachedChild) {
NS_ASSERTION(sibling, "[TestChildCache] Never ran into the same child that we started from");
if (!sibling)
return NS_ERROR_FAILURE;
@@ -1904,25 +1904,24 @@ PRBool nsAccessible::IsNodeRelevant(nsID
do_GetService("@mozilla.org/accessibilityService;1");
NS_ENSURE_TRUE(accService, PR_FALSE);
nsCOMPtr<nsIDOMNode> relevantNode;
accService->GetRelevantContentNodeFor(aNode, getter_AddRefs(relevantNode));
return aNode == relevantNode;
}
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);
}
NS_IMETHODIMP
nsAccessible::FireAccessibleEvent(nsIAccessibleEvent *aEvent)
{
@@ -1959,17 +1958,17 @@ NS_IMETHODIMP nsAccessible::GetFinalRole
else if (*aRole == nsIAccessibleRole::ROLE_PUSHBUTTON) {
nsCOMPtr<nsIContent> content = do_QueryInterface(mDOMNode);
if (content) {
if (content->HasAttr(kNameSpaceID_None, nsAccessibilityAtoms::aria_pressed)) {
// For aria-pressed="false" or aria-pressed="true"
// 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;
}
}
}
else if (*aRole == nsIAccessibleRole::ROLE_LISTBOX) {
// A listbox inside of a combo box needs a special role because of ATK mapping to menu
--- a/accessible/src/base/nsAccessibleEventData.cpp
+++ b/accessible/src/base/nsAccessibleEventData.cpp
@@ -55,25 +55,25 @@
#include "nsPresContext.h"
PRBool nsAccEvent::gLastEventFromUserInput = PR_FALSE;
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);
}
void nsAccEvent::GetLastEventAttributes(nsIDOMNode *aNode,
nsIPersistentProperties *aAttributes)
{
if (aNode == gLastEventNodeWeak) {
@@ -269,34 +269,34 @@ nsAccEvent::GetAccessibleByNode()
// nsAccStateChangeEvent
NS_IMPL_ISUPPORTS_INHERITED1(nsAccStateChangeEvent, nsAccEvent,
nsIAccessibleStateChangeEvent)
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)
{
}
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)
{
}
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
// since it leads to problems with delayed events in the case when
// an accessible gets reorder event before delayed event is processed.
nsCOMPtr<nsIAccessible> accessible(GetAccessibleByNode());
if (accessible) {
PRUint32 state = 0, extraState = 0;
@@ -332,17 +332,17 @@ nsAccStateChangeEvent::IsEnabled(PRBool
// nsAccTextChangeEvent
NS_IMPL_ISUPPORTS_INHERITED1(nsAccTextChangeEvent, nsAccEvent,
nsIAccessibleTextChangeEvent)
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);
NS_ASSERTION(textAccessible, "Should not be firing test change event for non-text accessible!!!");
if (textAccessible) {
textAccessible->GetText(aStart, aStart + aLength, mModifiedText);
}
}
@@ -376,29 +376,59 @@ nsAccTextChangeEvent::GetModifiedText(ns
}
// nsAccCaretMoveEvent
NS_IMPL_ISUPPORTS_INHERITED1(nsAccCaretMoveEvent, nsAccEvent,
nsIAccessibleCaretMoveEvent)
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)
{
}
NS_IMETHODIMP
nsAccCaretMoveEvent::GetCaretOffset(PRInt32* aCaretOffset)
{
NS_ENSURE_ARG_POINTER(aCaretOffset);
*aCaretOffset = mCaretOffset;
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;
+}
+
--- a/accessible/src/base/nsAccessibleEventData.h
+++ b/accessible/src/base/nsAccessibleEventData.h
@@ -49,26 +49,26 @@
#include "nsString.h"
class nsIPresShell;
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();
void CaptureIsFromUserInput(PRBool aIsAsynch);
PRBool mIsFromUserInput;
private:
@@ -91,18 +91,16 @@ public:
PRBool aForceIsFromUserInput = PR_FALSE);
/**
* The input state was previously stored with the nsIAccessibleEvent,
* so use that state now -- call this when about to flush an event that
* was waiting in an event queue
*/
static void PrepareForEvent(nsIAccessibleEvent *aEvent);
-
- void *mEventData;
};
class nsAccStateChangeEvent: public nsAccEvent,
public nsIAccessibleStateChangeEvent
{
public:
nsAccStateChangeEvent(nsIAccessible *aAccessible,
PRUint32 aState, PRBool aIsExtraState,
@@ -153,18 +151,26 @@ public:
NS_DECL_ISUPPORTS_INHERITED
NS_FORWARD_NSIACCESSIBLEEVENT(nsAccEvent::)
NS_DECL_NSIACCESSIBLECARETMOVEEVENT
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
--- a/accessible/src/base/nsBaseWidgetAccessible.cpp
+++ b/accessible/src/base/nsBaseWidgetAccessible.cpp
@@ -141,23 +141,28 @@ nsLinkableAccessible::GetState(PRUint32
*aState |= nsIAccessibleStates::STATE_TRAVERSED;
}
}
}
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;
}
/* PRUint8 getAccNumActions (); */
NS_IMETHODIMP nsLinkableAccessible::GetNumActions(PRUint8 *aNumActions)
{
--- a/accessible/src/base/nsCaretAccessible.cpp
+++ b/accessible/src/base/nsCaretAccessible.cpp
@@ -83,16 +83,20 @@ nsresult nsCaretAccessible::ClearControl
mCurrentControlSelection = nsnull;
mCurrentControl = nsnull;
return selPrivate->RemoveSelectionListener(this);
}
nsresult nsCaretAccessible::SetControlSelectionListener(nsIDOMNode *aCurrentNode)
{
+ NS_ENSURE_TRUE(mRootAccessible, NS_ERROR_FAILURE);
+
+ ClearControlSelectionListener();
+
mCurrentControl = aCurrentNode;
mLastTextAccessible = nsnull;
// When focus moves such that the caret is part of a new frame selection
// this removes the old selection listener and attaches a new one for the current focus
nsCOMPtr<nsIPresShell> presShell =
mRootAccessible->GetPresShellFor(aCurrentNode);
if (!presShell)
@@ -116,26 +120,27 @@ nsresult nsCaretAccessible::SetControlSe
nsCOMPtr<nsISelectionController> selCon;
frame->GetSelectionController(presContext, getter_AddRefs(selCon));
NS_ENSURE_TRUE(selCon, NS_ERROR_FAILURE);
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);
mCurrentControlSelection = do_GetWeakReference(domSel);
return selPrivate->AddSelectionListener(this);
}
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());
NS_ENSURE_TRUE(selCon, NS_ERROR_FAILURE);
nsCOMPtr<nsISelection> domSel;
selCon->GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(domSel));
nsCOMPtr<nsISelectionPrivate> selPrivate = do_QueryInterface(domSel);
@@ -166,17 +171,17 @@ NS_IMETHODIMP nsCaretAccessible::NotifyS
mLastUsedSelection = do_GetWeakReference(aSel);
nsCOMPtr<nsIDocument> doc = do_QueryInterface(aDoc);
NS_ENSURE_TRUE(doc, NS_OK);
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);
// Get accessible from selection's focus node or its parent
nsCOMPtr<nsIDOMNode> focusNode;
aSel->GetFocusNode(getter_AddRefs(focusNode));
if (!focusNode) {
mLastTextAccessible = nsnull;
@@ -243,16 +248,17 @@ NS_IMETHODIMP nsCaretAccessible::NotifyS
}
nsRect
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
}
nsCOMPtr<nsIAccessNode> lastAccessNode(do_QueryInterface(mLastTextAccessible));
NS_ENSURE_TRUE(lastAccessNode, caretRect);
--- a/accessible/src/base/nsDocAccessible.cpp
+++ b/accessible/src/base/nsDocAccessible.cpp
@@ -686,16 +686,17 @@ nsresult nsDocAccessible::RemoveEventLis
RemoveScrollListener();
// Remove document observer
mDocument->RemoveObserver(this);
if (mScrollWatchTimer) {
mScrollWatchTimer->Cancel();
mScrollWatchTimer = nsnull;
+ NS_RELEASE_THIS(); // Kung fu death grip
}
nsRefPtr<nsRootAccessible> rootAccessible(GetRootAccessible());
if (rootAccessible) {
nsRefPtr<nsCaretAccessible> caretAccessible = rootAccessible->GetCaretAccessible();
if (caretAccessible) {
nsCOMPtr<nsIDOMDocument> domDoc = do_QueryInterface(mDocument);
caretAccessible->RemoveDocSelectionListener(domDoc);
@@ -822,16 +823,17 @@ void nsDocAccessible::ScrollTimerCallbac
// Therefore, we wait for no scroll events to occur between 2 ticks of this timer
// That indicates a pause in scrolling, so we fire the accessibilty scroll event
nsAccUtils::FireAccEvent(nsIAccessibleEvent::EVENT_SCROLLING_END, docAcc);
docAcc->mScrollPositionChangedTicks = 0;
if (docAcc->mScrollWatchTimer) {
docAcc->mScrollWatchTimer->Cancel();
docAcc->mScrollWatchTimer = nsnull;
+ NS_RELEASE(docAcc); // Release kung fu death grip
}
}
}
void nsDocAccessible::AddScrollListener()
{
nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(mWeakShell));
@@ -874,16 +876,17 @@ NS_IMETHODIMP nsDocAccessible::ScrollPos
// then the ::Notify() method will fire the accessibility event for scroll position changes
const PRUint32 kScrollPosCheckWait = 50;
if (mScrollWatchTimer) {
mScrollWatchTimer->SetDelay(kScrollPosCheckWait); // Create new timer, to avoid leaks
}
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);
}
}
mScrollPositionChangedTicks = 1;
return NS_OK;
}
@@ -1025,29 +1028,29 @@ nsDocAccessible::AttributeChangedImpl(ns
// Need to find the right event to use here, SELECTION_WITHIN would
// seem right but we had started using it for something else
nsCOMPtr<nsIAccessNode> multiSelectAccessNode =
do_QueryInterface(multiSelect);
nsCOMPtr<nsIDOMNode> multiSelectDOMNode;
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);
}
}
if (aAttribute == nsAccessibilityAtoms::contenteditable) {
nsCOMPtr<nsIAccessibleStateChangeEvent> editableChangeEvent =
new nsAccStateChangeEvent(targetNode,
nsIAccessibleStates::EXT_STATE_EDITABLE,
PR_TRUE);
@@ -1147,17 +1150,17 @@ nsDocAccessible::ARIAAttributeChanged(ns
nsIAccessibleStates::STATE_READONLY,
PR_FALSE);
FireDelayedAccessibleEvent(event);
return;
}
if (aAttribute == nsAccessibilityAtoms::aria_valuenow) {
FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_VALUE_CHANGE,
- targetNode, nsnull);
+ targetNode);
return;
}
if (aAttribute == nsAccessibilityAtoms::aria_multiselectable &&
aContent->HasAttr(kNameSpaceID_None, nsAccessibilityAtoms::role)) {
// This affects whether the accessible supports nsIAccessibleSelectable.
// COM says we cannot change what interfaces are supported on-the-fly,
// so invalidate this object. A new one will be created on demand.
@@ -1376,22 +1379,21 @@ nsDocAccessible::CreateTextChangeEventFo
new nsAccTextChangeEvent(aContainerAccessible, offset, length, aIsInserting, aIsAsynch);
NS_IF_ADDREF(event);
return event;
}
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);
}
nsresult
nsDocAccessible::FireDelayedAccessibleEvent(nsIAccessibleEvent *aEvent,
EDupeEventRule aAllowDupes,
@@ -1617,88 +1619,103 @@ void nsDocAccessible::FlushEventsCallbac
// A lot of crashes were happening here, so now we're reffing the doc
// now until the events are flushed
accessibleDoc->FlushPendingEvents();
}
}
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");
nsCOMPtr<nsIAccessible> childAccessible;
// we only need to shutdown the accessibles here if one of them has been created
privateAccessible->GetCachedFirstChild(getter_AddRefs(childAccessible));
if (childAccessible) {
nsCOMPtr<nsIArray> children;
// use GetChildren() to fetch children at one time, instead of using
// GetNextSibling(), because after we shutdown the first child,
// mNextSibling will be set null.
accessible->GetChildren(getter_AddRefs(children));
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));
- }
+ // 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;
- // 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);
- }
+ 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,
PRUint32 aChangeEventType)
{
PRBool isHiding =
aChangeEventType == nsIAccessibleEvent::EVENT_ASYNCH_HIDE ||
aChangeEventType == nsIAccessibleEvent::EVENT_DOM_DESTROY;
@@ -1737,47 +1754,39 @@ NS_IMETHODIMP nsDocAccessible::Invalidat
// doc accessible. In this case we optimize
// by not firing SHOW/HIDE/REORDER events for every document mutation
// caused by page load, since AT is not going to want to grab the
// document and listen to these changes until after the page is first loaded
// Leave early, and ensure mAccChildCount stays uninitialized instead of 0,
// 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();
- }
- // 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
- }
+ 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;
+ }
+ 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;
childNode->GetLocalName(localName);
const char *hasAccessible = childAccessible ? " (acc)" : "";
if (aChangeEventType == nsIAccessibleEvent::EVENT_ASYNCH_HIDE) {
printf("[Hide %s %s]\n", NS_ConvertUTF16toUTF8(localName).get(), hasAccessible);
}
@@ -1865,32 +1874,32 @@ NS_IMETHODIMP nsDocAccessible::Invalidat
}
// Fire EVENT_SHOW, EVENT_MENUPOPUP_START for newly visible content.
// Fire after a short timer, because we want to make sure the view has been
// updated to make this accessible content visible. If we don't wait,
// the assistive technology may receive the event and then retrieve
// 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
nsIContent *ancestor = 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;
}
ancestor = ancestor->GetParent();
nsCOMPtr<nsIDOMNode> ancestorNode = do_QueryInterface(ancestor);
if (!ancestorNode) {
break;
}
@@ -1899,17 +1908,17 @@ NS_IMETHODIMP nsDocAccessible::Invalidat
}
if (!isShowing) {
// Fire an event so the assistive technology knows the children have changed
// This is only used by older MSAA clients. Newer ones should derive this
// 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);
}
}
return NS_OK;
}
@@ -1975,17 +1984,17 @@ nsDocAccessible::FireShowHideEvents(nsID
if (accessible) {
// Found an accessible, so fire the show/hide on it and don't
// look further into this subtree
PRBool isAsynch = aEventType == nsIAccessibleEvent::EVENT_ASYNCH_HIDE ||
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);
}
if (aDelay) {
return FireDelayedAccessibleEvent(event, eCoalesceFromSameSubtree, isAsynch);
}
return FireAccessibleEvent(event);
--- a/accessible/src/base/nsDocAccessible.h
+++ b/accessible/src/base/nsDocAccessible.h
@@ -103,28 +103,27 @@ class nsDocAccessible : public nsHyperTe
enum EDupeEventRule { eAllowDupes, eCoalesceFromSameSubtree, eRemoveDupes };
/**
* Non-virtual method to fire a delayed event after a 0 length timeout
*
* @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
* eRemoveDupes (default): events of the same type are discarded
* (the last one is used)
*
* @param aIsAsyn - set to PR_TRUE if this is not being called from code
* synchronous with a DOM event
*/
nsresult FireDelayedToolkitEvent(PRUint32 aEvent, nsIDOMNode *aDOMNode,
- void *aData, EDupeEventRule aAllowDupes = eRemoveDupes,
+ EDupeEventRule aAllowDupes = eRemoveDupes,
PRBool aIsAsynch = PR_FALSE);
/**
* Fire accessible event in timeout.
*
* @param aEvent - the event to fire
* @param aAllowDupes - if false then delayed events of the same type and
* for the same DOM node in the event queue won't
--- a/accessible/src/base/nsOuterDocAccessible.cpp
+++ b/accessible/src/base/nsOuterDocAccessible.cpp
@@ -69,17 +69,17 @@ NS_IMETHODIMP nsOuterDocAccessible::GetN
}
}
return rv;
}
/* unsigned long getRole (); */
NS_IMETHODIMP nsOuterDocAccessible::GetRole(PRUint32 *aRole)
{
- *aRole = nsIAccessibleRole::ROLE_CLIENT;
+ *aRole = nsIAccessibleRole::ROLE_INTERNAL_FRAME;
return NS_OK;
}
NS_IMETHODIMP
nsOuterDocAccessible::GetState(PRUint32 *aState, PRUint32 *aExtraState)
{
nsAccessible::GetState(aState, aExtraState);
*aState &= ~nsIAccessibleStates::STATE_FOCUSABLE;
@@ -111,17 +111,17 @@ void nsOuterDocAccessible::CacheChildren
if (!mWeakShell) {
mAccChildCount = eChildCountUninitialized;
return; // This outer doc node has been shut down
}
if (mAccChildCount != eChildCountUninitialized) {
return;
}
- SetFirstChild(nsnull);
+ InvalidateChildren();
mAccChildCount = 0;
// In these variable names, "outer" relates to the nsOuterDocAccessible
// as opposed to the nsDocAccessibleWrap which is "inner".
// The outer node is a something like a <browser>, <frame>, <iframe>, <page> or
// <editor> tag, whereas the inner node corresponds to the inner document root.
nsCOMPtr<nsIContent> content(do_QueryInterface(mDOMNode));
--- a/accessible/src/base/nsRootAccessible.cpp
+++ b/accessible/src/base/nsRootAccessible.cpp
@@ -425,17 +425,17 @@ void nsRootAccessible::TryFireEarlyLoadE
if (state & nsIAccessibleStates::STATE_BUSY) {
// Don't fire page load events on subdocuments for initial page load of entire page
return;
}
}
// 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,
nsIDOMNode *aNode,
nsIDOMEvent *aFocusEvent,
PRBool aForceEvent,
PRBool aIsAsynch)
{
@@ -514,17 +514,17 @@ PRBool nsRootAccessible::FireAccessibleF
nsAccUtils::FireAccEvent(nsIAccessibleEvent::EVENT_MENU_START, menuBarAccessible);
}
}
}
}
}
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);
}
mCurrentARIAMenubar = nsnull;
}
NS_IF_RELEASE(gLastFocusedNode);
gLastFocusedNode = finalFocusNode;
@@ -538,17 +538,17 @@ PRBool nsRootAccessible::FireAccessibleF
// Suppress document focus, because real DOM focus will be fired next,
// and that's what we care about
// Make sure we never fire focus for the nsRootAccessible (mDOMNode)
return PR_FALSE;
}
}
FireDelayedToolkitEvent(nsIAccessibleEvent::EVENT_FOCUS,
- finalFocusNode, nsnull, eRemoveDupes, aIsAsynch);
+ finalFocusNode, eRemoveDupes, aIsAsynch);
return PR_TRUE;
}
void nsRootAccessible::FireCurrentFocusEvent()
{
nsCOMPtr<nsIDOMNode> focusedNode = GetCurrentFocus();
if (!focusedNode) {
@@ -592,16 +592,19 @@ NS_IMETHODIMP nsRootAccessible::HandleEv
nsresult nsRootAccessible::HandleEventWithTarget(nsIDOMEvent* aEvent,
nsIDOMNode* aTargetNode)
{
nsAutoString eventType;
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")) {
printf("\ndebugging %s events for %s", NS_ConvertUTF16toUTF8(eventType).get(), NS_ConvertUTF16toUTF8(localName).get());
}
if (localName.LowerCaseEqualsLiteral("textbox")) {
printf("\ndebugging %s events for %s", NS_ConvertUTF16toUTF8(eventType).get(), NS_ConvertUTF16toUTF8(localName).get());
}
@@ -637,35 +640,75 @@ nsresult nsRootAccessible::HandleEventWi
if (eventType.EqualsLiteral("DOMContentLoaded")) {
// Don't create the doc accessible until load scripts have a chance to set
// role attribute for <body> or <html> element, because the value of
// role attribute will be cached when the doc accessible is Init()'d
TryFireEarlyLoadEvent(aTargetNode);
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);
nsAccEvent::PrepareForEvent(aTargetNode, PR_TRUE);
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,
getter_AddRefs(accessible));
nsCOMPtr<nsPIAccessible> privAcc(do_QueryInterface(accessible));
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));
NS_ENSURE_STATE(dataEvent);
nsCOMPtr<nsIVariant> indexVariant;
dataEvent->GetData(NS_LITERAL_STRING("index"),
getter_AddRefs(indexVariant));
@@ -680,16 +723,17 @@ nsresult nsRootAccessible::HandleEventWi
indexVariant->GetAsInt32(&index);
countVariant->GetAsInt32(&count);
nsCOMPtr<nsIAccessibleTreeCache> treeAccCache(do_QueryInterface(accessible));
NS_ENSURE_STATE(treeAccCache);
return treeAccCache->InvalidateCache(index, count);
}
+#endif
if (eventType.EqualsLiteral("RadioStateChange")) {
PRUint32 state = State(accessible);
// radiogroup in prefWindow is exposed as a list,
// and panebutton is exposed as XULListitem in A11y.
// nsXULListitemAccessible::GetState uses STATE_SELECTED in this case,
// so we need to check nsIAccessibleStates::STATE_SELECTED also.
@@ -718,17 +762,17 @@ nsresult nsRootAccessible::HandleEventWi
PR_FALSE, isEnabled);
return privAcc->FireAccessibleEvent(accEvent);
}
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) {
PRInt32 treeIndex = -1;
multiSelect->GetCurrentIndex(&treeIndex);
if (treeIndex >= 0) {
nsCOMPtr<nsIAccessibleTreeCache> treeCache(do_QueryInterface(accessible));
if (!treeCache ||
@@ -774,29 +818,16 @@ nsresult nsRootAccessible::HandleEventWi
return nsAccUtils::FireAccEvent(nsIAccessibleEvent::EVENT_SELECTION,
treeItemAccessible);
}
}
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.
nsCOMPtr<nsIDOMNode> focusedItem(aTargetNode);
if (!treeItemAccessible) {
nsCOMPtr<nsIDOMXULSelectControlElement> selectControl =
do_QueryInterface(aTargetNode);
@@ -842,46 +873,29 @@ nsresult nsRootAccessible::HandleEventWi
// AT's expect to get an EVENT_SHOW for the tooltip.
// In event callback the tooltip's accessible will be ready.
event = nsIAccessibleEvent::EVENT_ASYNCH_SHOW;
}
if (event) {
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,
accessible);
}
}
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();
NS_ENSURE_TRUE(menuFrame, NS_ERROR_FAILURE);
nsIMenuFrame* imenuFrame;
CallQueryInterface(menuFrame, &imenuFrame);
// QI failed for nsIMenuFrame means it's not on menu bar
if (imenuFrame && imenuFrame->IsOnMenuBar() &&
--- a/accessible/src/html/nsHTMLTableAccessible.cpp
+++ b/accessible/src/html/nsHTMLTableAccessible.cpp
@@ -852,39 +852,32 @@ nsHTMLTableAccessible::GetTableNode(nsID
NS_IF_ADDREF(*_retval);
return rv;
}
return NS_ERROR_FAILURE;
}
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);
-
- nsCOMPtr<nsIContent> content(do_QueryInterface(tableNode));
- NS_ENSURE_TRUE(content, NS_ERROR_FAILURE);
+ GetTableNode(getter_AddRefs(tableNode));
+ nsCOMPtr<nsIContent> tableContent(do_QueryInterface(tableNode));
+ if (!tableContent) {
+ return NS_ERROR_FAILURE; // Table shut down
+ }
- nsIDocument *doc = content->GetDocument();
- NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE);
-
- nsIPresShell *presShell = doc->GetPrimaryShell();
+ nsCOMPtr<nsIPresShell> shell = GetPresShell();
+ NS_ENSURE_TRUE(shell, NS_ERROR_FAILURE);
- 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
nsHTMLTableAccessible::GetCellAt(PRInt32 aRowIndex,
PRInt32 aColIndex,
nsIDOMElement* &aCell)
{
PRInt32 startRowIndex = 0, startColIndex = 0,
--- a/accessible/src/html/nsHyperTextAccessible.cpp
+++ b/accessible/src/html/nsHyperTextAccessible.cpp
@@ -91,17 +91,20 @@ nsresult nsHyperTextAccessible::QueryInt
if (aIID.Equals(NS_GET_IID(nsHyperTextAccessible))) {
*aInstancePtr = static_cast<nsHyperTextAccessible*>(this);
NS_ADDREF_THIS();
return NS_OK;
}
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);
}
if (aIID.Equals(NS_GET_IID(nsIAccessibleText))) {
*aInstancePtr = static_cast<nsIAccessibleText*>(this);
NS_ADDREF_THIS();
return NS_OK;
@@ -560,17 +563,20 @@ nsresult nsHyperTextAccessible::DOMPoint
PRInt32* aHyperTextOffset,
nsIAccessible **aFinalAccessible,
PRBool aIsEndOffset)
{
// Turn a DOM Node and offset into an offset into this hypertext.
// 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;
}
PRUint32 addTextOffset = 0;
nsCOMPtr<nsIDOMNode> findNode;
unsigned short nodeType;
@@ -614,16 +620,27 @@ nsresult nsHyperTextAccessible::DOMPoint
findNode = do_QueryInterface(parentContent); // Case #2: there are no children
}
}
// Get accessible for this findNode, or if that node isn't accessible, use the
// 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
nsCOMPtr<nsIAccessible> childAccessible;
while (descendantAccessible) {
nsCOMPtr<nsIAccessible> parentAccessible;
descendantAccessible->GetParent(getter_AddRefs(parentAccessible));
if (this == parentAccessible) {
@@ -982,16 +999,23 @@ nsresult nsHyperTextAccessible::GetTextH
// For BOUNDARY_LINE_END, make sure we start of this line
startOffset = endOffset = finalStartOffset + (aBoundaryType == BOUNDARY_LINE_END);
nsCOMPtr<nsIAccessible> endAcc;
nsIFrame *endFrame = GetPosAndText(startOffset, endOffset, nsnull, nsnull,
nsnull, getter_AddRefs(endAcc));
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);
if (finalEndOffset == aOffset) {
if (aType == eGetAt && amount == eSelectWord) {
// Fix word error for the first character in word: PeekOffset() will return the previous word when
// aOffset points to the first character of the word, but accessibility APIs want the current word
// that the first character is in
--- a/accessible/src/mac/nsRoleMap.h
+++ b/accessible/src/mac/nsRoleMap.h
@@ -47,17 +47,17 @@ static const NSString* AXRoles [] = {
NSAccessibilityMenuBarRole, // ROLE_MENUBAR. (irrelevant on OS X; the menubar will always be native and on the top of the screen.)
NSAccessibilityScrollBarRole, // ROLE_SCROLLBAR. we might need to make this its own mozAccessible, to support the children objects (valueindicator, down/up buttons).
NSAccessibilitySplitterRole, // ROLE_GRIP
NSAccessibilityUnknownRole, // ROLE_SOUND. unused on OS X
NSAccessibilityUnknownRole, // ROLE_CURSOR. unused on OS X
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.
NSAccessibilityGroupRole, // ROLE_APPLICATION. unused on OS X. the system will take care of this.
NSAccessibilityGroupRole, // ROLE_DOCUMENT
NSAccessibilityGroupRole, // ROLE_PANE
NSAccessibilityUnknownRole, // ROLE_CHART
NSAccessibilityWindowRole, // ROLE_DIALOG. there's a dialog subrole.
--- a/accessible/src/msaa/nsRoleMap.h
+++ b/accessible/src/msaa/nsRoleMap.h
@@ -90,18 +90,18 @@ static const WindowsRoleMapItem gWindows
{ ROLE_SYSTEM_CARET, ROLE_SYSTEM_CARET },
// nsIAccessibleRole::ROLE_ALERT
{ ROLE_SYSTEM_ALERT, ROLE_SYSTEM_ALERT },
// 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 },
// nsIAccessibleRole::ROLE_MENUITEM
{ ROLE_SYSTEM_MENUITEM, ROLE_SYSTEM_MENUITEM },
// nsIAccessibleRole::ROLE_TOOLTIP
@@ -424,17 +424,17 @@ static const WindowsRoleMapItem gWindows
// nsIAccessibleRole::ROLE_IMAGE_MAP
{ ROLE_SYSTEM_GRAPHIC, ROLE_SYSTEM_GRAPHIC },
// nsIAccessibleRole::ROLE_OPTION
{ 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 },
// nsIAccessibleRole::ROLE_LAST_ENTRY
{ ROLE_WINDOWS_LAST_ENTRY, ROLE_WINDOWS_LAST_ENTRY }
};
--- a/accessible/src/xforms/nsXFormsFormControlsAccessible.cpp
+++ b/accessible/src/xforms/nsXFormsFormControlsAccessible.cpp
@@ -46,17 +46,17 @@ nsXFormsLabelAccessible::
{
}
NS_IMETHODIMP
nsXFormsLabelAccessible::GetRole(PRUint32 *aRole)
{
NS_ENSURE_ARG_POINTER(aRole);
- *aRole = nsIAccessibleRole::ROLE_STATICTEXT;
+ *aRole = nsIAccessibleRole::ROLE_LABEL;
return NS_OK;
}
NS_IMETHODIMP
nsXFormsLabelAccessible::GetName(nsAString& aName)
{
nsAutoString name;
nsresult rv = GetTextFromRelationID(nsAccessibilityAtoms::aria_labelledby, name);
--- a/accessible/src/xul/nsXULAlertAccessible.cpp
+++ b/accessible/src/xul/nsXULAlertAccessible.cpp
@@ -59,8 +59,16 @@ nsXULAlertAccessible::GetState(PRUint32
nsresult rv = nsAccessible::GetState(aState, aExtraState);
NS_ENSURE_SUCCESS(rv, rv);
if (mDOMNode) {
*aState |= nsIAccessibleStates::STATE_ALERT_MEDIUM; // XUL has no markup for low, medium or high
}
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;
+}
--- a/accessible/src/xul/nsXULAlertAccessible.h
+++ b/accessible/src/xul/nsXULAlertAccessible.h
@@ -45,11 +45,12 @@
class nsXULAlertAccessible : public nsAccessibleWrap
{
public:
nsXULAlertAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell);
NS_DECL_ISUPPORTS_INHERITED
NS_IMETHOD GetRole(PRUint32 *aRole);
NS_IMETHOD GetState(PRUint32 *aState, PRUint32 *aExtraState);
+ NS_IMETHOD GetName(nsAString& aName);
};
#endif
--- a/accessible/src/xul/nsXULMenuAccessible.cpp
+++ b/accessible/src/xul/nsXULMenuAccessible.cpp
@@ -481,17 +481,19 @@ nsXULMenuitemAccessible::GetDefaultKeyBi
NS_IMETHODIMP nsXULMenuitemAccessible::GetRole(PRUint32 *aRole)
{
nsCOMPtr<nsIDOMXULContainerElement> xulContainer(do_QueryInterface(mDOMNode));
if (xulContainer) {
*aRole = nsIAccessibleRole::ROLE_PARENT_MENUITEM;
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;
}
*aRole = nsIAccessibleRole::ROLE_MENUITEM;
nsCOMPtr<nsIDOMElement> element(do_QueryInterface(mDOMNode));
if (!element)
return NS_ERROR_FAILURE;
@@ -711,24 +713,28 @@ nsXULMenupopupAccessible::GetName(nsAStr
}
NS_IMETHODIMP nsXULMenupopupAccessible::GetRole(PRUint32 *aRole)
{
nsCOMPtr<nsIContent> content(do_QueryInterface(mDOMNode));
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;
+ 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;
+ }
}
- else {
- *aRole = nsIAccessibleRole::ROLE_MENUPOPUP;
- }
+ *aRole = nsIAccessibleRole::ROLE_MENUPOPUP;
return NS_OK;
}
// ------------------------ Menu Bar -----------------------------
nsXULMenubarAccessible::nsXULMenubarAccessible(nsIDOMNode* aDOMNode, nsIWeakReference* aShell):
nsAccessibleWrap(aDOMNode, aShell)
{
--- a/accessible/src/xul/nsXULSelectAccessible.cpp
+++ b/accessible/src/xul/nsXULSelectAccessible.cpp
@@ -36,16 +36,17 @@
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsXULSelectAccessible.h"
#include "nsAccessibilityService.h"
#include "nsIContent.h"
#include "nsIDOMXULMenuListElement.h"
+#include "nsIDOMXULPopupElement.h"
#include "nsIDOMXULSelectCntrlItemEl.h"
#include "nsIDOMXULSelectCntrlEl.h"
#include "nsIDOMXULTextboxElement.h"
#include "nsIPresShell.h"
#include "nsIServiceManager.h"
#include "nsCaseTreatment.h"
////////////////////////////////////////////////////////////////////////////////
@@ -189,19 +190,30 @@ NS_IMETHODIMP nsXULListboxAccessible::Ge
nsCOMPtr<nsIDOMXULSelectControlItemElement> selectedItem;
select->GetSelectedItem(getter_AddRefs(selectedItem));
if (selectedItem)
return selectedItem->GetLabel(_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;
}
/** ----- nsXULListitemAccessible ----- */
/** Constructor */
nsXULListitemAccessible::nsXULListitemAccessible(nsIDOMNode* aDOMNode, nsIWeakReference* aShell):
nsXULMenuitemAccessible(aDOMNode, aShell)
@@ -245,16 +257,18 @@ NS_IMETHODIMP nsXULListitemAccessible::G
/**
*
*/
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;
}
/**
*
*/
--- a/accessible/src/xul/nsXULTextAccessible.cpp
+++ b/accessible/src/xul/nsXULTextAccessible.cpp
@@ -56,23 +56,19 @@ nsHyperTextAccessibleWrap(aDomNode, aShe
/* wstring getName (); */
NS_IMETHODIMP nsXULTextAccessible::GetName(nsAString& aName)
{
nsCOMPtr<nsIContent> content(do_QueryInterface(mDOMNode));
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
nsXULTextAccessible::GetState(PRUint32 *aState, PRUint32 *aExtraState)
{
nsresult rv = nsHyperTextAccessibleWrap::GetState(aState, aExtraState);
NS_ENSURE_SUCCESS(rv, rv);
@@ -171,23 +167,19 @@ NS_IMETHODIMP nsXULLinkAccessible::GetNa
return AppendFlatStringFromSubtree(content, &aName);
}
// otherwise, use the value attribute as the name (for labels)
return NS_OK;
}
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;
}
void nsXULLinkAccessible::CacheActionContent()
{
// not a link if no content
nsCOMPtr<nsIContent> mTempContent = do_QueryInterface(mDOMNode);
if (!mTempContent) {
--- a/accessible/src/xul/nsXULTreeAccessible.cpp
+++ b/accessible/src/xul/nsXULTreeAccessible.cpp
@@ -558,19 +558,21 @@ nsXULTreeAccessible::GetCachedTreeitemAc
// invalidateCache(in PRInt32 aRow, in PRInt32 aCount)
NS_IMETHODIMP
nsXULTreeAccessible::InvalidateCache(PRInt32 aRow, PRInt32 aCount)
{
// Do not invalidate the cache if rows have been inserted.
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;
rv = cols->GetCount(&colsCount);
NS_ENSURE_SUCCESS(rv, rv);
#else
nsCOMPtr<nsITreeColumn> col;
rv = cols->GetKeyColumn(getter_AddRefs(col));
@@ -592,17 +594,17 @@ nsXULTreeAccessible::InvalidateCache(PRI
nsCOMPtr<nsIAccessNode> accessNode;
GetCacheEntry(*mAccessNodeCache, key, getter_AddRefs(accessNode));
if (accessNode) {
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);
}
}
}
PRInt32 newRowCount = 0;
--- a/browser/app/Makefile.in
+++ b/browser/app/Makefile.in
@@ -313,20 +313,17 @@ libs:: $(ICON_FILES)
$(INSTALL) $^ $(DIST)/bin/icons
install::
$(SYSINSTALL) $(IFLAGS1) $(ICON_FILES) $(DESTDIR)$(mozappdir)/icons
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::
ifndef MOZ_BRANDING_DIRECTORY
$(NSINSTALL) -D $(DIST)/branding
ifeq ($(OS_ARCH),WINNT)
cp $(srcdir)/firefox.ico $(DIST)/branding/firefox.ico
cp $(srcdir)/firefox.ico $(DIST)/branding/app.ico
@@ -342,17 +339,17 @@ ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_
endif
ifneq (,$(filter gtk2,$(MOZ_WIDGET_TOOLKIT)))
cp $(srcdir)/mozicon128.png $(DIST)/branding/mozicon128.png
cp $(srcdir)/mozicon16.xpm $(DIST)/branding/mozicon16.xpm
cp $(srcdir)/mozicon50.xpm $(DIST)/branding/mozicon50.xpm
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
cp $(srcdir)/firefox-os2.ico $(DIST)/branding/app.ico
cp $(srcdir)/document-os2.ico $(DIST)/branding/document.ico
endif
endif
@@ -375,16 +372,19 @@ clean clobber repackage::
rm -rf $(DIST)/$(APP_NAME).app
ifdef LIBXUL_SDK
APPFILES = Resources
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
mkdir -p $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj
rsync -a --exclude CVS --exclude "*.in" $(srcdir)/macbuild/Contents/Resources/English.lproj/ $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj
sed -e "s/%APP_VERSION%/$(APP_VERSION)/" -e "s/%APP_NAME%/$(APP_NAME)/" $(srcdir)/macbuild/Contents/Info.plist.in > $(DIST)/$(APP_NAME).app/Contents/Info.plist
sed -e "s/%APP_VERSION%/$(APP_VERSION)/" -e "s/%APP_NAME%/$(APP_NAME)/" $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | iconv -f UTF-8 -t UTF-16 > $(DIST)/$(APP_NAME).app/Contents/Resources/$(AB).lproj/InfoPlist.strings
rsync -a $(DIST)/bin/ $(DIST)/$(APP_NAME).app/Contents/$(APPFILES)
@@ -414,22 +414,16 @@ endif
libs::
ifeq ($(OS_ARCH),WINNT)
$(PERL) -pe 's/(?<!\r)\n/\r\n/g;' < $(topsrcdir)/LICENSE > $(DIST)/bin/LICENSE
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::
ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT))
rsync -a --copy-unsafe-links $(LIBXUL_DIST)/XUL.framework $(DIST)/$(APP_NAME).app/Contents/Frameworks
else
$(NSINSTALL) -D $(DIST)/bin/xulrunner
(cd $(LIBXUL_SDK)/bin && tar $(TAR_CREATE_FLAGS) - .) | (cd $(DIST)/bin/xulrunner && tar -xf -)
deleted file mode 100644
--- a/browser/app/default.xpm
+++ /dev/null
@@ -1,1144 +0,0 @@
-/* XPM */
-static char * mozicon50_xpm[] = {
-"48 48 1093 2",
-" c None",
-". c #2099CF",
-"+ c #2CA7D9",
-"@ c #33AEDD",
-"# c #34B2E1",
-"$ c #35B8E5",
-"% c #2FBAE8",
-"& c #26B5E4",
-"* c #199FD6",
-"= c #177DB8",
-"- c #2C8FC4",
-"; c #43A0CE",
-"> c #55ADD6",
-", c #5CB5DD",
-"' c #61C4E8",
-") c #63CBED",
-"! c #64CFF1",
-"~ c #63D1F2",
-"{ c #5ECCEF",
-"] c #57C3E9",
-"^ c #4EB8E1",
-"/ c #3CABD9",
-"( c #2A9ED1",
-"_ c #1991C9",
-": c #0F7CBA",
-"< c #166EAC",
-"[ c #3387BC",
-"} c #4797C6",
-"| c #51A0CC",
-"1 c #56A7D2",
-"2 c #5BAED7",
-"3 c #60B6DD",
-"4 c #67CDEE",
-"5 c #69D3F2",
-"6 c #6BD4F4",
-"7 c #69D3F4",
-"8 c #63CDEF",
-"9 c #5AC0E6",
-"0 c #51B6DF",
-"a c #49ACD8",
-"b c #42A2D1",
-"c c #3898CA",
-"d c #298CC2",
-"e c #167EB9",
-"f c #0B5A9C",
-"g c #2674AE",
-"h c #3D87BA",
-"i c #4590C0",
-"j c #4B97C6",
-"k c #519FCB",
-"l c #58A6D1",
-"m c #5DADD5",
-"n c #62B3DA",
-"o c #69C3E6",
-"p c #6ED4F2",
-"q c #6FD6F4",
-"r c #6ED5F4",
-"s c #6AD3F2",
-"t c #5FC3E7",
-"u c #53B2DC",
-"v c #4BA8D5",
-"w c #439FCE",
-"x c #3B95C7",
-"y c #338BC0",
-"z c #2B82B9",
-"A c #1D76B1",
-"B c #0C69A9",
-"C c #10599A",
-"D c #2D71AA",
-"E c #377CB2",
-"F c #3D84B8",
-"G c #458DBE",
-"H c #4B95C4",
-"I c #529CC9",
-"J c #59A4CF",
-"K c #5FABD4",
-"L c #65B1D8",
-"M c #6BC2E4",
-"N c #71D5F3",
-"O c #73D6F3",
-"P c #72D5F3",
-"Q c #6DD1F0",
-"R c #5FBBE2",
-"S c #54ADD8",
-"T c #4CA4D2",
-"U c #439ACB",
-"V c #3B91C4",
-"W c #3487BD",
-"X c #2D7EB7",
-"Y c #2675AF",
-"Z c #1E6CA9",
-"` c #0F5FA0",
-" . c #055296",
-".. c #115394",
-"+. c #2767A2",
-"@. c #2F70A9",
-"#. c #3679AF",
-"$. c #3C81B5",
-"%. c #448ABC",
-"&. c #4A92C2",
-"*. c #519AC7",
-"=. c #58A2CD",
-"-. c #5FA9D2",
-";. c #65B0D7",
-">. c #6EC8E9",
-",. c #74D4F2",
-"'. c #76D6F3",
-"). c #75D6F3",
-"!. c #71D3F1",
-"~. c #62BCE1",
-"{. c #54A9D5",
-"]. c #4C9FCE",
-"^. c #4396C8",
-"/. c #3B8CC1",
-"(. c #3483BA",
-"_. c #2C7AB3",
-":. c #2670AC",
-"<. c #1F68A6",
-"[. c #195F9F",
-"}. c #0D5497",
-"|. c #04488D",
-"1. c #0F4A8D",
-"2. c #1F5A98",
-"3. c #2663A0",
-"4. c #2D6DA6",
-"5. c #3475AD",
-"6. c #3B7EB3",
-"7. c #4287B9",
-"8. c #4990C1",
-"9. c #51A4CF",
-"0. c #569FCA",
-"a. c #5DA6CF",
-"b. c #66B5DB",
-"c. c #6FD1F0",
-"d. c #75D4F1",
-"e. c #79D5F2",
-"f. c #75D3F1",
-"g. c #63BBE0",
-"h. c #54A4D1",
-"i. c #4B9BCB",
-"j. c #4391C4",
-"k. c #3B88BD",
-"l. c #337FB6",
-"m. c #2C76B0",
-"n. c #266CA9",
-"o. c #1F64A3",
-"p. c #1A5B9C",
-"q. c #145396",
-"r. c #0A498E",
-"s. c #034C8F",
-"t. c #085293",
-"u. c #164D8E",
-"v. c #1D5695",
-"w. c #24609C",
-"x. c #2A69A3",
-"y. c #3271AA",
-"z. c #387AAF",
-"A. c #429FCC",
-"B. c #4CBFE4",
-"C. c #52C4E8",
-"D. c #57AFD7",
-"E. c #5DB3DA",
-"F. c #65C5E7",
-"G. c #6DD0EE",
-"H. c #72D2EF",
-"I. c #78D4F0",
-"J. c #7BD5F1",
-"K. c #76D2EF",
-"L. c #6AC5E6",
-"M. c #55A5D1",
-"N. c #4A95C6",
-"O. c #428CC0",
-"P. c #3A83B9",
-"Q. c #337AB3",
-"R. c #2C71AD",
-"S. c #2568A6",
-"T. c #1F5F9F",
-"U. c #1D65A3",
-"V. c #269ACA",
-"W. c #1C84BA",
-"X. c #0D7DB5",
-"Y. c #0298CC",
-"Z. c #0296CA",
-"`. c #0C5998",
-" + c #14498A",
-".+ c #1B609C",
-"++ c #2498C8",
-"@+ c #2977AF",
-"#+ c #2F75AC",
-"$+ c #3575AC",
-"%+ c #40ABD5",
-"&+ c #49BFE4",
-"*+ c #50C3E7",
-"=+ c #56C5E8",
-"-+ c #5DC8EA",
-";+ c #63CBEB",
-">+ c #69CEED",
-",+ c #6ED0EE",
-"'+ c #73D2EF",
-")+ c #77D3EF",
-"!+ c #72CEEC",
-"~+ c #5AA7D1",
-"{+ c #4F99C9",
-"]+ c #4891C3",
-"^+ c #4087BC",
-"/+ c #387EB5",
-"(+ c #3277B1",
-"_+ c #2B70AB",
-":+ c #2463A2",
-"<+ c #1E5B9C",
-"[+ c #185395",
-"}+ c #165496",
-"|+ c #10498D",
-"1+ c #105F9E",
-"2+ c #0A9ECF",
-"3+ c #0088C0",
-"4+ c #038DC3",
-"5+ c #0A4A8C",
-"6+ c #114E8E",
-"7+ c #1989BD",
-"8+ c #22AAD7",
-"9+ c #28A2D0",
-"0+ c #2C71A9",
-"a+ c #3380B5",
-"b+ c #3EB9E1",
-"c+ c #45BDE3",
-"d+ c #4CC0E5",
-"e+ c #53C3E7",
-"f+ c #59C6E8",
-"g+ c #5EC9EA",
-"h+ c #64CBEB",
-"i+ c #69CDEC",
-"j+ c #6ECFED",
-"k+ c #70D0ED",
-"l+ c #64BDE1",
-"m+ c #55A6D1",
-"n+ c #3D82B8",
-"o+ c #3D8BBE",
-"p+ c #49AFD8",
-"q+ c #378DBF",
-"r+ c #225F9E",
-"s+ c #1D5698",
-"t+ c #174E92",
-"u+ c #12468B",
-"v+ c #0E3F85",
-"w+ c #115F9D",
-"x+ c #15A2D1",
-"y+ c #0395C9",
-"z+ c #0088C1",
-"A+ c #0190C6",
-"B+ c #079ACC",
-"C+ c #0FA0D0",
-"D+ c #169ECF",
-"E+ c #1D99CC",
-"F+ c #25AAD7",
-"G+ c #2BA0CE",
-"H+ c #32AED8",
-"I+ c #3AB7DF",
-"J+ c #41BBE1",
-"K+ c #47BEE3",
-"L+ c #4EC1E5",
-"M+ c #53C4E7",
-"N+ c #5FC8E9",
-"O+ c #63CAEA",
-"P+ c #67CBEB",
-"Q+ c #69CBEA",
-"R+ c #62BCE0",
-"S+ c #5AAFD7",
-"T+ c #478DBF",
-"U+ c #4084B9",
-"V+ c #3A7CB4",
-"W+ c #3E8CBF",
-"X+ c #4DBADF",
-"Y+ c #3383B8",
-"Z+ c #215B9B",
-"`+ c #1B5295",
-" @ c #164A8E",
-".@ c #114288",
-"+@ c #0D3A82",
-"@@ c #0E4C8E",
-"#@ c #1380B7",
-"$@ c #0D96C9",
-"%@ c #0089C1",
-"&@ c #007BB8",
-"*@ c #0085BE",
-"=@ c #008CC4",
-"-@ c #0496C9",
-";@ c #0B9DCF",
-">@ c #1168AB",
-",@ c #174F99",
-"'@ c #21AAD7",
-")@ c #28AED9",
-"!@ c #2FB1DB",
-"~@ c #36B5DE",
-"{@ c #3CB8E0",
-"]@ c #42BBE2",
-"^@ c #49BEE4",
-"/@ c #54C3E6",
-"(@ c #59C5E7",
-"_@ c #5DC7E8",
-":@ c #5FC5E7",
-"<@ c #53A9D3",
-"[@ c #4B96C6",
-"}@ c #478FC2",
-"|@ c #4186BB",
-"1@ c #3C7FB5",
-"2@ c #3676AF",
-"3@ c #306EA9",
-"4@ c #3889BD",
-"5@ c #44AFD8",
-"6@ c #2F84B9",
-"7@ c #194D91",
-"8@ c #15458A",
-"9@ c #144D90",
-"0@ c #0C367E",
-"a@ c #0C4086",
-"b@ c #1797C8",
-"c@ c #1295C8",
-"d@ c #0487C0",
-"e@ c #0079B6",
-"f@ c #0081BC",
-"g@ c #0E9ACC",
-"h@ c #1597CA",
-"i@ c #1CA7D5",
-"j@ c #23ABD8",
-"k@ c #2AAFDA",
-"l@ c #31B2DC",
-"m@ c #37B5DE",
-"n@ c #3DB8E0",
-"o@ c #43BBE2",
-"p@ c #49BEE3",
-"q@ c #4EC0E4",
-"r@ c #53C2E5",
-"s@ c #57C4E6",
-"t@ c #4EAAD4",
-"u@ c #4696C5",
-"v@ c #438FC0",
-"w@ c #4088BC",
-"x@ c #3C80B6",
-"y@ c #3778B1",
-"z@ c #3270AB",
-"A@ c #2C68A5",
-"B@ c #3D9AC8",
-"C@ c #46BADF",
-"D@ c #3DB0D8",
-"E@ c #287CB2",
-"F@ c #164D90",
-"G@ c #299ECC",
-"H@ c #1B79B0",
-"I@ c #1A8CBF",
-"J@ c #199BCC",
-"K@ c #1392C6",
-"L@ c #0A86BE",
-"M@ c #0079B7",
-"N@ c #006AAC",
-"O@ c #0074B3",
-"P@ c #007CB9",
-"Q@ c #0083BE",
-"R@ c #008BC2",
-"S@ c #0393C8",
-"T@ c #099CCD",
-"U@ c #10A1D1",
-"V@ c #17A4D3",
-"W@ c #1EA8D6",
-"X@ c #25ABD8",
-"Y@ c #2BAFDA",
-"Z@ c #37B5DD",
-"`@ c #3DB8DF",
-" # c #42BAE1",
-".# c #48BCE2",
-"+# c #4CBEE3",
-"@# c #50C0E4",
-"## c #48A8D3",
-"$# c #3F8EC0",
-"%# c #3C87BC",
-"&# c #3A81B7",
-"*# c #3679B1",
-"=# c #3171AC",
-"-# c #2D6AA6",
-";# c #2862A0",
-"># c #40A5D1",
-",# c #43B8DE",
-"'# c #3DB5DC",
-")# c #38B1DA",
-"!# c #2D9ECC",
-"~# c #2B9FCE",
-"{# c #246AAA",
-"]# c #1F96C7",
-"^# c #1996C9",
-"/# c #138DC3",
-"(# c #0E84BC",
-"_# c #0175B4",
-":# c #0068AC",
-"<# c #0070B1",
-"[# c #0077B5",
-"}# c #007FBA",
-"|# c #0086BF",
-"1# c #018DC4",
-"2# c #0596C9",
-"3# c #0B9DCE",
-"4# c #12A1D1",
-"5# c #1897C8",
-"6# c #1E96C7",
-"7# c #25A0CE",
-"8# c #2B90C2",
-"9# c #31A4D0",
-"0# c #37B4DD",
-"a# c #3CB7DF",
-"b# c #41B9E0",
-"c# c #45BBE0",
-"d# c #49BCE1",
-"e# c #4BBBE0",
-"f# c #419FCC",
-"g# c #3C91C2",
-"h# c #337AB1",
-"i# c #3072AC",
-"j# c #2C6BA7",
-"k# c #2864A1",
-"l# c #255F9E",
-"m# c #3FAAD4",
-"n# c #40B6DC",
-"o# c #3AB3DB",
-"p# c #35B0D8",
-"q# c #2F86BD",
-"r# c #29599F",
-"s# c #237DB7",
-"t# c #1E99CA",
-"u# c #1892C5",
-"v# c #1389C0",
-"w# c #0E7FBA",
-"x# c #0473B2",
-"y# c #0065AA",
-"z# c #0064A9",
-"A# c #006BAD",
-"B# c #0072B2",
-"C# c #0080BC",
-"D# c #0082BC",
-"E# c #028DC4",
-"F# c #0796C9",
-"G# c #0D88BD",
-"H# c #1372AB",
-"I# c #1982B8",
-"J# c #1F79B0",
-"K# c #247BB1",
-"L# c #2A86B9",
-"M# c #31B1DA",
-"N# c #36B3DC",
-"O# c #3AB5DD",
-"P# c #3FB7DE",
-"Q# c #42B9DF",
-"R# c #45BAE0",
-"S# c #48BBE0",
-"T# c #47B6DD",
-"U# c #3689BC",
-"V# c #2D72AB",
-"W# c #2C73AC",
-"X# c #2F7DB3",
-"Y# c #399BC9",
-"Z# c #3FB4DB",
-"`# c #3CB3DA",
-" $ c #37B0D9",
-".$ c #32AED7",
-"+$ c #2CA8D3",
-"@$ c #277EB8",
-"#$ c #229CCC",
-"$$ c #1D95C8",
-"%$ c #188DC2",
-"&$ c #1384BD",
-"*$ c #0D7AB6",
-"=$ c #066FB0",
-"-$ c #0057A0",
-";$ c #005FA5",
-">$ c #0066AA",
-",$ c #006DAF",
-"'$ c #006EAC",
-")$ c #004C8E",
-"!$ c #005595",
-"~$ c #025999",
-"{$ c #085D9B",
-"]$ c #0D64A0",
-"^$ c #1369A4",
-"/$ c #196EA7",
-"($ c #1E73AA",
-"_$ c #2376AD",
-":$ c #2AA0CE",
-"<$ c #2FAFD9",
-"[$ c #34B1DB",
-"}$ c #38B3DC",
-"|$ c #3BB5DC",
-"1$ c #3EB6DD",
-"2$ c #40B7DD",
-"3$ c #42B7DD",
-"4$ c #43B7DE",
-"5$ c #43B7DD",
-"6$ c #40B5DC",
-"7$ c #3DB4DB",
-"8$ c #3AB2DA",
-"9$ c #33AED6",
-"0$ c #2EABD5",
-"a$ c #29A5D2",
-"b$ c #259ECD",
-"c$ c #2094C6",
-"d$ c #1C8DC2",
-"e$ c #1787BE",
-"f$ c #127EB9",
-"g$ c #0D75B3",
-"h$ c #076AAC",
-"i$ c #005FA6",
-"j$ c #00539D",
-"k$ c #005AA2",
-"l$ c #0060A6",
-"m$ c #0068AB",
-"n$ c #0063A5",
-"o$ c #004487",
-"p$ c #004386",
-"q$ c #004789",
-"r$ c #004B8D",
-"s$ c #045192",
-"t$ c #095997",
-"u$ c #0E5F9C",
-"v$ c #1365A0",
-"w$ c #1869A4",
-"x$ c #1D6EA7",
-"y$ c #2274AB",
-"z$ c #28A6D2",
-"A$ c #2DAED8",
-"B$ c #31AFD9",
-"C$ c #34B1DA",
-"D$ c #37B2DB",
-"E$ c #39B3DB",
-"F$ c #3BB4DB",
-"G$ c #3CB4DB",
-"H$ c #3BB3DA",
-"I$ c #38B1D9",
-"J$ c #35AFD8",
-"K$ c #32ADD6",
-"L$ c #2EAAD4",
-"M$ c #2BA5D1",
-"N$ c #2795C5",
-"O$ c #2374AA",
-"P$ c #1E5691",
-"Q$ c #1A4C89",
-"R$ c #156AA5",
-"S$ c #1078B5",
-"T$ c #0B6FAF",
-"U$ c #0665A9",
-"V$ c #004A97",
-"W$ c #004D9A",
-"X$ c #00509A",
-"Y$ c #00579F",
-"Z$ c #0062A7",
-"`$ c #00468A",
-" % c #00387C",
-".% c #003C7F",
-"+% c #004083",
-"@% c #044D8E",
-"#% c #095493",
-"$% c #0E5A98",
-"%% c #13609C",
-"&% c #18659F",
-"*% c #1C6BA4",
-"=% c #219FCD",
-"-% c #25AAD5",
-";% c #29ABD6",
-">% c #2DADD7",
-",% c #30AED8",
-"'% c #32AFD8",
-")% c #34B0D8",
-"!% c #34AED7",
-"~% c #30ABD4",
-"{% c #2DA8D2",
-"]% c #2BA3CF",
-"^% c #289DCC",
-"/% c #2494C5",
-"(% c #20659E",
-"_% c #1C4684",
-":% c #183D7C",
-"<% c #133B7A",
-"[% c #0F5695",
-"}% c #0A5FA1",
-"|% c #055FA5",
-"1% c #00559F",
-"2% c #004D99",
-"3% c #004896",
-"4% c #002E74",
-"5% c #003C82",
-"6% c #004E94",
-"7% c #003377",
-"8% c #003175",
-"9% c #003578",
-"0% c #003B7F",
-"a% c #003F82",
-"b% c #014285",
-"c% c #044889",
-"d% c #094E8E",
-"e% c #0D5493",
-"f% c #125997",
-"g% c #167FB4",
-"h% c #1A96C7",
-"i% c #1EA5D2",
-"j% c #22A7D3",
-"k% c #25A9D4",
-"l% c #28AAD5",
-"m% c #2AAAD5",
-"n% c #2CABD6",
-"o% c #2DACD6",
-"p% c #2EACD5",
-"q% c #2DA9D3",
-"r% c #2CA6D1",
-"s% c #299FCD",
-"t% c #279ACA",
-"u% c #2495C7",
-"v% c #218FC3",
-"w% c #1D86BC",
-"x% c #1A4683",
-"y% c #163574",
-"z% c #112C6C",
-"A% c #0D2464",
-"B% c #082D6F",
-"C% c #044E94",
-"D% c #004F9A",
-"E% c #004292",
-"F% c #00347D",
-"G% c #002266",
-"H% c #002669",
-"I% c #00286C",
-"J% c #002B6F",
-"K% c #002E72",
-"L% c #003478",
-"M% c #00377B",
-"N% c #003A7E",
-"O% c #013D80",
-"P% c #044285",
-"Q% c #084889",
-"R% c #0D4D8D",
-"S% c #115492",
-"T% c #15609B",
-"U% c #189ACB",
-"V% c #1CA0CF",
-"W% c #1FA2CF",
-"X% c #21A3D1",
-"Y% c #24A4D1",
-"Z% c #25A5D1",
-"`% c #27A4D1",
-" & c #28A4D1",
-".& c #28A0CE",
-"+& c #289ECC",
-"@& c #2596C8",
-"#& c #2392C5",
-"$& c #208DC2",
-"%& c #1D87BD",
-"&& c #1A75AE",
-"*& c #173978",
-"=& c #132E6D",
-"-& c #0F2565",
-";& c #0B1D5D",
-">& c #071555",
-",& c #021151",
-"'& c #001F61",
-")& c #00276D",
-"!& c #003D8E",
-"~& c #003B89",
-"{& c #001E62",
-"]& c #002063",
-"^& c #002569",
-"/& c #002D72",
-"(& c #003074",
-"_& c #003579",
-":& c #033C7F",
-"<& c #074183",
-"[& c #0B4787",
-"}& c #0F5392",
-"|& c #1391C5",
-"1& c #1695C8",
-"2& c #1998CA",
-"3& c #1C99CA",
-"4& c #1E9ACB",
-"5& c #209BCB",
-"6& c #219BCB",
-"7& c #229ACA",
-"8& c #2399C9",
-"9& c #2397C8",
-"0& c #2394C6",
-"a& c #2291C4",
-"b& c #1E89C0",
-"c& c #1C84BC",
-"d& c #1A5B97",
-"e& c #174C89",
-"f& c #142D6C",
-"g& c #102665",
-"h& c #0C1E5D",
-"i& c #081756",
-"j& c #040F4F",
-"k& c #000847",
-"l& c #000541",
-"m& c #00033D",
-"n& c #00368A",
-"o& c #00256E",
-"p& c #00185A",
-"q& c #001A5D",
-"r& c #001D60",
-"s& c #001F63",
-"t& c #002568",
-"u& c #00276B",
-"v& c #00296D",
-"w& c #002B70",
-"x& c #003276",
-"y& c #023579",
-"z& c #063A7D",
-"A& c #0A5997",
-"B& c #0D87BF",
-"C& c #108AC1",
-"D& c #138CC3",
-"E& c #168EC4",
-"F& c #188FC4",
-"G& c #1A90C4",
-"H& c #1C90C4",
-"I& c #1D8FC4",
-"J& c #1D8EC3",
-"K& c #1D8CC2",
-"L& c #1D8AC0",
-"M& c #1C87BE",
-"N& c #1B83BC",
-"O& c #1A7FB9",
-"P& c #1864A0",
-"Q& c #164987",
-"R& c #132C6A",
-"S& c #102564",
-"T& c #0D1E5D",
-"U& c #091756",
-"V& c #06104E",
-"W& c #020947",
-"X& c #000441",
-"Y& c #00023C",
-"Z& c #000038",
-"`& c #003086",
-" * c #001A5E",
-".* c #001354",
-"+* c #001658",
-"@* c #001D5F",
-"#* c #001F62",
-"$* c #002164",
-"%* c #002367",
-"&* c #002D71",
-"** c #014C8E",
-"=* c #0474B2",
-"-* c #077CB9",
-";* c #0B80BA",
-">* c #0E82BB",
-",* c #1083BC",
-"'* c #1285BD",
-")* c #1485BE",
-"!* c #1686BD",
-"~* c #1785BD",
-"{* c #1884BC",
-"]* c #1882BB",
-"^* c #1880B9",
-"/* c #187DB7",
-"(* c #177AB6",
-"_* c #1571AF",
-":* c #143676",
-"<* c #122968",
-"[* c #0F2362",
-"}* c #0D1D5C",
-"|* c #0A1755",
-"1* c #030A47",
-"2* c #000239",
-"3* c #002A82",
-"4* c #00175D",
-"5* c #00104F",
-"6* c #001252",
-"7* c #001454",
-"8* c #001657",
-"9* c #00195C",
-"0* c #001C5E",
-"a* c #001D61",
-"b* c #002165",
-"c* c #002366",
-"d* c #002468",
-"e* c #006CAE",
-"f* c #006FB0",
-"g* c #0271B1",
-"h* c #0574B3",
-"i* c #0877B4",
-"j* c #0B78B5",
-"k* c #0F7AB6",
-"l* c #107AB7",
-"m* c #127AB6",
-"n* c #1279B5",
-"o* c #1377B4",
-"p* c #1375B3",
-"q* c #1372B1",
-"r* c #126FAF",
-"s* c #115797",
-"t* c #0F2766",
-"u* c #0D2160",
-"v* c #0B1B5A",
-"w* c #091554",
-"x* c #06104D",
-"y* c #030A46",
-"z* c #000540",
-"A* c #000036",
-"B* c #00237E",
-"C* c #002980",
-"D* c #002372",
-"E* c #001A60",
-"F* c #001659",
-"G* c #001358",
-"H* c #001A5F",
-"I* c #002064",
-"J* c #001B5E",
-"K* c #005397",
-"L* c #0065A9",
-"M* c #0067AB",
-"N* c #0069AC",
-"O* c #026AAD",
-"P* c #046CAE",
-"Q* c #0768AB",
-"R* c #0965A9",
-"S* c #0A6EAF",
-"T* c #0C6EAE",
-"U* c #0D6DAE",
-"V* c #0D6CAD",
-"W* c #0D6AAB",
-"X* c #0D67AA",
-"Y* c #0D64A7",
-"Z* c #0C498C",
-"`* c #0A1E5E",
-" = c #091856",
-".= c #071350",
-"+= c #050D4B",
-"@= c #020844",
-"#= c #00043F",
-"$= c #00023B",
-"%= c #000037",
-"&= c #000035",
-"*= c #000034",
-"== c #001A77",
-"-= c #00237D",
-";= c #002881",
-">= c #002D84",
-",= c #00287F",
-"'= c #000B6C",
-")= c #00388A",
-"!= c #003785",
-"~= c #001556",
-"{= c #001759",
-"]= c #00195B",
-"^= c #001C5F",
-"/= c #001C60",
-"(= c #004B91",
-"_= c #004287",
-":= c #00569C",
-"<= c #0061A7",
-"[= c #023187",
-"}= c #033388",
-"|= c #0563A7",
-"1= c #0662A7",
-"2= c #0762A7",
-"3= c #0860A6",
-"4= c #085EA4",
-"5= c #085CA3",
-"6= c #084388",
-"7= c #071B5B",
-"8= c #061453",
-"9= c #04104D",
-"0= c #030B48",
-"a= c #010742",
-"b= c #00033E",
-"c= c #00013A",
-"d= c #000033",
-"e= c #000032",
-"f= c #001C79",
-"g= c #00217C",
-"h= c #002780",
-"i= c #002B83",
-"j= c #003589",
-"k= c #001D63",
-"l= c #000F4F",
-"m= c #000F4E",
-"n= c #001050",
-"o= c #001152",
-"p= c #001353",
-"q= c #001455",
-"r= c #002F74",
-"s= c #00529A",
-"t= c #0058A1",
-"u= c #00529D",
-"v= c #0156A0",
-"w= c #02569F",
-"x= c #02549E",
-"y= c #03529D",
-"z= c #034F9A",
-"A= c #032062",
-"B= c #020F4E",
-"C= c #010C49",
-"D= c #000845",
-"E= c #00033C",
-"F= c #000138",
-"G= c #000135",
-"H= c #001474",
-"I= c #001F7B",
-"J= c #00247E",
-"K= c #002D83",
-"L= c #001051",
-"M= c #000A46",
-"N= c #000B48",
-"O= c #000C4A",
-"P= c #000D4B",
-"Q= c #000E4D",
-"R= c #001151",
-"S= c #001253",
-"T= c #00377E",
-"U= c #004E9A",
-"V= c #004C98",
-"W= c #00408C",
-"X= c #000946",
-"Y= c #00053F",
-"Z= c #000137",
-"`= c #000031",
-" - c #000030",
-".- c #001373",
-"+- c #001876",
-"@- c #001D79",
-"#- c #00267F",
-"$- c #000D4D",
-"%- c #000741",
-"&- c #000843",
-"*- c #000945",
-"=- c #000A47",
-"-- c #000B49",
-";- c #000D4C",
-">- c #002F77",
-",- c #00327A",
-"'- c #002267",
-")- c #002166",
-"!- c #00256A",
-"~- c #003D89",
-"{- c #004393",
-"]- c #003F90",
-"^- c #003C8D",
-"/- c #003382",
-"(- c #003587",
-"_- c #002069",
-":- c #00033A",
-"<- c #000136",
-"[- c #00002F",
-"}- c #000C6E",
-"|- c #001171",
-"1- c #001574",
-"2- c #001E7A",
-"3- c #00196A",
-"4- c #00053E",
-"5- c #000640",
-"6- c #000742",
-"7- c #00185B",
-"8- c #003787",
-"9- c #00398C",
-"0- c #00378B",
-"a- c #003388",
-"b- c #002779",
-"c- c #00063F",
-"d- c #00002D",
-"e- c #00096C",
-"f- c #000D6F",
-"g- c #001271",
-"h- c #001675",
-"i- c #001872",
-"j- c #000338",
-"k- c #00043A",
-"l- c #00043B",
-"m- c #00053D",
-"n- c #000844",
-"o- c #000944",
-"p- c #002573",
-"q- c #002E85",
-"r- c #002C83",
-"s- c #001E71",
-"t- c #00002E",
-"u- c #00002C",
-"v- c #000266",
-"w- c #00066A",
-"x- c #000A6D",
-"y- c #000E70",
-"z- c #000C58",
-"A- c #000643",
-"B- c #000337",
-"C- c #000236",
-"D- c #000339",
-"E- c #00053C",
-"F- c #00063E",
-"G- c #00073F",
-"H- c #00145A",
-"I- c #001C78",
-"J- c #000743",
-"K- c #00002A",
-"L- c #00005F",
-"M- c #000267",
-"N- c #000A6C",
-"O- c #000952",
-"P- c #000131",
-"Q- c #000132",
-"R- c #000133",
-"S- c #000134",
-"T- c #000235",
-"U- c #00196E",
-"V- c #001D7A",
-"W- c #001B78",
-"X- c #001977",
-"Y- c #001775",
-"Z- c #001473",
-"`- c #000E66",
-" ; c #00002B",
-".; c #000029",
-"+; c #000053",
-"@; c #00005E",
-"#; c #000265",
-"$; c #000464",
-"%; c #000130",
-"&; c #001160",
-"*; c #001164",
-"=; c #001674",
-"-; c #001272",
-";; c #001071",
-">; c #000E6F",
-",; c #000B6E",
-"'; c #00086C",
-"); c #00045F",
-"!; c #000152",
-"~; c #000046",
-"{; c #000051",
-"]; c #00005A",
-"^; c #00012F",
-"/; c #000542",
-"(; c #00106E",
-"_; c #001070",
-":; c #000F70",
-"<; c #00086B",
-"[; c #000367",
-"}; c #000163",
-"|; c #00005B",
-"1; c #000052",
-"2; c #000047",
-"3; c #000041",
-"4; c #000028",
-"5; c #000021",
-"6; c #000025",
-"7; c #00003E",
-"8; c #00003A",
-"9; c #00075A",
-"0; c #00076B",
-"a; c #000569",
-"b; c #000368",
-"c; c #000162",
-"d; c #00005C",
-"e; c #000054",
-"f; c #00004C",
-"g; c #000042",
-"h; c #000039",
-"i; c #000026",
-"j; c #000023",
-"k; c #000017",
-"l; c #00001C",
-"m; c #00004D",
-"n; c #000055",
-"o; c #000027",
-"p; c #00003D",
-"q; c #000058",
-"r; c #00004E",
-"s; c #000048",
-"t; c #000019",
-"u; c #000012",
-"v; c #00001D",
-"w; c #00001F",
-"x; c #000044",
-"y; c #000008",
-"z; c #000018",
-"A; c #000024",
-"B; c #000015",
-"C; c #000022",
-"D; c #00000F",
-"E; c #000004",
-"F; c #000007",
-"G; c #000009",
-"H; c #00000C",
-"I; c #00000D",
-"J; c #00000E",
-"K; c #00000A",
-"L; c #000003",
-"M; c #000000",
-"N; c #000001",
-"O; c #000005",
-"P; c #00000B",
-" ",
-" ",
-" . + @ # $ % & * ",
-" = - ; > , ' ) ! ~ { ] ^ / ( _ : ",
-" < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e ",
-" f g h i j k l m n o p q r s t u v w x y z A B ",
-" C D E F G H I J K L M N O P Q R S T U V W X Y Z ` . ",
-" ..+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|. ",
-" 1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s. ",
-" t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y. ",
-" Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+ ",
-" 3+4+5+6+7+8+9+0+a+b+c+d+e+f+g+h+i+j+k+k+l+m+]+n+o+p+q+r+s+t+u+v+w+x+y+ ",
-" z+A+B+C+D+E+F+G+H+I+J+K+L+M+f+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@@@#@$@%@ ",
-" &@*@=@-@;@>@,@'@)@!@~@{@]@^@L+/@(@_@:@<@[@}@|@1@2@3@4@5@6@7@8@9@0@a@b@c@d@ ",
-" e@f@z+A+B+g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@C@D@E@F@G@H@I@J@K@L@M@ ",
-" N@O@P@Q@R@S@T@U@V@W@X@Y@l@Z@`@ #.#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#/#(#_# ",
-" :#<#[#}#|#1#2#3#4#5#6#7#8#9#0#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o#p#q#r#s#t#u#v#w#x#y# ",
-" z#A#B#M@C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z#`# $.$+$@$#$$$%$&$*$=$z# ",
-" -$;$>$,$O@'$)$!$~${$]$^$/$($_$:$<$[$}$|$1$2$3$4$5$3$6$7$8$ $9$0$a$b$c$d$e$f$g$h$i$ ",
-" j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$D$E$F$G$G$H$8$I$J$K$L$M$N$O$P$Q$R$S$T$U$k$V$ ",
-" W$X$Y$Z$`$ %.%+%p$q$@%#%$%%%&%*%=%-%;%>%,%'%)%p#p#J$!%K$~%{%]%^%/%(%_%:%<%[%}%|%1%2% ",
-" 3%4%5%6%7%8%9% %0%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o%p%0$q%r%]%s%t%u%v%w%x%y%z%A%B%C%D%3% ",
-" E%F%G%H%I%J%K%8%L%M%N%O%P%Q%R%S%T%U%V%W%X%Y%Z%`% &9+.&+&V.@&#&$&%&&&*&=&-&;&>&,&'&)& ",
-" !&~&{&]&G%^&I%J%/&(&7%_& %:&<&[&}&|&1&2&3&4&5&6&7&8&9&0&a&$&b&c&d&e&f&g&h&i&j&k&l&m& ",
-" n&o&p&q&r&s&G%t&u&v&w&K%(&x&y&z&A&B&C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V&W&X&Y&Z& ",
-" `& *.*+*p&q&@*#*$*%*^&u&v&J%&***=*-*;*>*,*'*)*!*~*{*]*^*/*(*_*:*<*[*}*|*V&1*l&Y&Z&2* ",
-" 3*4*5*6*7*8*p&9*0*a*s&b*c*d*v&e*f*g*h*i*j**$k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*Y&Z&A*z* ",
-" B*C*D*E*F*G*H*I*+*p&9*J*r&{&x&K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*`* =.=+=@=#=$=%=&=*= ",
-" ==-=;=>=,='=)=!=J*.*~=+*{=]=^=/=(=_=:=l$<=[=}=|=1=2=3=4=5=6=7=8=9=0=a=b=c=%=&=d=e= ",
-" f=g=h=i=3*j=k=l=m=n=o=p=q=~=8*r=^=b*s=t=j$u=-$v=w=x=y=z=A=B=C=D=z*E=F=A*&=d=e=G= ",
-" H===I=J=;=K=L=M=N=O=P=Q=l=n=R=6*S=.*T=D%D%D%U=2%V=V$3%W=J*L=X=Y=$=Z=&=*=e=`= - ",
-" .-+-@-g=#-$-%-&-*-M==---O=P=;-Q=m=>-,-'-)-!-~-{-E%]-^-/-(-_-:-<-*=d=e=`=[-[- ",
-" }-|-1-==2-3-4-4-5-%-6-&-*-X==-=-N=q&;-O=O=O=7-8-9-0-j=a-`&b-c-d=e=`= -[-d-$= ",
-" e-f-g-h-i-4-j-k-l-m-4-c-5-%-6-6-&-&-n-o-o-*-M=p-q-r-3*h=s-X=`= -[-t-u-u- ",
-" v-w-x-y-g-z-A-B-C-j-D-:-l-l-E-m-4-F-F-c-c-c-G-H-#-J=g=I=I-J-t-t-d-u-K- ",
-" L-M-w-N-f-O-P-Q-R-S-T-C-C-B-j-D-D-:-k-l-k-D=U-V-W-X-Y-Z-`-[- ; ;.;u- ",
-" +;@;#;$; ;u-d-t-[- -%;P-Q-R-R-S-B-z*&;*;Y-=;H=-;;;>;,;';);!;%=d- ",
-" ~;{;];u-.;K- ; ;u-d-d-d-t-t-^;/;(;_;;;:;f-}-x-<;w-[;};|;1;2; ",
-" A*%=3;4;5;6;u-7;8;u-K- ; ; ; ;^;9;<;0;w-a;b;v-c;d;e;f;g;h; ",
-" i;j;k;l;d=m;1;n;d= ;i;o;o;o;o;p;@;d;q;+;r;s;3;h;`=K- ",
-" t;u;k;o;e=Z&%=5;*=l;v;v;v;w; ;x;3;p;Z&d=d-i;w; ",
-" y;u;z;v;5;A;A;B;u;u;u;j; ;.;i;C;v;z;u;D; ",
-" E;E;F;G;H;I;I;I;H;D;J;H;K;F;E;K; ",
-" y;L;M;M;N;N;M;N;O;P; ",
-" ",
-" ",
-" ",
-" "};
new file mode 100644
index 0000000000000000000000000000000000000000..9f8274b1371921d92f2651cb9511d66b008b607a
GIT binary patch
literal 722
zc$@*!0xkWCP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XU
z000XU0RWnu7ytkQgh@m}R5*>5lS@cc0Te*bn|br~sWW3^qZUS1B!n48&_}U?pu$`P
zwGgrhjB3}eMPNzLrWURWT13$zBElk~f~2U7(9%RiQZm2I|NESo_idA6X+>vs;c^d`
z`vJfN!35!FY~eo;<^!|q&~7v{i5v=$mIra#e8S031OF0;0Ol2MG5)HpRBmfRQ#7<W
z2YnAa&2|Qbc8tFY%yulSt@l%2-Jk{bc(C~N(ZNUJXn%Bb)2*h*j#I4_Zcni@J~JES
z&au#P9f-Ibeo~=sQHh***)wQ#T<TO+YuWyNr;i_W*VL}F`wH!oV=H6h{;n6Z?>=AV
z{e|IqfkkLX5t{DzkdxB{dp_K_dOq{Ir+;-kk*uxusx{>$1@20(Q(Pe!r9Owf#Zy(@
zP0P)l^8zb?d2N-8XmElz54tbvN7rO5_PtpQ%*JM<KmaYCB0M%rPL`45vSd_M)N8J~
zyNo@{iU7j7sVq!oq0P;ix&zkc1_}$Eq-;KBlNt1h5b;P7_ohlbo<cOMYkf|VjsVxi
zUna8ASIzhE27P9lm=%P84`o*kQb`fkIu}_4jC2}fViGdB#-#$)C}L>Xf|5p+iim_`
z<jYDa@O!Z7I(kB8?rk5rfg#W}&%zxn5c?KJ3godk9E5{txh#p#Uy+Nw*z6+a$S`Ve
zFRGjZQ=3^Th~N8yarPrc#oI}ZLNbCG4Wan_DBd!VbC6AdnFqwD3tL!(PF{+TwH!uI
zSW#n;PeURB85`saAeRCo{v3iGkXC;e0OKPVN(v*k18fe=3<w%1B4kFvNWOw-8%%{@
z(K9W@(*V|1(6@l;0%00>0*Tu|^v`w6m_RB8oXaJD0B=VW0A4+5-T(jq07*qoM6N<$
Ef*YVbfB*mh
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -63,16 +63,25 @@ pref("xpinstall.dialog.progress.type.chr
// their extensions are being updated and thus reregistered every time the app is
// started.
pref("extensions.ignoreMTimeChanges", false);
// Enables some extra Extension System Logging (can reduce performance)
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);
pref("extensions.blocklist.url", "https://addons.mozilla.org/blocklist/1/%APP_ID%/%APP_VERSION%/");
pref("extensions.blocklist.detailsURL", "http://%LOCALE%.www.mozilla.com/%LOCALE%/blocklist/");
// Dictionary download preference
pref("browser.dictionaries.download.url", "https://%LOCALE%.add-ons.mozilla.com/%LOCALE%/firefox/%VERSION%/dictionaries/");
@@ -212,16 +221,17 @@ pref("browser.download.manager.showAlert
pref("browser.download.manager.retention", 2);
pref("browser.download.manager.showWhenStarting", true);
pref("browser.download.manager.useWindow", true);
pref("browser.download.manager.closeWhenDone", false);
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/");
// pointer to the default engine name
pref("browser.search.defaultenginename", "chrome://browser-region/locale/region.properties");
// disable logging for the search service by default
@@ -330,24 +340,25 @@ pref("dom.disable_window_move_resize",
pref("dom.disable_window_flip", true);
// popups.policy 1=allow,2=reject
pref("privacy.popups.policy", 1);
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);
pref("network.proxy.share_proxy_settings", false); // use the same proxy settings for all protocols
pref("network.cookie.cookieBehavior", 1); // 0-Accept, 1-dontAcceptForeign, 2-dontUse
@@ -594,17 +605,55 @@ pref("browser.places.importBookmarksHTML
// if false, will add the "Smart Bookmarks" folder to the personal toolbar
pref("browser.places.createdSmartBookmarks", false);
// If true, will migrate uri post-data annotations to
// bookmark post-data annotations (bug 398914)
// 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
// 2 - pre-populate site URL and pre-fetch certificate
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/");
--- a/browser/app/splash.rc
+++ b/browser/app/splash.rc
@@ -63,21 +63,23 @@ END
#define IDC_CELL 4103
#define IDC_COPY 4104
#define IDC_ALIAS 4105
#define IDC_ZOOMIN 4106
#define IDC_ZOOMOUT 4107
#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"
IDC_CELL CURSOR DISCARDABLE "../../widget/src/build/res/cell.cur"
IDC_COPY CURSOR DISCARDABLE "../../widget/src/build/res/copy.cur"
IDC_ALIAS CURSOR DISCARDABLE "../../widget/src/build/res/aliasb.cur"
IDC_ZOOMIN CURSOR DISCARDABLE "../../widget/src/build/res/zoom_in.cur"
IDC_ZOOMOUT CURSOR DISCARDABLE "../../widget/src/build/res/zoom_out.cur"
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
--- a/browser/app/splashos2.rc
+++ b/browser/app/splashos2.rc
@@ -66,12 +66,13 @@ POINTER IDC_CELL "..\\..\\widg
POINTER IDC_COPY "..\\..\\widget\\src\\os2\\res\\copy.ptr"
POINTER IDC_ALIAS "..\\..\\widget\\src\\os2\\res\\aliasb.ptr"
POINTER IDC_ZOOMIN "..\\..\\widget\\src\\os2\\res\\zoom_in.ptr"
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"
#endif
--- a/browser/base/content/aboutDialog.css
+++ b/browser/base/content/aboutDialog.css
@@ -74,17 +74,17 @@
margin-top: 0;
-moz-margin-end: 0;
margin-bottom: 10px;
-moz-margin-start: 17px;
}
#copyright {
margin-top: 0;
- -moz-margin-end: 0;
+ -moz-margin-end: 16px;
margin-bottom: 3px;
-moz-margin-start: 16px;
}
button[dlgtype="extra2"] {
-moz-margin-start: 13px;
}
--- a/browser/base/content/aboutDialog.xul
+++ b/browser/base/content/aboutDialog.xul
@@ -70,17 +70,17 @@
<script type="application/x-javascript" src="chrome://browser/content/aboutDialog.js"/>
<deck id="modes" flex="1">
<vbox flex="1" id="clientBox">
#expand <label id="version" value="&aboutVersion; __MOZ_APP_VERSION__"/>
<label id="distribution"/>
<label id="distributionId"/>
- <description id="copyright">©rightText;</description>
+ <description id="copyright">©rightInfo;</description>
<textbox id="userAgent" multiline="true" readonly="true"/>
</vbox>
<vbox flex="1" id="creditsBox">
<iframe id="creditsIframe" flex="1"/>
</vbox>
</deck>
<separator class="groove" id="groove"/>
new file mode 100644
--- /dev/null
+++ b/browser/base/content/bindings.xml
@@ -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>
--- a/browser/base/content/browser-context.inc
+++ b/browser/base/content/browser-context.inc
@@ -49,18 +49,18 @@
accesskey="&openLinkCmd.accesskey;"
oncommand="gContextMenu.openLink();"/>
<menuitem id="context-openlinkintab"
label="&openLinkCmdInTab.label;"
accesskey="&openLinkCmdInTab.accesskey;"
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;"
accesskey="&saveLinkCmd.accesskey;"
oncommand="gContextMenu.saveLink();"/>
<menuitem id="context-sendlink"
label="&sendLinkCmd.label;"
accesskey="&sendLinkCmd.accesskey;"
@@ -121,18 +121,18 @@
accesskey="&reloadCmd.accesskey;"
command="Browser:Reload"/>
<menuitem id="context-stop"
label="&stopCmd.label;"
accesskey="&stopCmd.accesskey;"
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;"
accesskey="&savePageCmd.accesskey2;"
oncommand="gContextMenu.savePageAs();"/>
<menuitem id="context-sendpage"
label="&sendPageCmd.label;"
accesskey="&sendPageCmd.accesskey;"
@@ -189,18 +189,18 @@
<menuitem label="&openFrameCmdInTab.label;"
accesskey="&openFrameCmdInTab.accesskey;"
oncommand="gContextMenu.openFrameInTab();"/>
<menuseparator/>
<menuitem label="&reloadFrameCmd.label;"
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;"
oncommand="saveDocument(gContextMenu.target.ownerDocument);"/>
<menuseparator/>
<menuitem label="&printFrameCmd.label;"
accesskey="&printFrameCmd.accesskey;"
oncommand="gContextMenu.printFrame();"/>
@@ -235,19 +235,19 @@
accesskey="&viewPageInfoCmd.accesskey;"
oncommand="gContextMenu.viewInfo();"/>
<menuitem id="context-metadata"
label="&metadataCmd.label;"
accesskey="&metadataCmd.accesskey;"
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"
label="&spellAddDictionaries.label;"
accesskey="&spellAddDictionaries.accesskey;"
oncommand="gContextMenu.addDictionaries();"/>
#endif
<menu id="spell-dictionaries"
--- a/browser/base/content/browser-menubar.inc
+++ b/browser/base/content/browser-menubar.inc
@@ -83,17 +83,19 @@
#endif
#endif
oncommand="goQuitApplication();"/>
</menupopup>
</menu>
<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;"
command="cmd_undo"/>
<menuitem label="&redoCmd.label;"
key="key_redo"
accesskey="&redoCmd.accesskey;"
command="cmd_redo"/>
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -92,21 +92,18 @@ var PlacesCommandHook = {
case "popuphidden":
if (aEvent.originalTarget == this.panel) {
gEditItemOverlay.uninitPanel(true);
this._restoreCommandsState();
}
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;
}
},
_overlayLoaded: false,
_overlayLoading: false,
showEditBookmarkPopup:
function PCH_showEditBookmarkPopup(aItemId, aAnchorElement, aPosition) {
@@ -203,17 +200,17 @@ var PlacesCommandHook = {
}
if (aShowEditUI) {
// dock the panel to the star icon when possible, otherwise dock
// it to the content area
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;
}
}
this.showEditBookmarkPopup(itemId, aBrowser, "overlap");
}
},
/**
--- a/browser/base/content/browser-sets.inc
+++ b/browser/base/content/browser-sets.inc
@@ -102,19 +102,17 @@
<command id="Browser:Reload" oncommand="if (event.shiftKey) BrowserReloadSkipCache(); else BrowserReload()" disabled="true"/>
<command id="Browser:ReloadSkipCache" oncommand="BrowserReloadSkipCache()" disabled="true"/>
<command id="cmd_fullZoomReduce" oncommand="FullZoom.reduce()"/>
<command id="cmd_fullZoomEnlarge" oncommand="FullZoom.enlarge()"/>
<command id="cmd_fullZoomReset" oncommand="FullZoom.reset()"/>
<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);"/>
<command id="History:UndoCloseTab" oncommand="undoCloseTab();"/>
</commandset>
<commandset id="placesCommands">
<command id="Browser:ShowAllBookmarks"
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -18,16 +18,27 @@ toolbar[printpreview="true"] {
#PopupAutoComplete {
-moz-binding: url("chrome://browser/content/urlbarBindings.xml#browser-autocomplete-result-popup");
}
#PopupAutoCompleteRichResult {
-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;
}
#sidebar-box toolbarbutton.tabs-closebutton {
-moz-user-focus: normal;
}
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -53,16 +53,22 @@
# 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 *****
+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";
const nsIWebNavigation = Components.interfaces.nsIWebNavigation;
const MAX_HISTORY_MENU_ITEMS = 15;
// bookmark dialog features
@@ -94,31 +100,36 @@ var gMustLoadSidebar = false;
var gProgressMeterPanel = null;
var gProgressCollapseTimer = null;
var gPrefService = null;
var appCore = null;
var gBrowser = null;
var gNavToolbox = null;
var gSidebarCommand = "";
var gInPrintPreviewMode = false;
+let gDownloadMgr = null;
// Global variable that holds the nsContextMenu instance.
var gContextMenu = null;
var gChromeState = null; // chrome state before we went into print preview
var gSanitizeListener = null;
var gAutoHideTabbarPrefListener = null;
var gBookmarkAllTabsHandler = null;
#ifdef XP_MACOSX
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.
*/
function pageShowEventHandlers(event)
{
// Filter out events that are not about the document load we are interested in
@@ -165,16 +176,55 @@ function UpdateBackForwardCommands(aWebN
if (forwardDisabled == aWebNavigation.canGoForward) {
if (forwardDisabled)
forwardBroadcaster.removeAttribute("disabled");
else
forwardBroadcaster.setAttribute("disabled", true);
}
}
+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
* XXXmano: should this live in toolbarbutton.xml?
*/
function ClickAndHoldMouseDownCallback(aButton)
{
aButton.open = true;
@@ -884,17 +934,18 @@ function delayedStartup()
var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
os.addObserver(gSessionHistoryObserver, "browser:purge-session-history", false);
os.addObserver(gXPInstallObserver, "xpinstall-install-blocked", false);
if (!gPrefService)
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");
gURLBar.setAttribute("enablehistory", "false");
}
gBrowser.addEventListener("pageshow", function(evt) { setTimeout(pageShowEventHandlers, 0, evt); }, true);
window.addEventListener("keypress", ctrlNumberTabSelection, false);
@@ -903,16 +954,17 @@ function delayedStartup()
Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
if (gMustLoadSidebar) {
var sidebar = document.getElementById("sidebar");
var sidebarBox = document.getElementById("sidebar-box");
sidebar.setAttribute("src", sidebarBox.getAttribute("src"));
}
+ UnifiedBackForwardButton.unify();
UpdateUrlbarSearchSplitterState();
try {
placesMigrationTasks();
} catch(ex) {}
initBookmarksToolbar();
PlacesStarButton.init();
@@ -1044,23 +1096,43 @@ function delayedStartup()
gBookmarkAllTabsHandler = new BookmarkAllTabsHandler();
// Attach a listener to watch for "command" events bubbling up from error
// pages. This lets us fix bugs like 401575 which require error page UI to
// do privileged things, without letting error pages have any privilege
// 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()
{
try {
FullZoom.destroy();
}
catch(ex) {
@@ -1086,16 +1158,17 @@ function BrowserShutdown()
} catch (ex) {
Components.utils.reportError(ex);
}
if (gSanitizeListener)
gSanitizeListener.shutdown();
BrowserOffline.uninit();
+ OfflineApps.uninit();
var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
var enumerator = windowManagerInterface.getEnumerator(null);
enumerator.getNext();
if (!enumerator.hasMoreElements()) {
document.persist("sidebar-box", "sidebarcommand");
document.persist("sidebar-box", "width");
@@ -1264,23 +1337,25 @@ function ctrlNumberTabSelection(event)
if (!(document.commandDispatcher.focusedElement instanceof HTMLAnchorElement)) {
// Don't let winxp beep on ALT+ENTER, since the URL bar uses it.
event.preventDefault();
return;
}
}
#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;
// \d in a RegExp will find any Unicode character with the "decimal digit"
// property (Nd)
var regExp = /\d/;
if (!regExp.test(String.fromCharCode(event.charCode)))
@@ -1404,22 +1479,24 @@ function BrowserHandleShiftBackspace()
case 1:
goDoCommand("cmd_scrollPageDown");
break;
}
}
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()
{
try {
const stopFlags = nsIWebNavigation.STOP_ALL;
getWebNavigation().stop(stopFlags);
}
@@ -1491,23 +1568,30 @@ function loadOneOrMoreURIs(aURIString)
// so that we don't disrupt startup
try {
gBrowser.loadTabs(aURIString.split("|"), false, true);
}
catch (e) {
}
}
-function openLocation()
+function focusAndSelectUrlBar()
{
if (gURLBar && isElementVisible(gURLBar) && !gURLBar.readOnly) {
gURLBar.focus();
gURLBar.select();
+ return true;
+ }
+ return false;
+}
+
+function openLocation()
+{
+ if (focusAndSelectUrlBar())
return;
- }
#ifdef XP_MACOSX
if (window.location.href != getBrowserURL()) {
var win = getTopWin();
if (win) {
// If there's an open browser window, it should handle this command
win.focus()
win.openLocation();
}
@@ -1899,20 +1983,35 @@ function URLBarSetURI(aURI) {
value = aURI.spec;
if (value == "about:blank") {
// Replace "about:blank" with an empty string
// only if there's no opener (bug 370555).
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";
}
}
gURLBar.value = value;
SetPageProxyState(state);
}
@@ -2872,45 +2971,77 @@ const BrowserSearch = {
function FillHistoryMenu(aParent, aMenu)
{
// Remove old entries if any
deleteHistoryItems(aParent);
var webNav = getWebNavigation();
var sessionHistory = webNav.sessionHistory;
+ var bundle_browser = document.getElementById("bundle_browser");
var count = sessionHistory.count;
var index = sessionHistory.index;
var end;
var j;
var entry;
switch (aMenu)
{
case "back":
end = (index > MAX_HISTORY_MENU_ITEMS) ? index - MAX_HISTORY_MENU_ITEMS : 0;
if ((index - 1) < end) return false;
for (j = index - 1; j >= end; j--)
{
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":
end = ((count-index) > MAX_HISTORY_MENU_ITEMS) ? index + MAX_HISTORY_MENU_ITEMS : count - 1;
if ((index + 1) > end) return false;
for (j = index + 1; j <= end; j++)
{
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;
}
function addToUrlbarHistory(aUrlToAdd)
{
if (!aUrlToAdd)
@@ -2922,22 +3053,26 @@ function addToUrlbarHistory(aUrlToAdd)
if (aUrlToAdd.indexOf(" ") == -1) {
PlacesUtils.markPageAsTyped(aUrlToAdd);
}
}
catch(ex) {
}
}
-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)
{
var children = aParent.childNodes;
for (var i = children.length - 1; i >= 0; --i)
{
var index = children[i].getAttribute("index");
@@ -2946,16 +3081,22 @@ function deleteHistoryItems(aParent)
}
}
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();
var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator);
var topWindow = windowManagerInterface.getMostRecentWindow(inType);
if (topWindow)
topWindow.focus();
@@ -3020,16 +3161,18 @@ function BrowserCustomizeToolbar()
// Disable the toolbar context menu items
var menubar = document.getElementById("main-menubar");
for (var i = 0; i < menubar.childNodes.length; ++i)
menubar.childNodes[i].setAttribute("disabled", true);
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);
#ifdef TOOLBAR_CUSTOMIZATION_SHEET
var sheetFrame = document.getElementById("customizeToolbarSheetIFrame");
sheetFrame.hidden = false;
// XXXmano: there's apparently no better way to get this when the iframe is
@@ -3056,18 +3199,23 @@ function BrowserToolboxCustomizeDone(aTo
if (aToolboxChanged) {
gURLBar = document.getElementById("urlbar");
gProxyButton = document.getElementById("page-proxy-button");
gProxyFavIcon = document.getElementById("page-proxy-favicon");
gProxyDeck = document.getElementById("page-proxy-deck");
gHomeButton.updateTooltip();
gIdentityHandler._cacheElements();
window.XULBrowserWindow.init();
+
+#ifndef XP_MACOSX
+ updateEditUIVisibility();
+#endif
}
+ UnifiedBackForwardButton.unify();
UpdateUrlbarSearchSplitterState();
// Update the urlbar
if (gURLBar) {
URLBarSetURI();
XULBrowserWindow.asyncUpdateUI();
PlacesStarButton.updateState();
}
@@ -3096,16 +3244,77 @@ function BrowserToolboxCustomizeDone(aTo
initBookmarksToolbar();
#ifndef TOOLBAR_CUSTOMIZATION_SHEET
// XXX Shouldn't have to do this, but I do
window.focus();
#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()
{
// show/hide all menubars, toolbars, and statusbars (except the full screen toolbar)
this.showXULChrome("toolbar", window.fullScreen);
this.showXULChrome("statusbar", window.fullScreen);
document.getElementById("fullScreenItem").setAttribute("checked", !window.fullScreen);
@@ -3274,17 +3483,20 @@ nsBrowserStatusHandler.prototype =
setDefaultStatus : function(status)
{
this.defaultStatus = status;
this.updateStatusField();
},
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();
},
updateStatusField : function()
{
var text = this.overLink || this.status || this.jsStatus || this.jsDefaultStatus || this.defaultStatus;
// check the current value so we don't trigger an attribute change
@@ -3358,16 +3570,21 @@ nsBrowserStatusHandler.prototype =
else if (aStateFlags & nsIWebProgressListener.STATE_STOP) {
if (aStateFlags & nsIWebProgressListener.STATE_IS_NETWORK) {
if (aWebProgress.DOMWindow == content) {
if (aRequest)
this.endDocumentLoad(aRequest, aStatus);
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);
+ }
}
}
// This (thanks to the filter) is a network stop or the last
// request stop outside of loading the document, stop throbbers
// and progress bars and such
if (aRequest) {
var msg = "";
@@ -4816,16 +5033,127 @@ var BrowserOffline = {
var offlineLocked = gPrefService.prefIsLocked("network.online");
if (offlineLocked)
this._uiElement.setAttribute("disabled", "true");
this._uiElement.setAttribute("checked", aOffline);
}
};
+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();
var cn = browser.tabContainer.childNodes;
var numtabs = cn.length;
var reallyClose = true;
for (var i = 0; reallyClose && i < numtabs; ++i) {
@@ -5738,26 +6066,33 @@ IdentityHandler.prototype = {
body = this._stringBundle.getString("identity.unknown.body");
}
// Push the appropriate strings out to the UI
this._identityPopupContent.textContent = body;
this._identityPopupContentSupp.textContent = supplemental;
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
this._identityPopup.hidden = false;
// Tell the popup to consume dismiss clicks, to avoid bug 395314
this._identityPopup.popupBoxObject
.setConsumeRollupEvent(Ci.nsIPopupBoxObject.ROLLUP_CONSUME);
@@ -5775,8 +6110,115 @@ var gIdentityHandler;
* Returns the singleton instance of the identity handler class. Should always be
* used instead of referencing the global variable directly or creating new instances
*/
function getIdentityHandler() {
if (!gIdentityHandler)
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]),
+};
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -101,17 +101,18 @@
<!-- for search and content formfill/pw manager -->
<panel type="autocomplete" chromedir="&locale.dir;" id="PopupAutoComplete" noautofocus="true" hidden="true"/>
<!-- for url bar autocomplete -->
<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"/>
<button id="editBookmarkPanelDeleteButton"
label="&editBookmark.delete.label;"
oncommand="PlacesCommandHook.deleteButtonOnCommand();"/>
<button id="editBookmarkPanelDoneButton"
label="&editBookmark.done.label;"
@@ -132,46 +133,49 @@
onpopupshowing="gPopupBlockerObserver.fillPopupList(event);">
<menuitem observes="blockedPopupAllowSite"/>
<menuitem observes="blockedPopupEditSettings"/>
<menuitem observes="blockedPopupDontShowMessage"/>
<menuseparator observes="blockedPopupsSeparator"/>
</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"/>
<description id="identity-popup-content-verifier"/>
<hbox id="identity-popup-encryption" flex="1">
<vbox>
<image id="identity-popup-encryption-icon"/>
<spacer flex="1"/>
</vbox>
<description id="identity-popup-encryption-label" flex="1"/>
</hbox>
<spacer flex="1"/>
<!-- Footer link to page info -->
<label id="identity-popup-more-info-link"
class="text-link plain"
value="&identity.moreInfoLinkText;"
+ onblur="getIdentityHandler().hideIdentityPopup();"
onclick="getIdentityHandler().handleMoreInfoClick(event);"/>
</vbox>
</hbox>
</panel>
<tooltip id="urlTooltip">
<label crop="center" flex="1"/>
</tooltip>
@@ -264,18 +268,19 @@
maxrows="10"
newlines="stripsurroundingwhitespace"
oninput="URLBarOnInput(event);"
ontextentered="return handleURLBarCommand(param);"
ontextreverted="return handleURLBarRevert();"
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"
ondraggesture="PageProxyDragGesture(event);"
tooltiptext="&proxyIcon.tooltip;"/>
<image id="page-proxy-favicon" validate="never"
ondraggesture="PageProxyDragGesture(event);"
onload="this.parentNode.selectedIndex = 1;
@@ -460,16 +465,19 @@
</panel>
#endif
<findbar browserid="content" id="FindToolbar"/>
<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>
<statusbarpanel id="security-button" class="statusbarpanel-iconic-text"
ondblclick="if (event.button == 0) displaySecurityInfo();"/>
<statusbarpanel id="page-report-button" type="menu"
class="statusbarpanel-menu-iconic"
tooltiptext="&pageReportIcon.tooltip;">
--- a/browser/base/content/credits.xhtml
+++ b/browser/base/content/credits.xhtml
@@ -459,17 +459,17 @@
<li>Radiant Core</li>
<li>silverorange</li>
<li>Revver</li>
<li></li>
<li>MozillaZine Community</li>
</ul>
</div>
- <p id="gecko" class="center">&credit.poweredByGecko;®</p>
+ <p id="gecko" class="center">&credit.poweredByGeckoReg;</p>
<p class="footnote">
&brandFullName;™ &license.part0; ©1998-2008 &license.part1;
<a href="" link="about:credits" onclick="visitLink(event);">&license.contrib;</a>,
&license.part2;
<a href="" link="about:license" onclick="visitLink(event);">about:license</a>
&license.part3;</p>
--- a/browser/base/content/nsContextMenu.js
+++ b/browser/base/content/nsContextMenu.js
@@ -78,16 +78,21 @@ function nsContextMenu(aXulMenu, aBrowse
this.inFrame = false;
this.hasBGImage = false;
this.isTextSelected = false;
this.isContentSelected = false;
this.inDirList = false;
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);
}
// Prototype for nsContextMenu "class."
nsContextMenu.prototype = {
// onDestroy is a no-op at this point.
@@ -244,17 +249,17 @@ nsContextMenu.prototype = {
var hostLabel = "";
try {
hostLabel = uri.host;
} catch (ex) { }
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())
blockImage.setAttribute("checked", "true");
else
blockImage.removeAttribute("checked");
}
}
@@ -834,19 +839,20 @@ nsContextMenu.prototype = {
},
toggleImageBlocking: function(aBlock) {
var permissionmanager = Cc["@mozilla.org/permissionmanager;1"].
getService(Ci.nsIPermissionManager);
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");
var bundle_browser = document.getElementById("bundle_browser");
var message = bundle_browser.getFormattedString(aBlock ?
"imageBlockedWarning" : "imageAllowedWarning", [app, uri.host]);
var notificationBox = this.browser.getNotificationBox();
@@ -1030,17 +1036,17 @@ nsContextMenu.prototype = {
// Get 16 characters, so that we can trim the selection if it's greater
// than 15 chars
var selectedText = getBrowserSelection(16);
if (!selectedText)
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.
var engineName = "";
var ss = Cc["@mozilla.org/browser/search-service;1"].
getService(Ci.nsIBrowserSearchService);
if (isElementVisible(BrowserSearch.searchBar))
engineName = ss.currentEngine.name;
--- a/browser/base/content/pageinfo/pageInfo.js
+++ b/browser/base/content/pageinfo/pageInfo.js
@@ -818,107 +818,97 @@ function onImageSelect()
makePreview(tree.view.selection.currentIndex);
}
}
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);
+ var imageText;
+ if (!isBG &&
+#ifdef MOZ_SVG
+ !(item instanceof SVGImageElement) &&
+#endif
+ !(gDocument instanceof ImageDocument)) {
+ imageText = item.title || item.alt;
- if (item.hasAttribute("alt"))
- setItemValue("imagealttext", item.alt);
- else if (item instanceof HTMLImageElement || isBG)
- setItemValue("imagealttext", null);
- else
- setItemValue("imagealttext", getValueText(item));
+ if (!imageText && !(item instanceof HTMLImageElement))
+ imageText = getValueText(item);
+ }
+ setItemValue("imagetext", imageText);
-#ifdef MOZ_SVG
- if (item instanceof SVGImageElement) {
- setItemValue("imagetitletext", null);
- setItemValue("imagelongdesctext", null);
- setItemValue("imagealttext", null);
- }
-#endif
+ 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 && 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 = getContentTypeFromImgRequest(item) ||
- getContentTypeFromHeaders(cacheEntryDescriptor);
+ 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");
var oldImage = document.getElementById("thepreviewimage");
const regex = /^(https?|ftp|file|gopher|about|chrome|resource):/;
var isProtocolAllowed = regex.test(url);
if (/^data:/.test(url) && /^image\//.test(mimeType))
@@ -969,28 +959,31 @@ function makePreview(row)
else {
// fallback image for protocols not allowed (e.g., data: or javascript:)
// or elements not [yet] handled (e.g., object, embed).
document.getElementById("brokenimagecontainer").collapsed = false;
document.getElementById("theimagecontainer").collapsed = true;
}
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);
imageContainer.removeChild(oldImage);
imageContainer.appendChild(newImage);
}
function makeBlockImage(url)
@@ -1042,31 +1035,16 @@ function getContentTypeFromHeaders(cache
{
if (!cacheEntryDescriptor)
return null;
return (/^Content-Type:\s*(.*?)\s*(?:\;|$)/mi
.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
function getValueText(node)
{
var valueText = "";
// form input elements don't generally contain information that is useful to our callers, so return nothing
--- a/browser/base/content/pageinfo/pageInfo.xul
+++ b/browser/base/content/pageinfo/pageInfo.xul
@@ -227,67 +227,52 @@
<splitter class="tree-splitter"/>
<treecol sortSeparators="true" hidden="true" persist="hidden width" flex="1"
width="1" id="image-count" label="&mediaCount;"/>
</treecols>
<treechildren flex="1"/>
</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>
<hbox align="end">
<vbox>
<checkbox id="blockImage" hidden="true" oncommand="onBlockImage()"
accesskey="&mediaBlockImage.accesskey;"/>
<label control="thepreviewimage" value="&mediaPreview;" class="header"/>
--- a/browser/base/content/sanitize.js
+++ b/browser/base/content/sanitize.js
@@ -118,16 +118,38 @@ Sanitizer.prototype = {
},
get canClear()
{
return true;
}
},
+ 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 ()
{
var globalHistory = Components.classes["@mozilla.org/browser/global-history;2"]
.getService(Components.interfaces.nsIBrowserHistory);
globalHistory.removeAllPages();
try {
--- a/browser/base/content/sanitize.xul
+++ b/browser/base/content/sanitize.xul
@@ -119,16 +119,17 @@
<preferences id="sanitizePreferences">
<preference id="privacy.item.history" name="privacy.item.history" type="bool" readonly="true"/>
<preference id="privacy.item.formdata" name="privacy.item.formdata" type="bool" readonly="true"/>
<preference id="privacy.item.passwords" name="privacy.item.passwords" type="bool" readonly="true"/>
<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>
<description>&sanitizeItems.label;</description>
<checkbox label="&itemHistory.label;"
accesskey="&itemHistory.accesskey;"
preference="privacy.item.history"
@@ -144,16 +145,20 @@
<checkbox label="&itemCache.label;"
accesskey="&itemCache.accesskey;"
preference="privacy.item.cache"
onsyncfrompreference="return gSanitizePromptDialog.onReadGeneric();"/>
<checkbox label="&itemCookies.label;"
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"
onsyncfrompreference="return gSanitizePromptDialog.onReadGeneric();"/>
<checkbox label="&itemSessions.label;"
accesskey="&itemSessions.accesskey;"
preference="privacy.item.sessions"
onsyncfrompreference="return gSanitizePromptDialog.onReadGeneric();"/>
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -87,18 +87,18 @@
tbattr="tabbrowser-multiple"
oncommand="var tabbrowser = this.parentNode.parentNode.parentNode.parentNode;
tabbrowser.reloadAllTabs(tabbrowser.mContextTab);"/>
<xul:menuitem label="&closeOtherTabs.label;" accesskey="&closeOtherTabs.accesskey;"
tbattr="tabbrowser-multiple"
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;"
command="Browser:BookmarkAllTabs"/>
<xul:menuitem label="&undoCloseTab.label;"
accesskey="&undoCloseTab.accesskey;"
command="History:UndoCloseTab"
anonid="undoCloseTabMenuItem"/>
@@ -2123,19 +2123,20 @@
</method>
<!-- throws exception for unknown schemes -->
<method name="loadURIWithFlags">
<parameter name="aURI"/>
<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>
<method name="goHome">
<body>
<![CDATA[
return this.mCurrentBrowser.goHome();
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -8,16 +8,17 @@ browser.jar:
#endif
% overlay chrome://global/content/viewSource.xul chrome://browser/content/viewSourceOverlay.xul
% overlay chrome://global/content/viewPartialSource.xul chrome://browser/content/viewSourceOverlay.xul
% style chrome://global/content/customizeToolbar.xul chrome://browser/content/browser.css
% style chrome://global/content/customizeToolbar.xul chrome://browser/skin/
* 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)
* content/browser/credits.xhtml (content/credits.xhtml)
* content/browser/EULA.js (content/EULA.js)
* content/browser/EULA.xhtml (content/EULA.xhtml)
* content/browser/EULA.xul (content/EULA.xul)
* content/browser/metaData.js (content/metaData.js)
--- a/browser/branding/unofficial/Makefile.in
+++ b/browser/branding/unofficial/Makefile.in
@@ -15,17 +15,17 @@ DIRS = \
locales \
$(NULL)
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 \
firefox.ico \
document.ico \
$(NULL)
export::
deleted file mode 100644
--- a/browser/branding/unofficial/default.xpm
+++ /dev/null
@@ -1,1144 +0,0 @@
-/* XPM */
-static char * mozicon50_xpm[] = {
-"48 48 1093 2",
-" c None",
-". c #2099CF",
-"+ c #2CA7D9",
-"@ c #33AEDD",
-"# c #34B2E1",
-"$ c #35B8E5",
-"% c #2FBAE8",
-"& c #26B5E4",
-"* c #199FD6",
-"= c #177DB8",
-"- c #2C8FC4",
-"; c #43A0CE",
-"> c #55ADD6",
-", c #5CB5DD",
-"' c #61C4E8",
-") c #63CBED",
-"! c #64CFF1",
-"~ c #63D1F2",
-"{ c #5ECCEF",
-"] c #57C3E9",
-"^ c #4EB8E1",
-"/ c #3CABD9",
-"( c #2A9ED1",
-"_ c #1991C9",
-": c #0F7CBA",
-"< c #166EAC",
-"[ c #3387BC",
-"} c #4797C6",
-"| c #51A0CC",
-"1 c #56A7D2",
-"2 c #5BAED7",
-"3 c #60B6DD",
-"4 c #67CDEE",
-"5 c #69D3F2",
-"6 c #6BD4F4",
-"7 c #69D3F4",
-"8 c #63CDEF",
-"9 c #5AC0E6",
-"0 c #51B6DF",
-"a c #49ACD8",
-"b c #42A2D1",
-"c c #3898CA",
-"d c #298CC2",
-"e c #167EB9",
-"f c #0B5A9C",
-"g c #2674AE",
-"h c #3D87BA",
-"i c #4590C0",
-"j c #4B97C6",
-"k c #519FCB",
-"l c #58A6D1",
-"m c #5DADD5",
-"n c #62B3DA",
-"o c #69C3E6",
-"p c #6ED4F2",
-"q c #6FD6F4",
-"r c #6ED5F4",
-"s c #6AD3F2",
-"t c #5FC3E7",
-"u c #53B2DC",
-"v c #4BA8D5",
-"w c #439FCE",
-"x c #3B95C7",
-"y c #338BC0",
-"z c #2B82B9",
-"A c #1D76B1",
-"B c #0C69A9",
-"C c #10599A",
-"D c #2D71AA",
-"E c #377CB2",
-"F c #3D84B8",
-"G c #458DBE",
-"H c #4B95C4",
-"I c #529CC9",
-"J c #59A4CF",
-"K c #5FABD4",
-"L c #65B1D8",
-"M c #6BC2E4",
-"N c #71D5F3",
-"O c #73D6F3",
-"P c #72D5F3",
-"Q c #6DD1F0",
-"R c #5FBBE2",
-"S c #54ADD8",
-"T c #4CA4D2",
-"U c #439ACB",
-"V c #3B91C4",
-"W c #3487BD",
-"X c #2D7EB7",
-"Y c #2675AF",
-"Z c #1E6CA9",
-"` c #0F5FA0",
-" . c #055296",
-".. c #115394",
-"+. c #2767A2",
-"@. c #2F70A9",
-"#. c #3679AF",
-"$. c #3C81B5",
-"%. c #448ABC",
-"&. c #4A92C2",
-"*. c #519AC7",
-"=. c #58A2CD",
-"-. c #5FA9D2",
-";. c #65B0D7",
-">. c #6EC8E9",
-",. c #74D4F2",
-"'. c #76D6F3",
-"). c #75D6F3",
-"!. c #71D3F1",
-"~. c #62BCE1",
-"{. c #54A9D5",
-"]. c #4C9FCE",
-"^. c #4396C8",
-"/. c #3B8CC1",
-"(. c #3483BA",
-"_. c #2C7AB3",
-":. c #2670AC",
-"<. c #1F68A6",
-"[. c #195F9F",
-"}. c #0D5497",
-"|. c #04488D",
-"1. c #0F4A8D",
-"2. c #1F5A98",
-"3. c #2663A0",
-"4. c #2D6DA6",
-"5. c #3475AD",
-"6. c #3B7EB3",
-"7. c #4287B9",
-"8. c #4990C1",
-"9. c #51A4CF",
-"0. c #569FCA",
-"a. c #5DA6CF",
-"b. c #66B5DB",
-"c. c #6FD1F0",
-"d. c #75D4F1",
-"e. c #79D5F2",
-"f. c #75D3F1",
-"g. c #63BBE0",
-"h. c #54A4D1",
-"i. c #4B9BCB",
-"j. c #4391C4",
-"k. c #3B88BD",
-"l. c #337FB6",
-"m. c #2C76B0",
-"n. c #266CA9",
-"o. c #1F64A3",
-"p. c #1A5B9C",
-"q. c #145396",
-"r. c #0A498E",
-"s. c #034C8F",
-"t. c #085293",
-"u. c #164D8E",
-"v. c #1D5695",
-"w. c #24609C",
-"x. c #2A69A3",
-"y. c #3271AA",
-"z. c #387AAF",
-"A. c #429FCC",
-"B. c #4CBFE4",
-"C. c #52C4E8",
-"D. c #57AFD7",
-"E. c #5DB3DA",
-"F. c #65C5E7",
-"G. c #6DD0EE",
-"H. c #72D2EF",
-"I. c #78D4F0",
-"J. c #7BD5F1",
-"K. c #76D2EF",
-"L. c #6AC5E6",
-"M. c #55A5D1",
-"N. c #4A95C6",
-"O. c #428CC0",
-"P. c #3A83B9",
-"Q. c #337AB3",
-"R. c #2C71AD",
-"S. c #2568A6",
-"T. c #1F5F9F",
-"U. c #1D65A3",
-"V. c #269ACA",
-"W. c #1C84BA",
-"X. c #0D7DB5",
-"Y. c #0298CC",
-"Z. c #0296CA",
-"`. c #0C5998",
-" + c #14498A",
-".+ c #1B609C",
-"++ c #2498C8",
-"@+ c #2977AF",
-"#+ c #2F75AC",
-"$+ c #3575AC",
-"%+ c #40ABD5",
-"&+ c #49BFE4",
-"*+ c #50C3E7",
-"=+ c #56C5E8",
-"-+ c #5DC8EA",
-";+ c #63CBEB",
-">+ c #69CEED",
-",+ c #6ED0EE",
-"'+ c #73D2EF",
-")+ c #77D3EF",
-"!+ c #72CEEC",
-"~+ c #5AA7D1",
-"{+ c #4F99C9",
-"]+ c #4891C3",
-"^+ c #4087BC",
-"/+ c #387EB5",
-"(+ c #3277B1",
-"_+ c #2B70AB",
-":+ c #2463A2",
-"<+ c #1E5B9C",
-"[+ c #185395",
-"}+ c #165496",
-"|+ c #10498D",
-"1+ c #105F9E",
-"2+ c #0A9ECF",
-"3+ c #0088C0",
-"4+ c #038DC3",
-"5+ c #0A4A8C",
-"6+ c #114E8E",
-"7+ c #1989BD",
-"8+ c #22AAD7",
-"9+ c #28A2D0",
-"0+ c #2C71A9",
-"a+ c #3380B5",
-"b+ c #3EB9E1",
-"c+ c #45BDE3",
-"d+ c #4CC0E5",
-"e+ c #53C3E7",
-"f+ c #59C6E8",
-"g+ c #5EC9EA",
-"h+ c #64CBEB",
-"i+ c #69CDEC",
-"j+ c #6ECFED",
-"k+ c #70D0ED",
-"l+ c #64BDE1",
-"m+ c #55A6D1",
-"n+ c #3D82B8",
-"o+ c #3D8BBE",
-"p+ c #49AFD8",
-"q+ c #378DBF",
-"r+ c #225F9E",
-"s+ c #1D5698",
-"t+ c #174E92",
-"u+ c #12468B",
-"v+ c #0E3F85",
-"w+ c #115F9D",
-"x+ c #15A2D1",
-"y+ c #0395C9",
-"z+ c #0088C1",
-"A+ c #0190C6",
-"B+ c #079ACC",
-"C+ c #0FA0D0",
-"D+ c #169ECF",
-"E+ c #1D99CC",
-"F+ c #25AAD7",
-"G+ c #2BA0CE",
-"H+ c #32AED8",
-"I+ c #3AB7DF",
-"J+ c #41BBE1",
-"K+ c #47BEE3",
-"L+ c #4EC1E5",
-"M+ c #53C4E7",
-"N+ c #5FC8E9",
-"O+ c #63CAEA",
-"P+ c #67CBEB",
-"Q+ c #69CBEA",
-"R+ c #62BCE0",
-"S+ c #5AAFD7",
-"T+ c #478DBF",
-"U+ c #4084B9",
-"V+ c #3A7CB4",
-"W+ c #3E8CBF",
-"X+ c #4DBADF",
-"Y+ c #3383B8",
-"Z+ c #215B9B",
-"`+ c #1B5295",
-" @ c #164A8E",
-".@ c #114288",
-"+@ c #0D3A82",
-"@@ c #0E4C8E",
-"#@ c #1380B7",
-"$@ c #0D96C9",
-"%@ c #0089C1",
-"&@ c #007BB8",
-"*@ c #0085BE",
-"=@ c #008CC4",
-"-@ c #0496C9",
-";@ c #0B9DCF",
-">@ c #1168AB",
-",@ c #174F99",
-"'@ c #21AAD7",
-")@ c #28AED9",
-"!@ c #2FB1DB",
-"~@ c #36B5DE",
-"{@ c #3CB8E0",
-"]@ c #42BBE2",
-"^@ c #49BEE4",
-"/@ c #54C3E6",
-"(@ c #59C5E7",
-"_@ c #5DC7E8",
-":@ c #5FC5E7",
-"<@ c #53A9D3",
-"[@ c #4B96C6",
-"}@ c #478FC2",
-"|@ c #4186BB",
-"1@ c #3C7FB5",
-"2@ c #3676AF",
-"3@ c #306EA9",
-"4@ c #3889BD",
-"5@ c #44AFD8",
-"6@ c #2F84B9",
-"7@ c #194D91",
-"8@ c #15458A",
-"9@ c #144D90",
-"0@ c #0C367E",
-"a@ c #0C4086",
-"b@ c #1797C8",
-"c@ c #1295C8",
-"d@ c #0487C0",
-"e@ c #0079B6",
-"f@ c #0081BC",
-"g@ c #0E9ACC",
-"h@ c #1597CA",
-"i@ c #1CA7D5",
-"j@ c #23ABD8",
-"k@ c #2AAFDA",
-"l@ c #31B2DC",
-"m@ c #37B5DE",
-"n@ c #3DB8E0",
-"o@ c #43BBE2",
-"p@ c #49BEE3",
-"q@ c #4EC0E4",
-"r@ c #53C2E5",
-"s@ c #57C4E6",
-"t@ c #4EAAD4",
-"u@ c #4696C5",
-"v@ c #438FC0",
-"w@ c #4088BC",
-"x@ c #3C80B6",
-"y@ c #3778B1",
-"z@ c #3270AB",
-"A@ c #2C68A5",
-"B@ c #3D9AC8",
-"C@ c #46BADF",
-"D@ c #3DB0D8",
-"E@ c #287CB2",
-"F@ c #164D90",
-"G@ c #299ECC",
-"H@ c #1B79B0",
-"I@ c #1A8CBF",
-"J@ c #199BCC",
-"K@ c #1392C6",
-"L@ c #0A86BE",
-"M@ c #0079B7",
-"N@ c #006AAC",
-"O@ c #0074B3",
-"P@ c #007CB9",
-"Q@ c #0083BE",
-"R@ c #008BC2",
-"S@ c #0393C8",
-"T@ c #099CCD",
-"U@ c #10A1D1",
-"V@ c #17A4D3",
-"W@ c #1EA8D6",
-"X@ c #25ABD8",
-"Y@ c #2BAFDA",
-"Z@ c #37B5DD",
-"`@ c #3DB8DF",
-" # c #42BAE1",
-".# c #48BCE2",
-"+# c #4CBEE3",
-"@# c #50C0E4",
-"## c #48A8D3",
-"$# c #3F8EC0",
-"%# c #3C87BC",
-"&# c #3A81B7",
-"*# c #3679B1",
-"=# c #3171AC",
-"-# c #2D6AA6",
-";# c #2862A0",
-"># c #40A5D1",
-",# c #43B8DE",
-"'# c #3DB5DC",
-")# c #38B1DA",
-"!# c #2D9ECC",
-"~# c #2B9FCE",
-"{# c #246AAA",
-"]# c #1F96C7",
-"^# c #1996C9",
-"/# c #138DC3",
-"(# c #0E84BC",
-"_# c #0175B4",
-":# c #0068AC",
-"<# c #0070B1",
-"[# c #0077B5",
-"}# c #007FBA",
-"|# c #0086BF",
-"1# c #018DC4",
-"2# c #0596C9",
-"3# c #0B9DCE",
-"4# c #12A1D1",
-"5# c #1897C8",
-"6# c #1E96C7",
-"7# c #25A0CE",
-"8# c #2B90C2",
-"9# c #31A4D0",
-"0# c #37B4DD",
-"a# c #3CB7DF",
-"b# c #41B9E0",
-"c# c #45BBE0",
-"d# c #49BCE1",
-"e# c #4BBBE0",
-"f# c #419FCC",
-"g# c #3C91C2",
-"h# c #337AB1",
-"i# c #3072AC",
-"j# c #2C6BA7",
-"k# c #2864A1",
-"l# c #255F9E",
-"m# c #3FAAD4",
-"n# c #40B6DC",
-"o# c #3AB3DB",
-"p# c #35B0D8",
-"q# c #2F86BD",
-"r# c #29599F",
-"s# c #237DB7",
-"t# c #1E99CA",
-"u# c #1892C5",
-"v# c #1389C0",
-"w# c #0E7FBA",
-"x# c #0473B2",
-"y# c #0065AA",
-"z# c #0064A9",
-"A# c #006BAD",
-"B# c #0072B2",
-"C# c #0080BC",
-"D# c #0082BC",
-"E# c #028DC4",
-"F# c #0796C9",
-"G# c #0D88BD",
-"H# c #1372AB",
-"I# c #1982B8",
-"J# c #1F79B0",
-"K# c #247BB1",
-"L# c #2A86B9",
-"M# c #31B1DA",
-"N# c #36B3DC",
-"O# c #3AB5DD",
-"P# c #3FB7DE",
-"Q# c #42B9DF",
-"R# c #45BAE0",
-"S# c #48BBE0",
-"T# c #47B6DD",
-"U# c #3689BC",
-"V# c #2D72AB",
-"W# c #2C73AC",
-"X# c #2F7DB3",
-"Y# c #399BC9",
-"Z# c #3FB4DB",
-"`# c #3CB3DA",
-" $ c #37B0D9",
-".$ c #32AED7",
-"+$ c #2CA8D3",
-"@$ c #277EB8",
-"#$ c #229CCC",
-"$$ c #1D95C8",
-"%$ c #188DC2",
-"&$ c #1384BD",
-"*$ c #0D7AB6",
-"=$ c #066FB0",
-"-$ c #0057A0",
-";$ c #005FA5",
-">$ c #0066AA",
-",$ c #006DAF",
-"'$ c #006EAC",
-")$ c #004C8E",
-"!$ c #005595",
-"~$ c #025999",
-"{$ c #085D9B",
-"]$ c #0D64A0",
-"^$ c #1369A4",
-"/$ c #196EA7",
-"($ c #1E73AA",
-"_$ c #2376AD",
-":$ c #2AA0CE",
-"<$ c #2FAFD9",
-"[$ c #34B1DB",
-"}$ c #38B3DC",
-"|$ c #3BB5DC",
-"1$ c #3EB6DD",
-"2$ c #40B7DD",
-"3$ c #42B7DD",
-"4$ c #43B7DE",
-"5$ c #43B7DD",
-"6$ c #40B5DC",
-"7$ c #3DB4DB",
-"8$ c #3AB2DA",
-"9$ c #33AED6",
-"0$ c #2EABD5",
-"a$ c #29A5D2",
-"b$ c #259ECD",
-"c$ c #2094C6",
-"d$ c #1C8DC2",
-"e$ c #1787BE",
-"f$ c #127EB9",
-"g$ c #0D75B3",
-"h$ c #076AAC",
-"i$ c #005FA6",
-"j$ c #00539D",
-"k$ c #005AA2",
-"l$ c #0060A6",
-"m$ c #0068AB",
-"n$ c #0063A5",
-"o$ c #004487",
-"p$ c #004386",
-"q$ c #004789",
-"r$ c #004B8D",
-"s$ c #045192",
-"t$ c #095997",
-"u$ c #0E5F9C",
-"v$ c #1365A0",
-"w$ c #1869A4",
-"x$ c #1D6EA7",
-"y$ c #2274AB",
-"z$ c #28A6D2",
-"A$ c #2DAED8",
-"B$ c #31AFD9",
-"C$ c #34B1DA",
-"D$ c #37B2DB",
-"E$ c #39B3DB",
-"F$ c #3BB4DB",
-"G$ c #3CB4DB",
-"H$ c #3BB3DA",
-"I$ c #38B1D9",
-"J$ c #35AFD8",
-"K$ c #32ADD6",
-"L$ c #2EAAD4",
-"M$ c #2BA5D1",
-"N$ c #2795C5",
-"O$ c #2374AA",
-"P$ c #1E5691",
-"Q$ c #1A4C89",
-"R$ c #156AA5",
-"S$ c #1078B5",
-"T$ c #0B6FAF",
-"U$ c #0665A9",
-"V$ c #004A97",
-"W$ c #004D9A",
-"X$ c #00509A",
-"Y$ c #00579F",
-"Z$ c #0062A7",
-"`$ c #00468A",
-" % c #00387C",
-".% c #003C7F",
-"+% c #004083",
-"@% c #044D8E",
-"#% c #095493",
-"$% c #0E5A98",
-"%% c #13609C",
-"&% c #18659F",
-"*% c #1C6BA4",
-"=% c #219FCD",
-"-% c #25AAD5",
-";% c #29ABD6",
-">% c #2DADD7",
-",% c #30AED8",
-"'% c #32AFD8",
-")% c #34B0D8",
-"!% c #34AED7",
-"~% c #30ABD4",
-"{% c #2DA8D2",
-"]% c #2BA3CF",
-"^% c #289DCC",
-"/% c #2494C5",
-"(% c #20659E",
-"_% c #1C4684",
-":% c #183D7C",
-"<% c #133B7A",
-"[% c #0F5695",
-"}% c #0A5FA1",
-"|% c #055FA5",
-"1% c #00559F",
-"2% c #004D99",
-"3% c #004896",
-"4% c #002E74",
-"5% c #003C82",
-"6% c #004E94",
-"7% c #003377",
-"8% c #003175",
-"9% c #003578",
-"0% c #003B7F",
-"a% c #003F82",
-"b% c #014285",
-"c% c #044889",
-"d% c #094E8E",
-"e% c #0D5493",
-"f% c #125997",
-"g% c #167FB4",
-"h% c #1A96C7",
-"i% c #1EA5D2",
-"j% c #22A7D3",
-"k% c #25A9D4",
-"l% c #28AAD5",
-"m% c #2AAAD5",
-"n% c #2CABD6",
-"o% c #2DACD6",
-"p% c #2EACD5",
-"q% c #2DA9D3",
-"r% c #2CA6D1",
-"s% c #299FCD",
-"t% c #279ACA",
-"u% c #2495C7",
-"v% c #218FC3",
-"w% c #1D86BC",
-"x% c #1A4683",
-"y% c #163574",
-"z% c #112C6C",
-"A% c #0D2464",
-"B% c #082D6F",
-"C% c #044E94",
-"D% c #004F9A",
-"E% c #004292",
-"F% c #00347D",
-"G% c #002266",
-"H% c #002669",
-"I% c #00286C",
-"J% c #002B6F",
-"K% c #002E72",
-"L% c #003478",
-"M% c #00377B",
-"N% c #003A7E",
-"O% c #013D80",
-"P% c #044285",
-"Q% c #084889",
-"R% c #0D4D8D",
-"S% c #115492",
-"T% c #15609B",
-"U% c #189ACB",
-"V% c #1CA0CF",
-"W% c #1FA2CF",
-"X% c #21A3D1",
-"Y% c #24A4D1",
-"Z% c #25A5D1",
-"`% c #27A4D1",
-" & c #28A4D1",
-".& c #28A0CE",
-"+& c #289ECC",
-"@& c #2596C8",
-"#& c #2392C5",
-"$& c #208DC2",
-"%& c #1D87BD",
-"&& c #1A75AE",
-"*& c #173978",
-"=& c #132E6D",
-"-& c #0F2565",
-";& c #0B1D5D",
-">& c #071555",
-",& c #021151",
-"'& c #001F61",
-")& c #00276D",
-"!& c #003D8E",
-"~& c #003B89",
-"{& c #001E62",
-"]& c #002063",
-"^& c #002569",
-"/& c #002D72",
-"(& c #003074",
-"_& c #003579",
-":& c #033C7F",
-"<& c #074183",
-"[& c #0B4787",
-"}& c #0F5392",
-"|& c #1391C5",
-"1& c #1695C8",
-"2& c #1998CA",
-"3& c #1C99CA",
-"4& c #1E9ACB",
-"5& c #209BCB",
-"6& c #219BCB",
-"7& c #229ACA",
-"8& c #2399C9",
-"9& c #2397C8",
-"0& c #2394C6",
-"a& c #2291C4",
-"b& c #1E89C0",
-"c& c #1C84BC",
-"d& c #1A5B97",
-"e& c #174C89",
-"f& c #142D6C",
-"g& c #102665",
-"h& c #0C1E5D",
-"i& c #081756",
-"j& c #040F4F",
-"k& c #000847",
-"l& c #000541",
-"m& c #00033D",
-"n& c #00368A",
-"o& c #00256E",
-"p& c #00185A",
-"q& c #001A5D",
-"r& c #001D60",
-"s& c #001F63",
-"t& c #002568",
-"u& c #00276B",
-"v& c #00296D",
-"w& c #002B70",
-"x& c #003276",
-"y& c #023579",
-"z& c #063A7D",
-"A& c #0A5997",
-"B& c #0D87BF",
-"C& c #108AC1",
-"D& c #138CC3",
-"E& c #168EC4",
-"F& c #188FC4",
-"G& c #1A90C4",
-"H& c #1C90C4",
-"I& c #1D8FC4",
-"J& c #1D8EC3",
-"K& c #1D8CC2",
-"L& c #1D8AC0",
-"M& c #1C87BE",
-"N& c #1B83BC",
-"O& c #1A7FB9",
-"P& c #1864A0",
-"Q& c #164987",
-"R& c #132C6A",
-"S& c #102564",
-"T& c #0D1E5D",
-"U& c #091756",
-"V& c #06104E",
-"W& c #020947",
-"X& c #000441",
-"Y& c #00023C",
-"Z& c #000038",
-"`& c #003086",
-" * c #001A5E",
-".* c #001354",
-"+* c #001658",
-"@* c #001D5F",
-"#* c #001F62",
-"$* c #002164",
-"%* c #002367",
-"&* c #002D71",
-"** c #014C8E",
-"=* c #0474B2",
-"-* c #077CB9",
-";* c #0B80BA",
-">* c #0E82BB",
-",* c #1083BC",
-"'* c #1285BD",
-")* c #1485BE",
-"!* c #1686BD",
-"~* c #1785BD",
-"{* c #1884BC",
-"]* c #1882BB",
-"^* c #1880B9",
-"/* c #187DB7",
-"(* c #177AB6",
-"_* c #1571AF",
-":* c #143676",
-"<* c #122968",
-"[* c #0F2362",
-"}* c #0D1D5C",
-"|* c #0A1755",
-"1* c #030A47",
-"2* c #000239",
-"3* c #002A82",
-"4* c #00175D",
-"5* c #00104F",
-"6* c #001252",
-"7* c #001454",
-"8* c #001657",
-"9* c #00195C",
-"0* c #001C5E",
-"a* c #001D61",
-"b* c #002165",
-"c* c #002366",
-"d* c #002468",
-"e* c #006CAE",
-"f* c #006FB0",
-"g* c #0271B1",
-"h* c #0574B3",
-"i* c #0877B4",
-"j* c #0B78B5",
-"k* c #0F7AB6",
-"l* c #107AB7",
-"m* c #127AB6",
-"n* c #1279B5",
-"o* c #1377B4",
-"p* c #1375B3",
-"q* c #1372B1",
-"r* c #126FAF",
-"s* c #115797",
-"t* c #0F2766",
-"u* c #0D2160",
-"v* c #0B1B5A",
-"w* c #091554",
-"x* c #06104D",
-"y* c #030A46",
-"z* c #000540",
-"A* c #000036",
-"B* c #00237E",
-"C* c #002980",
-"D* c #002372",
-"E* c #001A60",
-"F* c #001659",
-"G* c #001358",
-"H* c #001A5F",
-"I* c #002064",
-"J* c #001B5E",
-"K* c #005397",
-"L* c #0065A9",
-"M* c #0067AB",
-"N* c #0069AC",
-"O* c #026AAD",
-"P* c #046CAE",
-"Q* c #0768AB",
-"R* c #0965A9",
-"S* c #0A6EAF",
-"T* c #0C6EAE",
-"U* c #0D6DAE",
-"V* c #0D6CAD",
-"W* c #0D6AAB",
-"X* c #0D67AA",
-"Y* c #0D64A7",
-"Z* c #0C498C",
-"`* c #0A1E5E",
-" = c #091856",
-".= c #071350",
-"+= c #050D4B",
-"@= c #020844",
-"#= c #00043F",
-"$= c #00023B",
-"%= c #000037",
-"&= c #000035",
-"*= c #000034",
-"== c #001A77",
-"-= c #00237D",
-";= c #002881",
-">= c #002D84",
-",= c #00287F",
-"'= c #000B6C",
-")= c #00388A",
-"!= c #003785",
-"~= c #001556",
-"{= c #001759",
-"]= c #00195B",
-"^= c #001C5F",
-"/= c #001C60",
-"(= c #004B91",
-"_= c #004287",
-":= c #00569C",
-"<= c #0061A7",
-"[= c #023187",
-"}= c #033388",
-"|= c #0563A7",
-"1= c #0662A7",
-"2= c #0762A7",
-"3= c #0860A6",
-"4= c #085EA4",
-"5= c #085CA3",
-"6= c #084388",
-"7= c #071B5B",
-"8= c #061453",
-"9= c #04104D",
-"0= c #030B48",
-"a= c #010742",
-"b= c #00033E",
-"c= c #00013A",
-"d= c #000033",
-"e= c #000032",
-"f= c #001C79",
-"g= c #00217C",
-"h= c #002780",
-"i= c #002B83",
-"j= c #003589",
-"k= c #001D63",
-"l= c #000F4F",
-"m= c #000F4E",
-"n= c #001050",
-"o= c #001152",
-"p= c #001353",
-"q= c #001455",
-"r= c #002F74",
-"s= c #00529A",
-"t= c #0058A1",
-"u= c #00529D",
-"v= c #0156A0",
-"w= c #02569F",
-"x= c #02549E",
-"y= c #03529D",
-"z= c #034F9A",
-"A= c #032062",
-"B= c #020F4E",
-"C= c #010C49",
-"D= c #000845",
-"E= c #00033C",
-"F= c #000138",
-"G= c #000135",
-"H= c #001474",
-"I= c #001F7B",
-"J= c #00247E",
-"K= c #002D83",
-"L= c #001051",
-"M= c #000A46",
-"N= c #000B48",
-"O= c #000C4A",
-"P= c #000D4B",
-"Q= c #000E4D",
-"R= c #001151",
-"S= c #001253",
-"T= c #00377E",
-"U= c #004E9A",
-"V= c #004C98",
-"W= c #00408C",
-"X= c #000946",
-"Y= c #00053F",
-"Z= c #000137",
-"`= c #000031",
-" - c #000030",
-".- c #001373",
-"+- c #001876",
-"@- c #001D79",
-"#- c #00267F",
-"$- c #000D4D",
-"%- c #000741",
-"&- c #000843",
-"*- c #000945",
-"=- c #000A47",
-"-- c #000B49",
-";- c #000D4C",
-">- c #002F77",
-",- c #00327A",
-"'- c #002267",
-")- c #002166",
-"!- c #00256A",
-"~- c #003D89",
-"{- c #004393",
-"]- c #003F90",
-"^- c #003C8D",
-"/- c #003382",
-"(- c #003587",
-"_- c #002069",
-":- c #00033A",
-"<- c #000136",
-"[- c #00002F",
-"}- c #000C6E",
-"|- c #001171",
-"1- c #001574",
-"2- c #001E7A",
-"3- c #00196A",
-"4- c #00053E",
-"5- c #000640",
-"6- c #000742",
-"7- c #00185B",
-"8- c #003787",
-"9- c #00398C",
-"0- c #00378B",
-"a- c #003388",
-"b- c #002779",
-"c- c #00063F",
-"d- c #00002D",
-"e- c #00096C",
-"f- c #000D6F",
-"g- c #001271",
-"h- c #001675",
-"i- c #001872",
-"j- c #000338",
-"k- c #00043A",
-"l- c #00043B",
-"m- c #00053D",
-"n- c #000844",
-"o- c #000944",
-"p- c #002573",
-"q- c #002E85",
-"r- c #002C83",
-"s- c #001E71",
-"t- c #00002E",
-"u- c #00002C",
-"v- c #000266",
-"w- c #00066A",
-"x- c #000A6D",
-"y- c #000E70",
-"z- c #000C58",
-"A- c #000643",
-"B- c #000337",
-"C- c #000236",
-"D- c #000339",
-"E- c #00053C",
-"F- c #00063E",
-"G- c #00073F",
-"H- c #00145A",
-"I- c #001C78",
-"J- c #000743",
-"K- c #00002A",
-"L- c #00005F",
-"M- c #000267",
-"N- c #000A6C",
-"O- c #000952",
-"P- c #000131",
-"Q- c #000132",
-"R- c #000133",
-"S- c #000134",
-"T- c #000235",
-"U- c #00196E",
-"V- c #001D7A",
-"W- c #001B78",
-"X- c #001977",
-"Y- c #001775",
-"Z- c #001473",
-"`- c #000E66",
-" ; c #00002B",
-".; c #000029",
-"+; c #000053",
-"@; c #00005E",
-"#; c #000265",
-"$; c #000464",
-"%; c #000130",
-"&; c #001160",
-"*; c #001164",
-"=; c #001674",
-"-; c #001272",
-";; c #001071",
-">; c #000E6F",
-",; c #000B6E",
-"'; c #00086C",
-"); c #00045F",
-"!; c #000152",
-"~; c #000046",
-"{; c #000051",
-"]; c #00005A",
-"^; c #00012F",
-"/; c #000542",
-"(; c #00106E",
-"_; c #001070",
-":; c #000F70",
-"<; c #00086B",
-"[; c #000367",
-"}; c #000163",
-"|; c #00005B",
-"1; c #000052",
-"2; c #000047",
-"3; c #000041",
-"4; c #000028",
-"5; c #000021",
-"6; c #000025",
-"7; c #00003E",
-"8; c #00003A",
-"9; c #00075A",
-"0; c #00076B",
-"a; c #000569",
-"b; c #000368",
-"c; c #000162",
-"d; c #00005C",
-"e; c #000054",
-"f; c #00004C",
-"g; c #000042",
-"h; c #000039",
-"i; c #000026",
-"j; c #000023",
-"k; c #000017",
-"l; c #00001C",
-"m; c #00004D",
-"n; c #000055",
-"o; c #000027",
-"p; c #00003D",
-"q; c #000058",
-"r; c #00004E",
-"s; c #000048",
-"t; c #000019",
-"u; c #000012",
-"v; c #00001D",
-"w; c #00001F",
-"x; c #000044",
-"y; c #000008",
-"z; c #000018",
-"A; c #000024",
-"B; c #000015",
-"C; c #000022",
-"D; c #00000F",
-"E; c #000004",
-"F; c #000007",
-"G; c #000009",
-"H; c #00000C",
-"I; c #00000D",
-"J; c #00000E",
-"K; c #00000A",
-"L; c #000003",
-"M; c #000000",
-"N; c #000001",
-"O; c #000005",
-"P; c #00000B",
-" ",
-" ",
-" . + @ # $ % & * ",
-" = - ; > , ' ) ! ~ { ] ^ / ( _ : ",
-" < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d e ",
-" f g h i j k l m n o p q r s t u v w x y z A B ",
-" C D E F G H I J K L M N O P Q R S T U V W X Y Z ` . ",
-" ..+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.|. ",
-" 1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s. ",
-" t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y. ",
-" Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+ ",
-" 3+4+5+6+7+8+9+0+a+b+c+d+e+f+g+h+i+j+k+k+l+m+]+n+o+p+q+r+s+t+u+v+w+x+y+ ",
-" z+A+B+C+D+E+F+G+H+I+J+K+L+M+f+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@@@#@$@%@ ",
-" &@*@=@-@;@>@,@'@)@!@~@{@]@^@L+/@(@_@:@<@[@}@|@1@2@3@4@5@6@7@8@9@0@a@b@c@d@ ",
-" e@f@z+A+B+g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@C@D@E@F@G@H@I@J@K@L@M@ ",
-" N@O@P@Q@R@S@T@U@V@W@X@Y@l@Z@`@ #.#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#/#(#_# ",
-" :#<#[#}#|#1#2#3#4#5#6#7#8#9#0#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o#p#q#r#s#t#u#v#w#x#y# ",
-" z#A#B#M@C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z#`# $.$+$@$#$$$%$&$*$=$z# ",
-" -$;$>$,$O@'$)$!$~${$]$^$/$($_$:$<$[$}$|$1$2$3$4$5$3$6$7$8$ $9$0$a$b$c$d$e$f$g$h$i$ ",
-" j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$D$E$F$G$G$H$8$I$J$K$L$M$N$O$P$Q$R$S$T$U$k$V$ ",
-" W$X$Y$Z$`$ %.%+%p$q$@%#%$%%%&%*%=%-%;%>%,%'%)%p#p#J$!%K$~%{%]%^%/%(%_%:%<%[%}%|%1%2% ",
-" 3%4%5%6%7%8%9% %0%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o%p%0$q%r%]%s%t%u%v%w%x%y%z%A%B%C%D%3% ",
-" E%F%G%H%I%J%K%8%L%M%N%O%P%Q%R%S%T%U%V%W%X%Y%Z%`% &9+.&+&V.@&#&$&%&&&*&=&-&;&>&,&'&)& ",
-" !&~&{&]&G%^&I%J%/&(&7%_& %:&<&[&}&|&1&2&3&4&5&6&7&8&9&0&a&$&b&c&d&e&f&g&h&i&j&k&l&m& ",
-" n&o&p&q&r&s&G%t&u&v&w&K%(&x&y&z&A&B&C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V&W&X&Y&Z& ",
-" `& *.*+*p&q&@*#*$*%*^&u&v&J%&***=*-*;*>*,*'*)*!*~*{*]*^*/*(*_*:*<*[*}*|*V&1*l&Y&Z&2* ",
-" 3*4*5*6*7*8*p&9*0*a*s&b*c*d*v&e*f*g*h*i*j**$k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*Y&Z&A*z* ",
-" B*C*D*E*F*G*H*I*+*p&9*J*r&{&x&K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*`* =.=+=@=#=$=%=&=*= ",
-" ==-=;=>=,='=)=!=J*.*~=+*{=]=^=/=(=_=:=l$<=[=}=|=1=2=3=4=5=6=7=8=9=0=a=b=c=%=&=d=e= ",
-" f=g=h=i=3*j=k=l=m=n=o=p=q=~=8*r=^=b*s=t=j$u=-$v=w=x=y=z=A=B=C=D=z*E=F=A*&=d=e=G= ",
-" H===I=J=;=K=L=M=N=O=P=Q=l=n=R=6*S=.*T=D%D%D%U=2%V=V$3%W=J*L=X=Y=$=Z=&=*=e=`= - ",
-" .-+-@-g=#-$-%-&-*-M==---O=P=;-Q=m=>-,-'-)-!-~-{-E%]-^-/-(-_-:-<-*=d=e=`=[-[- ",
-" }-|-1-==2-3-4-4-5-%-6-&-*-X==-=-N=q&;-O=O=O=7-8-9-0-j=a-`&b-c-d=e=`= -[-d-$= ",
-" e-f-g-h-i-4-j-k-l-m-4-c-5-%-6-6-&-&-n-o-o-*-M=p-q-r-3*h=s-X=`= -[-t-u-u- ",
-" v-w-x-y-g-z-A-B-C-j-D-:-l-l-E-m-4-F-F-c-c-c-G-H-#-J=g=I=I-J-t-t-d-u-K- ",
-" L-M-w-N-f-O-P-Q-R-S-T-C-C-B-j-D-D-:-k-l-k-D=U-V-W-X-Y-Z-`-[- ; ;.;u- ",
-" +;@;#;$; ;u-d-t-[- -%;P-Q-R-R-S-B-z*&;*;Y-=;H=-;;;>;,;';);!;%=d- ",
-" ~;{;];u-.;K- ; ;u-d-d-d-t-t-^;/;(;_;;;:;f-}-x-<;w-[;};|;1;2; ",
-" A*%=3;4;5;6;u-7;8;u-K- ; ; ; ;^;9;<;0;w-a;b;v-c;d;e;f;g;h; ",
-" i;j;k;l;d=m;1;n;d= ;i;o;o;o;o;p;@;d;q;+;r;s;3;h;`=K- ",
-" t;u;k;o;e=Z&%=5;*=l;v;v;v;w; ;x;3;p;Z&d=d-i;w; ",
-" y;u;z;v;5;A;A;B;u;u;u;j; ;.;i;C;v;z;u;D; ",
-" E;E;F;G;H;I;I;I;H;D;J;H;K;F;E;K; ",
-" y;L;M;M;N;N;M;N;O;P; ",
-" ",
-" ",
-" ",
-" "};
new file mode 100644
index 0000000000000000000000000000000000000000..e74f5cf2e442458ea5c621e654f853a65031d1b5
GIT binary patch
literal 744
zc$@*~0vG*>P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XT
z000XT0n*)m`~Uy~nn^@KR5*==lgn?6VHC!H-*vvZwQ8oV>GVQLHEyY3gAn5KA6SrB
zSXi>LCy`)b!@^2p!_uO55@|(<jl{LY0%bZ=I-U9EKJ#7P_qA}V`&pfwJkOKo<eW$2
zZ#8}{#kSGDNFpk|hmSw;<V@vHFzwfYbKv5xp-p2a2F3=q_l)$V0^Lya?~4m_ujZ!Q
zr*AI>cTPNBiZ_;u#de-OJ-lw!)irCg8wS&fWOik*(G@jKQEhgsP)_)Pccc^F?5f=K
zqi-brJN@XjQ?b#(GfpC6g$bK*SsaDL2z-QFL#wz%MVN?Bj9=m8&BH%C*l}S!o7Y}9
zNBZr^V46rKg%yjSLO~_BNcqD8`tl@|cLij`(q#Yg?V_>z28FwgFAjQ_9YeR{Ez6{;
z6z<0|rFw^jdYeMNM72~$Pj}I~e=EtcAuPkmup)g3zywVEa5wWs!WSQ@IyQPThS)Mj
zXCRF|njw}=<68#47a(SHC_M?%*b7`XVPBkua+<;i5FuV7h8vF&Ms3=TgQIKcN+K#P
zynKnygGU6_CMY8V=qAhy%5FgO6Id3sns{~uksY8jTf)&Kh636?!M*#mb2)<YA_(6H
zlnFB}T6^A*T)hTagGwGui*V)@je3W+9mj}TX!#uC`7=bbiV{BP`fDW01SIa<B(m!u
zri8{K=r+uhppZv6QABDGqy?G@VHL0xQoHrzjG{J6JGq}QkwFw8D1!{3S%Inx%@9O4
zw0-c3fVd6C^H2-Feqz0aYP}@z_8}L$Q3fbLHNeV%?1xGbI(5LGf!uK@6#fv6o}I8_
z8iqp{RnV&-t6*HgDi4Myp=aYi!vv(D>i}rGKpO&0fp`mQ3hL89?SBGGa}xR5clff@
aZ}l0cBPG#LK)$~K0000<MNUMnLSTXkrBPl0
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -504,17 +504,17 @@ BrowserGlue.prototype = {
// See XXX note above
// bmsvc.runInBatchMode(callback, null);
}
catch(ex) {
Components.utils.reportError(ex);
}
finally {
prefBranch.setBoolPref("browser.places.createdSmartBookmarks", true);
- prefBranch.savePrefFile(null);
+ prefBranch.QueryInterface(Ci.nsIPrefService).savePrefFile(null);
}
},
// for XPCOM
classDescription: "Firefox Browser Glue Service",
classID: Components.ID("{eab9012e-5f74-4cbc-b2b5-a590235513cc}"),
contractID: "@mozilla.org/browser/browserglue;1",
--- a/browser/components/places/content/controller.js
+++ b/browser/components/places/content/controller.js
@@ -420,16 +420,17 @@ PlacesController.prototype = {
switch(nodeType) {
case Ci.nsINavHistoryResultNode.RESULT_TYPE_QUERY:
nodeData["query"] = true;
break;
case Ci.nsINavHistoryResultNode.RESULT_TYPE_DYNAMIC_CONTAINER:
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:
nodeData["host"] = true;
break;
case Ci.nsINavHistoryResultNode.RESULT_TYPE_SEPARATOR:
nodeData["separator"] = true;
break;
--- a/browser/components/places/content/editBookmarkOverlay.js
+++ b/browser/components/places/content/editBookmarkOverlay.js
@@ -433,24 +433,24 @@ var gEditItemOverlay = {
},
_updateTags: function EIO__updateTags() {
var currentTags = PlacesUtils.tagging.getTagsForURI(this._uri, { });
var tags = this._getTagsArrayFromTagField();
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)
PlacesUtils.tagging.tagURI(this._uri, tagsToAdd);
if (tagsToRemove.length > 0)
PlacesUtils.tagging.untagURI(this._uri, tagsToRemove);
}
},
@@ -638,27 +638,28 @@ var gEditItemOverlay = {
container != PlacesUtils.toolbarFolderId &&
container != PlacesUtils.bookmarksMenuFolderId)
this._markFolderAsRecentlyUsed(container);
}
// 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]);
}
},
onFolderTreeSelect: function EIO_onFolderTreeSelect() {
var selectedNode = this._folderTree.selectedNode;
if (!selectedNode)
return;
- var folderId = selectedNode.itemId;
+ var folderId = PlacesUtils.getConcreteItemId(selectedNode);
if (this._getFolderIdFromMenuList() == folderId)
return;
var folderItem = this._getFolderMenuItem(folderId);
this._folderMenuList.selectedItem = folderItem;
folderItem.doCommand();
},
@@ -677,17 +678,18 @@ var gEditItemOverlay = {
if (tagsSelector.collapsed)
return;
while (tagsSelector.hasChildNodes())
tagsSelector.removeChild(tagsSelector.lastChild);
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);
if (tagsInField.indexOf(tag) != -1)
elt.setAttribute("checked", "true");
tagsSelector.appendChild(elt);
}
--- a/browser/components/places/content/menu.xml
+++ b/browser/components/places/content/menu.xml
@@ -506,27 +506,27 @@
<getter><![CDATA[
if (this._cachedInsertionPoint !== undefined)
return this._cachedInsertionPoint;
// By default, the insertion point is at the top level, at the end.
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)
}
}
this._cachedInsertionPoint = new InsertionPoint(folderId, index);
return this._cachedInsertionPoint;
]]></getter>
</property>
--- a/browser/components/places/content/toolbar.xml
+++ b/browser/components/places/content/toolbar.xml
@@ -390,27 +390,27 @@
<!-- nsIPlacesView -->
<property name="insertionPoint">
<getter><![CDATA[
if (this._cachedInsertionPoint !== undefined)
return this._cachedInsertionPoint;
// 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);
return this._cachedInsertionPoint;
]]></getter>
</property>
<!-- nsIPlacesView -->
@@ -751,40 +751,48 @@
if (PlacesUtils.nodeIsFolder(xulNode.node) &&
!PlacesUtils.nodeIsReadOnly(xulNode.node)) {
NS_ASSERT(xulNode.getAttribute("type") == "menu");
// This is a folder. If the mouse is in the left 25% of the
// node, drop to the left of the folder. If it's in the middle
// 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;
}
} else{
// This is a non-folder node. If the mouse is left of the middle,
// 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;
},
onDragStart: function TBV_DO_onDragStart(event, xferData, dragAction) {
if (event.target.localName == "toolbarbutton" &&
event.target.getAttribute("type") == "menu") {
#ifdef XP_WIN
--- a/browser/components/places/content/tree.xml
+++ b/browser/components/places/content/tree.xml
@@ -507,36 +507,35 @@
// If the sole selection is an open container, insert into it rather
// than adjacent to it. Note that this only applies to _single_
// selections - if the last element within a multi-selection is an
// open folder, insert _adajacent_ to the selection.
//
// 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 =
this._getInsertionPoint(max.value, orientation);
return this._cachedInsertionPoint;
]]></getter>
</property>
<method name="_disallowInsertion">
<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>
<method name="_getInsertionPoint">
<parameter name="index"/>
<parameter name="orientation"/>
<body><![CDATA[
var result = this.getResult();
@@ -576,17 +575,18 @@
var lsi = PlacesUtils.getIndexOfNode(lastSelected);
index = orientation == NHRVO.DROP_BEFORE ? lsi : lsi + 1;
}
}
if (this._disallowInsertion(container))
return null;
- return new InsertionPoint(container.itemId, index, orientation);
+ return new InsertionPoint(PlacesUtils.getConcreteItemId(container),
+ index, orientation);
]]></body>
</method>
<!-- nsIPlacesView -->
<field name="peerDropTypes">PlacesUtils.GENERIC_VIEW_DROP_TYPES</field>
<!-- nsIPlacesView -->
<field name="childDropTypes">PlacesUtils.GENERIC_VIEW_DROP_TYPES</field>
@@ -622,17 +622,23 @@
* from the IDs array, and add the found node to the nodes dictionary.
*
* NOTE: This method will leave open any node that had matching items
* in its subtree.
*/
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;
ids.splice(index, 1);
}
if (ids.length == 0 || !PlacesUtils.nodeIsContainer(node) ||
nodesURIChecked.indexOf(node.uri) != -1)
--- a/browser/components/places/content/treeView.js
+++ b/browser/components/places/content/treeView.js
@@ -370,26 +370,27 @@ PlacesTreeView.prototype = {
if (!parent)
item.containerOpen = !item.containerOpen;
}
this._tree.endUpdateBatch();
// 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;
}
}
else { // history nodes
var uri = nodeInfo.node.uri;
if (uri) {
for (i=0; i < newElements.length && index == -1; i++) {
if (newElements[i].uri == uri)
@@ -587,20 +588,23 @@ PlacesTreeView.prototype = {
newViewIndex = viewIndex;
break;
}
}
if (newViewIndex < 0) {
// 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--;
}
}
// Try collapsing with the previous node. Note that we do not have to try
// to redraw the surrounding rows (which we normally would because session
// boundaries may have changed) because when an item is merged, it will
// always be in the same session.
var showThis = { value: true };
@@ -680,17 +684,18 @@ PlacesTreeView.prototype = {
// if the item was exclusively selected, the node next to it will be
// selected
var selectNext = false;
var selection = this.selection;
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;
}
// this may have been a container, in which case it has a lot of rows
var count = this._countVisibleRowsForItem(aItem);
// We really want tail recursion here, since we sometimes do another
// remove after this when duplicates are being collapsed. This loop
@@ -774,17 +779,18 @@ PlacesTreeView.prototype = {
// remove the nodes, let itemInserted restore all of its contents
this._visibleElements.splice(oldViewIndex, count);
this._tree.rowCountChanged(oldViewIndex, -count);
this.itemInserted(aNewParent, aItem, aNewIndex);
// 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);
}
selection.selectEventsSuppressed = false;
}
},
/**
@@ -1004,35 +1010,37 @@ PlacesTreeView.prototype = {
else
var columnType = aColumn.id;
if (columnType != "title")
return;
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) { },
isContainer: function PTV_isContainer(aRow) {
this._ensureValidRow(aRow);
if (this._flatList)
return false; // but see getCellProperties
--- a/browser/components/places/content/utils.js
+++ b/browser/components/places/content/utils.js
@@ -248,17 +248,18 @@ var PlacesUtils = {
/**
* Determines whether or not a ResultNode is a Bookmark folder or not.
* @param aNode
* A result node
* @returns true if the node is a Bookmark folder, false otherwise
*/
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);
},
/**
* Determines whether or not a ResultNode represents a bookmarked URI.
* @param aNode
* A result node
* @returns true if the node represents a bookmarked URI, false otherwise
*/
@@ -326,17 +327,17 @@ var PlacesUtils = {
* @param aNode
* A result node
* @returns true if the node is readonly, false otherwise
*/
nodeIsReadOnly: function PU_nodeIsReadOnly(aNode) {
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;
},
/**
* Determines whether or not a ResultNode is a host folder or not
* @param aNode
@@ -350,16 +351,17 @@ var PlacesUtils = {
/**
* Determines whether or not a ResultNode is a container item or not
* @param aNode
* A result node
* @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,
Ci.nsINavHistoryResultNode.RESULT_TYPE_DYNAMIC_CONTAINER],
nodeIsContainer: function PU_nodeIsContainer(aNode) {
NS_ASSERT(aNode, "null node");
return this.containerTypes.indexOf(aNode.type) != -1;
},
@@ -409,17 +411,27 @@ var PlacesUtils = {
* @param aNode
* The node to test.
* @returns true if the node is a readonly folder.
*/
isReadonlyFolder: function(aNode) {
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;
},
/**
* Gets the index of a node within its parent container
* @param aNode
* The node to look up
* @returns The index of the node within its parent container, or -1 if the
* node was not found or the node specified has no parent.
@@ -1561,18 +1573,19 @@ var PlacesUtils = {
/**
* Get the most recently added/modified bookmark for a URL, excluding items
* under tag or livemark containers. -1 is returned if no item is found.
*/
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;
var grandparent = this.bookmarks.getFolderIdForItem(parent);
if (grandparent != this.tagsFolderId &&
!this.annotations.itemHasAnnotation(parent, LMANNO_FEEDURI))
return bk;
@@ -1683,17 +1696,18 @@ var PlacesUtils = {
return reallyOpen;
},
/** aItemsToOpen needs to be an array of objects of the form:
* {uri: string, isBookmark: boolean}
*/
_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
this.markPageAsTyped(item.uri);
urls.push(item.uri);
}
--- a/browser/components/preferences/advanced.js
+++ b/browser/components/preferences/advanced.js
@@ -50,16 +50,17 @@ var gAdvancedPane = {
var preference = document.getElementById("browser.preferences.advanced.selectedTabIndex");
if (preference.value === null)
return;
advancedPrefs.selectedIndex = preference.value;
this.updateAppUpdateItems();
this.updateAutoItems();
this.updateModeItems();
+ this.updateOfflineApps();
},
/**
* Stores the identity of the current tab in preferences so that the selected
* tab can be persisted between openings of the preferences window.
*/
tabSelectionChanged: function ()
{
@@ -174,16 +175,104 @@ var gAdvancedPane = {
{
var cacheService = Components.classes["@mozilla.org/network/cache-service;1"]
.getService(Components.interfaces.nsICacheService);
try {
cacheService.evictEntries(Components.interfaces.nsICache.STORE_ANYWHERE);
} 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
/*
* Preferences:
*
* app.update.enabled
* - true if updates to the application are enabled, false otherwise
* extensions.update.enabled
--- a/browser/components/preferences/advanced.xul
+++ b/browser/components/preferences/advanced.xul
@@ -19,16 +19,17 @@
# The Initial Developer of the Original Code is
# Ben Goodger.
# Portions created by the Initial Developer are Copyright (C) 2005
# the Initial Developer. All Rights Reserved.
#
# 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
# 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
@@ -209,34 +210,53 @@
<hbox align="center">
<description flex="1" control="connectionSettings">&connectionDesc.label;</description>
<button id="connectionSettings" icon="network" label="&connectionSettings.label;"
accesskey="&connectionSettings.accesskey;"
oncommand="gAdvancedPane.showConnections();"/>
</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"
accesskey="&useCacheBefore.accesskey;">&useCacheBefore.label;</label>
<textbox id="cacheSize" type="number" size="2"
preference="browser.cache.disk.capacity"
onsyncfrompreference="return gAdvancedPane.readCacheSize();"
onsynctopreference="return gAdvancedPane.writeCacheSize();"
aria-labelledby="useCacheBefore cacheSize useCacheAfter"/>
<label id="useCacheAfter" flex="1">&useCacheAfter.label;</label>
<button id="clearCacheButton" icon="clear"
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 -->
<tabpanel id="updatePanel" orient="vertical" align="start">
<label control="autoUpdateGroup">&autoCheck.label;</label>
<vbox class="indent" id="autoUpdateGroup" role="group">
<checkbox id="enableAppUpdate"
label="&enableAppUpdate.label;"
@@ -310,17 +330,17 @@
</rows>
</grid>
</groupbox>
<!-- Certificates -->
<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
they're not - this preference uses *those strings* as its values.
I KID YOU NOT.
-->
<radiogroup id="certSelection" orient="horizontal" preftype="string"
preference="security.default_personal_cert" aria-abelledby="CertGroupCaption CertSelectionDesc">
--- a/browser/components/preferences/applications.js
+++ b/browser/components/preferences/applications.js
@@ -845,20 +845,26 @@ var gApplicationsPane = {
this._prefSvc.addObserver(PREF_FEED_SELECTED_READER, this, false);
// Listen for window unload so we can remove our preference observers.
window.addEventListener("unload", this, false);
// 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"))
+ 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");
- else if (document.getElementById("actionColumn").hasAttribute("sortDirection"))
- this._sortColumn = document.getElementById("actionColumn");
// Load the data and build the list of handlers.
// By doing this in a timeout, we let the preferences dialog resize itself
// to an appropriate size before we add a bunch of items to the list.
// Otherwise, if there are many items, and the Applications prefpane
// is the one that gets displayed when the user first opens the dialog,
// the dialog might stretch too much in an attempt to fit them all in.
// XXX Shouldn't we perhaps just set a max-height on the richlistbox?
@@ -1011,29 +1017,30 @@ var gApplicationsPane = {
_rebuildVisibleTypes: function() {
// Reset the list of visible types and the visible type description counts.
this._visibleTypes = [];
this._visibleTypeDescriptionCount = {};
// 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;
// Hide types handled only by plugins if so prefed.
if (handlerInfo.handledOnlyByPlugin && !showPlugins)
continue;
--- a/browser/components/preferences/cookies.js
+++ b/browser/components/preferences/cookies.js
@@ -265,16 +265,28 @@ var gCookiesWindow = {
}
return null;
},
_removeItemAtIndex: function (aIndex, aCount)
{
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;
}
var item = this._getItemAtIndex(aIndex);
if (!item) return;
this._invalidateCache(aIndex - 1);
if (item.container)
--- a/browser/components/preferences/sanitize.xul
+++ b/browser/components/preferences/sanitize.xul
@@ -57,16 +57,17 @@
<preferences>
<preference id="privacy.item.history" name="privacy.item.history" type="bool"/>
<preference id="privacy.item.formdata" name="privacy.item.formdata" type="bool"/>
<preference id="privacy.item.passwords" name="privacy.item.passwords" type="bool"/>
<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>
<description>&clearDataSettings.label;</description>
<checkbox label="&itemHistory.label;"
accesskey="&itemHistory.accesskey;"
preference="privacy.item.history"/>
@@ -77,16 +78,19 @@
accesskey="&itemFormSearchHistory.accesskey;"
preference="privacy.item.formdata"/>
<checkbox label="&itemCache.label;"
accesskey="&itemCache.accesskey;"
preference="privacy.item.cache"/>
<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"/>
<checkbox label="&itemSessions.label;"
accesskey="&itemSessions.accesskey;"
preference="privacy.item.sessions"/>
</prefpane>
--- a/browser/components/safebrowsing/content/malware-warden.js
+++ b/browser/components/safebrowsing/content/malware-warden.js
@@ -85,22 +85,26 @@ function PROT_MalwareWarden() {
},
updateUrlRequested: function(url) { },
streamCompleted: function() { },
updateError: function(errorCode) { },
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");
}
PROT_MalwareWarden.inherits(PROT_ListWarden);
/**
* Cleanup on shutdown.
*/
--- a/browser/components/search/content/search.xml
+++ b/browser/components/search/content/search.xml
@@ -21,16 +21,17 @@
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Pierre Chanial (v2) <p_ch@verizon.net>
# Gavin Sharp (v3) <gavin@gavinsharp.com>
# 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
# 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
@@ -86,18 +87,17 @@
<xul:image class="searchbar-dropmarker-image"/>
<xul:menupopup class="searchbar-popup"
anonid="searchbar-popup"
position="after_start">
<xul:menuseparator/>
<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">
<xul:image class="search-go-button"
anonid="search-go-button"
chromedir="&locale.dir;"
onclick="handleSearchCommand(event);"
tooltiptext="&searchEndCap.label;" />
@@ -547,17 +547,21 @@
this.focus();
this.select();
]]></handler>
<handler event="popupshowing" action="this.rebuildPopupDynamic();"/>
<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>
<binding id="searchbar-textbox"
extends="chrome://global/content/bindings/autocomplete.xml#autocomplete">
<implementation implements="nsIObserver nsIDOMXULLabeledControlElement">
<constructor><![CDATA[
if (document.getBindingParent(this).parentNode.parentNode.localName ==
--- a/browser/components/search/nsSearchSuggestions.js
+++ b/browser/components/search/nsSearchSuggestions.js
@@ -422,17 +422,17 @@ SuggestAutoComplete.prototype = {
_startHistorySearch: function SAC_SHSearch(searchString, searchParam, previousResult) {
var formHistory =
Cc["@mozilla.org/autocomplete/search;1?name=form-history"].
createInstance(Ci.nsIAutoCompleteSearch);
formHistory.startSearch(searchString, searchParam, previousResult, this);
},
/**
- * 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() {
var currentTime = Date.now();
this._serverErrorLog.push(currentTime);
if (this._serverErrorLog.length > this._maxErrorsBeforeBackoff)
this._serverErrorLog.shift();
--- a/browser/components/sessionstore/src/nsSessionStore.js
+++ b/browser/components/sessionstore/src/nsSessionStore.js
@@ -860,18 +860,16 @@ SessionStoreService.prototype = {
browser.parentNode.__SS_data = tabData;
}
else {
tabData.entries[0] = { url: browser.currentURI.spec };
tabData.index = 1;
}
- tabData.zoom = browser.markupDocumentViewer.textZoom;
-
var disallow = [];
for (var i = 0; i < CAPABILITIES.length; i++)
if (!browser.docShell["allow" + CAPABILITIES[i]])
disallow.push(CAPABILITIES[i]);
if (disallow.length > 0)
tabData.disallow = disallow.join(",");
else if (tabData.disallow)
delete tabData.disallow;
@@ -1497,18 +1495,16 @@ SessionStoreService.prototype = {
if (!tabData.entries) {
tabData.entries = [];
}
if (tabData.extData) {
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);
}
// make sure to reset the capabilities and attributes, in case this tab gets reused
var disallow = (tabData.disallow)?tabData.disallow.split(","):[];
CAPABILITIES.forEach(function(aCapability) {
browser.docShell["allow" + aCapability] = disallow.indexOf(aCapability) == -1;
--- a/browser/fuel/src/fuelApplication.js
+++ b/browser/fuel/src/fuelApplication.js
@@ -1152,18 +1152,16 @@ function Application() {
this._info = Components.classes["@mozilla.org/xre/app-info;1"]
.getService(Ci.nsIXULAppInfo);
var os = Components.classes["@mozilla.org/observer-service;1"]
.getService(Ci.nsIObserverService);
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);
}
//=================================================
// Application implementation
Application.prototype = {
// for nsIClassInfo + XPCOMUtils
classDescription: "Application",
@@ -1216,21 +1214,17 @@ Application.prototype = {
gShutdown.shift()();
}
// release our observers
var os = Components.classes["@mozilla.org/observer-service;1"]
.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;
this._console = null;
this._prefs = null;
this._storage = null;
this._events = null;
this._extensions = null;
--- a/browser/installer/removed-files.in
+++ b/browser/installer/removed-files.in
@@ -34,16 +34,17 @@ searchplugins/eBay.src
searchplugins/eBay.gif
searchplugins/google.src
searchplugins/google.gif
searchplugins/yahoo.src
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
components/xpinstal.dll
#else
components/@DLL_PREFIX@jsd@DLL_SUFFIX@
components/@DLL_PREFIX@xpinstall@DLL_SUFFIX@
#endif
@@ -54,17 +55,16 @@ XUL
#else
@DLL_PREFIX@xul@DLL_SUFFIX@
#endif
#endif
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
components/nsBackgroundUpdateService.js
components/nsCloseAllWindows.js
#ifndef XP_MACOSX
components/autocomplete.xpt
#endif
@@ -85,16 +85,17 @@ components/talkback/talkback
components/talkback/talkback.so
components/talkback/XTalkback.ad
extensions/reporter@mozilla.org/install.rdf
extensions/reporter@mozilla.org/chrome.manifest
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
uninstall/uninstall.exe
components/myspell/en-US.dic
components/myspell/en-US.aff
searchplugins/DRAE.src
searchplugins/DRAE.png
@@ -517,18 +518,18 @@ extensions/talkback@mozilla.org/componen
extensions/talkback@mozilla.org/components/talkback/Talkback.app/Contents/Resources/KeyInfoSections.plist
extensions/talkback@mozilla.org/components/talkback/Talkback.app/Contents/Resources/send.tiff
extensions/talkback@mozilla.org/components/talkback/Talkback.app/Contents/Resources/sort_ascending.tiff
extensions/talkback@mozilla.org/components/talkback/Talkback.app/Contents/Resources/sort_descending.tiff
extensions/talkback@mozilla.org/components/talkback/Talkback.app/Contents/Resources/Talkback.icns
#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
components/nsUrlClassifierTable.js
res/html/gopher-audio.gif
res/html/gopher-binary.gif
res/html/gopher-find.gif
res/html/gopher-image.gif
@@ -541,9 +542,40 @@ res/html/gopher-unknown.gif
res/fonts/mathfontCMEX10.properties
res/fonts/mathfontCMSY10.properties
res/fonts/mathfontMath1.properties
res/fonts/mathfontMath2.properties
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
--- a/browser/installer/unix/config.it
+++ b/browser/installer/unix/config.it
@@ -755,16 +755,23 @@ Do Not Uninstall=FALSE
[Copy File8]
Timing=post smartupdate
Source=[$GRE_INSTALL_DIR]\freebl3.chk
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
Path Reg Name=Install Directory
Strip Filename=FALSE
;Copy File SequentialX sections
--- a/browser/installer/unix/packages-static
+++ b/browser/installer/unix/packages-static
@@ -49,16 +49,17 @@ bin/application.ini
bin/platform.ini
bin/mozilla-xremote-client
bin/run-mozilla.sh
bin/plugins/libnullplugin.so
bin/res/cmessage.txt
bin/res/effective_tld_names.dat
bin/xpicleanup
bin/libsqlite3.so
+bin/README.txt
; [Components]
bin/components/alerts.xpt
bin/components/accessibility.xpt
bin/components/appshell.xpt
bin/components/appstartup.xpt
bin/components/autocomplete.xpt
bin/components/autoconfig.xpt
@@ -156,16 +157,17 @@ bin/components/pref.xpt
bin/components/progressDlg.xpt
bin/components/proxyObjInst.xpt
bin/components/toolkitremote.xpt
bin/components/rdf.xpt
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
bin/components/txtsvc.xpt
bin/components/txmgr.xpt
bin/components/uconv.xpt
bin/components/unicharutil.xpt
bin/components/uriloader.xpt
@@ -266,17 +268,17 @@ bin/chrome/browser.jar
bin/chrome/browser.manifest
bin/chrome/classic.jar
bin/chrome/classic.manifest
bin/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf
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
; shell icons
bin/icons/*.xpm
bin/icons/*.png
@@ -343,16 +345,17 @@ bin/components/dom_svg.xpt
; [Personal Security Manager]
;
bin/libnssckbi.so
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
bin/libfreebl3.chk
bin/libfreebl3.so
bin/libssl3.so
bin/libnssdbm3.so
bin/chrome/pipnss.jar
@@ -370,16 +373,18 @@ bin/libfreebl_32int64_3.so
; [Updater]
;
bin/updater
; [Crash Reporter]
;
bin/crashreporter
bin/crashreporter.ini
+bin/crashreporter-override.ini
+bin/Throbber-small.gif
; [Extensions]
;
bin/components/libnkgnomevfs.so
bin/components/libauth.so
; [Additional Developer Tools]
[adt]
--- a/browser/installer/windows/packages-static
+++ b/browser/installer/windows/packages-static
@@ -177,16 +177,17 @@ bin\components\unicharutil.xpt
bin\components\uriloader.xpt
bin\components\webBrowser_core.xpt
bin\components\webbrowserpersist.xpt
bin\components\webshell_idls.xpt
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
bin\components\xpcom_ds.xpt
bin\components\xpcom_io.xpt
bin\components\xpcom_thread.xpt
bin\components\xpcom_xpti.xpt
bin\components\xpconnect.xpt
@@ -326,16 +327,17 @@ bin\res\svg.css
bin\components\dom_svg.xpt
; [Personal Security Manager]
;
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
bin\softokn3.dll
bin\freebl3.chk
bin\freebl3.dll
bin\ssl3.dll
bin\nssdbm3.dll
@@ -344,16 +346,17 @@ bin\chrome\pippki.manifest
; [Updater]
;
bin\updater.exe
; [Crash Reporter]
bin\crashreporter.exe
bin\crashreporter.ini
+bin\crashreporter-override.ini
; [Additional Developer Tools]
[adt]
bin\extensions\inspector@mozilla.org\install.rdf
bin\extensions\inspector@mozilla.org\components\inspector-cmdline.js
bin\extensions\inspector@mozilla.org\chrome.manifest
bin\extensions\inspector@mozilla.org\chrome\inspector.jar
bin\extensions\inspector@mozilla.org\defaults\preferences\inspector.js
--- a/browser/locales/Makefile.in
+++ b/browser/locales/Makefile.in
@@ -310,8 +310,13 @@ ifeq ($(OS_ARCH),WINNT)
else
ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT)))
$(SYSINSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)/updater.app/Contents/MacOS
else
$(SYSINSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)
endif
endif
endif
+
+ifdef MOZ_CRASHREPORTER
+libs:: $(addprefix $(LOCALE_SRCDIR)/,crashreporter/crashreporter-override.ini)
+ $(SYSINSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)
+endif
--- a/browser/locales/en-US/chrome/browser/aboutDialog.dtd
+++ b/browser/locales/en-US/chrome/browser/aboutDialog.dtd
@@ -1,10 +1,9 @@
<!ENTITY aboutDialog.title "About &brandFullName;">
<!ENTITY copyright "Credits">
<!ENTITY copyright.accesskey "C">
<!ENTITY aboutLink "< About &brandFullName;">
<!ENTITY aboutLink.accesskey "A">
<!ENTITY aboutVersion "version">
-<!ENTITY copyrightText "©1998-2008 Contributors. All Rights Reserved. Firefox and the
+<!ENTITY copyrightInfo "©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.">
--- a/browser/locales/en-US/chrome/browser/browser.dtd
+++ b/browser/locales/en-US/chrome/browser/browser.dtd
@@ -44,16 +44,20 @@
<!ENTITY pageInfoCmd.accesskey "I">
<!ENTITY pageInfoCmd.commandkey "i">
<!ENTITY fullScreenCmd.label "Full Screen">
<!ENTITY fullScreenCmd.accesskey "F">
<!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">
<!ENTITY bookmarksMenu.label "Bookmarks">
<!ENTITY bookmarksMenu.accesskey "B">
<!ENTITY bookmarkThisPageCmd.label "Bookmark This Page">
<!ENTITY bookmarkThisPageCmd.commandkey "d">
@@ -222,28 +226,30 @@
<!ENTITY viewPageSourceCmd.label "View Page Source">
<!ENTITY viewPageSourceCmd.accesskey "V">
<!ENTITY viewFrameSourceCmd.label "View Frame Source">
<!ENTITY viewFrameSourceCmd.accesskey "V">
<!ENTITY viewPageInfoCmd.label "View Page Info">
<!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…">
<!ENTITY savePageCmd.accesskey "A">
<!-- alternate for content area context menu -->
<!ENTITY savePageCmd.accesskey2 "P">
<!ENTITY savePageCmd.commandkey "s">
<!ENTITY saveFrameCmd.label "Save Frame As…">
@@ -255,16 +261,18 @@
<!ENTITY sendLinkCmd.label "Send Link…">
<!ENTITY sendLinkCmd.accesskey "d">
<!ENTITY saveImageCmd.label "Save Image As…">
<!ENTITY saveImageCmd.accesskey "v">
<!ENTITY sendImageCmd.label "Send Image…">
<!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">
<!ENTITY copyImageContentsCmd.accesskey "y">
<!ENTITY blockImageCmd.accesskey "B">
<!ENTITY metadataCmd.label "Properties">
<!ENTITY metadataCmd.accesskey "P">
<!ENTITY copyEmailCmd.label "Copy Email Address">
@@ -278,16 +286,18 @@
<!ENTITY fullZoomEnlargeCmd.commandkey2 "="> <!-- + is above this key on many keyboards -->
<!ENTITY fullZoomReduceCmd.label "Zoom Out">
<!ENTITY fullZoomReduceCmd.accesskey "O">
<!ENTITY fullZoomReduceCmd.commandkey "-">
<!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">
<!ENTITY newTabButton.tooltip "Open a new tab">
<!ENTITY newWindowButton.tooltip "Open a new window">
<!ENTITY sidebarCloseButton.tooltip "Close sidebar">
<!ENTITY cutButton.tooltip "Cut">
@@ -334,15 +344,17 @@
<!ENTITY findOnCmd.label "Find in This Page…">
<!ENTITY findOnCmd.accesskey "F">
<!ENTITY findOnCmd.commandkey "f">
<!ENTITY findAgainCmd.label "Find Again">
<!ENTITY findAgainCmd.accesskey "g">
<!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">
--- a/browser/locales/en-US/chrome/browser/browser.properties
+++ b/browser/locales/en-US/chrome/browser/browser.properties
@@ -76,34 +76,52 @@ updatesItem_pendingFallback=Apply Downloaded Update Now…
feedNoFeeds=Page has no feeds
feedShowFeedNew=Subscribe to '%S'…
feedHasFeedsNew=Subscribe to this page…
# History menu
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
refreshBlocked.refreshLabel=%S prevented this page from automatically reloading.
refreshBlocked.redirectLabel=%S prevented this page from automatically redirecting to another page.
# Star button
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:
identity.domainverified.supplemental=Information identifying the owner of this web site may not have been validated.
identity.identified.title=Identity Verified
identity.identified.body=This web site is owned by:
identity.identified.verifier=Verified by: %S
identity.identified.state_and_country=%S, %S
identity.identified.title_with_country=%S (%S)
identity.unknown.title=Identity Unknown
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
--- a/browser/locales/en-US/chrome/browser/credits.dtd
+++ b/browser/locales/en-US/chrome/browser/credits.dtd
@@ -11,9 +11,9 @@
<!-- localization credits look like this: -->
<!--
<!ENTITY credit.translation
"<h3>Translators</h3><ul><li>Name Here</li></ul>">
-->
<!ENTITY credit.translation "">
<!ENTITY credit.memory "In Fond Memory Of">
-<!ENTITY credit.poweredByGecko "Powered by Gecko™">
+<!ENTITY credit.poweredByGeckoReg "Powered by Gecko®">
--- a/browser/locales/en-US/chrome/browser/feeds/subscribe.properties
+++ b/browser/locales/en-US/chrome/browser/feeds/subscribe.properties
@@ -3,15 +3,46 @@ addHandler=Add "%S" (%S) as a Feed Reade
addHandlerAddButton=Add Feed Reader
addHandlerAddButtonAccesskey=A
handlerRegistered="%S" is already registered as a Feed Reader
liveBookmarks=Live Bookmarks
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?"
addProtocolHandler=Add %S (%S) as an application for %S links?
addProtocolHandlerAddButton=Add Application
# "%appName has already been added as an application for %protocolType links."
protocolHandlerRegistered=%S has already been added as an application for %S links.
--- a/browser/locales/en-US/chrome/browser/pageInfo.dtd
+++ b/browser/locales/en-US/chrome/browser/pageInfo.dtd
@@ -60,26 +60,24 @@
<!ENTITY generalEncoding "Encoding:">
<!ENTITY generalMetaName "Name">
<!ENTITY generalMetaContent "Content">
<!ENTITY generalSecurityMore "More">
<!ENTITY generalSecurityMore.accesskey "o">
<!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…">
<!ENTITY mediaSaveAs.accesskey "A">
<!ENTITY mediaSaveAs2.accesskey "e">
<!ENTITY mediaPreview "Media Preview:">
<!ENTITY feedTab "Feeds">
--- a/browser/locales/en-US/chrome/browser/pageInfo.properties
+++ b/browser/locales/en-US/chrome/browser/pageInfo.properties
@@ -52,16 +52,21 @@ mediaBGImg=Background
mediaObject=Object
mediaEmbed=Embed
mediaLink=Icon
mediaInput=Input
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
generalNotCached=Not cached
generalDiskCache=Disk cache
generalMemoryCache=Memory cache
generalSize=%S KB (%S bytes)
generalMetaTag=Meta (1 tag)
--- a/browser/locales/en-US/chrome/browser/places/places.properties
+++ b/browser/locales/en-US/chrome/browser/places/places.properties
@@ -65,17 +65,17 @@ view.sortBy.date.label=Sort by Visit Dat
view.sortBy.date.accesskey=V
view.sortBy.visitCount.label=Sort by Visit Count
view.sortBy.visitCount.accesskey=C
view.sortBy.keyword.label=Sort by Keyword
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.sortBy.tags.accesskey=T
searchByDefault=Search in Bookmarks
searchCurrentDefault=Search in '%S'
findInPrefix=Find in '%S'…
--- a/browser/locales/en-US/chrome/browser/preferences/advanced.dtd
+++ b/browser/locales/en-US/chrome/browser/preferences/advanced.dtd
@@ -29,17 +29,17 @@
<!ENTITY networkTab.label "Network">
<!ENTITY connection.label "Connection">
<!ENTITY connectionDesc.label "Configure how &brandShortName; connects to the Internet">
<!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
line in preferences as follows:
&useCacheBefore.label [ textbox for cache size in MB ] &useCacheAfter.label;
-->
<!ENTITY useCacheBefore.label "Use up to">
@@ -62,26 +62,31 @@
<!ENTITY askMe.accesskey "k">
<!ENTITY modeAutomatic.label "Automatically download and install the update">
<!ENTITY modeAutomatic.accesskey "d">
<!ENTITY modeAutoAddonWarn.label "Warn me if this will disable any of my add-ons">
<!ENTITY modeAutoAddonWarn.accesskey "W">
<!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">
<!ENTITY protocols.label "Protocols">
<!ENTITY useSSL3.label "Use SSL 3.0">
<!ENTITY useSSL3.accesskey "3">
<!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">
<!ENTITY certs.ask.accesskey "i">
<!ENTITY viewCerts.label "View Certificates">
<!ENTITY viewCerts.accesskey "s">
<!ENTITY viewCRLs.label "Revocation Lists">
<!ENTITY viewCRLs.accesskey "R">
--- a/browser/locales/en-US/chrome/browser/preferences/connection.dtd
+++ b/browser/locales/en-US/chrome/browser/preferences/connection.dtd
@@ -1,16 +1,18 @@
<!ENTITY connectionsDialog.title "Connection Settings">
<!ENTITY window.width "37em">
<!ENTITY window.macWidth "39em">
<!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:">
<!ENTITY manualTypeRadio.accesskey "m">
<!ENTITY autoTypeRadio.label "Automatic proxy configuration URL:">
<!ENTITY autoTypeRadio.accesskey "A">
<!ENTITY reload.label "Reload">
<!ENTITY reload.accesskey "e">
--- a/browser/locales/en-US/chrome/browser/preferences/preferences.properties
+++ b/browser/locales/en-US/chrome/browser/preferences/preferences.properties
@@ -45,16 +45,18 @@ chooseDownloadFolderTitle=Choose Downloa
#### Applications
fileEnding=%S file
saveFile=Save File
chooseApp=Choose application…
fpTitleChooseApp=Select Helper Application
webFeed=Web Feed
+videoPodcastFeed=Video Podcast
+audioPodcastFeed=Podcast
alwaysAsk=Always ask
# LOCALIZATION NOTE (pluginName):
# %1$S = plugin name (for example "QuickTime Plugin-in 7.2")
# %2$S = brandShortName from brand.properties (for example "Minefield")
pluginName=%S (in %S)
# LOCALIZATION NOTE (previewInApp, liveBookmarksInApp): %S = brandShortName
@@ -77,8 +79,13 @@ AtEndOfSession = at end of session
can=Allow
canSession=Allow for Session
cannot=Block
noCookieSelected=<no cookie selected>
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
--- a/browser/locales/en-US/chrome/browser/sanitize.dtd
+++ b/browser/locales/en-US/chrome/browser/sanitize.dtd
@@ -10,13 +10,15 @@
<!ENTITY itemFormSearchHistory.label "Saved Form and Search History">
<!ENTITY itemFormSearchHistory.accesskey "F">
<!ENTITY itemPasswords.label "Saved Passwords">
<!ENTITY itemPasswords.accesskey "P">
<!ENTITY itemCookies.label "Cookies">
<!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">
<!ENTITY itemSessions.accesskey "S">
<!ENTITY window.width "30em">
--- a/browser/locales/en-US/chrome/browser/searchbar.dtd
+++ b/browser/locales/en-US/chrome/browser/searchbar.dtd
@@ -1,3 +1,2 @@
<!ENTITY cmd_engineManager.label "Manage Search Engines…">
-<!ENTITY cmd_engineManager.accesskey "M">
<!ENTITY searchEndCap.label "Search">
--- a/browser/locales/en-US/chrome/browser/tabbrowser.dtd
+++ b/browser/locales/en-US/chrome/browser/tabbrowser.dtd
@@ -7,12 +7,12 @@
<!ENTITY closeOtherTabs.label "Close Other Tabs">
<!ENTITY reloadAllTabs.label "Reload All Tabs">
<!ENTITY reloadAllTabs.accesskey "A">
<!ENTITY reloadTab.label "Reload Tab">
<!ENTITY reloadTab.accesskey "r">
<!ENTITY listAllTabs.label "List all tabs">
<!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">
new file mode 100644
--- /dev/null
+++ b/browser/locales/en-US/crashreporter/crashreporter-override.ini
@@ -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.
--- a/browser/locales/en-US/searchplugins/list.txt
+++ b/browser/locales/en-US/searchplugins/list.txt
@@ -1,6 +1,7 @@
amazondotcom
answers
creativecommons
eBay
google
+wikipedia
yahoo
new file mode 100644
--- /dev/null
+++ b/browser/locales/en-US/searchplugins/wikipedia.xml
@@ -0,0 +1,15 @@
+<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
+<ShortName>Wikipedia (English)</ShortName>
+<Description>Wikipedia, the free encyclopedia</Description>
+<InputEncoding>UTF-8</InputEncoding>
+<Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAEAgQAhIOEAMjHyABIR0gA6ejpAGlqaQCpqKkAKCgoAPz9%2FAAZGBkAmJiYANjZ2ABXWFcAent6ALm6uQA8OjwAiIiIiIiIiIiIiI4oiL6IiIiIgzuIV4iIiIhndo53KIiIiB%2FWvXoYiIiIfEZfWBSIiIEGi%2FfoqoiIgzuL84i9iIjpGIoMiEHoiMkos3FojmiLlUipYliEWIF%2BiDe0GoRa7D6GPbjcu1yIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</Image>
+<Url type="application/x-suggestions+json" method="GET" template="http://en.wikipedia.org/w/api.php">
+ <Param name="action" value="opensearch"/>
+ <Param name="search" value="{searchTerms}"/>
+</Url>
+<Url type="text/html" method="GET" template="http://en.wikipedia.org/wiki/Special:Search">
+ <Param name="search" value="{searchTerms}"/>
+ <Param name="sourceid" value="Mozilla-search"/>
+</Url>
+<SearchForm>http://en.wikipedia.org/wiki/Special:Search</SearchForm>
+</SearchPlugin>
index 63868c24ae64d68997644557079d371f9f088892..152e0475a8bde938586cc882d83a75283c4f1935
GIT binary patch
literal 570
zc$@(`0>%A_P)<h;3K|Lk000e1NJLTq000dD000dL1^@s6a_i)L00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10k=s+K~yM_g_6H(6LA=apZn&nN$+y;^4n0sW{nOBL4=APIHlq&
z=-xlTF_V*?3K`Ww5S;uMTr*e@(LpH@HCjRZkv7`on%p;cxtxopmR5b|=i&YEeqN>3
zYVogWn@t6{0^9;#*{-uH{v(_RI_2{6gVjc331|SQe}PW`cMAFZ>1wr>SWGN}0zh;?
zYMadxa64%jm+JNU!jV)ODLs0<9=UvG&Z)oPB+%4U?P{%7jTZ|?MG#Es_xnic;rl)*
z%h;3JX7e&|uTrV#<>O^7iXw)CA)fS*a>B%)5ClHbm;2(~KeMu8q^&GJcD~c?cJbtx
zFbtUyqN*yY8Y3&seeu?wtgqiK6mz<jF&FfdhMa;Bpv5#qOhE{RX&B5UVY|*F;8^e5
z_RY7iH^;-lZctjvQ7mOK%mfKNPC}0pF`LH|0JiIlY}dIKMbUD9Yv<vcjZHb)m0>1p
zVWmy<WE@1ax9QK5+pe>9Zg^uY3}+|5e%gNAdHKQf#*@fQ8N^iOcUK(x5w`1e&kn9%
z4E(A6@!gl_8!z6E-N6V2<zTso$j^XNZL@iy+xhH>nDP|hCm`ml=&;Px?f?J)07*qo
IM6N<$f_D1|4*&oF
index 4fe4569107b86bf197287b624a5feb196ee1af9b..259c8a4f01cd6a929a3440a5b579fef5275ce0ae
GIT binary patch
literal 573
zc$@(}0>b@?P)<h;3K|Lk000e1NJLTq000dD000dL1^@s6a_i)L00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10lG;<K~yM_eUi^=6Hyq&e>3-H@^=t15S7+$TnK_9t^}Les1d7q
z3s<gOD9pn3P-tGDh|;ZZPzu64fl3vTLZ=!dwMlBiZ6-6B%v=|mQib%a&*A(&zGJjn
zEqvR33tR@C0dE}TX-<*p+io7HuRK^;Tw1!c0c`uWTR$}fXn>rsxN+@fzH#^7)oS(J
zrf<7jzU^L_7y3uVLYdpQ>V^99@|{wt^xn7KSHA7mPI`>yx|IW>=EFzk=qN;MzyQn2
zA*7(wX{XyCKgDU9t^uo#@<OAzZb=}%-)NY<?jaftTB9`xDX3IR7$yWkFbRUMBjB<8
zdy^4O#vF|lQ8XqThs5!OD2hmugoVWmoWEGJFtioyetRiroKZZYKkO365unM?6w4M1
z)fz$wzI@(^h66P|*+e)|NDD-+fN7ePD@CNpaj@T?9Cn9^)_N6KbCfqe#>0eCr9eJ!
zA*H1EbCB+Lz9%}<ueH`M9Od<ARL6Kiz?riZe)W`Y@3x~X%Qmw#d+I1}@Bg<*M|s+}
zUDP0?y>}2!lk`J6O`kZ*dpB<p@=uGo5$yc9o=&spj`FtVnP>V9B1pwCXWB}@00000
LNkvXXu0mjf?Z5s_
index 2eb45dea23148624db2dabd2cbaa515865427269..01fb204fd6be02c981df6565e5fc0ef91ffe747c
GIT binary patch
literal 840
zc$@)91GoH%P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00001b5ch_0Itp)
z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iO4^
z4<{)JUk?@l00PKKL_t(I%av2zOH*MSe%^E5bI#VBb7!W`k7Q~e&_y4tyyydyOsCQ}
zA`wIoT@`dQ7Q65&1QDydA{B}XL@Y>+a_K)%f}w>&D{5}FRx{6LbLZ^ryj_%n;)Ole
zzvqMJ;YS!_SPvbY?QQ^90JtfomAbA60gMB<?eqHIFW-^10v(<00)RGImM=9nG{@|A
zxrFC=2ZQlF{xcpOdj70LQIrk<H+^2eLDw;F+r4Yg$^F#_tzA#v@n2%oHpU3R49C`D
z8|S-lSsV!rUkV1N8Gx=;2|7C4-LhRCI(_Dx_1e8Ryv1rURTk&LVxq7}JVM_UOn-{0
z_q|7!y1VaW7k@7v;MTZbsjv6M?!K5w$@W~6Ws?a2ke@4IM`<pa_LXDr_G0PQz*NTL
zY5D}<;#vWBo-MEBM?$le6<U#N7VuluVG=kvazqr^B<yrK5DYKa3JVH018}eEfKpmX
zIL^fL6mpIPNzjo<WiS_C0wDlLIK-1_fIy&BZ~`E!1aw^wGQ)711WvZ+2!bSV;0Qq?
zmBGiT0g?U<EQ(Z9)pQuZ?AjH^Bav`zu?+?Di8P$D1&je%!@ztp1IiO5lPS2X@)shJ
z$S(lnt2zjU=Eh%*1zatMTqGP*5RNZG5;&Me9%hL{bbb-ptdVRzT*d`PM_d4US7vN!
zJ=;JjeOgiBGH<QghDJ{_249C+Xn|>J79tE|X=kZ*;Y77l7#<!>&4oiZd|rPKVT`Si
zJ&g@!O;s^F^8rOgMXaW#cD8&=xhRT)Q&qL_x9GQDqhkSAI-S1m^ZI)LfVQ-rJ+@5F
zXc`nHfymdd=|nPlRn^og0B!&T!0f+Y==FL1pI4R>1p271?x<N)H7JULiHWyqRaH+t
zeDL@sHULTp7mdY!I4GsuGP%ERU_)d8pqi!~pPZZ;WXveaWc2g>eFFjf2mSzNk}!GD
SI``%P0000<MNUMnLSTX$(`4xY
index 38d9c590b2cc18ae0c5c6af1826eea41fcca4c36..fd006f4cda7a1412c85677e0cc413107c8fd30b3
GIT binary patch
literal 862
zc$@)V1EKthP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10^3PMK~y-6jgw7CRACf`-|xG>&ei#5939P+8n7I(MT$XDxhXWU
z%)~6Hjb*zQ{SZRXriCO1Eo#xCXcJ^21QlxjR7M1ar4m$>{mke%7YFamIHS(oxpQwD
z4V8%A%~_p?_nh+{Vp$ee)X~{q2H+fkN}lJvhGBdMFbd#S+oj8+_=|{TS?K6&rvNT6
z#@Y_m9S*p1T=@hvFP%=$g~M8)xBsbI)3iGPuC`seoLUXwm+N`2x3smU`k>hH;6uT;
znNLm-3PLQl$(?ClY&v0k_x5$e_{10hTv-j^G8C~SQ^~w{?AVE{mg_HMcP_J6cnfHL
zE<?5>iw43;<?)+e=BfIf?AOo9Z9~HYBYSr5oml};04=q(bw6(Od`wl86i9VDHo;qH
zM~+<r04O#Y*-pEByYK5_O-=1AfU~O|Pym&AZg=jN=?E+HxZq|IT$v(dfnp(Pz@8zX
zC@%}4d7U|!V<Ujd^*bo$c_AMJLTEmL2_IluCZ^_=AaE3Rn*c@P5#)H0Q0n4&URe+L
zoJ=MRQREBbiL?|?EI>C*Ea_=D6cG+ZfKB2c3p8b!re+vMaQz6Qfj}T!S)3E`%|xKZ
zbVTAQC=v%|6W~-tX!8jaFz|uE^uls3)&TAf3_bH4uPUPHv>8*iI5H%P43UE*P)yIo
zF+Cea^Ii`b93Jra{ZnfI+~B})WaQNgO;y!hXBu~t_+l#R55>9gg3fEvMcpZ;xRX^y
zq_^)0rl$NP7!2-v*xmL1XjAj#pCkf6M`wGhEX&vS@2mc~A%BBYlEgw?PX&E`pZ@aY
z^DU~Xk}X?{AxaYZdi$3Q!)Wa8>ggxzeql3!)61tS1uzL<)aUb0#$vIX<>lLDhl4>7
z#T7`y8o<BQe7xy^BuS6T%eTvnF>oBk;NVb*{#Q4E?yjExWHNbVY-~IcjYcs$8!`!@
o>VG>}<)m5=`1^!VRoC_U-_24j#;&EI-~a#s07*qoM6N<$g1e)I`Tzg`
index 718b2287e9aba22863fc2205fefdb80b426172bc..2434023cee756ee0c817db38b2e59c3f09b98ca7
GIT binary patch
literal 856
zc$@)P1E>6nP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10@X=GK~y-6g_BEYTxAr;f8TfS%_N<N5}YQnnYO02N!yh>9}qDZ
zGzg+#?XDX|s0$Yr6nsG~-3VRi%0)pDqy!WNk%}oPh$uC>lGvCr(`syIhBh;EAI#%^
zFBdvvw1WTD;c(86^AyfGwrgqm{5?|2Cp^!)&pCI<IVXe=tH#)GowJMca|=Ihj~9Kw
z((-xXdEV=u=bhM7+FQtGb0U)&CQVbKI3!78cXR7TWUW2*@I#ND`7glHTrPk1;Pjzf
zy<Y1!TaBdK>-pe>?*}HA&1QFGvzco3dX%Q=k@>lWF9Bqq<ayr7iSdctdU-9nR{i~h
zIEn99Djicwjdwcj2eukp@6>A5uy9+UAf<e>pXc`t=iIo%5ht-{tvx<Jw_vxmx(2*-
z;o=v^gCGDna0>t&QR@a;wORe@)xwV#U*z99JbT)iv;#Qtj~TpsYTpa{Cu(n>`@BQD
z3qrt=c|mdXPw;!6Lc8k*{(OFz_3OJ{e*TT}Tf#ZV^4W|o%{=Al{F5YY2?8c3B*jsO
zbv>^BmU45;VvJ>M)F6{(Hh=!u4*4qZ0Wv}A-G1jItbBcvrEfY2VL3c4Ir_Lj>lT}<
zAs>APTEX3W0**a%n&6j3`NNe1`N0f~N|+o|7^4xwa^+VAZWx^6u9CtSFb1w}DvSyN
z(8d$OImc@!?$wVyea36GTI`$J&(P2iS}T0tLupO7+o4{s(`YtmHd;*2%y8k8SL}Lq
zSJnq8S4(bVqe7?CW;iqQ7eHf-LK{P`*Ch-i!YCvPLn<2^lxvd?+}~^5xwD8dhN-D3
zGMNloE3{UF3YyI(jb@e|BO}~VEDlyX08}a!eBb}y3gRdtNs__w_yAJMa=YC=I6M0w
zyGy$Xf&gPQ#%Q!Q^wJ)291}$mQ511`?J`oz+PM!Gdp>|M=DC&cSKhz$-KD)k436v;
i^&d}4dCgk;EWjUj^N(T1Yi1z;0000<MNUMnLSTYF<b@mn
index 1b4a9dff5df4cd022c6d5e8cc9c0d7693ed6f1df..5efc13676caa5331993c84b7e757f0e2ea1d7a8c
GIT binary patch
literal 924
zc$@*817rM&P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10~tv~K~y-6ZIVrFRAm%~pYOZ3ola*uQ;4Ol%ut**LF$S$iedxU
z*wm&jAStqturS8x#zfso8Urp33rviOx-djS%9bFBjg&M-)7CDewm=K5g$~pIPVd~#
zZRg(m9T!j{;G3My$;p#*-uEaGVM~42uI|%XAF(X!H4$kR5v7zG3q$jVi0N%_>m27P
zDG{OX+Ery)R*z*_pEjg-Ct|U<ibN_Xl}b2;HC(qKOUsLnG3LuR-+1fn{{fE2<5fTG
z-P0VOpP$=U&9Ar{o0~R>vhA`k9*e~)W3fms_rNKYO2^vUI)B*$XaLKyPS@Af$0sIl
zIoaIo`GQ+G;QOUo-}mc0ulV}%%JSE9bGfxdGLg_)pZV_wHh_rK2|~dwSjL!-+S@wK
z*1(8Tb-;e9j3$iI#9wG=8TotsaEr+G#{dwV{33y0WNhG6VzmD=09wDA=qay?f4Ke7
z;mV3s3IR6m-LqF`?q3;E>RgM+=jz)tnU9<5=gwWc;!)fHrQle*qIN;3{H~IQci%%z
zPg8yQG5|{*9Y{J&wzqdZbltbruiuvk=@+}Lpz0`YQG<e1y{2%YheWc0m~9hIOi(@k
zFu{CtGqQ6ht}!h3_Yc^SvXWK(d<Vn7ou==152Xw*?a{RS^$&I3FJneWpN<~Av_wT?
zBfvfl5c)2uTAwfs2*ZHsnRO5l&jVwg0f-2A-ormQ^~wIA>z%V!KA)#C(?ofBIYHp#
zojA#Mt*MGeF}d6m0FzAOcpfV^ZVc$jTw3nlonm%&mTWfrs2;F-yqkrwF*dZuY}-b1
zXo%$CAf;#&PbpT%$BQEJg$=M{M-5>ZlF4L<L?Q%%PtcIYoxDT#!bPfTYACd}BF3<}
zw#M4RJQ(xMD<aozfT^h|Y}=+H5`A<+Kp6T2M~^@{g?s)dBDZgY2<xd7KOcD2%+x&B
za|y7u)|16zaqq!{huD?gMOj(dV>5#wWV5M>LRS}#<KQ?BH*ei!c4Q=X=|b-&fE|Y6
y2g833|2Q}_xLYapjN?x@4`{8k#+diF`u_q48ihof!_dh90000<MNUMnLSTaYp0)e{
index 7a0176fd6752bf9e2587e862a815399f52bb4360..8a10dbe5de957af28003db22d53c2f371b9612fc
GIT binary patch
literal 5754
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
index aabb2b32c110a93ec93c00c2105a1b630c47f262..85910b16ee4ff1c2c0dd8b81b04a45cb1b306ee7
GIT binary patch
literal 8668
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
--- a/browser/themes/gnomestripe/browser/browser.css
+++ b/browser/themes/gnomestripe/browser/browser.css
@@ -201,38 +201,17 @@ menuitem.bookmark-item {
.bookmark-item[container] {
list-style-image: url("moz-icon://stock/gtk-directory?size=menu");
}
/* livemarks have the same layout as folder-item, but in the browser-only livemark-item.png */
/* only the folder icon has any effect for now, item icon is unused */
.bookmark-item[container][livemark] {
- list-style-image: url("chrome://browser/skin/places/livemark-folder.png");
- -moz-image-region: rect(0px, 16px, 16px, 0px);
-}
-
-.bookmark-item[container][livemark][chromedir="rtl"] {
- list-style-image: url("chrome://browser/skin/places/livemark-folder-rtl.png");
- -moz-image-region: rect(0px, 16px, 16px, 0px);
-}
-
-.bookmark-item[container][livemark][open],
-.bookmark-item[container][livemark][open][chromedir="rtl"] {
- -moz-image-region: rect(16px, 16px, 32px, 0px);
-}
-
-.bookmark-item[type="menu"][livemark],
-.bookmark-item[type="menu"][livemark][chromedir="rtl"] {
- -moz-image-region: rect(0px, 32px, 16px, 16px) !important;
-}
-
-.bookmark-item[type="menu"][livemark][open],
-.bookmark-item[type="menu"][livemark][open][chromedir="rtl"] {
- -moz-image-region: rect(16px, 32px, 32px, 16px) !important;
+ list-style-image: url("chrome://browser/skin/feeds/feedIcon16.png");
}
.bookmark-item[container][tagContainer] {
list-style-image: url("chrome://mozapps/skin/places/tagContainerIcon.png");
-moz-image-region: auto;
}
.bookmark-item[container][query] {
@@ -796,21 +775,16 @@ toolbar[iconsize="small"] #paste-button[
-moz-user-input: disabled;
cursor: -moz-grab;
}
#wrapper-urlbar-container #urlbar > .autocomplete-history-dropmarker {
display: none;
}
-/* Keep the URL bar LTR */
-#urlbar .autocomplete-textbox-container {
- direction: ltr;
-}
-
#PopupAutoComplete {
direction: ltr !important;
}
#PopupAutoCompleteRichResult {
direction: ltr !important;
}
@@ -846,16 +820,21 @@ toolbar[iconsize="small"] #paste-button[
cursor: default;
-moz-image-region: rect(32px, 16px, 48px, 0px) !important;
}
/* Identity indicator */
#identity-box {
background-color: -moz-dialog;
-moz-border-end: 1px solid ThreeDShadow;
+ -moz-user-focus: normal;
+}
+
+#identity-box:focus {
+ outline: 1px dotted -moz-DialogText;
}
#identity-icon-label {
padding: 0 2px;
margin: 0;
}
#identity-box.verifiedIdentity > hbox {
@@ -937,17 +916,16 @@ toolbar[iconsize="small"] #paste-button[
.verifiedIdentity > #identity-popup-encryption,
.verifiedDomain > #identity-popup-encryption {
margin-left: -18px;
}
.verifiedIdentity > #identity-popup-encryption > * > #identity-popup-encryption-icon,
.verifiedDomain > #identity-popup-encryption > * > #identity-popup-encryption-icon {
list-style-image: url("chrome://browser/skin/Secure.png");
- -moz-image-region: rect(0px, 18px, 18px, 0px);
}
/* Identity popup bounding box */
#identity-popup-container {
background-image: none;
background-color: white;
min-width: 280px;
padding: 10px;
@@ -962,17 +940,19 @@ toolbar[iconsize="small"] #paste-button[
background-color: #F5F6BE; /* #F7F898; */
color: #000000;
}
#urlbar > .autocomplete-textbox-container {
-moz-binding: url(chrome://browser/skin/browser.xml#autocomplete-security-wrapper);
}