Alias EventPointerType to single value.
Remove multiple definitions and conversion between the 3x defined types and just use the native ui event definition everywhere. BUG=1073560 Change-Id: I0abe409fc316fcfabdf1ec87602d54dfafe1d886 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2171518 Reviewed-by: Ken Buchanan <kenrb@chromium.org> Reviewed-by: Avi Drissman <avi@chromium.org> Commit-Queue: Dave Tapuska <dtapuska@chromium.org> Cr-Commit-Position: refs/heads/master@{#763894}
This commit is contained in:
content/common
third_party/blink/public/common
ui/events
@@ -595,10 +595,6 @@ mojom("mojo_bindings") {
|
|||||||
mojom = "content.mojom.NetworkConnectionType"
|
mojom = "content.mojom.NetworkConnectionType"
|
||||||
cpp = "::net::NetworkChangeNotifier::ConnectionType"
|
cpp = "::net::NetworkChangeNotifier::ConnectionType"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
mojom = "content.mojom.PointerType"
|
|
||||||
cpp = "::blink::WebPointerProperties::PointerType"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
mojom = "content.mojom.ScrollGranularity"
|
mojom = "content.mojom.ScrollGranularity"
|
||||||
cpp = "::ui::ScrollGranularity"
|
cpp = "::ui::ScrollGranularity"
|
||||||
|
@@ -51,7 +51,7 @@ struct PointerData {
|
|||||||
float tangential_pressure;
|
float tangential_pressure;
|
||||||
int32 twist;
|
int32 twist;
|
||||||
blink.mojom.Button button;
|
blink.mojom.Button button;
|
||||||
PointerType pointer_type;
|
ui.mojom.EventPointerType pointer_type;
|
||||||
int32 movement_x;
|
int32 movement_x;
|
||||||
int32 movement_y;
|
int32 movement_y;
|
||||||
bool is_raw_movement_event;
|
bool is_raw_movement_event;
|
||||||
@@ -126,7 +126,7 @@ struct GestureData {
|
|||||||
gfx.mojom.PointF widget_position;
|
gfx.mojom.PointF widget_position;
|
||||||
blink.mojom.GestureDevice source_device;
|
blink.mojom.GestureDevice source_device;
|
||||||
bool is_source_touch_event_set_non_blocking;
|
bool is_source_touch_event_set_non_blocking;
|
||||||
PointerType primary_pointer_type;
|
ui.mojom.EventPointerType primary_pointer_type;
|
||||||
int32 unique_touch_event_id;
|
int32 unique_touch_event_id;
|
||||||
gfx.mojom.Size? contact_size;
|
gfx.mojom.Size? contact_size;
|
||||||
ScrollData? scroll_data;
|
ScrollData? scroll_data;
|
||||||
|
@@ -55,8 +55,6 @@ IPC_ENUM_TRAITS_MAX_VALUE(
|
|||||||
content::SyntheticPointerActionParams::Button::BUTTON_MAX)
|
content::SyntheticPointerActionParams::Button::BUTTON_MAX)
|
||||||
IPC_ENUM_TRAITS_MAX_VALUE(content::InputEventDispatchType,
|
IPC_ENUM_TRAITS_MAX_VALUE(content::InputEventDispatchType,
|
||||||
content::InputEventDispatchType::DISPATCH_TYPE_MAX)
|
content::InputEventDispatchType::DISPATCH_TYPE_MAX)
|
||||||
IPC_ENUM_TRAITS_MAX_VALUE(blink::WebPointerProperties::PointerType,
|
|
||||||
blink::WebPointerProperties::PointerType::kMaxValue)
|
|
||||||
IPC_ENUM_TRAITS_MAX_VALUE(
|
IPC_ENUM_TRAITS_MAX_VALUE(
|
||||||
cc::OverscrollBehavior::OverscrollBehaviorType,
|
cc::OverscrollBehavior::OverscrollBehaviorType,
|
||||||
cc::OverscrollBehavior::OverscrollBehaviorType::kOverscrollBehaviorTypeMax)
|
cc::OverscrollBehavior::OverscrollBehaviorType::kOverscrollBehaviorTypeMax)
|
||||||
|
@@ -40,9 +40,6 @@ enum NetworkConnectionType;
|
|||||||
[Native]
|
[Native]
|
||||||
struct WebCursor;
|
struct WebCursor;
|
||||||
|
|
||||||
[Native]
|
|
||||||
enum PointerType;
|
|
||||||
|
|
||||||
[Native]
|
[Native]
|
||||||
struct EditCommand;
|
struct EditCommand;
|
||||||
|
|
||||||
|
1
third_party/blink/public/common/BUILD.gn
vendored
1
third_party/blink/public/common/BUILD.gn
vendored
@@ -166,6 +166,7 @@ source_set("headers") {
|
|||||||
"//skia/public/mojom:shared_typemap_traits",
|
"//skia/public/mojom:shared_typemap_traits",
|
||||||
"//third_party/blink/public/mojom:mojom_modules_headers",
|
"//third_party/blink/public/mojom:mojom_modules_headers",
|
||||||
"//third_party/blink/public/mojom:web_bluetooth_mojo_bindings_headers",
|
"//third_party/blink/public/mojom:web_bluetooth_mojo_bindings_headers",
|
||||||
|
"//ui/events:event_constants",
|
||||||
"//ui/events/types:headers",
|
"//ui/events/types:headers",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
1
third_party/blink/public/common/DEPS
vendored
1
third_party/blink/public/common/DEPS
vendored
@@ -18,6 +18,7 @@ include_rules = [
|
|||||||
"+skia/public/mojom",
|
"+skia/public/mojom",
|
||||||
"+third_party/blink/public/common",
|
"+third_party/blink/public/common",
|
||||||
"+third_party/blink/public/mojom",
|
"+third_party/blink/public/mojom",
|
||||||
|
"+ui/events/event_constants.h",
|
||||||
"+ui/events/types/scroll_types.h",
|
"+ui/events/types/scroll_types.h",
|
||||||
"+ui/gfx/geometry",
|
"+ui/gfx/geometry",
|
||||||
"+url",
|
"+url",
|
||||||
|
@@ -8,6 +8,7 @@
|
|||||||
#include "third_party/blink/public/common/common_export.h"
|
#include "third_party/blink/public/common/common_export.h"
|
||||||
#include "third_party/blink/public/common/input/pointer_id.h"
|
#include "third_party/blink/public/common/input/pointer_id.h"
|
||||||
#include "third_party/blink/public/mojom/input/input_event.mojom-shared.h"
|
#include "third_party/blink/public/mojom/input/input_event.mojom-shared.h"
|
||||||
|
#include "ui/events/event_constants.h"
|
||||||
#include "ui/gfx/geometry/point_f.h"
|
#include "ui/gfx/geometry/point_f.h"
|
||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
@@ -23,6 +24,8 @@ class WebPointerProperties {
|
|||||||
public:
|
public:
|
||||||
using Button = mojom::Button;
|
using Button = mojom::Button;
|
||||||
|
|
||||||
|
using PointerType = ui::EventPointerType;
|
||||||
|
|
||||||
enum class Buttons : unsigned {
|
enum class Buttons : unsigned {
|
||||||
kNoButton = 0,
|
kNoButton = 0,
|
||||||
kLeft = 1 << 0,
|
kLeft = 1 << 0,
|
||||||
@@ -33,15 +36,6 @@ class WebPointerProperties {
|
|||||||
kEraser = 1 << 5
|
kEraser = 1 << 5
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class PointerType {
|
|
||||||
kUnknown,
|
|
||||||
kMouse,
|
|
||||||
kPen,
|
|
||||||
kEraser,
|
|
||||||
kTouch,
|
|
||||||
kMaxValue = kTouch // Must be the last entry in the list
|
|
||||||
};
|
|
||||||
|
|
||||||
explicit WebPointerProperties(
|
explicit WebPointerProperties(
|
||||||
PointerId id_param,
|
PointerId id_param,
|
||||||
PointerType pointer_type_param = PointerType::kUnknown,
|
PointerType pointer_type_param = PointerType::kUnknown,
|
||||||
|
@@ -29,24 +29,6 @@ gfx::PointF GetScreenLocationFromEvent(const LocatedEvent& event) {
|
|||||||
: event.root_location_f();
|
: event.root_location_f();
|
||||||
}
|
}
|
||||||
|
|
||||||
blink::WebPointerProperties::PointerType EventPointerTypeToWebPointerType(
|
|
||||||
EventPointerType pointer_type) {
|
|
||||||
switch (pointer_type) {
|
|
||||||
case EventPointerType::kUnknown:
|
|
||||||
return blink::WebPointerProperties::PointerType::kUnknown;
|
|
||||||
case EventPointerType::kMouse:
|
|
||||||
return blink::WebPointerProperties::PointerType::kMouse;
|
|
||||||
case EventPointerType::kPen:
|
|
||||||
return blink::WebPointerProperties::PointerType::kPen;
|
|
||||||
case EventPointerType::kEraser:
|
|
||||||
return blink::WebPointerProperties::PointerType::kEraser;
|
|
||||||
case EventPointerType::kTouch:
|
|
||||||
return blink::WebPointerProperties::PointerType::kTouch;
|
|
||||||
}
|
|
||||||
NOTREACHED() << "Unexpected EventPointerType";
|
|
||||||
return blink::WebPointerProperties::PointerType::kUnknown;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Creates a WebGestureEvent from a GestureEvent. Note that it does not
|
// Creates a WebGestureEvent from a GestureEvent. Note that it does not
|
||||||
// populate the event coordinates (i.e. |x|, |y|, |globalX|, and |globalY|). So
|
// populate the event coordinates (i.e. |x|, |y|, |globalX|, and |globalY|). So
|
||||||
// the caller must populate these fields.
|
// the caller must populate these fields.
|
||||||
@@ -138,8 +120,7 @@ blink::WebMouseWheelEvent MakeWebMouseWheelEventFromUiEvent(
|
|||||||
if (offset_ordinal_y != 0.f && webkit_event.delta_y != 0.f)
|
if (offset_ordinal_y != 0.f && webkit_event.delta_y != 0.f)
|
||||||
webkit_event.acceleration_ratio_y = offset_ordinal_y / webkit_event.delta_y;
|
webkit_event.acceleration_ratio_y = offset_ordinal_y / webkit_event.delta_y;
|
||||||
|
|
||||||
webkit_event.pointer_type =
|
webkit_event.pointer_type = event.pointer_details().pointer_type;
|
||||||
EventPointerTypeToWebPointerType(event.pointer_details().pointer_type);
|
|
||||||
|
|
||||||
switch (event.scroll_event_phase()) {
|
switch (event.scroll_event_phase()) {
|
||||||
case ui::ScrollEventPhase::kNone:
|
case ui::ScrollEventPhase::kNone:
|
||||||
@@ -248,8 +229,7 @@ blink::WebMouseEvent MakeWebMouseEvent(const MouseEvent& event) {
|
|||||||
event.native_event().message && (event.type() != ET_MOUSE_EXITED)
|
event.native_event().message && (event.type() != ET_MOUSE_EXITED)
|
||||||
? MakeUntranslatedWebMouseEventFromNativeEvent(
|
? MakeUntranslatedWebMouseEventFromNativeEvent(
|
||||||
event.native_event(), event.time_stamp(),
|
event.native_event(), event.time_stamp(),
|
||||||
EventPointerTypeToWebPointerType(
|
event.pointer_details().pointer_type)
|
||||||
event.pointer_details().pointer_type))
|
|
||||||
: MakeWebMouseEventFromUiEvent(event);
|
: MakeWebMouseEventFromUiEvent(event);
|
||||||
#else
|
#else
|
||||||
MakeWebMouseEventFromUiEvent(event);
|
MakeWebMouseEventFromUiEvent(event);
|
||||||
@@ -281,8 +261,7 @@ blink::WebMouseWheelEvent MakeWebMouseWheelEvent(const MouseWheelEvent& event) {
|
|||||||
event.native_event().message
|
event.native_event().message
|
||||||
? MakeUntranslatedWebMouseWheelEventFromNativeEvent(
|
? MakeUntranslatedWebMouseWheelEventFromNativeEvent(
|
||||||
event.native_event(), event.time_stamp(),
|
event.native_event(), event.time_stamp(),
|
||||||
EventPointerTypeToWebPointerType(
|
event.pointer_details().pointer_type)
|
||||||
event.pointer_details().pointer_type))
|
|
||||||
: MakeWebMouseWheelEventFromUiEvent(event);
|
: MakeWebMouseWheelEventFromUiEvent(event);
|
||||||
#else
|
#else
|
||||||
blink::WebMouseWheelEvent webkit_event =
|
blink::WebMouseWheelEvent webkit_event =
|
||||||
@@ -306,8 +285,7 @@ blink::WebMouseWheelEvent MakeWebMouseWheelEvent(const ScrollEvent& event) {
|
|||||||
event.native_event().message
|
event.native_event().message
|
||||||
? MakeUntranslatedWebMouseWheelEventFromNativeEvent(
|
? MakeUntranslatedWebMouseWheelEventFromNativeEvent(
|
||||||
event.native_event(), event.time_stamp(),
|
event.native_event(), event.time_stamp(),
|
||||||
EventPointerTypeToWebPointerType(
|
event.pointer_details().pointer_type)
|
||||||
event.pointer_details().pointer_type))
|
|
||||||
: MakeWebMouseWheelEventFromUiEvent(event);
|
: MakeWebMouseWheelEventFromUiEvent(event);
|
||||||
#else
|
#else
|
||||||
blink::WebMouseWheelEvent webkit_event =
|
blink::WebMouseWheelEvent webkit_event =
|
||||||
@@ -456,8 +434,7 @@ blink::WebMouseEvent MakeWebMouseEventFromUiEvent(const MouseEvent& event) {
|
|||||||
event.pointer_details().tangential_pressure;
|
event.pointer_details().tangential_pressure;
|
||||||
webkit_event.twist = event.pointer_details().twist;
|
webkit_event.twist = event.pointer_details().twist;
|
||||||
webkit_event.id = event.pointer_details().id;
|
webkit_event.id = event.pointer_details().id;
|
||||||
webkit_event.pointer_type =
|
webkit_event.pointer_type = event.pointer_details().pointer_type;
|
||||||
EventPointerTypeToWebPointerType(event.pointer_details().pointer_type);
|
|
||||||
|
|
||||||
return webkit_event;
|
return webkit_event;
|
||||||
}
|
}
|
||||||
@@ -490,8 +467,7 @@ blink::WebMouseWheelEvent MakeWebMouseWheelEventFromUiEvent(
|
|||||||
webkit_event.tilt_x = roundf(event.pointer_details().tilt_x);
|
webkit_event.tilt_x = roundf(event.pointer_details().tilt_x);
|
||||||
webkit_event.tilt_y = roundf(event.pointer_details().tilt_y);
|
webkit_event.tilt_y = roundf(event.pointer_details().tilt_y);
|
||||||
webkit_event.force = event.pointer_details().force;
|
webkit_event.force = event.pointer_details().force;
|
||||||
webkit_event.pointer_type =
|
webkit_event.pointer_type = event.pointer_details().pointer_type;
|
||||||
EventPointerTypeToWebPointerType(event.pointer_details().pointer_type);
|
|
||||||
|
|
||||||
return webkit_event;
|
return webkit_event;
|
||||||
}
|
}
|
||||||
|
@@ -17,6 +17,7 @@ jumbo_component("ipc") {
|
|||||||
public_deps = [
|
public_deps = [
|
||||||
"//base",
|
"//base",
|
||||||
"//ipc",
|
"//ipc",
|
||||||
|
"//ui/events:event_constants",
|
||||||
"//ui/events/types:headers",
|
"//ui/events/types:headers",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@@ -7,11 +7,13 @@
|
|||||||
|
|
||||||
#include "base/component_export.h"
|
#include "base/component_export.h"
|
||||||
#include "ipc/ipc_message_macros.h"
|
#include "ipc/ipc_message_macros.h"
|
||||||
|
#include "ui/events/event_constants.h"
|
||||||
#include "ui/events/types/scroll_types.h"
|
#include "ui/events/types/scroll_types.h"
|
||||||
|
|
||||||
#undef IPC_MESSAGE_EXPORT
|
#undef IPC_MESSAGE_EXPORT
|
||||||
#define IPC_MESSAGE_EXPORT COMPONENT_EXPORT(UI_EVENTS_IPC)
|
#define IPC_MESSAGE_EXPORT COMPONENT_EXPORT(UI_EVENTS_IPC)
|
||||||
|
|
||||||
|
IPC_ENUM_TRAITS_MAX_VALUE(ui::EventPointerType, ui::EventPointerType::kMaxValue)
|
||||||
IPC_ENUM_TRAITS_MIN_MAX_VALUE(ui::ScrollGranularity,
|
IPC_ENUM_TRAITS_MIN_MAX_VALUE(ui::ScrollGranularity,
|
||||||
ui::ScrollGranularity::kFirstScrollGranularity,
|
ui::ScrollGranularity::kFirstScrollGranularity,
|
||||||
ui::ScrollGranularity::kMaxValue)
|
ui::ScrollGranularity::kMaxValue)
|
||||||
|
@@ -2,4 +2,7 @@
|
|||||||
# Use of this source code is governed by a BSD-style license that can be
|
# Use of this source code is governed by a BSD-style license that can be
|
||||||
# found in the LICENSE file.
|
# found in the LICENSE file.
|
||||||
|
|
||||||
typemaps = [ "//ui/events/mojom/scroll_granularity.typemap" ]
|
typemaps = [
|
||||||
|
"//ui/events/mojom/scroll_granularity.typemap",
|
||||||
|
"//ui/events/mojom/event_constants.typemap",
|
||||||
|
]
|
||||||
|
@@ -64,7 +64,7 @@ struct ScrollData {
|
|||||||
|
|
||||||
// This mirrors the C++ class of the same name, see it for details.
|
// This mirrors the C++ class of the same name, see it for details.
|
||||||
struct PointerDetails {
|
struct PointerDetails {
|
||||||
PointerKind pointer_type;
|
EventPointerType pointer_type;
|
||||||
float radius_x;
|
float radius_x;
|
||||||
float radius_y;
|
float radius_y;
|
||||||
float force;
|
float force;
|
||||||
|
@@ -66,15 +66,8 @@ const int32 kMouseEventFlagIsTripleClick = 0x10000;
|
|||||||
const int32 kMouseEventFlagIsNonClient = 0x20000;
|
const int32 kMouseEventFlagIsNonClient = 0x20000;
|
||||||
|
|
||||||
// TODO(erg): Move accessibility flags and maybe synthetic touch events here.
|
// TODO(erg): Move accessibility flags and maybe synthetic touch events here.
|
||||||
|
[Native]
|
||||||
// TODO(sky): rename EventPointerType.
|
enum EventPointerType;
|
||||||
enum PointerKind {
|
|
||||||
UNKNOWN,
|
|
||||||
MOUSE,
|
|
||||||
PEN,
|
|
||||||
TOUCH,
|
|
||||||
ERASER,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Phase information used for a ScrollEvent.
|
// Phase information used for a ScrollEvent.
|
||||||
// These values match ui::ScrollEventPhase in ui/events/event_constants.h
|
// These values match ui::ScrollEventPhase in ui/events/event_constants.h
|
||||||
|
9
ui/events/mojom/event_constants.typemap
Normal file
9
ui/events/mojom/event_constants.typemap
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Copyright 2020 The Chromium Authors. All rights reserved.
|
||||||
|
# Use of this source code is governed by a BSD-style license that can be
|
||||||
|
# found in the LICENSE file.
|
||||||
|
|
||||||
|
mojom = "//ui/events/mojom/event_constants.mojom"
|
||||||
|
public_headers = [ "//ui/events/event_constants.h" ]
|
||||||
|
traits_headers = [ "//ui/events/ipc/ui_events_param_traits_macros.h" ]
|
||||||
|
public_deps = [ "//ui/events/ipc" ]
|
||||||
|
type_mappings = [ "ui.mojom.EventPointerType=::ui::EventPointerType" ]
|
@@ -8,6 +8,7 @@
|
|||||||
#include "ui/events/event.h"
|
#include "ui/events/event.h"
|
||||||
#include "ui/events/event_utils.h"
|
#include "ui/events/event_utils.h"
|
||||||
#include "ui/events/gesture_event_details.h"
|
#include "ui/events/gesture_event_details.h"
|
||||||
|
#include "ui/events/ipc/ui_events_param_traits_macros.h"
|
||||||
#include "ui/events/keycodes/dom/dom_code.h"
|
#include "ui/events/keycodes/dom/dom_code.h"
|
||||||
#include "ui/events/keycodes/dom/keycode_converter.h"
|
#include "ui/events/keycodes/dom/keycode_converter.h"
|
||||||
#include "ui/events/mojom/event_constants.mojom.h"
|
#include "ui/events/mojom/event_constants.mojom.h"
|
||||||
|
@@ -100,49 +100,6 @@ struct EnumTraits<ui::mojom::EventMomentumPhase, ui::EventMomentumPhase> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
|
||||||
struct EnumTraits<ui::mojom::PointerKind, ui::EventPointerType> {
|
|
||||||
static ui::mojom::PointerKind ToMojom(ui::EventPointerType input) {
|
|
||||||
switch (input) {
|
|
||||||
case ui::EventPointerType::kUnknown:
|
|
||||||
return ui::mojom::PointerKind::UNKNOWN;
|
|
||||||
case ui::EventPointerType::kMouse:
|
|
||||||
return ui::mojom::PointerKind::MOUSE;
|
|
||||||
case ui::EventPointerType::kPen:
|
|
||||||
return ui::mojom::PointerKind::PEN;
|
|
||||||
case ui::EventPointerType::kTouch:
|
|
||||||
return ui::mojom::PointerKind::TOUCH;
|
|
||||||
case ui::EventPointerType::kEraser:
|
|
||||||
return ui::mojom::PointerKind::ERASER;
|
|
||||||
}
|
|
||||||
NOTREACHED();
|
|
||||||
return ui::mojom::PointerKind::UNKNOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool FromMojom(ui::mojom::PointerKind input,
|
|
||||||
ui::EventPointerType* out) {
|
|
||||||
switch (input) {
|
|
||||||
case ui::mojom::PointerKind::UNKNOWN:
|
|
||||||
*out = ui::EventPointerType::kUnknown;
|
|
||||||
return true;
|
|
||||||
case ui::mojom::PointerKind::MOUSE:
|
|
||||||
*out = ui::EventPointerType::kMouse;
|
|
||||||
return true;
|
|
||||||
case ui::mojom::PointerKind::PEN:
|
|
||||||
*out = ui::EventPointerType::kPen;
|
|
||||||
return true;
|
|
||||||
case ui::mojom::PointerKind::TOUCH:
|
|
||||||
*out = ui::EventPointerType::kTouch;
|
|
||||||
return true;
|
|
||||||
case ui::mojom::PointerKind::ERASER:
|
|
||||||
*out = ui::EventPointerType::kEraser;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
NOTREACHED();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct StructTraits<ui::mojom::PointerDetailsDataView, ui::PointerDetails> {
|
struct StructTraits<ui::mojom::PointerDetailsDataView, ui::PointerDetails> {
|
||||||
static ui::EventPointerType pointer_type(const ui::PointerDetails& i) {
|
static ui::EventPointerType pointer_type(const ui::PointerDetails& i) {
|
||||||
|
@@ -4,5 +4,6 @@
|
|||||||
|
|
||||||
typemaps = [
|
typemaps = [
|
||||||
"//ui/events/mojom/event.typemap",
|
"//ui/events/mojom/event.typemap",
|
||||||
|
"//ui/events/mojom/event_constants.typemap",
|
||||||
"//ui/events/mojom/scroll_granularity.typemap",
|
"//ui/events/mojom/scroll_granularity.typemap",
|
||||||
]
|
]
|
||||||
|
Reference in New Issue
Block a user