Backout 99a2125bd365 (bug 779971) for reftest failures
authorEd Morley <emorley@mozilla.com>
Wed, 07 Nov 2012 12:31:00 +0000
changeset 112519 0fb51f488b03bbf1d5d6bc5e534523880189e4e6
parent 112518 871a4aa1f78b4f4d9af85261d0f94e8c6d9bcbdd
child 112520 8f02df2ec9980f99107ab5378592c1e31510b7d9
push id17629
push useremorley@mozilla.com
push dateWed, 07 Nov 2012 12:32:15 +0000
treeherdermozilla-inbound@0fb51f488b03 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs779971
milestone19.0a1
backs out99a2125bd365815790d3c546051cbeaf623e11d7
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backout 99a2125bd365 (bug 779971) for reftest failures
layout/base/nsCSSFrameConstructor.cpp
layout/base/nsChangeHint.h
layout/svg/crashtests/779971-1.svg
layout/svg/crashtests/crashtests.list
layout/svg/nsSVGEffects.cpp
--- a/layout/base/nsCSSFrameConstructor.cpp
+++ b/layout/base/nsCSSFrameConstructor.cpp
@@ -111,17 +111,16 @@
 #include "nsXBLService.h"
 
 #undef NOISY_FIRST_LETTER
 
 #include "nsMathMLParts.h"
 #include "nsIDOMSVGFilters.h"
 #include "DOMSVGTests.h"
 #include "nsSVGEffects.h"
-#include "nsSVGTextPathFrame.h"
 #include "nsSVGUtils.h"
 
 #include "nsRefreshDriver.h"
 #include "nsRuleProcessorData.h"
 #include "sampler.h"
 
 using namespace mozilla;
 using namespace mozilla::dom;
