From 9cd4814779bd28d6e68bfffab05147f405f5beb1 Mon Sep 17 00:00:00 2001 From: Ginn Chen Date: Tue, 31 Jan 2012 14:32:10 +0800 Subject: [PATCH 01/14] Bug 717861 GetVsize and GetResident underestimate memory size on Solaris r=justin.lebar --- xpcom/base/nsMemoryReporterManager.cpp | 41 ++++++++++++++++++-------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/xpcom/base/nsMemoryReporterManager.cpp b/xpcom/base/nsMemoryReporterManager.cpp index 06b93f893e5..26a09604ac3 100644 --- a/xpcom/base/nsMemoryReporterManager.cpp +++ b/xpcom/base/nsMemoryReporterManager.cpp @@ -145,21 +145,38 @@ static PRInt64 GetResident() static void XMappingIter(PRInt64& Vsize, PRInt64& Resident) { + Vsize = -1; + Resident = -1; int mapfd = open("/proc/self/xmap", O_RDONLY); struct stat st; - prxmap_t *prmapp; + prxmap_t *prmapp = NULL; if (mapfd >= 0) { if (!fstat(mapfd, &st)) { int nmap = st.st_size / sizeof(prxmap_t); - prmapp = (prxmap_t*)malloc((nmap + 1) * sizeof(prxmap_t)); - int n = read(mapfd, prmapp, (nmap + 1) * sizeof(prxmap_t)); - if (n > 0) { - Vsize = 0; - Resident = 0; - for (int i = 0; i < n / sizeof(prxmap_t); i++) { - Vsize += prmapp[i].pr_size; - Resident += prmapp[i].pr_rss * prmapp[i].pr_pagesize; + while (1) { + // stat(2) on /proc//xmap returns an incorrect value, + // prior to the release of Solaris 11. + // Here is a workaround for it. + nmap *= 2; + prmapp = (prxmap_t*)malloc((nmap + 1) * sizeof(prxmap_t)); + if (!prmapp) { + // out of memory + break; } + int n = pread(mapfd, prmapp, (nmap + 1) * sizeof(prxmap_t), 0); + if (n < 0) { + break; + } + if (nmap >= n / sizeof (prxmap_t)) { + Vsize = 0; + Resident = 0; + for (int i = 0; i < n / sizeof (prxmap_t); i++) { + Vsize += prmapp[i].pr_size; + Resident += prmapp[i].pr_rss * prmapp[i].pr_pagesize; + } + break; + } + free(prmapp); } free(prmapp); } @@ -169,16 +186,14 @@ static void XMappingIter(PRInt64& Vsize, PRInt64& Resident) static PRInt64 GetVsize() { - PRInt64 Vsize = -1; - PRInt64 Resident = -1; + PRInt64 Vsize, Resident; XMappingIter(Vsize, Resident); return Vsize; } static PRInt64 GetResident() { - PRInt64 Vsize = -1; - PRInt64 Resident = -1; + PRInt64 Vsize, Resident; XMappingIter(Vsize, Resident); return Resident; } From 3afb7380226e13d949cb7f9b9b9207573b917ac0 Mon Sep 17 00:00:00 2001 From: Alexander Surkov Date: Tue, 31 Jan 2012 15:40:06 +0900 Subject: [PATCH 02/14] Bug 707654 - embeds relation on root accessible can return not content document, r=davidb --- accessible/src/base/nsRootAccessible.cpp | 78 +++------ accessible/src/base/nsRootAccessible.h | 3 +- .../tests/mochitest/relations/Makefile.in | 1 + .../tests/mochitest/relations/test_embeds.xul | 152 ++++++++++++++++++ .../mochitest/relations/test_general.html | 13 -- .../mochitest/relations/test_general.xul | 13 -- 6 files changed, 172 insertions(+), 88 deletions(-) create mode 100644 accessible/tests/mochitest/relations/test_embeds.xul diff --git a/accessible/src/base/nsRootAccessible.cpp b/accessible/src/base/nsRootAccessible.cpp index a0511f38a1d..355effda1b5 100644 --- a/accessible/src/base/nsRootAccessible.cpp +++ b/accessible/src/base/nsRootAccessible.cpp @@ -574,59 +574,6 @@ nsRootAccessible::Shutdown() nsDocAccessibleWrap::Shutdown(); } -// nsRootAccessible protected member -already_AddRefed -nsRootAccessible::GetContentDocShell(nsIDocShellTreeItem *aStart) -{ - if (!aStart) { - return nsnull; - } - - PRInt32 itemType; - aStart->GetItemType(&itemType); - if (itemType == nsIDocShellTreeItem::typeContent) { - nsDocAccessible *accDoc = nsAccUtils::GetDocAccessibleFor(aStart); - - // Hidden documents don't have accessibles (like SeaMonkey's sidebar), - // they are of no interest for a11y. - if (!accDoc) - return nsnull; - - // If ancestor chain of accessibles is not completely visible, - // don't use this one. This happens for example if it's inside - // a background tab (tabbed browsing) - nsAccessible* parent = accDoc->Parent(); - while (parent) { - if (parent->State() & states::INVISIBLE) - return nsnull; - - if (parent == this) - break; // Don't check past original root accessible we started with - - parent = parent->Parent(); - } - - NS_ADDREF(aStart); - return aStart; - } - nsCOMPtr treeNode(do_QueryInterface(aStart)); - if (treeNode) { - PRInt32 subDocuments; - treeNode->GetChildCount(&subDocuments); - for (PRInt32 count = 0; count < subDocuments; count ++) { - nsCOMPtr treeItemChild, contentTreeItem; - treeNode->GetChildAt(count, getter_AddRefs(treeItemChild)); - NS_ENSURE_TRUE(treeItemChild, nsnull); - contentTreeItem = GetContentDocShell(treeItemChild); - if (contentTreeItem) { - NS_ADDREF(aStart = contentTreeItem); - return aStart; - } - } - } - return nsnull; -} - // nsIAccessible method Relation nsRootAccessible::RelationByType(PRUint32 aType) @@ -634,14 +581,25 @@ nsRootAccessible::RelationByType(PRUint32 aType) if (!mDocument || aType != nsIAccessibleRelation::RELATION_EMBEDS) return nsDocAccessibleWrap::RelationByType(aType); - nsCOMPtr treeItem = - nsCoreUtils::GetDocShellTreeItemFor(mDocument); - nsCOMPtr contentTreeItem = GetContentDocShell(treeItem); - // there may be no content area, so we need a null check - if (!contentTreeItem) - return Relation(); + nsIDOMWindow* rootWindow = mDocument->GetWindow(); + if (rootWindow) { + nsCOMPtr contentWindow; + rootWindow->GetContent(getter_AddRefs(contentWindow)); + if (contentWindow) { + nsCOMPtr contentDOMDocument; + contentWindow->GetDocument(getter_AddRefs(contentDOMDocument)); + nsCOMPtr contentDocumentNode = + do_QueryInterface(contentDOMDocument); + if (contentDocumentNode) { + nsDocAccessible* contentDocument = + GetAccService()->GetDocAccessible(contentDocumentNode); + if (contentDocument) + return Relation(contentDocument); + } + } + } - return Relation(nsAccUtils::GetDocAccessibleFor(contentTreeItem)); + return Relation(); } //////////////////////////////////////////////////////////////////////////////// diff --git a/accessible/src/base/nsRootAccessible.h b/accessible/src/base/nsRootAccessible.h index 6feb79a9100..b7f02ffddbc 100644 --- a/accessible/src/base/nsRootAccessible.h +++ b/accessible/src/base/nsRootAccessible.h @@ -127,8 +127,7 @@ protected: PRUint32 GetChromeFlags(); #endif - already_AddRefed - GetContentDocShell(nsIDocShellTreeItem *aStart); + nsRefPtr mCaretAccessible; }; diff --git a/accessible/tests/mochitest/relations/Makefile.in b/accessible/tests/mochitest/relations/Makefile.in index 5a7654412d3..5fc8bf6d878 100644 --- a/accessible/tests/mochitest/relations/Makefile.in +++ b/accessible/tests/mochitest/relations/Makefile.in @@ -48,6 +48,7 @@ include $(topsrcdir)/config/rules.mk # test_tabbrowser.xul disabled for misusing (bug 715857) _TEST_FILES =\ + test_embeds.xul \ test_general.html \ test_general.xul \ test_tree.xul \ diff --git a/accessible/tests/mochitest/relations/test_embeds.xul b/accessible/tests/mochitest/relations/test_embeds.xul new file mode 100644 index 00000000000..5d0ddcfa999 --- /dev/null +++ b/accessible/tests/mochitest/relations/test_embeds.xul @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + Mozilla Bug 707654 + +

+ +
+    
+ +
+
diff --git a/accessible/tests/mochitest/relations/test_general.html b/accessible/tests/mochitest/relations/test_general.html index 71bf6f8600d..d487f349ade 100644 --- a/accessible/tests/mochitest/relations/test_general.html +++ b/accessible/tests/mochitest/relations/test_general.html @@ -126,19 +126,6 @@ testRelation("legend", RELATION_LABEL_FOR, "fieldset"); testRelation("fieldset", RELATION_LABELLED_BY, "legend"); - // 'embeds' relation for root accessible - var docAcc = null; - var parentOfDocAcc = null; - var parentDocAcc = getAccessible(document); - do { - docAcc = parentDocAcc; - parentOfDocAcc = getAccessible(docAcc.parent, [nsIAccessNode]); - parentDocAcc = getAccessible(parentOfDocAcc.document, - [nsIAccessible]); - } while (getRole(parentDocAcc) != ROLE_CHROME_WINDOW) - - testRelation(parentDocAcc, RELATION_EMBEDS, docAcc); - // finish test SimpleTest.finish(); } diff --git a/accessible/tests/mochitest/relations/test_general.xul b/accessible/tests/mochitest/relations/test_general.xul index ca288d1bf6c..23bf7276b28 100644 --- a/accessible/tests/mochitest/relations/test_general.xul +++ b/accessible/tests/mochitest/relations/test_general.xul @@ -103,19 +103,6 @@ // 'default button' relation testRelation("textbox", RELATION_DEFAULT_BUTTON, "submit"); - // 'embeds' relation for root accessible - var docAcc = null; - var parentOfDocAcc = null; - var parentDocAcc = getAccessible(document); - do { - docAcc = parentDocAcc; - parentOfDocAcc = getAccessible(docAcc.parent, [nsIAccessNode]); - parentDocAcc = getAccessible(parentOfDocAcc.document, - [nsIAccessible]); - } while (getRole(parentDocAcc) != ROLE_CHROME_WINDOW) - - testRelation(parentDocAcc, RELATION_EMBEDS, docAcc); - // 'labelled by'/'label for' relation for xul:goupbox and xul:label of // xul:caption var groupboxAcc = getAccessible("groupbox"); From 5587bf1ca007727b64ee9a6bf9766de870a4e784 Mon Sep 17 00:00:00 2001 From: Ginn Chen Date: Tue, 31 Jan 2012 14:51:13 +0800 Subject: [PATCH 03/14] Bug 702179 Reland 1d0ec7fa8b96 since Bug 719742 is fixed. --- config/rules.mk | 7 ++++++- configure.in | 2 +- js/src/Makefile.in | 1 - js/src/config/rules.mk | 7 ++++++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/config/rules.mk b/config/rules.mk index f06a7ba789b..f6df5cf9419 100644 --- a/config/rules.mk +++ b/config/rules.mk @@ -238,7 +238,12 @@ ifdef CPP_UNIT_TESTS CPPSRCS += $(CPP_UNIT_TESTS) SIMPLE_PROGRAMS += $(CPP_UNIT_TESTS:.cpp=$(BIN_SUFFIX)) INCLUDES += -I$(DIST)/include/testing -LIBS += $(XPCOM_GLUE_LDOPTS) $(NSPR_LIBS) $(MOZ_JS_LIBS) +LIBS += $(XPCOM_GLUE_LDOPTS) $(NSPR_LIBS) +ifdef JS_SHARED_LIBRARY +ifdef MOZ_SHARK +LIBS += $(MOZ_JS_LIBS) +endif +endif # ...and run them the usual way check:: diff --git a/configure.in b/configure.in index 29864c5845a..2b43d021b7c 100644 --- a/configure.in +++ b/configure.in @@ -1301,7 +1301,7 @@ MOZ_BZ2_LIBS='$(call EXPAND_LIBNAME_PATH,bz2,$(DEPTH)/modules/libbz2/src)' MOZ_PNG_CFLAGS= MOZ_PNG_LIBS='$(call EXPAND_LIBNAME_PATH,mozpng,$(DEPTH)/media/libpng)' -MOZ_JS_STATIC_LIBS='$(call EXPAND_LIBNAME_PATH,js_static,$(LIBXUL_DIST)/lib)' +MOZ_JS_STATIC_LIBS='$(call EXPAND_LIBNAME_PATH,js_static,$(DEPTH)/js/src)' MOZ_JS_SHARED_LIBS='$(call EXPAND_LIBNAME_PATH,mozjs,$(LIBXUL_DIST)/lib)' DYNAMIC_XPCOM_LIBS='-L$(LIBXUL_DIST)/bin -lxpcom -lxpcom_core -lmozalloc' MOZ_FIX_LINK_PATHS='-Wl,-rpath-link,$(LIBXUL_DIST)/bin -Wl,-rpath-link,$(prefix)/lib' diff --git a/js/src/Makefile.in b/js/src/Makefile.in index 342695e2509..733fb28a075 100644 --- a/js/src/Makefile.in +++ b/js/src/Makefile.in @@ -93,7 +93,6 @@ ifdef JS_SHARED_LIBRARY FORCE_SHARED_LIB = 1 endif FORCE_STATIC_LIB = 1 -DIST_INSTALL = 1 VPATH = \ $(srcdir) \ diff --git a/js/src/config/rules.mk b/js/src/config/rules.mk index f06a7ba789b..f6df5cf9419 100644 --- a/js/src/config/rules.mk +++ b/js/src/config/rules.mk @@ -238,7 +238,12 @@ ifdef CPP_UNIT_TESTS CPPSRCS += $(CPP_UNIT_TESTS) SIMPLE_PROGRAMS += $(CPP_UNIT_TESTS:.cpp=$(BIN_SUFFIX)) INCLUDES += -I$(DIST)/include/testing -LIBS += $(XPCOM_GLUE_LDOPTS) $(NSPR_LIBS) $(MOZ_JS_LIBS) +LIBS += $(XPCOM_GLUE_LDOPTS) $(NSPR_LIBS) +ifdef JS_SHARED_LIBRARY +ifdef MOZ_SHARK +LIBS += $(MOZ_JS_LIBS) +endif +endif # ...and run them the usual way check:: From 3aff87cabcd5f4b5b5e409b44bdf585c6186ee94 Mon Sep 17 00:00:00 2001 From: Makoto Kato Date: Tue, 31 Jan 2012 18:00:25 +0900 Subject: [PATCH 04/14] Backout bug Bug 702179 due to bustage on MacOSX deubg and Win32 debug --- config/rules.mk | 7 +------ configure.in | 2 +- js/src/Makefile.in | 1 + js/src/config/rules.mk | 7 +------ 4 files changed, 4 insertions(+), 13 deletions(-) diff --git a/config/rules.mk b/config/rules.mk index f6df5cf9419..f06a7ba789b 100644 --- a/config/rules.mk +++ b/config/rules.mk @@ -238,12 +238,7 @@ ifdef CPP_UNIT_TESTS CPPSRCS += $(CPP_UNIT_TESTS) SIMPLE_PROGRAMS += $(CPP_UNIT_TESTS:.cpp=$(BIN_SUFFIX)) INCLUDES += -I$(DIST)/include/testing -LIBS += $(XPCOM_GLUE_LDOPTS) $(NSPR_LIBS) -ifdef JS_SHARED_LIBRARY -ifdef MOZ_SHARK -LIBS += $(MOZ_JS_LIBS) -endif -endif +LIBS += $(XPCOM_GLUE_LDOPTS) $(NSPR_LIBS) $(MOZ_JS_LIBS) # ...and run them the usual way check:: diff --git a/configure.in b/configure.in index 2b43d021b7c..29864c5845a 100644 --- a/configure.in +++ b/configure.in @@ -1301,7 +1301,7 @@ MOZ_BZ2_LIBS='$(call EXPAND_LIBNAME_PATH,bz2,$(DEPTH)/modules/libbz2/src)' MOZ_PNG_CFLAGS= MOZ_PNG_LIBS='$(call EXPAND_LIBNAME_PATH,mozpng,$(DEPTH)/media/libpng)' -MOZ_JS_STATIC_LIBS='$(call EXPAND_LIBNAME_PATH,js_static,$(DEPTH)/js/src)' +MOZ_JS_STATIC_LIBS='$(call EXPAND_LIBNAME_PATH,js_static,$(LIBXUL_DIST)/lib)' MOZ_JS_SHARED_LIBS='$(call EXPAND_LIBNAME_PATH,mozjs,$(LIBXUL_DIST)/lib)' DYNAMIC_XPCOM_LIBS='-L$(LIBXUL_DIST)/bin -lxpcom -lxpcom_core -lmozalloc' MOZ_FIX_LINK_PATHS='-Wl,-rpath-link,$(LIBXUL_DIST)/bin -Wl,-rpath-link,$(prefix)/lib' diff --git a/js/src/Makefile.in b/js/src/Makefile.in index 733fb28a075..342695e2509 100644 --- a/js/src/Makefile.in +++ b/js/src/Makefile.in @@ -93,6 +93,7 @@ ifdef JS_SHARED_LIBRARY FORCE_SHARED_LIB = 1 endif FORCE_STATIC_LIB = 1 +DIST_INSTALL = 1 VPATH = \ $(srcdir) \ diff --git a/js/src/config/rules.mk b/js/src/config/rules.mk index f6df5cf9419..f06a7ba789b 100644 --- a/js/src/config/rules.mk +++ b/js/src/config/rules.mk @@ -238,12 +238,7 @@ ifdef CPP_UNIT_TESTS CPPSRCS += $(CPP_UNIT_TESTS) SIMPLE_PROGRAMS += $(CPP_UNIT_TESTS:.cpp=$(BIN_SUFFIX)) INCLUDES += -I$(DIST)/include/testing -LIBS += $(XPCOM_GLUE_LDOPTS) $(NSPR_LIBS) -ifdef JS_SHARED_LIBRARY -ifdef MOZ_SHARK -LIBS += $(MOZ_JS_LIBS) -endif -endif +LIBS += $(XPCOM_GLUE_LDOPTS) $(NSPR_LIBS) $(MOZ_JS_LIBS) # ...and run them the usual way check:: From d533d56abf1e428629647551ceadea008ef3aa4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20=C3=81vila=20de=20Esp=C3=ADndola?= Date: Tue, 31 Jan 2012 10:25:26 +0100 Subject: [PATCH 05/14] Bug 683975 - Need infra for developer contributed compilers. r=rail. make sure the libc.so script doesn't refer to build dir. --- .../build-toolchain/glibc-deterministic.patch | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/build/unix/build-toolchain/glibc-deterministic.patch b/build/unix/build-toolchain/glibc-deterministic.patch index 01f5295e914..016fbf1ea72 100644 --- a/build/unix/build-toolchain/glibc-deterministic.patch +++ b/build/unix/build-toolchain/glibc-deterministic.patch @@ -22,6 +22,22 @@ diff -ru a/csu/Makefile b/csu/Makefile *) ;; \ esac; \ files="$(all-Banner-files)"; \ +diff -ru a/Makerules b/Makerules +--- a/Makerules 2011-01-17 23:34:07.000000000 -0500 ++++ b/Makerules 2012-01-30 08:47:56.565068903 -0500 +@@ -992,9 +992,9 @@ + echo ' Use the shared library, but some functions are only in';\ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ +- echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\ +- ' AS_NEEDED (' $(slibdir)/$(rtld-installed-name) ') )' \ ++ echo 'GROUP ( libc.so$(libc.so-version)' \ ++ '$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\ ++ ' AS_NEEDED (' $(rtld-installed-name) ') )' \ + ) > $@.new + mv -f $@.new $@ + diff -ru a/nscd/nscd_stat.c b/nscd/nscd_stat.c --- a/nscd/nscd_stat.c 2011-01-17 23:34:07.000000000 -0500 +++ b/nscd/nscd_stat.c 2012-01-23 15:54:45.231607606 -0500 From 5778722ed729a10f4eca772aea8e6a5016590b04 Mon Sep 17 00:00:00 2001 From: Chris Lord Date: Tue, 31 Jan 2012 09:36:00 +0000 Subject: [PATCH 06/14] Bug 720613 - Prevent resizing before the surface has been created. r=pcwalton Prevent trying to resize the buffer before the surface has been created. At that point, we wouldn't know our maximum texture size, so we would've thrown a RuntimeException. --- mobile/android/base/gfx/FloatSize.java | 4 ++++ mobile/android/base/gfx/GeckoSoftwareLayerClient.java | 10 ++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/mobile/android/base/gfx/FloatSize.java b/mobile/android/base/gfx/FloatSize.java index 1824b27edda..07dfc9fe845 100644 --- a/mobile/android/base/gfx/FloatSize.java +++ b/mobile/android/base/gfx/FloatSize.java @@ -61,6 +61,10 @@ public class FloatSize { @Override public String toString() { return "(" + width + "," + height + ")"; } + public boolean isPositive() { + return (width > 0 && height > 0); + } + public boolean fuzzyEquals(FloatSize size) { return (FloatUtils.fuzzyEquals(size.width, width) && FloatUtils.fuzzyEquals(size.height, height)); diff --git a/mobile/android/base/gfx/GeckoSoftwareLayerClient.java b/mobile/android/base/gfx/GeckoSoftwareLayerClient.java index f5e0ee52b52..cec9e83988d 100644 --- a/mobile/android/base/gfx/GeckoSoftwareLayerClient.java +++ b/mobile/android/base/gfx/GeckoSoftwareLayerClient.java @@ -429,8 +429,14 @@ public class GeckoSoftwareLayerClient extends LayerClient implements GeckoEventL DisplayMetrics metrics = new DisplayMetrics(); GeckoApp.mAppContext.getWindowManager().getDefaultDisplay().getMetrics(metrics); - if (!force && metrics.widthPixels == mScreenSize.width && - metrics.heightPixels == mScreenSize.height) { + // Return immediately if the screen size hasn't changed or the viewport + // size is zero (which indicates that the rendering surface hasn't been + // allocated yet). + boolean screenSizeChanged = (metrics.widthPixels != mScreenSize.width || + metrics.heightPixels != mScreenSize.height); + boolean viewportSizeValid = (getLayerController() != null && + getLayerController().getViewportSize().isPositive()); + if (!(force || (screenSizeChanged && viewportSizeValid))) { return; } From dc914a8d4d94eaa4c6c0b7d08065716b4c2dc5c8 Mon Sep 17 00:00:00 2001 From: Chris Lord Date: Tue, 31 Jan 2012 09:36:02 +0000 Subject: [PATCH 07/14] Bug 722068 - Fix invalidation during animations in MultiTileLayer. r=pcwalton The buffer in MultiTileLayer is invalidated each time the origin or resolution changes. MultiTileLayer was using the last updated origin/resolution instead of the last set, so if Gecko was animating and locked the layer for long enough, the buffer would be incorrectly invalidated due to the origin/resolution not being updated. --- mobile/android/base/gfx/MultiTileLayer.java | 33 +++++++++++---------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/mobile/android/base/gfx/MultiTileLayer.java b/mobile/android/base/gfx/MultiTileLayer.java index 10fb5f112a7..5d156f9cfad 100644 --- a/mobile/android/base/gfx/MultiTileLayer.java +++ b/mobile/android/base/gfx/MultiTileLayer.java @@ -71,6 +71,11 @@ public class MultiTileLayer extends Layer { private final LinkedList mTiles; private final HashMap mPositionHash; + // Copies of the last set origin/resolution, to decide when to invalidate + // the buffer + private Point mOrigin; + private float mResolution; + public MultiTileLayer(CairoImage image, IntSize tileSize) { super(); @@ -102,7 +107,7 @@ public class MultiTileLayer extends Layer { * Invalidates the backing buffer. Data will not be uploaded from an invalid * backing buffer. This method is only valid inside a transaction. */ - public void invalidateBuffer() { + protected void invalidateBuffer() { if (!inTransaction()) { throw new RuntimeException("invalidateBuffer() is only valid inside a transaction"); } @@ -181,17 +186,16 @@ public class MultiTileLayer extends Layer { // entire width, regardless of the dirty-rect's width, and so // can override existing data. Point origin = getOffsetOrigin(); - Rect validRect = tile.getValidTextureArea(); - validRect.offset(tileOrigin.x - origin.x, tileOrigin.y - origin.y); - Region validRegion = new Region(validRect); + Region validRegion = new Region(tile.getValidTextureArea()); + validRegion.translate(tileOrigin.x - origin.x, tileOrigin.y - origin.y); validRegion.op(mValidRegion, Region.Op.INTERSECT); // SingleTileLayer can't draw complex regions, so in that case, // just invalidate the entire area. tile.invalidateTexture(); - if (!validRegion.isComplex()) { - validRect.set(validRegion.getBounds()); - validRect.offset(origin.x - tileOrigin.x, origin.y - tileOrigin.y); + if (!validRegion.isEmpty() && !validRegion.isComplex()) { + validRegion.translate(origin.x - tileOrigin.x, origin.y - tileOrigin.y); + tile.getValidTextureArea().set(validRegion.getBounds()); } } else { // Update tile metrics @@ -286,7 +290,6 @@ public class MultiTileLayer extends Layer { // valid by monitoring reflows on the browser element, or // something along these lines. LinkedList invalidTiles = new LinkedList(); - Rect bounds = mValidRegion.getBounds(); for (ListIterator i = mTiles.listIterator(); i.hasNext();) { SubTile tile = i.next(); @@ -301,7 +304,7 @@ public class MultiTileLayer extends Layer { // First bracketed clause: Invalidate off-screen, off-buffer tiles // Second: Invalidate visible tiles at the wrong resolution that have updates - if ((!Rect.intersects(bounds, tilespaceTileBounds) && + if ((!opRegion.op(tilespaceTileBounds, mValidRegion, Region.Op.INTERSECT) && !Rect.intersects(tilespaceViewport, tilespaceTileBounds)) || (!FloatUtils.fuzzyEquals(tile.getResolution(), getResolution()) && opRegion.op(tilespaceTileBounds, updateRegion, Region.Op.INTERSECT))) { @@ -415,9 +418,8 @@ public class MultiTileLayer extends Layer { @Override public void setOrigin(Point origin) { - Point oldOrigin = getOrigin(); - - if (!origin.equals(oldOrigin)) { + if (mOrigin == null || !origin.equals(mOrigin)) { + mOrigin = origin; super.setOrigin(origin); invalidateBuffer(); } @@ -425,9 +427,8 @@ public class MultiTileLayer extends Layer { @Override public void setResolution(float resolution) { - float oldResolution = getResolution(); - - if (!FloatUtils.fuzzyEquals(resolution, oldResolution)) { + if (!FloatUtils.fuzzyEquals(resolution, mResolution)) { + mResolution = resolution; super.setResolution(resolution); invalidateBuffer(); } @@ -441,7 +442,7 @@ public class MultiTileLayer extends Layer { * Invalidates all sub-tiles. This should be called if the source backing * this layer has changed. This method is only valid inside a transaction. */ - public void invalidateTiles() { + protected void invalidateTiles() { if (!inTransaction()) { throw new RuntimeException("invalidateTiles() is only valid inside a transaction"); } From da112175f77360bdc6b50b7191f19a31c4b6ccf8 Mon Sep 17 00:00:00 2001 From: Simon Montagu Date: Mon, 30 Jan 2012 10:59:34 -0800 Subject: [PATCH 08/14] test for bug 722137, r=roc --- layout/base/crashtests/722137.html | 18 ++++++++++++++++++ layout/base/crashtests/crashtests.list | 1 + 2 files changed, 19 insertions(+) create mode 100644 layout/base/crashtests/722137.html diff --git a/layout/base/crashtests/722137.html b/layout/base/crashtests/722137.html new file mode 100644 index 00000000000..7dae47f1de7 --- /dev/null +++ b/layout/base/crashtests/722137.html @@ -0,0 +1,18 @@ + + + + + + + +‪𐡱 + diff --git a/layout/base/crashtests/crashtests.list b/layout/base/crashtests/crashtests.list index 47436de3527..5e4c0403799 100644 --- a/layout/base/crashtests/crashtests.list +++ b/layout/base/crashtests/crashtests.list @@ -347,3 +347,4 @@ load 691118-1.html load 695861.html load 698335.html load 707098.html +load 722137.html From e472ce3733d59bb0cfde5f0efca62d29a741ffe7 Mon Sep 17 00:00:00 2001 From: Simon Montagu Date: Mon, 30 Jan 2012 11:05:28 -0800 Subject: [PATCH 09/14] Remove unnecessary test for next sibling. Bug 722137, r=roc --- layout/base/nsBidiPresUtils.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/layout/base/nsBidiPresUtils.cpp b/layout/base/nsBidiPresUtils.cpp index baa343d5466..1b2339895e4 100644 --- a/layout/base/nsBidiPresUtils.cpp +++ b/layout/base/nsBidiPresUtils.cpp @@ -819,12 +819,10 @@ nsBidiPresUtils::ResolveParagraph(nsBlockFrame* aBlockFrame, RemoveBidiContinuation(aBpd, frame, frameIndex, newIndex, lineOffset); } - } else if (runLength == fragmentLength && - frame->GetNextSibling()) { + } else if (runLength == fragmentLength) { /* - * If the directional run ends at the end of the frame, and this is - * not the containing frame's last child, make sure that the next - * frame is a non-fluid continuation + * If the directional run ends at the end of the frame, make sure + * that any continuation is non-fluid */ nsIFrame* next = frame->GetNextInFlow(); if (next) { From ee5df3a0155dbaca1321001d30c511db22ebce95 Mon Sep 17 00:00:00 2001 From: Makoto Kato Date: Tue, 31 Jan 2012 19:30:20 +0900 Subject: [PATCH 10/14] Bug 719319 - unnecessary to use additional OS_LIBS for firefox.exe. r=khuey --- browser/app/Makefile.in | 5 ----- ipc/app/Makefile.in | 5 ----- 2 files changed, 10 deletions(-) diff --git a/browser/app/Makefile.in b/browser/app/Makefile.in index 7e4aeec1ef1..d16f45622ca 100644 --- a/browser/app/Makefile.in +++ b/browser/app/Makefile.in @@ -107,11 +107,6 @@ ifdef _MSC_VER WIN32_EXE_LDFLAGS += -ENTRY:wmainCRTStartup endif -ifeq ($(OS_ARCH),WINNT) -OS_LIBS += $(call EXPAND_LIBNAME,comctl32 comdlg32 uuid shell32 ole32 oleaut32 version winspool) -OS_LIBS += $(call EXPAND_LIBNAME,usp10 msimg32) -endif - ifeq ($(OS_ARCH),WINNT) RCINCLUDE = splash.rc ifndef GNU_CC diff --git a/ipc/app/Makefile.in b/ipc/app/Makefile.in index 85fd62f4997..e5bf9fac733 100644 --- a/ipc/app/Makefile.in +++ b/ipc/app/Makefile.in @@ -96,11 +96,6 @@ ifdef _MSC_VER WIN32_EXE_LDFLAGS += -ENTRY:wmainCRTStartup endif -ifeq ($(OS_ARCH),WINNT) -OS_LIBS += $(call EXPAND_LIBNAME,comctl32 comdlg32 uuid shell32 ole32 oleaut32 version winspool) -OS_LIBS += $(call EXPAND_LIBNAME,usp10 msimg32) -endif - include $(topsrcdir)/config/rules.mk ifeq ($(OS_ARCH),WINNT) From 3ad3f72a4c942216da12be3906ac906fd69cb7aa Mon Sep 17 00:00:00 2001 From: Markus Stange Date: Tue, 31 Jan 2012 11:40:03 +0100 Subject: [PATCH 11/14] Bug 715867 - Don't fire duplicate sizemodechange events on Mac. r=smichaud --HG-- rename : widget/tests/window_bug596600.xul => widget/tests/empty_window.xul --- widget/cocoa/nsCocoaWindow.mm | 18 +-- widget/tests/Makefile.in | 3 +- ...{window_bug596600.xul => empty_window.xul} | 2 +- widget/tests/test_bug596600.xul | 4 +- widget/tests/test_sizemode_events.xul | 107 ++++++++++++++++++ 5 files changed, 122 insertions(+), 12 deletions(-) rename widget/tests/{window_bug596600.xul => empty_window.xul} (74%) create mode 100644 widget/tests/test_sizemode_events.xul diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm index 76c015a74fe..3bb7004eb51 100644 --- a/widget/cocoa/nsCocoaWindow.mm +++ b/widget/cocoa/nsCocoaWindow.mm @@ -1062,17 +1062,14 @@ NS_METHOD nsCocoaWindow::PlaceBehind(nsTopLevelWidgetZPlacement aPlacement, return NS_OK; } -// Note bug 278777, we need to update state when the window is unminimized -// from the dock by users. NS_METHOD nsCocoaWindow::SetSizeMode(PRInt32 aMode) { NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT; - PRInt32 previousMode; - nsBaseWidget::GetSizeMode(&previousMode); - - nsresult rv = nsBaseWidget::SetSizeMode(aMode); - NS_ENSURE_SUCCESS(rv, rv); + // mSizeMode will be updated in DispatchSizeModeEvent, which will be called + // from a delegate method that handles the state change during one of the + // calls below. + nsSizeMode previousMode = mSizeMode; if (aMode == nsSizeMode_Normal) { if ([mWindow isMiniaturized]) @@ -1419,8 +1416,13 @@ nsCocoaWindow::ReportMoveEvent() void nsCocoaWindow::DispatchSizeModeEvent() { + nsSizeMode newMode = GetWindowSizeMode(mWindow); + if (mSizeMode == newMode) + return; + + mSizeMode = newMode; nsSizeModeEvent event(true, NS_SIZEMODE, this); - event.mSizeMode = GetWindowSizeMode(mWindow); + event.mSizeMode = mSizeMode; event.time = PR_IntervalNow(); nsEventStatus status = nsEventStatus_eIgnore; diff --git a/widget/tests/Makefile.in b/widget/tests/Makefile.in index d6f0a437244..4e2d6cd2594 100644 --- a/widget/tests/Makefile.in +++ b/widget/tests/Makefile.in @@ -87,6 +87,8 @@ _CHROME_FILES = test_bug343416.xul \ window_composition_text_querycontent.xul \ test_input_events_on_deactive_window.xul \ test_position_on_resize.xul \ + empty_window.xul \ + test_sizemode_events.xul \ $(NULL) # test_bug413277.html mac-only based on 604789, 605178 @@ -109,7 +111,6 @@ _CHROME_FILES += native_menus_window.xul \ bug586713_window.xul \ test_key_event_counts.xul \ test_bug596600.xul \ - window_bug596600.xul \ test_bug673301.xul \ $(NULL) endif diff --git a/widget/tests/window_bug596600.xul b/widget/tests/empty_window.xul similarity index 74% rename from widget/tests/window_bug596600.xul rename to widget/tests/empty_window.xul index 28e96f68e00..f0e01761d2f 100644 --- a/widget/tests/window_bug596600.xul +++ b/widget/tests/empty_window.xul @@ -1,4 +1,4 @@ - diff --git a/widget/tests/test_bug596600.xul b/widget/tests/test_bug596600.xul index 82c378d287d..9db8b15efa2 100644 --- a/widget/tests/test_bug596600.xul +++ b/widget/tests/test_bug596600.xul @@ -36,9 +36,9 @@ function moveMouseTo(x, y, andThen) { } function openWindows() { - gLeftWindow = open('window_bug596600.xul', '_blank', 'chrome,screenX=50,screenY=50,width=200,height=200'); + gLeftWindow = open('empty_window.xul', '_blank', 'chrome,screenX=50,screenY=50,width=200,height=200'); SimpleTest.waitForFocus(function () { - gRightWindow = open('window_bug596600.xul', '', 'chrome,screenX=300,screenY=50,width=200,height=200'); + gRightWindow = open('empty_window.xul', '', 'chrome,screenX=300,screenY=50,width=200,height=200'); SimpleTest.waitForFocus(attachIFrameToRightWindow, gRightWindow); }, gLeftWindow); } diff --git a/widget/tests/test_sizemode_events.xul b/widget/tests/test_sizemode_events.xul new file mode 100644 index 00000000000..578d6f6fc62 --- /dev/null +++ b/widget/tests/test_sizemode_events.xul @@ -0,0 +1,107 @@ + + + + + + Test for bug 715867 + + + From 684130254aa0eb091ad8d0fa2ef101b7753b9e52 Mon Sep 17 00:00:00 2001 From: Makoto Kato Date: Tue, 31 Jan 2012 20:37:03 +0900 Subject: [PATCH 12/14] Bug 716233 - Use Roboto as default on ICS. r=jdaggett --- modules/libpref/src/init/all.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index 8462f3822b9..066d3a7b7fa 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -2733,7 +2733,9 @@ pref("font.name.monospace.he", "Droid Sans Mono"); pref("font.name.serif.ja", "Droid Serif"); pref("font.name.sans-serif.ja", "Droid Sans Japanese"); -pref("font.name.monospace.ja", "Droid Sans Mono"); +pref("font.name.monospace.ja", "MotoyaLMaru"); +pref("font.name-list.sans-serif.ja", "MotoyaLMaru, MotoyaLCedar, Droid Sans Japanese"); +pref("font.name-list.monospace.ja", "MotoyaLMaru, MotoyaLCedar"); pref("font.name.serif.ko", "Droid Serif"); pref("font.name.sans-serif.ko", "Droid Sans"); @@ -2750,38 +2752,44 @@ pref("font.name.monospace.tr", "Droid Sans Mono"); pref("font.name.serif.x-baltic", "Droid Serif"); pref("font.name.sans-serif.x-baltic", "Droid Sans"); pref("font.name.monospace.x-baltic", "Droid Sans Mono"); +pref("font.name-list.sans-serif.x-baltic", "Roboto, Droid Sans"); pref("font.name.serif.x-central-euro", "Droid Serif"); pref("font.name.sans-serif.x-central-euro", "Droid Sans"); pref("font.name.monospace.x-central-euro", "Droid Sans Mono"); +pref("font.name-list.sans-serif.x-central-euro", "Roboto, Droid Sans"); pref("font.name.serif.x-cyrillic", "Droid Serif"); pref("font.name.sans-serif.x-cyrillic", "Droid Sans"); pref("font.name.monospace.x-cyrillic", "Droid Sans Mono"); +pref("font.name-list.sans-serif.x-cyrillic", "Roboto, Droid Sans"); pref("font.name.serif.x-unicode", "Droid Serif"); pref("font.name.sans-serif.x-unicode", "Droid Sans"); pref("font.name.monospace.x-unicode", "Droid Sans Mono"); +pref("font.name-list.sans-serif.x-unicode", "Roboto, Droid Sans"); pref("font.name.serif.x-user-def", "Droid Serif"); pref("font.name.sans-serif.x-user-def", "Droid Sans"); pref("font.name.monospace.x-user-def", "Droid Sans Mono"); +pref("font.name-list.sans-serif.x-user-def", "Roboto, Droid Sans"); pref("font.name.serif.x-western", "Droid Serif"); pref("font.name.sans-serif.x-western", "Droid Sans"); pref("font.name.monospace.x-western", "Droid Sans Mono"); +pref("font.name-list.sans-serif.x-western", "Roboto, Droid Sans"); pref("font.name.serif.zh-CN", "Droid Serif"); pref("font.name.sans-serif.zh-CN", "Droid Sans"); pref("font.name.monospace.zh-CN", "Droid Sans Mono"); -// ming_uni.ttf (HKSCS-2001) -// http://www.info.gov.hk/digital21/eng/hkscs/download/uime.exe pref("font.name.serif.zh-HK", "Droid Serif"); pref("font.name.sans-serif.zh-HK", "Droid Sans"); pref("font.name.monospace.zh-HK", "Droid Sans Mono"); -// zh-TW +pref("font.name.serif.zh-TW", "Droid Serif"); +pref("font.name.sans-serif.zh-TW", "Droid Sans"); +pref("font.name.monospace.zh-TW", "Droid Sans Mono"); pref("font.default.ar", "sans-serif"); pref("font.size.variable.ar", 16); From 4c2f28402677bdaec46252d8d70521fde79d4662 Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Tue, 31 Jan 2012 04:23:42 -0800 Subject: [PATCH 13/14] Bug 710176, Part 1: Do not do TLS intolerance timeout during cert validation, r=honzab --- security/manager/ssl/src/nsNSSIOLayer.cpp | 35 +++++++++++++++++++++-- security/manager/ssl/src/nsNSSIOLayer.h | 2 ++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/security/manager/ssl/src/nsNSSIOLayer.cpp b/security/manager/ssl/src/nsNSSIOLayer.cpp index 15149230d58..5eb665f6173 100644 --- a/security/manager/ssl/src/nsNSSIOLayer.cpp +++ b/security/manager/ssl/src/nsNSSIOLayer.cpp @@ -154,6 +154,8 @@ nsNSSSocketInfo::nsNSSSocketInfo() : mMutex("nsNSSSocketInfo::nsNSSSocketInfo"), mFd(nsnull), mCertVerificationState(before_cert_verification), + mCertVerificationStarted(0), + mCertVerificationEnded(0), mSecurityState(nsIWebProgressListener::STATE_IS_INSECURE), mSubRequestsHighSecurity(0), mSubRequestsLowSecurity(0), @@ -960,6 +962,7 @@ nsNSSSocketInfo::SetCertVerificationWaiting() NS_ASSERTION(mCertVerificationState != waiting_for_cert_verification, "Invalid state transition to waiting_for_cert_verification"); mCertVerificationState = waiting_for_cert_verification; + mCertVerificationStarted = PR_IntervalNow(); } void @@ -969,6 +972,8 @@ nsNSSSocketInfo::SetCertVerificationResult(PRErrorCode errorCode, NS_ASSERTION(mCertVerificationState == waiting_for_cert_verification, "Invalid state transition to cert_verification_finished"); + mCertVerificationEnded = PR_IntervalNow(); + if (errorCode != 0) { SetCanceled(errorCode, errorMessageType); } else if (mFd) { @@ -1025,11 +1030,36 @@ void nsNSSSocketInfo::SetAllowTLSIntoleranceTimeout(bool aAllow) bool nsNSSSocketInfo::HandshakeTimeout() { + if (mCertVerificationState == waiting_for_cert_verification) { + // Do not do a TLS interlerance timeout during cert verification because: + // + // * If we would have timed out, but cert verification is still ongoing, + // then the handshake probably already completed, and it is probably the + // certificate validation (OCSP responder or similar) that is timing + // out. + // * If certificate validation AND the handshake is slow, then that is a + // good indication that the network is bad, and so the problem probably + // isn't the server being TLS intolerant. + // * When we timeout, we return non-zero flags from PR_Poll, which will + // cause the application to try to read from and/or write to the socket, + // possibly in a loop. But, it is likely that the socket is blocked on + // cert authentication, so those read and/or write calls would result in + // PR_WOULD_BLOCK_ERROR, causing the application to spin. + return false; + } + if (!mHandshakeInProgress || !mAllowTLSIntoleranceTimeout) return false; - return ((PRIntervalTime)(PR_IntervalNow() - mHandshakeStartTime) - > PR_SecondsToInterval(HANDSHAKE_TIMEOUT_SECONDS)); + PRIntervalTime now = PR_IntervalNow(); + PRIntervalTime certVerificationTime = + mCertVerificationEnded - mCertVerificationStarted; + PRIntervalTime totalTime = now - mHandshakeStartTime; + PRIntervalTime totalTimeExceptCertVerificationTime = + totalTime - certVerificationTime; + + return totalTimeExceptCertVerificationTime > + PR_SecondsToInterval(HANDSHAKE_TIMEOUT_SECONDS); } void nsSSLIOLayerHelpers::Cleanup() @@ -2082,6 +2112,7 @@ nsSSLIOLayerPoll(PRFileDesc * fd, PRInt16 in_flags, PRInt16 *out_flags) : "[%p] poll SSL socket using lower %d\n", fd, (int) in_flags)); + // See comments in HandshakeTimeout before moving and/or changing this block if (socketInfo->HandshakeTimeout()) { NS_ASSERTION(in_flags & PR_POLL_EXCEPT, "caller did not poll for EXCEPT (handshake timeout)"); diff --git a/security/manager/ssl/src/nsNSSIOLayer.h b/security/manager/ssl/src/nsNSSIOLayer.h index 2ee94c08b55..2e20f324816 100644 --- a/security/manager/ssl/src/nsNSSIOLayer.h +++ b/security/manager/ssl/src/nsNSSIOLayer.h @@ -184,6 +184,8 @@ protected: nsCOMPtr mCallbacks; PRFileDesc* mFd; CertVerificationState mCertVerificationState; + PRIntervalTime mCertVerificationStarted; + PRIntervalTime mCertVerificationEnded; PRUint32 mSecurityState; PRInt32 mSubRequestsHighSecurity; PRInt32 mSubRequestsLowSecurity; From 3aef60355fb55758cfbe5a9503324b14a71048e2 Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Tue, 31 Jan 2012 04:24:16 -0800 Subject: [PATCH 14/14] Bug 710176, Part 2: Import ssl_Poll fix from bug 542832, r=kaie --- security/nss/lib/ssl/sslsock.c | 16 +++++++- security/patches/README | 3 +- .../bug-710176-ssl-restart-7-poll-v5.patch | 40 +++++++++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 security/patches/bug-710176-ssl-restart-7-poll-v5.patch diff --git a/security/nss/lib/ssl/sslsock.c b/security/nss/lib/ssl/sslsock.c index f9e456584f6..6d0d305886b 100644 --- a/security/nss/lib/ssl/sslsock.c +++ b/security/nss/lib/ssl/sslsock.c @@ -1955,7 +1955,21 @@ ssl_Poll(PRFileDesc *fd, PRInt16 how_flags, PRInt16 *p_out_flags) } else if ((ss->lastWriteBlocked) && (how_flags & PR_POLL_READ) && (ss->pendingBuf.len != 0)) { /* write data waiting to be sent */ new_flags |= PR_POLL_WRITE; /* also select on write. */ - } + } + + if (ss->version >= SSL_LIBRARY_VERSION_3_0 && + ss->ssl3.hs.restartTarget != NULL) { + /* Read and write will block until the asynchronous callback completes + * (e.g. until SSL_AuthCertificateComplete is called), so don't tell + * the caller to poll the socket unless there is pending write data. + */ + if (ss->lastWriteBlocked && ss->pendingBuf.len != 0) { + new_flags &= (PR_POLL_WRITE | PR_POLL_EXCEPT); + } else { + new_flags = 0; + } + } + if (new_flags && (fd->lower->methods->poll != NULL)) { PRInt16 lower_out_flags = 0; PRInt16 lower_new_flags; diff --git a/security/patches/README b/security/patches/README index 8f1272e1972..9500a39f09e 100644 --- a/security/patches/README +++ b/security/patches/README @@ -4,5 +4,6 @@ on top of the NSS release. bug-542832-ssl-restart-4.patch and bug-542832-ssl-restart-tstclnt-4.patch were added so that we could test the new PSM SSL threading code (bug 674147) and SPDY (bug 528288). bug-717906-lowhash was added to fix an issue with recent -Mozilla builds on fedora. These patches will be removed when the NSS 3.13.2 +Mozilla builds on fedora. bug-710176-ssl-restart-7-poll-v5.patch were added +to fix a bug 710176. These patches will be removed when the NSS 3.13.2 release that includes them is imported into mozilla-central. diff --git a/security/patches/bug-710176-ssl-restart-7-poll-v5.patch b/security/patches/bug-710176-ssl-restart-7-poll-v5.patch new file mode 100644 index 00000000000..7d5f3f69e5e --- /dev/null +++ b/security/patches/bug-710176-ssl-restart-7-poll-v5.patch @@ -0,0 +1,40 @@ +# HG changeset patch +# Parent 4560e2c22b83f85f9238b9094de7a190042676df +# User Brian Smith + +diff --git a/security/nss/lib/ssl/sslsock.c b/security/nss/lib/ssl/sslsock.c +--- a/security/nss/lib/ssl/sslsock.c ++++ b/security/nss/lib/ssl/sslsock.c +@@ -1950,17 +1950,31 @@ ssl_Poll(PRFileDesc *fd, PRInt16 how_fla + } + } + } else if ((new_flags & PR_POLL_READ) && (SSL_DataPending(fd) > 0)) { + *p_out_flags = PR_POLL_READ; /* it's ready already. */ + return new_flags; + } else if ((ss->lastWriteBlocked) && (how_flags & PR_POLL_READ) && + (ss->pendingBuf.len != 0)) { /* write data waiting to be sent */ + new_flags |= PR_POLL_WRITE; /* also select on write. */ +- } ++ } ++ ++ if (ss->version >= SSL_LIBRARY_VERSION_3_0 && ++ ss->ssl3.hs.restartTarget != NULL) { ++ /* Read and write will block until the asynchronous callback completes ++ * (e.g. until SSL_AuthCertificateComplete is called), so don't tell ++ * the caller to poll the socket unless there is pending write data. ++ */ ++ if (ss->lastWriteBlocked && ss->pendingBuf.len != 0) { ++ new_flags &= (PR_POLL_WRITE | PR_POLL_EXCEPT); ++ } else { ++ new_flags = 0; ++ } ++ } ++ + if (new_flags && (fd->lower->methods->poll != NULL)) { + PRInt16 lower_out_flags = 0; + PRInt16 lower_new_flags; + lower_new_flags = fd->lower->methods->poll(fd->lower, new_flags, + &lower_out_flags); + if ((lower_new_flags & lower_out_flags) && (how_flags != new_flags)) { + PRInt16 out_flags = lower_out_flags & ~PR_POLL_RW; + if (lower_out_flags & PR_POLL_READ)