BrowserClient.cpp 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "BrowserClient.h"
  2. #include <iostream>
  3. #include <nlohmann/json.hpp>
  4. using namespace WallpaperEngine::WebBrowser::CEF;
  5. using namespace WallpaperEngine::Data::Model;
  6. BrowserClient::BrowserClient (CefRefPtr<CefRenderHandler> ptr, const Properties& properties) :
  7. m_renderHandler (std::move (ptr)), m_properties (properties) { }
  8. CefRefPtr<CefRenderHandler> BrowserClient::GetRenderHandler () { return m_renderHandler; }
  9. CefRefPtr<CefLifeSpanHandler> BrowserClient::GetLifeSpanHandler () { return this; }
  10. CefRefPtr<CefDisplayHandler> BrowserClient::GetDisplayHandler () { return this; }
  11. CefRefPtr<CefLoadHandler> BrowserClient::GetLoadHandler () { return this; }
  12. void BrowserClient::OnBeforeClose (CefRefPtr<CefBrowser> browser) { this->m_closed = true; }
  13. bool BrowserClient::OnConsoleMessage (
  14. CefRefPtr<CefBrowser> browser, cef_log_severity_t level, const CefString& message, const CefString& source,
  15. int line
  16. ) {
  17. // Some wallpapers log continuously during normal operation (Live2D motion transitions, asset
  18. // fetch tracing, etc via console.log/INFO) - forwarding every one of those means a synchronous
  19. // flushed write for the lifetime of the wallpaper, across two processes on a dual-monitor setup.
  20. // Only warnings and above are worth the cost; they're also the only ones actually useful for
  21. // spotting a page failing silently.
  22. if (level < LOGSEVERITY_WARNING) {
  23. return false;
  24. }
  25. std::cout << "[web console] " << source.ToString () << ":" << line << ": " << message.ToString () << std::endl;
  26. return false;
  27. }
  28. void BrowserClient::OnLoadError (
  29. CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, ErrorCode errorCode, const CefString& errorText,
  30. const CefString& failedUrl
  31. ) {
  32. std::cout << "[web load error] " << failedUrl.ToString () << ": " << errorText.ToString () << " (" << errorCode
  33. << ")" << std::endl;
  34. }
  35. void BrowserClient::OnLoadEnd (CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, int httpStatusCode) {
  36. if (!frame->IsMain ()) {
  37. return;
  38. }
  39. nlohmann::json props = nlohmann::json::object ();
  40. for (const auto& [name, property] : this->m_properties) {
  41. nlohmann::json value;
  42. switch (property->getType ()) {
  43. case DynamicValue::Boolean: value = property->getBool (); break;
  44. case DynamicValue::Int: value = property->getInt (); break;
  45. case DynamicValue::Float: value = property->getFloat (); break;
  46. case DynamicValue::String: value = property->getString (); break;
  47. default: value = property->toString (); break;
  48. }
  49. props[name] = { { "value", value } };
  50. }
  51. const std::string script = "if (window.wallpaperPropertyListener && "
  52. "window.wallpaperPropertyListener.applyUserProperties) { "
  53. "window.wallpaperPropertyListener.applyUserProperties(" + props.dump ()
  54. + "); }";
  55. frame->ExecuteJavaScript (script, frame->GetURL (), 0);
  56. }