remote/handlers/RemoteLifespanHandler.cpp (83 lines of code) (raw):

#include "RemoteLifespanHandler.h" #include "RemoteClientHandler.h" #include "../ServerHandlerContext.h" #include "../browser/RemoteFrame.h" #include "../browser/RemoteBrowser.h" #include "../router/MessageRoutersManager.h" RemoteLifespanHandler::RemoteLifespanHandler(std::shared_ptr<ServerHandlerContext> ctx, std::shared_ptr<MessageRoutersManager> routersManager) : myService(ctx->javaService()), myRoutersManager(routersManager) {} bool RemoteLifespanHandler::OnBeforePopup( CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, int popup_id, const CefString& target_url, const CefString& target_frame_name, CefLifeSpanHandler::WindowOpenDisposition target_disposition, bool user_gesture, const CefPopupFeatures& popupFeatures, CefWindowInfo& windowInfo, CefRefPtr<CefClient>& client, CefBrowserSettings& settings, CefRefPtr<CefDictionaryValue>& extra_info, bool* no_javascript_access) { FIND_BID_OR_RETURN_VAL(false); RemoteFrame::Holder frm(frame); return myService->exec<bool>([&](const JavaService& s){ // TODO: support other params and return values Log::error("RemoteLifespanHandler: unimplemented some params transferring"); return s->LifeSpanHandler_OnBeforePopup(bid, frm.serverId(), target_url.ToString(), target_frame_name.ToString(), user_gesture); }, false); } void RemoteLifespanHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser) { int bid = -1; { std::unique_lock lock(myCreatingMutex); if (myCreatingBids.empty()) { Log::trace("RemoteLifespanHandler: created dev-tools popup with identifier=%d", browser->GetIdentifier()); // NOTE: don't notify LSH because it's unnecessary now: // dev-tool is completely independent popup-window, and we don't process events of it return; } bid = myCreatingBids.front(); myCreatingBids.pop_front(); } std::shared_ptr<RemoteBrowser> remoteBrowser = RemoteBrowser::find(bid); if (!remoteBrowser) { Log::error("RemoteLifespanHandler: OnAfterCreated: can't find RemoteBrowser by bid=%d", bid); return; } if (remoteBrowser->getCefBrowser()) Log::error("RemoteLifespanHandler: OnAfterCreated: getCefBrowser != null, bid=%d", bid); remoteBrowser->setCefBrowser(browser); RemoteBrowser::linkCefBrowser(browser, remoteBrowser); Log::trace("RemoteLifespanHandler: created native CefBrowser with identifier=%d [bid=%d]", browser->GetIdentifier(), bid); myService->exec([&](const JavaService& s){ s->LifeSpanHandler_OnAfterCreated(bid, browser->GetIdentifier()); }); } bool RemoteLifespanHandler::DoClose(CefRefPtr<CefBrowser> browser) { FIND_BID_OR_RETURN_VAL(false); return myService->exec<bool>([&](const JavaService& s){ return s->LifeSpanHandler_DoClose(bid); }, false); } void RemoteLifespanHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser) { const auto & rb = RemoteBrowser::findByCefBrowser(browser); if (!rb) { Log::trace("RemoteLifespanHandler: closed dev-tools popup with identifier=%d", browser->GetIdentifier()); // NOTE: don't notify LSH because it's unnecessary now: // dev-tool is completely independent popup-window, and we don't process events of it return; } myRoutersManager->OnBeforeClose(browser); myService->exec([&](const JavaService& s){ s->LifeSpanHandler_OnBeforeClose(rb->getBid()); }); rb->onBeforeClose(); RemoteBrowser::unlinkCefBrowser(browser); Log::trace("RemoteLifespanHandler: destroyed native CefBrowser with identifier=%d [bid=%d]", browser->GetIdentifier(), rb->getBid()); } void RemoteLifespanHandler::addCreating(int bid) { std::unique_lock lock(myCreatingMutex); myCreatingBids.push_back(bid); } void RemoteLifespanHandler::removeCreating(int bid) { std::unique_lock lock(myCreatingMutex); myCreatingBids.remove(bid); }