blob: 0b18d58a276779cfdaf67f43dda3cb9dd19044b4 [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 "blimp/client/core/input/blimp_input_handler_wrapper.h"
#include "base/bind.h"
#include "base/location.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "blimp/client/core/input/blimp_input_manager.h"
#include "ui/events/gestures/blink/web_gesture_curve_impl.h"
namespace blimp {
namespace client {
namespace {
void CreateProxyOnCompositorThread(
BlimpInputHandlerWrapper* input_handler_wrapper,
const base::WeakPtr<cc::InputHandler>& input_handler_weak_ptr) {
if (!input_handler_weak_ptr)
return;
// If we have the input handler, the wrapper must be alive. So its safe to
// access it.
input_handler_wrapper->InitOnCompositorThread(input_handler_weak_ptr.get());
}
} // namespace
BlimpInputHandlerWrapper::BlimpInputHandlerWrapper(
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
base::SingleThreadTaskRunner* compositor_task_runner,
const base::WeakPtr<BlimpInputManager> input_manager_weak_ptr,
const base::WeakPtr<cc::InputHandler>& input_handler_weak_ptr)
: main_task_runner_(main_task_runner),
input_manager_weak_ptr_(input_manager_weak_ptr),
weak_factory_(this) {
DCHECK(main_task_runner->BelongsToCurrentThread());
// Since the object is created on the main thread, detach the thread checker
// so it can be bound to the compositor thread, in InitOnCompositorThread.
compositor_thread_checker_.DetachFromThread();
compositor_task_runner->PostTask(
FROM_HERE,
base::Bind(&CreateProxyOnCompositorThread, this, input_handler_weak_ptr));
}
BlimpInputHandlerWrapper::~BlimpInputHandlerWrapper() = default;
void BlimpInputHandlerWrapper::HandleWebGestureEvent(
const blink::WebGestureEvent& gesture_event) {
DCHECK(compositor_thread_checker_.CalledOnValidThread());
// We might not have the input handler proxy anymore.
if (!input_handler_proxy_)
return;
ui::InputHandlerProxy::EventDisposition disposition =
input_handler_proxy_->HandleInputEvent(gesture_event);
bool consumed = false;
switch (disposition) {
case ui::InputHandlerProxy::EventDisposition::DID_HANDLE:
case ui::InputHandlerProxy::EventDisposition::DROP_EVENT:
consumed = true;
break;
case ui::InputHandlerProxy::EventDisposition::DID_HANDLE_NON_BLOCKING:
case ui::InputHandlerProxy::EventDisposition::DID_NOT_HANDLE:
consumed = false;
break;
case ui::InputHandlerProxy::EventDisposition::
DID_NOT_HANDLE_NON_BLOCKING_DUE_TO_FLING:
NOTREACHED();
break;
}
main_task_runner_->PostTask(
FROM_HERE, base::Bind(&BlimpInputManager::DidHandleWebGestureEvent,
input_manager_weak_ptr_, gesture_event, consumed));
}
void BlimpInputHandlerWrapper::WillShutdown() {
DCHECK(compositor_thread_checker_.CalledOnValidThread());
input_handler_proxy_.reset();
weak_factory_.InvalidateWeakPtrs();
}
void BlimpInputHandlerWrapper::TransferActiveWheelFlingAnimation(
const blink::WebActiveWheelFlingParameters& params) {
DCHECK(compositor_thread_checker_.CalledOnValidThread());
NOTIMPLEMENTED()
<< "Transferring Fling Animations to the engine is not supported";
}
void BlimpInputHandlerWrapper::DispatchNonBlockingEventToMainThread(
ui::ScopedWebInputEvent event,
const ui::LatencyInfo& latency_info) {
DCHECK(compositor_thread_checker_.CalledOnValidThread());
DCHECK_EQ(event->type, blink::WebInputEvent::MouseWheel);
NOTIMPLEMENTED()
<< "Dispatching Non Blocking Events to the engine is not supported";
}
blink::WebGestureCurve* BlimpInputHandlerWrapper::CreateFlingAnimationCurve(
blink::WebGestureDevice device_source,
const blink::WebFloatPoint& velocity,
const blink::WebSize& cumulative_scroll) {
DCHECK(compositor_thread_checker_.CalledOnValidThread());
return ui::WebGestureCurveImpl::CreateFromDefaultPlatformCurve(
gfx::Vector2dF(velocity.x, velocity.y),
gfx::Vector2dF(cumulative_scroll.width, cumulative_scroll.height),
false /* on_main_thread */)
.release();
}
void BlimpInputHandlerWrapper::DidOverscroll(
const gfx::Vector2dF& accumulated_overscroll,
const gfx::Vector2dF& latest_overscroll_delta,
const gfx::Vector2dF& current_fling_velocity,
const gfx::PointF& causal_event_viewport_point) {
DCHECK(compositor_thread_checker_.CalledOnValidThread());
}
void BlimpInputHandlerWrapper::DidStopFlinging() {
DCHECK(compositor_thread_checker_.CalledOnValidThread());
}
void BlimpInputHandlerWrapper::DidAnimateForInput() {
DCHECK(compositor_thread_checker_.CalledOnValidThread());
}
void BlimpInputHandlerWrapper::InitOnCompositorThread(
cc::InputHandler* input_handler) {
DCHECK(compositor_thread_checker_.CalledOnValidThread());
input_handler_proxy_ =
base::MakeUnique<ui::InputHandlerProxy>(input_handler, this);
main_task_runner_->PostTask(
FROM_HERE,
base::Bind(&BlimpInputManager::OnInputHandlerWrapperInitialized,
input_manager_weak_ptr_, weak_factory_.GetWeakPtr()));
}
} // namespace client
} // namespace blimp