pepper_talk_host.cc revision 868fa2fe829687343ffae624259930155e16dbd8
14ee2ad04344446e610172a0e73949212923014dfSebastian Redl// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// Use of this source code is governed by a BSD-style license that can be 32cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// found in the LICENSE file. 42cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 52cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/renderer_host/pepper/pepper_talk_host.h" 62cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 72cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "base/bind.h" 82cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "content/public/browser/browser_ppapi_host.h" 92cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "content/public/browser/browser_thread.h" 10a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#include "content/public/browser/render_view_host.h" 112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "grit/generated_resources.h" 122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "ppapi/c/pp_errors.h" 132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "ppapi/host/dispatch_host_message.h" 147faa2ec03a7ef120ac165bb45b6c70a8b20c9f1cSebastian Redl#include "ppapi/host/host_message_context.h" 1589d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor#include "ppapi/host/ppapi_host.h" 160eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis#include "ppapi/proxy/ppapi_messages.h" 17e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "ui/base/l10n/l10n_util.h" 18e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor 192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#if defined(USE_ASH) 202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "ash/shell.h" 212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "ash/shell_window_ids.h" 222a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall#include "chrome/browser/ui/simple_message_box.h" 2389eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis#include "ui/aura/window.h" 240b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor#endif 257a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall 262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregornamespace chrome { 27a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 286ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redlnamespace { 297c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 306a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregorppapi::host::ReplyMessageContext GetPermissionOnUIThread( 317c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner int render_process_id, 3283d63c78810556d26b62ac4cbae2eda6cdd2570cSteve Naroff int render_view_id, 3314f79002e58556798e86168c63e48d533287eda5Douglas Gregor ppapi::host::ReplyMessageContext reply) { 3410e286aa8d39fb51a21412850265d9dae74613eeChris Lattner DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 353251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor reply.params.set_result(0); 3614f79002e58556798e86168c63e48d533287eda5Douglas Gregor 37bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor content::RenderViewHost* render_view_host = 382bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor content::RenderViewHost::FromID(render_process_id, render_view_id); 39ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor if (!render_view_host) 400a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor return reply; // RVH destroyed while task was pending. 4117fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor 4217fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor#if defined(USE_ASH) 432596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar // TODO(brettw). We should not be grabbing the active toplevel window, we 442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor // should use the toplevel window associated with the render view. 45fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer const string16 title = l10n_util::GetStringUTF16( 4614f79002e58556798e86168c63e48d533287eda5Douglas Gregor IDS_GTALK_SCREEN_SHARE_DIALOG_TITLE); 4703013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer const string16 message = l10n_util::GetStringUTF16( 483c304bd9ec2b4611572d4cbae9e1727bbecb5dc9Chris Lattner IDS_GTALK_SCREEN_SHARE_DIALOG_MESSAGE); 49cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 502cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor aura::Window* parent = ash::Shell::GetContainer( 518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl ash::Shell::GetActiveRootWindow(), 522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor ash::internal::kShellWindowId_SystemModalContainer); 53ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl reply.params.set_result(static_cast<int32_t>( 546e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer chrome::ShowMessageBox(parent, title, message, 556e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer chrome::MESSAGE_BOX_TYPE_QUESTION) == 566e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer chrome::MESSAGE_BOX_RESULT_YES)); 576e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#else 58ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl NOTIMPLEMENTED(); 596e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#endif 606e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer return reply; 616e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer} 626e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer 636e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer} // namespace 64ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl 65ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian RedlPepperTalkHost::PepperTalkHost(content::BrowserPpapiHost* host, 662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor PP_Instance instance, 672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor PP_Resource resource) 682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor : ppapi::host::ResourceHost(host->GetPpapiHost(), instance, resource), 6912b1c7615d4f9a2edc544be499f895f16ac100edChris Lattner weak_factory_(this), 702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor browser_ppapi_host_(host) { 713397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl} 72a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl 7389eaf3af92c72c0c1aae807644e39cabc461d685Argyrios KyrtzidisPepperTalkHost::~PepperTalkHost() { 742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorint32_t PepperTalkHost::OnResourceMessageReceived( 778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl const IPC::Message& msg, 782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor ppapi::host::HostMessageContext* context) { 7989eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis IPC_BEGIN_MESSAGE_MAP(PepperTalkHost, msg) 808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_Talk_RequestPermission, 812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor OnRequestPermission) 822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_Talk_StartRemoting, 832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor OnStartRemoting) 842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_Talk_StopRemoting, 852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor OnStopRemoting) 862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor IPC_END_MESSAGE_MAP() 872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return PP_ERROR_FAILED; 882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorint32_t PepperTalkHost::OnRequestPermission( 912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor ppapi::host::HostMessageContext* context, 923397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl PP_TalkPermission permission) { 932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor // TODO(dcaiafa): Implement support for other permission types. 942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (permission != PP_TALKPERMISSION_SCREENCAST) 952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return PP_ERROR_BADARGUMENT; 963397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor int render_process_id = 0; 988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl int render_view_id = 0; 992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor browser_ppapi_host_->GetRenderViewIDsForInstance( 1002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor pp_instance(), &render_process_id, &render_view_id); 1013397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 1022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor content::BrowserThread::PostTaskAndReplyWithResult( 1038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl content::BrowserThread::UI, FROM_HERE, 1042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor base::Bind(&GetPermissionOnUIThread, render_process_id, render_view_id, 1052cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor context->MakeReplyMessageContext()), 1063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl base::Bind(&PepperTalkHost::GotTalkPermission, 1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump weak_factory_.GetWeakPtr())); 1088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl return PP_OK_COMPLETIONPENDING; 1092cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1113397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlvoid PepperTalkHost::GotTalkPermission( 112df1550fc59b51681d37225934fe4e3acac321621Richard Smith ppapi::host::ReplyMessageContext reply) { 113df1550fc59b51681d37225934fe4e3acac321621Richard Smith DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 1148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl host()->SendReply(reply, PpapiPluginMsg_Talk_RequestPermissionReply()); 1152cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1173397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlint32_t PepperTalkHost::OnStartRemoting( 118df1550fc59b51681d37225934fe4e3acac321621Richard Smith ppapi::host::HostMessageContext* context) { 1198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl // TODO(dcaiafa): Request IPC audit when this is implemented 1202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor NOTIMPLEMENTED(); 1212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return PP_ERROR_FAILED; 1223397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl} 1231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpint32_t PepperTalkHost::OnStopRemoting( 1258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl ppapi::host::HostMessageContext* context) { 1262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor // TODO(dcaiafa): Request IPC audit when this is implemented 1272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor NOTIMPLEMENTED(); 1283397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl return PP_ERROR_FAILED; 1292cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall} // namespace chrome 1322cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor