netwerk/base/src/nsRequestObserverProxy.cpp

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #include "mozilla/DebugOnly.h"
     8 #include "nscore.h"
     9 #include "nsRequestObserverProxy.h"
    10 #include "nsIRequest.h"
    11 #include "nsAutoPtr.h"
    12 #include "prlog.h"
    14 using namespace mozilla;
    16 #if defined(PR_LOGGING)
    17 static PRLogModuleInfo *gRequestObserverProxyLog;
    18 #endif
    20 #undef LOG
    21 #define LOG(args) PR_LOG(gRequestObserverProxyLog, PR_LOG_DEBUG, args)
    23 //-----------------------------------------------------------------------------
    24 // nsARequestObserverEvent internal class...
    25 //-----------------------------------------------------------------------------
    27 nsARequestObserverEvent::nsARequestObserverEvent(nsIRequest *request)
    28     : mRequest(request)
    29 {
    30     NS_PRECONDITION(mRequest, "null pointer");
    31 }
    33 //-----------------------------------------------------------------------------
    34 // nsOnStartRequestEvent internal class...
    35 //-----------------------------------------------------------------------------
    37 class nsOnStartRequestEvent : public nsARequestObserverEvent
    38 {
    39     nsRefPtr<nsRequestObserverProxy> mProxy;
    40 public:
    41     nsOnStartRequestEvent(nsRequestObserverProxy *proxy,
    42                           nsIRequest *request)
    43         : nsARequestObserverEvent(request)
    44         , mProxy(proxy)
    45     {
    46         NS_PRECONDITION(mProxy, "null pointer");
    47     }
    49     virtual ~nsOnStartRequestEvent() {}
    51     NS_IMETHOD Run()
    52     {
    53         LOG(("nsOnStartRequestEvent::HandleEvent [req=%x]\n", mRequest.get()));
    55         if (!mProxy->mObserver) {
    56             NS_NOTREACHED("already handled onStopRequest event (observer is null)");
    57             return NS_OK;
    58         }
    60         LOG(("handle startevent=%p\n", this));
    61         nsresult rv = mProxy->mObserver->OnStartRequest(mRequest, mProxy->mContext);
    62         if (NS_FAILED(rv)) {
    63             LOG(("OnStartRequest failed [rv=%x] canceling request!\n", rv));
    64             rv = mRequest->Cancel(rv);
    65             NS_ASSERTION(NS_SUCCEEDED(rv), "Cancel failed for request!");
    66         }
    68         return NS_OK;
    69     }
    70 };
    72 //-----------------------------------------------------------------------------
    73 // nsOnStopRequestEvent internal class...
    74 //-----------------------------------------------------------------------------
    76 class nsOnStopRequestEvent : public nsARequestObserverEvent
    77 {
    78     nsRefPtr<nsRequestObserverProxy> mProxy;
    79 public:
    80     nsOnStopRequestEvent(nsRequestObserverProxy *proxy,
    81                          nsIRequest *request)
    82         : nsARequestObserverEvent(request)
    83         , mProxy(proxy)
    84     {
    85         NS_PRECONDITION(mProxy, "null pointer");
    86     }
    88     virtual ~nsOnStopRequestEvent() {}
    90     NS_IMETHOD Run()
    91     {
    92         LOG(("nsOnStopRequestEvent::HandleEvent [req=%x]\n", mRequest.get()));
    94         nsMainThreadPtrHandle<nsIRequestObserver> observer = mProxy->mObserver;
    95         if (!observer) {
    96             NS_NOTREACHED("already handled onStopRequest event (observer is null)");
    97             return NS_OK;
    98         }
    99         // Do not allow any more events to be handled after OnStopRequest
   100         mProxy->mObserver = 0;
   102         nsresult status = NS_OK;
   103         DebugOnly<nsresult> rv = mRequest->GetStatus(&status);
   104         NS_ASSERTION(NS_SUCCEEDED(rv), "GetStatus failed for request!");
   106         LOG(("handle stopevent=%p\n", this));
   107         (void) observer->OnStopRequest(mRequest, mProxy->mContext, status);
   109         return NS_OK;
   110     }
   111 };
   113 //-----------------------------------------------------------------------------
   114 // nsRequestObserverProxy::nsISupports implementation...
   115 //-----------------------------------------------------------------------------
   117 NS_IMPL_ISUPPORTS(nsRequestObserverProxy,
   118                   nsIRequestObserver,
   119                   nsIRequestObserverProxy)
   121 //-----------------------------------------------------------------------------
   122 // nsRequestObserverProxy::nsIRequestObserver implementation...
   123 //-----------------------------------------------------------------------------
   125 NS_IMETHODIMP 
   126 nsRequestObserverProxy::OnStartRequest(nsIRequest *request,
   127                                        nsISupports *context)
   128 {
   129     MOZ_ASSERT(!context || context == mContext);
   130     LOG(("nsRequestObserverProxy::OnStartRequest [this=%p req=%x]\n", this, request));
   132     nsOnStartRequestEvent *ev = 
   133         new nsOnStartRequestEvent(this, request);
   134     if (!ev)
   135         return NS_ERROR_OUT_OF_MEMORY;
   137     LOG(("post startevent=%p\n", ev));
   138     nsresult rv = FireEvent(ev);
   139     if (NS_FAILED(rv))
   140         delete ev;
   141     return rv;
   142 }
   144 NS_IMETHODIMP 
   145 nsRequestObserverProxy::OnStopRequest(nsIRequest *request,
   146                                       nsISupports *context,
   147                                       nsresult status)
   148 {
   149     MOZ_ASSERT(!context || context == mContext);
   150     LOG(("nsRequestObserverProxy: OnStopRequest [this=%p req=%x status=%x]\n",
   151         this, request, status));
   153     // The status argument is ignored because, by the time the OnStopRequestEvent
   154     // is actually processed, the status of the request may have changed :-( 
   155     // To make sure that an accurate status code is always used, GetStatus() is
   156     // called when the OnStopRequestEvent is actually processed (see above).
   158     nsOnStopRequestEvent *ev = 
   159         new nsOnStopRequestEvent(this, request);
   160     if (!ev)
   161         return NS_ERROR_OUT_OF_MEMORY;
   163     LOG(("post stopevent=%p\n", ev));
   164     nsresult rv = FireEvent(ev);
   165     if (NS_FAILED(rv))
   166         delete ev;
   167     return rv;
   168 }
   170 //-----------------------------------------------------------------------------
   171 // nsRequestObserverProxy::nsIRequestObserverProxy implementation...
   172 //-----------------------------------------------------------------------------
   174 NS_IMETHODIMP
   175 nsRequestObserverProxy::Init(nsIRequestObserver *observer, nsISupports *context)
   176 {
   177     NS_ENSURE_ARG_POINTER(observer);
   179 #if defined(PR_LOGGING)
   180     if (!gRequestObserverProxyLog)
   181         gRequestObserverProxyLog = PR_NewLogModule("nsRequestObserverProxy");
   182 #endif
   184     mObserver = new nsMainThreadPtrHolder<nsIRequestObserver>(observer);
   185     mContext = new nsMainThreadPtrHolder<nsISupports>(context);
   187     return NS_OK;
   188 }
   190 //-----------------------------------------------------------------------------
   191 // nsRequestObserverProxy implementation...
   192 //-----------------------------------------------------------------------------
   194 nsresult
   195 nsRequestObserverProxy::FireEvent(nsARequestObserverEvent *event)
   196 {
   197     nsCOMPtr<nsIEventTarget> mainThread(do_GetMainThread());
   198     return mainThread->Dispatch(event, NS_DISPATCH_NORMAL);
   199 }

mercurial