15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/private/instance_private.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_instance_private.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppp_instance_private.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module_impl.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/private/var_private.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <> const char* interface_name<PPB_Instance_Private>() {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PPB_INSTANCE_PRIVATE_INTERFACE;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var GetInstanceObject(PP_Instance pp_instance) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Module* module_singleton = Module::Get();
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!module_singleton)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Var().Detach();
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstancePrivate* instance_private = static_cast<InstancePrivate*>(
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      module_singleton->InstanceForPPInstance(pp_instance));
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance_private)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Var().Detach();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return instance_private->GetInstanceObject().Detach();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPP_Instance_Private ppp_instance_private = {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &GetInstanceObject
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InstancePrivate::InstancePrivate(PP_Instance instance) : Instance(instance) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If at least 1 InstancePrivate is created, register the PPP_INSTANCE_PRIVATE
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interface.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Module::Get()->AddPluginInterface(PPP_INSTANCE_PRIVATE_INTERFACE,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &ppp_instance_private);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InstancePrivate::~InstancePrivate() {}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Var InstancePrivate::GetInstanceObject() {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Var();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VarPrivate InstancePrivate::GetWindowObject() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!has_interface<PPB_Instance_Private>())
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return VarPrivate();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return VarPrivate(PASS_REF,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      get_interface<PPB_Instance_Private>()->GetWindowObject(pp_instance()));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VarPrivate InstancePrivate::GetOwnerElementObject() {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!has_interface<PPB_Instance_Private>())
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return VarPrivate();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return VarPrivate(PASS_REF,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      get_interface<PPB_Instance_Private>()->GetOwnerElementObject(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pp_instance()));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VarPrivate InstancePrivate::ExecuteScript(const Var& script, Var* exception) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!has_interface<PPB_Instance_Private>())
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return VarPrivate();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return VarPrivate(PASS_REF,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      get_interface<PPB_Instance_Private>()->ExecuteScript(
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pp_instance(),
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          script.pp_var(),
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          VarPrivate::OutException(exception).get()));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace pp
76