blob: 55e6be82b58019a1b3ceb72b9cd7eabf9580e9ee [file] [log] [blame]
// Copyright 2014 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 MOJO_SERVICES_VIEW_MANAGER_PUBLIC_CPP_LIB_VIEW_MANAGER_CLIENT_IMPL_H_
#define MOJO_SERVICES_VIEW_MANAGER_PUBLIC_CPP_LIB_VIEW_MANAGER_CLIENT_IMPL_H_
#include "mojo/public/cpp/bindings/binding.h"
#include "view_manager/public/cpp/types.h"
#include "view_manager/public/cpp/view.h"
#include "view_manager/public/cpp/view_manager.h"
#include "view_manager/public/interfaces/view_manager.mojom.h"
#include "window_manager/public/interfaces/window_manager.mojom.h"
namespace mojo {
class Shell;
class ViewManager;
class ViewManagerDelegate;
class ViewManagerTransaction;
// Manages the connection with the View Manager service.
class ViewManagerClientImpl : public ViewManager,
public ViewManagerClient,
public WindowManagerObserver {
public:
ViewManagerClientImpl(ViewManagerDelegate* delegate,
Shell* shell,
InterfaceRequest<ViewManagerClient> request,
bool delete_on_error);
~ViewManagerClientImpl() override;
bool connected() const { return service_; }
ConnectionSpecificId connection_id() const { return connection_id_; }
// API exposed to the view implementations that pushes local changes to the
// service.
void DestroyView(Id view_id);
// These methods take TransportIds. For views owned by the current connection,
// the connection id high word can be zero. In all cases, the TransportId 0x1
// refers to the root view.
void AddChild(Id child_id, Id parent_id);
void RemoveChild(Id child_id, Id parent_id);
void Reorder(Id view_id, Id relative_view_id, OrderDirection direction);
// Returns true if the specified view was created by this connection.
bool OwnsView(Id id) const;
void SetBounds(Id view_id, const Rect& bounds);
void SetSurfaceId(Id view_id, SurfaceIdPtr surface_id);
void SetFocus(Id view_id);
void SetVisible(Id view_id, bool visible);
void SetProperty(Id view_id,
const std::string& name,
const std::vector<uint8_t>& data);
void Embed(const String& url, Id view_id);
void Embed(const String& url,
Id view_id,
InterfaceRequest<ServiceProvider> services,
ServiceProviderPtr exposed_services);
void Embed(Id view_id, ViewManagerClientPtr client);
void set_change_acked_callback(const Callback<void(void)>& callback) {
change_acked_callback_ = callback;
}
void ClearChangeAckedCallback() { change_acked_callback_.reset(); }
// Start/stop tracking views. While tracked, they can be retrieved via
// ViewManager::GetViewById.
void AddView(View* view);
void RemoveView(Id view_id);
void SetViewManagerService(ViewManagerServicePtr service);
private:
friend class RootObserver;
typedef std::map<Id, View*> IdToViewMap;
Id CreateViewOnServer();
// Overridden from ViewManager:
const std::string& GetEmbedderURL() const override;
View* GetRoot() override;
View* GetViewById(Id id) override;
View* GetFocusedView() override;
View* CreateView() override;
// Overridden from ViewManagerClient:
void OnEmbed(ConnectionSpecificId connection_id,
const String& creator_url,
ViewDataPtr root,
ViewManagerServicePtr view_manager_service,
InterfaceRequest<ServiceProvider> services,
ServiceProviderPtr exposed_services,
ScopedMessagePipeHandle window_manager_pipe) override;
void OnEmbeddedAppDisconnected(Id view_id) override;
void OnViewBoundsChanged(Id view_id,
RectPtr old_bounds,
RectPtr new_bounds) override;
void OnViewViewportMetricsChanged(ViewportMetricsPtr old_metrics,
ViewportMetricsPtr new_metrics) override;
void OnViewHierarchyChanged(Id view_id,
Id new_parent_id,
Id old_parent_id,
Array<ViewDataPtr> views) override;
void OnViewReordered(Id view_id,
Id relative_view_id,
OrderDirection direction) override;
void OnViewDeleted(Id view_id) override;
void OnViewVisibilityChanged(Id view_id, bool visible) override;
void OnViewDrawnStateChanged(Id view_id, bool drawn) override;
void OnViewSharedPropertyChanged(Id view_id,
const String& name,
Array<uint8_t> new_data) override;
void OnViewInputEvent(Id view_id,
EventPtr event,
const Callback<void()>& callback) override;
void OnPerformAction(Id view_id,
const String& name,
const Callback<void(bool)>& callback) override;
// Overridden from WindowManagerObserver:
void OnCaptureChanged(Id capture_view_id) override;
void OnFocusChanged(Id focused_view_id) override;
void OnActiveWindowChanged(Id focused_view_id) override;
void RootDestroyed(View* root);
void OnActionCompleted(bool success);
Callback<void(bool)> ActionCompletedCallback();
ConnectionSpecificId connection_id_;
ConnectionSpecificId next_id_;
std::string creator_url_;
Callback<void(void)> change_acked_callback_;
ViewManagerDelegate* delegate_;
View* root_;
IdToViewMap views_;
View* capture_view_;
View* focused_view_;
View* activated_view_;
WindowManagerPtr window_manager_;
Binding<WindowManagerObserver> wm_observer_binding_;
Binding<ViewManagerClient> binding_;
ViewManagerServicePtr service_;
MOJO_DISALLOW_COPY_AND_ASSIGN(ViewManagerClientImpl);
};
} // namespace mojo
#endif // MOJO_SERVICES_VIEW_MANAGER_PUBLIC_CPP_LIB_VIEW_MANAGER_CLIENT_IMPL_H_