diff options
author | kcwu@chromium.org <kcwu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-04 04:40:36 +0000 |
---|---|---|
committer | kcwu@chromium.org <kcwu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-04 04:40:36 +0000 |
commit | a34b90dbff77cdb998bf3af9efa23221e9e09801 (patch) | |
tree | ee744555729949646794c4deeae95a91bb9a77be /ppapi | |
parent | a5be74d14e4184e920792ddde925b3aa5a6e9992 (diff) | |
download | chromium_src-a34b90dbff77cdb998bf3af9efa23221e9e09801.zip chromium_src-a34b90dbff77cdb998bf3af9efa23221e9e09801.tar.gz chromium_src-a34b90dbff77cdb998bf3af9efa23221e9e09801.tar.bz2 |
Pepper API for output protection.
This is only interface part. Implementation will be in another CL.
R=binji@chromium.org, dalecurtis@chromium.org, ddorwin@chromium.org, dmichael@chromium.org
BUG=256538
Review URL: https://chromiumcodereview.appspot.com/23621019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@221149 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi')
-rw-r--r-- | ppapi/api/private/ppb_output_protection_private.idl | 137 | ||||
-rw-r--r-- | ppapi/c/pp_macros.h | 4 | ||||
-rw-r--r-- | ppapi/c/private/ppb_output_protection_private.h | 168 | ||||
-rw-r--r-- | ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c | 40 | ||||
-rw-r--r-- | ppapi/thunk/ppb_output_protection_private_thunk.cc | 78 |
5 files changed, 425 insertions, 2 deletions
diff --git a/ppapi/api/private/ppb_output_protection_private.idl b/ppapi/api/private/ppb_output_protection_private.idl new file mode 100644 index 0000000..395d253 --- /dev/null +++ b/ppapi/api/private/ppb_output_protection_private.idl @@ -0,0 +1,137 @@ +/* Copyright 2013 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/** + * This file defines the API for output protection. Currently, it only supports + * Chrome OS. + */ + +[generate_thunk] + +label Chrome { + M31 = 0.1 +}; + +/** + * Content protection methods applied on video output link. + */ +[assert_size(4)] enum PP_OutputProtectionMethod_Private { + PP_OUTPUT_PROTECTION_METHOD_PRIVATE_NONE = 0, + PP_OUTPUT_PROTECTION_METHOD_PRIVATE_HDCP = 1 << 0 +}; + +/** + * Video output link types. + */ +[assert_size(4)] enum PP_OutputProtectionLinkType_Private { + PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_NONE = 0, + PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_UNKNOWN = 1 << 0, + PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_INTERNAL = 1 << 1, + PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_VGA = 1 << 2, + PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_HDMI = 1 << 3, + PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_DVI = 1 << 4, + PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_DISPLAYPORT = 1 << 5 +}; + +/** + * The <code>PPB_OutputProtection_Private</code> interface allows controlling + * output protection. + * + * <strong>Example:</strong> + * + * @code + * op = output_protection->Create(instance); + * output_protection->QueryStatus(op, &link_mask, &protection_mask, + * done_callback); + * @endcode + * + * In this example, the plugin wants to enforce HDCP for HDMI link. + * @code + * if (link_mask & PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_HDMI) { + * output_protection->EnableProtection( + * op, PP_OUTPUT_PROTECTION_METHOD_PRIVATE_HDCP, done_callback); + * } + * @endcode + * + * After EnableProtection() completes, the plugin has to query protection + * status periodically to make sure the protection is enabled and remains + * enabled. + */ +interface PPB_OutputProtection_Private { + /** + * Create() creates a new <code>PPB_OutputProtection_Private</code> object. + * + * @pram[in] instance A <code>PP_Instance</code> identifying one instance of + * a module. + * + * @return A <code>PP_Resource</code> corresponding to a + * <code>PPB_OutputProtection_Private</code> if successful, 0 if creation + * failed. + */ + PP_Resource Create([in] PP_Instance instance); + + /** + * IsOutputProtection() determines if the provided resource is a + * <code>PPB_OutputProtection_Private</code>. + * + * @param[in] resource A <code>PP_Resource</code> corresponding to a + * <code>PPB_OutputProtection_Private</code>. + * + * @return <code>PP_TRUE</code> if the resource is a + * <code>PPB_OutputProtection_Private</code>, <code>PP_FALSE</code> if the + * resource is invalid or some type other than + * <code>PPB_OutputProtection_Private</code>. + */ + PP_Bool IsOutputProtection([in] PP_Resource resource); + + /** + * Query link status and protection status. + * Clients have to query status periodically in order to detect changes. + * + * @param[in] resource A <code>PP_Resource</code> corresponding to a + * <code>PPB_OutputProtection_Private</code>. + * @param[out] link_mask The type of connected output links, which is a + * bit-mask of the <code>PP_OutputProtectionLinkType_Private</code> values. + * @param[out] protection_mask Enabled protection methods, which is a + * bit-mask of the <code>PP_OutputProtectionMethod_Private</code> values. + * @param[in] callback A <code>PP_CompletionCallback</code> to run on + * asynchronous completion of QueryStatus(). This callback will only run if + * QueryStatus() returns <code>PP_OK_COMPLETIONPENDING</code>. + * + * @return An int32_t containing an error code from <code>pp_errors.h</code>. + */ + int32_t QueryStatus( + [in] PP_Resource resource, + [out] uint32_t link_mask, + [out] uint32_t protection_mask, + [in] PP_CompletionCallback callback); + + /** + * Set desired protection methods. + * + * When the desired protection method(s) have been applied to all applicable + * output links, the relevant bit(s) of the protection_mask returned by + * QueryStatus() will be set. Otherwise, the relevant bit(s) of + * protection_mask will not be set; there is no separate error code or + * callback. + * + * Protections will be disabled if no longer desired by all instances. + * + * @param[in] resource A <code>PP_Resource</code> corresponding to a + * <code>PPB_OutputProtection_Private</code>. + * @param[in] desired_protection_mask The desired protection methods, which + * is a bit-mask of the <code>PP_OutputProtectionMethod_Private</code> + * values. + * @param[in] callback A <code>PP_CompletionCallback</code> to be called when + * the protection request has been made. This may be before the protection + * have actually been applied. Call QueryStatus to get protection status. + * + * @return An int32_t containing an error code from <code>pp_errors.h</code>. + */ + int32_t EnableProtection( + [in] PP_Resource resource, + [in] uint32_t desired_protection_mask, + [in] PP_CompletionCallback callback); +}; diff --git a/ppapi/c/pp_macros.h b/ppapi/c/pp_macros.h index 97a4229..a552885 100644 --- a/ppapi/c/pp_macros.h +++ b/ppapi/c/pp_macros.h @@ -3,13 +3,13 @@ * found in the LICENSE file. */ -/* From pp_macros.idl modified Tue Jul 2 14:15:05 2013. */ +/* From pp_macros.idl modified Wed Apr 10 11:57:14 2013. */ #ifndef PPAPI_C_PP_MACROS_H_ #define PPAPI_C_PP_MACROS_H_ -#define PPAPI_RELEASE 30 +#define PPAPI_RELEASE 31 /** * @file diff --git a/ppapi/c/private/ppb_output_protection_private.h b/ppapi/c/private/ppb_output_protection_private.h new file mode 100644 index 0000000..d0438be --- /dev/null +++ b/ppapi/c/private/ppb_output_protection_private.h @@ -0,0 +1,168 @@ +/* Copyright 2013 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* From private/ppb_output_protection_private.idl, + * modified Sat Aug 31 03:18:39 2013. + */ + +#ifndef PPAPI_C_PRIVATE_PPB_OUTPUT_PROTECTION_PRIVATE_H_ +#define PPAPI_C_PRIVATE_PPB_OUTPUT_PROTECTION_PRIVATE_H_ + +#include "ppapi/c/pp_bool.h" +#include "ppapi/c/pp_completion_callback.h" +#include "ppapi/c/pp_instance.h" +#include "ppapi/c/pp_macros.h" +#include "ppapi/c/pp_resource.h" +#include "ppapi/c/pp_stdint.h" + +#define PPB_OUTPUTPROTECTION_PRIVATE_INTERFACE_0_1 \ + "PPB_OutputProtection_Private;0.1" +#define PPB_OUTPUTPROTECTION_PRIVATE_INTERFACE \ + PPB_OUTPUTPROTECTION_PRIVATE_INTERFACE_0_1 + +/** + * @file + * This file defines the API for output protection. Currently, it only supports + * Chrome OS. + */ + + +/** + * @addtogroup Enums + * @{ + */ +/** + * Content protection methods applied on video output link. + */ +typedef enum { + PP_OUTPUT_PROTECTION_METHOD_PRIVATE_NONE = 0, + PP_OUTPUT_PROTECTION_METHOD_PRIVATE_HDCP = 1 << 0 +} PP_OutputProtectionMethod_Private; +PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_OutputProtectionMethod_Private, 4); + +/** + * Video output link types. + */ +typedef enum { + PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_NONE = 0, + PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_UNKNOWN = 1 << 0, + PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_INTERNAL = 1 << 1, + PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_VGA = 1 << 2, + PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_HDMI = 1 << 3, + PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_DVI = 1 << 4, + PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_DISPLAYPORT = 1 << 5 +} PP_OutputProtectionLinkType_Private; +PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_OutputProtectionLinkType_Private, 4); +/** + * @} + */ + +/** + * @addtogroup Interfaces + * @{ + */ +/** + * The <code>PPB_OutputProtection_Private</code> interface allows controlling + * output protection. + * + * <strong>Example:</strong> + * + * @code + * op = output_protection->Create(instance); + * output_protection->QueryStatus(op, &link_mask, &protection_mask, + * done_callback); + * @endcode + * + * In this example, the plugin wants to enforce HDCP for HDMI link. + * @code + * if (link_mask & PP_OUTPUT_PROTECTION_LINK_TYPE_PRIVATE_HDMI) { + * output_protection->EnableProtection( + * op, PP_OUTPUT_PROTECTION_METHOD_PRIVATE_HDCP, done_callback); + * } + * @endcode + * + * After EnableProtection() completes, the plugin has to query protection + * status periodically to make sure the protection is enabled and remains + * enabled. + */ +struct PPB_OutputProtection_Private_0_1 { + /** + * Create() creates a new <code>PPB_OutputProtection_Private</code> object. + * + * @pram[in] instance A <code>PP_Instance</code> identifying one instance of + * a module. + * + * @return A <code>PP_Resource</code> corresponding to a + * <code>PPB_OutputProtection_Private</code> if successful, 0 if creation + * failed. + */ + PP_Resource (*Create)(PP_Instance instance); + /** + * IsOutputProtection() determines if the provided resource is a + * <code>PPB_OutputProtection_Private</code>. + * + * @param[in] resource A <code>PP_Resource</code> corresponding to a + * <code>PPB_OutputProtection_Private</code>. + * + * @return <code>PP_TRUE</code> if the resource is a + * <code>PPB_OutputProtection_Private</code>, <code>PP_FALSE</code> if the + * resource is invalid or some type other than + * <code>PPB_OutputProtection_Private</code>. + */ + PP_Bool (*IsOutputProtection)(PP_Resource resource); + /** + * Query link status and protection status. + * Clients have to query status periodically in order to detect changes. + * + * @param[in] resource A <code>PP_Resource</code> corresponding to a + * <code>PPB_OutputProtection_Private</code>. + * @param[out] link_mask The type of connected output links, which is a + * bit-mask of the <code>PP_OutputProtectionLinkType_Private</code> values. + * @param[out] protection_mask Enabled protection methods, which is a + * bit-mask of the <code>PP_OutputProtectionMethod_Private</code> values. + * @param[in] callback A <code>PP_CompletionCallback</code> to run on + * asynchronous completion of QueryStatus(). This callback will only run if + * QueryStatus() returns <code>PP_OK_COMPLETIONPENDING</code>. + * + * @return An int32_t containing an error code from <code>pp_errors.h</code>. + */ + int32_t (*QueryStatus)(PP_Resource resource, + uint32_t* link_mask, + uint32_t* protection_mask, + struct PP_CompletionCallback callback); + /** + * Set desired protection methods. + * + * When the desired protection method(s) have been applied to all applicable + * output links, the relevant bit(s) of the protection_mask returned by + * QueryStatus() will be set. Otherwise, the relevant bit(s) of + * protection_mask will not be set; there is no separate error code or + * callback. + * + * Protections will be disabled if no longer desired by all instances. + * + * @param[in] resource A <code>PP_Resource</code> corresponding to a + * <code>PPB_OutputProtection_Private</code>. + * @param[in] desired_protection_mask The desired protection methods, which + * is a bit-mask of the <code>PP_OutputProtectionMethod_Private</code> + * values. + * @param[in] callback A <code>PP_CompletionCallback</code> to be called when + * the protection request has been made. This may be before the protection + * have actually been applied. Call QueryStatus to get protection status. + * + * @return An int32_t containing an error code from <code>pp_errors.h</code>. + */ + int32_t (*EnableProtection)(PP_Resource resource, + uint32_t desired_protection_mask, + struct PP_CompletionCallback callback); +}; + +typedef struct PPB_OutputProtection_Private_0_1 PPB_OutputProtection_Private; +/** + * @} + */ + +#endif /* PPAPI_C_PRIVATE_PPB_OUTPUT_PROTECTION_PRIVATE_H_ */ + diff --git a/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c b/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c index 1578e6c5..50268de 100644 --- a/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c +++ b/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c @@ -101,6 +101,7 @@ #include "ppapi/c/private/ppb_net_address_private.h" #include "ppapi/c/private/ppb_network_list_private.h" #include "ppapi/c/private/ppb_network_monitor_private.h" +#include "ppapi/c/private/ppb_output_protection_private.h" #include "ppapi/c/private/ppb_talk_private.h" #include "ppapi/c/private/ppb_tcp_server_socket_private.h" #include "ppapi/c/private/ppb_tcp_socket_private.h" @@ -207,6 +208,7 @@ static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetAddress_Private_0_1; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetAddress_Private_1_0; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetAddress_Private_1_1; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetworkList_Private_0_2; +static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_OutputProtection_Private_0_1; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_Talk_Private_1_0; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_Talk_Private_2_0; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPServerSocket_Private_0_1; @@ -3056,6 +3058,30 @@ static uint32_t Pnacl_M19_PPB_NetworkList_Private_GetMTU(PP_Resource resource, u /* Not generating wrapper methods for PPB_NetworkMonitor_Private_0_2 */ +/* Begin wrapper methods for PPB_OutputProtection_Private_0_1 */ + +static PP_Resource Pnacl_M31_PPB_OutputProtection_Private_Create(PP_Instance instance) { + const struct PPB_OutputProtection_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_OutputProtection_Private_0_1.real_iface; + return iface->Create(instance); +} + +static PP_Bool Pnacl_M31_PPB_OutputProtection_Private_IsOutputProtection(PP_Resource resource) { + const struct PPB_OutputProtection_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_OutputProtection_Private_0_1.real_iface; + return iface->IsOutputProtection(resource); +} + +static int32_t Pnacl_M31_PPB_OutputProtection_Private_QueryStatus(PP_Resource resource, uint32_t* link_mask, uint32_t* protection_mask, struct PP_CompletionCallback* callback) { + const struct PPB_OutputProtection_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_OutputProtection_Private_0_1.real_iface; + return iface->QueryStatus(resource, link_mask, protection_mask, *callback); +} + +static int32_t Pnacl_M31_PPB_OutputProtection_Private_EnableProtection(PP_Resource resource, uint32_t desired_protection_mask, struct PP_CompletionCallback* callback) { + const struct PPB_OutputProtection_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_OutputProtection_Private_0_1.real_iface; + return iface->EnableProtection(resource, desired_protection_mask, *callback); +} + +/* End wrapper methods for PPB_OutputProtection_Private_0_1 */ + /* Begin wrapper methods for PPB_Talk_Private_1_0 */ static PP_Resource Pnacl_M19_PPB_Talk_Private_Create(PP_Instance instance) { @@ -4712,6 +4738,13 @@ struct PPB_NetworkList_Private_0_2 Pnacl_Wrappers_PPB_NetworkList_Private_0_2 = /* Not generating wrapper interface for PPB_NetworkMonitor_Private_0_2 */ +struct PPB_OutputProtection_Private_0_1 Pnacl_Wrappers_PPB_OutputProtection_Private_0_1 = { + .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M31_PPB_OutputProtection_Private_Create, + .IsOutputProtection = (PP_Bool (*)(PP_Resource resource))&Pnacl_M31_PPB_OutputProtection_Private_IsOutputProtection, + .QueryStatus = (int32_t (*)(PP_Resource resource, uint32_t* link_mask, uint32_t* protection_mask, struct PP_CompletionCallback callback))&Pnacl_M31_PPB_OutputProtection_Private_QueryStatus, + .EnableProtection = (int32_t (*)(PP_Resource resource, uint32_t desired_protection_mask, struct PP_CompletionCallback callback))&Pnacl_M31_PPB_OutputProtection_Private_EnableProtection +}; + struct PPB_Talk_Private_1_0 Pnacl_Wrappers_PPB_Talk_Private_1_0 = { .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M19_PPB_Talk_Private_Create, .GetPermission = (int32_t (*)(PP_Resource talk_resource, struct PP_CompletionCallback callback))&Pnacl_M19_PPB_Talk_Private_GetPermission @@ -5367,6 +5400,12 @@ static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetworkList_Private_0_2 = .real_iface = NULL }; +static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_OutputProtection_Private_0_1 = { + .iface_macro = PPB_OUTPUTPROTECTION_PRIVATE_INTERFACE_0_1, + .wrapped_iface = (void *) &Pnacl_Wrappers_PPB_OutputProtection_Private_0_1, + .real_iface = NULL +}; + static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_Talk_Private_1_0 = { .iface_macro = PPB_TALK_PRIVATE_INTERFACE_1_0, .wrapped_iface = (void *) &Pnacl_Wrappers_PPB_Talk_Private_1_0, @@ -5560,6 +5599,7 @@ static struct __PnaclWrapperInfo *s_ppb_wrappers[] = { &Pnacl_WrapperInfo_PPB_NetAddress_Private_1_0, &Pnacl_WrapperInfo_PPB_NetAddress_Private_1_1, &Pnacl_WrapperInfo_PPB_NetworkList_Private_0_2, + &Pnacl_WrapperInfo_PPB_OutputProtection_Private_0_1, &Pnacl_WrapperInfo_PPB_Talk_Private_1_0, &Pnacl_WrapperInfo_PPB_Talk_Private_2_0, &Pnacl_WrapperInfo_PPB_TCPServerSocket_Private_0_1, diff --git a/ppapi/thunk/ppb_output_protection_private_thunk.cc b/ppapi/thunk/ppb_output_protection_private_thunk.cc new file mode 100644 index 0000000..8708806 --- /dev/null +++ b/ppapi/thunk/ppb_output_protection_private_thunk.cc @@ -0,0 +1,78 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// From private/ppb_output_protection_private.idl, +// modified Thu Aug 29 13:39:04 2013. + +#include "ppapi/c/pp_completion_callback.h" +#include "ppapi/c/pp_errors.h" +#include "ppapi/c/private/ppb_output_protection_private.h" +#include "ppapi/shared_impl/tracked_callback.h" +#include "ppapi/thunk/enter.h" +#include "ppapi/thunk/ppb_instance_api.h" +#include "ppapi/thunk/ppb_output_protection_api.h" +#include "ppapi/thunk/resource_creation_api.h" +#include "ppapi/thunk/thunk.h" + +namespace ppapi { +namespace thunk { + +namespace { + +PP_Resource Create(PP_Instance instance) { + VLOG(4) << "PPB_OutputProtection_Private::Create()"; + EnterResourceCreation enter(instance); + if (enter.failed()) + return 0; + return enter.functions()->CreateOutputProtectionPrivate(instance); +} + +PP_Bool IsOutputProtection(PP_Resource resource) { + VLOG(4) << "PPB_OutputProtection_Private::IsOutputProtection()"; + EnterResource<PPB_OutputProtection_API> enter(resource, false); + return PP_FromBool(enter.succeeded()); +} + +int32_t QueryStatus(PP_Resource resource, + uint32_t* link_mask, + uint32_t* protection_mask, + struct PP_CompletionCallback callback) { + VLOG(4) << "PPB_OutputProtection_Private::QueryStatus()"; + EnterResource<PPB_OutputProtection_API> enter(resource, callback, true); + if (enter.failed()) + return enter.retval(); + return enter.SetResult(enter.object()->QueryStatus(link_mask, + protection_mask, + enter.callback())); +} + +int32_t EnableProtection(PP_Resource resource, + uint32_t desired_protection_mask, + struct PP_CompletionCallback callback) { + VLOG(4) << "PPB_OutputProtection_Private::EnableProtection()"; + EnterResource<PPB_OutputProtection_API> enter(resource, callback, true); + if (enter.failed()) + return enter.retval(); + return enter.SetResult(enter.object()->EnableProtection( + desired_protection_mask, + enter.callback())); +} + +const PPB_OutputProtection_Private_0_1 + g_ppb_outputprotection_private_thunk_0_1 = { + &Create, + &IsOutputProtection, + &QueryStatus, + &EnableProtection +}; + +} // namespace + +const PPB_OutputProtection_Private_0_1* + GetPPB_OutputProtection_Private_0_1_Thunk() { + return &g_ppb_outputprotection_private_thunk_0_1; +} + +} // namespace thunk +} // namespace ppapi |