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