Commit 7300ff6d authored by sfraser%netscape.com's avatar sfraser%netscape.com
Browse files

Fix timer refcount issues in docshell, fixes bugs 39641, 39617. r=pavlov a=leaf

parent 4c7240ff
Loading
Loading
Loading
Loading
+21 −10
Original line number Diff line number Diff line
@@ -2004,10 +2004,16 @@ NS_IMETHODIMP nsDocShell::RefreshURI(nsIURI *aURI, PRInt32 aDelay, PRBool aRepea
   refreshTimer->mDelay = aDelay;
   refreshTimer->mRepeat = aRepeat;

   if (!mRefreshURIList)
   {
      NS_ENSURE_SUCCESS(NS_NewISupportsArray(getter_AddRefs(mRefreshURIList)),
         NS_ERROR_FAILURE);
   }
   
   nsCOMPtr<nsITimer> timer = do_CreateInstance("component://netscape/timer");
   NS_ENSURE_TRUE(timer, NS_ERROR_FAILURE);
    
   mRefreshURIList.AppendElement(timer);
   mRefreshURIList->AppendElement(timer);    // owning timer ref
   timer->Init(refreshTimer, aDelay);

   return NS_OK;
@@ -2015,13 +2021,18 @@ NS_IMETHODIMP nsDocShell::RefreshURI(nsIURI *aURI, PRInt32 aDelay, PRBool aRepea

NS_IMETHODIMP nsDocShell::CancelRefreshURITimers()
{
   PRInt32 n = mRefreshURIList.Count();
   nsCOMPtr<nsITimer> timer;
   if (!mRefreshURIList) return NS_OK;

   PRUint32 n;
   mRefreshURIList->Count(&n);

   while (n)
   {
      timer = dont_AddRef((nsITimer*)mRefreshURIList.ElementAt(0));
      mRefreshURIList.RemoveElementAt(0);
      nsCOMPtr<nsISupports> element;
      mRefreshURIList->GetElementAt(0, getter_AddRefs(element));
      nsCOMPtr<nsITimer> timer(do_QueryInterface(element));

      mRefreshURIList->RemoveElementAt(0);    // bye bye owning timer ref

      if (timer)
         timer->Cancel();
+1 −1
Original line number Diff line number Diff line
@@ -252,7 +252,7 @@ protected:
   nsString                   mName;
   nsString                   mTitle;
   nsVoidArray                mChildren;
   nsVoidArray                mRefreshURIList;
   nsCOMPtr<nsISupportsArray> mRefreshURIList;
   nsDSURIContentListener*    mContentListener;
   nsDSWebProgressListener*   mWebProgressListener;
   nsDocShellInitInfo*        mInitInfo;