-class animation_handler : public CefV8Handler
-{
-private:
- std::vector<CefRefPtr<CefV8Value>> callbacks_;
- boost::timer since_start_timer_;
-public:
- CefRefPtr<CefBrowser> browser;
- std::function<CefRefPtr<CefV8Context>()> get_context;
-
- bool Execute(
- const CefString& name,
- CefRefPtr<CefV8Value> object,
- const CefV8ValueList& arguments,
- CefRefPtr<CefV8Value>& retval,
- CefString& exception) override
- {
- if (!CefCurrentlyOn(TID_RENDERER))
- return false;
-
- if (arguments.size() < 1 || !arguments.at(0)->IsFunction())
- {
- return false;
- }
-
- callbacks_.push_back(arguments.at(0));
-
- if (browser)
- browser->SendProcessMessage(PID_BROWSER, CefProcessMessage::Create(
- ANIMATION_FRAME_REQUESTED_MESSAGE_NAME));
-
- return true;
- }
-
- void tick()
- {
- if (!get_context)
- return;
-
- auto context = get_context();
-
- if (!context)
- return;
-
- if (!CefCurrentlyOn(TID_RENDERER))
- return;
-
- std::vector<CefRefPtr<CefV8Value>> callbacks;
- callbacks_.swap(callbacks);
-
- CefV8ValueList callback_args;
- CefTime timestamp;
- timestamp.Now();
- callback_args.push_back(CefV8Value::CreateDouble(
- since_start_timer_.elapsed() * 1000.0));
-
- for (auto callback : callbacks)
- {
- callback->ExecuteFunctionWithContext(
- context, callback, callback_args);
- }
- }
-
- IMPLEMENT_REFCOUNTING(animation_handler);
-};
-