blob: 1f1cc0f10f29d6c9cd8369d07af5bd604c84d54d [file] [log] [blame]
// Copyright 2019 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 "third_party/blink/renderer/platform/scheduler/main_thread/pending_user_input.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
namespace scheduler {
void PendingUserInput::Monitor::OnEnqueue(
WebInputEvent::Type type,
const WebInputEventAttribution& attribution) {
DCHECK_NE(type, WebInputEvent::Type::kUndefined);
DCHECK_LE(type, WebInputEvent::Type::kTypeLast);
// Ignore events without attribution information.
if (attribution.type() == WebInputEventAttribution::kUnknown)
return;
auto result =
pending_events_.insert(AttributionGroup(attribution), EventCounter());
auto& value = result.stored_value->value;
if (IsContinuousEventType(type)) {
value.num_continuous++;
} else {
value.num_discrete++;
}
}
void PendingUserInput::Monitor::OnDequeue(
WebInputEvent::Type type,
const WebInputEventAttribution& attribution) {
DCHECK_NE(type, WebInputEvent::Type::kUndefined);
DCHECK_LE(type, WebInputEvent::Type::kTypeLast);
if (attribution.type() == WebInputEventAttribution::kUnknown)
return;
auto it = pending_events_.find(AttributionGroup(attribution));
DCHECK_NE(it, pending_events_.end());
auto& value = it->value;
if (IsContinuousEventType(type)) {
DCHECK_GT(value.num_continuous, 0U);
value.num_continuous--;
} else {
DCHECK_GT(value.num_discrete, 0U);
value.num_discrete--;
}
if (value.num_continuous == 0 && value.num_discrete == 0) {
pending_events_.erase(it->key);
}
}
Vector<WebInputEventAttribution> PendingUserInput::Monitor::Info(
bool include_continuous) const {
Vector<WebInputEventAttribution> attributions;
for (const auto& entry : pending_events_) {
if (entry.value.num_discrete > 0 ||
(entry.value.num_continuous > 0 && include_continuous)) {
attributions.push_back(entry.key.attribution);
}
}
return attributions;
}
bool PendingUserInput::IsContinuousEventType(WebInputEvent::Type type) {
switch (type) {
case WebInputEvent::Type::kMouseMove:
case WebInputEvent::Type::kMouseWheel:
case WebInputEvent::Type::kTouchMove:
case WebInputEvent::Type::kPointerMove:
case WebInputEvent::Type::kPointerRawUpdate:
return true;
default:
return false;
}
}
} // namespace scheduler
} // namespace blink