Chromium Code Reviews| Index: content/renderer/pepper/pepper_plugin_instance_impl.cc |
| diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc |
| index ade82c2000fbff03f841994c081a4aadc32b7ba8..e9ba90e67dbdba89ba8bb6e313a3ba83422ef02c 100644 |
| --- a/content/renderer/pepper/pepper_plugin_instance_impl.cc |
| +++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc |
| @@ -120,6 +120,7 @@ |
| #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" |
| #include "third_party/WebKit/public/web/WebView.h" |
| #include "third_party/khronos/GLES2/gl2.h" |
| +#include "ui/events/blink/blink_event_util.h" |
| #include "ui/gfx/image/image_skia.h" |
| #include "ui/gfx/image/image_skia_rep.h" |
| #include "ui/gfx/range/range.h" |
| @@ -532,6 +533,7 @@ PepperPluginInstanceImpl::PepperPluginInstanceImpl( |
| isolate_(v8::Isolate::GetCurrent()), |
| is_deleted_(false), |
| initialized_(false), |
| + viewport_to_dip_scale_(1.f), |
| view_change_weak_ptr_factory_(this), |
| weak_factory_(this) { |
| pp_instance_ = HostGlobals::Get()->AddInstance(this); |
| @@ -1078,21 +1080,23 @@ bool PepperPluginInstanceImpl::IsPluginAcceptingCompositionEvents() const { |
| gfx::Rect PepperPluginInstanceImpl::GetCaretBounds() const { |
| if (!text_input_caret_set_) { |
| + gfx::Rect rect(view_data_.rect.point.x, |
| + view_data_.rect.point.y + view_data_.rect.size.height, |
| + 0, 0); |
| // If it is never set by the plugin, use the bottom left corner. |
|
bbudge
2016/01/21 00:34:51
Comment seems misplaced. Should it be before setti
oshima
2016/01/21 01:12:07
Done. I also removed else (I was going to fix it b
|
| - return gfx::Rect(view_data_.rect.point.x, |
| - view_data_.rect.point.y + view_data_.rect.size.height, |
| - 0, |
| - 0); |
| + ConvertDIPToViewport(&rect); |
| + return rect; |
| + } else { |
| + // TODO(kinaba) Take CSS transformation into accont. |
|
bbudge
2016/01/21 00:34:51
sp. account
oshima
2016/01/21 01:12:07
Done.
|
| + // TODO(kinaba) Take bounding_box into account. On some platforms, an |
|
bbudge
2016/01/21 00:34:51
It's not clear to me what 'bounding_box' is referr
oshima
2016/01/21 01:12:07
I believe kinaba@ meant |text_input_caret_bounds_|
|
| + // "exclude rectangle" where candidate window must avoid the region can be |
| + // passed to IME. Currently, we pass only the caret rectangle because |
| + // it is the only information supported uniformly in Chromium. |
| + gfx::Rect caret(text_input_caret_); |
| + caret.Offset(view_data_.rect.point.x, view_data_.rect.point.y); |
| + ConvertDIPToViewport(&caret); |
| + return caret; |
| } |
| - |
| - // TODO(kinaba) Take CSS transformation into accont. |
| - // TODO(kinaba) Take bounding_box into account. On some platforms, an |
| - // "exclude rectangle" where candidate window must avoid the region can be |
| - // passed to IME. Currently, we pass only the caret rectangle because |
| - // it is the only information supported uniformly in Chromium. |
| - gfx::Rect caret(text_input_caret_); |
| - caret.Offset(view_data_.rect.point.x, view_data_.rect.point.y); |
| - return caret; |
| } |
| bool PepperPluginInstanceImpl::HandleInputEvent( |
| @@ -1105,6 +1109,7 @@ bool PepperPluginInstanceImpl::HandleInputEvent( |
| (event.modifiers & blink::WebInputEvent::LeftButtonDown)) { |
| has_been_clicked_ = true; |
| blink::WebRect bounds = container()->element().boundsInViewport(); |
| + render_frame()->GetRenderWidget()->convertViewportToWindow(&bounds); |
| RecordFlashClickSizeMetric(bounds.width, bounds.height); |
| } |
| @@ -1138,7 +1143,12 @@ bool PepperPluginInstanceImpl::HandleInputEvent( |
| (input_event_mask_ & event_class)) { |
| // Actually send the event. |
| std::vector<ppapi::InputEventData> events; |
| - CreateInputEventData(event, &events); |
| + scoped_ptr<const WebInputEvent> event_in_dip( |
| + ui::ScaleWebInputEvent(event, viewport_to_dip_scale_)); |
| + if (event_in_dip) |
| + CreateInputEventData(*event_in_dip.get(), &events); |
| + else |
| + CreateInputEventData(event, &events); |
| // Allow the user gesture to be pending after the plugin handles the |
| // event. This allows out-of-process plugins to respond to the user |
| @@ -1256,6 +1266,14 @@ void PepperPluginInstanceImpl::ViewChanged( |
| view_data_.css_scale = |
| container_->pageZoomFactor() * container_->pageScaleFactor(); |
| + float windowToViewportScale = |
| + render_frame()->GetRenderWidget()->convertWindowToViewport(1.0f); |
|
bbudge
2016/01/21 00:34:51
nit: Mixing 1.0f and 1.f.
1.0f seems more consist
oshima
2016/01/21 01:12:07
Done
|
| + viewport_to_dip_scale_ = 1.f / windowToViewportScale; |
| + ConvertRectToDIP(&view_data_.rect); |
| + ConvertRectToDIP(&view_data_.clip_rect); |
| + view_data_.css_scale *= viewport_to_dip_scale_; |
| + view_data_.device_scale /= viewport_to_dip_scale_; |
| + |
| gfx::Size scroll_offset = |
| container_->element().document().frame()->scrollOffset(); |
| view_data_.scroll_offset = PP_MakePoint(scroll_offset.width(), |
| @@ -3299,4 +3317,18 @@ void PepperPluginInstanceImpl::RecordFlashJavaScriptUse() { |
| } |
| } |
| +void PepperPluginInstanceImpl::ConvertRectToDIP(PP_Rect* rect) const { |
| + rect->point.x *= viewport_to_dip_scale_; |
| + rect->point.y *= viewport_to_dip_scale_; |
| + rect->size.width *= viewport_to_dip_scale_; |
| + rect->size.height *= viewport_to_dip_scale_; |
| +} |
| + |
| +void PepperPluginInstanceImpl::ConvertDIPToViewport(gfx::Rect* rect) const { |
| + rect->set_x(rect->x() / viewport_to_dip_scale_); |
| + rect->set_y(rect->y() / viewport_to_dip_scale_); |
| + rect->set_width(rect->width() / viewport_to_dip_scale_); |
| + rect->set_height(rect->height() / viewport_to_dip_scale_); |
| +} |
| + |
| } // namespace content |