pepper_flash_drm_host.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// Use of this source code is governed by a BSD-style license that can be
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// found in the LICENSE file.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com#include "chrome/browser/renderer_host/pepper/pepper_flash_drm_host.h"
69d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
79d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org#if defined(OS_WIN)
89d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org#include <Windows.h>
9fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org#endif
10d537341e16524d1e22ac5e6c8b9c8f274ba1833crobertphillips
1169cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com#include "base/bind.h"
129d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org#include "base/compiler_specific.h"
1381712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com#include "base/logging.h"
14b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com#include "base/memory/ref_counted.h"
15fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org#include "content/public/browser/browser_ppapi_host.h"
16181e9bd9484ece4132e0cc5cfcff602134e5489dbsalomon@google.com#include "content/public/browser/browser_thread.h"
171878651990d7c9da72cf43481432232bbef3550dcommit-bot@chromium.org#include "content/public/browser/child_process_security_policy.h"
181878651990d7c9da72cf43481432232bbef3550dcommit-bot@chromium.org#include "content/public/browser/render_frame_host.h"
1981712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com#include "content/public/common/pepper_plugin_info.h"
20181e9bd9484ece4132e0cc5cfcff602134e5489dbsalomon@google.com#include "ppapi/c/pp_errors.h"
21181e9bd9484ece4132e0cc5cfcff602134e5489dbsalomon@google.com#include "ppapi/host/dispatch_host_message.h"
22383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com#include "ppapi/host/host_message_context.h"
23383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com#include "ppapi/host/ppapi_host.h"
24383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com#include "ppapi/proxy/ppapi_messages.h"
25b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com
26383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com#if defined(USE_AURA)
27383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com#include "ui/aura/window.h"
28383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com#include "ui/aura/window_tree_host.h"
29383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com#endif
30383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com
31181e9bd9484ece4132e0cc5cfcff602134e5489dbsalomon@google.com#if defined(OS_MACOSX)
3281712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com#include "chrome/browser/renderer_host/pepper/monitor_finder_mac.h"
33181e9bd9484ece4132e0cc5cfcff602134e5489dbsalomon@google.com#endif
34181e9bd9484ece4132e0cc5cfcff602134e5489dbsalomon@google.com
35181e9bd9484ece4132e0cc5cfcff602134e5489dbsalomon@google.comusing content::BrowserPpapiHost;
36b5b3168a645802f66233234a06dd5a3764f18018bsalomon@google.com
374b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.orgnamespace chrome {
389d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
39972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.orgnamespace {
4081712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.comconst char kVoucherFilename[] = "plugin.vch";
41c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com}
42afec7ba75962517b17293799d3fc70d39fa7dbf2tomhudson@google.com
43c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com#if defined(OS_WIN)
44f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org// Helper class to get the UI thread which monitor is showing the
45c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com// window associated with the instance's render view. Since we get
4681712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com// called by the IO thread and we cannot block, the first answer is
47c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com// of GetMonitor() may be NULL, but eventually it will contain the
489d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org// right monitor.
499d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.orgclass MonitorFinder : public base::RefCountedThreadSafe<MonitorFinder> {
509d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org public:
519d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  MonitorFinder(int process_id, int render_frame_id)
529d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org      : process_id_(process_id),
539d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org        render_frame_id_(render_frame_id),
54e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com        monitor_(NULL),
5561f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com        request_sent_(0) {}
5661f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com
5761f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com  int64_t GetMonitor() {
5861f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com    // We use |request_sent_| as an atomic boolean so that we
5961f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com    // never have more than one task posted at a given time. We
6061f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com    // do this because we don't know how often our client is going
6161f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com    // to call and we can't cache the |monitor_| value.
62972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    if (InterlockedCompareExchange(&request_sent_, 1, 0) == 0) {
639d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org      content::BrowserThread::PostTask(
649d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org          content::BrowserThread::UI,
659d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org          FROM_HERE,
66972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org          base::Bind(&MonitorFinder::FetchMonitorFromWidget, this));
67972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    }
68972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    return reinterpret_cast<int64_t>(monitor_);
6981712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com  }
70972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org
71c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com private:
729d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  friend class base::RefCountedThreadSafe<MonitorFinder>;
739d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  ~MonitorFinder() {}
749d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
759d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  void FetchMonitorFromWidget() {
769d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    InterlockedExchange(&request_sent_, 0);
779d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    content::RenderFrameHost* rfh =
789d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org        content::RenderFrameHost::FromID(process_id_, render_frame_id_);
79972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    if (!rfh)
8081712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com      return;
8181712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com    gfx::NativeView native_view = rfh->GetNativeView();
829d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org#if defined(USE_AURA)
83972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    aura::WindowTreeHost* host = native_view->GetHost();
849d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    if (!host)
859d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org      return;
869d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    HWND window = host->GetAcceleratedWidget();
879d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org#else
889d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    HWND window = native_view;
899d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org#endif
909d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    HMONITOR monitor = ::MonitorFromWindow(window, MONITOR_DEFAULTTONULL);
91972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    InterlockedExchangePointer(reinterpret_cast<void* volatile*>(&monitor_),
9281712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com                               monitor);
93c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com  }
94afec7ba75962517b17293799d3fc70d39fa7dbf2tomhudson@google.com
95c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com  const int process_id_;
96f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org  const int render_frame_id_;
97c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com  volatile HMONITOR monitor_;
98972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org  volatile long request_sent_;
99c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com};
100c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com#elif !defined(OS_MACOSX)
1012047f00e4698f83499ab91911999a65c21a951c9epoger@google.com// TODO(cpu): Support Linux someday.
102c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.comclass MonitorFinder : public base::RefCountedThreadSafe<MonitorFinder> {
1039d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org public:
1049d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  MonitorFinder(int, int) {}
105e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com  int64_t GetMonitor() { return 0; }
10661f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com
10761f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com private:
10861f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com  friend class base::RefCountedThreadSafe<MonitorFinder>;
10961f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com  ~MonitorFinder() {}
11061f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com};
11161f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com#endif
11261f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com
113972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.orgPepperFlashDRMHost::PepperFlashDRMHost(BrowserPpapiHost* host,
1149d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org                                       PP_Instance instance,
1159d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org                                       PP_Resource resource)
1169d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    : ppapi::host::ResourceHost(host->GetPpapiHost(), instance, resource),
117972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org      weak_factory_(this) {
118972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org  // Grant permissions to read the flash voucher file.
119972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org  int render_process_id;
120972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org  int render_frame_id;
12181712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com  bool success = host->GetRenderFrameIDsForInstance(
122972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org      instance, &render_process_id, &render_frame_id);
123c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com  base::FilePath plugin_dir = host->GetPluginPath().DirName();
1249d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  DCHECK(!plugin_dir.empty() && success);
1259d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  base::FilePath voucher_file = plugin_dir.AppendASCII(kVoucherFilename);
1269d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  content::ChildProcessSecurityPolicy::GetInstance()->GrantReadFile(
1279d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org      render_process_id, voucher_file);
1289d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
1299d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  fetcher_ = new DeviceIDFetcher(render_process_id);
1309d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  monitor_finder_ = new MonitorFinder(render_process_id, render_frame_id);
131972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org  monitor_finder_->GetMonitor();
13281712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com}
13381712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com
13481712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.comPepperFlashDRMHost::~PepperFlashDRMHost() {}
1359d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
136972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.orgint32_t PepperFlashDRMHost::OnResourceMessageReceived(
13781712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com    const IPC::Message& msg,
13881712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com    ppapi::host::HostMessageContext* context) {
1399d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  PPAPI_BEGIN_MESSAGE_MAP(PepperFlashDRMHost, msg)
140972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_FlashDRM_GetDeviceID,
1419d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org                                        OnHostMsgGetDeviceID)
1429d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_FlashDRM_GetHmonitor,
1439d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org                                        OnHostMsgGetHmonitor)
1449d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_FlashDRM_MonitorIsExternal,
1459d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org                                        OnHostMsgMonitorIsExternal)
1469d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  PPAPI_END_MESSAGE_MAP()
1478d033a1b125886c62906d975b5cc28a382064526bsalomon@google.com  return PP_ERROR_FAILED;
14881712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com}
149c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com
150afec7ba75962517b17293799d3fc70d39fa7dbf2tomhudson@google.comint32_t PepperFlashDRMHost::OnHostMsgGetDeviceID(
151c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com    ppapi::host::HostMessageContext* context) {
152f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org  if (!fetcher_->Start(base::Bind(&PepperFlashDRMHost::GotDeviceID,
153c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com                                  weak_factory_.GetWeakPtr(),
1549d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org                                  context->MakeReplyMessageContext()))) {
1559d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    return PP_ERROR_INPROGRESS;
1569d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  }
1579d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  return PP_OK_COMPLETIONPENDING;
1589d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org}
159129b8e3237b80b9d258a8f48e8f54c0073cafbdcsenorblanco@chromium.org
16094b284d719ee5ccd3e2efbd1d7084ec554583bacbsalomon@google.comint32_t PepperFlashDRMHost::OnHostMsgGetHmonitor(
1619d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    ppapi::host::HostMessageContext* context) {
162972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org  int64_t monitor_id = monitor_finder_->GetMonitor();
16394b284d719ee5ccd3e2efbd1d7084ec554583bacbsalomon@google.com  if (monitor_id) {
1649d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    context->reply_msg = PpapiPluginMsg_FlashDRM_GetHmonitorReply(monitor_id);
16594b284d719ee5ccd3e2efbd1d7084ec554583bacbsalomon@google.com    return PP_OK;
16694b284d719ee5ccd3e2efbd1d7084ec554583bacbsalomon@google.com  }
1679d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  return PP_ERROR_FAILED;
1689d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org}
16994b284d719ee5ccd3e2efbd1d7084ec554583bacbsalomon@google.com
1709d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.orgint32_t PepperFlashDRMHost::OnHostMsgMonitorIsExternal(
1719d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    ppapi::host::HostMessageContext* context) {
17294b284d719ee5ccd3e2efbd1d7084ec554583bacbsalomon@google.com  int64_t monitor_id = monitor_finder_->GetMonitor();
1739d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  if (!monitor_id)
1749d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    return PP_ERROR_FAILED;
17594b284d719ee5ccd3e2efbd1d7084ec554583bacbsalomon@google.com
1769d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  PP_Bool is_external = PP_FALSE;
1779d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org#if defined(OS_MACOSX)
1789d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  if (!MonitorFinder::IsMonitorBuiltIn(monitor_id))
1799d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    is_external = PP_TRUE;
1809d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org#endif
1819d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  context->reply_msg =
1829d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org      PpapiPluginMsg_FlashDRM_MonitorIsExternalReply(is_external);
1839d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org  return PP_OK;
1849d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org}
1859d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
1869d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.orgvoid PepperFlashDRMHost::GotDeviceID(
1879d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    ppapi::host::ReplyMessageContext reply_context,
18869cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com    const std::string& id,
189972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    int32_t result) {
1901971317bb43580330a9e7e9a1c09c5025fe84aacbsalomon@google.com  if (id.empty() && result == PP_OK) {
191dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    NOTREACHED();
192dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    result = PP_ERROR_FAILED;
193dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com  }
194dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com  reply_context.params.set_result(result);
195f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org  host()->SendReply(reply_context,
196f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org                    PpapiPluginMsg_FlashDRM_GetDeviceIDReply(id));
197f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org}
198dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com
199f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org}  // namespace chrome
200f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org