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

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

Issue 1351443005: Refactor media permission dispatcher class and create proxy class for non-UI threads. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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/media_permission_dispatcher.h" 5 #include "content/renderer/media/media_permission_dispatcher_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/thread_task_runner_handle.h"
9 #include "content/public/common/service_registry.h" 10 #include "content/public/common/service_registry.h"
10 #include "content/public/renderer/render_frame.h" 11 #include "content/public/renderer/render_frame.h"
12 #include "content/renderer/media/media_permission_dispatcher_proxy.h"
11 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" 13 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
12 #include "url/gurl.h" 14 #include "url/gurl.h"
13 15
14 namespace { 16 namespace {
15 17
16 using Type = media::MediaPermission::Type; 18 using Type = media::MediaPermission::Type;
17 19
18 content::PermissionName MediaPermissionTypeToPermissionName(Type type) { 20 content::PermissionName MediaPermissionTypeToPermissionName(Type type) {
19 switch (type) { 21 switch (type) {
20 case Type::PROTECTED_MEDIA_IDENTIFIER: 22 case Type::PROTECTED_MEDIA_IDENTIFIER:
21 return content::PERMISSION_NAME_PROTECTED_MEDIA_IDENTIFIER; 23 return content::PERMISSION_NAME_PROTECTED_MEDIA_IDENTIFIER;
22 case Type::AUDIO_CAPTURE: 24 case Type::AUDIO_CAPTURE:
23 return content::PERMISSION_NAME_AUDIO_CAPTURE; 25 return content::PERMISSION_NAME_AUDIO_CAPTURE;
24 case Type::VIDEO_CAPTURE: 26 case Type::VIDEO_CAPTURE:
25 return content::PERMISSION_NAME_VIDEO_CAPTURE; 27 return content::PERMISSION_NAME_VIDEO_CAPTURE;
26 } 28 }
27 NOTREACHED(); 29 NOTREACHED();
28 return content::PERMISSION_NAME_PROTECTED_MEDIA_IDENTIFIER; 30 return content::PERMISSION_NAME_PROTECTED_MEDIA_IDENTIFIER;
29 } 31 }
30 32
31 } // namespace 33 } // namespace
32 34
33 namespace content { 35 namespace content {
34 36
35 MediaPermissionDispatcher::MediaPermissionDispatcher(RenderFrame* render_frame) 37 MediaPermissionDispatcherImpl::MediaPermissionDispatcherImpl(
36 : RenderFrameObserver(render_frame), next_request_id_(0) { 38 RenderFrame* render_frame)
39 : RenderFrameObserver(render_frame),
40 task_runner_(base::ThreadTaskRunnerHandle::Get()) {}
41
42 MediaPermissionDispatcherImpl::~MediaPermissionDispatcherImpl() {
43 DCHECK(thread_checker_.CalledOnValidThread());
37 } 44 }
38 45
39 MediaPermissionDispatcher::~MediaPermissionDispatcher() { 46 void MediaPermissionDispatcherImpl::HasPermission(
40 DCHECK(thread_checker_.CalledOnValidThread());
41
42 // Fire all pending callbacks with |false|.
43 for (auto& request : requests_)
44 request.second.Run(false);
45
46 requests_.clear();
47 }
48
49 void MediaPermissionDispatcher::HasPermission(
50 Type type, 47 Type type,
51 const GURL& security_origin, 48 const GURL& security_origin,
52 const PermissionStatusCB& permission_status_cb) { 49 const PermissionStatusCB& permission_status_cb) {
53 DCHECK(thread_checker_.CalledOnValidThread()); 50 DCHECK(thread_checker_.CalledOnValidThread());
54 51
55 if (!permission_service_.get()) { 52 if (!permission_service_.get()) {
56 render_frame()->GetServiceRegistry()->ConnectToRemoteService( 53 render_frame()->GetServiceRegistry()->ConnectToRemoteService(
57 mojo::GetProxy(&permission_service_)); 54 mojo::GetProxy(&permission_service_));
58 } 55 }
59 56
60 uint32_t request_id = next_request_id_++;
61 DCHECK(!requests_.count(request_id));
62 requests_[request_id] = permission_status_cb;
63
64 DVLOG(2) << __FUNCTION__ << ": request ID " << request_id;
65
66 permission_service_->HasPermission( 57 permission_service_->HasPermission(
67 MediaPermissionTypeToPermissionName(type), security_origin.spec(), 58 MediaPermissionTypeToPermissionName(type), security_origin.spec(),
68 base::Bind(&MediaPermissionDispatcher::OnPermissionStatus, 59 base::Bind(&MediaPermissionDispatcherImpl::OnPermissionStatus,
69 base::Unretained(this), request_id)); 60 base::Unretained(this),
perkj_chrome 2015/09/22 08:24:16 Why is it safe to use Unretained? Looks scary to
guoweis_left_chromium 2015/09/22 18:48:49 Done.
61 RegisterCallback(permission_status_cb)));
70 } 62 }
71 63
72 void MediaPermissionDispatcher::RequestPermission( 64 void MediaPermissionDispatcherImpl::RequestPermission(
73 Type type, 65 Type type,
74 const GURL& security_origin, 66 const GURL& security_origin,
75 const PermissionStatusCB& permission_status_cb) { 67 const PermissionStatusCB& permission_status_cb) {
76 DCHECK(thread_checker_.CalledOnValidThread()); 68 DCHECK(thread_checker_.CalledOnValidThread());
77 69
78 if (!permission_service_.get()) { 70 if (!permission_service_.get()) {
79 render_frame()->GetServiceRegistry()->ConnectToRemoteService( 71 render_frame()->GetServiceRegistry()->ConnectToRemoteService(
80 mojo::GetProxy(&permission_service_)); 72 mojo::GetProxy(&permission_service_));
81 } 73 }
82 74
83 uint32_t request_id = next_request_id_++;
84 DCHECK(!requests_.count(request_id));
85 requests_[request_id] = permission_status_cb;
86
87 DVLOG(2) << __FUNCTION__ << ": request ID " << request_id;
88
89 permission_service_->RequestPermission( 75 permission_service_->RequestPermission(
90 MediaPermissionTypeToPermissionName(type), security_origin.spec(), 76 MediaPermissionTypeToPermissionName(type), security_origin.spec(),
91 blink::WebUserGestureIndicator::isProcessingUserGesture(), 77 blink::WebUserGestureIndicator::isProcessingUserGesture(),
92 base::Bind(&MediaPermissionDispatcher::OnPermissionStatus, 78 base::Bind(&MediaPermissionDispatcherImpl::OnPermissionStatus,
93 base::Unretained(this), request_id)); 79 base::Unretained(this),
80 RegisterCallback(permission_status_cb)));
94 } 81 }
95 82
96 void MediaPermissionDispatcher::OnPermissionStatus(uint32_t request_id, 83 scoped_ptr<media::MediaPermission> MediaPermissionDispatcherImpl::CreateProxy(
97 PermissionStatus status) { 84 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner) {
98 DVLOG(2) << __FUNCTION__ << ": (" << request_id << ", " << status << ")"; 85 scoped_ptr<media::MediaPermission> media_permission_proxy(
86 new MediaPermissionDispatcherProxy(task_runner_, caller_task_runner,
87 base::AsWeakPtr(this)));
88 return media_permission_proxy.Pass();
89 }
90
91 void MediaPermissionDispatcherImpl::OnPermissionStatus(
92 uint32_t request_id,
93 PermissionStatus status) {
99 DCHECK(thread_checker_.CalledOnValidThread()); 94 DCHECK(thread_checker_.CalledOnValidThread());
100 95 DeliverResult(request_id, status == PERMISSION_STATUS_GRANTED);
101 RequestMap::iterator iter = requests_.find(request_id);
102 if (iter == requests_.end()) {
103 DVLOG(2) << "Request not found.";
104 return;
105 }
106
107 PermissionStatusCB permission_status_cb = iter->second;
108 requests_.erase(iter);
109
110 permission_status_cb.Run(status == PERMISSION_STATUS_GRANTED);
111 } 96 }
112 97
113 } // namespace content 98 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698