Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(195)

Side by Side Diff: content/renderer/media/peer_connection_identity_store.cc

Issue 1373023002: RTCCertificate, RTCPeerConnection.generateCertificate (WebRTC JavaScript) added. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Make trybots compile (WebRTCCertificate not including wtf/Noncopyable) Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698