OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2015 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/proxy_resolver_v8_tracing_wrapper.h" | |
6 | |
7 #include <string> | |
8 | |
9 #include "base/bind.h" | |
10 #include "base/values.h" | |
11 #include "net/base/net_errors.h" | |
12 #include "net/log/net_log.h" | |
13 #include "net/proxy/proxy_resolver_error_observer.h" | |
14 | |
15 namespace net { | |
16 namespace { | |
17 | |
18 // Returns event parameters for a PAC error message (line number + message). | |
19 scoped_ptr<base::Value> NetLogErrorCallback( | |
20 int line_number, | |
21 const base::string16* message, | |
22 NetLogCaptureMode /* capture_mode */) { | |
23 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | |
24 dict->SetInteger("line_number", line_number); | |
25 dict->SetString("message", *message); | |
26 return dict.Pass(); | |
27 } | |
28 | |
29 class ProxyResolverV8TracingWrapper : public ProxyResolver { | |
30 public: | |
31 ProxyResolverV8TracingWrapper( | |
32 scoped_ptr<ProxyResolverV8Tracing> resolver_impl, | |
33 NetLog* net_log, | |
34 HostResolver* host_resolver, | |
35 scoped_ptr<ProxyResolverErrorObserver> error_observer); | |
36 | |
37 int GetProxyForURL(const GURL& url, | |
38 ProxyInfo* results, | |
39 const CompletionCallback& callback, | |
40 RequestHandle* request, | |
41 const BoundNetLog& net_log) override; | |
42 | |
43 void CancelRequest(RequestHandle request) override; | |
44 | |
45 LoadState GetLoadState(RequestHandle request) const override; | |
46 | |
47 private: | |
48 class BindingsImpl : public ProxyResolverV8Tracing::Bindings { | |
49 public: | |
50 BindingsImpl(ProxyResolverV8TracingWrapper* resolver, | |
51 const BoundNetLog& bound_net_log) | |
52 : resolver_(resolver), bound_net_log_(bound_net_log) {} | |
53 | |
54 void Alert(const base::string16& message) override { | |
55 // Send to the NetLog. | |
56 LogEventToCurrentRequestAndGlobally( | |
57 NetLog::TYPE_PAC_JAVASCRIPT_ALERT, | |
58 NetLog::StringCallback("message", &message)); | |
59 } | |
60 | |
61 void OnError(int line_number, const base::string16& message) override { | |
62 // Send the error to the NetLog. | |
63 LogEventToCurrentRequestAndGlobally( | |
64 NetLog::TYPE_PAC_JAVASCRIPT_ERROR, | |
65 base::Bind(&NetLogErrorCallback, line_number, &message)); | |
66 if (resolver_->error_observer_) | |
67 resolver_->error_observer_->OnPACScriptError(line_number, message); | |
68 } | |
69 | |
70 HostResolver* GetHostResolver() override { | |
71 return resolver_->host_resolver_; | |
72 } | |
73 | |
74 BoundNetLog GetBoundNetLog() override { return bound_net_log_; } | |
75 | |
76 private: | |
77 void LogEventToCurrentRequestAndGlobally( | |
78 NetLog::EventType type, | |
79 const NetLog::ParametersCallback& parameters_callback) { | |
80 bound_net_log_.AddEvent(type, parameters_callback); | |
81 | |
82 // Emit to the global NetLog event stream. | |
83 if (resolver_->net_log_) | |
84 resolver_->net_log_->AddGlobalEntry(type, parameters_callback); | |
85 } | |
86 | |
87 ProxyResolverV8TracingWrapper* resolver_; | |
88 BoundNetLog bound_net_log_; | |
89 }; | |
90 | |
91 scoped_ptr<ProxyResolverV8Tracing> resolver_impl_; | |
92 NetLog* net_log_; | |
93 HostResolver* host_resolver_; | |
94 scoped_ptr<ProxyResolverErrorObserver> error_observer_; | |
95 | |
96 DISALLOW_COPY_AND_ASSIGN(ProxyResolverV8TracingWrapper); | |
97 }; | |
98 | |
99 ProxyResolverV8TracingWrapper::ProxyResolverV8TracingWrapper( | |
100 scoped_ptr<ProxyResolverV8Tracing> resolver_impl, | |
101 NetLog* net_log, | |
102 HostResolver* host_resolver, | |
103 scoped_ptr<ProxyResolverErrorObserver> error_observer) | |
104 : resolver_impl_(resolver_impl.Pass()), | |
105 net_log_(net_log), | |
106 host_resolver_(host_resolver), | |
107 error_observer_(error_observer.Pass()) { | |
108 } | |
109 | |
110 int ProxyResolverV8TracingWrapper::GetProxyForURL( | |
111 const GURL& url, | |
112 ProxyInfo* results, | |
113 const CompletionCallback& callback, | |
114 RequestHandle* request, | |
115 const BoundNetLog& net_log) { | |
116 resolver_impl_->GetProxyForURL( | |
117 url, results, callback, request, | |
118 make_scoped_ptr(new BindingsImpl(this, net_log))); | |
119 return ERR_IO_PENDING; | |
120 } | |
121 | |
122 void ProxyResolverV8TracingWrapper::CancelRequest(RequestHandle request) { | |
123 resolver_impl_->CancelRequest(request); | |
124 } | |
125 | |
126 LoadState ProxyResolverV8TracingWrapper::GetLoadState( | |
127 RequestHandle request) const { | |
128 return resolver_impl_->GetLoadState(request); | |
129 } | |
130 | |
131 } // namespace | |
132 | |
133 class ProxyResolverFactoryV8TracingWrapper::BindingsImpl | |
eroman
2015/06/05 01:11:47
This is the same as BindingsImpl above.
Can you e
Sam McNally
2015/06/23 00:32:47
Done.
| |
134 : public ProxyResolverV8Tracing::Bindings { | |
135 public: | |
136 BindingsImpl(ProxyResolverFactoryV8TracingWrapper* factory, | |
137 ProxyResolverErrorObserver* error_observer) | |
138 : factory_(factory), error_observer_(error_observer) {} | |
139 | |
140 void Alert(const base::string16& message) override { | |
141 // Send to the NetLog. | |
142 LogEventToCurrentRequestAndGlobally( | |
143 NetLog::TYPE_PAC_JAVASCRIPT_ALERT, | |
144 NetLog::StringCallback("message", &message)); | |
145 } | |
146 | |
147 void OnError(int line_number, const base::string16& message) override { | |
148 // Send the error to the NetLog. | |
149 LogEventToCurrentRequestAndGlobally( | |
150 NetLog::TYPE_PAC_JAVASCRIPT_ERROR, | |
151 base::Bind(&NetLogErrorCallback, line_number, &message)); | |
152 if (error_observer_) | |
153 error_observer_->OnPACScriptError(line_number, message); | |
154 } | |
155 | |
156 HostResolver* GetHostResolver() override { return factory_->host_resolver_; } | |
157 | |
158 BoundNetLog GetBoundNetLog() override { return BoundNetLog(); } | |
159 | |
160 private: | |
161 void LogEventToCurrentRequestAndGlobally( | |
162 NetLog::EventType type, | |
163 const NetLog::ParametersCallback& parameters_callback) { | |
164 // Emit to the global NetLog event stream. | |
165 if (factory_->net_log_) | |
166 factory_->net_log_->AddGlobalEntry(type, parameters_callback); | |
167 } | |
168 | |
169 ProxyResolverFactoryV8TracingWrapper* factory_; | |
170 ProxyResolverErrorObserver* error_observer_; | |
171 }; | |
172 | |
173 ProxyResolverFactoryV8TracingWrapper::ProxyResolverFactoryV8TracingWrapper( | |
174 HostResolver* host_resolver, | |
175 NetLog* net_log, | |
176 const base::Callback<scoped_ptr<ProxyResolverErrorObserver>()>& | |
177 error_observer_factory) | |
178 : ProxyResolverFactory(true), | |
179 factory_impl_(ProxyResolverV8TracingFactory::Create()), | |
180 host_resolver_(host_resolver), | |
181 net_log_(net_log), | |
182 error_observer_factory_(error_observer_factory) { | |
183 } | |
184 | |
185 ProxyResolverFactoryV8TracingWrapper::~ProxyResolverFactoryV8TracingWrapper() = | |
186 default; | |
187 | |
188 int ProxyResolverFactoryV8TracingWrapper::CreateProxyResolver( | |
189 const scoped_refptr<ProxyResolverScriptData>& pac_script, | |
190 scoped_ptr<ProxyResolver>* resolver, | |
191 const CompletionCallback& callback, | |
192 scoped_ptr<Request>* request) { | |
193 scoped_ptr<scoped_ptr<ProxyResolverV8Tracing>> passable_v8_resolver( | |
194 new scoped_ptr<ProxyResolverV8Tracing>); | |
195 scoped_ptr<ProxyResolverErrorObserver> error_observer = | |
196 error_observer_factory_.Run(); | |
197 scoped_ptr<ProxyResolverV8Tracing>* v8_resolver = passable_v8_resolver.get(); | |
198 factory_impl_->CreateProxyResolverV8Tracing( | |
199 pac_script, make_scoped_ptr(new BindingsImpl(this, error_observer.get())), | |
200 v8_resolver, | |
201 base::Bind(&ProxyResolverFactoryV8TracingWrapper::OnProxyResolverCreated, | |
202 base::Unretained(this), base::Passed(&passable_v8_resolver), | |
203 resolver, callback, base::Passed(&error_observer)), | |
204 request); | |
205 return ERR_IO_PENDING; | |
206 } | |
207 | |
208 void ProxyResolverFactoryV8TracingWrapper::OnProxyResolverCreated( | |
209 scoped_ptr<scoped_ptr<ProxyResolverV8Tracing>> v8_resolver, | |
210 scoped_ptr<ProxyResolver>* resolver, | |
211 const CompletionCallback& callback, | |
212 scoped_ptr<ProxyResolverErrorObserver> error_observer, | |
213 int error) { | |
214 if (error == OK) { | |
215 resolver->reset(new ProxyResolverV8TracingWrapper( | |
216 v8_resolver->Pass(), net_log_, host_resolver_, error_observer.Pass())); | |
217 } | |
218 callback.Run(error); | |
219 } | |
220 | |
221 } // namespace net | |
OLD | NEW |