| // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // This file contains the definition for CppBindingExample, which is used in |
| // cpp_bound_class_unittest. |
| |
| #include "cpp_binding_example.h" |
| |
| namespace { |
| |
| class PropertyCallbackExample : public CppBoundClass::PropertyCallback { |
| public: |
| virtual bool GetValue(CppVariant* value) { |
| value->Set(value_); |
| return true; |
| } |
| |
| virtual bool SetValue(const CppVariant& value) { |
| value_.Set(value); |
| return true; |
| } |
| |
| private: |
| CppVariant value_; |
| }; |
| |
| } |
| |
| CppBindingExample::CppBindingExample() { |
| // Map properties. It's recommended, but not required, that the JavaScript |
| // names (used as the keys in this map) match the names of the member |
| // variables exposed through those names. |
| BindProperty("my_value", &my_value); |
| BindProperty("my_other_value", &my_other_value); |
| |
| // Bind property with a callback. |
| BindProperty("my_value_with_callback", new PropertyCallbackExample()); |
| // Bind property with a getter callback. |
| BindProperty("same", &CppBindingExample::same); |
| |
| // Map methods. See comment above about names. |
| BindMethod("echoValue", &CppBindingExample::echoValue); |
| BindMethod("echoType", &CppBindingExample::echoType); |
| BindMethod("plus", &CppBindingExample::plus); |
| |
| // The fallback method is called when a nonexistent method is called on an |
| // object. If none is specified, calling a nonexistent method causes an |
| // exception to be thrown and the JavaScript execution is stopped. |
| BindFallbackMethod(&CppBindingExample::fallbackMethod); |
| |
| my_value.Set(10); |
| my_other_value.Set("Reinitialized!"); |
| } |
| |
| void CppBindingExample::echoValue(const CppArgumentList& args, |
| CppVariant* result) { |
| if (args.size() < 1) { |
| result->SetNull(); |
| return; |
| } |
| result->Set(args[0]); |
| } |
| |
| void CppBindingExample::echoType(const CppArgumentList& args, |
| CppVariant* result) { |
| if (args.size() < 1) { |
| result->SetNull(); |
| return; |
| } |
| // Note that if args[0] is a string, the following assignment implicitly |
| // makes a copy of that string, which may have an undesirable impact on |
| // performance. |
| CppVariant arg1 = args[0]; |
| if (arg1.isBool()) |
| result->Set(true); |
| else if (arg1.isInt32()) |
| result->Set(7); |
| else if (arg1.isDouble()) |
| result->Set(3.14159); |
| else if (arg1.isString()) |
| result->Set("Success!"); |
| } |
| |
| void CppBindingExample::plus(const CppArgumentList& args, |
| CppVariant* result) { |
| if (args.size() < 2) { |
| result->SetNull(); |
| return; |
| } |
| |
| CppVariant arg1 = args[0]; |
| CppVariant arg2 = args[1]; |
| |
| if (!arg1.isNumber() || !arg2.isNumber()) { |
| result->SetNull(); |
| return; |
| } |
| |
| // The value of a CppVariant may be read directly from its NPVariant struct. |
| // (However, it should only be set using one of the Set() functions.) |
| double sum = 0.; |
| if (arg1.isDouble()) |
| sum += arg1.value.doubleValue; |
| else if (arg1.isInt32()) |
| sum += arg1.value.intValue; |
| |
| if (arg2.isDouble()) |
| sum += arg2.value.doubleValue; |
| else if (arg2.isInt32()) |
| sum += arg2.value.intValue; |
| |
| result->Set(sum); |
| } |
| |
| void CppBindingExample::same(CppVariant* result) { |
| result->Set(42); |
| } |
| |
| void CppBindingExample::fallbackMethod(const CppArgumentList& args, |
| CppVariant* result) { |
| printf("Error: unknown JavaScript method invoked.\n"); |
| } |