OLD | NEW |
| (Empty) |
1 // Copyright 2010 The Ginsu Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can | |
3 // be found in the LICENSE file. | |
4 | |
5 #include "c_salt/npapi/browser_binding.h" | |
6 | |
7 #include <vector> | |
8 | |
9 #include "c_salt/instance.h" | |
10 #include "c_salt/npapi/variant_converter.h" | |
11 #include "c_salt/variant.h" | |
12 | |
13 namespace c_salt { | |
14 namespace npapi { | |
15 | |
16 bool BrowserBinding::HasMethod(NPIdentifier name) const { | |
17 ScopedNPIdToStringConverter np_str(name); | |
18 return scripting_bridge_->HasScriptMethod(np_str.string_value()); | |
19 } | |
20 | |
21 void BrowserBinding::Invalidate() { | |
22 return scripting_bridge_->Invalidate(); | |
23 } | |
24 | |
25 bool BrowserBinding::Invoke(NPIdentifier name, | |
26 const NPVariant* args, | |
27 uint32_t arg_count, | |
28 NPVariant* return_value) { | |
29 ScopedNPIdToStringConverter np_str(name); | |
30 // Make a vector of c_salt::Variants that's the same size as |args| | |
31 // and fill it in. This will take care of cleaning up when we're done, | |
32 // and vectors are guaranteed to be stored contiguously, so we can pass it | |
33 // like an array. | |
34 std::vector< SharedVariant > c_salt_var_vec; | |
35 c_salt_var_vec.reserve(arg_count); | |
36 for (uint32_t i = 0; i < arg_count; ++i) { | |
37 c_salt_var_vec.push_back( | |
38 variant_converter_.CreateVariantFromNPVariant(args[i])); | |
39 } | |
40 SharedVariant c_salt_return_var; | |
41 bool success = scripting_bridge_-> | |
42 InvokeScriptMethod(np_str.string_value(), | |
43 &(*c_salt_var_vec.begin()), | |
44 &(*c_salt_var_vec.end()), | |
45 &c_salt_return_var); | |
46 if (success) { | |
47 variant_converter_.ConvertVariantToNPVariant(*c_salt_return_var, | |
48 return_value); | |
49 } | |
50 return success; | |
51 } | |
52 | |
53 bool BrowserBinding::HasProperty(NPIdentifier name) const { | |
54 ScopedNPIdToStringConverter np_str(name); | |
55 return scripting_bridge_->HasScriptProperty(np_str.string_value()); | |
56 } | |
57 | |
58 bool BrowserBinding::GetProperty(NPIdentifier name, NPVariant* return_value) | |
59 const { | |
60 ScopedNPIdToStringConverter np_str(name); | |
61 SharedVariant value(new Variant()); | |
62 bool success = scripting_bridge_->GetScriptProperty(np_str.string_value(), | |
63 &value); | |
64 variant_converter_.ConvertVariantToNPVariant(*value, return_value); | |
65 return success; | |
66 } | |
67 | |
68 bool BrowserBinding::SetProperty(NPIdentifier name, | |
69 const NPVariant& np_value) { | |
70 ScopedNPIdToStringConverter np_str(name); | |
71 SharedVariant value(variant_converter_.CreateVariantFromNPVariant(np_value)); | |
72 return scripting_bridge_->SetScriptProperty(np_str.string_value(), value); | |
73 } | |
74 | |
75 bool BrowserBinding::RemoveProperty(NPIdentifier name) { | |
76 ScopedNPIdToStringConverter np_str(name); | |
77 return scripting_bridge_->RemoveScriptProperty(np_str.string_value()); | |
78 } | |
79 | |
80 // Helper functions for dereferencing the bridging object. | |
81 static inline BrowserBinding* cast_browser_binding(NPObject* np_object) { | |
82 assert(np_object); | |
83 return static_cast<BrowserBinding*>(np_object); | |
84 } | |
85 | |
86 // The browser-facing entry points that represent the bridge's class methods. | |
87 // These are the function wrappers that the browser actually calls. | |
88 NPObject* Allocate(NPP npp, NPClass* npclass) { | |
89 return new BrowserBinding(npp); | |
90 } | |
91 | |
92 void Deallocate(NPObject* object) { | |
93 delete cast_browser_binding(object); | |
94 } | |
95 | |
96 void Invalidate(NPObject* object) { | |
97 cast_browser_binding(object)->Invalidate(); | |
98 } | |
99 | |
100 bool HasMethod(NPObject* object, NPIdentifier name) { | |
101 return cast_browser_binding(object)->HasMethod(name); | |
102 } | |
103 | |
104 bool Invoke(NPObject* object, NPIdentifier name, | |
105 const NPVariant* args, | |
106 uint32_t arg_count, | |
107 NPVariant* return_value) { | |
108 return cast_browser_binding(object)->Invoke( | |
109 name, args, arg_count, return_value); | |
110 } | |
111 | |
112 bool HasProperty(NPObject* object, NPIdentifier name) { | |
113 return cast_browser_binding(object)->HasProperty(name); | |
114 } | |
115 | |
116 bool GetProperty(NPObject* object, NPIdentifier name, NPVariant* result) { | |
117 return cast_browser_binding(object)->GetProperty(name, result); | |
118 } | |
119 | |
120 bool SetProperty(NPObject* object, NPIdentifier name, const NPVariant* value) { | |
121 return cast_browser_binding(object)->SetProperty(name, *value); | |
122 } | |
123 | |
124 bool RemoveProperty(NPObject* object, NPIdentifier name) { | |
125 return cast_browser_binding(object)->RemoveProperty(name); | |
126 } | |
127 | |
128 void BrowserBinding::Retain() { | |
129 NPN_RetainObject(this); | |
130 } | |
131 | |
132 static NPClass bridge_class = { | |
133 NP_CLASS_STRUCT_VERSION, | |
134 c_salt::npapi::Allocate, | |
135 c_salt::npapi::Deallocate, | |
136 c_salt::npapi::Invalidate, | |
137 c_salt::npapi::HasMethod, | |
138 c_salt::npapi::Invoke, | |
139 NULL, // InvokeDefault is not implemented | |
140 c_salt::npapi::HasProperty, | |
141 c_salt::npapi::GetProperty, | |
142 c_salt::npapi::SetProperty, | |
143 c_salt::npapi::RemoveProperty | |
144 }; | |
145 | |
146 BrowserBinding* BrowserBinding::CreateBrowserBinding( | |
147 const c_salt::Instance& instance) { | |
148 return static_cast<BrowserBinding*>( | |
149 NPN_CreateObject(instance.npp_instance(), &bridge_class)); | |
150 } | |
151 | |
152 } // namespace npapi | |
153 } // namespace c_salt | |
OLD | NEW |