blob: de37391853c52e8999c441137d1cccfee1164404 [file] [log] [blame]
// Copyright 2015 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.
#include "content/browser/renderer_host/input/synthetic_pointer_action.h"
#include "base/logging.h"
#include "ui/latency/latency_info.h"
namespace content {
SyntheticPointerAction::SyntheticPointerAction(
const SyntheticPointerActionListParams& params)
: params_(params),
gesture_source_type_(SyntheticGestureParams::DEFAULT_INPUT),
state_(GestureState::UNINITIALIZED),
num_actions_dispatched_(0U) {}
SyntheticPointerAction::~SyntheticPointerAction() {}
SyntheticGesture::Result SyntheticPointerAction::ForwardInputEvents(
const base::TimeTicks& timestamp,
SyntheticGestureTarget* target) {
if (state_ == GestureState::UNINITIALIZED) {
gesture_source_type_ = params_.gesture_source_type;
if (gesture_source_type_ == SyntheticGestureParams::DEFAULT_INPUT)
gesture_source_type_ = target->GetDefaultSyntheticGestureSourceType();
if (!synthetic_pointer_driver_) {
synthetic_pointer_driver_ =
SyntheticPointerDriver::Create(gesture_source_type_);
}
state_ = GestureState::RUNNING;
}
DCHECK_NE(gesture_source_type_, SyntheticGestureParams::DEFAULT_INPUT);
if (gesture_source_type_ == SyntheticGestureParams::DEFAULT_INPUT)
return SyntheticGesture::GESTURE_SOURCE_TYPE_NOT_IMPLEMENTED;
state_ = ForwardTouchOrMouseInputEvents(timestamp, target);
if (state_ == GestureState::INVALID)
return POINTER_ACTION_INPUT_INVALID;
return (state_ == GestureState::DONE) ? SyntheticGesture::GESTURE_FINISHED
: SyntheticGesture::GESTURE_RUNNING;
}
bool SyntheticPointerAction::AllowHighFrequencyDispatch() const {
return false;
}
void SyntheticPointerAction::WaitForTargetAck(
base::OnceClosure callback,
SyntheticGestureTarget* target) const {
target->WaitForTargetAck(params_.GetGestureType(), gesture_source_type_,
std::move(callback));
}
SyntheticPointerAction::GestureState
SyntheticPointerAction::ForwardTouchOrMouseInputEvents(
const base::TimeTicks& timestamp,
SyntheticGestureTarget* target) {
if (!params_.params.size())
return GestureState::DONE;
DCHECK_LT(num_actions_dispatched_, params_.params.size());
SyntheticPointerActionListParams::ParamList& param_list =
params_.params[num_actions_dispatched_];
for (const SyntheticPointerActionParams& param : param_list) {
if (!synthetic_pointer_driver_->UserInputCheck(param))
return GestureState::INVALID;
switch (param.pointer_action_type()) {
case SyntheticPointerActionParams::PointerActionType::PRESS:
synthetic_pointer_driver_->Press(param.position().x(),
param.position().y(),
param.pointer_id(), param.button());
break;
case SyntheticPointerActionParams::PointerActionType::MOVE:
synthetic_pointer_driver_->Move(
param.position().x(), param.position().y(), param.pointer_id());
break;
case SyntheticPointerActionParams::PointerActionType::RELEASE:
synthetic_pointer_driver_->Release(param.pointer_id(), param.button());
break;
case SyntheticPointerActionParams::PointerActionType::LEAVE:
synthetic_pointer_driver_->Leave(param.pointer_id());
break;
case SyntheticPointerActionParams::PointerActionType::IDLE:
break;
case SyntheticPointerActionParams::PointerActionType::NOT_INITIALIZED:
return GestureState::INVALID;
}
synthetic_pointer_driver_->DispatchEvent(target, timestamp);
}
num_actions_dispatched_++;
if (num_actions_dispatched_ == params_.params.size())
return GestureState::DONE;
else
return GestureState::RUNNING;
}
} // namespace content