Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Side by Side Diff: webkit/plugins/ppapi/ppapi_plugin_instance.cc

Issue 8769003: Pepper IME API for surrounding text retrieval. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sort. Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" 5 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/linked_ptr.h" 10 #include "base/memory/linked_ptr.h"
11 #include "base/message_loop.h" 11 #include "base/message_loop.h"
12 #include "base/stringprintf.h" 12 #include "base/stringprintf.h"
13 #include "base/utf_offset_string_conversions.h" 13 #include "base/utf_offset_string_conversions.h"
14 #include "base/utf_string_conversions.h" 14 #include "base/utf_string_conversions.h"
15 #include "ppapi/c/dev/ppb_find_dev.h" 15 #include "ppapi/c/dev/ppb_find_dev.h"
16 #include "ppapi/c/dev/ppb_gamepad_dev.h" 16 #include "ppapi/c/dev/ppb_gamepad_dev.h"
17 #include "ppapi/c/dev/ppb_zoom_dev.h" 17 #include "ppapi/c/dev/ppb_zoom_dev.h"
18 #include "ppapi/c/dev/ppp_find_dev.h" 18 #include "ppapi/c/dev/ppp_find_dev.h"
19 #include "ppapi/c/dev/ppp_selection_dev.h" 19 #include "ppapi/c/dev/ppp_selection_dev.h"
20 #include "ppapi/c/dev/ppp_text_input_dev.h"
20 #include "ppapi/c/dev/ppp_zoom_dev.h" 21 #include "ppapi/c/dev/ppp_zoom_dev.h"
21 #include "ppapi/c/pp_rect.h" 22 #include "ppapi/c/pp_rect.h"
22 #include "ppapi/c/ppb_audio_config.h" 23 #include "ppapi/c/ppb_audio_config.h"
23 #include "ppapi/c/ppb_core.h" 24 #include "ppapi/c/ppb_core.h"
24 #include "ppapi/c/ppp_input_event.h" 25 #include "ppapi/c/ppp_input_event.h"
25 #include "ppapi/c/ppp_instance.h" 26 #include "ppapi/c/ppp_instance.h"
26 #include "ppapi/c/ppp_messaging.h" 27 #include "ppapi/c/ppp_messaging.h"
27 #include "ppapi/c/ppp_mouse_lock.h" 28 #include "ppapi/c/ppp_mouse_lock.h"
28 #include "ppapi/c/private/ppp_instance_private.h" 29 #include "ppapi/c/private/ppp_instance_private.h"
29 #include "ppapi/shared_impl/ppb_input_event_shared.h" 30 #include "ppapi/shared_impl/ppb_input_event_shared.h"
(...skipping 16 matching lines...) Expand all
46 #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" 47 #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h"
47 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" 48 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
48 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebGamepads. h" 49 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebGamepads. h"
49 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" 50 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
50 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" 51 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h"
51 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" 52 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h"
52 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" 53 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h"
53 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURL.h" 54 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURL.h"
54 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLReques t.h" 55 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLReques t.h"
55 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" 56 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
57 #include "ui/base/range/range.h"
56 #include "webkit/plugins/ppapi/common.h" 58 #include "webkit/plugins/ppapi/common.h"
57 #include "webkit/plugins/ppapi/event_conversion.h" 59 #include "webkit/plugins/ppapi/event_conversion.h"
58 #include "webkit/plugins/ppapi/fullscreen_container.h" 60 #include "webkit/plugins/ppapi/fullscreen_container.h"
59 #include "webkit/plugins/ppapi/gfx_conversion.h" 61 #include "webkit/plugins/ppapi/gfx_conversion.h"
60 #include "webkit/plugins/ppapi/host_globals.h" 62 #include "webkit/plugins/ppapi/host_globals.h"
61 #include "webkit/plugins/ppapi/message_channel.h" 63 #include "webkit/plugins/ppapi/message_channel.h"
62 #include "webkit/plugins/ppapi/npapi_glue.h" 64 #include "webkit/plugins/ppapi/npapi_glue.h"
63 #include "webkit/plugins/ppapi/plugin_module.h" 65 #include "webkit/plugins/ppapi/plugin_module.h"
64 #include "webkit/plugins/ppapi/plugin_object.h" 66 #include "webkit/plugins/ppapi/plugin_object.h"
65 #include "webkit/plugins/ppapi/ppb_buffer_impl.h" 67 #include "webkit/plugins/ppapi/ppb_buffer_impl.h"
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 147
146 namespace { 148 namespace {
147 149
148 // The default text input type is to regard the plugin always accept text input. 150 // The default text input type is to regard the plugin always accept text input.
149 // This is for allowing users to use input methods even on completely-IME- 151 // This is for allowing users to use input methods even on completely-IME-
150 // unaware plugins (e.g., PPAPI Flash or PDF plugin for M16). 152 // unaware plugins (e.g., PPAPI Flash or PDF plugin for M16).
151 // Plugins need to explicitly opt out the text input mode if they know 153 // Plugins need to explicitly opt out the text input mode if they know
152 // that they don't accept texts. 154 // that they don't accept texts.
153 const ui::TextInputType kPluginDefaultTextInputType = ui::TEXT_INPUT_TYPE_TEXT; 155 const ui::TextInputType kPluginDefaultTextInputType = ui::TEXT_INPUT_TYPE_TEXT;
154 156
157 // The length of text to request as a surrounding context of selection.
158 // For now, the value is copied from the one with render_view_impl.cc.
159 // TODO(kinaba) implement a way to dynamically sync the requirement.
160 static const size_t kExtraCharsBeforeAndAfterSelection = 100;
161
155 #define COMPILE_ASSERT_MATCHING_ENUM(webkit_name, np_name) \ 162 #define COMPILE_ASSERT_MATCHING_ENUM(webkit_name, np_name) \
156 COMPILE_ASSERT(static_cast<int>(WebCursorInfo::webkit_name) \ 163 COMPILE_ASSERT(static_cast<int>(WebCursorInfo::webkit_name) \
157 == static_cast<int>(np_name), \ 164 == static_cast<int>(np_name), \
158 mismatching_enums) 165 mismatching_enums)
159 166
160 // <embed>/<object> attributes. 167 // <embed>/<object> attributes.
161 const char kWidth[] = "width"; 168 const char kWidth[] = "width";
162 const char kHeight[] = "height"; 169 const char kHeight[] = "height";
163 const char kBorder[] = "border"; // According to w3c, deprecated. 170 const char kBorder[] = "border"; // According to w3c, deprecated.
164 const char kStyle[] = "style"; 171 const char kStyle[] = "style";
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 has_webkit_focus_(false), 283 has_webkit_focus_(false),
277 has_content_area_focus_(false), 284 has_content_area_focus_(false),
278 find_identifier_(-1), 285 find_identifier_(-1),
279 plugin_find_interface_(NULL), 286 plugin_find_interface_(NULL),
280 plugin_messaging_interface_(NULL), 287 plugin_messaging_interface_(NULL),
281 plugin_mouse_lock_interface_(NULL), 288 plugin_mouse_lock_interface_(NULL),
282 plugin_input_event_interface_(NULL), 289 plugin_input_event_interface_(NULL),
283 plugin_private_interface_(NULL), 290 plugin_private_interface_(NULL),
284 plugin_pdf_interface_(NULL), 291 plugin_pdf_interface_(NULL),
285 plugin_selection_interface_(NULL), 292 plugin_selection_interface_(NULL),
293 plugin_textinput_interface_(NULL),
286 plugin_zoom_interface_(NULL), 294 plugin_zoom_interface_(NULL),
287 checked_for_plugin_input_event_interface_(false), 295 checked_for_plugin_input_event_interface_(false),
288 checked_for_plugin_messaging_interface_(false), 296 checked_for_plugin_messaging_interface_(false),
289 plugin_print_interface_(NULL), 297 plugin_print_interface_(NULL),
290 plugin_graphics_3d_interface_(NULL), 298 plugin_graphics_3d_interface_(NULL),
291 always_on_top_(false), 299 always_on_top_(false),
292 fullscreen_container_(NULL), 300 fullscreen_container_(NULL),
293 flash_fullscreen_(false), 301 flash_fullscreen_(false),
294 desired_fullscreen_state_(false), 302 desired_fullscreen_state_(false),
295 message_channel_(NULL), 303 message_channel_(NULL),
296 sad_plugin_(NULL), 304 sad_plugin_(NULL),
297 input_event_mask_(0), 305 input_event_mask_(0),
298 filtered_input_event_mask_(0), 306 filtered_input_event_mask_(0),
299 text_input_type_(kPluginDefaultTextInputType), 307 text_input_type_(kPluginDefaultTextInputType),
300 text_input_caret_(0, 0, 0, 0), 308 text_input_caret_(0, 0, 0, 0),
301 text_input_caret_bounds_(0, 0, 0, 0), 309 text_input_caret_bounds_(0, 0, 0, 0),
302 text_input_caret_set_(false), 310 text_input_caret_set_(false),
311 selection_caret_(0),
312 selection_anchor_(0),
303 lock_mouse_callback_(PP_BlockUntilComplete()) { 313 lock_mouse_callback_(PP_BlockUntilComplete()) {
304 pp_instance_ = HostGlobals::Get()->AddInstance(this); 314 pp_instance_ = HostGlobals::Get()->AddInstance(this);
305 315
306 memset(&current_print_settings_, 0, sizeof(current_print_settings_)); 316 memset(&current_print_settings_, 0, sizeof(current_print_settings_));
307 DCHECK(delegate); 317 DCHECK(delegate);
308 module_->InstanceCreated(this); 318 module_->InstanceCreated(this);
309 delegate_->InstanceCreated(this); 319 delegate_->InstanceCreated(this);
310 message_channel_.reset(new MessageChannel(this)); 320 message_channel_.reset(new MessageChannel(this));
311 321
312 view_data_.is_page_visible = delegate->IsPageVisible(); 322 view_data_.is_page_visible = delegate->IsPageVisible();
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 text_input_caret_bounds_ = bounding_box; 635 text_input_caret_bounds_ = bounding_box;
626 text_input_caret_set_ = true; 636 text_input_caret_set_ = true;
627 delegate()->PluginCaretPositionChanged(this); 637 delegate()->PluginCaretPositionChanged(this);
628 } 638 }
629 639
630 void PluginInstance::SetTextInputType(ui::TextInputType type) { 640 void PluginInstance::SetTextInputType(ui::TextInputType type) {
631 text_input_type_ = type; 641 text_input_type_ = type;
632 delegate()->PluginTextInputTypeChanged(this); 642 delegate()->PluginTextInputTypeChanged(this);
633 } 643 }
634 644
645 void PluginInstance::SelectionChanged() {
646 // TODO(kinaba): currently the browser always calls RequestSurroundingText.
647 // It can be optimized so that it won't call it back until the information
648 // is really needed.
649 RequestSurroundingText(kExtraCharsBeforeAndAfterSelection);
650 }
651
652 void PluginInstance::UpdateSurroundingText(const std::string& text,
653 size_t caret, size_t anchor) {
654 surrounding_text_ = text;
655 selection_caret_ = caret;
656 selection_anchor_ = anchor;
657 delegate()->PluginSelectionChanged(this);
658 }
659
660 void PluginInstance::GetSurroundingText(string16* text,
661 ui::Range* range) const {
662 std::vector<size_t> offsets;
663 offsets.push_back(selection_anchor_);
664 offsets.push_back(selection_caret_);
665 *text = UTF8ToUTF16AndAdjustOffsets(surrounding_text_, &offsets);
666 range->set_start(offsets[0] == string16::npos ? text->size() : offsets[0]);
667 range->set_end(offsets[1] == string16::npos ? text->size() : offsets[1]);
668 }
669
635 bool PluginInstance::IsPluginAcceptingCompositionEvents() const { 670 bool PluginInstance::IsPluginAcceptingCompositionEvents() const {
636 return (filtered_input_event_mask_ & PP_INPUTEVENT_CLASS_IME) || 671 return (filtered_input_event_mask_ & PP_INPUTEVENT_CLASS_IME) ||
637 (input_event_mask_ & PP_INPUTEVENT_CLASS_IME); 672 (input_event_mask_ & PP_INPUTEVENT_CLASS_IME);
638 } 673 }
639 674
640 gfx::Rect PluginInstance::GetCaretBounds() const { 675 gfx::Rect PluginInstance::GetCaretBounds() const {
641 if (!text_input_caret_set_) { 676 if (!text_input_caret_set_) {
642 // If it is never set by the plugin, use the bottom left corner. 677 // If it is never set by the plugin, use the bottom left corner.
643 return gfx::Rect(view_data_.rect.point.x, 678 return gfx::Rect(view_data_.rect.point.x,
644 view_data_.rect.point.y + view_data_.rect.size.height, 679 view_data_.rect.point.y + view_data_.rect.size.height,
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 PP_Var rv = plugin_pdf_interface_->GetLinkAtPosition(pp_instance(), p); 919 PP_Var rv = plugin_pdf_interface_->GetLinkAtPosition(pp_instance(), p);
885 StringVar* string = StringVar::FromPPVar(rv); 920 StringVar* string = StringVar::FromPPVar(rv);
886 string16 link; 921 string16 link;
887 if (string) 922 if (string)
888 link = UTF8ToUTF16(string->value()); 923 link = UTF8ToUTF16(string->value());
889 // Release the ref the plugin transfered to us. 924 // Release the ref the plugin transfered to us.
890 PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(rv); 925 PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(rv);
891 return link; 926 return link;
892 } 927 }
893 928
929 bool PluginInstance::RequestSurroundingText(
930 size_t desired_number_of_characters) {
931 // Keep a reference on the stack. See NOTE above.
932 scoped_refptr<PluginInstance> ref(this);
933 if (!LoadTextInputInterface())
934 return false;
935 plugin_textinput_interface_->RequestSurroundingText(
936 pp_instance(), desired_number_of_characters);
937 return true;
938 }
939
894 void PluginInstance::Zoom(double factor, bool text_only) { 940 void PluginInstance::Zoom(double factor, bool text_only) {
895 // Keep a reference on the stack. See NOTE above. 941 // Keep a reference on the stack. See NOTE above.
896 scoped_refptr<PluginInstance> ref(this); 942 scoped_refptr<PluginInstance> ref(this);
897 if (!LoadZoomInterface()) 943 if (!LoadZoomInterface())
898 return; 944 return;
899 plugin_zoom_interface_->Zoom(pp_instance(), factor, PP_FromBool(text_only)); 945 plugin_zoom_interface_->Zoom(pp_instance(), factor, PP_FromBool(text_only));
900 } 946 }
901 947
902 bool PluginInstance::StartFind(const string16& search_text, 948 bool PluginInstance::StartFind(const string16& search_text,
903 bool case_sensitive, 949 bool case_sensitive,
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
1000 1046
1001 bool PluginInstance::LoadSelectionInterface() { 1047 bool PluginInstance::LoadSelectionInterface() {
1002 if (!plugin_selection_interface_) { 1048 if (!plugin_selection_interface_) {
1003 plugin_selection_interface_ = 1049 plugin_selection_interface_ =
1004 static_cast<const PPP_Selection_Dev*>(module_->GetPluginInterface( 1050 static_cast<const PPP_Selection_Dev*>(module_->GetPluginInterface(
1005 PPP_SELECTION_DEV_INTERFACE)); 1051 PPP_SELECTION_DEV_INTERFACE));
1006 } 1052 }
1007 return !!plugin_selection_interface_; 1053 return !!plugin_selection_interface_;
1008 } 1054 }
1009 1055
1056 bool PluginInstance::LoadTextInputInterface() {
1057 if (!plugin_textinput_interface_) {
1058 plugin_textinput_interface_ =
1059 static_cast<const PPP_TextInput_Dev*>(module_->GetPluginInterface(
1060 PPP_TEXTINPUT_DEV_INTERFACE));
1061 }
1062
1063 return !!plugin_textinput_interface_;
1064 }
1065
1010 bool PluginInstance::LoadZoomInterface() { 1066 bool PluginInstance::LoadZoomInterface() {
1011 if (!plugin_zoom_interface_) { 1067 if (!plugin_zoom_interface_) {
1012 plugin_zoom_interface_ = 1068 plugin_zoom_interface_ =
1013 static_cast<const PPP_Zoom_Dev*>(module_->GetPluginInterface( 1069 static_cast<const PPP_Zoom_Dev*>(module_->GetPluginInterface(
1014 PPP_ZOOM_DEV_INTERFACE)); 1070 PPP_ZOOM_DEV_INTERFACE));
1015 } 1071 }
1016 1072
1017 return !!plugin_zoom_interface_; 1073 return !!plugin_zoom_interface_;
1018 } 1074 }
1019 1075
(...skipping 1060 matching lines...) Expand 10 before | Expand all | Expand 10 after
2080 screen_size_for_fullscreen_ = gfx::Size(); 2136 screen_size_for_fullscreen_ = gfx::Size();
2081 WebElement element = container_->element(); 2137 WebElement element = container_->element();
2082 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); 2138 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_);
2083 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); 2139 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_);
2084 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); 2140 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_);
2085 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); 2141 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_);
2086 } 2142 }
2087 2143
2088 } // namespace ppapi 2144 } // namespace ppapi
2089 } // namespace webkit 2145 } // namespace webkit
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698