OLD | NEW |
| (Empty) |
1 // Copyright (c) 2006-2008 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 WEBKIT_ACTIVEX_SHIM_DISPATCH_OBJECT_H__ | |
6 #define WEBKIT_ACTIVEX_SHIM_DISPATCH_OBJECT_H__ | |
7 | |
8 #include <oaidl.h> | |
9 | |
10 #include <list> | |
11 | |
12 #include "webkit/glue/plugins/nphostapi.h" | |
13 | |
14 namespace activex_shim { | |
15 | |
16 struct DispatchNPObject; | |
17 | |
18 // DispatchObject provides service to translate calls on NPObject to the | |
19 // underlying IDispatch interface. It is isolated from the ActiveXPlugin, so | |
20 // that when we have scripts like: | |
21 // wmp.controls.stop(); | |
22 // We can create a spawned dispatch object for "controls" -- an IDispatch | |
23 // interface returned from property "controls" of the wmp activex control. | |
24 class DispatchObject { | |
25 public: | |
26 DispatchObject(DispatchObject* root); | |
27 virtual ~DispatchObject(); | |
28 | |
29 // This is used when NPP_GetValue is called by browser and asked for | |
30 // NPPVpluginScriptableNPObject. | |
31 NPObject* GetScriptableNPObject(); | |
32 | |
33 // Object scripting | |
34 NPObject* NPAllocate(NPClass* theClass); | |
35 void NPInvalidate(); | |
36 bool NPHasMethod(NPIdentifier name); | |
37 bool NPHasProperty(NPIdentifier name); | |
38 bool NPInvoke(NPIdentifier name, const NPVariant* args, | |
39 uint32_t argCount, NPVariant* result); | |
40 bool NPInvokeDefault(const NPVariant* args, uint32_t argCount, | |
41 NPVariant* result); | |
42 bool NPGetProperty(NPIdentifier name, NPVariant* variant); | |
43 bool NPSetProperty(NPIdentifier name, const NPVariant* variant); | |
44 bool NPRemoveProperty(NPIdentifier propertyName); | |
45 | |
46 // Called by NPDeallocate so that we can remove our reference. | |
47 void OnDeallocateObject(DispatchNPObject* obj); | |
48 DispatchObject* root() { return root_== NULL ? this : root_; } | |
49 // Only the root object needs to take care of this. | |
50 void AddSpawned(DispatchObject* obj); | |
51 // If a spawned child is released earlier than the root object, it needs to | |
52 // call this function to remove itself from the children list, to avoid | |
53 // another destruction when the root object is being destructed. | |
54 void RemoveSpawned(DispatchObject* obj); | |
55 | |
56 protected: | |
57 // Only the root object can release spawned dispatch object. The root object | |
58 // is coupled with the actual ActiveX control. Thus if the control is dead | |
59 // we must also release all Dispatch interfaces from that control. | |
60 void ReleaseSpawned(); | |
61 // root_ is the owner of this object. If root_ == NULL, then this object | |
62 // itself is the root. | |
63 DispatchObject* const root_; | |
64 | |
65 private: | |
66 typedef std::list<DispatchObject*> SpawnedChildrenList; | |
67 | |
68 // Must be overrided by subclass to be functional. | |
69 virtual IDispatch* GetDispatch() = 0; | |
70 // If this is true, when the related npobject is released, it should delete | |
71 // this object as well. | |
72 virtual bool NPObjectOwnsMe() = 0; | |
73 | |
74 // We create only one NPObject per ActiveXPlugin. It may have different life | |
75 // span than ActiveXPlugin thus we need a separate object created | |
76 // specifically for this purpose. | |
77 DispatchNPObject* npobject_; | |
78 // A list of spawned children from this root object (if it is). | |
79 SpawnedChildrenList spawned_children_; | |
80 bool deleting_spawned_children_; | |
81 }; | |
82 | |
83 // The spawned dipatch object contains a reference to an IDispatch interface | |
84 // that it owns. Its lifetime is controlled by the lifetime of related | |
85 // NPObject, and the root DispatchObject it is spawned from. | |
86 class SpawnedDispatchObject : public DispatchObject { | |
87 public: | |
88 // Constructor will addref to the dispatch interface, and add itself to | |
89 // spawned children of root. | |
90 SpawnedDispatchObject(IDispatch* dispatch, DispatchObject* root); | |
91 ~SpawnedDispatchObject(); | |
92 | |
93 private: | |
94 virtual IDispatch* GetDispatch() { return dispatch_; } | |
95 virtual bool NPObjectOwnsMe() { return true; } | |
96 | |
97 IDispatch* dispatch_; | |
98 }; | |
99 | |
100 // A simple extension of the NPObject. So that we can put additional information | |
101 // like who is the underlying DispatchObject with the NPObject. When methods of | |
102 // NPObject are requested we can resort to the DispatchObject to handle them. | |
103 struct DispatchNPObject : public NPObject { | |
104 DispatchObject* dispatch_object; | |
105 }; | |
106 | |
107 // These functions are to support scriptable plugin object. | |
108 NPObject* NPAllocate(NPP npp, NPClass* theClass); | |
109 void NPDeallocate(NPObject* obj); | |
110 void NPInvalidate(NPObject* obj); | |
111 bool NPHasMethod(NPObject* obj, NPIdentifier name); | |
112 bool NPInvoke(NPObject* obj, NPIdentifier name, const NPVariant* args, | |
113 uint32_t argCount, NPVariant* result); | |
114 bool NPInvokeDefault(NPObject* obj, const NPVariant* args, uint32_t argCount, | |
115 NPVariant* result); | |
116 bool NPHasProperty(NPObject* obj, NPIdentifier name); | |
117 bool NPGetProperty(NPObject* obj, NPIdentifier name, NPVariant* variant); | |
118 bool NPSetProperty(NPObject* obj, NPIdentifier name, const NPVariant* variant); | |
119 bool NPRemoveProperty(NPObject* npobj, NPIdentifier propertyName); | |
120 | |
121 } // namespace activex_shim | |
122 | |
123 #endif // #ifndef WEBKIT_ACTIVEX_SHIM_DISPATCH_OBJECT_H__ | |
OLD | NEW |