remote/router/MessageRoutersManager.cpp (64 lines of code) (raw):
#include "MessageRoutersManager.h"
#include "RemoteMessageRouter.h"
#include "../browser/RemoteBrowser.h"
namespace {
const bool doTrace = getBoolEnv("CEF_SERVER_TRACE_MessageRoutersManager");
}
MessageRoutersManager::~MessageRoutersManager() {
TRACE();
// Clear all message routers (just for insurance)
std::vector<int> toDelete;
{
base::AutoLock lockR(myRoutersLock);
for (auto router : myRouters)
toDelete.push_back(router->getId());
myRouters.clear();
}
for (int id: toDelete)
RemoteMessageRouter::dispose(id);
}
std::set<std::shared_ptr<RemoteMessageRouter>> MessageRoutersManager::getMessageRouters() {
TRACE();
base::AutoLock lock_scope(myRoutersLock);
return myRouters;
}
bool MessageRoutersManager::OnProcessMessageReceived(
CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message) {
TRACE();
bool handled = false;
// Iterate on a copy of |myRouters| to avoid re-entrancy of
// |myRoutersLock| if the client CefMessageRouterHandler impl
// calls CefClientHandler.addMessageRouter/removeMessageRouter.
std::set<std::shared_ptr<RemoteMessageRouter>> message_routers = getMessageRouters();
for (auto& router : message_routers) {
handled = router->getDelegate()->OnProcessMessageReceived(browser, frame, source_process, message);
if (handled)
break;
}
return handled;
}
void MessageRoutersManager::OnBeforeClose(CefRefPtr<CefBrowser> browser) {
TRACE();
// NOTE: invoked on UI thread
std::set<std::shared_ptr<RemoteMessageRouter>> message_routers = getMessageRouters();
for (auto& router : message_routers)
router->getDelegate()->OnBeforeClose(browser);
}
void MessageRoutersManager::OnBeforeBrowse(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame) {
TRACE();
// NOTE: invoked on UI thread
std::set<std::shared_ptr<RemoteMessageRouter>> message_routers = getMessageRouters();
for (auto& router : message_routers)
router->getDelegate()->OnBeforeBrowse(browser, frame);
}
void MessageRoutersManager::OnRenderProcessTerminated(CefRefPtr<CefBrowser> browser) {
TRACE();
// NOTE: invoked on UI thread
std::set<std::shared_ptr<RemoteMessageRouter>> message_routers = getMessageRouters();
for (auto& router : message_routers)
router->getDelegate()->OnRenderProcessTerminated(browser);
}
void MessageRoutersManager::add(std::shared_ptr<RemoteMessageRouter> router) {
base::AutoLock lock_scope(myRoutersLock);
myRouters.insert(router);
}
void MessageRoutersManager::remove(std::shared_ptr<RemoteMessageRouter> router) {
base::AutoLock lock_scope(myRoutersLock);
myRouters.erase(router);
}