Verified Commit 069254af authored by longsonr's avatar longsonr Committed by ma1
Browse files

Bug 2049407 Part 1 - Detach observers on canvas destruction a=RyanVM

parent 7eba4187
Loading
Loading
Loading
Loading
+21 −21
Original line number Original line Diff line number Diff line
@@ -887,14 +887,12 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(CanvasRenderingContext2D)
  NS_IMPL_CYCLE_COLLECTION_UNLINK(mCanvasElement)
  NS_IMPL_CYCLE_COLLECTION_UNLINK(mCanvasElement)
  NS_IMPL_CYCLE_COLLECTION_UNLINK(mOffscreenCanvas)
  NS_IMPL_CYCLE_COLLECTION_UNLINK(mOffscreenCanvas)
  NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocShell)
  NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocShell)
  for (uint32_t i = 0; i < tmp->mStyleStack.Length(); i++) {
  for (ContextState& state : tmp->mStyleStack) {
    ImplCycleCollectionUnlink(tmp->mStyleStack[i].patternStyles[Style::STROKE]);
    ImplCycleCollectionUnlink(state.patternStyles[Style::STROKE]);
    ImplCycleCollectionUnlink(tmp->mStyleStack[i].patternStyles[Style::FILL]);
    ImplCycleCollectionUnlink(state.patternStyles[Style::FILL]);
    ImplCycleCollectionUnlink(
    ImplCycleCollectionUnlink(state.gradientStyles[Style::STROKE]);
        tmp->mStyleStack[i].gradientStyles[Style::STROKE]);
    ImplCycleCollectionUnlink(state.gradientStyles[Style::FILL]);
    ImplCycleCollectionUnlink(tmp->mStyleStack[i].gradientStyles[Style::FILL]);
    if (auto* autoSVGFiltersObserver = state.autoSVGFiltersObserver.get()) {
    if (auto* autoSVGFiltersObserver =
            tmp->mStyleStack[i].autoSVGFiltersObserver.get()) {
      /*
      /*
       * XXXjwatt: I don't think this is doing anything useful.  All we do under
       * XXXjwatt: I don't think this is doing anything useful.  All we do under
       * this function is clear a raw C-style (i.e. not strong) pointer.  That's
       * this function is clear a raw C-style (i.e. not strong) pointer.  That's
@@ -905,7 +903,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(CanvasRenderingContext2D)
       */
       */
      autoSVGFiltersObserver->Detach();
      autoSVGFiltersObserver->Detach();
    }
    }
    ImplCycleCollectionUnlink(tmp->mStyleStack[i].autoSVGFiltersObserver);
    ImplCycleCollectionUnlink(state.autoSVGFiltersObserver);
  }
  }
  NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
  NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
  NS_IMPL_CYCLE_COLLECTION_UNLINK_WEAK_PTR
  NS_IMPL_CYCLE_COLLECTION_UNLINK_WEAK_PTR
@@ -915,20 +913,16 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(CanvasRenderingContext2D)
  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCanvasElement)
  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCanvasElement)
  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOffscreenCanvas)
  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOffscreenCanvas)
  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocShell)
  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocShell)
  for (uint32_t i = 0; i < tmp->mStyleStack.Length(); i++) {
  for (ContextState& state : tmp->mStyleStack) {
    ImplCycleCollectionTraverse(
    ImplCycleCollectionTraverse(cb, state.patternStyles[Style::STROKE],
        cb, tmp->mStyleStack[i].patternStyles[Style::STROKE],
                                "Stroke CanvasPattern");
                                "Stroke CanvasPattern");
    ImplCycleCollectionTraverse(cb,
    ImplCycleCollectionTraverse(cb, state.patternStyles[Style::FILL],
                                tmp->mStyleStack[i].patternStyles[Style::FILL],
                                "Fill CanvasPattern");
                                "Fill CanvasPattern");
    ImplCycleCollectionTraverse(
    ImplCycleCollectionTraverse(cb, state.gradientStyles[Style::STROKE],
        cb, tmp->mStyleStack[i].gradientStyles[Style::STROKE],
                                "Stroke CanvasGradient");
                                "Stroke CanvasGradient");
    ImplCycleCollectionTraverse(cb,
    ImplCycleCollectionTraverse(cb, state.gradientStyles[Style::FILL],
                                tmp->mStyleStack[i].gradientStyles[Style::FILL],
                                "Fill CanvasGradient");
                                "Fill CanvasGradient");
    ImplCycleCollectionTraverse(cb, tmp->mStyleStack[i].autoSVGFiltersObserver,
    ImplCycleCollectionTraverse(cb, state.autoSVGFiltersObserver,
                                "RAII SVG Filters Observer");
                                "RAII SVG Filters Observer");
  }
  }
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
@@ -1102,6 +1096,12 @@ CanvasRenderingContext2D::~CanvasRenderingContext2D() {
  RemoveShutdownObserver();
  RemoveShutdownObserver();
  ResetBitmap();
  ResetBitmap();


  for (ContextState& state : mStyleStack) {
    if (auto* obs = state.autoSVGFiltersObserver.get()) {
      obs->Detach();
    }
  }

  sNumLivingContexts.set(sNumLivingContexts.get() - 1);
  sNumLivingContexts.set(sNumLivingContexts.get() - 1);
  if (sNumLivingContexts.get() == 0 && sErrorTarget.get()) {
  if (sNumLivingContexts.get() == 0 && sErrorTarget.get()) {
    RefPtr<DrawTarget> target = dont_AddRef(sErrorTarget.get());
    RefPtr<DrawTarget> target = dont_AddRef(sErrorTarget.get());