Home | History | Annotate | Download | only in glue
      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 // This file contains the definition for CppBindingExample, which is used in
      6 // cpp_bound_class_unittest.
      7 
      8 #include "cpp_binding_example.h"
      9 
     10 namespace {
     11 
     12 class PropertyCallbackExample : public CppBoundClass::PropertyCallback {
     13  public:
     14   virtual bool GetValue(CppVariant* value) {
     15     value->Set(value_);
     16     return true;
     17   }
     18 
     19   virtual bool SetValue(const CppVariant& value) {
     20     value_.Set(value);
     21     return true;
     22   }
     23 
     24  private:
     25   CppVariant value_;
     26 };
     27 
     28 }
     29 
     30 CppBindingExample::CppBindingExample() {
     31   // Map properties.  It's recommended, but not required, that the JavaScript
     32   // names (used as the keys in this map) match the names of the member
     33   // variables exposed through those names.
     34   BindProperty("my_value", &my_value);
     35   BindProperty("my_other_value", &my_other_value);
     36 
     37   // Bind property with a callback.
     38   BindProperty("my_value_with_callback", new PropertyCallbackExample());
     39   // Bind property with a getter callback.
     40   BindProperty("same", &CppBindingExample::same);
     41 
     42   // Map methods.  See comment above about names.
     43   BindMethod("echoValue", &CppBindingExample::echoValue);
     44   BindMethod("echoType",  &CppBindingExample::echoType);
     45   BindMethod("plus",      &CppBindingExample::plus);
     46 
     47   // The fallback method is called when a nonexistent method is called on an
     48   // object. If none is specified, calling a nonexistent method causes an
     49   // exception to be thrown and the JavaScript execution is stopped.
     50   BindFallbackMethod(&CppBindingExample::fallbackMethod);
     51 
     52   my_value.Set(10);
     53   my_other_value.Set("Reinitialized!");
     54 }
     55 
     56 void CppBindingExample::echoValue(const CppArgumentList& args,
     57                                   CppVariant* result) {
     58   if (args.size() < 1) {
     59     result->SetNull();
     60     return;
     61   }
     62   result->Set(args[0]);
     63 }
     64 
     65 void CppBindingExample::echoType(const CppArgumentList& args,
     66                                  CppVariant* result) {
     67   if (args.size() < 1) {
     68     result->SetNull();
     69     return;
     70   }
     71   // Note that if args[0] is a string, the following assignment implicitly
     72   // makes a copy of that string, which may have an undesirable impact on
     73   // performance.
     74   CppVariant arg1 = args[0];
     75   if (arg1.isBool())
     76     result->Set(true);
     77   else if (arg1.isInt32())
     78     result->Set(7);
     79   else if (arg1.isDouble())
     80     result->Set(3.14159);
     81   else if (arg1.isString())
     82     result->Set("Success!");
     83 }
     84 
     85 void CppBindingExample::plus(const CppArgumentList& args,
     86                              CppVariant* result) {
     87   if (args.size() < 2) {
     88     result->SetNull();
     89     return;
     90   }
     91 
     92   CppVariant arg1 = args[0];
     93   CppVariant arg2 = args[1];
     94 
     95   if (!arg1.isNumber() || !arg2.isNumber()) {
     96     result->SetNull();
     97     return;
     98   }
     99 
    100   // The value of a CppVariant may be read directly from its NPVariant struct.
    101   // (However, it should only be set using one of the Set() functions.)
    102   double sum = 0.;
    103   if (arg1.isDouble())
    104     sum += arg1.value.doubleValue;
    105   else if (arg1.isInt32())
    106     sum += arg1.value.intValue;
    107 
    108   if (arg2.isDouble())
    109     sum += arg2.value.doubleValue;
    110   else if (arg2.isInt32())
    111     sum += arg2.value.intValue;
    112 
    113   result->Set(sum);
    114 }
    115 
    116 void CppBindingExample::same(CppVariant* result) {
    117   result->Set(42);
    118 }
    119 
    120 void CppBindingExample::fallbackMethod(const CppArgumentList& args,
    121                                        CppVariant* result) {
    122   printf("Error: unknown JavaScript method invoked.\n");
    123 }
    124