12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/renderer_host/pepper/pepper_talk_host.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_ppapi_host.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_view_host.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/generated_resources.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_errors.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ppapi/host/dispatch_host_message.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/host_message_context.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/ppapi_host.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_window_ids.h" 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/system/tray/system_tray_notifier.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/simple_message_box.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chrome { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ppapi::host::ReplyMessageContext GetPermissionOnUIThread( 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_TalkPermission permission, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int render_process_id, 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int render_view_id, 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::ReplyMessageContext reply) { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reply.params.set_result(0); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderViewHost* render_view_host = 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RenderViewHost::FromID(render_process_id, render_view_id); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!render_view_host) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return reply; // RVH destroyed while task was pending. 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH) 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch string16 title; 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch string16 message; 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switch (permission) { 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case PP_TALKPERMISSION_SCREENCAST: 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch title = l10n_util::GetStringUTF16(IDS_GTALK_SCREEN_SHARE_DIALOG_TITLE); 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch message = l10n_util::GetStringUTF16( 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_GTALK_SCREEN_SHARE_DIALOG_MESSAGE); 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case PP_TALKPERMISSION_REMOTING: 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch title = l10n_util::GetStringUTF16(IDS_GTALK_REMOTING_DIALOG_TITLE); 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch message = l10n_util::GetStringUTF16( 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_GTALK_REMOTING_DIALOG_MESSAGE); 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case PP_TALKPERMISSION_REMOTING_CONTINUE: 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch title = l10n_util::GetStringUTF16(IDS_GTALK_REMOTING_DIALOG_TITLE); 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch message = l10n_util::GetStringUTF16( 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDS_GTALK_REMOTING_CONTINUE_DIALOG_MESSAGE); 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch default: 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return reply; 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(brettw). We should not be grabbing the active toplevel window, we 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should use the toplevel window associated with the render view. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* parent = ash::Shell::GetContainer( 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::Shell::GetActiveRootWindow(), 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::internal::kShellWindowId_SystemModalContainer); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reply.params.set_result(static_cast<int32_t>( 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::ShowMessageBox(parent, title, message, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::MESSAGE_BOX_TYPE_QUESTION) == 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::MESSAGE_BOX_RESULT_YES)); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTIMPLEMENTED(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return reply; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid OnTerminateRemotingEventOnUIThread(const base::Closure& stop_callback) { 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch stop_callback); 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochppapi::host::ReplyMessageContext StartRemotingOnUIThread( 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Closure& stop_callback, 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int render_process_id, 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int render_view_id, 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ppapi::host::ReplyMessageContext reply) { 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::RenderViewHost* render_view_host = 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::RenderViewHost::FromID(render_process_id, render_view_id); 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!render_view_host) { 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch reply.params.set_result(PP_ERROR_FAILED); 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return reply; // RVH destroyed while task was pending. 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_ASH) && defined(OS_CHROMEOS) 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Closure stop_callback_ui_thread = base::Bind( 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &OnTerminateRemotingEventOnUIThread, 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch stop_callback); 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ash::Shell::GetInstance()->system_tray_notifier()->NotifyScreenShareStart( 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch stop_callback_ui_thread, base::string16()); 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch reply.params.set_result(PP_OK); 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTIMPLEMENTED(); 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch reply.params.set_result(PP_ERROR_NOTSUPPORTED); 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return reply; 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid StopRemotingOnUIThread() { 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_ASH) && defined(OS_CHROMEOS) 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (ash::Shell::GetInstance()) { 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ash::Shell::GetInstance()->system_tray_notifier()->NotifyScreenShareStop(); 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTIMPLEMENTED(); 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochppapi::host::ReplyMessageContext StopRemotingOnUIThreadWithResult( 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ppapi::host::ReplyMessageContext reply) { 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch reply.params.set_result(PP_OK); 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch StopRemotingOnUIThread(); 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return reply; 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PepperTalkHost::PepperTalkHost(content::BrowserPpapiHost* host, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Instance instance, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Resource resource) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ppapi::host::ResourceHost(host->GetPpapiHost(), instance, resource), 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) weak_factory_(this), 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser_ppapi_host_(host), 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch remoting_started_(false) { 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PepperTalkHost::~PepperTalkHost() { 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (remoting_started_) { 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::BrowserThread::PostTask( 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::BrowserThread::UI, FROM_HERE, 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&StopRemotingOnUIThread)); 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t PepperTalkHost::OnResourceMessageReceived( 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPC::Message& msg, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::HostMessageContext* context) { 157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(PepperTalkHost, msg) 158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_Talk_RequestPermission, 159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnRequestPermission) 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_Talk_StartRemoting, 161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnStartRemoting) 162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_Talk_StopRemoting, 163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnStopRemoting) 164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) IPC_END_MESSAGE_MAP() 165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return PP_ERROR_FAILED; 166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)int32_t PepperTalkHost::OnRequestPermission( 169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ppapi::host::HostMessageContext* context, 170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PP_TalkPermission permission) { 171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (permission < PP_TALKPERMISSION_SCREENCAST || 172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch permission >= PP_TALKPERMISSION_NUM_PERMISSIONS) 173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return PP_ERROR_BADARGUMENT; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int render_process_id = 0; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int render_view_id = 0; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_ppapi_host_->GetRenderViewIDsForInstance( 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_instance(), &render_process_id, &render_view_id); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserThread::PostTaskAndReplyWithResult( 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::BrowserThread::UI, FROM_HERE, 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&GetPermissionOnUIThread, permission, render_process_id, 183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch render_view_id, context->MakeReplyMessageContext()), 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&PepperTalkHost::OnRequestPermissionCompleted, 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch weak_factory_.GetWeakPtr())); 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PP_OK_COMPLETIONPENDING; 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t PepperTalkHost::OnStartRemoting( 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ppapi::host::HostMessageContext* context) { 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int render_process_id = 0; 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int render_view_id = 0; 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser_ppapi_host_->GetRenderViewIDsForInstance( 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp_instance(), &render_process_id, &render_view_id); 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Closure remoting_stop_callback = base::Bind( 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &PepperTalkHost::OnRemotingStopEvent, 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch weak_factory_.GetWeakPtr()); 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::BrowserThread::PostTaskAndReplyWithResult( 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::BrowserThread::UI, FROM_HERE, 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&StartRemotingOnUIThread, remoting_stop_callback, 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch render_process_id, render_view_id, 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch context->MakeReplyMessageContext()), 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&PepperTalkHost::OnStartRemotingCompleted, 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch weak_factory_.GetWeakPtr())); 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PP_OK_COMPLETIONPENDING; 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t PepperTalkHost::OnStopRemoting( 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ppapi::host::HostMessageContext* context) { 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::BrowserThread::PostTaskAndReplyWithResult( 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::BrowserThread::UI, FROM_HERE, 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&StopRemotingOnUIThreadWithResult, 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context->MakeReplyMessageContext()), 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&PepperTalkHost::OnStopRemotingCompleted, 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) weak_factory_.GetWeakPtr())); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PepperTalkHost::OnRemotingStopEvent() { 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch remoting_started_ = false; 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host()->SendUnsolicitedReply( 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp_resource(), PpapiPluginMsg_Talk_NotifyEvent(PP_TALKEVENT_TERMINATE)); 226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PepperTalkHost::OnRequestPermissionCompleted( 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::ReplyMessageContext reply) { 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) host()->SendReply(reply, PpapiPluginMsg_Talk_RequestPermissionReply()); 232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PepperTalkHost::OnStartRemotingCompleted( 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ppapi::host::ReplyMessageContext reply) { 236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Remember to hide remoting UI when resource is deleted. 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (reply.params.result() == PP_OK) 239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch remoting_started_ = true; 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host()->SendReply(reply, PpapiPluginMsg_Talk_StartRemotingReply()); 242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PepperTalkHost::OnStopRemotingCompleted( 245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ppapi::host::ReplyMessageContext reply) { 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch remoting_started_ = false; 248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host()->SendReply(reply, PpapiPluginMsg_Talk_StopRemotingReply()); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chrome 252