blob: bfad1bb793ab8443391faa9789ccc03f75c156f3 [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.
#ifndef CONTENT_RENDERER_MUS_COMPOSITOR_MUS_CONNECTION_H_
#define CONTENT_RENDERER_MUS_COMPOSITOR_MUS_CONNECTION_H_
#include <memory>
#include "base/bind.h"
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/synchronization/lock.h"
#include "content/common/content_export.h"
#include "content/common/input/input_event_ack_state.h"
#include "services/ui/public/cpp/input_event_handler.h"
#include "services/ui/public/cpp/window.h"
#include "services/ui/public/cpp/window_tree_client.h"
#include "services/ui/public/cpp/window_tree_client_delegate.h"
#include "third_party/WebKit/public/platform/WebCoalescedInputEvent.h"
#include "ui/events/gestures/motion_event_aura.h"
namespace ui {
struct DidOverscrollParams;
}
namespace content {
class InputHandlerManager;
// CompositorMusConnection manages the connection to the Mandoline UI Service
// (Mus) on the compositor thread. For operations that need to happen on the
// main thread, CompositorMusConnection deals with passing information across
// threads. CompositorMusConnection is constructed on the main thread. By
// default all other methods are assumed to run on the compositor thread unless
// explicited suffixed with OnMainThread.
class CONTENT_EXPORT CompositorMusConnection
: NON_EXPORTED_BASE(public ui::WindowTreeClientDelegate),
NON_EXPORTED_BASE(public ui::InputEventHandler),
public base::RefCountedThreadSafe<CompositorMusConnection> {
public:
// Created on main thread.
CompositorMusConnection(
int routing_id,
const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner,
const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner,
mojo::InterfaceRequest<ui::mojom::WindowTreeClient> request,
InputHandlerManager* input_handler_manager);
// Attaches the provided |compositor_frame_sink_binding| with the ui::Window
// for the renderer once it becomes available.
void AttachCompositorFrameSinkOnMainThread(
std::unique_ptr<ui::WindowCompositorFrameSinkBinding>
compositor_frame_sink_binding);
private:
friend class CompositorMusConnectionTest;
friend class base::RefCountedThreadSafe<CompositorMusConnection>;
~CompositorMusConnection() override;
void AttachCompositorFrameSinkOnCompositorThread(
std::unique_ptr<ui::WindowCompositorFrameSinkBinding>
compositor_frame_sink_binding);
void CreateWindowTreeClientOnCompositorThread(
ui::mojom::WindowTreeClientRequest request);
void OnConnectionLostOnMainThread();
void OnWindowInputEventOnMainThread(
blink::WebScopedInputEvent web_event,
const base::Callback<void(ui::mojom::EventResult)>& ack);
void OnWindowInputEventAckOnMainThread(
const base::Callback<void(ui::mojom::EventResult)>& ack,
ui::mojom::EventResult result);
std::unique_ptr<blink::WebInputEvent> Convert(const ui::Event& event);
void DeleteWindowTreeClient();
// WindowTreeClientDelegate implementation:
void OnEmbed(ui::Window* root) override;
void OnEmbedRootDestroyed(ui::Window* root) override;
void OnLostConnection(ui::WindowTreeClient* client) override;
void OnPointerEventObserved(const ui::PointerEvent& event,
ui::Window* target) override;
// InputEventHandler implementation:
void OnWindowInputEvent(
ui::Window* window,
const ui::Event& event,
std::unique_ptr<base::Callback<void(ui::mojom::EventResult)>>*
ack_callback) override;
void DidHandleWindowInputEventAndOverscroll(
std::unique_ptr<base::Callback<void(ui::mojom::EventResult)>>
ack_callback,
InputEventAckState ack_state,
blink::WebScopedInputEvent web_event,
const ui::LatencyInfo& latency_info,
std::unique_ptr<ui::DidOverscrollParams> overscroll_params);
const int routing_id_;
// Use this lock when accessing |window_tree_client_|. Lock exists solely for
// DCHECK in destructor.
base::Lock window_tree_client_lock_;
std::unique_ptr<ui::WindowTreeClient> window_tree_client_;
ui::Window* root_;
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
InputHandlerManager* const input_handler_manager_;
std::unique_ptr<ui::WindowCompositorFrameSinkBinding>
window_compositor_frame_sink_binding_;
// Stores the current state of the active pointers targeting this object.
ui::MotionEventAura pointer_state_;
DISALLOW_COPY_AND_ASSIGN(CompositorMusConnection);
};
} // namespace content
#endif // CONTENT_RENDERER_MUS_COMPOSITOR_MUS_CONNECTION_H_