OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/media/peer_connection_identity_store.h" | 5 #include "content/renderer/media/peer_connection_identity_store.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/macros.h" | |
8 #include "base/thread_task_runner_handle.h" | 9 #include "base/thread_task_runner_handle.h" |
9 #include "content/renderer/media/webrtc_identity_service.h" | 10 #include "content/renderer/media/webrtc_identity_service.h" |
10 #include "content/renderer/render_thread_impl.h" | 11 #include "content/renderer/render_thread_impl.h" |
11 | 12 |
12 namespace content { | 13 namespace content { |
13 namespace { | 14 namespace { |
15 const char kIdentityName[] = "WebRTC"; | |
Ryan Sleevi
2015/10/10 04:04:48
style nit: newline before this.
hbos_chromium
2015/10/14 13:00:49
Done.
| |
16 | |
14 // Bridges identity requests between the main render thread and libjingle's | 17 // Bridges identity requests between the main render thread and libjingle's |
15 // signaling thread. | 18 // signaling thread. |
16 class RequestHandler : public base::RefCountedThreadSafe<RequestHandler> { | 19 class RequestHandler : public base::RefCountedThreadSafe<RequestHandler> { |
17 public: | 20 public: |
18 explicit RequestHandler(webrtc::DtlsIdentityRequestObserver* observer) | 21 explicit RequestHandler(webrtc::DtlsIdentityRequestObserver* observer) |
19 : signaling_thread_(base::ThreadTaskRunnerHandle::Get()), | 22 : signaling_thread_(base::ThreadTaskRunnerHandle::Get()), |
20 observer_(observer) {} | 23 observer_(observer) {} |
21 | 24 |
22 void RequestIdentityOnUIThread(const GURL& url, | 25 void RequestIdentityOnUIThread(const GURL& url, |
23 const GURL& first_party_for_cookies) { | 26 const GURL& first_party_for_cookies) { |
24 int request_id = | 27 int request_id = |
25 RenderThreadImpl::current() | 28 RenderThreadImpl::current() |
26 ->get_webrtc_identity_service() | 29 ->get_webrtc_identity_service() |
27 ->RequestIdentity( | 30 ->RequestIdentity( |
28 url, first_party_for_cookies, "WebRTC", "WebRTC", | 31 url, first_party_for_cookies, kIdentityName, kIdentityName, |
29 base::Bind(&RequestHandler::OnIdentityReady, this), | 32 base::Bind(&RequestHandler::OnIdentityReady, this), |
30 base::Bind(&RequestHandler::OnRequestFailed, this)); | 33 base::Bind(&RequestHandler::OnRequestFailed, this)); |
31 DCHECK_NE(request_id, 0); | 34 DCHECK_NE(request_id, 0); |
32 } | 35 } |
33 | 36 |
34 private: | 37 private: |
35 friend class base::RefCountedThreadSafe<RequestHandler>; | 38 friend class base::RefCountedThreadSafe<RequestHandler>; |
36 ~RequestHandler() { | 39 ~RequestHandler() { |
37 DCHECK(!observer_.get()); | 40 DCHECK(!observer_.get()); |
38 } | 41 } |
(...skipping 21 matching lines...) Expand all Loading... | |
60 } | 63 } |
61 | 64 |
62 void EnsureReleaseObserverOnSignalingThread() { | 65 void EnsureReleaseObserverOnSignalingThread() { |
63 DCHECK(signaling_thread_->BelongsToCurrentThread()); | 66 DCHECK(signaling_thread_->BelongsToCurrentThread()); |
64 observer_ = nullptr; | 67 observer_ = nullptr; |
65 } | 68 } |
66 | 69 |
67 const scoped_refptr<base::SingleThreadTaskRunner> signaling_thread_; | 70 const scoped_refptr<base::SingleThreadTaskRunner> signaling_thread_; |
68 scoped_refptr<webrtc::DtlsIdentityRequestObserver> observer_; | 71 scoped_refptr<webrtc::DtlsIdentityRequestObserver> observer_; |
69 }; | 72 }; |
73 | |
74 // PeerConnectionIdentityStore::RequestIdentity helper class. | |
75 // Used to invokes |observer|->OnSuccess in a PostTask. | |
Guido Urdaneta
2015/10/08 11:13:03
s/invokes/invoke
hbos_chromium
2015/10/14 13:00:49
Done.
| |
76 class ObserverOnSuccessCaller | |
77 : public base::RefCountedThreadSafe<ObserverOnSuccessCaller> { | |
Guido Urdaneta
2015/10/08 11:13:03
Does it have to be refcounted?
hbos_chromium
2015/10/14 13:00:49
Yes, TaskRunner code uses ref counting.
| |
78 public: | |
79 ObserverOnSuccessCaller() {} | |
80 | |
81 void CallObserverOnSuccess( | |
82 rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver> observer, | |
Ryan Sleevi
2015/10/10 04:04:48
Why are you passing a ref-counted object by-value?
hbos_chromium
2015/10/14 13:00:49
Done.
| |
83 rtc::SSLIdentity* identity) { | |
Ryan Sleevi
2015/10/10 04:04:48
if rtc::scoped_ptr<> supports .Pass() (as shown by
hbos_chromium
2015/10/14 13:00:49
This is problematic due to PostTask/base::Bind (se
| |
84 observer->OnSuccess(rtc::scoped_ptr<rtc::SSLIdentity>(identity).Pass()); | |
85 } | |
86 | |
87 private: | |
88 friend class base::RefCountedThreadSafe<ObserverOnSuccessCaller>; | |
89 ~ObserverOnSuccessCaller() {} | |
90 | |
91 DISALLOW_COPY_AND_ASSIGN(ObserverOnSuccessCaller); | |
92 }; | |
70 } // namespace | 93 } // namespace |
71 | 94 |
72 PeerConnectionIdentityStore::PeerConnectionIdentityStore( | 95 PeerConnectionIdentityStore::PeerConnectionIdentityStore( |
73 const GURL& url, | 96 const GURL& url, |
74 const GURL& first_party_for_cookies) | 97 const GURL& first_party_for_cookies) |
75 : main_thread_(base::ThreadTaskRunnerHandle::Get()), | 98 : main_thread_(base::ThreadTaskRunnerHandle::Get()), |
76 url_(url), | 99 url_(url), |
77 first_party_for_cookies_(first_party_for_cookies) { | 100 first_party_for_cookies_(first_party_for_cookies) { |
78 signaling_thread_.DetachFromThread(); | 101 signaling_thread_.DetachFromThread(); |
79 DCHECK(main_thread_.get()); | 102 DCHECK(main_thread_.get()); |
80 } | 103 } |
81 | 104 |
82 PeerConnectionIdentityStore::~PeerConnectionIdentityStore() { | 105 PeerConnectionIdentityStore::~PeerConnectionIdentityStore() { |
83 // Typically destructed on libjingle's signaling thread. | 106 // Typically destructed on libjingle's signaling thread. |
84 } | 107 } |
85 | 108 |
86 void PeerConnectionIdentityStore::RequestIdentity( | 109 void PeerConnectionIdentityStore::RequestIdentity( |
87 rtc::KeyType key_type, | 110 rtc::KeyType key_type, |
88 const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>& observer) { | 111 const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>& observer) { |
89 DCHECK(signaling_thread_.CalledOnValidThread()); | 112 DCHECK(signaling_thread_.CalledOnValidThread()); |
90 DCHECK(observer); | 113 DCHECK(observer); |
91 // This store only supports RSA. | |
92 DCHECK_EQ(key_type, rtc::KT_RSA); | |
93 | 114 |
94 scoped_refptr<RequestHandler> handler(new RequestHandler(observer)); | 115 // TODO(hbos): Use modulus length parameter when KeyType is parameterized. |
95 main_thread_->PostTask( | 116 if (key_type == rtc::KT_RSA) { |
96 FROM_HERE, | 117 // Use Chromium identity generation code for RSA. |
Ryan Sleevi
2015/10/10 04:04:48
Why split between these two?
hbos_chromium
2015/10/14 13:00:49
Ideally we would only use WebRTC code for certific
| |
97 base::Bind(&RequestHandler::RequestIdentityOnUIThread, handler, url_, | 118 scoped_refptr<RequestHandler> handler(new RequestHandler(observer)); |
98 first_party_for_cookies_)); | 119 main_thread_->PostTask( |
120 FROM_HERE, | |
121 base::Bind(&RequestHandler::RequestIdentityOnUIThread, handler, url_, | |
122 first_party_for_cookies_)); | |
123 } else { | |
124 // Use WebRTC identity generation code for non-RSA. | |
125 rtc::SSLIdentity* identity = rtc::SSLIdentity::Generate(kIdentityName, | |
126 key_type); | |
127 | |
128 scoped_refptr<base::SingleThreadTaskRunner> signaling_thread = | |
129 base::ThreadTaskRunnerHandle::Get(); | |
130 | |
131 // Invoke |observer| callbacks asynchronously. The callbacks of | |
132 // DtlsIdentityStoreInterface implementations have to be async. | |
133 if (identity) { | |
134 // Async call to observer->OnSuccess. | |
135 // Helper class necessary because OnSuccess takes a scoped_ptr argument | |
Guido Urdaneta
2015/10/08 11:13:03
You can probably use base::Passed() instead of the
hbos_chromium
2015/10/14 13:00:49
Done.
| |
136 // and scoped_ptrs can't be passed with = operator, have to use .Pass(). | |
137 scoped_refptr<ObserverOnSuccessCaller> observer_caller( | |
138 new ObserverOnSuccessCaller()); | |
139 signaling_thread->PostTask(FROM_HERE, | |
140 base::Bind(&ObserverOnSuccessCaller::CallObserverOnSuccess, | |
141 observer_caller, observer, identity)); | |
142 } else { | |
143 // Async call to observer->OnFailure. | |
144 signaling_thread->PostTask(FROM_HERE, | |
145 base::Bind(&webrtc::DtlsIdentityRequestObserver::OnFailure, | |
146 observer, 0)); | |
147 } | |
148 } | |
99 } | 149 } |
100 | 150 |
101 } // namespace content | 151 } // namespace content |
OLD | NEW |