WebBrowserHost.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include <SDL/include/SDL.h>
  2. #include <ThirdParty/SDL/include/SDL_syswm.h>
  3. #include <include/cef_app.h>
  4. #include <include/cef_client.h>
  5. #include <include/wrapper/cef_helpers.h>
  6. #include <include/base/cef_bind.h>
  7. #include <include/wrapper/cef_closure_task.h>
  8. #include <Atomic/Core/ProcessUtils.h>
  9. #include <Atomic/Core/CoreEvents.h>
  10. #include <Atomic/IO/Log.h>
  11. #include <Atomic/Graphics/Graphics.h>
  12. #include "Internal/WebAppBrowser.h"
  13. #include "WebSchemeHandler.h"
  14. #include "WebClient.h"
  15. #include "WebBrowserHost.h"
  16. #ifdef ATOMIC_PLATFORM_LINUX
  17. #include <X11/Xlib.h>
  18. #include <stdlib.h>
  19. #include <unistd.h>
  20. #include <signal.h>
  21. static int XErrorHandlerImpl(Display *display, XErrorEvent *event)
  22. {
  23. return 0;
  24. }
  25. static int XIOErrorHandlerImpl(Display *display)
  26. {
  27. return 0;
  28. }
  29. static void TerminationSignalHandler(int signatl)
  30. {
  31. }
  32. #endif
  33. namespace Atomic
  34. {
  35. class WebBrowserHostPrivate
  36. {
  37. friend class WebBrowserHost;
  38. public:
  39. WebBrowserHostPrivate(WebBrowserHost* host)
  40. {
  41. host_ = host;
  42. app_ = new WebAppBrowser();
  43. }
  44. virtual ~WebBrowserHostPrivate()
  45. {
  46. host_ = 0;
  47. }
  48. private:
  49. WeakPtr<WebBrowserHost> host_;
  50. CefRefPtr<CefApp> app_;
  51. };
  52. WebBrowserHost::WebBrowserHost(Context* context) : Object (context)
  53. {
  54. const Vector<String>& arguments = GetArguments();
  55. #ifdef ATOMIC_PLATFORM_LINUX
  56. XSetErrorHandler(XErrorHandlerImpl);
  57. XSetIOErrorHandler(XIOErrorHandlerImpl);
  58. // Install a signal handler so we clean up after ourselves.
  59. signal(SIGINT, TerminationSignalHandler);
  60. signal(SIGTERM, TerminationSignalHandler);
  61. #endif
  62. // IMPORTANT: Cef::App contains virtual void OnBeforeCommandLineProcessing(), which should make it possible
  63. // to setup args on Windows
  64. #ifdef ATOMIC_PLATFORM_OSX
  65. const char* _argv[3] = { "", "--enable-media-stream", "--enable-usermedia-screen-capturing" };
  66. CefMainArgs args(3, (char**) &_argv);
  67. #elif ATOMIC_PLATFORM_LINUX
  68. static const char* _argv[3] = { "AtomicWebView", "--disable-setuid-sandbox", "--off-screen-rendering-enabled" };
  69. CefMainArgs args(3, (char**) &_argv);
  70. #else
  71. CefMainArgs args;
  72. #endif
  73. CefSettings settings;
  74. settings.windowless_rendering_enabled = true;
  75. d_ = new WebBrowserHostPrivate(this);
  76. // If losing OSX system menu, it means we're calling this
  77. // before initializing graphics subsystem
  78. if (!CefInitialize(args, settings, d_->app_, nullptr))
  79. {
  80. LOGERROR("CefInitialize - Error");
  81. }
  82. RegisterWebSchemeHandlers(this);
  83. SubscribeToEvent(E_BEGINFRAME, HANDLER(WebBrowserHost, HandleBeginFrame));
  84. }
  85. WebBrowserHost::~WebBrowserHost()
  86. {
  87. CefClearSchemeHandlerFactories();
  88. CefShutdown();
  89. }
  90. void WebBrowserHost::HandleBeginFrame(StringHash eventType, VariantMap& eventData)
  91. {
  92. CefDoMessageLoopWork();
  93. }
  94. }