| Index: ppapi/thunk/ppb_input_event_thunk.cc
 | 
| diff --git a/ppapi/thunk/ppb_input_event_thunk.cc b/ppapi/thunk/ppb_input_event_thunk.cc
 | 
| index 6028c6e9e6b7e166805b45ddde493eda819e2408..7c8820a883c562031e9a8ddf6ccf79897f541f78 100644
 | 
| --- a/ppapi/thunk/ppb_input_event_thunk.cc
 | 
| +++ b/ppapi/thunk/ppb_input_event_thunk.cc
 | 
| @@ -271,6 +271,64 @@ const PPB_KeyboardInputEvent g_ppb_keyboard_input_event_thunk = {
 | 
|    &GetCharacterText
 | 
|  };
 | 
|  
 | 
| +// Composition -----------------------------------------------------------------
 | 
| +
 | 
| +PP_Bool IsIMEInputEvent(PP_Resource resource) {
 | 
| +  if (!IsInputEvent(resource))
 | 
| +    return PP_FALSE;  // Prevent warning log in GetType.
 | 
| +  PP_InputEvent_Type type = GetType(resource);
 | 
| +  return PP_FromBool(type == PP_INPUTEVENT_TYPE_IME_COMPOSITION_START ||
 | 
| +                     type == PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE ||
 | 
| +                     type == PP_INPUTEVENT_TYPE_IME_COMPOSITION_END ||
 | 
| +                     type == PP_INPUTEVENT_TYPE_IME_TEXT);
 | 
| +}
 | 
| +
 | 
| +PP_Var GetIMEText(PP_Resource ime_event) {
 | 
| +  return GetCharacterText(ime_event);
 | 
| +}
 | 
| +
 | 
| +uint32_t GetIMESegmentNumber(PP_Resource ime_event) {
 | 
| +  EnterInputEvent enter(ime_event, true);
 | 
| +  if (enter.failed())
 | 
| +    return 0;
 | 
| +  return enter.object()->GetIMESegmentNumber();
 | 
| +}
 | 
| +
 | 
| +uint32_t GetIMESegmentOffset(PP_Resource ime_event, uint32_t index) {
 | 
| +  EnterInputEvent enter(ime_event, true);
 | 
| +  if (enter.failed())
 | 
| +    return 0;
 | 
| +  return enter.object()->GetIMESegmentOffset(index);
 | 
| +}
 | 
| +
 | 
| +int32_t GetIMETargetSegment(PP_Resource ime_event) {
 | 
| +  EnterInputEvent enter(ime_event, true);
 | 
| +  if (enter.failed())
 | 
| +    return -1;
 | 
| +  return enter.object()->GetIMETargetSegment();
 | 
| +}
 | 
| +
 | 
| +void GetIMESelection(PP_Resource ime_event, uint32_t* start, uint32_t* end) {
 | 
| +  EnterInputEvent enter(ime_event, true);
 | 
| +  if (enter.failed()) {
 | 
| +    if (start)
 | 
| +      *start = 0;
 | 
| +    if (end)
 | 
| +      *end = 0;
 | 
| +    return;
 | 
| +  }
 | 
| +  enter.object()->GetIMESelection(start, end);
 | 
| +}
 | 
| +
 | 
| +const PPB_IMEInputEvent_Dev g_ppb_ime_input_event_thunk = {
 | 
| +  &IsIMEInputEvent,
 | 
| +  &GetIMEText,
 | 
| +  &GetIMESegmentNumber,
 | 
| +  &GetIMESegmentOffset,
 | 
| +  &GetIMETargetSegment,
 | 
| +  &GetIMESelection
 | 
| +};
 | 
| +
 | 
|  }  // namespace
 | 
|  
 | 
|  const PPB_InputEvent* GetPPB_InputEvent_Thunk() {
 | 
| @@ -293,5 +351,9 @@ const PPB_WheelInputEvent* GetPPB_WheelInputEvent_Thunk() {
 | 
|    return &g_ppb_wheel_input_event_thunk;
 | 
|  }
 | 
|  
 | 
| +const PPB_IMEInputEvent_Dev* GetPPB_IMEInputEvent_Dev_Thunk() {
 | 
| +  return &g_ppb_ime_input_event_thunk;
 | 
| +}
 | 
| +
 | 
|  }  // namespace thunk
 | 
|  }  // namespace ppapi
 | 
| 
 |