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

Unified Diff: content/renderer/pepper_plugin_delegate_impl.cc

Issue 8073021: Implement Pepper IME API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge trunk. Created 9 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/pepper_plugin_delegate_impl.h ('k') | content/renderer/render_view_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/pepper_plugin_delegate_impl.cc
diff --git a/content/renderer/pepper_plugin_delegate_impl.cc b/content/renderer/pepper_plugin_delegate_impl.cc
index 35fc894bdbdf8fa579743e198afcdf54c9ff3c84..5966fdb63fdd3fdf2717cdcb4c90c0f7f8367053 100644
--- a/content/renderer/pepper_plugin_delegate_impl.cc
+++ b/content/renderer/pepper_plugin_delegate_impl.cc
@@ -665,7 +665,7 @@ PepperPluginDelegateImpl::PepperPluginDelegateImpl(RenderViewImpl* render_view)
: render_view_(render_view),
has_saved_context_menu_action_(false),
saved_context_menu_action_(0),
- is_pepper_plugin_focused_(false),
+ focused_plugin_(NULL),
mouse_lock_owner_(NULL),
mouse_locked_(false),
pending_lock_request_(false),
@@ -849,12 +849,110 @@ PepperPluginDelegateImpl::GetBitmapForOptimizedPluginPaint(
return NULL;
}
-void PepperPluginDelegateImpl::PluginFocusChanged(bool focused) {
- is_pepper_plugin_focused_ = focused;
+void PepperPluginDelegateImpl::PluginFocusChanged(
+ webkit::ppapi::PluginInstance* instance,
+ bool focused) {
+ if (focused)
+ focused_plugin_ = instance;
+ else if (focused_plugin_ == instance)
+ focused_plugin_ = NULL;
if (render_view_)
render_view_->PpapiPluginFocusChanged();
}
+void PepperPluginDelegateImpl::PluginTextInputTypeChanged(
+ webkit::ppapi::PluginInstance* instance) {
+ if (focused_plugin_ == instance && render_view_)
+ render_view_->PpapiPluginTextInputTypeChanged();
+}
+
+void PepperPluginDelegateImpl::PluginRequestedCancelComposition(
+ webkit::ppapi::PluginInstance* instance) {
+ if (focused_plugin_ == instance && render_view_)
+ render_view_->PpapiPluginCancelComposition();
+}
+
+void PepperPluginDelegateImpl::OnImeSetComposition(
+ const string16& text,
+ const std::vector<WebKit::WebCompositionUnderline>& underlines,
+ int selection_start,
+ int selection_end) {
+ if (!IsPluginAcceptingCompositionEvents()) {
+ composition_text_ = text;
+ } else {
+ // TODO(kinaba) currently all composition events are sent directly to
+ // plugins. Use DOM event mechanism after WebKit is made aware about
+ // plugins that support composition.
+ // The code below mimics the behavior of WebCore::Editor::setComposition.
+
+ // Empty -> nonempty: composition started.
+ if (composition_text_.empty() && !text.empty())
+ focused_plugin_->HandleCompositionStart(string16());
+ // Nonempty -> empty: composition canceled.
+ if (!composition_text_.empty() && text.empty())
+ focused_plugin_->HandleCompositionEnd(string16());
+ composition_text_ = text;
+ // Nonempty: composition is ongoing.
+ if (!composition_text_.empty()) {
+ focused_plugin_->HandleCompositionUpdate(composition_text_, underlines,
+ selection_start, selection_end);
+ }
+ }
+}
+
+void PepperPluginDelegateImpl::OnImeConfirmComposition(const string16& text) {
+ // Here, text.empty() has a special meaning. It means to commit the last
+ // update of composition text (see RenderWidgetHost::ImeConfirmComposition()).
+ const string16& last_text = text.empty() ? composition_text_ : text;
+
+ // last_text is empty only when both text and composition_text_ is. Ignore it.
+ if (last_text.empty())
+ return;
+
+ if (!IsPluginAcceptingCompositionEvents()) {
+ for (size_t i = 0; i < text.size(); ++i) {
+ WebKit::WebKeyboardEvent char_event;
+ char_event.type = WebKit::WebInputEvent::Char;
+ char_event.timeStampSeconds = base::Time::Now().ToDoubleT();
+ char_event.modifiers = 0;
+ char_event.windowsKeyCode = last_text[i];
+ char_event.nativeKeyCode = last_text[i];
+ char_event.text[0] = last_text[i];
+ char_event.unmodifiedText[0] = last_text[i];
+ if (render_view_->webwidget())
+ render_view_->webwidget()->handleInputEvent(char_event);
+ }
+ } else {
+ // Mimics the order of events sent by WebKit.
+ // See WebCore::Editor::setComposition() for the corresponding code.
+ focused_plugin_->HandleCompositionEnd(last_text);
+ focused_plugin_->HandleTextInput(last_text);
+ }
+ composition_text_.clear();
+}
+
+gfx::Rect PepperPluginDelegateImpl::GetCaretBounds() const {
+ if (!focused_plugin_)
+ return gfx::Rect(0, 0, 0, 0);
+ return focused_plugin_->GetCaretBounds();
+}
+
+ui::TextInputType PepperPluginDelegateImpl::GetTextInputType() const {
+ if (!focused_plugin_)
+ return ui::TEXT_INPUT_TYPE_NONE;
+ return focused_plugin_->text_input_type();
+}
+
+bool PepperPluginDelegateImpl::IsPluginAcceptingCompositionEvents() const {
+ if (!focused_plugin_)
+ return false;
+ return focused_plugin_->IsPluginAcceptingCompositionEvents();
+}
+
+bool PepperPluginDelegateImpl::CanComposeInline() const {
+ return IsPluginAcceptingCompositionEvents();
+}
+
void PepperPluginDelegateImpl::PluginCrashed(
webkit::ppapi::PluginInstance* instance) {
subscribed_to_policy_updates_.erase(instance);
@@ -1053,7 +1151,7 @@ void PepperPluginDelegateImpl::OnSetFocus(bool has_focus) {
}
bool PepperPluginDelegateImpl::IsPluginFocused() const {
- return is_pepper_plugin_focused_;
+ return focused_plugin_ != NULL;
}
void PepperPluginDelegateImpl::OnLockMouseACK(bool succeeded) {
« no previous file with comments | « content/renderer/pepper_plugin_delegate_impl.h ('k') | content/renderer/render_view_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698