| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Additional set of macros for the JS RPC. | 5 // Additional set of macros for the JS RPC. |
| 6 | 6 |
| 7 #ifndef WEBKIT_GLUE_DEVTOOLS_DEVTOOLS_RPC_JS_H_ | 7 #ifndef WEBKIT_GLUE_DEVTOOLS_DEVTOOLS_RPC_JS_H_ |
| 8 #define WEBKIT_GLUE_DEVTOOLS_DEVTOOLS_RPC_JS_H_ | 8 #define WEBKIT_GLUE_DEVTOOLS_DEVTOOLS_RPC_JS_H_ |
| 9 | 9 |
| 10 #include <string> | 10 #include <string> |
| 11 | 11 |
| 12 // Do not remove this one although it is not used. |
| 12 #include <wtf/OwnPtr.h> | 13 #include <wtf/OwnPtr.h> |
| 13 | 14 |
| 14 #include "base/basictypes.h" | 15 #include "base/basictypes.h" |
| 15 #include "base/logging.h" | |
| 16 #include "base/values.h" | |
| 17 #include "webkit/api/public/WebFrame.h" | 16 #include "webkit/api/public/WebFrame.h" |
| 18 #include "webkit/glue/cpp_bound_class.h" | 17 #include "webkit/glue/cpp_bound_class.h" |
| 19 #include "webkit/glue/devtools/devtools_rpc.h" | 18 #include "webkit/glue/devtools/devtools_rpc.h" |
| 20 #include "webkit/glue/glue_util.h" | 19 #include "webkit/glue/glue_util.h" |
| 21 | 20 |
| 22 /////////////////////////////////////////////////////// | 21 /////////////////////////////////////////////////////// |
| 23 // JS RPC binds and stubs | 22 // JS RPC binds and stubs |
| 24 | 23 |
| 25 template<typename T> | 24 template<typename T> |
| 26 struct RpcJsTypeTrait { | 25 struct RpcJsTypeTrait { |
| 27 }; | 26 }; |
| 28 | 27 |
| 29 template<> | 28 template<> |
| 30 struct RpcJsTypeTrait<bool> { | 29 struct RpcJsTypeTrait<bool> { |
| 31 static bool Pass(const CppVariant& var) { | 30 static std::string ToString(const CppVariant& var) { |
| 32 return var.ToBoolean(); | 31 return IntToString(var.ToBoolean() ? 1 : 0); |
| 33 } | 32 } |
| 34 }; | 33 }; |
| 35 | 34 |
| 36 template<> | 35 template<> |
| 37 struct RpcJsTypeTrait<int> { | 36 struct RpcJsTypeTrait<int> { |
| 38 static int Pass(const CppVariant& var) { | 37 static std::string ToString(const CppVariant& var) { |
| 39 return var.ToInt32(); | 38 return IntToString(var.ToInt32()); |
| 40 } | 39 } |
| 41 }; | 40 }; |
| 42 | 41 |
| 43 template<> | 42 template<> |
| 44 struct RpcJsTypeTrait<String> { | 43 struct RpcJsTypeTrait<String> { |
| 45 static String Pass(const CppVariant& var) { | 44 static std::string ToString(const CppVariant& var) { |
| 46 return webkit_glue::StdStringToString(var.ToString()); | 45 return var.ToString(); |
| 47 } | 46 } |
| 48 }; | 47 }; |
| 49 | 48 |
| 50 template<> | 49 template<> |
| 51 struct RpcJsTypeTrait<std::string> { | 50 struct RpcJsTypeTrait<std::string> { |
| 52 static std::string Pass(const CppVariant& var) { | 51 static std::string ToString(const CppVariant& var) { |
| 53 return var.ToString(); | 52 return var.ToString(); |
| 54 } | 53 } |
| 55 }; | 54 }; |
| 56 | 55 |
| 57 #define TOOLS_RPC_JS_BIND_METHOD0(Method) \ | 56 #define TOOLS_RPC_JS_BIND_METHOD0(Method) \ |
| 58 BindMethod(#Method, &OCLASS::Js##Method); | 57 BindMethod(#Method, &OCLASS::Js##Method); |
| 59 | 58 |
| 60 #define TOOLS_RPC_JS_BIND_METHOD1(Method, T1) \ | 59 #define TOOLS_RPC_JS_BIND_METHOD1(Method, T1) \ |
| 61 BindMethod(#Method, &OCLASS::Js##Method); | 60 BindMethod(#Method, &OCLASS::Js##Method); |
| 62 | 61 |
| 63 #define TOOLS_RPC_JS_BIND_METHOD2(Method, T1, T2) \ | 62 #define TOOLS_RPC_JS_BIND_METHOD2(Method, T1, T2) \ |
| 64 BindMethod(#Method, &OCLASS::Js##Method); | 63 BindMethod(#Method, &OCLASS::Js##Method); |
| 65 | 64 |
| 66 #define TOOLS_RPC_JS_BIND_METHOD3(Method, T1, T2, T3) \ | 65 #define TOOLS_RPC_JS_BIND_METHOD3(Method, T1, T2, T3) \ |
| 67 BindMethod(#Method, &OCLASS::Js##Method); | 66 BindMethod(#Method, &OCLASS::Js##Method); |
| 68 | 67 |
| 69 #define TOOLS_RPC_JS_BIND_METHOD4(Method, T1, T2, T3, T4) \ | |
| 70 BindMethod(#Method, &OCLASS::Js##Method); | |
| 71 | |
| 72 #define TOOLS_RPC_JS_STUB_METHOD0(Method) \ | 68 #define TOOLS_RPC_JS_STUB_METHOD0(Method) \ |
| 73 void Js##Method(const CppArgumentList& args, CppVariant* result) { \ | 69 void Js##Method(const CppArgumentList& args, CppVariant* result) { \ |
| 74 InvokeAsync(class_name, #Method); \ | 70 this->delegate_->SendRpcMessage(class_name, #Method); \ |
| 75 result->SetNull(); \ | 71 result->SetNull(); \ |
| 76 } | 72 } |
| 77 | 73 |
| 78 #define TOOLS_RPC_JS_STUB_METHOD1(Method, T1) \ | 74 #define TOOLS_RPC_JS_STUB_METHOD1(Method, T1) \ |
| 79 void Js##Method(const CppArgumentList& args, CppVariant* result) { \ | 75 void Js##Method(const CppArgumentList& args, CppVariant* result) { \ |
| 80 T1 t1 = RpcJsTypeTrait<T1>::Pass(args[0]); \ | 76 this->delegate_->SendRpcMessage(class_name, #Method, \ |
| 81 InvokeAsync(class_name, #Method, &t1); \ | 77 RpcJsTypeTrait<T1>::ToString(args[0])); \ |
| 82 result->SetNull(); \ | 78 result->SetNull(); \ |
| 83 } | 79 } |
| 84 | 80 |
| 85 #define TOOLS_RPC_JS_STUB_METHOD2(Method, T1, T2) \ | 81 #define TOOLS_RPC_JS_STUB_METHOD2(Method, T1, T2) \ |
| 86 void Js##Method(const CppArgumentList& args, CppVariant* result) { \ | 82 void Js##Method(const CppArgumentList& args, CppVariant* result) { \ |
| 87 T1 t1 = RpcJsTypeTrait<T1>::Pass(args[0]); \ | 83 this->delegate_->SendRpcMessage(class_name, #Method, \ |
| 88 T2 t2 = RpcJsTypeTrait<T2>::Pass(args[1]); \ | 84 RpcJsTypeTrait<T1>::ToString(args[0]), \ |
| 89 InvokeAsync(class_name, #Method, &t1, &t2); \ | 85 RpcJsTypeTrait<T2>::ToString(args[1])); \ |
| 90 result->SetNull(); \ | 86 result->SetNull(); \ |
| 91 } | 87 } |
| 92 | 88 |
| 93 #define TOOLS_RPC_JS_STUB_METHOD3(Method, T1, T2, T3) \ | 89 #define TOOLS_RPC_JS_STUB_METHOD3(Method, T1, T2, T3) \ |
| 94 void Js##Method(const CppArgumentList& args, CppVariant* result) { \ | 90 void Js##Method(const CppArgumentList& args, CppVariant* result) { \ |
| 95 T1 t1 = RpcJsTypeTrait<T1>::Pass(args[0]); \ | 91 this->delegate_->SendRpcMessage(class_name, #Method, \ |
| 96 T2 t2 = RpcJsTypeTrait<T2>::Pass(args[1]); \ | 92 RpcJsTypeTrait<T1>::ToString(args[0]), \ |
| 97 T3 t3 = RpcJsTypeTrait<T3>::Pass(args[2]); \ | 93 RpcJsTypeTrait<T2>::ToString(args[1]), \ |
| 98 InvokeAsync(class_name, #Method, &t1, &t2, &t3); \ | 94 RpcJsTypeTrait<T3>::ToString(args[2])); \ |
| 99 result->SetNull(); \ | |
| 100 } | |
| 101 | |
| 102 #define TOOLS_RPC_JS_STUB_METHOD4(Method, T1, T2, T3, T4) \ | |
| 103 void Js##Method(const CppArgumentList& args, CppVariant* result) { \ | |
| 104 T1 t1 = RpcJsTypeTrait<T1>::Pass(args[0]); \ | |
| 105 T2 t2 = RpcJsTypeTrait<T2>::Pass(args[1]); \ | |
| 106 T3 t3 = RpcJsTypeTrait<T3>::Pass(args[2]); \ | |
| 107 T4 t4 = RpcJsTypeTrait<T4>::Pass(args[3]); \ | |
| 108 InvokeAsync(class_name, #Method, &t1, &t2, &t3, &t4); \ | |
| 109 result->SetNull(); \ | 95 result->SetNull(); \ |
| 110 } | 96 } |
| 111 | 97 |
| 112 /////////////////////////////////////////////////////// | 98 /////////////////////////////////////////////////////// |
| 113 // JS RPC main obj macro | 99 // JS RPC main obj macro |
| 114 | 100 |
| 115 #define DEFINE_RPC_JS_BOUND_OBJ(Class, STRUCT, DClass, DELEGATE_STRUCT) \ | 101 #define DEFINE_RPC_JS_BOUND_OBJ(Class, STRUCT, DClass, DELEGATE_STRUCT) \ |
| 116 class Js##Class##BoundObj : public Class##Stub, \ | 102 class Js##Class##BoundObj : public Class##Stub, \ |
| 117 public CppBoundClass { \ | 103 public CppBoundClass { \ |
| 118 public: \ | 104 public: \ |
| 119 Js##Class##BoundObj(Delegate* rpc_delegate, WebFrame* frame, \ | 105 Js##Class##BoundObj(Delegate* rpc_delegate, WebFrame* frame, \ |
| 120 const std::wstring& classname) \ | 106 const std::wstring& classname) \ |
| 121 : Class##Stub(rpc_delegate) { \ | 107 : Class##Stub(rpc_delegate) { \ |
| 122 BindToJavascript(frame, classname); \ | 108 BindToJavascript(frame, classname); \ |
| 123 STRUCT( \ | 109 STRUCT( \ |
| 124 TOOLS_RPC_JS_BIND_METHOD0, \ | 110 TOOLS_RPC_JS_BIND_METHOD0, \ |
| 125 TOOLS_RPC_JS_BIND_METHOD1, \ | 111 TOOLS_RPC_JS_BIND_METHOD1, \ |
| 126 TOOLS_RPC_JS_BIND_METHOD2, \ | 112 TOOLS_RPC_JS_BIND_METHOD2, \ |
| 127 TOOLS_RPC_JS_BIND_METHOD3, \ | 113 TOOLS_RPC_JS_BIND_METHOD3) \ |
| 128 TOOLS_RPC_JS_BIND_METHOD4) \ | |
| 129 } \ | 114 } \ |
| 130 virtual ~Js##Class##BoundObj() {} \ | 115 virtual ~Js##Class##BoundObj() {} \ |
| 131 typedef Js##Class##BoundObj OCLASS; \ | 116 typedef Js##Class##BoundObj OCLASS; \ |
| 132 STRUCT( \ | 117 STRUCT( \ |
| 133 TOOLS_RPC_JS_STUB_METHOD0, \ | 118 TOOLS_RPC_JS_STUB_METHOD0, \ |
| 134 TOOLS_RPC_JS_STUB_METHOD1, \ | 119 TOOLS_RPC_JS_STUB_METHOD1, \ |
| 135 TOOLS_RPC_JS_STUB_METHOD2, \ | 120 TOOLS_RPC_JS_STUB_METHOD2, \ |
| 136 TOOLS_RPC_JS_STUB_METHOD3, \ | 121 TOOLS_RPC_JS_STUB_METHOD3) \ |
| 137 TOOLS_RPC_JS_STUB_METHOD4) \ | |
| 138 private: \ | 122 private: \ |
| 139 DISALLOW_COPY_AND_ASSIGN(Js##Class##BoundObj); \ | 123 DISALLOW_COPY_AND_ASSIGN(Js##Class##BoundObj); \ |
| 140 }; | 124 }; |
| 141 | 125 |
| 142 #endif // WEBKIT_GLUE_DEVTOOLS_DEVTOOLS_RPC_JS_H_ | 126 #endif // WEBKIT_GLUE_DEVTOOLS_DEVTOOLS_RPC_JS_H_ |
| OLD | NEW |