Chromium Code Reviews| Index: content/browser/browser_plugin/browser_plugin_guest.cc |
| diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc |
| index 3042c7361fbc9d8057ce3bab1a9a568dfa8bfb97..00b7a3c583635e5cd27eafc9454e0849c7d6f2c0 100644 |
| --- a/content/browser/browser_plugin/browser_plugin_guest.cc |
| +++ b/content/browser/browser_plugin/browser_plugin_guest.cc |
| @@ -17,8 +17,8 @@ |
| #include "content/common/browser_plugin_messages.h" |
| #include "content/common/content_constants_internal.h" |
| #include "content/common/drag_messages.h" |
| -#include "content/common/view_messages.h" |
| #include "content/common/gpu/gpu_messages.h" |
| +#include "content/common/view_messages.h" |
| #include "content/port/browser/render_view_host_delegate_view.h" |
| #include "content/public/browser/content_browser_client.h" |
| #include "content/public/browser/notification_service.h" |
| @@ -28,6 +28,7 @@ |
| #include "content/public/browser/resource_request_details.h" |
| #include "content/public/browser/user_metrics.h" |
| #include "content/public/browser/web_contents_view.h" |
| +#include "content/public/common/media_stream_request.h" |
| #include "content/public/common/result_codes.h" |
| #include "content/browser/browser_plugin/browser_plugin_host_factory.h" |
| #include "net/base/net_errors.h" |
| @@ -45,6 +46,10 @@ namespace content { |
| // static |
| BrowserPluginHostFactory* BrowserPluginGuest::factory_ = NULL; |
| +namespace { |
| +const size_t kNumMaxOutstandingMediaRequests = 1024; |
| +} |
| + |
| BrowserPluginGuest::BrowserPluginGuest( |
| int instance_id, |
| WebContentsImpl* web_contents, |
| @@ -62,7 +67,8 @@ BrowserPluginGuest::BrowserPluginGuest( |
| name_(params.name), |
| auto_size_enabled_(params.auto_size_params.enable), |
| max_auto_size_(params.auto_size_params.max_size), |
| - min_auto_size_(params.auto_size_params.min_size) { |
| + min_auto_size_(params.auto_size_params.min_size), |
| + current_media_access_request_id_(0) { |
| DCHECK(web_contents); |
| } |
| @@ -70,6 +76,7 @@ bool BrowserPluginGuest::OnMessageReceivedFromEmbedder( |
| const IPC::Message& message) { |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP(BrowserPluginGuest, message) |
| + IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_AllowPermission, OnAllowPermission) |
| IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_BuffersSwappedACK, |
| OnSwapBuffersACK) |
| IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_DragStatusUpdate, |
| @@ -580,6 +587,34 @@ void BrowserPluginGuest::AcknowledgeBufferPresent( |
| ack_params); |
| } |
| +void BrowserPluginGuest::OnAllowPermission(int /*instance_id*/, |
| + const std::string& permission_type, |
| + int request_id, |
| + bool should_allow) { |
| + if (permission_type != "media") |
| + return; |
| + |
| + MediaStreamRequestsMap::iterator media_request_iter = |
| + media_requests_map_.find(request_id); |
| + if (media_request_iter == media_requests_map_.end()) { |
| + LOG(INFO) << "Not a valid request ID."; |
| + return; |
| + } |
| + const content::MediaStreamRequest& request = media_request_iter->second.first; |
| + const content::MediaResponseCallback& callback = |
| + media_request_iter->second.second; |
| + |
| + if (should_allow && embedder_web_contents_) { |
| + // Re-route the request to the embedder's WebContents; the guest gets the |
| + // permission this way. |
| + embedder_web_contents_->RequestMediaAccessPermission(request, callback); |
| + } else { |
| + // Deny the request. |
| + callback.Run(content::MediaStreamDevices()); |
| + } |
| + media_requests_map_.erase(media_request_iter); |
| +} |
| + |
| void BrowserPluginGuest::OnSwapBuffersACK(int instance_id, |
| int route_id, |
| int gpu_host_id, |
| @@ -705,6 +740,29 @@ void BrowserPluginGuest::OnUpdateFrameName(int frame_id, |
| name)); |
| } |
| +void BrowserPluginGuest::RequestMediaAccessPermission( |
| + WebContents* web_contents, |
| + const content::MediaStreamRequest& request, |
| + const content::MediaResponseCallback& callback) { |
| + if (media_requests_map_.size() >= kNumMaxOutstandingMediaRequests) { |
| + // Deny the media request. |
| + // TODO(lazyboy): We should use timeouts to clear these pending requests if |
| + // decision has not been made. |
|
Charlie Reis
2013/02/13 01:44:47
I thought we were watching for when event.request
lazyboy
2013/02/13 04:07:48
yes (Fady also had the same comment), this should
|
| + callback.Run(content::MediaStreamDevices()); |
| + return; |
| + } |
| + int request_id = current_media_access_request_id_++; |
| + media_requests_map_.insert( |
| + std::make_pair(request_id, |
| + std::make_pair(request, callback))); |
| + |
| + base::DictionaryValue request_info; |
| + request_info.Set( |
| + "url", base::Value::CreateStringValue(request.security_origin.spec())); |
| + SendMessageToEmbedder(new BrowserPluginMsg_RequestPermission( |
| + embedder_routing_id(), instance_id(), "media", request_id, request_info)); |
| +} |
| + |
| void BrowserPluginGuest::OnUpdateRect( |
| const ViewHostMsg_UpdateRect_Params& params) { |