remote/browser/RemoteClient.cpp (91 lines of code) (raw):
#include "RemoteClient.h"
#include "../ServerApplication.h"
#include "../handlers/RemoteClientHandler.h"
#include "../network/RemoteRequestContextHandler.h"
#include "../router/MessageRoutersManager.h"
#include "RemoteBrowser.h"
#include "../router/RemoteMessageRouter.h"
std::atomic<int> RemoteClient::sNextCid;
int RemoteClient::genNewCid() { return sNextCid.fetch_add(1); }
RemoteClient::RemoteClient(int cid, CefRefPtr<RemoteClientHandler> handler) : myCid(cid), myRemoteClientHandler(handler) {}
RemoteClient::~RemoteClient() {
close();
}
void RemoteClient::addHandlers(int handlersMask) {
myRemoteClientHandler->addHandlers(handlersMask);
}
void RemoteClient::removeHandlers(int handlersMask) {
myRemoteClientHandler->removeHandlers(handlersMask);
}
void RemoteClient::addMessageRouter(std::shared_ptr<RemoteMessageRouter> router) {
myRemoteClientHandler->addMessageRouter(router);
RemoteBrowser::AddMessageRouterConfig(router->getConfig());
// Update running render-processes.
CefRefPtr<CefProcessMessage> message = CefProcessMessage::Create("AddMessageRouter");
CefRefPtr<CefListValue> args = message->GetArgumentList();
args->SetString(0, router->getConfig().js_query_function);
args->SetString(1, router->getConfig().js_cancel_function);
{
std::unique_lock lock(myMutex);
for (auto const& kv : myBrowsers) {
if (kv.second && kv.second->getCefBrowser())
kv.second->getCefBrowser()->GetMainFrame()->SendProcessMessage(PID_RENDERER, message);
}
}
}
void RemoteClient::removeMessageRouter(std::shared_ptr<RemoteMessageRouter> router) {
myRemoteClientHandler->removeMessageRouter(router);
RemoteBrowser::RemoveMessageRouterConfig(router->getConfig());
// Update running render-processes.
CefRefPtr<CefProcessMessage> message =
CefProcessMessage::Create("RemoveMessageRouter");
CefRefPtr<CefListValue> args = message->GetArgumentList();
args->SetString(0, router->getConfig().js_query_function);
args->SetString(1, router->getConfig().js_cancel_function);
{
std::unique_lock lock(myMutex);
for (auto const& kv : myBrowsers) {
if (kv.second && kv.second->getCefBrowser())
kv.second->getCefBrowser()->GetMainFrame()->SendProcessMessage(PID_RENDERER, message);
}
}
}
std::shared_ptr<RemoteBrowser> RemoteClient::createBrowser(
std::shared_ptr<RemoteClient> owner,
std::shared_ptr<ServerHandlerContext> ctx,
const thrift_codegen::RObject& requestContextHandler
) {
// TODO: Expose CefRequestContextSettings.
CefRequestContextSettings settings;
CefRefPtr<CefRequestContext> requestContext = requestContextHandler.isNull
? CefRequestContext::GetGlobalContext()
: CefRequestContext::CreateContext(settings,new RemoteRequestContextHandler(ctx, requestContextHandler));
std::shared_ptr<RemoteBrowser> result = RemoteBrowser::create(owner, requestContext);
{
std::unique_lock lock(myMutex);
myBrowsers[result->getBid()] = result;
}
return result;
}
void RemoteClient::close() {
std::unique_lock lock(myMutex);
for (auto const& kv : myBrowsers) {
if (kv.second)
kv.second->close();
}
myBrowsers.clear();
}
std::shared_ptr<RemoteClient> RemoteClient::findByBid(int bid) {
std::shared_ptr<RemoteBrowser> rb = RemoteBrowser::find(bid);
return rb ? rb->getOwner() : nullptr;
}
void RemoteClient::eraseBrowser(int bid) {
std::unique_lock lock(myMutex);
myBrowsers.erase(bid);
}
std::string RemoteClient::getDebugInfo(int tabs) {
std::stringstream ss;
for (int i = 0; i < tabs; ++i) ss << "\t";
std::unique_lock lock(myMutex);
ss << "cid=" << myCid << ", RemoteBrowsers [count=" << myBrowsers.size() << "]:" << std::endl;
for (auto i: myBrowsers)
ss << i.second->getDebugInfo(tabs + 1);
return ss.str();
}