1 // Copyright (c) 2012 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.
5 // The browser scriptable container class. The methods on this class
6 // are defined in the specific API directories.
8 #ifndef NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_SCRIPTABLE_PLUGIN_H_
9 #define NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_SCRIPTABLE_PLUGIN_H_
13 #include "native_client/src/include/nacl_macros.h"
14 #include "native_client/src/include/portability.h"
15 #include "ppapi/cpp/dev/scriptable_object_deprecated.h"
16 #include "ppapi/cpp/private/var_private.h"
17 #include "ppapi/native_client/src/trusted/plugin/utility.h"
21 // Forward declarations for externals.
24 // ScriptablePlugin encapsulates plugins that are scriptable from the browser.
25 class ScriptablePlugin
: public pp::deprecated::ScriptableObject
{
28 static ScriptablePlugin
* NewPlugin(Plugin
* plugin
);
30 // If not NULL, this var should be reused to pass this object to the browser.
31 pp::VarPrivate
* var() { return var_
; }
33 static void Unref(ScriptablePlugin
** handle
);
35 // Get the contained plugin object. NULL if this contains a descriptor.
36 Plugin
* plugin() const { return plugin_
; }
38 // This function is called when we are about to share the object owned by the
39 // plugin with the browser. Since reference counting on the browser side is
40 // handled via pp::Var's, we create the var() here if not created already.
41 ScriptablePlugin
* AddRef();
42 // Remove a browser reference to this object.
43 // Delete the object when the ref count becomes 0.
44 // If var() is set, we delete it. Otherwise, we delete the object itself.
45 // Therefore, this cannot be called more than once.
48 // ------ Methods inherited from pp::deprecated::ScriptableObject:
50 // Returns true for preloaded NaCl Plugin properties.
51 // Does not set |exception|.
52 virtual bool HasProperty(const pp::Var
& name
, pp::Var
* exception
);
53 // Returns true for preloaded NaCl Plugin methods and SRPC methods exported
54 // from a NaCl module. Does not set |exception|.
55 virtual bool HasMethod(const pp::Var
& name
, pp::Var
* exception
);
57 // Gets the value of a preloaded NaCl Plugin property.
58 // Sets |exception| on failure.
59 virtual pp::Var
GetProperty(const pp::Var
& name
, pp::Var
* exception
);
60 // Sets the value of a preloaded NaCl Plugin property.
61 // Does not add new properties. Sets |exception| of failure.
62 virtual void SetProperty(const pp::Var
& name
, const pp::Var
& value
,
64 // Set |exception| to indicate that property removal is not supported.
65 virtual void RemoveProperty(const pp::Var
& name
, pp::Var
* exception
);
66 // Returns a list of all preloaded NaCl Plugin |properties|.
67 // Does not set |exception|.
68 virtual void GetAllPropertyNames(std::vector
<pp::Var
>* properties
,
71 // Calls preloaded NaCl Plugin methods or SRPC methods exported from
72 // a NaCl module. Sets |exception| on failure.
73 virtual pp::Var
Call(const pp::Var
& name
, const std::vector
<pp::Var
>& args
,
76 // Sets |exception| to indicate that constructor is not supported.
77 virtual pp::Var
Construct(const std::vector
<pp::Var
>& args
,
81 NACL_DISALLOW_COPY_AND_ASSIGN(ScriptablePlugin
);
82 // Prevent construction from outside the class: must use factory New()
84 explicit ScriptablePlugin(Plugin
* plugin
);
85 // This will be called when both the plugin and the browser clear all
86 // references to this object.
87 virtual ~ScriptablePlugin();
89 // When we pass the object owned by the plugin to the browser, we need to wrap
90 // it in a pp::VarPrivate, which also registers the object with the browser
91 // for refcounting. It must be registered only once with all other var
92 // references being copies of the original one. Thus, we record the
93 // pp::VarPrivate here and reuse it when satisfiying additional browser
94 // requests. This way we also ensure that when the browser clears its
95 // references, this object does not get deallocated while we still hold ours.
96 // This is never set for objects that are not shared with the browser nor for
97 // objects created during SRPC calls as they are taken over by the browser on
101 // We should have no more than one internal plugin owner for this object,
102 // and only that owner should call Unref(). To CHECK for that keep a counter.
103 int num_unref_calls_
;
105 // The contained plugin object.
109 } // namespace plugin
111 #endif // NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_SCRIPTABLE_PLUGIN_H_