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

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

Issue 1311853005: RTCCertificate and RTCPeerConnection.generateCertificate added to JavaScript (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Chromium implementation of Blink interfaces. Addressed comments. 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
« no previous file with comments | « content/content_renderer.gypi ('k') | content/renderer/media/rtc_certificate.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/thread_task_runner_handle.h" 8 #include "base/thread_task_runner_handle.h"
9 #include "content/renderer/media/webrtc_identity_service.h" 9 #include "content/renderer/media/webrtc_identity_service.h"
10 #include "content/renderer/render_thread_impl.h" 10 #include "content/renderer/render_thread_impl.h"
11 11
12 namespace content { 12 namespace content {
13 namespace { 13 namespace {
14 const char kIdentityName[] = "WebRTC";
15
14 // Bridges identity requests between the main render thread and libjingle's 16 // Bridges identity requests between the main render thread and libjingle's
15 // signaling thread. 17 // signaling thread.
16 class RequestHandler : public base::RefCountedThreadSafe<RequestHandler> { 18 class RequestHandler : public base::RefCountedThreadSafe<RequestHandler> {
17 public: 19 public:
18 explicit RequestHandler(webrtc::DtlsIdentityRequestObserver* observer) 20 explicit RequestHandler(webrtc::DtlsIdentityRequestObserver* observer)
19 : signaling_thread_(base::ThreadTaskRunnerHandle::Get()), 21 : signaling_thread_(base::ThreadTaskRunnerHandle::Get()),
20 observer_(observer) {} 22 observer_(observer) {}
21 23
22 void RequestIdentityOnUIThread(const GURL& url, 24 void RequestIdentityOnUIThread(const GURL& url,
23 const GURL& first_party_for_cookies) { 25 const GURL& first_party_for_cookies) {
24 int request_id = 26 int request_id =
25 RenderThreadImpl::current() 27 RenderThreadImpl::current()
26 ->get_webrtc_identity_service() 28 ->get_webrtc_identity_service()
27 ->RequestIdentity( 29 ->RequestIdentity(
28 url, first_party_for_cookies, "WebRTC", "WebRTC", 30 url, first_party_for_cookies, kIdentityName, kIdentityName,
29 base::Bind(&RequestHandler::OnIdentityReady, this), 31 base::Bind(&RequestHandler::OnIdentityReady, this),
30 base::Bind(&RequestHandler::OnRequestFailed, this)); 32 base::Bind(&RequestHandler::OnRequestFailed, this));
31 DCHECK_NE(request_id, 0); 33 DCHECK_NE(request_id, 0);
32 } 34 }
33 35
34 private: 36 private:
35 friend class base::RefCountedThreadSafe<RequestHandler>; 37 friend class base::RefCountedThreadSafe<RequestHandler>;
36 ~RequestHandler() { 38 ~RequestHandler() {
37 DCHECK(!observer_.get()); 39 DCHECK(!observer_.get());
38 } 40 }
(...skipping 21 matching lines...) Expand all
60 } 62 }
61 63
62 void EnsureReleaseObserverOnSignalingThread() { 64 void EnsureReleaseObserverOnSignalingThread() {
63 DCHECK(signaling_thread_->BelongsToCurrentThread()); 65 DCHECK(signaling_thread_->BelongsToCurrentThread());
64 observer_ = nullptr; 66 observer_ = nullptr;
65 } 67 }
66 68
67 const scoped_refptr<base::SingleThreadTaskRunner> signaling_thread_; 69 const scoped_refptr<base::SingleThreadTaskRunner> signaling_thread_;
68 scoped_refptr<webrtc::DtlsIdentityRequestObserver> observer_; 70 scoped_refptr<webrtc::DtlsIdentityRequestObserver> observer_;
69 }; 71 };
72
73 // PeerConnectionIdentityStore::RequestIdentity helper class.
74 // Used to invokes |observer|->OnSuccess in a PostTask.
75 class ObserverOnSuccessCaller
76 : public base::RefCountedThreadSafe<ObserverOnSuccessCaller> {
77 public:
78 void CallObserverOnSuccess(
79 rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver> observer,
80 rtc::SSLIdentity* identity) {
81 observer->OnSuccess(rtc::scoped_ptr<rtc::SSLIdentity>(identity).Pass());
82 }
83 private:
84 friend class base::RefCountedThreadSafe<ObserverOnSuccessCaller>;
85 ~ObserverOnSuccessCaller() {}
86 };
70 } // namespace 87 } // namespace
71 88
72 PeerConnectionIdentityStore::PeerConnectionIdentityStore( 89 PeerConnectionIdentityStore::PeerConnectionIdentityStore(
73 const GURL& url, 90 const GURL& url,
74 const GURL& first_party_for_cookies) 91 const GURL& first_party_for_cookies)
75 : main_thread_(base::ThreadTaskRunnerHandle::Get()), 92 : main_thread_(base::ThreadTaskRunnerHandle::Get()),
76 url_(url), 93 url_(url),
77 first_party_for_cookies_(first_party_for_cookies) { 94 first_party_for_cookies_(first_party_for_cookies) {
78 signaling_thread_.DetachFromThread(); 95 signaling_thread_.DetachFromThread();
79 DCHECK(main_thread_.get()); 96 DCHECK(main_thread_.get());
80 } 97 }
81 98
82 PeerConnectionIdentityStore::~PeerConnectionIdentityStore() { 99 PeerConnectionIdentityStore::~PeerConnectionIdentityStore() {
83 // Typically destructed on libjingle's signaling thread. 100 // Typically destructed on libjingle's signaling thread.
84 } 101 }
85 102
86 void PeerConnectionIdentityStore::RequestIdentity( 103 void PeerConnectionIdentityStore::RequestIdentity(
87 rtc::KeyType key_type, 104 rtc::KeyType key_type,
88 const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>& observer) { 105 const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>& observer) {
89 DCHECK(signaling_thread_.CalledOnValidThread()); 106 DCHECK(signaling_thread_.CalledOnValidThread());
90 DCHECK(observer); 107 DCHECK(observer);
91 // This store only supports RSA.
92 DCHECK_EQ(key_type, rtc::KT_RSA);
93 108
94 scoped_refptr<RequestHandler> handler(new RequestHandler(observer)); 109 // TODO(hbos): Use modulus length parameter when KeyType is parameterized.
95 main_thread_->PostTask( 110 if (key_type == rtc::KT_RSA) {
96 FROM_HERE, 111 // Use Chromium identity generation code for RSA.
97 base::Bind(&RequestHandler::RequestIdentityOnUIThread, handler, url_, 112 scoped_refptr<RequestHandler> handler(new RequestHandler(observer));
98 first_party_for_cookies_)); 113 main_thread_->PostTask(
114 FROM_HERE,
115 base::Bind(&RequestHandler::RequestIdentityOnUIThread, handler, url_,
116 first_party_for_cookies_));
117 } else {
118 // Use WebRTC identity generation code for non-RSA.
119 rtc::SSLIdentity* identity = rtc::SSLIdentity::Generate(kIdentityName,
120 key_type);
121
122 scoped_refptr<base::SingleThreadTaskRunner> signaling_thread =
123 base::ThreadTaskRunnerHandle::Get();
124
125 // Invoke |observer| callbacks asynchronously. The callbacks of
126 // DtlsIdentityStoreInterface implementations have to be async.
127 if (identity) {
128 // Async call to observer->OnSuccess.
129 // Helper class necessary because OnSuccess takes a scoped_ptr argument
130 // and scoped_ptrs can't be passed with = operator, have to use .Pass().
131 signaling_thread->PostTask(FROM_HERE,
132 base::Bind(&ObserverOnSuccessCaller::CallObserverOnSuccess,
133 new ObserverOnSuccessCaller(), observer, identity));
134 } else {
135 // Async call to observer->OnFailure.
136 signaling_thread->PostTask(FROM_HERE,
137 base::Bind(&webrtc::DtlsIdentityRequestObserver::OnFailure,
138 observer, 0));
139 }
140 }
99 } 141 }
100 142
101 } // namespace content 143 } // namespace content
OLDNEW
« no previous file with comments | « content/content_renderer.gypi ('k') | content/renderer/media/rtc_certificate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698