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/shared_impl/ppp_instance_combined.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/proxy_lock.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_Instance_Combined* PPP_Instance_Combined::Create(
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Callback<const void*(const char*)> get_interface_func) {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try 1.1.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void* ppp_instance = get_interface_func.Run(PPP_INSTANCE_INTERFACE_1_1);
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppp_instance) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PPP_Instance_1_1* ppp_instance_1_1 =
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<const PPP_Instance_1_1*>(ppp_instance);
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new PPP_Instance_Combined(*ppp_instance_1_1);
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Failing that, try 1.0.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppp_instance = get_interface_func.Run(PPP_INSTANCE_INTERFACE_1_0);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppp_instance) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PPP_Instance_1_0* ppp_instance_1_0 =
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<const PPP_Instance_1_0*>(ppp_instance);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new PPP_Instance_Combined(*ppp_instance_1_0);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No supported PPP_Instance version found.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_Instance_Combined::PPP_Instance_Combined(
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PPP_Instance_1_0& instance_if)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : did_change_view_1_0_(instance_if.DidChangeView) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_1_1_.DidCreate = instance_if.DidCreate;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_1_1_.DidDestroy = instance_if.DidDestroy;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_1_1_.DidChangeView = NULL;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_1_1_.DidChangeFocus = instance_if.DidChangeFocus;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_1_1_.HandleDocumentLoad = instance_if.HandleDocumentLoad;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_Instance_Combined::PPP_Instance_Combined(
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PPP_Instance_1_1& instance_if)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : instance_1_1_(instance_if),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      did_change_view_1_0_(NULL) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool PPP_Instance_Combined::DidCreate(PP_Instance instance,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         uint32_t argc,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const char* argn[],
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const char* argv[]) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CallWhileUnlocked(instance_1_1_.DidCreate, instance, argc, argn, argv);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Combined::DidDestroy(PP_Instance instance) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CallWhileUnlocked(instance_1_1_.DidDestroy, instance);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Combined::DidChangeView(PP_Instance instance,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          PP_Resource view_changed_resource,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const struct PP_Rect* position,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const struct PP_Rect* clip) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (instance_1_1_.DidChangeView) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CallWhileUnlocked(instance_1_1_.DidChangeView,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      instance,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      view_changed_resource);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CallWhileUnlocked(did_change_view_1_0_, instance, position, clip);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Combined::DidChangeFocus(PP_Instance instance,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           PP_Bool has_focus) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CallWhileUnlocked(instance_1_1_.DidChangeFocus, instance, has_focus);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool PPP_Instance_Combined::HandleDocumentLoad(PP_Instance instance,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  PP_Resource url_loader) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CallWhileUnlocked(instance_1_1_.HandleDocumentLoad,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           instance,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           url_loader);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85