Home | History | Annotate | Download | only in test
      1 // Copyright 2013 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 CONTENT_TEST_CPP_BINDING_EXAMPLE_H_
      6 #define CONTENT_TEST_CPP_BINDING_EXAMPLE_H_
      7 
      8 /*
      9   CppBindingExample class:
     10   This provides an example of how to use the CppBoundClass to create methods
     11   and properties that can be exposed to JavaScript by an appropriately built
     12   embedding client. It is also used by the CppBoundClass unit test.
     13 
     14   Typically, a class intended to be bound to JavaScript will define a
     15   constructor, any methods and properties to be exposed, and optionally a
     16   destructor.  An embedding client can then bind the class to a JavaScript
     17   object in a frame's window using the CppBoundClass::BindToJavascript() method,
     18   generally called from the WebFrameClient's DidClearWindowObject().
     19 
     20   Once this class has been bound, say to the name "example", it might be called
     21   from JavaScript in the following way:
     22 
     23   <script>
     24     if (window.example) {
     25       document.writeln(example.echoValue(false));
     26       document.writeln(example.echoType("Hello world!"));
     27       document.writeln(example.plus(2, 3.1));
     28 
     29       example.my_value = 15;
     30       example.my_other_value = 2.1;
     31       document.writeln(example.plus(example.my_value, example.my_other_value));
     32     }
     33   </script>
     34 */
     35 
     36 #include "webkit/renderer/cpp_bound_class.h"
     37 
     38 namespace content {
     39 
     40 class CppBindingExample : public webkit_glue::CppBoundClass {
     41  public:
     42   // The default constructor initializes the property and method lists needed
     43   // to bind this class to a JS object.
     44   CppBindingExample();
     45 
     46   //
     47   // These public member variables and methods implement the methods and
     48   // properties that will be exposed to JavaScript. If needed, the class could
     49   // also contain other methods or variables, which will be hidden from JS
     50   // as long as they're not mapped in the property and method lists created in
     51   // the constructor.
     52   //
     53   // The signatures of any methods to be bound must match
     54   // CppBoundClass::Callback.
     55   //
     56 
     57   // Returns the value that was passed in as its first (only) argument.
     58   void echoValue(const webkit_glue::CppArgumentList& args,
     59                  webkit_glue::CppVariant* result);
     60 
     61   // Returns a hard-coded value of the same type (bool, number (double),
     62   // string, or null) that was passed in as an argument.
     63   void echoType(const webkit_glue::CppArgumentList& args,
     64                 webkit_glue::CppVariant* result);
     65 
     66   // Returns the sum of the (first) two arguments as a double, if they are both
     67   // numbers (integers or doubles).  Otherwise returns null.
     68   void plus(const webkit_glue::CppArgumentList& args,
     69             webkit_glue::CppVariant* result);
     70 
     71   // Always returns the same value -- an example of a read-only property.
     72   void same(webkit_glue::CppVariant* result);
     73 
     74   // Invoked when a nonexistent method is called on this example object, this
     75   // prints an error message.
     76   void fallbackMethod(const webkit_glue::CppArgumentList& args,
     77                       webkit_glue::CppVariant* result);
     78 
     79   // These properties will also be exposed to JavaScript.
     80   webkit_glue::CppVariant my_value;
     81   webkit_glue::CppVariant my_other_value;
     82 };
     83 
     84 }  // namespace content
     85 
     86 #endif  // CONTENT_TEST_CPP_BINDING_EXAMPLE_H_
     87