@@ -7783,22 +7782,16 @@ DoApplyRenderingChangeToTree(nsIFrame* a
     // if frame has view, will already be invalidated
     if (aChange & nsChangeHint_RepaintFrame) {
       if (aFrame->IsFrameOfType(nsIFrame::eSVG) &&
           !(aFrame->GetStateBits() & NS_STATE_IS_OUTER_SVG)) {
         if (aChange & nsChangeHint_UpdateEffects) {
           needInvalidatingPaint = true;
           // Invalidate and update our area:
           nsSVGUtils::InvalidateAndScheduleReflowSVG(aFrame);
-        } else if (aChange & nsChangeHint_UpdateTextPath) {
-          NS_ABORT_IF_FALSE(aFrame->GetType() == nsGkAtoms::svgTextPathFrame,
-                            "textPath frame expected");
-          needInvalidatingPaint = true;
-          // Invalidate and update our area:
-          static_cast<nsSVGTextPathFrame*>(aFrame)->NotifyGlyphMetricsChange();
         } else {
           needInvalidatingPaint = true;
           // Just invalidate our area:
           nsSVGUtils::InvalidateBounds(aFrame);
         }
       } else {
         needInvalidatingPaint = true;
         aFrame->InvalidateFrameSubtree();
--- a/layout/base/nsChangeHint.h
+++ b/layout/base/nsChangeHint.h
@@ -106,23 +106,17 @@ enum nsChangeHint {
   nsChangeHint_AddOrRemoveTransform = 0x4000,
 
   /**
    * This change hint has *no* change handling behavior.  However, it
    * exists to be a non-inherited hint, because when the border-style
    * changes, and it's inherited by a child, that might require a reflow
    * due to the border-width change on the child.
    */
-  nsChangeHint_BorderStyleNoneChange = 0x8000,
-
-  /**
-   * SVG textPath needs to be recomputed because the path has changed.
-   * This means that the glyph positions of the text need to be recomputed.
-   */
-  nsChangeHint_UpdateTextPath = 0x10000
+  nsChangeHint_BorderStyleNoneChange = 0x8000
 
   // IMPORTANT NOTE: When adding new hints, consider whether you need to
   // add them to NS_HintsNotHandledForDescendantsIn() below.
 };
 
 // Redefine these operators to return nothing. This will catch any use
 // of these operators on hints. We should not be using these operators
 // on nsChangeHints
deleted file mode 100644
--- a/layout/svg/crashtests/779971-1.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="r" class="reftest-wait">
-<text id="t"><textPath xlink:href="#r">x</textPath>1</text>
-<script>
-
-window.addEventListener("load", function() {
-    setTimeout(function() {
-        document.getElementById("t").lastChild.data = "2";
-
-        document.documentElement.removeAttribute("class");
-    }, 200);
-}, false);
-
-</script>
-</svg>
--- a/layout/svg/crashtests/crashtests.list
+++ b/layout/svg/crashtests/crashtests.list
@@ -131,13 +131,12 @@ load 732836-1.svg
 load 740627-1.svg
 load 740627-2.svg
 load 757704-1.svg
 load 757718-1.svg
 load 767056-1.svg
 load 768351.svg
 load 780963-1.html
 load 757751-1.svg
-load 779971-1.svg
 load 782141-1.svg
 load 784061-1.svg
 load 790072.svg
 load 791826-1.svg
--- a/layout/svg/nsSVGEffects.cpp
+++ b/layout/svg/nsSVGEffects.cpp
@@ -281,31 +281,59 @@ nsSVGMarkerProperty::DoUpdate()
     // XXXjwatt: We need to unify SVG into standard reflow so we can just use
     // nsChangeHint_NeedReflow | nsChangeHint_NeedDirtyReflow here.
     nsSVGUtils::InvalidateAndScheduleReflowSVG(mFrame);
   }
   mFramePresShell->FrameConstructor()->PostRestyleEvent(
     mFrame->GetContent()->AsElement(), nsRestyleHint(0), changeHint);
 }
 
+class nsAsyncNotifyGlyphMetricsChange MOZ_FINAL : public nsIReflowCallback
+{
+public:
+    nsAsyncNotifyGlyphMetricsChange(nsIFrame* aFrame) : mWeakFrame(aFrame)
+    {
+    }
+
+    virtual bool ReflowFinished()
+    {
+        nsSVGTextPathFrame* frame =
+            static_cast<nsSVGTextPathFrame*>(mWeakFrame.GetFrame());
+        if (frame) {
+            frame->NotifyGlyphMetricsChange();
+        }
+        delete this;
+        return true;
+    }
+
+    virtual void ReflowCallbackCanceled()
+    {
+        delete this;
+    }
+
+    nsWeakFrame mWeakFrame;
+};
+
 void
 nsSVGTextPathProperty::DoUpdate()
 {
   nsSVGIDRenderingObserver::DoUpdate();
   if (!mFrame)
     return;
 
   NS_ASSERTION(mFrame->IsFrameOfType(nsIFrame::eSVG), "SVG frame expected");
 
   if (mFrame->GetType() == nsGkAtoms::svgTextPathFrame) {
-    // Repaint asynchronously in case the path frame is being torn down
-    nsChangeHint changeHint =
-      nsChangeHint(nsChangeHint_RepaintFrame | nsChangeHint_UpdateTextPath);
-    mFramePresShell->FrameConstructor()->PostRestyleEvent(
-      mFrame->GetContent()->AsElement(), nsRestyleHint(0), changeHint);
+    if (mFrame->PresContext()->PresShell()->IsReflowLocked()) {
+      nsIReflowCallback* cb = new nsAsyncNotifyGlyphMetricsChange(mFrame);
+      mFrame->PresContext()->PresShell()->PostReflowCallback(cb);
+    } else {
+      nsSVGTextPathFrame* textPathFrame = static_cast<nsSVGTextPathFrame*>(mFrame);
+      textPathFrame->NotifyGlyphMetricsChange();
+    }
   }
 }
 
 void
 nsSVGPaintingProperty::DoUpdate()
 {
   nsSVGIDRenderingObserver::DoUpdate();
   if (!mFrame)