blob: 7e8ca76ec48d6157752e058ef89a1e4f402139ef [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "modules/xr/XRFrameRequestCallbackCollection.h"
#include "bindings/modules/v8/v8_xr_frame_request_callback.h"
#include "core/inspector/InspectorTraceEvents.h"
#include "core/probe/CoreProbes.h"
#include "modules/xr/XRPresentationFrame.h"
#include "modules/xr/XRSession.h"
namespace blink {
XRFrameRequestCallbackCollection::XRFrameRequestCallbackCollection(
ExecutionContext* context)
: context_(context) {}
XRFrameRequestCallbackCollection::CallbackId
XRFrameRequestCallbackCollection::RegisterCallback(
V8XRFrameRequestCallback* callback) {
CallbackId id = ++next_callback_id_;
callbacks_.Set(id, callback);
pending_callbacks_.push_back(id);
probe::AsyncTaskScheduledBreakable(context_, "XRRequestFrame", callback);
return id;
}
void XRFrameRequestCallbackCollection::CancelCallback(CallbackId id) {
if (IsValidCallbackId(id)) {
callbacks_.erase(id);
}
}
void XRFrameRequestCallbackCollection::ExecuteCallbacks(
XRSession* session,
XRPresentationFrame* frame) {
// First, generate a list of callbacks to consider. Callbacks registered from
// this point on are considered only for the "next" frame, not this one.
DCHECK(callbacks_to_invoke_.IsEmpty());
callbacks_to_invoke_.swap(pending_callbacks_);
for (const auto& id : callbacks_to_invoke_) {
V8XRFrameRequestCallback* callback = callbacks_.Take(id);
// Callback won't be found if it was cancelled.
if (!callback)
continue;
probe::AsyncTask async_task(context_, callback);
probe::UserCallback probe(context_, "XRRequestFrame", AtomicString(), true);
callback->InvokeAndReportException(session, 0, frame);
}
callbacks_to_invoke_.clear();
}
void XRFrameRequestCallbackCollection::Trace(blink::Visitor* visitor) {
visitor->Trace(callbacks_);
visitor->Trace(context_);
}
void XRFrameRequestCallbackCollection::TraceWrappers(
const blink::ScriptWrappableVisitor* visitor) const {
for (const auto& callback : callbacks_.Values()) {
visitor->TraceWrappers(callback);
}
}
} // namespace blink