remote/handlers/RemoteClientHandler.cpp (176 lines of code) (raw):

#include "RemoteClientHandler.h" #include <sstream> #include "../ServerHandlerContext.h" #include "../network/RemoteRequestContextHandler.h" #include "../network/RemoteRequestHandler.h" #include "../router/MessageRoutersManager.h" #include "RemoteContextMenuHandler.h" #include "RemoteDisplayHandler.h" #include "RemoteFocusHandler.h" #include "RemoteKeyboardHandler.h" #include "RemoteLifespanHandler.h" #include "RemoteLoadHandler.h" #include "RemoteRenderHandler.h" #include "RemotePermissionHandler.h" namespace { const bool doMeasureTimes = getBoolEnv("CEF_SERVER_MEASURE_RemoteClientHandler", true); class DummyRenderHandler : public CefRenderHandler { public: void GetViewRect(CefRefPtr<CefBrowser> browser, CefRect& rect) override { rect.x = 0; rect.y = 0; rect.width = 20; // TODO: try to return invalid rect. rect.height = 20; } void OnPaint(CefRefPtr<CefBrowser> browser, PaintElementType type, const RectList& dirtyRects, const void* buffer, int width, int height) override {} private: IMPLEMENT_REFCOUNTING(DummyRenderHandler); }; } // namespace RemoteClientHandler::RemoteClientHandler( std::shared_ptr<ServerHandlerContext> ctx, int cid, int handlersMask) : myCid(cid), myCtx(ctx), myService(ctx->javaService()), myRoutersManager(std::make_shared<MessageRoutersManager>()), myRemoteLisfespanHandler(new RemoteLifespanHandler(ctx, myRoutersManager)) { if (handlersMask & HandlerMasks::NativeRender) myRemoteRenderHandler = new RemoteRenderHandler(ctx->javaService()); else { myRemoteRenderHandler = new DummyRenderHandler(); } addHandlers(handlersMask); } void RemoteClientHandler::addHandlers(int handlersMask) { if (!myRemoteLoadHandler && handlersMask & HandlerMasks::Load) myRemoteLoadHandler = new RemoteLoadHandler(myCtx->javaService()); if (!myRemoteDisplayHandler && handlersMask & HandlerMasks::Display) myRemoteDisplayHandler = new RemoteDisplayHandler(myCtx->javaService()); if (!myRemoteRequestHandler && handlersMask & HandlerMasks::Request) myRemoteRequestHandler = new RemoteRequestHandler(myCtx, myRoutersManager); if (!myRemoteKeyboardHandler && handlersMask & HandlerMasks::Keyboard) myRemoteKeyboardHandler = new RemoteKeyboardHandler(myCtx->javaService()); if (!myRemoteFocusHandler && handlersMask & HandlerMasks::Focus) myRemoteFocusHandler = new RemoteFocusHandler(myCtx->javaService()); if (!myRemoteContextMenuHandler && handlersMask & HandlerMasks::ContextMenu) myRemoteContextMenuHandler = new RemoteContextMenuHandler(myCtx->javaService()); if (!myRemotePermissionHandler && handlersMask & HandlerMasks::Permission) myRemotePermissionHandler = new RemotePermissionHandler(myCtx->javaService()); // TODO: implement remaining handlers // if (handlersMask & HandlerMasks::Dialog) // ; // if (handlersMask & HandlerMasks::JSDialog) // ; // if (handlersMask & HandlerMasks::Print) // ; // if (handlersMask & HandlerMasks::Download) // ; // if (handlersMask & HandlerMasks::Drag) // ; } void RemoteClientHandler::removeHandlers(int handlersMask) { if (myRemoteLoadHandler && handlersMask & HandlerMasks::Load) myRemoteLoadHandler = nullptr; if (myRemoteDisplayHandler && handlersMask & HandlerMasks::Display) myRemoteDisplayHandler = nullptr; if (myRemoteRequestHandler && handlersMask & HandlerMasks::Request) myRemoteRequestHandler = nullptr; if (myRemoteKeyboardHandler && handlersMask & HandlerMasks::Keyboard) myRemoteKeyboardHandler = nullptr; if (myRemoteFocusHandler && handlersMask & HandlerMasks::Focus) myRemoteFocusHandler = nullptr; if (myRemoteContextMenuHandler && handlersMask & HandlerMasks::ContextMenu) myRemoteContextMenuHandler = nullptr; if (myRemotePermissionHandler && handlersMask & HandlerMasks::Permission) myRemotePermissionHandler = nullptr; // TODO: implement remaining handlers // if (handlersMask & HandlerMasks::Dialog) // ; // if (handlersMask & HandlerMasks::JSDialog) // ; // if (handlersMask & HandlerMasks::Print) // ; // if (handlersMask & HandlerMasks::Download) // ; // if (handlersMask & HandlerMasks::Drag) // ; } void RemoteClientHandler::addMessageRouter(std::shared_ptr<RemoteMessageRouter> router) { myRoutersManager->add(router); } void RemoteClientHandler::removeMessageRouter(std::shared_ptr<RemoteMessageRouter> router) { myRoutersManager->remove(router); } CefRefPtr<CefContextMenuHandler> RemoteClientHandler::GetContextMenuHandler() { return myRemoteContextMenuHandler; } CefRefPtr<CefDialogHandler> RemoteClientHandler::GetDialogHandler() { Log::error("TODO: implement: RemoteClientHandler::GetDialogHandler"); return nullptr; } CefRefPtr<CefDisplayHandler> RemoteClientHandler::GetDisplayHandler() { return myRemoteDisplayHandler; } CefRefPtr<CefDownloadHandler> RemoteClientHandler::GetDownloadHandler() { Log::error("TODO: implement: RemoteClientHandler::GetDownloadHandler"); return nullptr; } CefRefPtr<CefDragHandler> RemoteClientHandler::GetDragHandler() { Log::error("TODO: implement: RemoteClientHandler::GetDragHandler"); return nullptr; } CefRefPtr<CefFocusHandler> RemoteClientHandler::GetFocusHandler() { return myRemoteFocusHandler; } CefRefPtr<CefPermissionHandler> RemoteClientHandler::GetPermissionHandler() { return myRemotePermissionHandler; } CefRefPtr<CefJSDialogHandler> RemoteClientHandler::GetJSDialogHandler() { Log::error("TODO: implement: RemoteClientHandler::GetJSDialogHandler"); return nullptr; } CefRefPtr<CefKeyboardHandler> RemoteClientHandler::GetKeyboardHandler() { return myRemoteKeyboardHandler; } CefRefPtr<CefLifeSpanHandler> RemoteClientHandler::GetLifeSpanHandler() { return myRemoteLisfespanHandler; } CefRefPtr<CefLoadHandler> RemoteClientHandler::GetLoadHandler() { return myRemoteLoadHandler; } CefRefPtr<CefPrintHandler> RemoteClientHandler::GetPrintHandler() { Log::error("TODO: implement: RemoteClientHandler::GetPrintHandler"); return nullptr; } CefRefPtr<CefRenderHandler> RemoteClientHandler::GetRenderHandler() { return myRemoteRenderHandler; } CefRefPtr<CefRequestHandler> RemoteClientHandler::GetRequestHandler() { return myRemoteRequestHandler; } /// /// Called when a new message is received from a different process. Return /// true if the message was handled or false otherwise. It is safe to keep a /// reference to |message| outside of this callback. /// bool RemoteClientHandler::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefProcessId source_process, CefRefPtr<CefProcessMessage> message) { utils::Measurer measurer(doMeasureTimes, "ClientHandler", __FUNCTION__); myRoutersManager->OnProcessMessageReceived(browser, frame, source_process, message); return false; } namespace HandlerMasks { std::string toString(int hmask) { std::stringstream ss; ss << "Lifespan"; if (hmask & Drag) ss << ", Drag"; if (hmask & Download) ss << ", Download"; if (hmask & Print) ss << ", Print"; if (hmask & Keyboard) ss << ", Keyboard"; if (hmask & JSDialog) ss << ", JSDialog"; if (hmask & Permission) ss << ", Permission"; if (hmask & Focus) ss << ", Focus"; if (hmask & Display) ss << ", Display"; if (hmask & Dialog) ss << ", Dialog"; if (hmask & ContextMenu) ss << ", ContextMenu"; if (hmask & Load) ss << ", Load"; if (hmask & NativeRender) ss << ", NativeRender"; if (hmask & Request) ss << ", Request"; return ss.str(); } }