1 // Copyright (c) 2012 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 #include <stdint.h>
6 
7 #include "ppapi/c/dev/ppb_text_input_dev.h"
8 #include "ppapi/c/ppb_text_input_controller.h"
9 #include "ppapi/shared_impl/var.h"
10 #include "ppapi/thunk/enter.h"
11 #include "ppapi/thunk/ppb_instance_api.h"
12 #include "ppapi/thunk/thunk.h"
13 
14 namespace ppapi {
15 namespace thunk {
16 
17 namespace {
18 
19 #define STATIC_ASSERT_ENUM(a, b)                            \
20   static_assert(static_cast<int>(a) == static_cast<int>(b), \
21                 "mismatching enum: " #a)
22 
23 STATIC_ASSERT_ENUM(PP_TEXTINPUT_TYPE_DEV_NONE, PP_TEXTINPUT_TYPE_NONE);
24 STATIC_ASSERT_ENUM(PP_TEXTINPUT_TYPE_DEV_TEXT, PP_TEXTINPUT_TYPE_TEXT);
25 STATIC_ASSERT_ENUM(PP_TEXTINPUT_TYPE_DEV_PASSWORD, PP_TEXTINPUT_TYPE_PASSWORD);
26 STATIC_ASSERT_ENUM(PP_TEXTINPUT_TYPE_DEV_SEARCH, PP_TEXTINPUT_TYPE_SEARCH);
27 STATIC_ASSERT_ENUM(PP_TEXTINPUT_TYPE_DEV_EMAIL, PP_TEXTINPUT_TYPE_EMAIL);
28 STATIC_ASSERT_ENUM(PP_TEXTINPUT_TYPE_DEV_NUMBER, PP_TEXTINPUT_TYPE_NUMBER);
29 STATIC_ASSERT_ENUM(PP_TEXTINPUT_TYPE_DEV_TELEPHONE,
30                    PP_TEXTINPUT_TYPE_TELEPHONE);
31 STATIC_ASSERT_ENUM(PP_TEXTINPUT_TYPE_DEV_URL, PP_TEXTINPUT_TYPE_URL);
32 
SetTextInputType(PP_Instance instance,PP_TextInput_Type type)33 void SetTextInputType(PP_Instance instance, PP_TextInput_Type type) {
34   EnterInstance enter(instance);
35   if (enter.succeeded())
36     enter.functions()->SetTextInputType(instance, type);
37 }
38 
SetTextInputType_0_2(PP_Instance instance,PP_TextInput_Type_Dev type)39 void SetTextInputType_0_2(PP_Instance instance, PP_TextInput_Type_Dev type) {
40   EnterInstance enter(instance);
41   if (enter.succeeded())
42     enter.functions()->SetTextInputType(instance,
43                                         static_cast<PP_TextInput_Type>(type));
44 }
45 
UpdateCaretPosition_0_2(PP_Instance instance,const PP_Rect * caret,const PP_Rect * bounding_box)46 void UpdateCaretPosition_0_2(PP_Instance instance,
47                          const PP_Rect* caret,
48                          const PP_Rect* bounding_box) {
49   EnterInstance enter(instance);
50   if (enter.succeeded() && caret && bounding_box)
51     enter.functions()->UpdateCaretPosition(instance, *caret, *bounding_box);
52 }
53 
UpdateCaretPosition(PP_Instance instance,const PP_Rect * caret)54 void UpdateCaretPosition(PP_Instance instance,
55                          const PP_Rect* caret) {
56   EnterInstance enter(instance);
57   if (enter.succeeded() && caret)
58     enter.functions()->UpdateCaretPosition(instance, *caret, PP_Rect());
59 }
60 
CancelCompositionText(PP_Instance instance)61 void CancelCompositionText(PP_Instance instance) {
62   EnterInstance enter(instance);
63   if (enter.succeeded())
64     enter.functions()->CancelCompositionText(instance);
65 }
66 
UpdateSurroundingText_0_2(PP_Instance instance,const char * text,uint32_t caret,uint32_t anchor)67 void UpdateSurroundingText_0_2(PP_Instance instance, const char* text,
68                                uint32_t caret, uint32_t anchor) {
69   EnterInstance enter(instance);
70   if (enter.succeeded())
71     enter.functions()->UpdateSurroundingText(instance, text, caret, anchor);
72 }
73 
UpdateSurroundingText_1_0(PP_Instance instance,PP_Var text,uint32_t caret,uint32_t anchor)74 void UpdateSurroundingText_1_0(PP_Instance instance, PP_Var text,
75                                uint32_t caret, uint32_t anchor) {
76   EnterInstance enter(instance);
77   StringVar* var = StringVar::FromPPVar(text);
78   if (enter.succeeded() && var)
79     enter.functions()->UpdateSurroundingText(instance,
80                                              var->value().c_str(),
81                                              caret,
82                                              anchor);
83 }
84 
SelectionChanged(PP_Instance instance)85 void SelectionChanged(PP_Instance instance) {
86   EnterInstance enter(instance);
87   if (enter.succeeded())
88     enter.functions()->SelectionChanged(instance);
89 }
90 
91 const PPB_TextInput_Dev_0_1 g_ppb_textinput_0_1_thunk = {
92   &SetTextInputType_0_2,
93   &UpdateCaretPosition_0_2,
94   &CancelCompositionText,
95 };
96 
97 const PPB_TextInput_Dev_0_2 g_ppb_textinput_0_2_thunk = {
98   &SetTextInputType_0_2,
99   &UpdateCaretPosition_0_2,
100   &CancelCompositionText,
101   &UpdateSurroundingText_0_2,
102   &SelectionChanged,
103 };
104 
105 const PPB_TextInputController_1_0 g_ppb_textinputcontroller_1_0_thunk = {
106   &SetTextInputType,
107   &UpdateCaretPosition,
108   &CancelCompositionText,
109   &UpdateSurroundingText_1_0,
110 };
111 
112 }  // namespace
113 
GetPPB_TextInput_Dev_0_1_Thunk()114 const PPB_TextInput_Dev_0_1* GetPPB_TextInput_Dev_0_1_Thunk() {
115   return &g_ppb_textinput_0_1_thunk;
116 }
117 
GetPPB_TextInput_Dev_0_2_Thunk()118 const PPB_TextInput_Dev_0_2* GetPPB_TextInput_Dev_0_2_Thunk() {
119   return &g_ppb_textinput_0_2_thunk;
120 }
121 
GetPPB_TextInputController_1_0_Thunk()122 const PPB_TextInputController_1_0* GetPPB_TextInputController_1_0_Thunk() {
123   return &g_ppb_textinputcontroller_1_0_thunk;
124 }
125 
126 }  // namespace thunk
127 }  // namespace ppapi
128