#import "include/cef.h" #import "include/cef_wrapper.h" #import "client_handler.h" #import "AtomController.h" #import #import #import #import #import #ifndef NDEBUG #define ASSERT(condition) if(!(condition)) { assert(false); } #else #define ASSERT(condition) ((void)0) #endif #define REQUIRE_UI_THREAD() ASSERT(CefCurrentlyOn(TID_UI)); #define REQUIRE_IO_THREAD() ASSERT(CefCurrentlyOn(TID_IO)); #define REQUIRE_FILE_THREAD() ASSERT(CefCurrentlyOn(TID_FILE)); ClientHandler::ClientHandler(AtomController *clientController) : m_MainHwnd(NULL), m_BrowserHwnd(NULL) { m_clientController = clientController; } ClientHandler::~ClientHandler() { } void ClientHandler::OnAfterCreated(CefRefPtr browser) { REQUIRE_UI_THREAD(); AutoLock lock_scope(this); if(!m_Browser.get()) { // We need to keep the main child window, but not popup windows m_Browser = browser; m_BrowserHwnd = browser->GetWindowHandle(); [m_clientController afterCreated:browser]; } } bool ClientHandler::DoClose(CefRefPtr browser) { REQUIRE_UI_THREAD(); return false; } void ClientHandler::OnBeforeClose(CefRefPtr browser) { REQUIRE_UI_THREAD(); if(m_BrowserHwnd == browser->GetWindowHandle()) { // Free the browser pointer so that the browser can be destroyed m_Browser = NULL; } } void ClientHandler::OnLoadStart(CefRefPtr browser, CefRefPtr frame) { REQUIRE_UI_THREAD(); } void ClientHandler::OnLoadEnd(CefRefPtr browser, CefRefPtr frame, int httpStatusCode) { REQUIRE_UI_THREAD(); } bool ClientHandler::OnLoadError(CefRefPtr browser, CefRefPtr frame, ErrorCode errorCode, const CefString& failedUrl, CefString& errorText) { REQUIRE_UI_THREAD(); if(errorCode == ERR_CACHE_MISS) { // Usually caused by navigating to a page with POST data via back or // forward buttons. errorText = "Expired Form Data" "

Expired Form Data

" "

Your form request has expired. " "Click reload to re-submit the form data.

" ""; } else { // All other messages. std::stringstream ss; ss << "Load Failed" "

Load Failed

" "

Load of URL " << std::string(failedUrl) << " failed with error code " << static_cast(errorCode) << ".

" ""; errorText = ss.str(); } return false; } void ClientHandler::OnNavStateChange(CefRefPtr browser, bool canGoBack, bool canGoForward) { REQUIRE_UI_THREAD(); } void ClientHandler::OnFocusedNodeChanged(CefRefPtr browser, CefRefPtr frame, CefRefPtr node) { REQUIRE_UI_THREAD(); } bool ClientHandler::OnKeyEvent(CefRefPtr browser, KeyEventType type, int code, int modifiers, bool isSystemKey, bool isAfterJavaScript) { REQUIRE_UI_THREAD(); return false; } void ClientHandler::OnContextCreated(CefRefPtr browser, CefRefPtr frame, CefRefPtr context) { REQUIRE_UI_THREAD(); } bool ClientHandler::OnDragStart(CefRefPtr browser, CefRefPtr dragData, DragOperationsMask mask) { REQUIRE_UI_THREAD(); return false; } bool ClientHandler::OnDragEnter(CefRefPtr browser, CefRefPtr dragData, DragOperationsMask mask) { REQUIRE_UI_THREAD(); return false; } bool ClientHandler::OnBeforeResourceLoad(CefRefPtr browser, CefRefPtr request, CefString& redirectUrl, CefRefPtr& resourceStream, CefRefPtr response, int loadFlags) { REQUIRE_IO_THREAD(); return false; } void ClientHandler::OnTitleChange(CefRefPtr browser, const CefString& title) { REQUIRE_UI_THREAD(); // Set the frame window title bar NSView* view = (NSView*)browser->GetWindowHandle(); NSWindow* window = [view window]; std::string titleStr(title); NSString* str = [NSString stringWithUTF8String:titleStr.c_str()]; [window setTitle:str]; }