diff options
Diffstat (limited to 'ppapi/cpp')
-rw-r--r-- | ppapi/cpp/dev/text_input_dev.cc | 89 | ||||
-rw-r--r-- | ppapi/cpp/dev/text_input_dev.h | 39 |
2 files changed, 107 insertions, 21 deletions
diff --git a/ppapi/cpp/dev/text_input_dev.cc b/ppapi/cpp/dev/text_input_dev.cc index 6783892..3b38df8 100644 --- a/ppapi/cpp/dev/text_input_dev.cc +++ b/ppapi/cpp/dev/text_input_dev.cc @@ -1,9 +1,11 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ppapi/cpp/dev/text_input_dev.h" +#include "ppapi/c/dev/ppp_text_input_dev.h" +#include "ppapi/cpp/instance.h" #include "ppapi/cpp/instance_handle.h" #include "ppapi/cpp/module_impl.h" #include "ppapi/cpp/rect.h" @@ -12,40 +14,95 @@ namespace pp { namespace { -template <> const char* interface_name<PPB_TextInput_Dev>() { - return PPB_TEXTINPUT_DEV_INTERFACE; +static const char kPPPTextInputInterface[] = PPP_TEXTINPUT_DEV_INTERFACE; + +void RequestSurroundingText(PP_Instance instance, + uint32_t desired_number_of_characters) { + void* object = Instance::GetPerInstanceObject(instance, + kPPPTextInputInterface); + if (!object) + return; + static_cast<TextInput_Dev*>(object)->RequestSurroundingText( + desired_number_of_characters); +} + +const PPP_TextInput_Dev ppp_text_input = { + &RequestSurroundingText +}; + +template <> const char* interface_name<PPB_TextInput_Dev_0_2>() { + return PPB_TEXTINPUT_DEV_INTERFACE_0_2; +} + +template <> const char* interface_name<PPB_TextInput_Dev_0_1>() { + return PPB_TEXTINPUT_DEV_INTERFACE_0_1; } } // namespace -TextInput_Dev::TextInput_Dev(const InstanceHandle& instance) +TextInput_Dev::TextInput_Dev(Instance* instance) : instance_(instance) { + Module::Get()->AddPluginInterface(kPPPTextInputInterface, + &ppp_text_input); + instance->AddPerInstanceObject(kPPPTextInputInterface, this); } TextInput_Dev::~TextInput_Dev() { + Instance::RemovePerInstanceObject(instance_, kPPPTextInputInterface, this); +} + +void TextInput_Dev::RequestSurroundingText(uint32_t) { + // Default implementation. Send a null range. + UpdateSurroundingText("", 0, 0); } void TextInput_Dev::SetTextInputType(PP_TextInput_Type type) { - if (!has_interface<PPB_TextInput_Dev>()) - return; - get_interface<PPB_TextInput_Dev>()->SetTextInputType( - instance_.pp_instance(), type); + if (has_interface<PPB_TextInput_Dev_0_2>()) { + get_interface<PPB_TextInput_Dev_0_2>()->SetTextInputType( + instance_.pp_instance(), type); + } else if (has_interface<PPB_TextInput_Dev_0_1>()) { + get_interface<PPB_TextInput_Dev_0_1>()->SetTextInputType( + instance_.pp_instance(), type); + } } void TextInput_Dev::UpdateCaretPosition(const Rect& caret, const Rect& bounding_box) { - if (!has_interface<PPB_TextInput_Dev>()) - return; - get_interface<PPB_TextInput_Dev>()->UpdateCaretPosition( - instance_.pp_instance(), &caret.pp_rect(), &bounding_box.pp_rect()); + if (has_interface<PPB_TextInput_Dev_0_2>()) { + get_interface<PPB_TextInput_Dev_0_2>()->UpdateCaretPosition( + instance_.pp_instance(), &caret.pp_rect(), &bounding_box.pp_rect()); + } else if (has_interface<PPB_TextInput_Dev_0_1>()) { + get_interface<PPB_TextInput_Dev_0_1>()->UpdateCaretPosition( + instance_.pp_instance(), &caret.pp_rect(), &bounding_box.pp_rect()); + } } void TextInput_Dev::CancelCompositionText() { - if (!has_interface<PPB_TextInput_Dev>()) - return; - get_interface<PPB_TextInput_Dev>()->CancelCompositionText( - instance_.pp_instance()); + if (has_interface<PPB_TextInput_Dev_0_2>()) { + get_interface<PPB_TextInput_Dev_0_2>()->CancelCompositionText( + instance_.pp_instance()); + } else if (has_interface<PPB_TextInput_Dev_0_1>()) { + get_interface<PPB_TextInput_Dev_0_1>()->CancelCompositionText( + instance_.pp_instance()); + } +} + +void TextInput_Dev::SelectionChanged() { + if (has_interface<PPB_TextInput_Dev_0_2>()) { + get_interface<PPB_TextInput_Dev_0_2>()->SelectionChanged( + instance_.pp_instance()); + } +} + +void TextInput_Dev::UpdateSurroundingText(const std::string& text, + uint32_t caret, + uint32_t anchor) { + if (has_interface<PPB_TextInput_Dev_0_2>()) { + get_interface<PPB_TextInput_Dev_0_2>()->UpdateSurroundingText( + instance_.pp_instance(), text.c_str(), caret, anchor); + } } + } // namespace pp diff --git a/ppapi/cpp/dev/text_input_dev.h b/ppapi/cpp/dev/text_input_dev.h index af21a90..ea75597 100644 --- a/ppapi/cpp/dev/text_input_dev.h +++ b/ppapi/cpp/dev/text_input_dev.h @@ -1,27 +1,56 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef PPAPI_CPP_DEV_TEXT_INPUT_DEV_H_ #define PPAPI_CPP_DEV_TEXT_INPUT_DEV_H_ +#include <string> + #include "ppapi/c/dev/ppb_text_input_dev.h" #include "ppapi/cpp/instance_handle.h" -/// @file -/// This file defines the API for controlling text input methods. namespace pp { class Rect; - +class Instance; + +// This class allows you to associate the PPP_TextInput_Dev and +// PPB_TextInput_Dev C-based interfaces with an object. It associates itself +// with the given instance, and registers as the global handler for handling the +// PPP_TextInput_Dev interface that the browser calls. +// +// You would typically use this either via inheritance on your instance: +// class MyInstance : public pp::Instance, public pp::TextInput_Dev { +// MyInstance() : pp::TextInput_Dev(this) { +// } +// ... +// }; +// +// or by composition: +// class MyTextInput : public pp::TextInput_Dev { +// ... +// }; +// +// class MyInstance : public pp::Instance { +// MyInstance() : text_input_(this) { +// } +// +// MyTextInput text_input_; +// }; class TextInput_Dev { public: - explicit TextInput_Dev(const InstanceHandle& instance); + explicit TextInput_Dev(Instance* instance); virtual ~TextInput_Dev(); + virtual void RequestSurroundingText(uint32_t desired_number_of_characters); + void SetTextInputType(PP_TextInput_Type type); void UpdateCaretPosition(const Rect& caret, const Rect& bounding_box); void CancelCompositionText(); + void SelectionChanged(); + void UpdateSurroundingText(const std::string& text, + uint32_t caret, uint32_t anchor); private: InstanceHandle instance_; |