2020-01-23 22:58:01 +01:00
|
|
|
// Copyright 2020 The Chromium Embedded Framework 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 "libcef/browser/native/browser_platform_delegate_native_aura.h"
|
|
|
|
|
|
|
|
#include "content/browser/renderer_host/render_widget_host_view_aura.h"
|
|
|
|
#include "content/public/browser/render_view_host.h"
|
|
|
|
#include "content/public/browser/render_widget_host.h"
|
|
|
|
#include "ui/events/blink/blink_event_util.h"
|
|
|
|
#include "ui/events/blink/web_input_event.h"
|
|
|
|
#include "ui/gfx/geometry/vector2d.h"
|
|
|
|
|
|
|
|
CefBrowserPlatformDelegateNativeAura::CefBrowserPlatformDelegateNativeAura(
|
|
|
|
const CefWindowInfo& window_info,
|
2020-07-04 20:21:34 +02:00
|
|
|
SkColor background_color)
|
|
|
|
: CefBrowserPlatformDelegateNative(window_info, background_color) {}
|
2020-01-23 22:58:01 +01:00
|
|
|
|
|
|
|
void CefBrowserPlatformDelegateNativeAura::SendKeyEvent(
|
|
|
|
const CefKeyEvent& event) {
|
|
|
|
auto view = GetHostView();
|
|
|
|
if (!view)
|
|
|
|
return;
|
|
|
|
|
|
|
|
ui::KeyEvent ui_event = TranslateUiKeyEvent(event);
|
|
|
|
view->OnKeyEvent(&ui_event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CefBrowserPlatformDelegateNativeAura::SendMouseClickEvent(
|
|
|
|
const CefMouseEvent& event,
|
|
|
|
CefBrowserHost::MouseButtonType type,
|
|
|
|
bool mouseUp,
|
|
|
|
int clickCount) {
|
|
|
|
auto view = GetHostView();
|
|
|
|
if (!view)
|
|
|
|
return;
|
|
|
|
|
|
|
|
ui::MouseEvent ui_event =
|
|
|
|
TranslateUiClickEvent(event, type, mouseUp, clickCount);
|
|
|
|
view->OnMouseEvent(&ui_event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CefBrowserPlatformDelegateNativeAura::SendMouseMoveEvent(
|
|
|
|
const CefMouseEvent& event,
|
|
|
|
bool mouseLeave) {
|
|
|
|
auto view = GetHostView();
|
|
|
|
if (!view)
|
|
|
|
return;
|
|
|
|
|
|
|
|
ui::MouseEvent ui_event = TranslateUiMoveEvent(event, mouseLeave);
|
|
|
|
view->OnMouseEvent(&ui_event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CefBrowserPlatformDelegateNativeAura::SendMouseWheelEvent(
|
|
|
|
const CefMouseEvent& event,
|
|
|
|
int deltaX,
|
|
|
|
int deltaY) {
|
|
|
|
auto view = GetHostView();
|
|
|
|
if (!view)
|
|
|
|
return;
|
|
|
|
|
|
|
|
ui::MouseWheelEvent ui_event = TranslateUiWheelEvent(event, deltaX, deltaY);
|
|
|
|
view->OnMouseEvent(&ui_event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CefBrowserPlatformDelegateNativeAura::SendTouchEvent(
|
|
|
|
const CefTouchEvent& event) {
|
|
|
|
NOTIMPLEMENTED();
|
|
|
|
}
|
|
|
|
|
|
|
|
content::NativeWebKeyboardEvent
|
|
|
|
CefBrowserPlatformDelegateNativeAura::TranslateWebKeyEvent(
|
|
|
|
const CefKeyEvent& key_event) const {
|
|
|
|
return content::NativeWebKeyboardEvent(TranslateUiKeyEvent(key_event));
|
|
|
|
}
|
|
|
|
|
|
|
|
blink::WebMouseEvent
|
|
|
|
CefBrowserPlatformDelegateNativeAura::TranslateWebClickEvent(
|
|
|
|
const CefMouseEvent& mouse_event,
|
|
|
|
CefBrowserHost::MouseButtonType type,
|
|
|
|
bool mouseUp,
|
|
|
|
int clickCount) const {
|
|
|
|
return ui::MakeWebMouseEvent(
|
|
|
|
TranslateUiClickEvent(mouse_event, type, mouseUp, clickCount));
|
|
|
|
}
|
|
|
|
|
|
|
|
blink::WebMouseEvent
|
|
|
|
CefBrowserPlatformDelegateNativeAura::TranslateWebMoveEvent(
|
|
|
|
const CefMouseEvent& mouse_event,
|
|
|
|
bool mouseLeave) const {
|
|
|
|
return ui::MakeWebMouseEvent(TranslateUiMoveEvent(mouse_event, mouseLeave));
|
|
|
|
}
|
|
|
|
|
|
|
|
blink::WebMouseWheelEvent
|
|
|
|
CefBrowserPlatformDelegateNativeAura::TranslateWebWheelEvent(
|
|
|
|
const CefMouseEvent& mouse_event,
|
|
|
|
int deltaX,
|
|
|
|
int deltaY) const {
|
|
|
|
return ui::MakeWebMouseWheelEvent(
|
|
|
|
TranslateUiWheelEvent(mouse_event, deltaX, deltaY));
|
|
|
|
}
|
|
|
|
|
|
|
|
ui::MouseEvent CefBrowserPlatformDelegateNativeAura::TranslateUiClickEvent(
|
|
|
|
const CefMouseEvent& mouse_event,
|
|
|
|
CefBrowserHost::MouseButtonType type,
|
|
|
|
bool mouseUp,
|
|
|
|
int clickCount) const {
|
|
|
|
DCHECK_GE(clickCount, 1);
|
|
|
|
|
|
|
|
ui::EventType event_type =
|
|
|
|
mouseUp ? ui::ET_MOUSE_RELEASED : ui::ET_MOUSE_PRESSED;
|
|
|
|
gfx::PointF location(mouse_event.x, mouse_event.y);
|
|
|
|
gfx::PointF root_location(
|
|
|
|
GetScreenPoint(gfx::Point(mouse_event.x, mouse_event.y)));
|
|
|
|
base::TimeTicks time_stamp = GetEventTimeStamp();
|
|
|
|
int flags = TranslateUiEventModifiers(mouse_event.modifiers);
|
|
|
|
|
|
|
|
int changed_button_flags = 0;
|
|
|
|
switch (type) {
|
|
|
|
case MBT_LEFT:
|
|
|
|
changed_button_flags |= ui::EF_LEFT_MOUSE_BUTTON;
|
|
|
|
break;
|
|
|
|
case MBT_MIDDLE:
|
|
|
|
changed_button_flags |= ui::EF_MIDDLE_MOUSE_BUTTON;
|
|
|
|
break;
|
|
|
|
case MBT_RIGHT:
|
|
|
|
changed_button_flags |= ui::EF_RIGHT_MOUSE_BUTTON;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
NOTREACHED();
|
|
|
|
}
|
|
|
|
|
|
|
|
ui::MouseEvent result(event_type, location, root_location, time_stamp, flags,
|
|
|
|
changed_button_flags);
|
|
|
|
result.SetClickCount(clickCount);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
ui::MouseEvent CefBrowserPlatformDelegateNativeAura::TranslateUiMoveEvent(
|
|
|
|
const CefMouseEvent& mouse_event,
|
|
|
|
bool mouseLeave) const {
|
|
|
|
ui::EventType event_type =
|
|
|
|
mouseLeave ? ui::ET_MOUSE_EXITED : ui::ET_MOUSE_MOVED;
|
|
|
|
gfx::PointF location(mouse_event.x, mouse_event.y);
|
|
|
|
gfx::PointF root_location(
|
|
|
|
GetScreenPoint(gfx::Point(mouse_event.x, mouse_event.y)));
|
|
|
|
base::TimeTicks time_stamp = GetEventTimeStamp();
|
|
|
|
int flags = TranslateUiEventModifiers(mouse_event.modifiers);
|
|
|
|
|
|
|
|
int changed_button_flags = 0;
|
|
|
|
if (!mouseLeave) {
|
|
|
|
changed_button_flags = TranslateUiChangedButtonFlags(mouse_event.modifiers);
|
|
|
|
}
|
|
|
|
|
|
|
|
return ui::MouseEvent(event_type, location, root_location, time_stamp, flags,
|
|
|
|
changed_button_flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
ui::MouseWheelEvent CefBrowserPlatformDelegateNativeAura::TranslateUiWheelEvent(
|
|
|
|
const CefMouseEvent& mouse_event,
|
|
|
|
int deltaX,
|
|
|
|
int deltaY) const {
|
|
|
|
gfx::Vector2d offset(GetUiWheelEventOffset(deltaX, deltaY));
|
|
|
|
DCHECK(!offset.IsZero());
|
|
|
|
|
|
|
|
gfx::PointF location(mouse_event.x, mouse_event.y);
|
|
|
|
gfx::PointF root_location(
|
|
|
|
GetScreenPoint(gfx::Point(mouse_event.x, mouse_event.y)));
|
|
|
|
base::TimeTicks time_stamp = GetEventTimeStamp();
|
|
|
|
int flags = TranslateUiEventModifiers(mouse_event.modifiers);
|
|
|
|
int changed_button_flags =
|
|
|
|
TranslateUiChangedButtonFlags(mouse_event.modifiers);
|
|
|
|
|
2020-04-02 22:59:26 +02:00
|
|
|
return ui::MouseWheelEvent(offset, location, root_location, time_stamp,
|
|
|
|
(ui::EF_PRECISION_SCROLLING_DELTA | flags),
|
2020-01-23 22:58:01 +01:00
|
|
|
changed_button_flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
gfx::Vector2d CefBrowserPlatformDelegateNativeAura::GetUiWheelEventOffset(
|
|
|
|
int deltaX,
|
|
|
|
int deltaY) const {
|
|
|
|
return gfx::Vector2d(deltaX, deltaY);
|
|
|
|
}
|
|
|
|
|
|
|
|
// static
|
|
|
|
int CefBrowserPlatformDelegateNativeAura::TranslateUiEventModifiers(
|
|
|
|
uint32 cef_modifiers) {
|
|
|
|
int result = 0;
|
|
|
|
// Set modifiers based on key state.
|
|
|
|
if (cef_modifiers & EVENTFLAG_SHIFT_DOWN)
|
|
|
|
result |= ui::EF_SHIFT_DOWN;
|
|
|
|
if (cef_modifiers & EVENTFLAG_CONTROL_DOWN)
|
|
|
|
result |= ui::EF_CONTROL_DOWN;
|
|
|
|
if (cef_modifiers & EVENTFLAG_ALT_DOWN)
|
|
|
|
result |= ui::EF_ALT_DOWN;
|
|
|
|
if (cef_modifiers & EVENTFLAG_COMMAND_DOWN)
|
|
|
|
result |= ui::EF_COMMAND_DOWN;
|
|
|
|
if (cef_modifiers & EVENTFLAG_LEFT_MOUSE_BUTTON)
|
|
|
|
result |= ui::EF_LEFT_MOUSE_BUTTON;
|
|
|
|
if (cef_modifiers & EVENTFLAG_MIDDLE_MOUSE_BUTTON)
|
|
|
|
result |= ui::EF_MIDDLE_MOUSE_BUTTON;
|
|
|
|
if (cef_modifiers & EVENTFLAG_RIGHT_MOUSE_BUTTON)
|
|
|
|
result |= ui::EF_RIGHT_MOUSE_BUTTON;
|
|
|
|
if (cef_modifiers & EVENTFLAG_CAPS_LOCK_ON)
|
|
|
|
result |= ui::EF_CAPS_LOCK_ON;
|
|
|
|
if (cef_modifiers & EVENTFLAG_NUM_LOCK_ON)
|
|
|
|
result |= ui::EF_NUM_LOCK_ON;
|
2020-04-08 17:43:39 +02:00
|
|
|
if (cef_modifiers & EVENTFLAG_ALTGR_DOWN)
|
|
|
|
result |= ui::EF_ALTGR_DOWN;
|
2020-01-23 22:58:01 +01:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
// static
|
|
|
|
int CefBrowserPlatformDelegateNativeAura::TranslateUiChangedButtonFlags(
|
|
|
|
uint32 cef_modifiers) {
|
|
|
|
int result = 0;
|
|
|
|
if (cef_modifiers & EVENTFLAG_LEFT_MOUSE_BUTTON)
|
|
|
|
result |= ui::EF_LEFT_MOUSE_BUTTON;
|
|
|
|
else if (cef_modifiers & EVENTFLAG_MIDDLE_MOUSE_BUTTON)
|
|
|
|
result |= ui::EF_MIDDLE_MOUSE_BUTTON;
|
|
|
|
else if (cef_modifiers & EVENTFLAG_RIGHT_MOUSE_BUTTON)
|
|
|
|
result |= ui::EF_RIGHT_MOUSE_BUTTON;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
content::RenderWidgetHostViewAura*
|
|
|
|
CefBrowserPlatformDelegateNativeAura::GetHostView() const {
|
|
|
|
return static_cast<content::RenderWidgetHostViewAura*>(
|
2020-07-08 19:23:29 +02:00
|
|
|
web_contents_->GetRenderWidgetHostView());
|
2020-01-23 22:58:01 +01:00
|
|
|
}
|