• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/proxy/network_delegate_error_observer.h"
6 
7 #include "base/bind.h"
8 #include "base/location.h"
9 #include "base/message_loop/message_loop_proxy.h"
10 #include "net/base/net_errors.h"
11 #include "net/base/network_delegate.h"
12 
13 namespace net {
14 
15 // NetworkDelegateErrorObserver::Core -----------------------------------------
16 
17 class NetworkDelegateErrorObserver::Core
18     : public base::RefCountedThreadSafe<NetworkDelegateErrorObserver::Core> {
19  public:
20   Core(NetworkDelegate* network_delegate, base::MessageLoopProxy* origin_loop);
21 
22   void NotifyPACScriptError(int line_number, const base::string16& error);
23 
24   void Shutdown();
25 
26  private:
27   friend class base::RefCountedThreadSafe<NetworkDelegateErrorObserver::Core>;
28 
29   virtual ~Core();
30 
31   NetworkDelegate* network_delegate_;
32   scoped_refptr<base::MessageLoopProxy> origin_loop_;
33 
34   DISALLOW_COPY_AND_ASSIGN(Core);
35 };
36 
Core(NetworkDelegate * network_delegate,base::MessageLoopProxy * origin_loop)37 NetworkDelegateErrorObserver::Core::Core(NetworkDelegate* network_delegate,
38                                          base::MessageLoopProxy* origin_loop)
39   : network_delegate_(network_delegate),
40     origin_loop_(origin_loop) {
41   DCHECK(origin_loop);
42 }
43 
~Core()44 NetworkDelegateErrorObserver::Core::~Core() {}
45 
46 
NotifyPACScriptError(int line_number,const base::string16 & error)47 void NetworkDelegateErrorObserver::Core::NotifyPACScriptError(
48     int line_number,
49     const base::string16& error) {
50   if (!origin_loop_->BelongsToCurrentThread()) {
51     origin_loop_->PostTask(
52         FROM_HERE,
53         base::Bind(&Core::NotifyPACScriptError, this, line_number, error));
54     return;
55   }
56   if (network_delegate_)
57     network_delegate_->NotifyPACScriptError(line_number, error);
58 }
59 
Shutdown()60 void NetworkDelegateErrorObserver::Core::Shutdown() {
61   CHECK(origin_loop_->BelongsToCurrentThread());
62   network_delegate_ = NULL;
63 }
64 
65 // NetworkDelegateErrorObserver -----------------------------------------------
66 
NetworkDelegateErrorObserver(NetworkDelegate * network_delegate,base::MessageLoopProxy * origin_loop)67 NetworkDelegateErrorObserver::NetworkDelegateErrorObserver(
68     NetworkDelegate* network_delegate,
69     base::MessageLoopProxy* origin_loop)
70     : core_(new Core(network_delegate, origin_loop)) {}
71 
~NetworkDelegateErrorObserver()72 NetworkDelegateErrorObserver::~NetworkDelegateErrorObserver() {
73   core_->Shutdown();
74 }
75 
OnPACScriptError(int line_number,const base::string16 & error)76 void NetworkDelegateErrorObserver::OnPACScriptError(
77     int line_number,
78     const base::string16& error) {
79   core_->NotifyPACScriptError(line_number, error);
80 }
81 
82 }  // namespace net
83