main_thread_scrolling_reason.cc 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "cc/input/main_thread_scrolling_reason.h"
  5. #include "base/containers/cxx20_erase.h"
  6. #include "base/strings/string_util.h"
  7. #include "base/trace_event/traced_value.h"
  8. namespace cc {
  9. std::string MainThreadScrollingReason::AsText(uint32_t reasons) {
  10. base::trace_event::TracedValueJSON traced_value;
  11. AddToTracedValue(reasons, traced_value);
  12. std::string result = traced_value.ToJSON();
  13. // Remove '{main_thread_scrolling_reasons:[', ']}', and any '"' chars.
  14. size_t array_start_pos = result.find('[');
  15. size_t array_end_pos = result.find(']');
  16. result =
  17. result.substr(array_start_pos + 1, array_end_pos - array_start_pos - 1);
  18. base::Erase(result, '\"');
  19. // Add spaces after all commas.
  20. base::ReplaceChars(result, ",", ", ", &result);
  21. return result;
  22. }
  23. void MainThreadScrollingReason::AddToTracedValue(
  24. uint32_t reasons,
  25. base::trace_event::TracedValue& traced_value) {
  26. traced_value.BeginArray("main_thread_scrolling_reasons");
  27. if (reasons & kHasBackgroundAttachmentFixedObjects)
  28. traced_value.AppendString("Has background-attachment:fixed");
  29. if (reasons & kThreadedScrollingDisabled)
  30. traced_value.AppendString("Threaded scrolling is disabled");
  31. if (reasons & kScrollbarScrolling)
  32. traced_value.AppendString("Scrollbar scrolling");
  33. if (reasons & kNotOpaqueForTextAndLCDText)
  34. traced_value.AppendString("Not opaque for text and LCD text");
  35. if (reasons & kCantPaintScrollingBackgroundAndLCDText)
  36. traced_value.AppendString("Can't paint scrolling background and LCD text");
  37. // Transient scrolling reasons.
  38. if (reasons & kNonFastScrollableRegion)
  39. traced_value.AppendString("Non fast scrollable region");
  40. if (reasons & kFailedHitTest)
  41. traced_value.AppendString("Failed hit test");
  42. if (reasons & kNoScrollingLayer)
  43. traced_value.AppendString("No scrolling layer");
  44. if (reasons & kNotScrollable)
  45. traced_value.AppendString("Not scrollable");
  46. if (reasons & kNonInvertibleTransform)
  47. traced_value.AppendString("Non-invertible transform");
  48. if (reasons & kWheelEventHandlerRegion)
  49. traced_value.AppendString("Wheel event handler region");
  50. if (reasons & kTouchEventHandlerRegion)
  51. traced_value.AppendString("Touch event handler region");
  52. traced_value.EndArray();
  53. }
  54. int MainThreadScrollingReason::BucketIndexForTesting(uint32_t reason) {
  55. // These two values are already bucket indices.
  56. DCHECK_NE(reason, kNotScrollingOnMain);
  57. DCHECK_NE(reason, kScrollingOnMainForAnyReason);
  58. int index = 0;
  59. while (reason >>= 1)
  60. ++index;
  61. DCHECK_NE(index, 0);
  62. return index;
  63. }
  64. } // namespace cc