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