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) { |