Commit 7d201023 authored by Ms2ger's avatar Ms2ger
Browse files

Bug 709509 - Remove manual refcounting and QIing from nsBulletFrame::DidSetStyleContext; r=dbaron

parent a120480f
Loading
Loading
Loading
Loading
+5 −34
Original line number Diff line number Diff line
@@ -55,7 +55,6 @@

#include "imgILoader.h"
#include "imgIContainer.h"
#include "nsStubImageDecoderObserver.h"

#include "nsIServiceManager.h"
#include "nsIComponentManager.h"
@@ -69,31 +68,6 @@ using namespace mozilla;

NS_DECLARE_FRAME_PROPERTY(FontSizeInflationProperty, nsnull)

class nsBulletListener : public nsStubImageDecoderObserver
{
public:
  nsBulletListener();
  virtual ~nsBulletListener();

  NS_DECL_ISUPPORTS
  // imgIDecoderObserver (override nsStubImageDecoderObserver)
  NS_IMETHOD OnStartContainer(imgIRequest *aRequest, imgIContainer *aImage);
  NS_IMETHOD OnDataAvailable(imgIRequest *aRequest, bool aCurrentFrame,
                             const nsIntRect *aRect);
  NS_IMETHOD OnStopDecode(imgIRequest *aRequest, nsresult status,
                          const PRUnichar *statusArg);
  NS_IMETHOD OnImageIsAnimated(imgIRequest *aRequest);

  // imgIContainerObserver (override nsStubImageDecoderObserver)
  NS_IMETHOD FrameChanged(imgIContainer *aContainer,
                          const nsIntRect *dirtyRect);

  void SetFrame(nsBulletFrame *frame) { mFrame = frame; }

private:
  nsBulletFrame *mFrame;
};

NS_IMPL_FRAMEARENA_HELPERS(nsBulletFrame)

nsBulletFrame::~nsBulletFrame()
@@ -113,8 +87,9 @@ nsBulletFrame::DestroyFrom(nsIFrame* aDestructRoot)
    mImageRequest = nsnull;
  }

  if (mListener)
    reinterpret_cast<nsBulletListener*>(mListener.get())->SetFrame(nsnull);
  if (mListener) {
    mListener->SetFrame(nsnull);
  }

  // Let base class do the rest
  nsFrame::DestroyFrom(aDestructRoot);
@@ -156,12 +131,8 @@ nsBulletFrame::DidSetStyleContext(nsStyleContext* aOldStyleContext)
  if (newRequest) {

    if (!mListener) {
      nsBulletListener *listener = new nsBulletListener();
      NS_ADDREF(listener);
      listener->SetFrame(this);
      listener->QueryInterface(NS_GET_IID(imgIDecoderObserver), getter_AddRefs(mListener));
      NS_ASSERTION(mListener, "queryinterface for the listener failed");
      NS_RELEASE(listener);
      mListener = new nsBulletListener();
      mListener->SetFrame(this);
    }

    bool needNewRequest = true;
+29 −1
Original line number Diff line number Diff line
@@ -45,10 +45,38 @@

#include "imgIRequest.h"
#include "imgIDecoderObserver.h"
#include "nsStubImageDecoderObserver.h"

#define BULLET_FRAME_IMAGE_LOADING NS_FRAME_STATE_BIT(63)
#define BULLET_FRAME_HAS_FONT_INFLATION NS_FRAME_STATE_BIT(62)

class nsBulletFrame;

class nsBulletListener : public nsStubImageDecoderObserver
{
public:
  nsBulletListener();
  virtual ~nsBulletListener();

  NS_DECL_ISUPPORTS
  // imgIDecoderObserver (override nsStubImageDecoderObserver)
  NS_IMETHOD OnStartContainer(imgIRequest *aRequest, imgIContainer *aImage);
  NS_IMETHOD OnDataAvailable(imgIRequest *aRequest, bool aCurrentFrame,
                             const nsIntRect *aRect);
  NS_IMETHOD OnStopDecode(imgIRequest *aRequest, nsresult status,
                          const PRUnichar *statusArg);
  NS_IMETHOD OnImageIsAnimated(imgIRequest *aRequest);

  // imgIContainerObserver (override nsStubImageDecoderObserver)
  NS_IMETHOD FrameChanged(imgIContainer *aContainer,
                          const nsIntRect *dirtyRect);

  void SetFrame(nsBulletFrame *frame) { mFrame = frame; }

private:
  nsBulletFrame *mFrame;
};

/**
 * A simple class that manages the layout and rendering of html bullets.
 * This class also supports the CSS list-style properties.
@@ -129,7 +157,7 @@ protected:

  nsMargin mPadding;
  nsCOMPtr<imgIRequest> mImageRequest;
  nsCOMPtr<imgIDecoderObserver> mListener;
  nsRefPtr<nsBulletListener> mListener;

  nsSize mIntrinsicSize;
  nsSize mComputedSize;