summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemi Collet <fedora@famillecollet.com>2011-06-12 19:39:34 +0200
committerRemi Collet <fedora@famillecollet.com>2011-06-12 19:39:34 +0200
commitdb2a7f177d150f0e71b519757ef90071117a3e02 (patch)
tree6aa7f1b17ee749cfe5cff084572340065a39b1b6
parent9f9463ed77b97764ae253275b1f9f968dbb9d1d1 (diff)
work on bluegriffon 1.1.1, some issue with langpacks...
-rw-r--r--bluegriffon-mozilla.patch528
1 files changed, 528 insertions, 0 deletions
diff --git a/bluegriffon-mozilla.patch b/bluegriffon-mozilla.patch
new file mode 100644
index 0000000..b527ff5
--- /dev/null
+++ b/bluegriffon-mozilla.patch
@@ -0,0 +1,528 @@
+diff -up mozilla-2.0/browser/app/profile/firefox.js.blue mozilla-2.0/browser/app/profile/firefox.js
+--- mozilla-2.0/browser/app/profile/firefox.js.blue 2011-04-14 07:28:21.000000000 +0200
++++ mozilla-2.0/browser/app/profile/firefox.js 2011-06-12 17:13:35.389007262 +0200
+@@ -206,6 +206,7 @@ pref("extensions.getMoreThemesURL", "htt
+ pref("extensions.dss.enabled", false); // Dynamic Skin Switching
+ pref("extensions.dss.switchPending", false); // Non-dynamic switch pending after next
+ // restart.
++pref("extensions.closeOnEscape", false); // allow the escape key to close the add-ons manager if it is standalone
+
+ pref("extensions.{972ce4c6-7e08-4474-a285-3208198ce6fd}.name", "chrome://browser/locale/browser.properties");
+ pref("extensions.{972ce4c6-7e08-4474-a285-3208198ce6fd}.description", "chrome://browser/locale/browser.properties");
+diff -up mozilla-2.0/caps/src/nsScriptSecurityManager.cpp.blue mozilla-2.0/caps/src/nsScriptSecurityManager.cpp
+--- mozilla-2.0/caps/src/nsScriptSecurityManager.cpp.blue 2011-04-14 07:28:22.000000000 +0200
++++ mozilla-2.0/caps/src/nsScriptSecurityManager.cpp 2011-06-12 17:13:35.390007266 +0200
+@@ -1546,6 +1546,7 @@ nsScriptSecurityManager::CheckLoadURIWit
+ &hasFlags);
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (hasFlags) {
++ return NS_OK;
+ // resource: and chrome: are equivalent, securitywise
+ // That's bogus!! Fix this. But watch out for
+ // the view-source stylesheet?
+diff -up mozilla-2.0/content/base/public/nsIDocumentEncoder.idl.blue mozilla-2.0/content/base/public/nsIDocumentEncoder.idl
+--- mozilla-2.0/content/base/public/nsIDocumentEncoder.idl.blue 2011-04-14 07:28:22.000000000 +0200
++++ mozilla-2.0/content/base/public/nsIDocumentEncoder.idl 2011-06-12 17:13:35.391007270 +0200
+@@ -237,6 +237,11 @@ interface nsIDocumentEncoder : nsISuppor
+ const unsigned long OutputFormatDelSp = (1 << 20);
+
+ /**
++ * Output all non-ascii characters as numeric entities
++ */
++ const unsigned long OutputEncodeCharacterEntities = (1 << 21);
++
++ /**
+ * Initialize with a pointer to the document and the mime type.
+ * @param aDocument Document to encode.
+ * @param aMimeType MimeType to use. May also be set by SetMimeType.
+diff -up mozilla-2.0/content/base/src/nsCopySupport.cpp.blue mozilla-2.0/content/base/src/nsCopySupport.cpp
+--- mozilla-2.0/content/base/src/nsCopySupport.cpp.blue 2011-04-14 07:28:22.000000000 +0200
++++ mozilla-2.0/content/base/src/nsCopySupport.cpp 2011-06-12 17:13:35.392007274 +0200
+@@ -436,7 +436,7 @@ nsresult nsCopySupport::IsPlainTextConte
+ // copy it properly (all the copy code for non-plaintext assumes using HTML
+ // serializers and parsers is OK, and those mess up XHTML).
+ nsCOMPtr<nsIHTMLDocument> htmlDoc = do_QueryInterface(aDoc);
+- if (!(htmlDoc && aDoc->IsHTML()))
++ if (!htmlDoc)
+ *aIsPlainTextContext = PR_TRUE;
+
+ return NS_OK;
+diff -up mozilla-2.0/content/base/src/nsDocumentEncoder.cpp.blue mozilla-2.0/content/base/src/nsDocumentEncoder.cpp
+--- mozilla-2.0/content/base/src/nsDocumentEncoder.cpp.blue 2011-04-14 07:28:22.000000000 +0200
++++ mozilla-2.0/content/base/src/nsDocumentEncoder.cpp 2011-06-12 17:13:35.392007274 +0200
+@@ -1333,7 +1333,7 @@ nsHTMLCopyEncoder::SetSelection(nsISelec
+
+ // also consider ourselves in a text widget if we can't find an html document
+ nsCOMPtr<nsIHTMLDocument> htmlDoc = do_QueryInterface(mDocument);
+- if (!(htmlDoc && mDocument->IsHTML()))
++ if (!htmlDoc)
+ mIsTextWidget = PR_TRUE;
+
+ // normalize selection if we are not in a widget
+diff -up mozilla-2.0/content/base/src/nsHTMLContentSerializer.cpp.blue mozilla-2.0/content/base/src/nsHTMLContentSerializer.cpp
+--- mozilla-2.0/content/base/src/nsHTMLContentSerializer.cpp.blue 2011-04-14 07:28:22.000000000 +0200
++++ mozilla-2.0/content/base/src/nsHTMLContentSerializer.cpp 2011-06-12 17:13:35.393007277 +0200
+@@ -250,14 +250,15 @@ nsHTMLContentSerializer::AppendElementSt
+
+ PRBool lineBreakBeforeOpen = LineBreakBeforeOpen(content->GetNameSpaceID(), name);
+
+- if ((mDoFormat || forceFormat) && !mPreLevel && !mDoRaw) {
++ if (((mDoFormat || forceFormat) && !mPreLevel) || mDoRaw) {
+ if (mColPos && lineBreakBeforeOpen) {
+ AppendNewLineToString(aStr);
++ mMayIgnoreLineBreakSequence = PR_FALSE;
+ }
+ else {
+ MaybeAddNewlineForRootNode(aStr);
+ }
+- if (!mColPos) {
++ if (!mColPos && !mDoRaw) {
+ AppendIndentation(aStr);
+ }
+ else if (mAddSpace) {
+@@ -513,7 +514,8 @@ nsHTMLContentSerializer::AppendAndTransl
+ PRBool nonBasicEntities =
+ !!(mFlags & (nsIDocumentEncoder::OutputEncodeLatin1Entities |
+ nsIDocumentEncoder::OutputEncodeHTMLEntities |
+- nsIDocumentEncoder::OutputEncodeW3CEntities));
++ nsIDocumentEncoder::OutputEncodeW3CEntities |
++ nsIDocumentEncoder::OutputEncodeCharacterEntities));
+
+ if (!nonBasicEntities &&
+ (mFlags & (nsIDocumentEncoder::OutputEncodeBasicEntities))) {
+@@ -569,7 +571,13 @@ nsHTMLContentSerializer::AppendAndTransl
+ // needs to be replaced
+ for (; c < fragmentEnd; c++, advanceLength++) {
+ PRUnichar val = *c;
+- if (val <= kValNBSP && entityTable[val]) {
++ if ((val == kValNBSP || val > 127) &&
++ (mFlags & nsIDocumentEncoder::OutputEncodeCharacterEntities)) {
++ nsAutoString entityValue(PRUnichar('#'));
++ entityValue.AppendInt(val);
++ entityText = ToNewCString(entityValue);
++ break;
++ } else if (val <= kValNBSP && entityTable[val]) {
+ fullConstEntityText = entityTable[val];
+ break;
+ } else if (val > 127 &&
+diff -up mozilla-2.0/content/base/src/nsXHTMLContentSerializer.cpp.blue mozilla-2.0/content/base/src/nsXHTMLContentSerializer.cpp
+--- mozilla-2.0/content/base/src/nsXHTMLContentSerializer.cpp.blue 2011-04-14 07:28:22.000000000 +0200
++++ mozilla-2.0/content/base/src/nsXHTMLContentSerializer.cpp 2011-06-12 17:13:35.395007284 +0200
+@@ -761,14 +761,23 @@ nsXHTMLContentSerializer::LineBreakBefor
+ return mAddSpace;
+ }
+
+- if (aName == nsGkAtoms::title ||
++ if (// aName == nsGkAtoms::title ||
+ aName == nsGkAtoms::meta ||
+- aName == nsGkAtoms::link ||
+- aName == nsGkAtoms::style ||
++ //aName == nsGkAtoms::link ||
++ //aName == nsGkAtoms::style ||
+ aName == nsGkAtoms::select ||
+ aName == nsGkAtoms::option ||
+ aName == nsGkAtoms::script ||
+- aName == nsGkAtoms::html) {
++ aName == nsGkAtoms::html ||
++ aName == nsGkAtoms::head ||
++ //aName == nsGkAtoms::body ||
++ aName == nsGkAtoms::table ||
++ aName == nsGkAtoms::caption ||
++ aName == nsGkAtoms::tbody ||
++ aName == nsGkAtoms::thead ||
++ aName == nsGkAtoms::tfoot ||
++ aName == nsGkAtoms::tr ||
++ aName == nsGkAtoms::td) {
+ return PR_TRUE;
+ }
+ else {
+@@ -795,7 +804,7 @@ nsXHTMLContentSerializer::LineBreakAfter
+
+ if ((aName == nsGkAtoms::html) ||
+ (aName == nsGkAtoms::head) ||
+- (aName == nsGkAtoms::body) ||
++ //(aName == nsGkAtoms::body) ||
+ (aName == nsGkAtoms::ul) ||
+ (aName == nsGkAtoms::ol) ||
+ (aName == nsGkAtoms::dl) ||
+@@ -832,7 +841,10 @@ nsXHTMLContentSerializer::LineBreakBefor
+ (aName == nsGkAtoms::dl) ||
+ (aName == nsGkAtoms::select) ||
+ (aName == nsGkAtoms::table) ||
+- (aName == nsGkAtoms::tbody)) {
++ (aName == nsGkAtoms::tbody) ||
++ (aName == nsGkAtoms::thead) ||
++ (aName == nsGkAtoms::tfoot) ||
++ (aName == nsGkAtoms::tr)) {
+ return PR_TRUE;
+ }
+ return PR_FALSE;
+@@ -897,6 +909,8 @@ nsXHTMLContentSerializer::MaybeEnterInPr
+ name == nsGkAtoms::noframes
+ ) {
+ mPreLevel++;
++ if (name != nsGkAtoms::pre)
++ ++mDisableEntityEncoding;
+ }
+ }
+
+@@ -915,6 +929,8 @@ nsXHTMLContentSerializer::MaybeLeaveFrom
+ name == nsGkAtoms::noframes
+ ) {
+ --mPreLevel;
++ if (name != nsGkAtoms::pre)
++ --mDisableEntityEncoding;
+ }
+ }
+
+@@ -1034,3 +1050,4 @@ nsXHTMLContentSerializer::HasNoChildren(
+
+ return PR_TRUE;
+ }
++
+diff -up mozilla-2.0/content/base/src/nsXMLContentSerializer.cpp.blue mozilla-2.0/content/base/src/nsXMLContentSerializer.cpp
+--- mozilla-2.0/content/base/src/nsXMLContentSerializer.cpp.blue 2011-04-14 07:28:22.000000000 +0200
++++ mozilla-2.0/content/base/src/nsXMLContentSerializer.cpp 2011-06-12 17:13:35.396007288 +0200
+@@ -61,6 +61,7 @@
+ #include "prprf.h"
+ #include "nsUnicharUtils.h"
+ #include "nsCRT.h"
++#include "nsIParserService.h"
+ #include "nsContentUtils.h"
+ #include "nsAttrName.h"
+ #include "nsILineBreaker.h"
+@@ -649,7 +650,25 @@ nsXMLContentSerializer::SerializeAttr(co
+ PRBool rawAppend = mDoRaw && aDoEscapeEntities;
+ nsAString& attrString = (rawAppend) ? aStr : attrString_;
+
+- attrString.Append(PRUnichar(' '));
++ if (mColPos + 1 >= mMaxColumn) {
++ if (mPreLevel > 0 || mDoRaw) {
++ AppendToStringConvertLF(mLineBreak, aStr);
++ }
++ else if (mDoFormat) {
++ AppendToStringFormatedWrapped(mLineBreak, aStr);
++ AppendIndentation(aStr);
++ }
++ else if (mDoWrap) {
++ AppendToStringWrapped(mLineBreak, aStr);
++ AppendIndentation(aStr);
++ }
++ else {
++ AppendToStringConvertLF(mLineBreak, aStr);
++ }
++ }
++ else
++ attrString.Append(PRUnichar(' '));
++
+ if (!aPrefix.IsEmpty()) {
+ attrString.Append(aPrefix);
+ attrString.Append(PRUnichar(':'));
+@@ -723,6 +742,8 @@ nsXMLContentSerializer::SerializeAttr(co
+ attrString.Append(sValue);
+ attrString.Append(cDelimiter);
+ }
++ AppendToStringConvertLF(attrString, aStr);
++ /* XXX
+ if (mPreLevel > 0 || mDoRaw) {
+ AppendToStringConvertLF(attrString, aStr);
+ }
+@@ -735,6 +756,7 @@ nsXMLContentSerializer::SerializeAttr(co
+ else {
+ AppendToStringConvertLF(attrString, aStr);
+ }
++ */
+ }
+
+ PRUint32
+@@ -939,7 +961,7 @@ nsXMLContentSerializer::AppendElementSta
+ nsIAtom *name = content->Tag();
+ PRBool lineBreakBeforeOpen = LineBreakBeforeOpen(content->GetNameSpaceID(), name);
+
+- if ((mDoFormat || forceFormat) && !mPreLevel && !mDoRaw) {
++ if (((mDoFormat || forceFormat) && !mPreLevel) || mDoRaw) {
+ if (mColPos && lineBreakBeforeOpen) {
+ AppendNewLineToString(aStr);
+ }
+@@ -1186,6 +1208,21 @@ nsXMLContentSerializer::AppendToString(c
+ return;
+ }
+ mColPos += aStr.Length();
++ nsASingleFragmentString::const_char_iterator pos, end, sequenceStart;
++
++ aStr.BeginReading(pos);
++ aStr.EndReading(end);
++ PRBool foundOtherThanCR = PR_FALSE;
++ while (!foundOtherThanCR && pos < end) {
++ if (*pos != '\n' && *pos != '\r') {
++ foundOtherThanCR = PR_TRUE;
++ }
++ pos++;
++ }
++
++ if (!foundOtherThanCR) {
++ mMayIgnoreLineBreakSequence = PR_TRUE;
++ }
+ aOutputStr.Append(aStr);
+ }
+
+@@ -1296,6 +1333,10 @@ nsXMLContentSerializer::MaybeLeaveFromPr
+ void
+ nsXMLContentSerializer::AppendNewLineToString(nsAString& aStr)
+ {
++ if (!mPreLevel && mMayIgnoreLineBreakSequence) {
++ mMayIgnoreLineBreakSequence = PR_FALSE;
++ return;
++ }
+ AppendToString(mLineBreak, aStr);
+ mMayIgnoreLineBreakSequence = PR_TRUE;
+ mColPos = 0;
+@@ -1336,7 +1377,39 @@ nsXMLContentSerializer::DecrIndentation(
+ PRBool
+ nsXMLContentSerializer::LineBreakBeforeOpen(PRInt32 aNamespaceID, nsIAtom* aName)
+ {
+- return mAddSpace;
++ if (aNamespaceID != kNameSpaceID_XHTML) {
++ return mAddSpace;
++ }
++
++ if (aName == nsGkAtoms::title ||
++ aName == nsGkAtoms::meta ||
++ aName == nsGkAtoms::link ||
++ aName == nsGkAtoms::style ||
++ aName == nsGkAtoms::select ||
++ aName == nsGkAtoms::option ||
++ aName == nsGkAtoms::script ||
++ aName == nsGkAtoms::html ||
++ aName == nsGkAtoms::table ||
++ aName == nsGkAtoms::caption ||
++ aName == nsGkAtoms::tbody ||
++ aName == nsGkAtoms::thead ||
++ aName == nsGkAtoms::tfoot ||
++ aName == nsGkAtoms::tr ||
++ aName == nsGkAtoms::td) {
++ return PR_TRUE;
++ }
++ else {
++ nsIParserService* parserService = nsContentUtils::GetParserService();
++
++ if (parserService) {
++ PRBool res;
++ parserService->
++ IsBlock(parserService->HTMLCaseSensitiveAtomTagToId(aName), res);
++ return res;
++ }
++ }
++
++ return mAddSpace;
+ }
+
+ PRBool
+@@ -1348,7 +1421,39 @@ nsXMLContentSerializer::LineBreakAfterOp
+ PRBool
+ nsXMLContentSerializer::LineBreakBeforeClose(PRInt32 aNamespaceID, nsIAtom* aName)
+ {
+- return mAddSpace;
++ if (aNamespaceID != kNameSpaceID_XHTML) {
++ return mAddSpace;
++ }
++
++ if (aName == nsGkAtoms::title ||
++ aName == nsGkAtoms::meta ||
++ aName == nsGkAtoms::link ||
++ aName == nsGkAtoms::style ||
++ aName == nsGkAtoms::select ||
++ aName == nsGkAtoms::option ||
++ aName == nsGkAtoms::script ||
++ aName == nsGkAtoms::html ||
++ aName == nsGkAtoms::table ||
++ aName == nsGkAtoms::caption ||
++ aName == nsGkAtoms::tbody ||
++ aName == nsGkAtoms::thead ||
++ aName == nsGkAtoms::tfoot ||
++ aName == nsGkAtoms::tr ||
++ aName == nsGkAtoms::td) {
++ return PR_TRUE;
++ }
++ else {
++ nsIParserService* parserService = nsContentUtils::GetParserService();
++
++ if (parserService) {
++ PRBool res;
++ parserService->
++ IsBlock(parserService->HTMLCaseSensitiveAtomTagToId(aName), res);
++ return res;
++ }
++ }
++
++ return mAddSpace;
+ }
+
+ PRBool
+@@ -1464,6 +1569,7 @@ nsXMLContentSerializer::AppendFormatedWr
+ // Since we only saw linebreaks, but no spaces or tabs,
+ // let's write a linebreak now.
+ AppendNewLineToString(aOutputStr);
++ mMayIgnoreLineBreakSequence = PR_TRUE;
+ }
+ }
+ }
+diff -up mozilla-2.0/editor/libeditor/html/nsHTMLDataTransfer.cpp.blue mozilla-2.0/editor/libeditor/html/nsHTMLDataTransfer.cpp
+--- mozilla-2.0/editor/libeditor/html/nsHTMLDataTransfer.cpp.blue 2011-04-14 07:28:27.000000000 +0200
++++ mozilla-2.0/editor/libeditor/html/nsHTMLDataTransfer.cpp 2011-06-12 17:13:35.397007292 +0200
+@@ -1380,13 +1380,43 @@ NS_IMETHODIMP nsHTMLEditor::InsertFromTr
+ textDataObj->GetData(text);
+ NS_ASSERTION(text.Length() <= (len/2), "Invalid length!");
+ stuffToPaste.Assign(text.get(), len / 2);
++
++ // Find where the <body> tag starts.
++ nsReadingIterator<PRUnichar> beginbody;
++ nsReadingIterator<PRUnichar> endbody;
++ stuffToPaste.BeginReading(beginbody);
++ stuffToPaste.EndReading(endbody);
++ PRBool foundbody = CaseInsensitiveFindInReadable(NS_LITERAL_STRING("<body"),
++ beginbody, endbody);
++ nsAutoString realStuffToPaste;
++ if (foundbody) {
++ nsReadingIterator<PRUnichar> endstartbody;
++ stuffToPaste.EndReading(endstartbody);
++ PRBool foundstartbody = CaseInsensitiveFindInReadable(NS_LITERAL_STRING(">"),
++ endbody, endstartbody);
++ if (!foundstartbody)
++ return NS_ERROR_FAILURE;
++
++ nsReadingIterator<PRUnichar> beginclosebody;
++ nsReadingIterator<PRUnichar> endclosebody;
++ stuffToPaste.BeginReading(beginclosebody);
++ stuffToPaste.EndReading(endclosebody);
++
++ // Find the index before "</body>"
++ PRBool foundclosehead = CaseInsensitiveFindInReadable(
++ NS_LITERAL_STRING("</body>"), beginclosebody, endclosebody);
++ realStuffToPaste.Assign(Substring(endstartbody, beginclosebody));
++ }
++ else
++ realStuffToPaste.Assign(stuffToPaste);
+ nsAutoEditBatch beginBatching(this);
+- rv = DoInsertHTMLWithContext(stuffToPaste,
++ rv = DoInsertHTMLWithContext(realStuffToPaste,
+ aContextStr, aInfoStr, flavor,
+ aSourceDoc,
+ aDestinationNode, aDestOffset,
+ aDoDeleteSelection,
+- isSafe);
++ //isSafe);
++ true);
+ }
+ }
+ else if (0 == nsCRT::strcmp(bestFlavor, kUnicodeMime) ||
+diff -up mozilla-2.0/editor/libeditor/html/nsHTMLEditRules.cpp.blue mozilla-2.0/editor/libeditor/html/nsHTMLEditRules.cpp
+--- mozilla-2.0/editor/libeditor/html/nsHTMLEditRules.cpp.blue 2011-04-14 07:28:27.000000000 +0200
++++ mozilla-2.0/editor/libeditor/html/nsHTMLEditRules.cpp 2011-06-12 17:13:35.399007300 +0200
+@@ -1450,39 +1450,8 @@ nsHTMLEditRules::WillInsertText(PRInt32
+ // it is to search for both tabs and newlines.
+ if (isPRE || IsPlaintextEditor())
+ {
+- while (unicodeBuf && (pos != -1) && (pos < (PRInt32)(*inString).Length()))
+- {
+- PRInt32 oldPos = pos;
+- PRInt32 subStrLen;
+- pos = tString.FindChar(nsCRT::LF, oldPos);
+-
+- if (pos != -1)
+- {
+- subStrLen = pos - oldPos;
+- // if first char is newline, then use just it
+- if (subStrLen == 0)
+- subStrLen = 1;
+- }
+- else
+- {
+- subStrLen = tString.Length() - oldPos;
+- pos = tString.Length();
+- }
+-
+- nsDependentSubstring subStr(tString, oldPos, subStrLen);
+-
+- // is it a return?
+- if (subStr.Equals(newlineStr))
+- {
+- res = mHTMLEditor->CreateBRImpl(address_of(curNode), &curOffset, address_of(unused), nsIEditor::eNone);
+- pos++;
+- }
+- else
+- {
+- res = mHTMLEditor->InsertTextImpl(subStr, address_of(curNode), &curOffset, doc);
+- }
+- NS_ENSURE_SUCCESS(res, res);
+- }
++ res = mHTMLEditor->InsertTextImpl(tString, address_of(curNode), &curOffset, doc);
++ NS_ENSURE_SUCCESS(res, res);
+ }
+ else
+ {
+diff -up mozilla-2.0/toolkit/mozapps/extensions/content/extensions.js.blue mozilla-2.0/toolkit/mozapps/extensions/content/extensions.js
+--- mozilla-2.0/toolkit/mozapps/extensions/content/extensions.js.blue 2011-04-14 07:28:48.000000000 +0200
++++ mozilla-2.0/toolkit/mozapps/extensions/content/extensions.js 2011-06-12 17:24:19.838174163 +0200
+@@ -55,6 +55,7 @@ const PREF_CHECK_UPDATE_SECURITY = "exte
+ const PREF_AUTOUPDATE_DEFAULT = "extensions.update.autoUpdateDefault";
+ const PREF_GETADDONS_CACHE_ENABLED = "extensions.getAddons.cache.enabled";
+ const PREF_GETADDONS_CACHE_ID_ENABLED = "extensions.%ID%.getAddons.cache.enabled";
++const PREF_CLOSE_ADDONS_MANAGER_ON_ESCAPE = "extensions.closeOnEscape";
+
+ const BRANCH_REGEXP = /^([^\.]+\.[0-9]+[a-z]*).*/gi;
+
+@@ -105,6 +106,18 @@ __defineGetter__("gIsInitializing", func
+
+ function initialize() {
+ document.removeEventListener("load", initialize, true);
++
++ // should we allow the window to close when the user hits the ESC key?
++ let closeOnEscape = false; // default for Firefox 4+
++ try {
++ closeOnEscape = Services.prefs.getBoolPref(PREF_CLOSE_ADDONS_MANAGER_ON_ESCAPE);
++ } catch(e) { }
++ if (!closeOnEscape) {
++ let escapeKeyElt = document.getElementById("escapeKey");
++ if (escapeKeyElt)
++ escapeKeyElt.setAttribute("disabled", "true");
++ }
++
+ gCategories.initialize();
+ gHeader.initialize();
+ gViewController.initialize();
+@@ -2288,7 +2301,7 @@ var gListView = {
+
+ for (let i = 0; i < this._listBox.itemCount; i++) {
+ let item = this._listBox.childNodes[i];
+- if (item[prop] == aObj) {
++ if (prop in item && item[prop] == aObj) {
+ this._listBox.removeChild(item);
+ this.showEmptyNotice(this._listBox.itemCount == 0);
+ return;
+diff -up mozilla-2.0/toolkit/mozapps/extensions/content/extensions.xul.blue mozilla-2.0/toolkit/mozapps/extensions/content/extensions.xul
+--- mozilla-2.0/toolkit/mozapps/extensions/content/extensions.xul.blue 2011-04-14 07:28:48.000000000 +0200
++++ mozilla-2.0/toolkit/mozapps/extensions/content/extensions.xul 2011-06-12 17:13:35.402007310 +0200
+@@ -65,6 +65,10 @@
+ <script type="application/javascript"
+ src="chrome://global/content/contentAreaUtils.js"/>
+
++ <keyset>
++ <key id="escapeKey" keycode="VK_ESCAPE" oncommand="window.close()"/>
++ </keyset>
++
+ <popupset>
+ <!-- menu for an addon item -->
+ <menupopup id="addonitem-popup">
+diff -up mozilla-2.0/widget/src/gtk2/nsWindow.cpp.blue mozilla-2.0/widget/src/gtk2/nsWindow.cpp
+--- mozilla-2.0/widget/src/gtk2/nsWindow.cpp.blue 2011-06-12 17:13:35.314006981 +0200
++++ mozilla-2.0/widget/src/gtk2/nsWindow.cpp 2011-06-12 17:13:35.404007318 +0200
+@@ -3937,6 +3937,8 @@ nsWindow::Create(nsIWidget *aPare
+ gdk_window_add_filter(mShell->window,
+ popup_take_focus_filter, NULL);
+ #endif
++ // XXX BlueGriffon ugly hack to work around bug 662770
++ gtk_window_set_modal(GTK_WINDOW(mShell), TRUE);
+ }
+
+ GdkWindowTypeHint gtkTypeHint;