16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file.
46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/renderer/pepper/v8object_var.h"
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/logging.h"
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/renderer/pepper_plugin_instance.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/renderer/pepper/host_globals.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ppapi/c/pp_var.h"
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace ppapi {
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// V8ObjectVar -----------------------------------------------------------------
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)V8ObjectVar::V8ObjectVar(PP_Instance instance,
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                         v8::Handle<v8::Object> v8_object)
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : instance_(content::HostGlobals::Get()->GetInstance(instance)) {
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  v8_object_.Reset(instance_->GetIsolate(), v8_object);
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  content::HostGlobals::Get()->host_var_tracker()->AddV8ObjectVar(this);
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)V8ObjectVar::~V8ObjectVar() {
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (instance_)
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    content::HostGlobals::Get()->host_var_tracker()->RemoveV8ObjectVar(this);
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  v8_object_.Reset();
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)V8ObjectVar* V8ObjectVar::AsV8ObjectVar() {
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return this;
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)PP_VarType V8ObjectVar::GetType() const {
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return PP_VARTYPE_OBJECT;
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)v8::Local<v8::Object> V8ObjectVar::GetHandle() const {
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (instance_)
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return v8::Local<v8::Object>::New(instance_->GetIsolate(), v8_object_);
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return v8::Local<v8::Object>();
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void V8ObjectVar::InstanceDeleted() {
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // This is called by the HostVarTracker which will take care of removing us
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // from its set.
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(instance_);
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  instance_ = NULL;
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// static
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)scoped_refptr<V8ObjectVar> V8ObjectVar::FromPPVar(PP_Var var) {
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (var.type != PP_VARTYPE_OBJECT)
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return scoped_refptr<V8ObjectVar>(NULL);
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_refptr<Var> var_object(
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      PpapiGlobals::Get()->GetVarTracker()->GetVar(var));
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!var_object.get())
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return scoped_refptr<V8ObjectVar>();
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return scoped_refptr<V8ObjectVar>(var_object->AsV8ObjectVar());
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace ppapi
63