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