1// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_RENDERER_PEPPER_PLUGIN_OBJECT_H_
6#define CONTENT_RENDERER_PEPPER_PLUGIN_OBJECT_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/memory/weak_ptr.h"
12#include "gin/interceptor.h"
13#include "gin/wrappable.h"
14#include "ppapi/c/pp_var.h"
15
16struct PPP_Class_Deprecated;
17
18namespace gin {
19  class Arguments;
20}  // namespace gin
21
22namespace content {
23
24class PepperPluginInstanceImpl;
25
26// A PluginObject is a JS-accessible object implemented by the plugin.
27//
28// In contrast, a var of type PP_VARTYPE_OBJECT is a reference to a JS object,
29// which might be implemented by the plugin (here) or by the JS engine.
30class PluginObject : public gin::Wrappable<PluginObject>,
31                     public gin::NamedPropertyInterceptor {
32 public:
33  static gin::WrapperInfo kWrapperInfo;
34
35  virtual ~PluginObject();
36
37  // Returns the PluginObject which is contained in the given v8 object, or NULL
38  // if the object isn't backed by a PluginObject.
39  static PluginObject* FromV8Object(v8::Isolate* isolate,
40                                    v8::Handle<v8::Object> v8_object);
41
42  // Allocates a new PluginObject and returns it as a PP_Var with a
43  // refcount of 1.
44  static PP_Var Create(PepperPluginInstanceImpl* instance,
45                       const PPP_Class_Deprecated* ppp_class,
46                       void* ppp_class_data);
47
48  // gin::NamedPropertyInterceptor
49  virtual v8::Local<v8::Value> GetNamedProperty(
50      v8::Isolate* isolate,
51      const std::string& property) OVERRIDE;
52  virtual bool SetNamedProperty(v8::Isolate* isolate,
53                                const std::string& property,
54                                v8::Local<v8::Value> value) OVERRIDE;
55  virtual std::vector<std::string> EnumerateNamedProperties(
56      v8::Isolate* isolate) OVERRIDE;
57
58  const PPP_Class_Deprecated* ppp_class() { return ppp_class_; }
59  void* ppp_class_data() { return ppp_class_data_; }
60
61  // Called when the instance is destroyed.
62  void InstanceDeleted();
63
64 private:
65  PluginObject(PepperPluginInstanceImpl* instance,
66               const PPP_Class_Deprecated* ppp_class,
67               void* ppp_class_data);
68
69  // gin::Wrappable
70  virtual gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
71      v8::Isolate* isolate) OVERRIDE;
72
73  // Helper method to get named properties.
74  v8::Local<v8::Value> GetPropertyOrMethod(v8::Isolate* isolate,
75                                           PP_Var identifier_var);
76
77  void Call(const std::string& identifier, gin::Arguments* args);
78
79  PepperPluginInstanceImpl* instance_;
80
81  const PPP_Class_Deprecated* ppp_class_;
82  void* ppp_class_data_;
83
84  base::WeakPtrFactory<PluginObject> weak_factory_;
85
86  DISALLOW_COPY_AND_ASSIGN(PluginObject);
87};
88
89}  // namespace content
90
91#endif  // CONTENT_RENDERER_PEPPER_PLUGIN_OBJECT_H_
92